Title: [89266] trunk/Source/WebCore
Revision
89266
Author
[email protected]
Date
2011-06-20 11:55:46 -0700 (Mon, 20 Jun 2011)

Log Message

2011-06-20  Cary Clark  <[email protected]>

        Reviewed by Eric Seidel.

        Add Font interface to support Skia on Mac Chrome port
        https://bugs.webkit.org/show_bug.cgi?id=62889

        No new tests. This combination (using Skia as the
        WebCore renderer on Chrome for Mac) is not yet
        enabled, so adding this file has no functional
        change. The corresponding changes to the gyp files
        exclude FontSkia for all current builds.

        * WebCore.gyp/WebCore.gyp:
        Exclude FontSkia for all non-mac builds. An existing
        rule excludes *Skia for mac builds.

        * WebCore.gypi:
        Add FontSkia to the list of files.

        * platform/graphics/skia/FontSkia.cpp: Added.
        (WebCore::Font::canReturnFallbackFontsForComplexText):
        (WebCore::Font::canExpandAroundIdeographsInComplexText):
        (WebCore::isCanvasMultiLayered):
        (WebCore::adjustTextRenderMode):
        (WebCore::setupPaint):
        (WebCore::Font::drawGlyphs):
        These functions are similar to their counterparts in
        platform/graphics/chromium/FontLinux.cpp.
        The differences are:
        The setupPaint uses CTFont instead of FreeType.
        The width/height font metrics have different accessors.
        Harfbuzz is not needed in the Mac port.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (89265 => 89266)


--- trunk/Source/WebCore/ChangeLog	2011-06-20 18:51:12 UTC (rev 89265)
+++ trunk/Source/WebCore/ChangeLog	2011-06-20 18:55:46 UTC (rev 89266)
@@ -1,3 +1,37 @@
+2011-06-20  Cary Clark  <[email protected]>
+
+        Reviewed by Eric Seidel.
+
+        Add Font interface to support Skia on Mac Chrome port
+        https://bugs.webkit.org/show_bug.cgi?id=62889
+
+        No new tests. This combination (using Skia as the
+        WebCore renderer on Chrome for Mac) is not yet
+        enabled, so adding this file has no functional
+        change. The corresponding changes to the gyp files
+        exclude FontSkia for all current builds.
+
+        * WebCore.gyp/WebCore.gyp:
+        Exclude FontSkia for all non-mac builds. An existing
+        rule excludes *Skia for mac builds.
+
+        * WebCore.gypi:
+        Add FontSkia to the list of files.
+
+        * platform/graphics/skia/FontSkia.cpp: Added.
+        (WebCore::Font::canReturnFallbackFontsForComplexText):
+        (WebCore::Font::canExpandAroundIdeographsInComplexText):
+        (WebCore::isCanvasMultiLayered):
+        (WebCore::adjustTextRenderMode):
+        (WebCore::setupPaint):
+        (WebCore::Font::drawGlyphs):
+        These functions are similar to their counterparts in
+        platform/graphics/chromium/FontLinux.cpp.
+        The differences are: 
+        The setupPaint uses CTFont instead of FreeType.
+        The width/height font metrics have different accessors.
+        Harfbuzz is not needed in the Mac port. 
+
 2011-06-20  Andras Becsi  <[email protected]>
 
         Reviewed by Csaba Osztrogonác.

Modified: trunk/Source/WebCore/WebCore.gyp/WebCore.gyp (89265 => 89266)


--- trunk/Source/WebCore/WebCore.gyp/WebCore.gyp	2011-06-20 18:51:12 UTC (rev 89265)
+++ trunk/Source/WebCore/WebCore.gyp/WebCore.gyp	2011-06-20 18:55:46 UTC (rev 89266)
@@ -1430,7 +1430,11 @@
           'sources/': [
             # FIXME: We will eventually compile this too, but for now it's
             # only used on mac.
-            ['exclude', 'platform/graphics/FontPlatformData\\.cpp$']
+            ['exclude', 'platform/graphics/FontPlatformData\\.cpp$'],
+
+            # Linux uses FontLinux; Windows uses FontWin. Additionally, FontSkia
+            # is excluded by a rule above if WebKit uses CG instead of Skia.
+            ['exclude', 'platform/graphics/skia/FontSkia\\.cpp$'],
           ],
         }],
         ['toolkit_uses_gtk == 0', {

Modified: trunk/Source/WebCore/WebCore.gypi (89265 => 89266)


--- trunk/Source/WebCore/WebCore.gypi	2011-06-20 18:51:12 UTC (rev 89265)
+++ trunk/Source/WebCore/WebCore.gypi	2011-06-20 18:55:46 UTC (rev 89266)
@@ -4444,6 +4444,7 @@
             'platform/graphics/skia/FloatRectSkia.cpp',
             'platform/graphics/skia/FontCustomPlatformData.cpp',
             'platform/graphics/skia/FontCustomPlatformData.h',
+            'platform/graphics/skia/FontSkia.cpp',
             'platform/graphics/skia/GlyphPageTreeNodeSkia.cpp',
             'platform/graphics/skia/GradientSkia.cpp',
             'platform/graphics/skia/GraphicsContext3DSkia.cpp',

Added: trunk/Source/WebCore/platform/graphics/skia/FontSkia.cpp (0 => 89266)


--- trunk/Source/WebCore/platform/graphics/skia/FontSkia.cpp	                        (rev 0)
+++ trunk/Source/WebCore/platform/graphics/skia/FontSkia.cpp	2011-06-20 18:55:46 UTC (rev 89266)
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2011 Google Inc. All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "Font.h"
+
+#include "GlyphBuffer.h"
+#include "GraphicsContext.h"
+#include "PlatformContextSkia.h"
+#include "SimpleFontData.h"
+
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkTypeface.h"
+#include "SkTypeface_mac.h"
+
+namespace WebCore {
+
+// FIXME: Determine if the Mac port of Chromium using Skia can return fallback
+// fonts for complex text. (The Windows and Linux ports for Chromium do not.)
+// This issue is tracked in https://bugs.webkit.org/show_bug.cgi?id=62986
+bool Font::canReturnFallbackFontsForComplexText()
+{
+    return false;
+}
+
+// FIXME: Determine if the Mac port of Chromium using Skia can expand around
+// ideographs in complex text. (The Windows and Linux ports for Chromium can't.)
+// This issue is tracked in https://bugs.webkit.org/show_bug.cgi?id=62987
+bool Font::canExpandAroundIdeographsInComplexText()
+{
+    return false;
+}
+
+static bool isCanvasMultiLayered(SkCanvas* canvas)
+{
+    SkCanvas::LayerIter layerIterator(canvas, false);
+    layerIterator.next();
+    return !layerIterator.done();
+}
+
+static void adjustTextRenderMode(SkPaint* paint, PlatformContextSkia* skiaContext)
+{
+    // Our layers only have a single alpha channel. This means that subpixel
+    // rendered text cannot be compositied correctly when the layer is
+    // collapsed. Therefore, subpixel text is disabled when we are drawing
+    // onto a layer or when the compositor is being used.
+    if (isCanvasMultiLayered(skiaContext->canvas()) || skiaContext->isDrawingToImageBuffer())
+        paint->setLCDRenderText(false);
+}
+
+static void setupPaint(SkPaint* paint, const SimpleFontData* fontData, const Font* font)
+{
+    const FontPlatformData& platformData = fontData->platformData();
+    const float textSize = platformData.m_size >= 0 ? platformData.m_size : 12;
+
+    paint->setAntiAlias(true);
+    paint->setEmbeddedBitmapText(false);
+    paint->setTextSize(SkFloatToScalar(textSize));
+    SkTypeface* typeface = SkCreateTypefaceFromCTFont(platformData.ctFont());
+    SkAutoUnref autoUnref(typeface);
+    paint->setTypeface(typeface);
+    paint->setFakeBoldText(platformData.m_syntheticBold);
+    paint->setTextSkewX(platformData.m_syntheticOblique ? -SK_Scalar1 / 4 : 0);
+    paint->setAutohinted(false); // freetype specific
+    paint->setLCDRenderText(true); // font->fontDescription().fontSmoothing() == SubpixelAntialiased);
+}
+
+// TODO: This needs to be split into helper functions to better scope the
+// inputs/outputs, and reduce duplicate code.
+// This issue is tracked in https://bugs.webkit.org/show_bug.cgi?id=62989
+void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
+                      const GlyphBuffer& glyphBuffer,  int from, int numGlyphs,
+                      const FloatPoint& point) const {
+    COMPILE_ASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t), GlyphBufferGlyphSize_equals_uint16_t);
+
+    const GlyphBufferGlyph* glyphs = glyphBuffer.glyphs(from);
+    SkScalar x = SkFloatToScalar(point.x());
+    SkScalar y = SkFloatToScalar(point.y());
+
+    // FIXME: text rendering speed:
+    // Android has code in their WebCore fork to special case when the
+    // GlyphBuffer has no advances other than the defaults. In that case the
+    // text drawing can proceed faster. However, it's unclear when those
+    // patches may be upstreamed to WebKit so we always use the slower path
+    // here.
+    const GlyphBufferAdvance* adv = glyphBuffer.advances(from);
+    SkAutoSTMalloc<32, SkPoint> storage(numGlyphs), storage2(numGlyphs), storage3(numGlyphs);
+    SkPoint* pos = storage.get();
+    SkPoint* vPosBegin = storage2.get();
+    SkPoint* vPosEnd = storage3.get();
+
+    bool isVertical = font->platformData().orientation() == Vertical;
+    for (int i = 0; i < numGlyphs; i++) {
+        SkScalar myWidth = SkFloatToScalar(adv[i].width);
+        pos[i].set(x, y);
+        if (isVertical) {
+            vPosBegin[i].set(x + myWidth, y);
+            vPosEnd[i].set(x + myWidth, y - myWidth);
+        }
+        x += myWidth;
+        y += SkFloatToScalar(adv[i].height);
+    }
+
+    gc->platformContext()->prepareForSoftwareDraw();
+
+    SkCanvas* canvas = gc->platformContext()->canvas();
+    TextDrawingModeFlags textMode = gc->platformContext()->getTextDrawingMode();
+
+    // We draw text up to two times (once for fill, once for stroke).
+    if (textMode & TextModeFill) {
+        SkPaint paint;
+        gc->platformContext()->setupPaintForFilling(&paint);
+        setupPaint(&paint, font, this);
+        adjustTextRenderMode(&paint, gc->platformContext());
+        paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+        paint.setColor(gc->fillColor().rgb());
+
+        if (isVertical) {
+            SkPath path;
+            for (int i = 0; i < numGlyphs; ++i) {
+                path.reset();
+                path.moveTo(vPosBegin[i]);
+                path.lineTo(vPosEnd[i]);
+                canvas->drawTextOnPath(glyphs + i, sizeof(uint16_t), path, 0, paint);
+            }
+        } else
+            canvas->drawPosText(glyphs, numGlyphs * sizeof(uint16_t), pos, paint);
+    }
+
+    if ((textMode & TextModeStroke)
+        && gc->platformContext()->getStrokeStyle() != NoStroke
+        && gc->platformContext()->getStrokeThickness() > 0) {
+
+        SkPaint paint;
+        gc->platformContext()->setupPaintForStroking(&paint, 0, 0);
+        setupPaint(&paint, font, this);
+        adjustTextRenderMode(&paint, gc->platformContext());
+        paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+        paint.setColor(gc->strokeColor().rgb());
+
+        if (textMode & TextModeFill) {
+            // If we also filled, we don't want to draw shadows twice.
+            // See comment in FontChromiumWin.cpp::paintSkiaText() for more details.
+            paint.setLooper(0);
+        }
+
+        if (isVertical) {
+            SkPath path;
+            for (int i = 0; i < numGlyphs; ++i) {
+                path.reset();
+                path.moveTo(vPosBegin[i]);
+                path.lineTo(vPosEnd[i]);
+                canvas->drawTextOnPath(glyphs + i, sizeof(uint16_t), path, 0, paint);
+            }
+        } else
+            canvas->drawPosText(glyphs, numGlyphs * sizeof(uint16_t), pos, paint);
+    }
+}
+
+} // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to