Title: [108079] trunk/Source/WebCore
Revision
108079
Author
[email protected]
Date
2012-02-17 08:40:42 -0800 (Fri, 17 Feb 2012)

Log Message

Avoid using a transparency layer for rgba() border drawing when possible
https://bugs.webkit.org/show_bug.cgi?id=63176

Reviewed by Dan Bernstein.

The non-radiused border drawing code would use a transparency layer
when drawing any one or more borders with alpha colors. However,
we only need to use a transparency layer when there is a corner
join between the borders being rendered with any one color,
so add a utility function includesAdjacentEdges() that can tell us
that, and use it to avoid making extraneous transparency layers.

Optimization only, no new tests.

* rendering/RenderBoxModelObject.cpp:
(WebCore::includesAdjacentEdges):
(WebCore):
(WebCore::RenderBoxModelObject::paintTranslucentBorderSides):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (108078 => 108079)


--- trunk/Source/WebCore/ChangeLog	2012-02-17 16:39:08 UTC (rev 108078)
+++ trunk/Source/WebCore/ChangeLog	2012-02-17 16:40:42 UTC (rev 108079)
@@ -1,3 +1,24 @@
+2012-02-17  Simon Fraser  <[email protected]>
+
+        Avoid using a transparency layer for rgba() border drawing when possible
+        https://bugs.webkit.org/show_bug.cgi?id=63176
+
+        Reviewed by Dan Bernstein.
+        
+        The non-radiused border drawing code would use a transparency layer
+        when drawing any one or more borders with alpha colors. However,
+        we only need to use a transparency layer when there is a corner
+        join between the borders being rendered with any one color,
+        so add a utility function includesAdjacentEdges() that can tell us
+        that, and use it to avoid making extraneous transparency layers.
+
+        Optimization only, no new tests.
+
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::includesAdjacentEdges):
+        (WebCore):
+        (WebCore::RenderBoxModelObject::paintTranslucentBorderSides):
+
 2012-02-17  Pavel Feldman  <[email protected]>
 
         Not reviewed: Qt minimal build fix.

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (108078 => 108079)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2012-02-17 16:39:08 UTC (rev 108078)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2012-02-17 16:40:42 UTC (rev 108079)
@@ -1429,6 +1429,14 @@
     return flags & edgeFlagForSide(side);
 }
 
+static inline bool includesAdjacentEdges(BorderEdgeFlags flags)
+{
+    return (flags & (TopBorderEdge | RightBorderEdge)) == (TopBorderEdge | RightBorderEdge)
+        || (flags & (RightBorderEdge | BottomBorderEdge)) == (RightBorderEdge | BottomBorderEdge)
+        || (flags & (BottomBorderEdge | LeftBorderEdge)) == (BottomBorderEdge | LeftBorderEdge)
+        || (flags & (LeftBorderEdge | TopBorderEdge)) == (LeftBorderEdge | TopBorderEdge);
+}
+
 inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secondEdge)
 {
     return firstEdge.color == secondEdge.color;
@@ -1682,7 +1690,7 @@
                 commonColorEdgeSet |= edgeFlagForSide(currSide);
         }
 
-        bool useTransparencyLayer = commonColor.hasAlpha();
+        bool useTransparencyLayer = includesAdjacentEdges(commonColorEdgeSet) && commonColor.hasAlpha();
         if (useTransparencyLayer) {
             graphicsContext->beginTransparencyLayer(static_cast<float>(commonColor.alpha()) / 255);
             commonColor = Color(commonColor.red(), commonColor.green(), commonColor.blue());
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to