From 22ea8326d7463b55c7b13261e98c26904dc17afb Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 4 Feb 2020 03:28:47 +0000 Subject: [PATCH] Bug 1610670 - Add AllPhysicalHalfCorners() to support range-based for loops. r=mats This patch is generated via: 1. Manually modify gfx/2d/Types.h 2. Run the following script and clang-format. 3. Add brackets for the for loop in nsCSSRendering.cpp. ``` function rename() { echo "Renaming $1 to $2" rg -l "$1" | xargs sed -i -E -e s/"$1"/"$2"/g } rename "NS_FOR_CSS_HALF_CORNERS\(i\)" "for (const auto i : mozilla::AllPhysicalHalfCorners())" rename "NS_FOR_CSS_HALF_CORNERS\(corner\)" "for (const auto corner : mozilla::AllPhysicalHalfCorners())" ``` Differential Revision: https://phabricator.services.mozilla.com/D61252 --HG-- extra : moz-landing-system : lando --- gfx/2d/Types.h | 20 +++----------------- layout/base/nsLayoutUtils.cpp | 4 ++-- layout/generic/nsFrame.cpp | 14 +++++++++----- layout/painting/DisplayItemClip.h | 2 +- layout/painting/MaskLayerImageCache.h | 8 +++++--- layout/painting/nsCSSRendering.cpp | 5 +++-- layout/painting/nsDisplayList.cpp | 2 +- 7 files changed, 24 insertions(+), 31 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 7d6fb88cf0eb..777784ce2840 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -564,23 +564,9 @@ enum HalfCorner : uint8_t { eCornerBottomLeftY = 7 }; -// Creates a for loop that walks over the eight mozilla::HalfCorner values. -// This implementation uses the same technique as NS_FOR_CSS_SIDES. -#define NS_FOR_CSS_HALF_CORNERS(var_) \ - int32_t MOZ_CONCAT(var_, __LINE__) = mozilla::eCornerTopLeftX; \ - for (mozilla::HalfCorner var_; \ - MOZ_CONCAT(var_, __LINE__) <= mozilla::eCornerBottomLeftY && \ - (static_cast( \ - var_ = mozilla::HalfCorner(MOZ_CONCAT(var_, __LINE__))), \ - true); \ - ++MOZ_CONCAT(var_, __LINE__)) - -static inline HalfCorner operator++(HalfCorner& aHalfCorner) { - MOZ_ASSERT( - aHalfCorner >= eCornerTopLeftX && aHalfCorner <= eCornerBottomLeftY, - "Out of range half corner!"); - aHalfCorner = HalfCorner(aHalfCorner + 1); - return aHalfCorner; +constexpr auto AllPhysicalHalfCorners() { + return mozilla::MakeInclusiveEnumeratedRange(eCornerTopLeftX, + eCornerBottomLeftY); } // The result of these conversion functions are exhaustively checked in diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 2bccee3b7e35..79a325f9b12c 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -7194,7 +7194,7 @@ static bool NonZeroCorner(const LengthPercentage& aLength) { /* static */ bool nsLayoutUtils::HasNonZeroCorner(const BorderRadius& aCorners) { - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { if (NonZeroCorner(aCorners.Get(corner))) return true; } return false; @@ -7239,7 +7239,7 @@ bool nsLayoutUtils::HasNonZeroCornerOnSide(const BorderRadius& aCorners, static_assert(eCornerBottomLeftY / 2 == eCornerBottomLeft, "Check for Non Zero on side"); - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { // corner is a "half corner" value, so dividing by two gives us a // "full corner" value. if (NonZeroCorner(aCorners.Get(corner)) && diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 3084067e8ae7..d9569ad9689f 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1815,7 +1815,7 @@ bool nsIFrame::ComputeBorderRadii(const BorderRadius& aBorderRadius, const nsSize& aBorderArea, Sides aSkipSides, nscoord aRadii[8]) { // Percentages are relative to whichever side they're on. - NS_FOR_CSS_HALF_CORNERS(i) { + for (const auto i : mozilla::AllPhysicalHalfCorners()) { const LengthPercentage& c = aBorderRadius.Get(i); nscoord axis = HalfCornerIsX(i) ? aFrameSize.width : aFrameSize.height; aRadii[i] = std::max(0, c.Resolve(axis)); @@ -1868,7 +1868,9 @@ bool nsIFrame::ComputeBorderRadii(const BorderRadius& aBorderRadius, } } if (ratio < 1.0) { - NS_FOR_CSS_HALF_CORNERS(corner) { aRadii[corner] *= ratio; } + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { + aRadii[corner] *= ratio; + } } return haveRadius; @@ -1916,7 +1918,7 @@ void nsIFrame::OutsetBorderRadii(nscoord aRadii[8], const nsMargin& aOffsets) { } static inline bool RadiiAreDefinitelyZero(const BorderRadius& aBorderRadius) { - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { if (!aBorderRadius.Get(corner).IsDefinitelyZero()) { return false; } @@ -1941,7 +1943,9 @@ bool nsIFrame::GetBorderRadii(const nsSize& aFrameSize, // In an ideal world, we might have a way for the them to tell us an // border radius, but since we don't, we're better off assuming // zero. - NS_FOR_CSS_HALF_CORNERS(corner) { aRadii[corner] = 0; } + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { + aRadii[corner] = 0; + } return false; } @@ -1984,7 +1988,7 @@ bool nsIFrame::GetBoxBorderRadii(nscoord aRadii[8], nsMargin aOffset, } else { InsetBorderRadii(aRadii, aOffset); } - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { if (aRadii[corner]) return true; } return false; diff --git a/layout/painting/DisplayItemClip.h b/layout/painting/DisplayItemClip.h index 6dee3214a2c5..87729f0fb0ff 100644 --- a/layout/painting/DisplayItemClip.h +++ b/layout/painting/DisplayItemClip.h @@ -57,7 +57,7 @@ class DisplayItemClip { return false; } - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { if (mRadii[corner] != aOther.mRadii[corner]) { return false; } diff --git a/layout/painting/MaskLayerImageCache.h b/layout/painting/MaskLayerImageCache.h index 182b923793e6..71c69b8e5c1d 100644 --- a/layout/painting/MaskLayerImageCache.h +++ b/layout/painting/MaskLayerImageCache.h @@ -56,7 +56,7 @@ class MaskLayerImageCache { aPresContext->AppUnitsToGfxUnits(aRRect.mRect.width), aPresContext->AppUnitsToGfxUnits(aRRect.mRect.height)) { MOZ_COUNT_CTOR(PixelRoundedRect); - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { mRadii[corner] = aPresContext->AppUnitsToGfxUnits(aRRect.mRadii[corner]); } @@ -64,7 +64,9 @@ class MaskLayerImageCache { PixelRoundedRect(const PixelRoundedRect& aPRR) : mRect(aPRR.mRect) { MOZ_COUNT_CTOR(PixelRoundedRect); - NS_FOR_CSS_HALF_CORNERS(corner) { mRadii[corner] = aPRR.mRadii[corner]; } + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { + mRadii[corner] = aPRR.mRadii[corner]; + } } ~PixelRoundedRect() { MOZ_COUNT_DTOR(PixelRoundedRect); } @@ -89,7 +91,7 @@ class MaskLayerImageCache { return false; } - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { if (mRadii[corner] != aOther.mRadii[corner]) { return false; } diff --git a/layout/painting/nsCSSRendering.cpp b/layout/painting/nsCSSRendering.cpp index 8b4efb836723..09854f0c33ee 100644 --- a/layout/painting/nsCSSRendering.cpp +++ b/layout/painting/nsCSSRendering.cpp @@ -607,8 +607,9 @@ void nsCSSRendering::ComputePixelRadii(const nscoord* aAppUnitsRadii, nscoord aAppUnitsPerPixel, RectCornerRadii* oBorderRadii) { Float radii[8]; - NS_FOR_CSS_HALF_CORNERS(corner) - radii[corner] = Float(aAppUnitsRadii[corner]) / aAppUnitsPerPixel; + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { + radii[corner] = Float(aAppUnitsRadii[corner]) / aAppUnitsPerPixel; + } (*oBorderRadii)[C_TL] = Size(radii[eCornerTopLeftX], radii[eCornerTopLeftY]); (*oBorderRadii)[C_TR] = diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp index 401a688cc604..1b2621a05d3f 100644 --- a/layout/painting/nsDisplayList.cpp +++ b/layout/painting/nsDisplayList.cpp @@ -10013,7 +10013,7 @@ static Maybe CreateSimpleClipRegion( radii * 2); nscoord ellipseRadii[8]; - NS_FOR_CSS_HALF_CORNERS(corner) { + for (const auto corner : mozilla::AllPhysicalHalfCorners()) { ellipseRadii[corner] = HalfCornerIsX(corner) ? radii.width : radii.height; }