1+ use crate :: node:: schema:: Size ;
12use crate :: {
23 export:: { ExportAsImage , ExportSize , Exported } ,
34 node:: schema:: Scene ,
@@ -32,9 +33,19 @@ pub fn export_node_as_image(
3233) -> Option < Exported > {
3334 let skfmt: EncodedImageFormat = format. clone ( ) . into ( ) ;
3435
35- let camera = Camera2D :: new_from_bounds ( rect) ;
36+ // Create camera with original bounds to determine world-space view
37+ let mut camera = Camera2D :: new_from_bounds ( rect) ;
38+
39+ // Scale the camera size to target resolution and adjust zoom to maintain same world-space view
40+ // When we increase the viewport size and zoom IN proportionally, we see the same world-space rect
41+ // but at higher resolution (scale = 2 means 2x zoom, 2x pixels, same world-space view)
42+ let scale = size. width / rect. width ;
43+ camera. set_size ( Size {
44+ width : size. width ,
45+ height : size. height ,
46+ } ) ;
47+ camera. set_zoom ( scale) ;
3648
37- // 2. create a renderer sharing the font repository's ByteStore
3849 let store = fonts. store ( ) ;
3950 let mut r = Renderer :: new_with_store (
4051 Backend :: new_from_raster ( size. width as i32 , size. height as i32 ) ,
@@ -47,22 +58,29 @@ pub fn export_node_as_image(
4758 r. fonts = fonts. clone ( ) ;
4859 r. images = images. clone ( ) ;
4960 r. load_scene ( scene. clone ( ) ) ;
61+
62+ // Render directly at target resolution - this ensures fonts work correctly
5063 let image = r. snapshot ( ) ;
64+ r. free ( ) ;
5165
52- let Some ( data) = image. encode ( None , skfmt, None ) else {
53- r. free ( ) ;
66+ // Extract quality for JPEG and WEBP formats
67+ let quality = match & format {
68+ ExportAsImage :: JPEG ( jpeg_config) => jpeg_config. quality ,
69+ ExportAsImage :: WEBP ( webp_config) => webp_config. quality ,
70+ _ => None ,
71+ } ;
72+
73+ let Some ( data) = image. encode ( None , skfmt, quality) else {
5474 return None ;
5575 } ;
5676
57- // 2. export node
77+ // Return the exported data
5878 let exported = match format {
5979 ExportAsImage :: PNG ( _) => Some ( Exported :: PNG ( data. to_vec ( ) ) ) ,
6080 ExportAsImage :: JPEG ( _) => Some ( Exported :: JPEG ( data. to_vec ( ) ) ) ,
6181 ExportAsImage :: WEBP ( _) => Some ( Exported :: WEBP ( data. to_vec ( ) ) ) ,
6282 ExportAsImage :: BMP ( _) => Some ( Exported :: BMP ( data. to_vec ( ) ) ) ,
6383 } ;
6484
65- r. free ( ) ;
66-
6785 exported
6886}
0 commit comments