@@ -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 ) {
@@ -1551,8 +1549,8 @@ impl FrameBuilder {
1551
1549
& self ,
1552
1550
clip_and_scroll : & ClipAndScrollInfo
1553
1551
) -> Option < PackedLayerIndex > {
1554
- let group_index = self . clip_scroll_group_indices . get ( & clip_and_scroll) . unwrap ( ) ;
1555
- let clip_scroll_group = & self . clip_scroll_group_store [ group_index . 0 ] ;
1552
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll] ;
1553
+ let clip_scroll_group = & self . clip_scroll_group_store [ group_id ] ;
1556
1554
if clip_scroll_group. is_visible ( ) {
1557
1555
Some ( clip_scroll_group. packed_layer_index )
1558
1556
} else {
@@ -1642,22 +1640,22 @@ impl FrameBuilder {
1642
1640
screen_rect : & DeviceIntRect ,
1643
1641
device_pixel_ratio : f32 ,
1644
1642
profile_counters : & mut FrameProfileCounters ,
1645
- ) {
1643
+ ) -> bool {
1646
1644
let stacking_context_index = * self . stacking_context_stack . last ( ) . unwrap ( ) ;
1647
1645
let packed_layer_index =
1648
1646
match self . get_packed_layer_index_if_visible ( & clip_and_scroll) {
1649
1647
Some ( index) => index,
1650
1648
None => {
1651
1649
debug ! ( "{:?} of invisible {:?}" , base_prim_index, stacking_context_index) ;
1652
- return ;
1650
+ return false ;
1653
1651
}
1654
1652
} ;
1655
1653
1656
1654
let pipeline_id = {
1657
1655
let stacking_context =
1658
1656
& mut self . stacking_context_store [ stacking_context_index. 0 ] ;
1659
1657
if !stacking_context. can_contribute_to_scene ( ) {
1660
- return ;
1658
+ return false ;
1661
1659
}
1662
1660
1663
1661
// At least one primitive in this stacking context is visible, so the stacking
@@ -1682,7 +1680,7 @@ impl FrameBuilder {
1682
1680
. display_list ;
1683
1681
1684
1682
if !stacking_context. is_backface_visible && packed_layer. transform . is_backface_visible ( ) {
1685
- return ;
1683
+ return false ;
1686
1684
}
1687
1685
1688
1686
let prim_context = PrimitiveContext :: new (
@@ -1697,7 +1695,11 @@ impl FrameBuilder {
1697
1695
1698
1696
let prim_context = match prim_context {
1699
1697
Some ( prim_context) => prim_context,
1700
- None => return ,
1698
+ None => {
1699
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll] ;
1700
+ self . clip_scroll_group_store [ group_id] . screen_bounding_rect = None ;
1701
+ return false
1702
+ } ,
1701
1703
} ;
1702
1704
1703
1705
debug ! (
@@ -1729,6 +1731,8 @@ impl FrameBuilder {
1729
1731
profile_counters. visible_primitives . inc ( ) ;
1730
1732
}
1731
1733
}
1734
+
1735
+ true //visible
1732
1736
}
1733
1737
1734
1738
fn handle_pop_stacking_context ( & mut self , screen_rect : & DeviceIntRect ) {
@@ -2231,10 +2235,10 @@ impl FrameBuilder {
2231
2235
continue ;
2232
2236
}
2233
2237
2234
- let group_index = * self . clip_scroll_group_indices
2235
- . get ( & clip_and_scroll)
2236
- . unwrap ( ) ;
2237
- if self . clip_scroll_group_store [ group_index . 0 ]
2238
+ let group_id = self . clip_scroll_group_indices [ & clip_and_scroll ] ;
2239
+ let group_index = ClipScrollGroupIndex ( group_id , clip_and_scroll) ;
2240
+
2241
+ if self . clip_scroll_group_store [ group_id ]
2238
2242
. screen_bounding_rect
2239
2243
. is_none ( )
2240
2244
{
0 commit comments