[cairo] Entering text into forms on github.com creates a trapezoid artifact
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Jun 2019 08:02:54 +0000 (08:02 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Jun 2019 08:02:54 +0000 (08:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=126124

Reviewed by Michael Catanzaro.

Mixing antialiasing modes in the same clip is not actually supported by cairo. In the case of rectangle clips we
are already ignoring the current antialiasing to not do any antialiasing. We could do the opposite for clips
receiving a path, we want to enforce antialiasing in that case since the paths might contain curves. Doing that
we ensure all calls to clip with a path use the same antialiasing, which is the case of the github bug.

* platform/graphics/cairo/CairoOperations.cpp:
(WebCore::Cairo::doClipWithAntialias): Helper to call cairo_clip() with the given antialising mode.
(WebCore::Cairo::clip): Use doClipWithAntialias().
(WebCore::Cairo::clipOut): Ditto.
(WebCore::Cairo::clipPath): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@246431 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/cairo/CairoOperations.cpp

index db06abb..329a516 100644 (file)
@@ -1,3 +1,21 @@
+2019-06-14  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [cairo] Entering text into forms on github.com creates a trapezoid artifact
+        https://bugs.webkit.org/show_bug.cgi?id=126124
+
+        Reviewed by Michael Catanzaro.
+
+        Mixing antialiasing modes in the same clip is not actually supported by cairo. In the case of rectangle clips we
+        are already ignoring the current antialiasing to not do any antialiasing. We could do the opposite for clips
+        receiving a path, we want to enforce antialiasing in that case since the paths might contain curves. Doing that
+        we ensure all calls to clip with a path use the same antialiasing, which is the case of the github bug.
+
+        * platform/graphics/cairo/CairoOperations.cpp:
+        (WebCore::Cairo::doClipWithAntialias): Helper to call cairo_clip() with the given antialising mode.
+        (WebCore::Cairo::clip): Use doClipWithAntialias().
+        (WebCore::Cairo::clipOut): Ditto.
+        (WebCore::Cairo::clipPath): Ditto.
+
 2019-06-13  Myles C. Maxfield  <mmaxfield@apple.com>
 
         [WHLSL] Remove unnecessary ASSERT()s and clean up visitor lambdas
index fba5456..68e46c8 100644 (file)
@@ -1251,6 +1251,14 @@ void endTransparencyLayer(PlatformContextCairo& platformContext)
     cairo_paint_with_alpha(cr, platformContext.layers().takeLast());
 }
 
+static void doClipWithAntialias(cairo_t* cr, cairo_antialias_t antialias)
+{
+    auto savedAntialiasRule = cairo_get_antialias(cr);
+    cairo_set_antialias(cr, antialias);
+    cairo_clip(cr);
+    cairo_set_antialias(cr, savedAntialiasRule);
+}
+
 void clip(PlatformContextCairo& platformContext, const FloatRect& rect)
 {
     cairo_t* cr = platformContext.cr();
@@ -1262,11 +1270,8 @@ void clip(PlatformContextCairo& platformContext, const FloatRect& rect)
     // edge fringe artifacts may occur at the layer edges
     // when a transformation is applied to the GraphicsContext
     // while drawing the transformed layer.
-    cairo_antialias_t savedAntialiasRule = cairo_get_antialias(cr);
-    cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
-    cairo_clip(cr);
+    doClipWithAntialias(cr, CAIRO_ANTIALIAS_NONE);
     cairo_set_fill_rule(cr, savedFillRule);
-    cairo_set_antialias(cr, savedAntialiasRule);
 
     if (auto* graphicsContextPrivate = platformContext.graphicsContextPrivate())
         graphicsContextPrivate->clip(rect);
@@ -1281,7 +1286,7 @@ void clipOut(PlatformContextCairo& platformContext, const FloatRect& rect)
     cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height());
     cairo_fill_rule_t savedFillRule = cairo_get_fill_rule(cr);
     cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
-    cairo_clip(cr);
+    doClipWithAntialias(cr, CAIRO_ANTIALIAS_NONE);
     cairo_set_fill_rule(cr, savedFillRule);
 }
 
@@ -1295,7 +1300,8 @@ void clipOut(PlatformContextCairo& platformContext, const Path& path)
 
     cairo_fill_rule_t savedFillRule = cairo_get_fill_rule(cr);
     cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
-    cairo_clip(cr);
+    // Enforce default antialias when clipping paths, since they can contain curves.
+    doClipWithAntialias(cr, CAIRO_ANTIALIAS_DEFAULT);
     cairo_set_fill_rule(cr, savedFillRule);
 }
 
@@ -1308,7 +1314,8 @@ void clipPath(PlatformContextCairo& platformContext, const Path& path, WindRule
 
     cairo_fill_rule_t savedFillRule = cairo_get_fill_rule(cr);
     cairo_set_fill_rule(cr, clipRule == WindRule::EvenOdd ? CAIRO_FILL_RULE_EVEN_ODD : CAIRO_FILL_RULE_WINDING);
-    cairo_clip(cr);
+    // Enforce default antialias when clipping paths, since they can contain curves.
+    doClipWithAntialias(cr, CAIRO_ANTIALIAS_DEFAULT);
     cairo_set_fill_rule(cr, savedFillRule);
 
     if (auto* graphicsContextPrivate = platformContext.graphicsContextPrivate())