@@ -186,6 +186,33 @@ fn star<T: AsU64>(
186186 Table :: new_from_element ( Vector :: from_subpath ( subpath:: Subpath :: new_star_polygon ( DVec2 :: splat ( -diameter) , points, diameter, inner_diameter) ) )
187187}
188188
189+ /// Generates a QR code from the input text.
190+ #[ node_macro:: node( category( "Vector: Shape" ) ) ]
191+ fn qr_code ( _: impl Ctx , _primary : ( ) , #[ default( "https://graphite.art" ) ] text : String
192+ ) -> Table < Vector > {
193+ let ecc = qrcodegen:: QrCodeEcc :: Medium ;
194+
195+ let Ok ( qr_code) = qrcodegen:: QrCode :: encode_text ( & text, ecc) else {
196+ return Table :: default ( ) ;
197+ } ;
198+
199+ let size = qr_code. size ( ) ;
200+ let mut vector = Vector :: default ( ) ;
201+ let offset = DVec2 :: splat ( size as f64 / -2. ) ;
202+
203+ for y in 0 ..size {
204+ for x in 0 ..size {
205+ if qr_code. get_module ( x, y) {
206+ let corner1 = offset + DVec2 :: new ( x as f64 , y as f64 ) ;
207+ let corner2 = corner1 + DVec2 :: splat ( 1. ) ;
208+ vector. append_subpath ( subpath:: Subpath :: new_rect ( corner1, corner2) , false ) ;
209+ }
210+ }
211+ }
212+
213+ Table :: new_from_element ( vector)
214+ }
215+
189216/// Generates a line with endpoints at the two chosen coordinates.
190217#[ node_macro:: node( category( "Vector: Shape" ) ) ]
191218fn line (
@@ -349,4 +376,11 @@ mod tests {
349376 assert ! ( [ 90. , 150. , 40. ] . into_iter( ) . any( |target| ( target - angle) . abs( ) < 1e-10 ) , "unexpected angle of {angle}" )
350377 }
351378 }
379+
380+ #[ test]
381+ fn qr_code_test ( ) {
382+ let qr = qr_code ( ( ) , ( ) , "https://graphite.art" . to_string ( ) ) ;
383+ assert ! ( qr. iter( ) . next( ) . unwrap( ) . element. point_domain. ids( ) . len( ) > 0 ) ;
384+ assert ! ( qr. iter( ) . next( ) . unwrap( ) . element. segment_domain. ids( ) . len( ) > 0 ) ;
385+ }
352386}
0 commit comments