gfx/skia/patches/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/skia/patches/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,472 @@
     1.4 +From: George Wright <george@mozilla.com>
     1.5 +Date: Wed, 1 Aug 2012 16:43:15 -0400
     1.6 +Subject: Bug 736276 - Add a new SkFontHost that takes a cairo_scaled_font_t r=karl
     1.7 +
     1.8 +
     1.9 +diff --git a/gfx/skia/Makefile.in b/gfx/skia/Makefile.in
    1.10 +index 5ebbd2e..7c8cdbf 100644
    1.11 +--- a/gfx/skia/Makefile.in
    1.12 ++++ b/gfx/skia/Makefile.in
    1.13 +@@ -60,15 +60,15 @@ VPATH += \
    1.14 + 	$(NULL)
    1.15 + 
    1.16 + ifeq (android,$(MOZ_WIDGET_TOOLKIT))
    1.17 +-OS_CXXFLAGS += $(CAIRO_FT_CFLAGS)
    1.18 ++OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(CAIRO_FT_CFLAGS)
    1.19 + endif
    1.20 + 
    1.21 + ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
    1.22 +-OS_CXXFLAGS += $(MOZ_PANGO_CFLAGS)
    1.23 ++OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(MOZ_PANGO_CFLAGS) $(CAIRO_FT_CFLAGS)
    1.24 + endif
    1.25 + 
    1.26 + ifeq (qt,$(MOZ_WIDGET_TOOLKIT))
    1.27 +-OS_CXXFLAGS += $(MOZ_PANGO_CFLAGS)
    1.28 ++OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(MOZ_PANGO_CFLAGS) $(CAIRO_FT_CFLAGS)
    1.29 + ifeq (Linux,$(OS_TARGET))
    1.30 + DEFINES += -DSK_USE_POSIX_THREADS=1
    1.31 + endif
    1.32 +diff --git a/gfx/skia/include/ports/SkTypeface_cairo.h b/gfx/skia/include/ports/SkTypeface_cairo.h
    1.33 +new file mode 100644
    1.34 +index 0000000..7e44f04
    1.35 +--- /dev/null
    1.36 ++++ b/gfx/skia/include/ports/SkTypeface_cairo.h
    1.37 +@@ -0,0 +1,11 @@
    1.38 ++#ifndef SkTypeface_cairo_DEFINED
    1.39 ++#define SkTypeface_cairo_DEFINED
    1.40 ++
    1.41 ++#include <cairo.h>
    1.42 ++
    1.43 ++#include "SkTypeface.h"
    1.44 ++
    1.45 ++SK_API extern SkTypeface* SkCreateTypefaceFromCairoFont(cairo_font_face_t* fontFace, SkTypeface::Style style, bool isFixedWidth);
    1.46 ++
    1.47 ++#endif
    1.48 ++
    1.49 +diff --git a/gfx/skia/moz.build b/gfx/skia/moz.build
    1.50 +index 9ceba59..66efd52 100644
    1.51 +--- a/gfx/skia/moz.build
    1.52 ++++ b/gfx/skia/moz.build
    1.53 +@@ -171,10 +171,12 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
    1.54 +         'SkTime_win.cpp',
    1.55 +     ]
    1.56 + elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk2':
    1.57 ++    EXPORTS.skia += [
    1.58 ++        'include/ports/SkTypeface_cairo.h',
    1.59 ++    ]
    1.60 +     CPP_SOURCES += [
    1.61 +-        'SkFontHost_FreeType.cpp',
    1.62 ++        'SkFontHost_cairo.cpp',
    1.63 +         'SkFontHost_FreeType_common.cpp',
    1.64 +-        'SkFontHost_linux.cpp',
    1.65 +         'SkThread_pthread.cpp',
    1.66 +         'SkThreadUtils_pthread.cpp',
    1.67 +         'SkThreadUtils_pthread_linux.cpp',
    1.68 +@@ -183,14 +185,15 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk2':
    1.69 +     ]
    1.70 + elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'qt':
    1.71 +     CPP_SOURCES += [
    1.72 +-        'SkFontHost_FreeType.cpp',
    1.73 ++        'SkFontHost_cairo.cpp',
    1.74 +         'SkFontHost_FreeType_common.cpp',
    1.75 +         'SkOSFile.cpp',
    1.76 +     ]
    1.77 +     if CONFIG['OS_TARGET'] == 'Linux':
    1.78 ++        EXPORTS.skia += [
    1.79 ++            'include/ports/SkTypeface_cairo.h',
    1.80 ++        ]
    1.81 +         CPP_SOURCES += [
    1.82 +-            'SkFontHost_linux.cpp',
    1.83 +-            'SkFontHost_tables.cpp',
    1.84 +             'SkThread_pthread.cpp',
    1.85 +             'SkThreadUtils_pthread.cpp',
    1.86 +             'SkThreadUtils_pthread_linux.cpp',
    1.87 +@@ -204,11 +207,13 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
    1.88 + # Separate 'if' from above, since the else below applies to all != 'android'
    1.89 + # toolkits.
    1.90 + if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
    1.91 ++    EXPORTS.skia += [
    1.92 ++        'include/ports/SkTypeface_cairo.h',
    1.93 ++    ]
    1.94 +     CPP_SOURCES += [
    1.95 +         'ashmem.cpp',
    1.96 +         'SkDebug_android.cpp',
    1.97 +-        'SkFontHost_android_old.cpp',
    1.98 +-        'SkFontHost_FreeType.cpp',
    1.99 ++        'SkFontHost_cairo.cpp',
   1.100 +         'SkFontHost_FreeType_common.cpp',
   1.101 +         'SkImageRef_ashmem.cpp',
   1.102 +         'SkTime_Unix.cpp',
   1.103 +diff --git a/gfx/skia/src/ports/SkFontHost_cairo.cpp b/gfx/skia/src/ports/SkFontHost_cairo.cpp
   1.104 +new file mode 100644
   1.105 +index 0000000..bb5b778
   1.106 +--- /dev/null
   1.107 ++++ b/gfx/skia/src/ports/SkFontHost_cairo.cpp
   1.108 +@@ -0,0 +1,364 @@
   1.109 ++
   1.110 ++/*
   1.111 ++ * Copyright 2012 Mozilla Foundation
   1.112 ++ *
   1.113 ++ * Use of this source code is governed by a BSD-style license that can be
   1.114 ++ * found in the LICENSE file.
   1.115 ++ */
   1.116 ++
   1.117 ++#include "cairo.h"
   1.118 ++#include "cairo-ft.h"
   1.119 ++
   1.120 ++#include "SkFontHost_FreeType_common.h"
   1.121 ++
   1.122 ++#include "SkAdvancedTypefaceMetrics.h"
   1.123 ++#include "SkFontHost.h"
   1.124 ++#include "SkPath.h"
   1.125 ++#include "SkScalerContext.h"
   1.126 ++#include "SkTypefaceCache.h"
   1.127 ++
   1.128 ++#include <ft2build.h>
   1.129 ++#include FT_FREETYPE_H
   1.130 ++
   1.131 ++static cairo_user_data_key_t kSkTypefaceKey;
   1.132 ++
   1.133 ++class SkScalerContext_CairoFT : public SkScalerContext_FreeType_Base {
   1.134 ++public:
   1.135 ++    SkScalerContext_CairoFT(SkTypeface* typeface, const SkDescriptor* desc);
   1.136 ++    virtual ~SkScalerContext_CairoFT();
   1.137 ++
   1.138 ++protected:
   1.139 ++    virtual unsigned generateGlyphCount() SK_OVERRIDE;
   1.140 ++    virtual uint16_t generateCharToGlyph(SkUnichar uniChar) SK_OVERRIDE;
   1.141 ++    virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE;
   1.142 ++    virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE;
   1.143 ++    virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE;
   1.144 ++    virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE;
   1.145 ++    virtual void generateFontMetrics(SkPaint::FontMetrics* mx,
   1.146 ++                                     SkPaint::FontMetrics* my) SK_OVERRIDE;
   1.147 ++    virtual SkUnichar generateGlyphToChar(uint16_t glyph) SK_OVERRIDE;
   1.148 ++private:
   1.149 ++    cairo_scaled_font_t* fScaledFont;
   1.150 ++    uint32_t fLoadGlyphFlags;
   1.151 ++};
   1.152 ++
   1.153 ++class CairoLockedFTFace {
   1.154 ++public:
   1.155 ++    CairoLockedFTFace(cairo_scaled_font_t* scaledFont)
   1.156 ++        : fScaledFont(scaledFont)
   1.157 ++        , fFace(cairo_ft_scaled_font_lock_face(scaledFont))
   1.158 ++    {}
   1.159 ++
   1.160 ++    ~CairoLockedFTFace()
   1.161 ++    {
   1.162 ++        cairo_ft_scaled_font_unlock_face(fScaledFont);
   1.163 ++    }
   1.164 ++
   1.165 ++    FT_Face getFace()
   1.166 ++    {
   1.167 ++        return fFace;
   1.168 ++    }
   1.169 ++
   1.170 ++private:
   1.171 ++    cairo_scaled_font_t* fScaledFont;
   1.172 ++    FT_Face fFace;
   1.173 ++};
   1.174 ++
   1.175 ++class SkCairoFTTypeface : public SkTypeface {
   1.176 ++public:
   1.177 ++    static SkTypeface* CreateTypeface(cairo_font_face_t* fontFace, SkTypeface::Style style, bool isFixedWidth) {
   1.178 ++        SkASSERT(fontFace != NULL);
   1.179 ++        SkASSERT(cairo_font_face_get_type(fontFace) == CAIRO_FONT_TYPE_FT);
   1.180 ++
   1.181 ++        SkFontID newId = SkTypefaceCache::NewFontID();
   1.182 ++
   1.183 ++        return SkNEW_ARGS(SkCairoFTTypeface, (fontFace, style, newId, isFixedWidth));
   1.184 ++    }
   1.185 ++
   1.186 ++    cairo_font_face_t* getFontFace() {
   1.187 ++        return fFontFace;
   1.188 ++    }
   1.189 ++
   1.190 ++    virtual SkStream* onOpenStream(int*) const SK_OVERRIDE { return NULL; }
   1.191 ++
   1.192 ++    virtual SkAdvancedTypefaceMetrics*
   1.193 ++        onGetAdvancedTypefaceMetrics(SkAdvancedTypefaceMetrics::PerGlyphInfo,
   1.194 ++                                     const uint32_t*, uint32_t) const SK_OVERRIDE
   1.195 ++    {
   1.196 ++        SkDEBUGCODE(SkDebugf("SkCairoFTTypeface::onGetAdvancedTypefaceMetrics unimplemented\n"));
   1.197 ++        return NULL;
   1.198 ++    }
   1.199 ++
   1.200 ++    virtual SkScalerContext* onCreateScalerContext(const SkDescriptor* desc) const SK_OVERRIDE
   1.201 ++    {
   1.202 ++        return SkNEW_ARGS(SkScalerContext_CairoFT, (const_cast<SkCairoFTTypeface*>(this), desc));
   1.203 ++    }
   1.204 ++
   1.205 ++    virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE
   1.206 ++    {
   1.207 ++        SkDEBUGCODE(SkDebugf("SkCairoFTTypeface::onFilterRec unimplemented\n"));
   1.208 ++    }
   1.209 ++
   1.210 ++    virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE
   1.211 ++    {
   1.212 ++        SkDEBUGCODE(SkDebugf("SkCairoFTTypeface::onGetFontDescriptor unimplemented\n"));
   1.213 ++    }
   1.214 ++
   1.215 ++
   1.216 ++private:
   1.217 ++
   1.218 ++    SkCairoFTTypeface(cairo_font_face_t* fontFace, SkTypeface::Style style, SkFontID id, bool isFixedWidth)
   1.219 ++        : SkTypeface(style, id, isFixedWidth)
   1.220 ++        , fFontFace(fontFace)
   1.221 ++    {
   1.222 ++        cairo_font_face_set_user_data(fFontFace, &kSkTypefaceKey, this, NULL);
   1.223 ++        cairo_font_face_reference(fFontFace);
   1.224 ++    }
   1.225 ++
   1.226 ++    ~SkCairoFTTypeface()
   1.227 ++    {
   1.228 ++        cairo_font_face_set_user_data(fFontFace, &kSkTypefaceKey, NULL, NULL);
   1.229 ++        cairo_font_face_destroy(fFontFace);
   1.230 ++    }
   1.231 ++
   1.232 ++    cairo_font_face_t* fFontFace;
   1.233 ++};
   1.234 ++
   1.235 ++SkTypeface* SkCreateTypefaceFromCairoFont(cairo_font_face_t* fontFace, SkTypeface::Style style, bool isFixedWidth)
   1.236 ++{
   1.237 ++    SkTypeface* typeface = reinterpret_cast<SkTypeface*>(cairo_font_face_get_user_data(fontFace, &kSkTypefaceKey));
   1.238 ++
   1.239 ++    if (typeface) {
   1.240 ++        typeface->ref();
   1.241 ++    } else {
   1.242 ++        typeface = SkCairoFTTypeface::CreateTypeface(fontFace, style, isFixedWidth);
   1.243 ++        SkTypefaceCache::Add(typeface, style);
   1.244 ++    }
   1.245 ++
   1.246 ++    return typeface;
   1.247 ++}
   1.248 ++
   1.249 ++SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
   1.250 ++                                     const char famillyName[],
   1.251 ++                                     SkTypeface::Style style)
   1.252 ++{
   1.253 ++    SkDEBUGFAIL("SkFontHost::FindTypeface unimplemented");
   1.254 ++    return NULL;
   1.255 ++}
   1.256 ++
   1.257 ++SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream*)
   1.258 ++{
   1.259 ++    SkDEBUGFAIL("SkFontHost::CreateTypeface unimplemented");
   1.260 ++    return NULL;
   1.261 ++}
   1.262 ++
   1.263 ++SkTypeface* SkFontHost::CreateTypefaceFromFile(char const*)
   1.264 ++{
   1.265 ++    SkDEBUGFAIL("SkFontHost::CreateTypefaceFromFile unimplemented");
   1.266 ++    return NULL;
   1.267 ++}
   1.268 ++
   1.269 ++///////////////////////////////////////////////////////////////////////////////
   1.270 ++
   1.271 ++static bool isLCD(const SkScalerContext::Rec& rec) {
   1.272 ++    switch (rec.fMaskFormat) {
   1.273 ++        case SkMask::kLCD16_Format:
   1.274 ++        case SkMask::kLCD32_Format:
   1.275 ++            return true;
   1.276 ++        default:
   1.277 ++            return false;
   1.278 ++    }
   1.279 ++}
   1.280 ++
   1.281 ++///////////////////////////////////////////////////////////////////////////////
   1.282 ++SkScalerContext_CairoFT::SkScalerContext_CairoFT(SkTypeface* typeface, const SkDescriptor* desc)
   1.283 ++    : SkScalerContext_FreeType_Base(typeface, desc)
   1.284 ++{
   1.285 ++    SkMatrix matrix;
   1.286 ++    fRec.getSingleMatrix(&matrix);
   1.287 ++
   1.288 ++    cairo_font_face_t* fontFace = static_cast<SkCairoFTTypeface*>(typeface)->getFontFace();
   1.289 ++
   1.290 ++    cairo_matrix_t fontMatrix, ctMatrix;
   1.291 ++    cairo_matrix_init(&fontMatrix, matrix.getScaleX(), matrix.getSkewY(), matrix.getSkewX(), matrix.getScaleY(), 0.0, 0.0);
   1.292 ++    cairo_matrix_init_scale(&ctMatrix, 1.0, 1.0);
   1.293 ++
   1.294 ++    // We need to ensure that the font options match for hinting, as generateMetrics()
   1.295 ++    // uses the fScaledFont which uses these font options
   1.296 ++    cairo_font_options_t *fontOptions = cairo_font_options_create();
   1.297 ++
   1.298 ++    FT_Int32 loadFlags = FT_LOAD_DEFAULT;
   1.299 ++
   1.300 ++    if (SkMask::kBW_Format == fRec.fMaskFormat) {
   1.301 ++        // See http://code.google.com/p/chromium/issues/detail?id=43252#c24
   1.302 ++        loadFlags = FT_LOAD_TARGET_MONO;
   1.303 ++        if (fRec.getHinting() == SkPaint::kNo_Hinting) {
   1.304 ++            cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_NONE);
   1.305 ++            loadFlags = FT_LOAD_NO_HINTING;
   1.306 ++        }
   1.307 ++    } else {
   1.308 ++        switch (fRec.getHinting()) {
   1.309 ++        case SkPaint::kNo_Hinting:
   1.310 ++            loadFlags = FT_LOAD_NO_HINTING;
   1.311 ++            cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_NONE);
   1.312 ++            break;
   1.313 ++        case SkPaint::kSlight_Hinting:
   1.314 ++            loadFlags = FT_LOAD_TARGET_LIGHT;  // This implies FORCE_AUTOHINT
   1.315 ++            cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_SLIGHT);
   1.316 ++            break;
   1.317 ++        case SkPaint::kNormal_Hinting:
   1.318 ++            cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_MEDIUM);
   1.319 ++            if (fRec.fFlags & SkScalerContext::kAutohinting_Flag) {
   1.320 ++                loadFlags = FT_LOAD_FORCE_AUTOHINT;
   1.321 ++            }
   1.322 ++            break;
   1.323 ++        case SkPaint::kFull_Hinting:
   1.324 ++            cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_FULL);
   1.325 ++            if (fRec.fFlags & SkScalerContext::kAutohinting_Flag) {
   1.326 ++                loadFlags = FT_LOAD_FORCE_AUTOHINT;
   1.327 ++            }
   1.328 ++            if (isLCD(fRec)) {
   1.329 ++                if (SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag)) {
   1.330 ++                    loadFlags = FT_LOAD_TARGET_LCD_V;
   1.331 ++                } else {
   1.332 ++                    loadFlags = FT_LOAD_TARGET_LCD;
   1.333 ++                }
   1.334 ++            }
   1.335 ++            break;
   1.336 ++        default:
   1.337 ++            SkDebugf("---------- UNKNOWN hinting %d\n", fRec.getHinting());
   1.338 ++            break;
   1.339 ++        }
   1.340 ++    }
   1.341 ++
   1.342 ++    fScaledFont = cairo_scaled_font_create(fontFace, &fontMatrix, &ctMatrix, fontOptions);
   1.343 ++
   1.344 ++    if ((fRec.fFlags & SkScalerContext::kEmbeddedBitmapText_Flag) == 0) {
   1.345 ++        loadFlags |= FT_LOAD_NO_BITMAP;
   1.346 ++    }
   1.347 ++
   1.348 ++    // Always using FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH to get correct
   1.349 ++    // advances, as fontconfig and cairo do.
   1.350 ++    // See http://code.google.com/p/skia/issues/detail?id=222.
   1.351 ++    loadFlags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH;
   1.352 ++
   1.353 ++    fLoadGlyphFlags = loadFlags;
   1.354 ++}
   1.355 ++
   1.356 ++SkScalerContext_CairoFT::~SkScalerContext_CairoFT()
   1.357 ++{
   1.358 ++    cairo_scaled_font_destroy(fScaledFont);
   1.359 ++}
   1.360 ++
   1.361 ++unsigned SkScalerContext_CairoFT::generateGlyphCount()
   1.362 ++{
   1.363 ++    CairoLockedFTFace faceLock(fScaledFont);
   1.364 ++    return faceLock.getFace()->num_glyphs;
   1.365 ++}
   1.366 ++
   1.367 ++uint16_t SkScalerContext_CairoFT::generateCharToGlyph(SkUnichar uniChar)
   1.368 ++{
   1.369 ++    CairoLockedFTFace faceLock(fScaledFont);
   1.370 ++    return SkToU16(FT_Get_Char_Index(faceLock.getFace(), uniChar));
   1.371 ++}
   1.372 ++
   1.373 ++void SkScalerContext_CairoFT::generateAdvance(SkGlyph* glyph)
   1.374 ++{
   1.375 ++    generateMetrics(glyph);
   1.376 ++}
   1.377 ++
   1.378 ++void SkScalerContext_CairoFT::generateMetrics(SkGlyph* glyph)
   1.379 ++{
   1.380 ++    SkASSERT(fScaledFont != NULL);
   1.381 ++    cairo_text_extents_t extents;
   1.382 ++    cairo_glyph_t cairoGlyph = { glyph->getGlyphID(fBaseGlyphCount), 0.0, 0.0 };
   1.383 ++    cairo_scaled_font_glyph_extents(fScaledFont, &cairoGlyph, 1, &extents);
   1.384 ++
   1.385 ++    glyph->fAdvanceX = SkDoubleToFixed(extents.x_advance);
   1.386 ++    glyph->fAdvanceY = SkDoubleToFixed(extents.y_advance);
   1.387 ++    glyph->fWidth = SkToU16(SkScalarCeil(extents.width));
   1.388 ++    glyph->fHeight = SkToU16(SkScalarCeil(extents.height));
   1.389 ++    glyph->fLeft = SkToS16(SkScalarCeil(extents.x_bearing));
   1.390 ++    glyph->fTop = SkToS16(SkScalarCeil(extents.y_bearing));
   1.391 ++    glyph->fLsbDelta = 0;
   1.392 ++    glyph->fRsbDelta = 0;
   1.393 ++}
   1.394 ++
   1.395 ++void SkScalerContext_CairoFT::generateImage(const SkGlyph& glyph)
   1.396 ++{
   1.397 ++    SkASSERT(fScaledFont != NULL);
   1.398 ++    CairoLockedFTFace faceLock(fScaledFont);
   1.399 ++    FT_Face face = faceLock.getFace();
   1.400 ++
   1.401 ++    FT_Error err = FT_Load_Glyph(face, glyph.getGlyphID(fBaseGlyphCount), fLoadGlyphFlags);
   1.402 ++
   1.403 ++    if (err != 0) {
   1.404 ++        memset(glyph.fImage, 0, glyph.rowBytes() * glyph.fHeight);
   1.405 ++        return;
   1.406 ++    }
   1.407 ++
   1.408 ++    generateGlyphImage(face, glyph);
   1.409 ++}
   1.410 ++
   1.411 ++void SkScalerContext_CairoFT::generatePath(const SkGlyph& glyph, SkPath* path)
   1.412 ++{
   1.413 ++    SkASSERT(fScaledFont != NULL);
   1.414 ++    CairoLockedFTFace faceLock(fScaledFont);
   1.415 ++    FT_Face face = faceLock.getFace();
   1.416 ++
   1.417 ++    SkASSERT(&glyph && path);
   1.418 ++
   1.419 ++    uint32_t flags = fLoadGlyphFlags;
   1.420 ++    flags |= FT_LOAD_NO_BITMAP; // ignore embedded bitmaps so we're sure to get the outline
   1.421 ++    flags &= ~FT_LOAD_RENDER;   // don't scan convert (we just want the outline)
   1.422 ++
   1.423 ++    FT_Error err = FT_Load_Glyph(face, glyph.getGlyphID(fBaseGlyphCount), flags);
   1.424 ++
   1.425 ++    if (err != 0) {
   1.426 ++        path->reset();
   1.427 ++        return;
   1.428 ++    }
   1.429 ++
   1.430 ++    generateGlyphPath(face, path);
   1.431 ++}
   1.432 ++
   1.433 ++void SkScalerContext_CairoFT::generateFontMetrics(SkPaint::FontMetrics* mx,
   1.434 ++                                                  SkPaint::FontMetrics* my)
   1.435 ++{
   1.436 ++    SkDEBUGCODE(SkDebugf("SkScalerContext_CairoFT::generateFontMetrics unimplemented\n"));
   1.437 ++}
   1.438 ++
   1.439 ++SkUnichar SkScalerContext_CairoFT::generateGlyphToChar(uint16_t glyph)
   1.440 ++{
   1.441 ++    SkASSERT(fScaledFont != NULL);
   1.442 ++    CairoLockedFTFace faceLock(fScaledFont);
   1.443 ++    FT_Face face = faceLock.getFace();
   1.444 ++
   1.445 ++    FT_UInt glyphIndex;
   1.446 ++    SkUnichar charCode = FT_Get_First_Char(face, &glyphIndex);
   1.447 ++    while (glyphIndex != 0) {
   1.448 ++        if (glyphIndex == glyph) {
   1.449 ++            return charCode;
   1.450 ++        }
   1.451 ++        charCode = FT_Get_Next_Char(face, charCode, &glyphIndex);
   1.452 ++    }
   1.453 ++
   1.454 ++    return 0;
   1.455 ++}
   1.456 ++
   1.457 ++#ifdef SK_BUILD_FOR_ANDROID
   1.458 ++SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID,
   1.459 ++                                         SkFontID origFontID) {
   1.460 ++    return NULL;
   1.461 ++}
   1.462 ++#endif
   1.463 ++
   1.464 ++///////////////////////////////////////////////////////////////////////////////
   1.465 ++
   1.466 ++#include "SkFontMgr.h"
   1.467 ++
   1.468 ++SkFontMgr* SkFontMgr::Factory() {
   1.469 ++    // todo
   1.470 ++    return NULL;
   1.471 ++}
   1.472 ++
   1.473 +-- 
   1.474 +1.7.11.7
   1.475 +

mercurial