diff options
Diffstat (limited to 'cc/blink/web_display_item_list_impl.cc')
-rw-r--r-- | cc/blink/web_display_item_list_impl.cc | 123 |
1 files changed, 97 insertions, 26 deletions
diff --git a/cc/blink/web_display_item_list_impl.cc b/cc/blink/web_display_item_list_impl.cc index fb37289..4767d5a 100644 --- a/cc/blink/web_display_item_list_impl.cc +++ b/cc/blink/web_display_item_list_impl.cc @@ -46,9 +46,15 @@ WebDisplayItemListImpl::WebDisplayItemListImpl( } void WebDisplayItemListImpl::appendDrawingItem(const SkPicture* picture) { - auto* item = - display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>(); - item->SetNew(skia::SharePtr(const_cast<SkPicture*>(picture))); + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>(); + item->SetNew(skia::SharePtr(const_cast<SkPicture*>(picture))); + } else { + cc::DrawingDisplayItem item; + item.SetNew(skia::SharePtr(const_cast<SkPicture*>(picture))); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendClipItem( @@ -58,47 +64,88 @@ void WebDisplayItemListImpl::appendClipItem( for (size_t i = 0; i < rounded_clip_rects.size(); ++i) { rounded_rects.push_back(rounded_clip_rects[i]); } - auto* item = display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>(); - item->SetNew(clip_rect, rounded_rects); + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>(); + item->SetNew(clip_rect, rounded_rects); + } else { + cc::ClipDisplayItem item; + item.SetNew(clip_rect, rounded_rects); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndClipItem() { - display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndClipDisplayItem()); + } } void WebDisplayItemListImpl::appendClipPathItem(const SkPath& clip_path, SkRegion::Op clip_op, bool antialias) { - auto* item = - display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(); - item->SetNew(clip_path, clip_op, antialias); + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(); + item->SetNew(clip_path, clip_op, antialias); + } else { + cc::ClipPathDisplayItem item; + item.SetNew(clip_path, clip_op, antialias); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndClipPathItem() { - display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndClipPathDisplayItem()); + } } void WebDisplayItemListImpl::appendFloatClipItem( const blink::WebFloatRect& clip_rect) { - auto* item = - display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>(); - item->SetNew(clip_rect); + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>(); + item->SetNew(clip_rect); + } else { + cc::FloatClipDisplayItem item; + item.SetNew(clip_rect); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndFloatClipItem() { - display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndFloatClipDisplayItem()); + } } void WebDisplayItemListImpl::appendTransformItem(const SkMatrix44& matrix) { + cc::TransformDisplayItem item; gfx::Transform transform; transform.matrix() = matrix; - auto* item = - display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>(); - item->SetNew(transform); + + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>(); + item->SetNew(transform); + } else { + item.SetNew(transform); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndTransformItem() { - display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndTransformDisplayItem()); + } } void WebDisplayItemListImpl::appendCompositingItem( @@ -110,27 +157,51 @@ void WebDisplayItemListImpl::appendCompositingItem( DCHECK_LE(opacity, 1.f); // TODO(ajuma): This should really be rounding instead of flooring the alpha // value, but that breaks slimming paint reftests. - auto* item = - display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>(); - item->SetNew(static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), xfermode, - bounds, skia::SharePtr(color_filter)); + + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>(); + item->SetNew(static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), + xfermode, bounds, skia::SharePtr(color_filter)); + } else { + cc::CompositingDisplayItem item; + item.SetNew(static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), + xfermode, bounds, skia::SharePtr(color_filter)); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndCompositingItem() { - display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndCompositingDisplayItem()); + } } void WebDisplayItemListImpl::appendFilterItem( const blink::WebFilterOperations& filters, const blink::WebFloatRect& bounds) { + cc::FilterDisplayItem item; const WebFilterOperationsImpl& filters_impl = static_cast<const WebFilterOperationsImpl&>(filters); - auto* item = display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(); - item->SetNew(filters_impl.AsFilterOperations(), bounds); + + if (display_item_list_->RetainsIndividualDisplayItems()) { + auto* item = + display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(); + item->SetNew(filters_impl.AsFilterOperations(), bounds); + } else { + item.SetNew(filters_impl.AsFilterOperations(), bounds); + display_item_list_->RasterIntoCanvas(item); + } } void WebDisplayItemListImpl::appendEndFilterItem() { - display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>(); + if (display_item_list_->RetainsIndividualDisplayItems()) { + display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>(); + } else { + display_item_list_->RasterIntoCanvas(cc::EndFilterDisplayItem()); + } } void WebDisplayItemListImpl::appendScrollItem( |