Title: [139238] trunk
Revision
139238
Author
[email protected]
Date
2013-01-09 14:01:09 -0800 (Wed, 09 Jan 2013)

Log Message

[Skia] Implement GraphicsContext::addRoundedRectClip() using SkCanvas::clipRRect()
https://bugs.webkit.org/show_bug.cgi?id=106461

Reviewed by Stephen White.

Source/WebCore:

This patch adds a Skia-specific version of GraphicsContext::addRoundedRectClip() to take
advantage of the SkCanvas::clipRRect() primitive.

As a minor cleanup, the anonymous namespace in GraphicsContextSkia.cpp is extended to cover
all the local helper functions.

No new tests: coverage provided by existing tests.

* platform/graphics/GraphicsContext.cpp:
(WebCore):
* platform/graphics/skia/GraphicsContextSkia.cpp:
(WebCore::GraphicsContext::addRoundedRectClip):
(WebCore):
(WebCore::GraphicsContext::fillRoundedRect):
* platform/graphics/skia/PlatformContextSkia.h:
(WebCore::PlatformContextSkia::clipRRect):
(WebCore):

LayoutTests:

* platform/chromium-linux/fast/backgrounds/border-radius-split-background-image-expected.png:
* platform/chromium-linux/fast/borders/border-radius-complex-inner-expected.png:
* platform/chromium-linux/fast/borders/border-radius-inset-outset-expected.png:
* platform/chromium-linux/fast/borders/border-radius-wide-border-05-expected.png:
* platform/chromium-linux/fast/borders/border-styles-split-expected.png:
* platform/chromium-linux/fast/borders/borderRadiusArcs01-expected.png:
* platform/chromium-linux/fast/borders/mixed-border-styles-radius-expected.png:
* platform/chromium-linux/fast/css/background-clip-radius-values-expected.png:
* platform/chromium-linux/fast/replaced/border-radius-clip-content-edge-expected.png:
* platform/chromium-linux/fast/writing-mode/border-styles-vertical-lr-expected.png:
* platform/chromium-linux/fast/writing-mode/border-styles-vertical-rl-expected.png:
* platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-001-expected.png:
* platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-002-expected.png:
* platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-left-radius-values-004-expected.png:
* platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-right-radius-values-004-expected.png:
* platform/chromium-linux/svg/custom/svg-fonts-in-html-expected.png:
* platform/chromium/TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (139237 => 139238)


--- trunk/LayoutTests/ChangeLog	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/LayoutTests/ChangeLog	2013-01-09 22:01:09 UTC (rev 139238)
@@ -1,3 +1,28 @@
+2013-01-09  Florin Malita  <[email protected]>
+
+        [Skia] Implement GraphicsContext::addRoundedRectClip() using SkCanvas::clipRRect()
+        https://bugs.webkit.org/show_bug.cgi?id=106461
+
+        Reviewed by Stephen White.
+
+        * platform/chromium-linux/fast/backgrounds/border-radius-split-background-image-expected.png:
+        * platform/chromium-linux/fast/borders/border-radius-complex-inner-expected.png:
+        * platform/chromium-linux/fast/borders/border-radius-inset-outset-expected.png:
+        * platform/chromium-linux/fast/borders/border-radius-wide-border-05-expected.png:
+        * platform/chromium-linux/fast/borders/border-styles-split-expected.png:
+        * platform/chromium-linux/fast/borders/borderRadiusArcs01-expected.png:
+        * platform/chromium-linux/fast/borders/mixed-border-styles-radius-expected.png:
+        * platform/chromium-linux/fast/css/background-clip-radius-values-expected.png:
+        * platform/chromium-linux/fast/replaced/border-radius-clip-content-edge-expected.png:
+        * platform/chromium-linux/fast/writing-mode/border-styles-vertical-lr-expected.png:
+        * platform/chromium-linux/fast/writing-mode/border-styles-vertical-rl-expected.png:
+        * platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-001-expected.png:
+        * platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-002-expected.png:
+        * platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-left-radius-values-004-expected.png:
+        * platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-right-radius-values-004-expected.png:
+        * platform/chromium-linux/svg/custom/svg-fonts-in-html-expected.png:
+        * platform/chromium/TestExpectations:
+
 2013-01-09  Dimitri Glazkov  <[email protected]>
 
         [Chromium] Land expectations for r139197.

Modified: trunk/LayoutTests/platform/chromium/TestExpectations (139237 => 139238)


--- trunk/LayoutTests/platform/chromium/TestExpectations	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/LayoutTests/platform/chromium/TestExpectations	2013-01-09 22:01:09 UTC (rev 139238)
@@ -1380,6 +1380,22 @@
 webkit.org/b/106366 platform/chromium/fast/forms/calendar-picker/calendar-picker-appearance.html [ ImageOnlyFailure Pass ]
 webkit.org/b/106366 platform/chromium/fast/forms/calendar-picker/calendar-picker-appearance-ru.html [ ImageOnlyFailure Pass ]
 
+# Need rebaseline after https://bugs.webkit.org/show_bug.cgi?id=106461
+webkit.org/b/106461 fast/backgrounds/border-radius-split-background-image.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/border-radius-complex-inner.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/border-radius-inset-outset.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/border-radius-wide-border-05.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/border-styles-split.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/borderRadiusArcs01.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/borders/mixed-border-styles-radius.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/writing-mode/border-styles-vertical-lr.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 fast/writing-mode/border-styles-vertical-rl.html [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-001.htm [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-002.htm [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 ietestcenter/css3/bordersbackgrounds/border-top-left-radius-values-004.htm [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 ietestcenter/css3/bordersbackgrounds/border-top-right-radius-values-004.htm [ ImageOnlyFailure Pass ]
+webkit.org/b/106461 svg/custom/svg-fonts-in-html.html [ ImageOnlyFailure Pass ]
+
 # Failing since added by r108699
 webkit.org/b/79454 [ Android Linux Mac ] svg/text/text-rescale.html [ ImageOnlyFailure Pass ]
 webkit.org/b/79454 [ Android Linux Mac ] svg/text/text-viewbox-rescale.html [ ImageOnlyFailure Pass ]

Modified: trunk/LayoutTests/platform/chromium-linux/fast/backgrounds/border-radius-split-background-image-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/border-radius-complex-inner-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/border-radius-inset-outset-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/border-radius-wide-border-05-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/border-styles-split-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/borderRadiusArcs01-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/borders/mixed-border-styles-radius-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/css/background-clip-radius-values-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/replaced/border-radius-clip-content-edge-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/writing-mode/border-styles-vertical-lr-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/fast/writing-mode/border-styles-vertical-rl-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-001-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-002-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-left-radius-values-004-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/ietestcenter/css3/bordersbackgrounds/border-top-right-radius-values-004-expected.png


(Binary files differ)

Modified: trunk/LayoutTests/platform/chromium-linux/svg/custom/svg-fonts-in-html-expected.png


(Binary files differ)

Modified: trunk/Source/WebCore/ChangeLog (139237 => 139238)


--- trunk/Source/WebCore/ChangeLog	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/Source/WebCore/ChangeLog	2013-01-09 22:01:09 UTC (rev 139238)
@@ -1,3 +1,28 @@
+2013-01-09  Florin Malita  <[email protected]>
+
+        [Skia] Implement GraphicsContext::addRoundedRectClip() using SkCanvas::clipRRect()
+        https://bugs.webkit.org/show_bug.cgi?id=106461
+
+        Reviewed by Stephen White.
+
+        This patch adds a Skia-specific version of GraphicsContext::addRoundedRectClip() to take
+        advantage of the SkCanvas::clipRRect() primitive.
+
+        As a minor cleanup, the anonymous namespace in GraphicsContextSkia.cpp is extended to cover
+        all the local helper functions.
+
+        No new tests: coverage provided by existing tests.
+
+        * platform/graphics/GraphicsContext.cpp:
+        (WebCore):
+        * platform/graphics/skia/GraphicsContextSkia.cpp:
+        (WebCore::GraphicsContext::addRoundedRectClip):
+        (WebCore):
+        (WebCore::GraphicsContext::fillRoundedRect):
+        * platform/graphics/skia/PlatformContextSkia.h:
+        (WebCore::PlatformContextSkia::clipRRect):
+        (WebCore):
+
 2013-01-09  Andreas Kling  <[email protected]>
 
         SVG-as-image: Throw out cached bitmap renderings after they sit unused for some time.

Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp (139237 => 139238)


--- trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp	2013-01-09 22:01:09 UTC (rev 139238)
@@ -604,6 +604,7 @@
 }
 #endif
 
+#if !USE(SKIA)
 void GraphicsContext::addRoundedRectClip(const RoundedRect& rect)
 {
     if (paintingDisabled())
@@ -613,6 +614,7 @@
     path.addRoundedRect(rect);
     clip(path);
 }
+#endif
 
 void GraphicsContext::clipOutRoundedRect(const RoundedRect& rect)
 {

Modified: trunk/Source/WebCore/platform/graphics/skia/GraphicsContextSkia.cpp (139237 => 139238)


--- trunk/Source/WebCore/platform/graphics/skia/GraphicsContextSkia.cpp	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/Source/WebCore/platform/graphics/skia/GraphicsContextSkia.cpp	2013-01-09 22:01:09 UTC (rev 139238)
@@ -68,6 +68,7 @@
 namespace WebCore {
 
 namespace {
+// Local helper functions ------------------------------------------------------
 
 // Return value % max, but account for value possibly being negative.
 inline int fastMod(int value, int max)
@@ -84,10 +85,6 @@
     return value;
 }
 
-}  // namespace
-
-// Local helper functions ------------------------------------------------------
-
 void addCornerArc(SkPath* path, const SkRect& rect, const IntSize& size, int startAngle)
 {
     SkIRect ir;
@@ -200,6 +197,20 @@
     }
 }
 
+inline void setRadii(SkVector* radii, IntSize topLeft, IntSize topRight, IntSize bottomRight, IntSize bottomLeft)
+{
+    radii[SkRRect::kUpperLeft_Corner].set(SkIntToScalar(topLeft.width()),
+        SkIntToScalar(topLeft.height()));
+    radii[SkRRect::kUpperRight_Corner].set(SkIntToScalar(topRight.width()),
+        SkIntToScalar(topRight.height()));
+    radii[SkRRect::kLowerRight_Corner].set(SkIntToScalar(bottomRight.width()),
+        SkIntToScalar(bottomRight.height()));
+    radii[SkRRect::kLowerLeft_Corner].set(SkIntToScalar(bottomLeft.width()),
+        SkIntToScalar(bottomLeft.height()));
+}
+
+} // namespace
+
 // -----------------------------------------------------------------------------
 
 // This may be called with a NULL pointer to create a graphics context that has
@@ -311,6 +322,21 @@
     platformContext()->clipPath(*path.platformPath(), PlatformContextSkia::AntiAliased);
 }
 
+void GraphicsContext::addRoundedRectClip(const RoundedRect& rect)
+{
+    if (paintingDisabled())
+        return;
+
+    SkVector radii[4];
+    RoundedRect::Radii wkRadii = rect.radii();
+    setRadii(radii, wkRadii.topLeft(), wkRadii.topRight(), wkRadii.bottomRight(), wkRadii.bottomLeft());
+
+    SkRRect r;
+    r.setRectRadii(rect.rect(), radii);
+
+    platformContext()->clipRRect(r, PlatformContextSkia::AntiAliased);
+}
+
 void GraphicsContext::canvasClip(const Path& path)
 {
     if (paintingDisabled())
@@ -808,10 +834,7 @@
     }
 
     SkVector radii[4];
-    radii[SkRRect::kUpperLeft_Corner].set(SkIntToScalar(topLeft.width()), SkIntToScalar(topLeft.height()));
-    radii[SkRRect::kUpperRight_Corner].set(SkIntToScalar(topRight.width()), SkIntToScalar(topRight.height()));
-    radii[SkRRect::kLowerRight_Corner].set(SkIntToScalar(bottomRight.width()), SkIntToScalar(bottomRight.height()));
-    radii[SkRRect::kLowerLeft_Corner].set(SkIntToScalar(bottomLeft.width()), SkIntToScalar(bottomLeft.height()));
+    setRadii(radii, topLeft, topRight, bottomRight, bottomLeft);
 
     SkRRect rr;
     rr.setRectRadii(rect, radii);

Modified: trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h (139237 => 139238)


--- trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h	2013-01-09 21:55:18 UTC (rev 139237)
+++ trunk/Source/WebCore/platform/graphics/skia/PlatformContextSkia.h	2013-01-09 22:01:09 UTC (rev 139238)
@@ -226,6 +226,8 @@
         SkRegion::Op = SkRegion::kIntersect_Op);
     bool clipRect(const SkRect&, AntiAliasingMode = NotAntiAliased,
         SkRegion::Op = SkRegion::kIntersect_Op);
+    bool clipRRect(const SkRRect&, AntiAliasingMode = NotAntiAliased,
+        SkRegion::Op = SkRegion::kIntersect_Op);
     bool getClipBounds(SkRect*) const;
 
     void setMatrix(const SkMatrix&);
@@ -367,6 +369,13 @@
     return m_canvas->clipRect(rect, op, aa == AntiAliased);
 }
 
+inline bool PlatformContextSkia::clipRRect(const SkRRect& rect, AntiAliasingMode aa, SkRegion::Op op)
+{
+    realizeSave(SkCanvas::kClip_SaveFlag);
+
+    return m_canvas->clipRRect(rect, op, aa == AntiAliased);
+}
+
 inline bool PlatformContextSkia::getClipBounds(SkRect* bounds) const
 {
     return m_canvas->getClipBounds(bounds);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to