Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 6f77dc7

Browse files
authored
[Impeller] Remove use of private Rect fields from PathBuilder (#49334)
This change removes the last usages of the Rect internal fields from outside the class, allowing the removal of a `friend` declaration and paving the way to reimplement the Rect methods with ltrb fields.
1 parent 0f2b593 commit 6f77dc7

File tree

3 files changed

+136
-52
lines changed

3 files changed

+136
-52
lines changed

impeller/aiks/aiks_unittests.cc

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,6 +1819,96 @@ TEST_P(AiksTest, FilledRoundRectsRenderCorrectly) {
18191819
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
18201820
}
18211821

1822+
TEST_P(AiksTest, FilledRoundRectPathsRenderCorrectly) {
1823+
Canvas canvas;
1824+
canvas.Scale(GetContentScale());
1825+
Paint paint;
1826+
const int color_count = 3;
1827+
Color colors[color_count] = {
1828+
Color::Blue(),
1829+
Color::Green(),
1830+
Color::Crimson(),
1831+
};
1832+
1833+
paint.color = Color::White();
1834+
canvas.DrawPaint(paint);
1835+
1836+
auto draw_rrect_as_path = [&canvas](const Rect& rect, const Size& radii,
1837+
const Paint& paint) {
1838+
PathBuilder builder = PathBuilder();
1839+
builder.AddRoundedRect(rect, radii);
1840+
canvas.DrawPath(builder.TakePath(), paint);
1841+
};
1842+
1843+
int c_index = 0;
1844+
for (int i = 0; i < 4; i++) {
1845+
for (int j = 0; j < 4; j++) {
1846+
paint.color = colors[(c_index++) % color_count];
1847+
draw_rrect_as_path(Rect::MakeXYWH(i * 100 + 10, j * 100 + 20, 80, 80),
1848+
Size(i * 5 + 10, j * 5 + 10), paint);
1849+
}
1850+
}
1851+
paint.color = colors[(c_index++) % color_count];
1852+
draw_rrect_as_path(Rect::MakeXYWH(10, 420, 380, 80), Size(40, 40), paint);
1853+
paint.color = colors[(c_index++) % color_count];
1854+
draw_rrect_as_path(Rect::MakeXYWH(410, 20, 80, 380), Size(40, 40), paint);
1855+
1856+
std::vector<Color> gradient_colors = {
1857+
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0},
1858+
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0},
1859+
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0},
1860+
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0},
1861+
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0},
1862+
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0},
1863+
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}};
1864+
std::vector<Scalar> stops = {
1865+
0.0,
1866+
(1.0 / 6.0) * 1,
1867+
(1.0 / 6.0) * 2,
1868+
(1.0 / 6.0) * 3,
1869+
(1.0 / 6.0) * 4,
1870+
(1.0 / 6.0) * 5,
1871+
1.0,
1872+
};
1873+
auto texture = CreateTextureForFixture("airplane.jpg",
1874+
/*enable_mipmapping=*/true);
1875+
1876+
paint.color = Color::White().WithAlpha(0.1);
1877+
paint.color_source = ColorSource::MakeRadialGradient(
1878+
{550, 550}, 75, gradient_colors, stops, Entity::TileMode::kMirror, {});
1879+
for (int i = 1; i <= 10; i++) {
1880+
int j = 11 - i;
1881+
draw_rrect_as_path(Rect::MakeLTRB(550 - i * 20, 550 - j * 20, //
1882+
550 + i * 20, 550 + j * 20),
1883+
Size(i * 10, j * 10), paint);
1884+
}
1885+
paint.color = Color::White().WithAlpha(0.5);
1886+
paint.color_source = ColorSource::MakeRadialGradient(
1887+
{200, 650}, 75, std::move(gradient_colors), std::move(stops),
1888+
Entity::TileMode::kMirror, {});
1889+
draw_rrect_as_path(Rect::MakeLTRB(100, 610, 300, 690), Size(40, 40), paint);
1890+
draw_rrect_as_path(Rect::MakeLTRB(160, 550, 240, 750), Size(40, 40), paint);
1891+
1892+
paint.color = Color::White().WithAlpha(0.1);
1893+
paint.color_source = ColorSource::MakeImage(
1894+
texture, Entity::TileMode::kRepeat, Entity::TileMode::kRepeat, {},
1895+
Matrix::MakeTranslation({520, 20}));
1896+
for (int i = 1; i <= 10; i++) {
1897+
int j = 11 - i;
1898+
draw_rrect_as_path(Rect::MakeLTRB(720 - i * 20, 220 - j * 20, //
1899+
720 + i * 20, 220 + j * 20),
1900+
Size(i * 10, j * 10), paint);
1901+
}
1902+
paint.color = Color::White().WithAlpha(0.5);
1903+
paint.color_source = ColorSource::MakeImage(
1904+
texture, Entity::TileMode::kRepeat, Entity::TileMode::kRepeat, {},
1905+
Matrix::MakeTranslation({800, 300}));
1906+
draw_rrect_as_path(Rect::MakeLTRB(800, 410, 1000, 490), Size(40, 40), paint);
1907+
draw_rrect_as_path(Rect::MakeLTRB(860, 350, 940, 550), Size(40, 40), paint);
1908+
1909+
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
1910+
}
1911+
18221912
TEST_P(AiksTest, CoverageOriginShouldBeAccountedForInSubpasses) {
18231913
auto callback = [&](AiksContext& renderer) -> std::optional<Picture> {
18241914
Canvas canvas;

impeller/geometry/path_builder.cc

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,13 @@ PathBuilder& PathBuilder::AddCubicCurve(Point p1,
114114
}
115115

116116
PathBuilder& PathBuilder::AddRect(Rect rect) {
117-
current_ = rect.origin;
117+
auto origin = rect.GetOrigin();
118+
auto size = rect.GetSize();
118119

119-
auto tl = rect.origin;
120-
auto bl = rect.origin + Point{0.0, rect.size.height};
121-
auto br = rect.origin + Point{rect.size.width, rect.size.height};
122-
auto tr = rect.origin + Point{rect.size.width, 0.0};
120+
auto tl = origin;
121+
auto bl = origin + Point{0.0, size.height};
122+
auto br = origin + size;
123+
auto tr = origin + Point{size.width, 0.0};
123124

124125
MoveTo(tl);
125126
LineTo(tr);
@@ -150,16 +151,19 @@ PathBuilder& PathBuilder::AddRoundedRect(Rect rect, RoundingRadii radii) {
150151
return AddRect(rect);
151152
}
152153

153-
current_ = rect.origin + Point{radii.top_left.x, 0.0};
154+
auto rect_origin = rect.GetOrigin();
155+
auto rect_size = rect.GetSize();
154156

155-
MoveTo({rect.origin.x + radii.top_left.x, rect.origin.y});
157+
current_ = rect_origin + Point{radii.top_left.x, 0.0};
158+
159+
MoveTo({rect_origin.x + radii.top_left.x, rect_origin.y});
156160

157161
//----------------------------------------------------------------------------
158162
// Top line.
159163
//
160164
prototype_.AddLinearComponent(
161-
{rect.origin.x + radii.top_left.x, rect.origin.y},
162-
{rect.origin.x + rect.size.width - radii.top_right.x, rect.origin.y});
165+
{rect_origin.x + radii.top_left.x, rect_origin.y},
166+
{rect_origin.x + rect_size.width - radii.top_right.x, rect_origin.y});
163167

164168
//----------------------------------------------------------------------------
165169
// Top right arc.
@@ -170,9 +174,9 @@ PathBuilder& PathBuilder::AddRoundedRect(Rect rect, RoundingRadii radii) {
170174
// Right line.
171175
//
172176
prototype_.AddLinearComponent(
173-
{rect.origin.x + rect.size.width, rect.origin.y + radii.top_right.y},
174-
{rect.origin.x + rect.size.width,
175-
rect.origin.y + rect.size.height - radii.bottom_right.y});
177+
{rect_origin.x + rect_size.width, rect_origin.y + radii.top_right.y},
178+
{rect_origin.x + rect_size.width,
179+
rect_origin.y + rect_size.height - radii.bottom_right.y});
176180

177181
//----------------------------------------------------------------------------
178182
// Bottom right arc.
@@ -183,9 +187,9 @@ PathBuilder& PathBuilder::AddRoundedRect(Rect rect, RoundingRadii radii) {
183187
// Bottom line.
184188
//
185189
prototype_.AddLinearComponent(
186-
{rect.origin.x + rect.size.width - radii.bottom_right.x,
187-
rect.origin.y + rect.size.height},
188-
{rect.origin.x + radii.bottom_left.x, rect.origin.y + rect.size.height});
190+
{rect_origin.x + rect_size.width - radii.bottom_right.x,
191+
rect_origin.y + rect_size.height},
192+
{rect_origin.x + radii.bottom_left.x, rect_origin.y + rect_size.height});
189193

190194
//----------------------------------------------------------------------------
191195
// Bottom left arc.
@@ -196,8 +200,8 @@ PathBuilder& PathBuilder::AddRoundedRect(Rect rect, RoundingRadii radii) {
196200
// Left line.
197201
//
198202
prototype_.AddLinearComponent(
199-
{rect.origin.x, rect.origin.y + rect.size.height - radii.bottom_left.y},
200-
{rect.origin.x, rect.origin.y + radii.top_left.y});
203+
{rect_origin.x, rect_origin.y + rect_size.height - radii.bottom_left.y},
204+
{rect_origin.x, rect_origin.y + radii.top_left.y});
201205

202206
//----------------------------------------------------------------------------
203207
// Top left arc.
@@ -212,54 +216,48 @@ PathBuilder& PathBuilder::AddRoundedRect(Rect rect, RoundingRadii radii) {
212216
PathBuilder& PathBuilder::AddRoundedRectTopLeft(Rect rect,
213217
RoundingRadii radii) {
214218
const auto magic_top_left = radii.top_left * kArcApproximationMagic;
219+
const auto corner = rect.GetOrigin();
215220
prototype_.AddCubicComponent(
216-
{rect.origin.x, rect.origin.y + radii.top_left.y},
217-
{rect.origin.x, rect.origin.y + radii.top_left.y - magic_top_left.y},
218-
{rect.origin.x + radii.top_left.x - magic_top_left.x, rect.origin.y},
219-
{rect.origin.x + radii.top_left.x, rect.origin.y});
221+
{corner.x, corner.y + radii.top_left.y},
222+
{corner.x, corner.y + radii.top_left.y - magic_top_left.y},
223+
{corner.x + radii.top_left.x - magic_top_left.x, corner.y},
224+
{corner.x + radii.top_left.x, corner.y});
220225
return *this;
221226
}
222227

223228
PathBuilder& PathBuilder::AddRoundedRectTopRight(Rect rect,
224229
RoundingRadii radii) {
225230
const auto magic_top_right = radii.top_right * kArcApproximationMagic;
231+
const auto corner = rect.GetOrigin() + Point{rect.GetWidth(), 0};
226232
prototype_.AddCubicComponent(
227-
{rect.origin.x + rect.size.width - radii.top_right.x, rect.origin.y},
228-
{rect.origin.x + rect.size.width - radii.top_right.x + magic_top_right.x,
229-
rect.origin.y},
230-
{rect.origin.x + rect.size.width,
231-
rect.origin.y + radii.top_right.y - magic_top_right.y},
232-
{rect.origin.x + rect.size.width, rect.origin.y + radii.top_right.y});
233+
{corner.x - radii.top_right.x, corner.y},
234+
{corner.x - radii.top_right.x + magic_top_right.x, corner.y},
235+
{corner.x, corner.y + radii.top_right.y - magic_top_right.y},
236+
{corner.x, corner.y + radii.top_right.y});
233237
return *this;
234238
}
235239

236240
PathBuilder& PathBuilder::AddRoundedRectBottomRight(Rect rect,
237241
RoundingRadii radii) {
238242
const auto magic_bottom_right = radii.bottom_right * kArcApproximationMagic;
243+
const auto corner = rect.GetOrigin() + rect.GetSize();
239244
prototype_.AddCubicComponent(
240-
{rect.origin.x + rect.size.width,
241-
rect.origin.y + rect.size.height - radii.bottom_right.y},
242-
{rect.origin.x + rect.size.width, rect.origin.y + rect.size.height -
243-
radii.bottom_right.y +
244-
magic_bottom_right.y},
245-
{rect.origin.x + rect.size.width - radii.bottom_right.x +
246-
magic_bottom_right.x,
247-
rect.origin.y + rect.size.height},
248-
{rect.origin.x + rect.size.width - radii.bottom_right.x,
249-
rect.origin.y + rect.size.height});
245+
{corner.x, corner.y - radii.bottom_right.y},
246+
{corner.x, corner.y - radii.bottom_right.y + magic_bottom_right.y},
247+
{corner.x - radii.bottom_right.x + magic_bottom_right.x, corner.y},
248+
{corner.x - radii.bottom_right.x, corner.y});
250249
return *this;
251250
}
252251

253252
PathBuilder& PathBuilder::AddRoundedRectBottomLeft(Rect rect,
254253
RoundingRadii radii) {
255254
const auto magic_bottom_left = radii.bottom_left * kArcApproximationMagic;
255+
const auto corner = rect.GetOrigin() + Point{0, rect.GetHeight()};
256256
prototype_.AddCubicComponent(
257-
{rect.origin.x + radii.bottom_left.x, rect.origin.y + rect.size.height},
258-
{rect.origin.x + radii.bottom_left.x - magic_bottom_left.x,
259-
rect.origin.y + rect.size.height},
260-
{rect.origin.x, rect.origin.y + rect.size.height - radii.bottom_left.y +
261-
magic_bottom_left.y},
262-
{rect.origin.x, rect.origin.y + rect.size.height - radii.bottom_left.y});
257+
{corner.x + radii.bottom_left.x, corner.y},
258+
{corner.x + radii.bottom_left.x - magic_bottom_left.x, corner.y},
259+
{corner.x, corner.y - radii.bottom_left.y + magic_bottom_left.y},
260+
{corner.x, corner.y - radii.bottom_left.y});
263261
return *this;
264262
}
265263

@@ -274,10 +272,8 @@ PathBuilder& PathBuilder::AddArc(const Rect& oval_bounds,
274272
sweep.radians = std::min(k2Pi, sweep.radians);
275273
start.radians = std::fmod(start.radians, k2Pi);
276274

277-
const Point radius = {oval_bounds.size.width * 0.5f,
278-
oval_bounds.size.height * 0.5f};
279-
const Point center = {oval_bounds.origin.x + radius.x,
280-
oval_bounds.origin.y + radius.y};
275+
const Point center = oval_bounds.GetCenter();
276+
const Point radius = center - oval_bounds.GetOrigin();
281277

282278
Vector2 p1_unit(std::cos(start.radians), std::sin(start.radians));
283279

@@ -324,9 +320,9 @@ PathBuilder& PathBuilder::AddArc(const Rect& oval_bounds,
324320
}
325321

326322
PathBuilder& PathBuilder::AddOval(const Rect& container) {
327-
const Point r = {container.size.width * 0.5f, container.size.height * 0.5f};
328-
const Point c = {container.origin.x + r.x, container.origin.y + r.y};
329-
const Point m = {kArcApproximationMagic * r.x, kArcApproximationMagic * r.y};
323+
const Point c = container.GetCenter();
324+
const Point r = c - container.GetOrigin();
325+
const Point m = r * kArcApproximationMagic;
330326

331327
MoveTo({c.x, c.y - r.y});
332328

impeller/geometry/rect.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,6 @@ struct TRect {
483483
TPoint<Type> origin;
484484
TSize<Type> size;
485485
// NOLINTEND
486-
487-
friend class PathBuilder;
488486
};
489487

490488
using Rect = TRect<Scalar>;

0 commit comments

Comments
 (0)