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() {
display_item_list_->AppendItem(cc::EndTransparencyDisplayItem::Create());
}
// TODO(pdr): Remove this once the blink-side callers have been removed.
void WebDisplayItemListImpl::appendCompositingItem(
float opacity,
SkXfermode::Mode xfermode,
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(
opacity, xfermode, skia::SharePtr(color_filter)));
opacity, xfermode, bounds, skia::SharePtr(color_filter)));
}
void WebDisplayItemListImpl::appendEndCompositingItem() {
......
......@@ -50,9 +50,14 @@ class WebDisplayItemListImpl : public blink::WebDisplayItemList {
virtual void appendTransparencyItem(float opacity,
blink::WebBlendMode blend_mode);
virtual void appendEndTransparencyItem();
// TODO(pdr): Remove this once the blink-side callers have been removed.
virtual void appendCompositingItem(float opacity,
SkXfermode::Mode,
SkColorFilter*);
virtual void appendCompositingItem(float opacity,
SkXfermode::Mode,
SkRect* bounds,
SkColorFilter*);
virtual void appendEndCompositingItem();
virtual void appendFilterItem(const blink::WebFilterOperations& filters,
const blink::WebFloatRect& bounds);
......
......@@ -15,8 +15,14 @@ namespace cc {
CompositingDisplayItem::CompositingDisplayItem(float opacity,
SkXfermode::Mode xfermode,
SkRect* bounds,
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() {
......@@ -28,7 +34,7 @@ void CompositingDisplayItem::Raster(SkCanvas* canvas,
paint.setXfermodeMode(xfermode_);
paint.setAlpha(opacity_ * 255);
paint.setColorFilter(color_filter_.get());
canvas->saveLayer(NULL, &paint);
canvas->saveLayer(has_bounds_ ? &bounds_ : nullptr, &paint);
}
bool CompositingDisplayItem::IsSuitableForGpuRasterization() const {
......@@ -41,13 +47,19 @@ int CompositingDisplayItem::ApproximateOpCount() const {
size_t CompositingDisplayItem::PictureMemoryUsage() const {
// 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(
base::trace_event::TracedValue* array) const {
array->AppendString(base::StringPrintf(
"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() {
......
......@@ -10,6 +10,7 @@
#include "cc/resources/display_item.h"
#include "skia/ext/refptr.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 "ui/gfx/geometry/rect_f.h"
......@@ -25,9 +26,10 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
static scoped_ptr<CompositingDisplayItem> Create(
float opacity,
SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> color_filter) {
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;
......@@ -40,11 +42,14 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
protected:
CompositingDisplayItem(float opacity,
SkXfermode::Mode,
SkRect* bounds,
skia::RefPtr<SkColorFilter>);
private:
float opacity_;
SkXfermode::Mode xfermode_;
bool has_bounds_;
SkRect bounds_;
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