Commit 18fc5362 authored by pdr's avatar pdr Committed by Commit bot

Add layer bounds to compositing_dislay_item

This patch adds an SkRect for bounds to compositing_display_item and
uses it for setting the canvas layer bounds. With this patch and the
associated blink-side patch [1] we pass the following additional
layout tests:
LayoutTests/svg/zoom/page/zoom-mask-with-percentages.svg
LayoutTests/svg/transforms/text-with-mask-with-svg-transform.svg
LayoutTests/svg/custom/absolute-sized-content-with-resources.xhtml
LayoutTests/svg/custom/mask-excessive-malloc.svg
LayoutTests/svg/batik/masking/maskRegions.svg

[1] https://codereview.chromium.org/960483002

Review URL: https://codereview.chromium.org/952123002

Cr-Commit-Position: refs/heads/master@{#318127}
parent d00f1045
...@@ -98,12 +98,21 @@ void WebDisplayItemListImpl::appendEndTransparencyItem() { ...@@ -98,12 +98,21 @@ void WebDisplayItemListImpl::appendEndTransparencyItem() {
display_item_list_->AppendItem(cc::EndTransparencyDisplayItem::Create()); display_item_list_->AppendItem(cc::EndTransparencyDisplayItem::Create());
} }
// TODO(pdr): Remove this once the blink-side callers have been removed.
void WebDisplayItemListImpl::appendCompositingItem( void WebDisplayItemListImpl::appendCompositingItem(
float opacity, float opacity,
SkXfermode::Mode xfermode, SkXfermode::Mode xfermode,
SkColorFilter* color_filter) { SkColorFilter* color_filter) {
appendCompositingItem(opacity, xfermode, nullptr, color_filter);
}
void WebDisplayItemListImpl::appendCompositingItem(
float opacity,
SkXfermode::Mode xfermode,
SkRect* bounds,
SkColorFilter* color_filter) {
display_item_list_->AppendItem(cc::CompositingDisplayItem::Create( display_item_list_->AppendItem(cc::CompositingDisplayItem::Create(
opacity, xfermode, skia::SharePtr(color_filter))); opacity, xfermode, bounds, skia::SharePtr(color_filter)));
} }
void WebDisplayItemListImpl::appendEndCompositingItem() { void WebDisplayItemListImpl::appendEndCompositingItem() {
......
...@@ -50,9 +50,14 @@ class WebDisplayItemListImpl : public blink::WebDisplayItemList { ...@@ -50,9 +50,14 @@ class WebDisplayItemListImpl : public blink::WebDisplayItemList {
virtual void appendTransparencyItem(float opacity, virtual void appendTransparencyItem(float opacity,
blink::WebBlendMode blend_mode); blink::WebBlendMode blend_mode);
virtual void appendEndTransparencyItem(); virtual void appendEndTransparencyItem();
// TODO(pdr): Remove this once the blink-side callers have been removed.
virtual void appendCompositingItem(float opacity, virtual void appendCompositingItem(float opacity,
SkXfermode::Mode, SkXfermode::Mode,
SkColorFilter*); SkColorFilter*);
virtual void appendCompositingItem(float opacity,
SkXfermode::Mode,
SkRect* bounds,
SkColorFilter*);
virtual void appendEndCompositingItem(); virtual void appendEndCompositingItem();
virtual void appendFilterItem(const blink::WebFilterOperations& filters, virtual void appendFilterItem(const blink::WebFilterOperations& filters,
const blink::WebFloatRect& bounds); const blink::WebFloatRect& bounds);
......
...@@ -15,8 +15,14 @@ namespace cc { ...@@ -15,8 +15,14 @@ namespace cc {
CompositingDisplayItem::CompositingDisplayItem(float opacity, CompositingDisplayItem::CompositingDisplayItem(float opacity,
SkXfermode::Mode xfermode, SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> cf) skia::RefPtr<SkColorFilter> cf)
: opacity_(opacity), xfermode_(xfermode), color_filter_(cf) { : opacity_(opacity),
xfermode_(xfermode),
has_bounds_(!!bounds),
color_filter_(cf) {
if (bounds)
bounds_ = SkRect(*bounds);
} }
CompositingDisplayItem::~CompositingDisplayItem() { CompositingDisplayItem::~CompositingDisplayItem() {
...@@ -28,7 +34,7 @@ void CompositingDisplayItem::Raster(SkCanvas* canvas, ...@@ -28,7 +34,7 @@ void CompositingDisplayItem::Raster(SkCanvas* canvas,
paint.setXfermodeMode(xfermode_); paint.setXfermodeMode(xfermode_);
paint.setAlpha(opacity_ * 255); paint.setAlpha(opacity_ * 255);
paint.setColorFilter(color_filter_.get()); paint.setColorFilter(color_filter_.get());
canvas->saveLayer(NULL, &paint); canvas->saveLayer(has_bounds_ ? &bounds_ : nullptr, &paint);
} }
bool CompositingDisplayItem::IsSuitableForGpuRasterization() const { bool CompositingDisplayItem::IsSuitableForGpuRasterization() const {
...@@ -41,13 +47,19 @@ int CompositingDisplayItem::ApproximateOpCount() const { ...@@ -41,13 +47,19 @@ int CompositingDisplayItem::ApproximateOpCount() const {
size_t CompositingDisplayItem::PictureMemoryUsage() const { size_t CompositingDisplayItem::PictureMemoryUsage() const {
// TODO(pdr): Include color_filter's memory here. // TODO(pdr): Include color_filter's memory here.
return sizeof(float) + sizeof(SkXfermode::Mode); return sizeof(float) + sizeof(bool) + sizeof(SkRect) +
sizeof(SkXfermode::Mode);
} }
void CompositingDisplayItem::AsValueInto( void CompositingDisplayItem::AsValueInto(
base::trace_event::TracedValue* array) const { base::trace_event::TracedValue* array) const {
array->AppendString(base::StringPrintf( array->AppendString(base::StringPrintf(
"CompositingDisplayItem opacity: %f, xfermode: %d", opacity_, xfermode_)); "CompositingDisplayItem opacity: %f, xfermode: %d", opacity_, xfermode_));
if (has_bounds_)
array->AppendString(base::StringPrintf(
", bounds: [%f, %f, %f, %f]", static_cast<float>(bounds_.x()),
static_cast<float>(bounds_.y()), static_cast<float>(bounds_.width()),
static_cast<float>(bounds_.height())));
} }
EndCompositingDisplayItem::EndCompositingDisplayItem() { EndCompositingDisplayItem::EndCompositingDisplayItem() {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "cc/resources/display_item.h" #include "cc/resources/display_item.h"
#include "skia/ext/refptr.h" #include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkColorFilter.h" #include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/core/SkRect.h"
#include "third_party/skia/include/core/SkXfermode.h" #include "third_party/skia/include/core/SkXfermode.h"
#include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/rect_f.h"
...@@ -25,9 +26,10 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem { ...@@ -25,9 +26,10 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
static scoped_ptr<CompositingDisplayItem> Create( static scoped_ptr<CompositingDisplayItem> Create(
float opacity, float opacity,
SkXfermode::Mode xfermode, SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> color_filter) { skia::RefPtr<SkColorFilter> color_filter) {
return make_scoped_ptr( return make_scoped_ptr(
new CompositingDisplayItem(opacity, xfermode, color_filter)); new CompositingDisplayItem(opacity, xfermode, bounds, color_filter));
} }
void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override; void Raster(SkCanvas* canvas, SkDrawPictureCallback* callback) const override;
...@@ -40,11 +42,14 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem { ...@@ -40,11 +42,14 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
protected: protected:
CompositingDisplayItem(float opacity, CompositingDisplayItem(float opacity,
SkXfermode::Mode, SkXfermode::Mode,
SkRect* bounds,
skia::RefPtr<SkColorFilter>); skia::RefPtr<SkColorFilter>);
private: private:
float opacity_; float opacity_;
SkXfermode::Mode xfermode_; SkXfermode::Mode xfermode_;
bool has_bounds_;
SkRect bounds_;
skia::RefPtr<SkColorFilter> color_filter_; skia::RefPtr<SkColorFilter> color_filter_;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment