Issue #1925 - Replace RectCorner with Corner.

This commit is contained in:
Moonchild 2024-08-02 12:10:27 +02:00 • committed by roytam1
commit 5c509ea6ce
5 changed files with 41 additions and 54 deletions

View file

@ -378,12 +378,12 @@ struct BaseRect {
Point TopRight() const { return Point(XMost(), y); } Point TopRight() const { return Point(XMost(), y); }
Point BottomLeft() const { return Point(x, YMost()); } Point BottomLeft() const { return Point(x, YMost()); }
Point BottomRight() const { return Point(XMost(), YMost()); } Point BottomRight() const { return Point(XMost(), YMost()); }
Point AtCorner(int aCorner) const { Point AtCorner(Corner aCorner) const {
switch (aCorner) { switch (aCorner) {
case RectCorner::TopLeft: return TopLeft(); case eCornerTopLeft: return TopLeft();
case RectCorner::TopRight: return TopRight(); case eCornerTopRight: return TopRight();
case RectCorner::BottomRight: return BottomRight(); case eCornerBottomRight: return BottomRight();
case RectCorner::BottomLeft: return BottomLeft(); case eCornerBottomLeft: return BottomLeft();
} }
MOZ_CRASH("GFX: Incomplete switch"); MOZ_CRASH("GFX: Incomplete switch");
} }

View file

@ -125,10 +125,10 @@ AppendRoundedRectToPath(PathBuilder* aPathBuilder,
Point pc, p0, p1, p2, p3; Point pc, p0, p1, p2, p3;
if (aDrawClockwise) { if (aDrawClockwise) {
aPathBuilder->MoveTo(Point(aRect.X() + aRadii[RectCorner::TopLeft].width, aPathBuilder->MoveTo(Point(aRect.X() + aRadii[eCornerTopLeft].width,
aRect.Y())); aRect.Y()));
} else { } else {
aPathBuilder->MoveTo(Point(aRect.X() + aRect.Width() - aRadii[RectCorner::TopRight].width, aPathBuilder->MoveTo(Point(aRect.X() + aRect.Width() - aRadii[eCornerTopRight].width,
aRect.Y())); aRect.Y()));
} }

View file

@ -178,35 +178,35 @@ inline already_AddRefed<Path> MakePathForRect(const DrawTarget& aDrawTarget,
} }
struct RectCornerRadii { struct RectCornerRadii {
Size radii[RectCorner::Count]; Size radii[eCornerCount];
RectCornerRadii() {} RectCornerRadii() {}
explicit RectCornerRadii(Float radius) { explicit RectCornerRadii(Float radius) {
for (int i = 0; i < RectCorner::Count; i++) { NS_FOR_CSS_FULL_CORNERS(i) {
radii[i].SizeTo(radius, radius); radii[i].SizeTo(radius, radius);
} }
} }
explicit RectCornerRadii(Float radiusX, Float radiusY) { explicit RectCornerRadii(Float radiusX, Float radiusY) {
for (int i = 0; i < RectCorner::Count; i++) { NS_FOR_CSS_FULL_CORNERS(i) {
radii[i].SizeTo(radiusX, radiusY); radii[i].SizeTo(radiusX, radiusY);
} }
} }
RectCornerRadii(Float tl, Float tr, Float br, Float bl) { RectCornerRadii(Float tl, Float tr, Float br, Float bl) {
radii[RectCorner::TopLeft].SizeTo(tl, tl); radii[eCornerTopLeft].SizeTo(tl, tl);
radii[RectCorner::TopRight].SizeTo(tr, tr); radii[eCornerTopRight].SizeTo(tr, tr);
radii[RectCorner::BottomRight].SizeTo(br, br); radii[eCornerBottomRight].SizeTo(br, br);
radii[RectCorner::BottomLeft].SizeTo(bl, bl); radii[eCornerBottomLeft].SizeTo(bl, bl);
} }
RectCornerRadii(const Size& tl, const Size& tr, RectCornerRadii(const Size& tl, const Size& tr,
const Size& br, const Size& bl) { const Size& br, const Size& bl) {
radii[RectCorner::TopLeft] = tl; radii[eCornerTopLeft] = tl;
radii[RectCorner::TopRight] = tr; radii[eCornerTopRight] = tr;
radii[RectCorner::BottomRight] = br; radii[eCornerBottomRight] = br;
radii[RectCorner::BottomLeft] = bl; radii[eCornerBottomLeft] = bl;
} }
const Size& operator[](size_t aCorner) const { const Size& operator[](size_t aCorner) const {
@ -218,38 +218,35 @@ struct RectCornerRadii {
} }
bool operator==(const RectCornerRadii& aOther) const { bool operator==(const RectCornerRadii& aOther) const {
for (size_t i = 0; i < RectCorner::Count; i++) { return TopLeft() == aOther.TopLeft() &&
if (radii[i] != aOther.radii[i]) return false; TopRight() == aOther.TopRight() &&
} BottomRight() == aOther.BottomRight() &&
return true; BottomLeft() == aOther.BottomLeft();
} }
bool AreRadiiSame() const { bool AreRadiiSame() const {
for (size_t i = 1; i < RectCorner::Count; i++) { return TopLeft() == TopRight() &&
if (radii[i] != radii[0]) { TopLeft() == BottomRight() &&
return false; TopLeft() == BottomLeft();
}
}
return true;
} }
void Scale(Float aXScale, Float aYScale) { void Scale(Float aXScale, Float aYScale) {
for (int i = 0; i < RectCorner::Count; i++) { NS_FOR_CSS_FULL_CORNERS(i) {
radii[i].Scale(aXScale, aYScale); radii[i].Scale(aXScale, aYScale);
} }
} }
const Size TopLeft() const { return radii[RectCorner::TopLeft]; } const Size TopLeft() const { return radii[eCornerTopLeft]; }
Size& TopLeft() { return radii[RectCorner::TopLeft]; } Size& TopLeft() { return radii[eCornerTopLeft]; }
const Size TopRight() const { return radii[RectCorner::TopRight]; } const Size TopRight() const { return radii[eCornerTopRight]; }
Size& TopRight() { return radii[RectCorner::TopRight]; } Size& TopRight() { return radii[eCornerTopRight]; }
const Size BottomRight() const { return radii[RectCorner::BottomRight]; } const Size BottomRight() const { return radii[eCornerBottomRight]; }
Size& BottomRight() { return radii[RectCorner::BottomRight]; } Size& BottomRight() { return radii[eCornerBottomRight]; }
const Size BottomLeft() const { return radii[RectCorner::BottomLeft]; } const Size BottomLeft() const { return radii[eCornerBottomLeft]; }
Size& BottomLeft() { return radii[RectCorner::BottomLeft]; } Size& BottomLeft() { return radii[eCornerBottomLeft]; }
}; };
/** /**

View file

@ -359,21 +359,6 @@ typedef mozilla::gfx::SurfaceFormat gfxImageFormat;
namespace mozilla { namespace mozilla {
// We can't use MOZ_BEGIN_ENUM_CLASS here because that prevents the enum
// values from being used for indexing. Wrapping the enum in a struct does at
// least gives us name scoping.
struct RectCorner {
enum {
// This order is important since Rect::AtCorner, AppendRoundedRectToPath
// and other code depends on it!
TopLeft = 0,
TopRight = 1,
BottomRight = 2,
BottomLeft = 3,
Count = 4
};
};
// Side constants for use in various places. // Side constants for use in various places.
enum Side { eSideTop, eSideRight, eSideBottom, eSideLeft }; enum Side { eSideTop, eSideRight, eSideBottom, eSideLeft };
@ -414,6 +399,11 @@ enum Corner {
eCornerBottomLeft = 3 eCornerBottomLeft = 3
}; };
// RectCornerRadii::radii depends on this value. It is not being added to
// Corner because we want to lift the responsibility to handle it in the
// switch-case.
constexpr int eCornerCount = 4;
// Creates a for loop that walks over the four mozilla::Corner values. This // Creates a for loop that walks over the four mozilla::Corner values. This
// implementation uses the same technique as NS_FOR_CSS_SIDES. // implementation uses the same technique as NS_FOR_CSS_SIDES.
#define NS_FOR_CSS_FULL_CORNERS(var_) \ #define NS_FOR_CSS_FULL_CORNERS(var_) \

View file

@ -435,7 +435,7 @@ ComputeMinSizeForShadowShape(const RectCornerRadii* aCornerRadii,
Size cornerSize(0, 0); Size cornerSize(0, 0);
if (aCornerRadii) { if (aCornerRadii) {
const RectCornerRadii& corners = *aCornerRadii; const RectCornerRadii& corners = *aCornerRadii;
for (size_t i = 0; i < RectCorner::Count; i++) { NS_FOR_CSS_FULL_CORNERS(i) {
cornerSize.width = std::max(cornerSize.width, corners[i].width); cornerSize.width = std::max(cornerSize.width, corners[i].width);
cornerSize.height = std::max(cornerSize.height, corners[i].height); cornerSize.height = std::max(cornerSize.height, corners[i].height);
} }
@ -1169,7 +1169,7 @@ static void GetBlurMargins(const RectCornerRadii* aInnerClipRadii,
Size cornerSize(0, 0); Size cornerSize(0, 0);
if (aInnerClipRadii) { if (aInnerClipRadii) {
const RectCornerRadii& corners = *aInnerClipRadii; const RectCornerRadii& corners = *aInnerClipRadii;
for (size_t i = 0; i < RectCorner::Count; i++) { NS_FOR_CSS_FULL_CORNERS(i) {
cornerSize.width = std::max(cornerSize.width, corners[i].width); cornerSize.width = std::max(cornerSize.width, corners[i].width);
cornerSize.height = std::max(cornerSize.height, corners[i].height); cornerSize.height = std::max(cornerSize.height, corners[i].height);
} }