Index: third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp |
diff --git a/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp b/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp |
index 6d4974f7e7d3b77e905710c07a4bfaa64ec45241..65b3ba0074322764300cefed603f0774a87fffce 100644 |
--- a/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp |
+++ b/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp |
@@ -37,7 +37,8 @@ inline bool includesEdge(BorderEdgeFlags flags, BoxSide side) { |
} |
inline bool includesAdjacentEdges(BorderEdgeFlags flags) { |
- // The set includes adjacent edges iff it contains at least one horizontal and one vertical edge. |
+ // The set includes adjacent edges iff it contains at least one horizontal and |
+ // one vertical edge. |
return (flags & (TopBorderEdge | BottomBorderEdge)) && |
(flags & (LeftBorderEdge | RightBorderEdge)); |
} |
@@ -61,8 +62,9 @@ inline bool borderStyleIsDottedOrDashed(EBorderStyle style) { |
return style == BorderStyleDotted || style == BorderStyleDashed; |
} |
-// BorderStyleOutset darkens the bottom and right (and maybe lightens the top and left) |
-// BorderStyleInset darkens the top and left (and maybe lightens the bottom and right) |
+// BorderStyleOutset darkens the bottom and right (and maybe lightens the top |
+// and left) BorderStyleInset darkens the top and left (and maybe lightens the |
+// bottom and right). |
inline bool borderStyleHasUnmatchedColorsAtCorner(EBorderStyle style, |
BoxSide side, |
BoxSide adjacentSide) { |
@@ -102,11 +104,13 @@ inline bool borderWillArcInnerEdge(const FloatSize& firstRadius, |
inline bool willOverdraw(BoxSide side, |
EBorderStyle style, |
BorderEdgeFlags completedEdges) { |
- // If we're done with this side, it will obviously not overdraw any portion of the current edge. |
+ // If we're done with this side, it will obviously not overdraw any portion of |
+ // the current edge. |
if (includesEdge(completedEdges, side)) |
return false; |
- // The side is still to be drawn. It overdraws the current edge iff it has a solid fill style. |
+ // The side is still to be drawn. It overdraws the current edge iff it has a |
+ // solid fill style. |
return borderStyleFillsBorderArea(style); |
} |
@@ -177,9 +181,10 @@ FloatRect calculateSideRectIncludingInner(const FloatRoundedRect& outerBorder, |
FloatRoundedRect calculateAdjustedInnerBorder( |
const FloatRoundedRect& innerBorder, |
BoxSide side) { |
- // Expand the inner border as necessary to make it a rounded rect (i.e. radii contained within each edge). |
- // This function relies on the fact we only get radii not contained within each edge if one of the radii |
- // for an edge is zero, so we can shift the arc towards the zero radius corner. |
+ // Expand the inner border as necessary to make it a rounded rect (i.e. radii |
+ // contained within each edge). This function relies on the fact we only get |
+ // radii not contained within each edge if one of the radii for an edge is |
+ // zero, so we can shift the arc towards the zero radius corner. |
FloatRoundedRect::Radii newRadii = innerBorder.getRadii(); |
FloatRect newRect = innerBorder.rect(); |
@@ -190,8 +195,8 @@ FloatRoundedRect calculateAdjustedInnerBorder( |
case BSTop: |
overshoot = newRadii.topLeft().width() + newRadii.topRight().width() - |
newRect.width(); |
- // FIXME: once we start pixel-snapping rounded rects after this point, the overshoot concept |
- // should disappear. |
+ // FIXME: once we start pixel-snapping rounded rects after this point, the |
+ // overshoot concept should disappear. |
if (overshoot > 0.1) { |
newRect.setWidth(newRect.width() + overshoot); |
if (!newRadii.topLeft().width()) |
@@ -296,9 +301,10 @@ void drawBleedAdjustedDRRect(GraphicsContext& context, |
Color color) { |
switch (bleedAvoidance) { |
case BackgroundBleedClipLayer: { |
- // BackgroundBleedClipLayer clips the outer rrect for the whole layer. Based on this, |
- // we can avoid background bleeding by filling the *outside* of inner rrect, all the |
- // way to the layer bounds (enclosing int rect for the clip, in device space). |
+ // BackgroundBleedClipLayer clips the outer rrect for the whole layer. |
+ // Based on this, we can avoid background bleeding by filling the |
+ // *outside* of inner rrect, all the way to the layer bounds (enclosing |
+ // int rect for the clip, in device space). |
ASSERT(outer.isRounded()); |
SkPath path; |
@@ -350,8 +356,9 @@ static_assert(BSRight == 1, "unexpected BoxSide value"); |
static_assert(BSBottom == 2, "unexpected BoxSide value"); |
static_assert(BSLeft == 3, "unexpected BoxSide value"); |
-// Style-based paint order: non-solid edges (dashed/dotted/double) are painted before |
-// solid edges (inset/outset/groove/ridge/solid) to maximize overdraw opportunities. |
+// Style-based paint order: non-solid edges (dashed/dotted/double) are painted |
+// before solid edges (inset/outset/groove/ridge/solid) to maximize overdraw |
+// opportunities. |
const unsigned kStylePriority[] = { |
0 /* BorderStyleNone */, 0 /* BorderStyleHidden */, |
2 /* BorderStyleInset */, 2 /* BorderStyleGroove */, |
@@ -360,8 +367,8 @@ const unsigned kStylePriority[] = { |
3 /* BorderStyleSolid */, 1 /* BorderStyleDouble */ |
}; |
-// Given the same style, prefer drawing in non-adjacent order to minimize the number of sides |
-// which require miters. |
+// Given the same style, prefer drawing in non-adjacent order to minimize the |
+// number of sides which require miters. |
const unsigned kSidePriority[] = { |
0, /* BSTop */ |
2, /* BSRight */ |
@@ -369,8 +376,8 @@ const unsigned kSidePriority[] = { |
3, /* BSLeft */ |
}; |
-// Edges sharing the same opacity. Stores both a side list and an edge bitfield to support |
-// constant time iteration + membership tests. |
+// Edges sharing the same opacity. Stores both a side list and an edge bitfield |
+// to support constant time iteration + membership tests. |
struct OpacityGroup { |
OpacityGroup(unsigned alpha) : edgeFlags(0), alpha(alpha) {} |
@@ -408,7 +415,8 @@ struct BoxBorderPainter::ComplexBorderInfo { |
} |
ASSERT(!sortedSides.isEmpty()); |
- // Then sort them in paint order, based on three (prioritized) criteria: alpha, style, side. |
+ // Then sort them in paint order, based on three (prioritized) criteria: |
+ // alpha, style, side. |
std::sort( |
sortedSides.begin(), sortedSides.end(), |
[&borderPainter](BoxSide a, BoxSide b) -> bool { |
@@ -523,8 +531,8 @@ bool BoxBorderPainter::paintBorderFastPath(GraphicsContext& context, |
return true; |
} |
- // This is faster than the normal complex border path only if it avoids creating transparency |
- // layers (when the border is translucent). |
+ // This is faster than the normal complex border path only if it avoids |
+ // creating transparency layers (when the border is translucent). |
if (firstEdge().borderStyle() == BorderStyleSolid && !m_outer.isRounded() && |
m_hasAlpha) { |
ASSERT(m_visibleEdgeSet != AllBorderEdges); |
@@ -648,7 +656,8 @@ void BoxBorderPainter::paintBorder(const PaintInfo& info, |
bool clipToOuterBorder = m_outer.isRounded(); |
GraphicsContextStateSaver stateSaver(graphicsContext, clipToOuterBorder); |
if (clipToOuterBorder) { |
- // For BackgroundBleedClip{Only,Layer}, the outer rrect clip is already applied. |
+ // For BackgroundBleedClip{Only,Layer}, the outer rrect clip is already |
+ // applied. |
if (!bleedAvoidanceIsClipping(m_bleedAvoidance)) |
graphicsContext.clipRoundedRect(m_outer); |
@@ -660,20 +669,22 @@ void BoxBorderPainter::paintBorder(const PaintInfo& info, |
paintOpacityGroup(graphicsContext, borderInfo, 0, 1); |
} |
-// In order to maximize the use of overdraw as a corner seam avoidance technique, we draw |
-// translucent border sides using the following algorithm: |
+// In order to maximize the use of overdraw as a corner seam avoidance |
+// technique, we draw translucent border sides using the following algorithm: |
// |
-// 1) cluster sides sharing the same opacity into "opacity groups" [ComplexBorderInfo] |
+// 1) cluster sides sharing the same opacity into "opacity groups" |
+// [ComplexBorderInfo] |
// 2) sort groups in increasing opacity order [ComplexBorderInfo] |
-// 3) reverse-iterate over groups (decreasing opacity order), pushing nested transparency |
-// layers with adjusted/relative opacity [paintOpacityGroup] |
-// 4) iterate over groups (increasing opacity order), painting actual group contents and |
-// then ending their corresponding transparency layer [paintOpacityGroup] |
+// 3) reverse-iterate over groups (decreasing opacity order), pushing nested |
+// transparency layers with adjusted/relative opacity [paintOpacityGroup] |
+// 4) iterate over groups (increasing opacity order), painting actual group |
+// contents and then ending their corresponding transparency layer |
+// [paintOpacityGroup] |
// |
-// Layers are created in decreasing opacity order (top -> bottom), while actual border sides are |
-// drawn in increasing opacity order (bottom -> top). At each level, opacity is adjusted to acount |
-// for accumulated/ancestor layer alpha. Because opacity is applied via layers, the actual draw |
-// paint is opaque. |
+// Layers are created in decreasing opacity order (top -> bottom), while actual |
+// border sides are drawn in increasing opacity order (bottom -> top). At each |
+// level, opacity is adjusted to acount for accumulated/ancestor layer alpha. |
+// Because opacity is applied via layers, the actual draw paint is opaque. |
// |
// As an example, let's consider a border with the following sides/opacities: |
// |
@@ -690,17 +701,17 @@ void BoxBorderPainter::paintBorder(const PaintInfo& info, |
// |
// Applying the algorithm yields the following paint sequence: |
// |
-// // no layer needed for group 0 (alpha == 1) |
-// beginLayer(0.5) // layer for group 1 |
-// beginLayer(0.5) // layer for group 2 (effective opacity: 0.5 * 0.5 == 0.25) |
-// paintSides(right, left) // paint group 2 |
+// // no layer needed for group 0 (alpha = 1) |
+// beginLayer(0.5) // layer for group 1 |
+// beginLayer(0.5) // layer for group 2 (alpha: 0.5 * 0.5 = 0.25) |
+// paintSides(right, left) // paint group 2 |
// endLayer |
-// paintSides(bottom) // paint group 1 |
+// paintSides(bottom) // paint group 1 |
// endLayer |
-// paintSides(top) // paint group 0 |
+// paintSides(top) // paint group 0 |
// |
-// Note that we're always drawing using opaque paints on top of less-opaque content - hence |
-// we can use overdraw to mask portions of the previous sides. |
+// Note that we're always drawing using opaque paints on top of less-opaque |
+// content - hence we can use overdraw to mask portions of the previous sides. |
// |
BorderEdgeFlags BoxBorderPainter::paintOpacityGroup( |
GraphicsContext& context, |
@@ -715,18 +726,19 @@ BorderEdgeFlags BoxBorderPainter::paintOpacityGroup( |
if (index >= opacityGroupCount) |
return ~m_visibleEdgeSet; |
- // Groups are sorted in increasing opacity order, but we need to create layers in |
- // decreasing opacity order - hence the reverse iteration. |
+ // Groups are sorted in increasing opacity order, but we need to create layers |
+ // in decreasing opacity order - hence the reverse iteration. |
const OpacityGroup& group = |
borderInfo.opacityGroups[opacityGroupCount - index - 1]; |
- // Adjust this group's paint opacity to account for ancestor transparency layers |
- // (needed in case we avoid creating a layer below). |
+ // Adjust this group's paint opacity to account for ancestor transparency |
+ // layers (needed in case we avoid creating a layer below). |
unsigned paintAlpha = group.alpha / effectiveOpacity; |
ASSERT(paintAlpha <= 255); |
- // For the last (bottom) group, we can skip the layer even in the presence of opacity iff |
- // it contains no adjecent edges (no in-group overdraw possibility). |
+ // For the last (bottom) group, we can skip the layer even in the presence of |
+ // opacity iff it contains no adjecent edges (no in-group overdraw |
+ // possibility). |
bool needsLayer = |
group.alpha != 255 && (includesAdjacentEdges(group.edgeFlags) || |
(index + 1 < borderInfo.opacityGroups.size())); |
@@ -738,7 +750,8 @@ BorderEdgeFlags BoxBorderPainter::paintOpacityGroup( |
context.beginLayer(groupOpacity / effectiveOpacity); |
effectiveOpacity = groupOpacity; |
- // Group opacity is applied via a layer => we draw the members using opaque paint. |
+ // Group opacity is applied via a layer => we draw the members using opaque |
+ // paint. |
paintAlpha = 255; |
} |
@@ -749,7 +762,8 @@ BorderEdgeFlags BoxBorderPainter::paintOpacityGroup( |
BorderEdgeFlags completedEdges = |
paintOpacityGroup(context, borderInfo, index + 1, effectiveOpacity); |
- // Paint the actual group edges with an alpha adjusted to account for ancenstor layers opacity. |
+ // Paint the actual group edges with an alpha adjusted to account for |
+ // ancenstor layers opacity. |
for (BoxSide side : group.sides) { |
paintSide(context, borderInfo, side, paintAlpha, completedEdges); |
completedEdges |= edgeFlagForSide(side); |
@@ -774,7 +788,8 @@ void BoxBorderPainter::paintSide(GraphicsContext& context, |
FloatRect sideRect = m_outer.rect(); |
const Path* path = nullptr; |
- // TODO(fmalita): find a way to consolidate these without sacrificing readability. |
+ // TODO(fmalita): find a way to consolidate these without sacrificing |
+ // readability. |
switch (side) { |
case BSTop: { |
bool usePath = m_isRounded && |
@@ -852,17 +867,19 @@ BoxBorderPainter::MiterType BoxBorderPainter::computeMiter( |
if (willOverdraw(adjacentSide, adjacentEdge.borderStyle(), completedEdges)) |
return NoMiter; |
- // Color transitions require miters. Use miters compatible with the AA drawing mode to avoid |
- // introducing extra clips. |
+ // Color transitions require miters. Use miters compatible with the AA drawing |
+ // mode to avoid introducing extra clips. |
if (!colorsMatchAtCorner(side, adjacentSide, m_edges)) |
return antialias ? SoftMiter : HardMiter; |
- // Non-anti-aliased miters ensure correct same-color seaming when required by style. |
+ // Non-anti-aliased miters ensure correct same-color seaming when required by |
+ // style. |
if (borderStylesRequireMiter(side, adjacentSide, m_edges[side].borderStyle(), |
adjacentEdge.borderStyle())) |
return HardMiter; |
- // Overdraw the adjacent edge when the colors match and we have no style restrictions. |
+ // Overdraw the adjacent edge when the colors match and we have no style |
+ // restrictions. |
return NoMiter; |
} |
@@ -870,7 +887,8 @@ bool BoxBorderPainter::mitersRequireClipping(MiterType miter1, |
MiterType miter2, |
EBorderStyle style, |
bool antialias) { |
- // Clipping is required if any of the present miters doesn't match the current AA mode. |
+ // Clipping is required if any of the present miters doesn't match the current |
+ // AA mode. |
bool shouldClip = antialias ? miter1 == HardMiter || miter2 == HardMiter |
: miter1 == SoftMiter || miter2 == SoftMiter; |
@@ -968,11 +986,12 @@ void BoxBorderPainter::drawBoxSideFromPath(GraphicsContext& graphicsContext, |
graphicsContext.setStrokeStyle( |
borderStyle == BorderStyleDashed ? DashedStroke : DottedStroke); |
- // If the number of dashes that fit in the path is odd and non-integral then we |
- // will have an awkwardly-sized dash at the end of the path. To try to avoid that |
- // here, we simply make the whitespace dashes ever so slightly bigger. |
- // FIXME: This could be even better if we tried to manipulate the dash offset |
- // and possibly the gapLength to get the corners dash-symmetrical. |
+ // If the number of dashes that fit in the path is odd and non-integral |
+ // then we will have an awkwardly-sized dash at the end of the path. To |
+ // try to avoid that here, we simply make the whitespace dashes ever so |
+ // slightly bigger. |
+ // FIXME: This could be even better if we tried to manipulate the dash |
+ // offset and possibly the gapLength to get the corners dash-symmetrical. |
float dashLength = |
thickness * ((borderStyle == BorderStyleDashed) ? 3.0f : 1.0f); |
float gapLength = dashLength; |
@@ -995,7 +1014,8 @@ void BoxBorderPainter::drawBoxSideFromPath(GraphicsContext& graphicsContext, |
// FIXME: stroking the border path causes issues with tight corners: |
// https://bugs.webkit.org/show_bug.cgi?id=58711 |
- // Also, to get the best appearance we should stroke a path between the two borders. |
+ // Also, to get the best appearance we should stroke a path between the |
+ // two borders. |
graphicsContext.strokePath(borderPath); |
return; |
} |
@@ -1109,8 +1129,8 @@ void BoxBorderPainter::clipBorderSidePolygon(GraphicsContext& graphicsContext, |
const LayoutRect outerRect(m_outer.rect()); |
const LayoutRect innerRect(m_inner.rect()); |
- // For each side, create a quad that encompasses all parts of that side that may draw, |
- // including areas inside the innerBorder. |
+ // For each side, create a quad that encompasses all parts of that side that |
+ // may draw, including areas inside the innerBorder. |
// |
// 0----------------3 |
// 0 \ / 0 |