Commit 5969ceef authored by Maggie Chen's avatar Maggie Chen Committed by Commit Bot

Fix FilterOperations::MaximumPixelMovement() for DROP_SHADOW

Syntax: drop-shadow(offset-x offset-y blur-radius color)

The maximum pixel movement needs to include offset-x, offset-y, and
blur-radius. Although blur-radius is optional, we still need to consider
it. This CL adds Blur-radius to the comparison formula.

Bug: 1064390
Change-Id: I3b9579335086bfda808c99cc263fdbcc8210fd45
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2453338Reviewed-by: default avatarMason Freed <masonfreed@chromium.org>
Reviewed-by: default avatarSunny Sachanandani <sunnyps@chromium.org>
Commit-Queue: Maggie Chen <magchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815425}
parent a4513e6f
...@@ -110,11 +110,15 @@ float FilterOperations::MaximumPixelMovement() const { ...@@ -110,11 +110,15 @@ float FilterOperations::MaximumPixelMovement() const {
const FilterOperation& op = operations_[i]; const FilterOperation& op = operations_[i];
switch (op.type()) { switch (op.type()) {
case FilterOperation::BLUR: case FilterOperation::BLUR:
max_movement = fmax(max_movement, op.amount() * 2); // |op.amount| here is the blur radius.
max_movement = fmax(max_movement, op.amount() * 2.f);
continue; continue;
case FilterOperation::DROP_SHADOW: case FilterOperation::DROP_SHADOW:
max_movement = fmax(max_movement, fmax(op.drop_shadow_offset().x(), // |op.amount| here is the blur radius.
op.drop_shadow_offset().y())); max_movement =
fmax(max_movement, fmax(std::abs(op.drop_shadow_offset().x()),
std::abs(op.drop_shadow_offset().y())) +
op.amount() * 2.f);
continue; continue;
case FilterOperation::ZOOM: case FilterOperation::ZOOM:
max_movement = fmax(max_movement, op.zoom_inset()); max_movement = fmax(max_movement, op.zoom_inset());
......
...@@ -928,5 +928,46 @@ TEST(FilterOperationsTest, HasFilterOfType) { ...@@ -928,5 +928,46 @@ TEST(FilterOperationsTest, HasFilterOfType) {
EXPECT_FALSE(filters.HasFilterOfType(FilterOperation::ZOOM)); EXPECT_FALSE(filters.HasFilterOfType(FilterOperation::ZOOM));
} }
TEST(FilterOperationsTest, MaximumPixelMovement) {
FilterOperations filters;
filters.Append(FilterOperation::CreateBlurFilter(20));
EXPECT_FLOAT_EQ(20.f * 2, filters.MaximumPixelMovement());
filters.Clear();
filters.Append(
FilterOperation::CreateDropShadowFilter(gfx::Point(3, -8), 20, 0));
float max_movement = fmax(std::abs(3), std::abs(-8)) + 20.f * 2;
EXPECT_FLOAT_EQ(max_movement, filters.MaximumPixelMovement());
filters.Clear();
filters.Append(FilterOperation::CreateZoomFilter(2, 3));
// max movement = zoom_inset = 3
EXPECT_FLOAT_EQ(3.f, filters.MaximumPixelMovement());
filters.Clear();
filters.Append(FilterOperation::CreateReferenceFilter(
sk_make_sp<OffsetPaintFilter>(10, 10, nullptr)));
// max movement = 100.
EXPECT_FLOAT_EQ(100.f, filters.MaximumPixelMovement());
// For filters that don't move pixels. HasFilterThatMovesPixels() = false.
filters.Clear();
filters.Append(FilterOperation::CreateOpacityFilter(0.25f));
SkScalar matrix[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
filters.Append(FilterOperation::CreateColorMatrixFilter(matrix));
filters.Append(FilterOperation::CreateGrayscaleFilter(0.75f));
filters.Append(FilterOperation::CreateSepiaFilter(0.625f));
filters.Append(FilterOperation::CreateSaturateFilter(1.25f));
filters.Append(FilterOperation::CreateHueRotateFilter(6.f));
filters.Append(FilterOperation::CreateInvertFilter(0.75f));
filters.Append(FilterOperation::CreateBrightnessFilter(9.f));
filters.Append(FilterOperation::CreateContrastFilter(3.f));
filters.Append(FilterOperation::CreateSaturatingBrightnessFilter(7.f));
EXPECT_FLOAT_EQ(0.f, filters.MaximumPixelMovement());
}
} // namespace } // namespace
} // namespace cc } // namespace cc
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