@@ -23,8 +23,9 @@ use {ImageRendering, LayoutPoint, LayoutPrimitiveInfo, LayoutRect, LayoutSideOff
23
23
use { LayoutTransform , LayoutVector2D , LineDisplayItem , LineOrientation , LineStyle , MixBlendMode } ;
24
24
use { PipelineId , PropertyBinding , PushReferenceFrameDisplayListItem } ;
25
25
use { PushStackingContextDisplayItem , RadialGradient , RadialGradientDisplayItem } ;
26
- use { RectangleDisplayItem , ReferenceFrame , ScrollFrameDisplayItem , ScrollSensitivity , Shadow } ;
27
- use { SpecificDisplayItem , StackingContext , StickyFrameDisplayItem , StickyOffsetBounds } ;
26
+ use { RectangleDisplayItem , ReferenceFrame , ScrollFrameDisplayItem , ScrollSensitivity } ;
27
+ use { SerializedDisplayItem , Shadow , SpecificDisplayItem } ;
28
+ use { StackingContext , StickyFrameDisplayItem , StickyOffsetBounds } ;
28
29
use { TextDisplayItem , TransformStyle , YuvColorSpace , YuvData , YuvImageDisplayItem , ColorDepth } ;
29
30
30
31
// We don't want to push a long text-run. If a text-run is too long, split it into several parts.
@@ -691,16 +692,16 @@ impl<'a> Write for SizeCounter {
691
692
/// If this assumption is incorrect, the result will be Undefined Behaviour. This
692
693
/// assumption should hold for all derived Serialize impls, which is all we currently
693
694
/// use.
694
- fn serialize_fast < T : Serialize > ( vec : & mut Vec < u8 > , e : & T ) {
695
+ fn serialize_fast < T : Serialize > ( vec : & mut Vec < u8 > , e : T ) {
695
696
// manually counting the size is faster than vec.reserve(bincode::serialized_size(&e) as usize) for some reason
696
697
let mut size = SizeCounter ( 0 ) ;
697
- bincode:: serialize_into ( & mut size, e) . unwrap ( ) ;
698
+ bincode:: serialize_into ( & mut size, & e) . unwrap ( ) ;
698
699
vec. reserve ( size. 0 ) ;
699
700
700
701
let old_len = vec. len ( ) ;
701
702
let ptr = unsafe { vec. as_mut_ptr ( ) . add ( old_len) } ;
702
703
let mut w = UnsafeVecWriter ( ptr) ;
703
- bincode:: serialize_into ( & mut w, e) . unwrap ( ) ;
704
+ bincode:: serialize_into ( & mut w, & e) . unwrap ( ) ;
704
705
705
706
// fix up the length
706
707
unsafe { vec. set_len ( old_len + size. 0 ) ; }
@@ -964,43 +965,36 @@ impl DisplayListBuilder {
964
965
/// NOTE: It is usually preferable to use the specialized methods to push
965
966
/// display items. Pushing unexpected or invalid items here may
966
967
/// result in WebRender panicking or behaving in unexpected ways.
967
- pub fn push_item ( & mut self , item : SpecificDisplayItem , info : & LayoutPrimitiveInfo ) {
968
+ pub fn push_item ( & mut self , item : & SpecificDisplayItem , info : & LayoutPrimitiveInfo ) {
968
969
serialize_fast (
969
970
& mut self . data ,
970
- & DisplayItem {
971
+ SerializedDisplayItem {
971
972
item,
972
- clip_and_scroll : * self . clip_stack . last ( ) . unwrap ( ) ,
973
- info : * info ,
973
+ clip_and_scroll : self . clip_stack . last ( ) . unwrap ( ) ,
974
+ info,
974
975
} ,
975
976
)
976
977
}
977
978
978
979
fn push_item_with_clip_scroll_info (
979
980
& mut self ,
980
- item : SpecificDisplayItem ,
981
+ item : & SpecificDisplayItem ,
981
982
info : & LayoutPrimitiveInfo ,
982
- scrollinfo : ClipAndScrollInfo
983
+ clip_and_scroll : & ClipAndScrollInfo
983
984
) {
984
985
serialize_fast (
985
986
& mut self . data ,
986
- & DisplayItem {
987
+ SerializedDisplayItem {
987
988
item,
988
- clip_and_scroll : scrollinfo ,
989
- info : * info ,
989
+ clip_and_scroll,
990
+ info,
990
991
} ,
991
992
)
992
993
}
993
994
994
- fn push_new_empty_item ( & mut self , item : SpecificDisplayItem , clip_and_scroll : & ClipAndScrollInfo ) {
995
- let info = LayoutPrimitiveInfo :: new ( LayoutRect :: zero ( ) ) ;
996
- serialize_fast (
997
- & mut self . data ,
998
- & DisplayItem {
999
- item,
1000
- clip_and_scroll : * clip_and_scroll,
1001
- info,
1002
- }
1003
- )
995
+ fn push_new_empty_item ( & mut self , item : & SpecificDisplayItem ) {
996
+ let info = & LayoutPrimitiveInfo :: new ( LayoutRect :: zero ( ) ) ;
997
+ self . push_item ( item, info)
1004
998
}
1005
999
1006
1000
fn push_iter_impl < I > ( data : & mut Vec < u8 > , iter_source : I )
@@ -1050,11 +1044,11 @@ impl DisplayListBuilder {
1050
1044
1051
1045
pub fn push_rect ( & mut self , info : & LayoutPrimitiveInfo , color : ColorF ) {
1052
1046
let item = SpecificDisplayItem :: Rectangle ( RectangleDisplayItem { color } ) ;
1053
- self . push_item ( item, info) ;
1047
+ self . push_item ( & item, info) ;
1054
1048
}
1055
1049
1056
1050
pub fn push_clear_rect ( & mut self , info : & LayoutPrimitiveInfo ) {
1057
- self . push_item ( SpecificDisplayItem :: ClearRectangle , info) ;
1051
+ self . push_item ( & SpecificDisplayItem :: ClearRectangle , info) ;
1058
1052
}
1059
1053
1060
1054
pub fn push_line (
@@ -1072,7 +1066,7 @@ impl DisplayListBuilder {
1072
1066
style,
1073
1067
} ) ;
1074
1068
1075
- self . push_item ( item, info) ;
1069
+ self . push_item ( & item, info) ;
1076
1070
}
1077
1071
1078
1072
pub fn push_image (
@@ -1094,7 +1088,7 @@ impl DisplayListBuilder {
1094
1088
color,
1095
1089
} ) ;
1096
1090
1097
- self . push_item ( item, info) ;
1091
+ self . push_item ( & item, info) ;
1098
1092
}
1099
1093
1100
1094
/// Push a yuv image. All planar data in yuv image should use the same buffer type.
@@ -1112,7 +1106,7 @@ impl DisplayListBuilder {
1112
1106
color_space,
1113
1107
image_rendering,
1114
1108
} ) ;
1115
- self . push_item ( item, info) ;
1109
+ self . push_item ( & item, info) ;
1116
1110
}
1117
1111
1118
1112
pub fn push_text (
@@ -1130,7 +1124,7 @@ impl DisplayListBuilder {
1130
1124
} ) ;
1131
1125
1132
1126
for split_glyphs in glyphs. chunks ( MAX_TEXT_RUN_LENGTH ) {
1133
- self . push_item ( item, info) ;
1127
+ self . push_item ( & item, info) ;
1134
1128
self . push_iter ( split_glyphs) ;
1135
1129
}
1136
1130
}
@@ -1173,7 +1167,7 @@ impl DisplayListBuilder {
1173
1167
) {
1174
1168
let item = SpecificDisplayItem :: Border ( BorderDisplayItem { details, widths } ) ;
1175
1169
1176
- self . push_item ( item, info) ;
1170
+ self . push_item ( & item, info) ;
1177
1171
}
1178
1172
1179
1173
pub fn push_box_shadow (
@@ -1197,7 +1191,7 @@ impl DisplayListBuilder {
1197
1191
clip_mode,
1198
1192
} ) ;
1199
1193
1200
- self . push_item ( item, info) ;
1194
+ self . push_item ( & item, info) ;
1201
1195
}
1202
1196
1203
1197
/// Pushes a linear gradient to be displayed.
@@ -1227,7 +1221,7 @@ impl DisplayListBuilder {
1227
1221
tile_spacing,
1228
1222
} ) ;
1229
1223
1230
- self . push_item ( item, info) ;
1224
+ self . push_item ( & item, info) ;
1231
1225
}
1232
1226
1233
1227
/// Pushes a radial gradient to be displayed.
@@ -1246,7 +1240,7 @@ impl DisplayListBuilder {
1246
1240
tile_spacing,
1247
1241
} ) ;
1248
1242
1249
- self . push_item ( item, info) ;
1243
+ self . push_item ( & item, info) ;
1250
1244
}
1251
1245
1252
1246
pub fn push_reference_frame (
@@ -1263,13 +1257,12 @@ impl DisplayListBuilder {
1263
1257
id,
1264
1258
} ,
1265
1259
} ) ;
1266
- self . push_item ( item, info) ;
1260
+ self . push_item ( & item, info) ;
1267
1261
id
1268
1262
}
1269
1263
1270
1264
pub fn pop_reference_frame ( & mut self ) {
1271
- let clip_and_scroll = * self . clip_stack . last ( ) . unwrap ( ) ;
1272
- self . push_new_empty_item ( SpecificDisplayItem :: PopReferenceFrame , & clip_and_scroll) ;
1265
+ self . push_new_empty_item ( & SpecificDisplayItem :: PopReferenceFrame ) ;
1273
1266
}
1274
1267
1275
1268
pub fn push_stacking_context (
@@ -1290,21 +1283,19 @@ impl DisplayListBuilder {
1290
1283
} ,
1291
1284
} ) ;
1292
1285
1293
- self . push_item ( item, info) ;
1286
+ self . push_item ( & item, info) ;
1294
1287
self . push_iter ( filters) ;
1295
1288
}
1296
1289
1297
1290
pub fn pop_stacking_context ( & mut self ) {
1298
- let clip_and_scroll = * self . clip_stack . last ( ) . unwrap ( ) ;
1299
- self . push_new_empty_item ( SpecificDisplayItem :: PopStackingContext , & clip_and_scroll) ;
1291
+ self . push_new_empty_item ( & SpecificDisplayItem :: PopStackingContext ) ;
1300
1292
}
1301
1293
1302
1294
pub fn push_stops ( & mut self , stops : & [ GradientStop ] ) {
1303
1295
if stops. is_empty ( ) {
1304
1296
return ;
1305
1297
}
1306
- let clip_and_scroll = * self . clip_stack . last ( ) . unwrap ( ) ;
1307
- self . push_new_empty_item ( SpecificDisplayItem :: SetGradientStops , & clip_and_scroll) ;
1298
+ self . push_new_empty_item ( & SpecificDisplayItem :: SetGradientStops ) ;
1308
1299
self . push_iter ( stops) ;
1309
1300
}
1310
1301
@@ -1372,9 +1363,9 @@ impl DisplayListBuilder {
1372
1363
} ) ;
1373
1364
1374
1365
self . push_item_with_clip_scroll_info (
1375
- item,
1366
+ & item,
1376
1367
& LayoutPrimitiveInfo :: with_clip_rect ( content_rect, clip_rect) ,
1377
- ClipAndScrollInfo :: simple ( parent) ,
1368
+ & ClipAndScrollInfo :: simple ( parent) ,
1378
1369
) ;
1379
1370
self . push_iter ( complex_clips) ;
1380
1371
@@ -1391,8 +1382,7 @@ impl DisplayListBuilder {
1391
1382
I :: IntoIter : ExactSizeIterator + Clone ,
1392
1383
{
1393
1384
let id = self . generate_clip_chain_id ( ) ;
1394
- let clip_and_scroll = * self . clip_stack . last ( ) . unwrap ( ) ;
1395
- self . push_new_empty_item ( SpecificDisplayItem :: ClipChain ( ClipChainItem { id, parent } ) , & clip_and_scroll) ;
1385
+ self . push_new_empty_item ( & SpecificDisplayItem :: ClipChain ( ClipChainItem { id, parent } ) ) ;
1396
1386
self . push_iter ( clips) ;
1397
1387
id
1398
1388
}
@@ -1454,7 +1444,7 @@ impl DisplayListBuilder {
1454
1444
1455
1445
let info = LayoutPrimitiveInfo :: new ( clip_rect) ;
1456
1446
1457
- self . push_item_with_clip_scroll_info ( item, & info, scrollinfo) ;
1447
+ self . push_item_with_clip_scroll_info ( & item, & info, & scrollinfo) ;
1458
1448
self . push_iter ( complex_clips) ;
1459
1449
id
1460
1450
}
@@ -1477,7 +1467,7 @@ impl DisplayListBuilder {
1477
1467
} ) ;
1478
1468
1479
1469
let info = LayoutPrimitiveInfo :: new ( frame_rect) ;
1480
- self . push_item ( item, & info) ;
1470
+ self . push_item ( & item, & info) ;
1481
1471
id
1482
1472
}
1483
1473
@@ -1509,24 +1499,21 @@ impl DisplayListBuilder {
1509
1499
pipeline_id,
1510
1500
ignore_missing_pipeline,
1511
1501
} ) ;
1512
- self . push_item ( item, info) ;
1502
+ self . push_item ( & item, info) ;
1513
1503
}
1514
1504
1515
1505
pub fn push_shadow ( & mut self , info : & LayoutPrimitiveInfo , shadow : Shadow ) {
1516
- self . push_item ( SpecificDisplayItem :: PushShadow ( shadow) , info) ;
1506
+ self . push_item ( & SpecificDisplayItem :: PushShadow ( shadow) , info) ;
1517
1507
}
1518
1508
1519
1509
pub fn pop_all_shadows ( & mut self ) {
1520
- let clip_and_scroll = * self . clip_stack . last ( ) . unwrap ( ) ;
1521
- self . push_new_empty_item ( SpecificDisplayItem :: PopAllShadows , & clip_and_scroll) ;
1510
+ self . push_new_empty_item ( & SpecificDisplayItem :: PopAllShadows ) ;
1522
1511
}
1523
1512
1524
1513
pub fn finalize ( self ) -> ( PipelineId , LayoutSize , BuiltDisplayList ) {
1525
1514
assert ! ( self . save_state. is_none( ) , "Finalized DisplayListBuilder with a pending save" ) ;
1526
1515
1527
1516
let end_time = precise_time_ns ( ) ;
1528
-
1529
-
1530
1517
(
1531
1518
self . pipeline_id ,
1532
1519
self . content_size ,
0 commit comments