3
3
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
4
5
5
use app_units:: Au ;
6
- use euclid:: { Point2D , Rect , Size2D } ;
6
+ use euclid:: { Matrix4D , Point2D , Rect , Size2D } ;
7
7
use std:: mem;
8
8
use std:: slice;
9
9
use { AuxiliaryLists , AuxiliaryListsDescriptor , BorderDisplayItem , BorderRadius } ;
10
10
use { BorderSide , BoxShadowClipMode , BoxShadowDisplayItem , BuiltDisplayList } ;
11
11
use { BuiltDisplayListDescriptor , ClipRegion , ComplexClipRegion , ColorF } ;
12
12
use { DisplayItem , DisplayListMode , FilterOp , YuvColorSpace } ;
13
13
use { FontKey , GlyphInstance , GradientDisplayItem , GradientStop , IframeDisplayItem } ;
14
- use { ImageDisplayItem , YuvImageDisplayItem , ImageKey , ImageRendering , ItemRange , PipelineId , } ;
14
+ use { ImageDisplayItem , ImageKey , ImageMask , ImageRendering , ItemRange , MixBlendMode , PipelineId } ;
15
15
use { PushScrollLayerItem , PushStackingContextDisplayItem , RectangleDisplayItem , ScrollLayerId } ;
16
- use { SpecificDisplayItem , StackingContext , TextDisplayItem , WebGLContextId , WebGLDisplayItem } ;
16
+ use { ScrollPolicy , ServoScrollRootId , SpecificDisplayItem , StackingContext , TextDisplayItem } ;
17
+ use { WebGLContextId , WebGLDisplayItem , YuvImageDisplayItem } ;
17
18
18
19
impl BuiltDisplayListDescriptor {
19
20
pub fn size ( & self ) -> usize {
@@ -47,13 +48,19 @@ impl BuiltDisplayList {
47
48
pub struct DisplayListBuilder {
48
49
pub mode : DisplayListMode ,
49
50
pub list : Vec < DisplayItem > ,
51
+ auxiliary_lists_builder : AuxiliaryListsBuilder ,
52
+ pub pipeline_id : PipelineId ,
53
+ next_scroll_layer_id : usize ,
50
54
}
51
55
52
56
impl DisplayListBuilder {
53
- pub fn new ( ) -> DisplayListBuilder {
57
+ pub fn new ( pipeline_id : PipelineId ) -> DisplayListBuilder {
54
58
DisplayListBuilder {
55
59
mode : DisplayListMode :: Default ,
56
60
list : Vec :: new ( ) ,
61
+ auxiliary_lists_builder : AuxiliaryListsBuilder :: new ( ) ,
62
+ pipeline_id : pipeline_id,
63
+ next_scroll_layer_id : 0 ,
57
64
}
58
65
}
59
66
@@ -146,8 +153,7 @@ impl DisplayListBuilder {
146
153
font_key : FontKey ,
147
154
color : ColorF ,
148
155
size : Au ,
149
- blur_radius : Au ,
150
- auxiliary_lists_builder : & mut AuxiliaryListsBuilder ) {
156
+ blur_radius : Au ) {
151
157
// Sanity check - anything with glyphs bigger than this
152
158
// is probably going to consume too much memory to render
153
159
// efficiently anyway. This is specifically to work around
@@ -157,7 +163,7 @@ impl DisplayListBuilder {
157
163
if size < Au :: from_px ( 4096 ) {
158
164
let item = TextDisplayItem {
159
165
color : color,
160
- glyphs : auxiliary_lists_builder. add_glyph_instances ( & glyphs) ,
166
+ glyphs : self . auxiliary_lists_builder . add_glyph_instances ( & glyphs) ,
161
167
font_key : font_key,
162
168
size : size,
163
169
blur_radius : blur_radius,
@@ -232,12 +238,11 @@ impl DisplayListBuilder {
232
238
clip : ClipRegion ,
233
239
start_point : Point2D < f32 > ,
234
240
end_point : Point2D < f32 > ,
235
- stops : Vec < GradientStop > ,
236
- auxiliary_lists_builder : & mut AuxiliaryListsBuilder ) {
241
+ stops : Vec < GradientStop > ) {
237
242
let item = GradientDisplayItem {
238
243
start_point : start_point,
239
244
end_point : end_point,
240
- stops : auxiliary_lists_builder. add_gradient_stops ( & stops) ,
245
+ stops : self . auxiliary_lists_builder . add_gradient_stops ( & stops) ,
241
246
} ;
242
247
243
248
let display_item = DisplayItem {
@@ -249,7 +254,26 @@ impl DisplayListBuilder {
249
254
self . list . push ( display_item) ;
250
255
}
251
256
252
- pub fn push_stacking_context ( & mut self , stacking_context : StackingContext ) {
257
+ pub fn push_stacking_context ( & mut self ,
258
+ scroll_policy : ScrollPolicy ,
259
+ bounds : Rect < f32 > ,
260
+ overflow : Rect < f32 > ,
261
+ z_index : i32 ,
262
+ transform : & Matrix4D < f32 > ,
263
+ perspective : & Matrix4D < f32 > ,
264
+ mix_blend_mode : MixBlendMode ,
265
+ filters : Vec < FilterOp > ) {
266
+ let stacking_context = StackingContext {
267
+ scroll_policy : scroll_policy,
268
+ bounds : bounds,
269
+ overflow : overflow,
270
+ z_index : z_index,
271
+ transform : transform. clone ( ) ,
272
+ perspective : perspective. clone ( ) ,
273
+ mix_blend_mode : mix_blend_mode,
274
+ filters : self . auxiliary_lists_builder . add_filters ( & filters) ,
275
+ } ;
276
+
253
277
let item = DisplayItem {
254
278
item : SpecificDisplayItem :: PushStackingContext ( PushStackingContextDisplayItem {
255
279
stacking_context : stacking_context
@@ -272,10 +296,13 @@ impl DisplayListBuilder {
272
296
pub fn push_scroll_layer ( & mut self ,
273
297
clip : Rect < f32 > ,
274
298
content_size : Size2D < f32 > ,
275
- id : ScrollLayerId ) {
299
+ scroll_root_id : ServoScrollRootId ) {
300
+ let scroll_layer_id = self . next_scroll_layer_id ;
301
+ self . next_scroll_layer_id += 1 ;
302
+
276
303
let item = PushScrollLayerItem {
277
304
content_size : content_size,
278
- id : id ,
305
+ id : ScrollLayerId :: new ( self . pipeline_id , scroll_layer_id , scroll_root_id ) ,
279
306
} ;
280
307
281
308
let item = DisplayItem {
@@ -304,19 +331,28 @@ impl DisplayListBuilder {
304
331
self . list . push ( item) ;
305
332
}
306
333
307
- pub fn finalize ( self ) -> BuiltDisplayList {
334
+ pub fn new_clip_region ( & mut self ,
335
+ rect : & Rect < f32 > ,
336
+ complex : Vec < ComplexClipRegion > ,
337
+ image_mask : Option < ImageMask > )
338
+ -> ClipRegion {
339
+ ClipRegion :: new ( rect, complex, image_mask, & mut self . auxiliary_lists_builder )
340
+ }
341
+
342
+ pub fn finalize ( self ) -> ( BuiltDisplayList , AuxiliaryLists ) {
308
343
unsafe {
309
344
let blob = convert_pod_to_blob ( & self . list ) . to_vec ( ) ;
310
345
let display_list_items_size = blob. len ( ) ;
311
346
312
- BuiltDisplayList {
313
- descriptor : BuiltDisplayListDescriptor {
314
- mode : self . mode ,
315
- display_list_items_size : display_list_items_size,
316
- display_items_size : 0 ,
317
- } ,
318
- data : blob,
319
- }
347
+ ( BuiltDisplayList {
348
+ descriptor : BuiltDisplayListDescriptor {
349
+ mode : self . mode ,
350
+ display_list_items_size : display_list_items_size,
351
+ display_items_size : 0 ,
352
+ } ,
353
+ data : blob,
354
+ } ,
355
+ self . auxiliary_lists_builder . finalize ( ) )
320
356
}
321
357
}
322
358
}
0 commit comments