Patch by Yuzhu Shen <yzshen@chromium.com> on 2011-07-18
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Jul 2011 20:36:31 +0000 (20:36 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Jul 2011 20:36:31 +0000 (20:36 +0000)
Reviewed by James Robinson.

[chromium] WebFontImpl::drawText needs to handle the canvasIsOpaque input.
https://bugs.webkit.org/show_bug.cgi?id=64555

This change handles canvasIsOpaque for the WEBKIT_USING_SKIA case.

* src/WebFontImpl.cpp: handled canvasIsOpaque.
* src/WebFontImpl.h: added method declaration.

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

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/WebFontImpl.cpp
Source/WebKit/chromium/src/WebFontImpl.h

index c0cda84..51ff948 100644 (file)
@@ -1,3 +1,15 @@
+2011-07-18  Yuzhu Shen  <yzshen@chromium.com>
+
+        Reviewed by James Robinson.
+
+        [chromium] WebFontImpl::drawText needs to handle the canvasIsOpaque input.
+        https://bugs.webkit.org/show_bug.cgi?id=64555
+        
+        This change handles canvasIsOpaque for the WEBKIT_USING_SKIA case.
+        * src/WebFontImpl.cpp: handled canvasIsOpaque.
+        * src/WebFontImpl.h: added method declaration.
+
 2011-07-16  Simon Fraser  <simon.fraser@apple.com>
 
         Add code to attempt to align compositing layers to pixel boundaries when page scale changes
index d3555f2..c945df7 100644 (file)
@@ -91,18 +91,44 @@ void WebFontImpl::drawText(WebCanvas* canvas, const WebTextRun& run, const WebFl
                            WebColor color, const WebRect& clip, bool canvasIsOpaque,
                            int from, int to) const
 {
-    // FIXME hook canvasIsOpaque up to the platform-specific indicators for
-    // whether subpixel AA can be used for this draw. On Windows, this is
-    // PlatformContextSkia::setDrawingToImageBuffer.
-
     GraphicsContextBuilder builder(canvas);
     GraphicsContext& gc = builder.context();
 
+#if WEBKIT_USING_SKIA
+    gc.platformContext()->setDrawingToImageBuffer(!canvasIsOpaque);
+#elif WEBKIT_USING_CG
+    // FIXME hook canvasIsOpaque up to the platform-specific indicators for
+    // whether subpixel AA can be used for this draw.
+#endif
+
     gc.save();
     gc.setFillColor(color, ColorSpaceDeviceRGB);
     gc.clip(WebCore::FloatRect(clip));
     m_font.drawText(&gc, run, leftBaseline, from, to);
     gc.restore();
+
+#if defined(WIN32)
+    if (canvasIsOpaque && SkColorGetA(color) == 0xFF) {
+        SkCanvas::LayerIter iter(const_cast<SkCanvas*>(canvas), false);
+        iter.next(); // There is always at least one layer.
+        bool multipleLayers = !iter.done();
+        if (!multipleLayers) {
+            // The text drawing logic on Windows ignores the alpha component
+            // intentionally, for performance reasons.
+            // (Please see TransparencyAwareFontPainter::initializeForGDI in
+            // FontChromiumWin.cpp.)
+            const SkBitmap& bitmap = canvas->getTopDevice()->accessBitmap(true);
+            IntRect textBounds = estimateTextBounds(run, leftBaseline);
+            IntRect destRect = gc.getCTM().mapRect(textBounds);
+            destRect.intersect(IntRect(0, 0, bitmap.width(), bitmap.height()));
+            for (int y = destRect.y(), maxY = destRect.maxY(); y < maxY; y++) {
+                uint32_t* row = bitmap.getAddr32(0, y);
+                for (int x = destRect.x(), maxX = destRect.maxX(); x < maxX; x++)
+                    row[x] |= (0xFF << SK_A32_SHIFT);
+            }
+        }
+    }
+#endif
 }
 
 int WebFontImpl::calculateWidth(const WebTextRun& run) const
@@ -120,4 +146,14 @@ WebFloatRect WebFontImpl::selectionRectForText(const WebTextRun& run, const WebF
     return m_font.selectionRectForText(run, leftBaseline, height, from, to);
 }
 
+WebRect WebFontImpl::estimateTextBounds(const WebTextRun& run, const WebFloatPoint& leftBaseline) const
+{
+    int totalWidth = m_font.width(run, 0);
+    const FontMetrics& fontMetrics = m_font.fontMetrics();
+    return WebRect(leftBaseline.x - (fontMetrics.ascent() + fontMetrics.descent()) / 2,
+                   leftBaseline.y - fontMetrics.ascent() - fontMetrics.lineGap(),
+                   totalWidth + fontMetrics.ascent() + fontMetrics.descent(),
+                   fontMetrics.lineSpacing()); 
+}
+
 } // namespace WebKit
index 3ac9031..46de991 100644 (file)
@@ -58,6 +58,9 @@ public:
                                               int height, int from = 0, int to = -1) const;
 
 private:
+    // Estimates the bounding box of the given text.
+    WebRect estimateTextBounds(const WebTextRun&, const WebFloatPoint& leftBaseline) const;
+
     WebCore::Font m_font;
 };