@@ -92,12 +92,13 @@ impl SingleThreadedDispatcher {
9292 buffer : & mut [ u8 ] ,
9393 width : u16 ,
9494 height : u16 ,
95+ background : PremulColor ,
9596 encoded_paints : & [ EncodedPaint ] ,
9697 image_resolver : & dyn ImageResolver ,
9798 ) {
9899 use crate :: fine:: F32Kernel ;
99100 use vello_common:: fearless_simd:: dispatch;
100- dispatch ! ( self . level, simd => self . rasterize_with:: <_, F32Kernel >( simd, buffer, width, height, encoded_paints, image_resolver) ) ;
101+ dispatch ! ( self . level, simd => self . rasterize_with:: <_, F32Kernel >( simd, buffer, width, height, background , encoded_paints, image_resolver) ) ;
101102 }
102103
103104 /// Rasterizes the scene using u8 precision (fast).
@@ -110,12 +111,13 @@ impl SingleThreadedDispatcher {
110111 buffer : & mut [ u8 ] ,
111112 width : u16 ,
112113 height : u16 ,
114+ background : PremulColor ,
113115 encoded_paints : & [ EncodedPaint ] ,
114116 image_resolver : & dyn ImageResolver ,
115117 ) {
116118 use crate :: fine:: U8Kernel ;
117119 use vello_common:: fearless_simd:: dispatch;
118- dispatch ! ( self . level, simd => self . rasterize_with:: <_, U8Kernel >( simd, buffer, width, height, encoded_paints, image_resolver) ) ;
120+ dispatch ! ( self . level, simd => self . rasterize_with:: <_, U8Kernel >( simd, buffer, width, height, background , encoded_paints, image_resolver) ) ;
119121 }
120122
121123 /// Core rasterization dispatcher that chooses between simple and filter-aware paths.
@@ -132,6 +134,7 @@ impl SingleThreadedDispatcher {
132134 buffer : & mut [ u8 ] ,
133135 width : u16 ,
134136 height : u16 ,
137+ background : PremulColor ,
135138 encoded_paints : & [ EncodedPaint ] ,
136139 image_resolver : & dyn ImageResolver ,
137140 ) {
@@ -144,6 +147,7 @@ impl SingleThreadedDispatcher {
144147 buffer,
145148 width,
146149 height,
150+ background,
147151 encoded_paints,
148152 image_resolver,
149153 & mut layer_manager,
@@ -155,6 +159,7 @@ impl SingleThreadedDispatcher {
155159 buffer,
156160 width,
157161 height,
162+ background,
158163 encoded_paints,
159164 image_resolver,
160165 ) ;
@@ -177,6 +182,7 @@ impl SingleThreadedDispatcher {
177182 buffer : & mut [ u8 ] ,
178183 width : u16 ,
179184 height : u16 ,
185+ background : PremulColor ,
180186 encoded_paints : & [ EncodedPaint ] ,
181187 image_resolver : & dyn ImageResolver ,
182188 layer_manager : & mut LayerManager ,
@@ -246,8 +252,7 @@ impl SingleThreadedDispatcher {
246252 // Final composition directly to output buffer.
247253 let mut regions = Regions :: new ( width, height, buffer) ;
248254 regions. update_regions ( |region| {
249- // Use the background color from the wide tile.
250- let bg = self . wide . get ( region. x , region. y ) . bg ;
255+ let bg = self . wide . tile_bg ( region. x , region. y , background) ;
251256 self . process_layer_tile (
252257 & mut fine,
253258 region. x ,
@@ -395,6 +400,7 @@ impl SingleThreadedDispatcher {
395400 buffer : & mut [ u8 ] ,
396401 width : u16 ,
397402 height : u16 ,
403+ background : PremulColor ,
398404 encoded_paints : & [ EncodedPaint ] ,
399405 image_resolver : & dyn ImageResolver ,
400406 ) {
@@ -409,7 +415,7 @@ impl SingleThreadedDispatcher {
409415 fine. set_coords ( x, y) ;
410416
411417 // Clear to background and process all commands in order.
412- fine. clear ( wtile . bg ) ;
418+ fine. clear ( self . wide . tile_bg ( x , y , background ) ) ;
413419 for cmd in & wtile. cmds {
414420 fine. run_cmd (
415421 cmd,
@@ -703,33 +709,62 @@ impl Dispatcher for SingleThreadedDispatcher {
703709 render_mode : RenderMode ,
704710 width : u16 ,
705711 height : u16 ,
712+ background : PremulColor ,
706713 encoded_paints : & [ EncodedPaint ] ,
707714 image_resolver : & dyn ImageResolver ,
708715 ) {
709716 // If only the u8 pipeline is enabled, then use it
710717 #[ cfg( all( feature = "u8_pipeline" , not( feature = "f32_pipeline" ) ) ) ]
711718 {
712719 let _ = render_mode;
713- self . rasterize_u8 ( buffer, width, height, encoded_paints, image_resolver) ;
720+ self . rasterize_u8 (
721+ buffer,
722+ width,
723+ height,
724+ background,
725+ encoded_paints,
726+ image_resolver,
727+ ) ;
714728 }
715729
716730 // If only the f32 pipeline is enabled, then use it
717731 #[ cfg( all( feature = "f32_pipeline" , not( feature = "u8_pipeline" ) ) ) ]
718732 {
719733 let _ = render_mode;
720- self . rasterize_f32 ( buffer, width, height, encoded_paints, image_resolver) ;
734+ self . rasterize_f32 (
735+ buffer,
736+ width,
737+ height,
738+ background,
739+ encoded_paints,
740+ image_resolver,
741+ ) ;
721742 }
722743
723744 // If both pipelines are enabled, select precision based on render mode parameter.
724745 #[ cfg( all( feature = "u8_pipeline" , feature = "f32_pipeline" ) ) ]
725746 match render_mode {
726747 RenderMode :: OptimizeSpeed => {
727748 // Use u8 precision for faster rendering.
728- self . rasterize_u8 ( buffer, width, height, encoded_paints, image_resolver) ;
749+ self . rasterize_u8 (
750+ buffer,
751+ width,
752+ height,
753+ background,
754+ encoded_paints,
755+ image_resolver,
756+ ) ;
729757 }
730758 RenderMode :: OptimizeQuality => {
731759 // Use f32 precision for higher quality.
732- self . rasterize_f32 ( buffer, width, height, encoded_paints, image_resolver) ;
760+ self . rasterize_f32 (
761+ buffer,
762+ width,
763+ height,
764+ background,
765+ encoded_paints,
766+ image_resolver,
767+ ) ;
733768 }
734769 }
735770
0 commit comments