// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/blink/web_display_item_list_impl.h" #include #include #include #include "cc/playback/clip_display_item.h" #include "cc/playback/clip_path_display_item.h" #include "cc/playback/compositing_display_item.h" #include "cc/playback/display_item_list_settings.h" #include "cc/playback/drawing_display_item.h" #include "cc/playback/filter_display_item.h" #include "cc/playback/float_clip_display_item.h" #include "cc/playback/transform_display_item.h" #include "skia/ext/refptr.h" #include "third_party/WebKit/public/platform/WebFloatRect.h" #include "third_party/WebKit/public/platform/WebRect.h" #include "third_party/skia/include/core/SkColorFilter.h" #include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/utils/SkMatrix44.h" #include "ui/gfx/geometry/safe_integer_conversions.h" #include "ui/gfx/transform.h" namespace cc_blink { namespace { scoped_refptr CreateUncachedDisplayItemListForBlink() { cc::DisplayItemListSettings settings; settings.use_cached_picture = false; gfx::Rect layer_rect; return cc::DisplayItemList::Create(layer_rect, settings); } } // namespace WebDisplayItemListImpl::WebDisplayItemListImpl() : display_item_list_(CreateUncachedDisplayItemListForBlink()) { } WebDisplayItemListImpl::WebDisplayItemListImpl( cc::DisplayItemList* display_list) : display_item_list_(display_list) { } void WebDisplayItemListImpl::appendDrawingItem( const blink::WebRect& visual_rect, const SkPicture* picture) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, skia::SharePtr(picture)); } else { cc::DrawingDisplayItem item(skia::SharePtr(picture)); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendClipItem( const blink::WebRect& visual_rect, const blink::WebRect& clip_rect, const blink::WebVector& rounded_clip_rects) { std::vector rounded_rects; for (size_t i = 0; i < rounded_clip_rects.size(); ++i) { rounded_rects.push_back(rounded_clip_rects[i]); } if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, clip_rect, rounded_rects); } else { cc::ClipDisplayItem item(clip_rect, rounded_rects); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndClipItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndClipDisplayItem()); } } void WebDisplayItemListImpl::appendClipPathItem( const blink::WebRect& visual_rect, const SkPath& clip_path, SkRegion::Op clip_op, bool antialias) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, clip_path, clip_op, antialias); } else { cc::ClipPathDisplayItem item(clip_path, clip_op, antialias); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndClipPathItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndClipPathDisplayItem()); } } void WebDisplayItemListImpl::appendFloatClipItem( const blink::WebRect& visual_rect, const blink::WebFloatRect& clip_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, clip_rect); } else { cc::FloatClipDisplayItem item(clip_rect); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndFloatClipItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndFloatClipDisplayItem()); } } void WebDisplayItemListImpl::appendTransformItem( const blink::WebRect& visual_rect, const SkMatrix44& matrix) { gfx::Transform transform(gfx::Transform::kSkipInitialization); transform.matrix() = matrix; if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, transform); } else { cc::TransformDisplayItem item(transform); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndTransformItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndTransformDisplayItem()); } } void WebDisplayItemListImpl::appendCompositingItem( const blink::WebRect& visual_rect, float opacity, SkXfermode::Mode xfermode, SkRect* bounds, SkColorFilter* color_filter) { DCHECK_GE(opacity, 0.f); DCHECK_LE(opacity, 1.f); // TODO(ajuma): This should really be rounding instead of flooring the alpha // value, but that breaks slimming paint reftests. const bool kLcdTextRequiresOpaqueLayer = true; if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, static_cast(gfx::ToFlooredInt(255 * opacity)), xfermode, bounds, skia::SharePtr(color_filter), kLcdTextRequiresOpaqueLayer); } else { cc::CompositingDisplayItem item( static_cast(gfx::ToFlooredInt(255 * opacity)), xfermode, bounds, skia::SharePtr(color_filter), kLcdTextRequiresOpaqueLayer); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndCompositingItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndCompositingDisplayItem()); } } void WebDisplayItemListImpl::appendFilterItem( const blink::WebRect& visual_rect, const cc::FilterOperations& filters, const blink::WebFloatRect& bounds) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect, filters, bounds); } else { cc::FilterDisplayItem item(filters, bounds); display_item_list_->RasterIntoCanvas(item); } } void WebDisplayItemListImpl::appendEndFilterItem( const blink::WebRect& visual_rect) { if (display_item_list_->RetainsIndividualDisplayItems()) { display_item_list_->CreateAndAppendItem( visual_rect); } else { display_item_list_->RasterIntoCanvas(cc::EndFilterDisplayItem()); } } void WebDisplayItemListImpl::appendScrollItem( const blink::WebRect& visual_rect, const blink::WebSize& scroll_offset, ScrollContainerId) { SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor); matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0); // TODO(wkorman): Should we translate the visual rect as well? appendTransformItem(visual_rect, matrix); } void WebDisplayItemListImpl::appendEndScrollItem( const blink::WebRect& visual_rect) { appendEndTransformItem(visual_rect); } WebDisplayItemListImpl::~WebDisplayItemListImpl() { } } // namespace cc_blink