@@ -94,7 +94,9 @@ pub struct FrameBuilder {
94
94
95
95
stacking_context_store : Vec < StackingContext > ,
96
96
clip_scroll_group_store : Vec < ClipScrollGroup > ,
97
- clip_scroll_group_indices : FastHashMap < ClipAndScrollInfo , ClipScrollGroupIndex > ,
97
+ // Note: value here is meant to be `ClipScrollGroupIndex`,
98
+ // but we already have `ClipAndScrollInfo` in the key
99
+ clip_scroll_group_indices : FastHashMap < ClipAndScrollInfo , usize > ,
98
100
packed_layers : Vec < PackedLayer > ,
99
101
100
102
// A stack of the current text-shadow primitives.
@@ -136,7 +138,8 @@ impl<'a> PrimitiveContext<'a> {
136
138
screen_rect : & DeviceIntRect ,
137
139
clip_scroll_tree : & ClipScrollTree ,
138
140
clip_store : & ClipStore ,
139
- device_pixel_ratio : f32 ) -> Option < Self > {
141
+ device_pixel_ratio : f32 ,
142
+ ) -> Option < Self > {
140
143
141
144
let mut current_clip_stack = Vec :: new ( ) ;
142
145
let mut clip_bounds = * screen_rect;
@@ -242,15 +245,6 @@ impl FrameBuilder {
242
245
}
243
246
}
244
247
245
- pub fn create_clip_scroll_group_if_necessary ( & mut self , info : ClipAndScrollInfo ) {
246
- if self . clip_scroll_group_indices . contains_key ( & info) {
247
- return ;
248
- }
249
-
250
- let group_index = self . create_clip_scroll_group ( info) ;
251
- self . clip_scroll_group_indices . insert ( info, group_index) ;
252
- }
253
-
254
248
/// Create a primitive and add it to the prim store. This method doesn't
255
249
/// add the primitive to the draw list, so can be used for creating
256
250
/// sub-primitives.
@@ -261,7 +255,10 @@ impl FrameBuilder {
261
255
mut clip_sources : Vec < ClipSource > ,
262
256
container : PrimitiveContainer ,
263
257
) -> PrimitiveIndex {
264
- self . create_clip_scroll_group_if_necessary ( clip_and_scroll) ;
258
+ if !self . clip_scroll_group_indices . contains_key ( & clip_and_scroll) {
259
+ let group_id = self . create_clip_scroll_group ( & clip_and_scroll) ;
260
+ self . clip_scroll_group_indices . insert ( clip_and_scroll, group_id) ;
261
+ }
265
262
266
263
if let & LocalClip :: RoundedRect ( main, region) = & info. local_clip {
267
264
clip_sources. push ( ClipSource :: Rectangle ( main) ) ;
@@ -352,18 +349,19 @@ impl FrameBuilder {
352
349
prim_index
353
350
}
354
351
355
- pub fn create_clip_scroll_group ( & mut self , info : ClipAndScrollInfo ) -> ClipScrollGroupIndex {
352
+ fn create_clip_scroll_group ( & mut self , info : & ClipAndScrollInfo ) -> usize {
356
353
let packed_layer_index = PackedLayerIndex ( self . packed_layers . len ( ) ) ;
357
354
self . packed_layers . push ( PackedLayer :: empty ( ) ) ;
358
355
356
+ let group_id = self . clip_scroll_group_store . len ( ) ;
359
357
self . clip_scroll_group_store . push ( ClipScrollGroup {
360
358
scroll_node_id : info. scroll_node_id ,
361
359
clip_node_id : info. clip_node_id ( ) ,
362
360
packed_layer_index,
363
361
screen_bounding_rect : None ,
364
362
} ) ;
365
363
366
- ClipScrollGroupIndex ( self . clip_scroll_group_store . len ( ) - 1 , info )
364
+ group_id
367
365
}
368
366
369
367
pub fn notify_waiting_for_root_stacking_context ( & mut self ) {
@@ -1574,8 +1572,8 @@ impl FrameBuilder {
1574
1572
& self ,
1575
1573
clip_and_scroll : & ClipAndScrollInfo
1576
1574
) -> Option < PackedLayerIndex > {
1577
- let group_index = self . clip_scroll_group_indices . get ( & clip_and_scroll) . unwrap ( ) ;
1578
- let clip_scroll_group = & self . clip_scroll_group_store [ group_index . 0 ] ;
1575
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll] ;
1576
+ let clip_scroll_group = & self . clip_scroll_group_store [ group_id ] ;
1579
1577
if clip_scroll_group. is_visible ( ) {
1580
1578
Some ( clip_scroll_group. packed_layer_index )
1581
1579
} else {
@@ -1665,22 +1663,22 @@ impl FrameBuilder {
1665
1663
screen_rect : & DeviceIntRect ,
1666
1664
device_pixel_ratio : f32 ,
1667
1665
profile_counters : & mut FrameProfileCounters ,
1668
- ) {
1666
+ ) -> bool {
1669
1667
let stacking_context_index = * self . stacking_context_stack . last ( ) . unwrap ( ) ;
1670
1668
let packed_layer_index =
1671
1669
match self . get_packed_layer_index_if_visible ( & clip_and_scroll) {
1672
1670
Some ( index) => index,
1673
1671
None => {
1674
1672
debug ! ( "{:?} of invisible {:?}" , base_prim_index, stacking_context_index) ;
1675
- return ;
1673
+ return false ;
1676
1674
}
1677
1675
} ;
1678
1676
1679
1677
let pipeline_id = {
1680
1678
let stacking_context =
1681
1679
& mut self . stacking_context_store [ stacking_context_index. 0 ] ;
1682
1680
if !stacking_context. can_contribute_to_scene ( ) {
1683
- return ;
1681
+ return false ;
1684
1682
}
1685
1683
1686
1684
// At least one primitive in this stacking context is visible, so the stacking
@@ -1705,7 +1703,7 @@ impl FrameBuilder {
1705
1703
. display_list ;
1706
1704
1707
1705
if !stacking_context. is_backface_visible && packed_layer. transform . is_backface_visible ( ) {
1708
- return ;
1706
+ return false ;
1709
1707
}
1710
1708
1711
1709
let prim_context = PrimitiveContext :: new (
@@ -1720,7 +1718,11 @@ impl FrameBuilder {
1720
1718
1721
1719
let prim_context = match prim_context {
1722
1720
Some ( prim_context) => prim_context,
1723
- None => return ,
1721
+ None => {
1722
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll] ;
1723
+ self . clip_scroll_group_store [ group_id] . screen_bounding_rect = None ;
1724
+ return false
1725
+ } ,
1724
1726
} ;
1725
1727
1726
1728
debug ! (
@@ -1752,6 +1754,8 @@ impl FrameBuilder {
1752
1754
profile_counters. visible_primitives . inc ( ) ;
1753
1755
}
1754
1756
}
1757
+
1758
+ true //visible
1755
1759
}
1756
1760
1757
1761
fn handle_pop_stacking_context ( & mut self , screen_rect : & DeviceIntRect ) {
@@ -2254,10 +2258,10 @@ impl FrameBuilder {
2254
2258
continue ;
2255
2259
}
2256
2260
2257
- let group_index = * self . clip_scroll_group_indices
2258
- . get ( & clip_and_scroll)
2259
- . unwrap ( ) ;
2260
- if self . clip_scroll_group_store [ group_index . 0 ]
2261
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll ] ;
2262
+ let group_index = ClipScrollGroupIndex ( group_id , clip_and_scroll) ;
2263
+
2264
+ if self . clip_scroll_group_store [ group_id ]
2261
2265
. screen_bounding_rect
2262
2266
. is_none ( )
2263
2267
{
0 commit comments