Commit f2947270 authored by Malay Keshav's avatar Malay Keshav Committed by Commit Bot

Fix bug in RRectF constructor and mojo unpacking

gfx::RRectF is a wrapper for SkRRect. SkRRect normalizes the corner
radii values if the sum of 2 corner radii is larger than the length of
the side between these two corners. This means that the constructor
cannot initialize a rounded rect by sequentially setting the corner
radius for each corner. All the corners have to be set atomically using
the API provided by SkRRect so that the normalization happens correctly.

Bug: 966488
Change-Id: I0e3f373e4425af905f1be1fc1bc9fda983bdf600
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1629010Reviewed-by: default avatarMason Freed <masonfreed@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Malay Keshav <malaykeshav@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664000}
parent 694b06c5
...@@ -89,9 +89,10 @@ struct StructTraits<gfx::mojom::RRectFDataView, gfx::RRectF> { ...@@ -89,9 +89,10 @@ struct StructTraits<gfx::mojom::RRectFDataView, gfx::RRectF> {
gfx::Vector2dF upper_left; gfx::Vector2dF upper_left;
if (!data.ReadUpperLeft(&upper_left)) if (!data.ReadUpperLeft(&upper_left))
return false; return false;
*out = gfx::RRectF(rect, upper_left.x(), upper_left.y()); if (type <= gfx::RRectF::Type::kSimple) {
if (type <= gfx::RRectF::Type::kSimple) *out = gfx::RRectF(rect, upper_left.x(), upper_left.y());
return true; return true;
}
gfx::Vector2dF upper_right; gfx::Vector2dF upper_right;
gfx::Vector2dF lower_right; gfx::Vector2dF lower_right;
gfx::Vector2dF lower_left; gfx::Vector2dF lower_left;
...@@ -100,9 +101,9 @@ struct StructTraits<gfx::mojom::RRectFDataView, gfx::RRectF> { ...@@ -100,9 +101,9 @@ struct StructTraits<gfx::mojom::RRectFDataView, gfx::RRectF> {
!data.ReadLowerLeft(&lower_left)) { !data.ReadLowerLeft(&lower_left)) {
return false; return false;
} }
out->SetCornerRadii(gfx::RRectF::Corner::kUpperRight, upper_right); *out = gfx::RRectF(rect, upper_left.x(), upper_left.y(), upper_right.x(),
out->SetCornerRadii(gfx::RRectF::Corner::kLowerRight, lower_right); upper_right.y(), lower_right.x(), lower_right.y(),
out->SetCornerRadii(gfx::RRectF::Corner::kLowerLeft, lower_left); lower_left.x(), lower_left.y());
return true; return true;
} }
}; };
......
...@@ -273,6 +273,12 @@ TEST_F(StructTraitsTest, RRectF) { ...@@ -273,6 +273,12 @@ TEST_F(StructTraitsTest, RRectF) {
EXPECT_EQ(input.GetType(), RRectF::Type::kOval); EXPECT_EQ(input.GetType(), RRectF::Type::kOval);
proxy->EchoRRectF(input, &output); proxy->EchoRRectF(input, &output);
EXPECT_EQ(input, output); EXPECT_EQ(input, output);
input.SetCornerRadii(RRectF::Corner::kUpperLeft, 50, 50);
input.SetCornerRadii(RRectF::Corner::kUpperRight, 20, 20);
input.SetCornerRadii(RRectF::Corner::kLowerRight, 0, 0);
input.SetCornerRadii(RRectF::Corner::kLowerLeft, 0, 0);
proxy->EchoRRectF(input, &output);
EXPECT_EQ(input, output);
} }
} // namespace gfx } // namespace gfx
...@@ -42,11 +42,19 @@ RRectF::RRectF(float x, ...@@ -42,11 +42,19 @@ RRectF::RRectF(float x,
float lower_right_x, float lower_right_x,
float lower_right_y, float lower_right_y,
float lower_left_x, float lower_left_x,
float lower_left_y) float lower_left_y) {
: RRectF(x, y, width, height, upper_left_x, upper_left_y) { SkVector radii[4] = {
SetCornerRadii(RRectF::Corner::kUpperRight, upper_right_x, upper_right_y); {upper_left_x, upper_left_y},
SetCornerRadii(RRectF::Corner::kLowerRight, lower_right_x, lower_right_y); {upper_right_x, upper_right_y},
SetCornerRadii(RRectF::Corner::kLowerLeft, lower_left_x, lower_left_y); {lower_right_x, lower_right_y},
{lower_left_x, lower_left_y},
};
skrrect_.setRectRadii(SkRect::MakeXYWH(x, y, width, height), radii);
if (IsEmpty()) {
// Make sure that empty rects are created fully empty, not with some
// non-zero dimensions.
skrrect_ = SkRRect::MakeEmpty();
}
} }
gfx::Vector2dF RRectF::GetSimpleRadii() const { gfx::Vector2dF RRectF::GetSimpleRadii() const {
......
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