Bug 1389010, part 6 - Call AreBorderSideFinalStylesSame in nsCSSBorderRenderer's constructor and store the result as a member. r=dholbert
MozReview-Commit-ID: 3OBwSIG4OzP
--- a/layout/painting/nsCSSRenderingBorders.cpp
+++ b/layout/painting/nsCSSRenderingBorders.cpp
@@ -205,16 +205,17 @@ nsCSSBorderRenderer::nsCSSBorderRenderer
mBorderStyles[2] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[2] : 0,
mBorderStyles[3] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[3] : 0));
ComputeBorderCornerDimensions(mBorderWidths,
mBorderRadii, &mBorderCornerDimensions);
mOneUnitBorder = CheckFourFloatsEqual(mBorderWidths, 1.0);
mNoBorderRadius = AllCornersZeroSize(mBorderRadii);
+ mAllBordersSameStyle = AreBorderSideFinalStylesSame(eSideBitsAll);
mAvoidStroke = false;
}
/* static */ void
nsCSSBorderRenderer::ComputeInnerRadii(const RectCornerRadii& aRadii,
const Float* aBorderSizes,
RectCornerRadii* aInnerRadiiRet)
{
@@ -3194,19 +3195,17 @@ nsCSSBorderRenderer::DrawRectangularComp
}
}
void
nsCSSBorderRenderer::DrawBorders()
{
bool forceSeparateCorners = false;
- bool allBordersSameStyle = AreBorderSideFinalStylesSame(eSideBitsAll);
-
- if (allBordersSameStyle &&
+ if (mAllBordersSameStyle &&
((mCompositeColors[0] == nullptr &&
(mBorderStyles[0] == NS_STYLE_BORDER_STYLE_NONE ||
mBorderStyles[0] == NS_STYLE_BORDER_STYLE_HIDDEN ||
mBorderColors[0] == NS_RGBA(0,0,0,0))) ||
(mCompositeColors[0] &&
(mCompositeColors[0]->mColor == NS_RGBA(0,0,0,0) &&
!mCompositeColors[0]->mNext))))
{
@@ -3255,31 +3254,31 @@ nsCSSBorderRenderer::DrawBorders()
// Initial values only used when the border colors/widths are all the same:
ColorPattern color(ToDeviceColor(mBorderColors[eSideTop]));
StrokeOptions strokeOptions(mBorderWidths[eSideTop]); // stroke width
// First there's a couple of 'special cases' that have specifically optimized
// drawing paths, when none of these can be used we move on to the generalized
// border drawing code.
- if (allBordersSameStyle &&
+ if (mAllBordersSameStyle &&
mCompositeColors[0] == nullptr &&
allBordersSameWidth &&
mBorderStyles[0] == NS_STYLE_BORDER_STYLE_SOLID &&
mNoBorderRadius &&
!mAvoidStroke)
{
// Very simple case.
Rect rect = mOuterRect;
rect.Deflate(mBorderWidths[0] / 2.0);
mDrawTarget->StrokeRect(rect, color, strokeOptions);
return;
}
- if (allBordersSameStyle &&
+ if (mAllBordersSameStyle &&
mCompositeColors[0] == nullptr &&
mBorderStyles[0] == NS_STYLE_BORDER_STYLE_SOLID &&
!mAvoidStroke &&
!mNoBorderRadius)
{
// Relatively simple case.
gfxRect outerRect = ThebesRect(mOuterRect);
RoundedRect borderInnerRect(outerRect, mBorderRadii);
@@ -3336,17 +3335,17 @@ nsCSSBorderRenderer::DrawBorders()
// Easy enough to deal with.
DrawRectangularCompositeColors();
return;
}
// If we have composite colors -and- border radius,
// then use separate corners so we get OP_ADD for the corners.
// Otherwise, we'll get artifacts as we draw stacked 1px-wide curves.
- if (allBordersSameStyle && mCompositeColors[0] != nullptr && !mNoBorderRadius)
+ if (mAllBordersSameStyle && mCompositeColors[0] != nullptr && !mNoBorderRadius)
forceSeparateCorners = true;
PrintAsString(" mOuterRect: "); PrintAsString(mOuterRect); PrintAsStringNewline();
PrintAsString(" mInnerRect: "); PrintAsString(mInnerRect); PrintAsStringNewline();
PrintAsFormatString(" mBorderColors: 0x%08x 0x%08x 0x%08x 0x%08x\n", mBorderColors[0], mBorderColors[1], mBorderColors[2], mBorderColors[3]);
// if conditioning the outside rect failed, then bail -- the outside
// rect is supposed to enclose the entire border
@@ -3366,24 +3365,24 @@ nsCSSBorderRenderer::DrawBorders()
NS_FOR_CSS_SIDES(i) {
uint8_t style = mBorderStyles[i];
if (style == NS_STYLE_BORDER_STYLE_DASHED ||
style == NS_STYLE_BORDER_STYLE_DOTTED)
{
// pretend that all borders aren't the same; we need to draw
// things separately for dashed/dotting
- allBordersSameStyle = false;
+ mAllBordersSameStyle = false;
dashedSides |= (1 << i);
}
}
- PrintAsFormatString(" allBordersSameStyle: %d dashedSides: 0x%02x\n", allBordersSameStyle, dashedSides);
-
- if (allBordersSameStyle && !forceSeparateCorners) {
+ PrintAsFormatString(" mAllBordersSameStyle: %d dashedSides: 0x%02x\n", mAllBordersSameStyle, dashedSides);
+
+ if (mAllBordersSameStyle && !forceSeparateCorners) {
/* Draw everything in one go */
DrawBorderSides(eSideBitsAll);
PrintAsStringNewline("---------------- (1)");
} else {
AUTO_PROFILER_LABEL("nsCSSBorderRenderer::DrawBorders:multipass", GRAPHICS);
/* We have more than one pass to go. Draw the corners separately from the sides. */
--- a/layout/painting/nsCSSRenderingBorders.h
+++ b/layout/painting/nsCSSRenderingBorders.h
@@ -151,16 +151,17 @@ private:
// the lists of colors for '-moz-border-top-colors' et. al.
nsBorderColors* mCompositeColors[4];
// the background color
nscolor mBackgroundColor;
// calculated values
+ bool mAllBordersSameStyle;
bool mOneUnitBorder;
bool mNoBorderRadius;
bool mAvoidStroke;
// For all the sides in the bitmask, would they be rendered
// in an identical color and style?
bool AreBorderSideFinalStylesSame(uint8_t aSides);