@@ -11,12 +11,13 @@ use internal_types::{CompositionOp};
1111use internal_types:: { LowLevelFilterOp } ;
1212use internal_types:: { RendererFrame } ;
1313use layer:: { Layer , ScrollingState } ;
14- use prim_store:: Clip ;
15- use resource_cache:: ResourceCache ;
14+ use prim_store:: ClipInfo ;
15+ use resource_cache:: { DummyResources , ResourceCache } ;
1616use scene:: { SceneStackingContext , ScenePipeline , Scene , SceneItem , SpecificSceneItem } ;
1717use std:: collections:: { HashMap , HashSet } ;
1818use std:: hash:: BuildHasherDefault ;
19- use tiling:: { FrameBuilder , FrameBuilderConfig , InsideTest , PrimitiveFlags } ;
19+ use tiling:: { FrameBuilder , FrameBuilderConfig , InsideTest , Clip , MaskImageSource } ;
20+ use tiling:: PrimitiveFlags ;
2021use util:: MatrixHelpers ;
2122use webrender_traits:: { AuxiliaryLists , PipelineId , Epoch , ScrollPolicy , ScrollLayerId } ;
2223use webrender_traits:: { ColorF , StackingContext , FilterOp , MixBlendMode } ;
@@ -35,6 +36,7 @@ static DEFAULT_SCROLLBAR_COLOR: ColorF = ColorF { r: 0.3, g: 0.3, b: 0.3, a: 0.6
3536
3637struct FlattenContext < ' a > {
3738 resource_cache : & ' a mut ResourceCache ,
39+ dummy_resources : & ' a DummyResources ,
3840 scene : & ' a Scene ,
3941 pipeline_sizes : & ' a mut HashMap < PipelineId , Size2D < f32 > > ,
4042 builder : & ' a mut FrameBuilder ,
@@ -368,6 +370,7 @@ impl Frame {
368370 pub fn create ( & mut self ,
369371 scene : & Scene ,
370372 resource_cache : & mut ResourceCache ,
373+ dummy_resources : & DummyResources ,
371374 pipeline_sizes : & mut HashMap < PipelineId , Size2D < f32 > > ,
372375 device_pixel_ratio : f32 ) {
373376 if let Some ( root_pipeline_id) = scene. root_pipeline_id {
@@ -415,6 +418,7 @@ impl Frame {
415418 {
416419 let mut context = FlattenContext {
417420 resource_cache : resource_cache,
421+ dummy_resources : dummy_resources,
418422 scene : scene,
419423 pipeline_sizes : pipeline_sizes,
420424 builder : & mut frame_builder,
@@ -530,33 +534,50 @@ impl Frame {
530534 PrimitiveFlags :: None ) ;
531535 }
532536
537+ let dummy_mask_source = {
538+ let cache_id = context. dummy_resources . opaque_mask_image_id ;
539+ let cache_item = context. resource_cache . get_image_by_cache_id ( cache_id) ;
540+ MaskImageSource :: Renderer ( cache_item. texture_id )
541+ } ;
542+
533543 for item in scene_items {
534544 match item. specific {
535545 SpecificSceneItem :: DrawList ( draw_list_id) => {
536546 let draw_list = context. resource_cache . get_draw_list ( draw_list_id) ;
537547 let builder = & mut context. builder ;
538-
539- let auxiliary_lists = {
540- self . pipeline_auxiliary_lists
548+ let auxiliary_lists = self . pipeline_auxiliary_lists
541549 . get ( & parent_info. pipeline_id )
542- . expect ( "No auxiliary lists?!" )
543- } ;
550+ . expect ( "No auxiliary lists?!" ) ;
544551
545552 for item in & draw_list. items {
546553 let clips = auxiliary_lists. complex_clip_regions ( & item. clip . complex ) ;
547- let clip = match clips. len ( ) {
548- 0 => None ,
549- 1 => Some ( Box :: new ( Clip :: from_clip_region ( & clips[ 0 ] ) ) ) ,
554+ let mut clip = match clips. len ( ) {
555+ 0 if item. clip . image_mask . is_none ( ) => None ,
556+ 0 => Some ( Clip :: new ( ClipInfo :: uniform ( item. clip . main , 0.0 ) , dummy_mask_source) ) ,
557+ 1 => Some ( Clip :: new ( ClipInfo :: from_clip_region ( & clips[ 0 ] ) , dummy_mask_source) ) ,
550558 _ => {
551559 let internal_clip = clips. last ( ) . unwrap ( ) ;
552- if clips. iter ( ) . all ( |current_clip| current_clip. might_contain ( internal_clip) ) {
553- Some ( Box :: new ( Clip :: from_clip_region ( internal_clip) ) )
560+ let region = if clips. iter ( ) . all ( |current_clip| current_clip. might_contain ( internal_clip) ) {
561+ internal_clip
554562 } else {
555- Some ( Box :: new ( Clip :: from_clip_region ( & clips[ 0 ] ) ) )
556- }
563+ & clips[ 0 ]
564+ } ;
565+ Some ( Clip :: new ( ClipInfo :: from_clip_region ( region) , dummy_mask_source) )
557566 } ,
558567 } ;
559568
569+ if let Some ( ref mask) = item. clip . image_mask {
570+ let old = match clip {
571+ Some ( masked) => * masked. clip ,
572+ None => ClipInfo :: uniform ( item. clip . main , 0.0 ) ,
573+ } ;
574+ //Note: can't call `tex_cache.aligned_uv_rect()` here since the image
575+ // is not yet marked as needed this frame.
576+ clip = Some ( Clip :: new ( old. with_mask ( Rect :: zero ( ) , mask. rect ) ,
577+ MaskImageSource :: User ( mask. image ) ) ) ;
578+ }
579+
580+
560581 match item. item {
561582 SpecificDisplayItem :: WebGL ( ref info) => {
562583 builder. add_webgl_rectangle ( item. rect ,
0 commit comments