15fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark/*
25fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * Copyright 2014 Google Inc.
35fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark *
45fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * Use of this source code is governed by a BSD-style license that can be
55fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * found in the LICENSE file.
65fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark */
75fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
839a9a5069b25aa8b9529118cfd0ece5f412fb56breed#include "SkAdvancedTypefaceMetrics.h"
95fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkBitmap.h"
105fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkCanvas.h"
115fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkDescriptor.h"
12992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "SkFontDescriptor.h"
135fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkGlyph.h"
145fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkMask.h"
155fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark// #include "SkOTUtils.h"
165fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkScalerContext.h"
175fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkTestScalerContext.h"
185fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkTypefaceCache.h"
195fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
20992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSkTestFont::SkTestFont(const SkTestFontData& fontData)
21992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    : INHERITED()
22992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fCharCodes(fontData.fCharCodes)
23992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fCharCodesCount(fontData.fCharCodesCount)
24992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fWidths(fontData.fWidths)
25992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fMetrics(fontData.fMetrics)
26992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fName(fontData.fName)
27992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fPaths(NULL)
28992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark{
29992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    init(fontData.fPoints, fontData.fVerbs);
30992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#ifdef SK_DEBUG
31992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    sk_bzero(fDebugBits, sizeof(fDebugBits));
32992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    sk_bzero(fDebugOverage, sizeof(fDebugOverage));
33992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#endif
34992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
355fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
36992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSkTestFont::~SkTestFont() {
37992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (unsigned index = 0; index < fCharCodesCount; ++index) {
38992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkDELETE(fPaths[index]);
395fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
40992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkDELETE_ARRAY(fPaths);
41992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
425fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
43992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#ifdef SK_DEBUG
445fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
45992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "SkThread.h"
46992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSK_DECLARE_STATIC_MUTEX(gUsedCharsMutex);
475fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
48992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#endif
495fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
50992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkint SkTestFont::codeToIndex(SkUnichar charCode) const {
51992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#ifdef SK_DEBUG  // detect missing test font data
52992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {
53992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkAutoMutexAcquire ac(gUsedCharsMutex);
54992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (charCode >= ' ' && charCode <= '~') {
55992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            int bitOffset = charCode - ' ';
56992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fDebugBits[bitOffset >> 3] |= 1 << (bitOffset & 7);
57992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        } else {
58992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            int index = 0;
59992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            while (fDebugOverage[index] != 0 && fDebugOverage[index] != charCode
60992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    && index < (int) sizeof(fDebugOverage)) {
61992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                ++index;
62992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            }
63992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            SkASSERT(index < (int) sizeof(fDebugOverage));
64992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            if (fDebugOverage[index] == 0) {
65992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                fDebugOverage[index] = charCode;
66992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            }
67992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
685fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
69992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#endif
70992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (unsigned index = 0; index < fCharCodesCount; ++index) {
71992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (fCharCodes[index] == (unsigned) charCode) {
72992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            return (int) index;
73992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
745fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
75992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkDEBUGF(("missing '%c' (%d) from %s %d\n", (char) charCode, charCode,
76992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fDebugName, fDebugStyle));
77992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return 0;
78992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
795fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
80992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestFont::init(const SkScalar* pts, const unsigned char* verbs) {
81992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fPaths = SkNEW_ARRAY(SkPath*, fCharCodesCount);
82992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (unsigned index = 0; index < fCharCodesCount; ++index) {
83992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkPath* path = SkNEW(SkPath);
84992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkPath::Verb verb;
85992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        while ((verb = (SkPath::Verb) *verbs++) != SkPath::kDone_Verb) {
86992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            switch (verb) {
87992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                case SkPath::kMove_Verb:
88992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    path->moveTo(pts[0], pts[1]);
89992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    pts += 2;
90992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
91992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                case SkPath::kLine_Verb:
92992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    path->lineTo(pts[0], pts[1]);
93992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    pts += 2;
94992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
95992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                case SkPath::kQuad_Verb:
96992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    path->quadTo(pts[0], pts[1], pts[2], pts[3]);
97992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    pts += 4;
98992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
99992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                case SkPath::kCubic_Verb:
100992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    path->cubicTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);
101992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    pts += 6;
102992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
103992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                case SkPath::kClose_Verb:
104992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    path->close();
105992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
106992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                default:
107992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    SkDEBUGFAIL("bad verb");
108992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    return;
109992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            }
110992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
111992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fPaths[index] = path;
1125fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
113992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
114a4c4a2d8cd65abb1e5ac20813831cdb9ace6c7eebungeman
115a4c4a2d8cd65abb1e5ac20813831cdb9ace6c7eebungemanSkTestTypeface::SkTestTypeface(SkTestFont* testFont, const SkFontStyle& style)
116992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    : SkTypeface(style, SkTypefaceCache::NewFontID(), false)
117992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    , fTestFont(testFont) {
118992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1195fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
120992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::getAdvance(SkGlyph* glyph) {
121b69d0e0ac45e13f667bc11a937dcb547072bc93dherb    glyph->fAdvanceX = fTestFont->fWidths[glyph->getGlyphID()];
122992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    glyph->fAdvanceY = 0;
123992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1245fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
125992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::getFontMetrics(SkPaint::FontMetrics* metrics) {
126992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    *metrics = fTestFont->fMetrics;
127992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1285fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
129992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::getMetrics(SkGlyph* glyph) {
130b69d0e0ac45e13f667bc11a937dcb547072bc93dherb    glyph->fAdvanceX = fTestFont->fWidths[glyph->getGlyphID()];
131992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    glyph->fAdvanceY = 0;
132992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1335fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
134992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::getPath(const SkGlyph& glyph, SkPath* path) {
135b69d0e0ac45e13f667bc11a937dcb547072bc93dherb    *path = *fTestFont->fPaths[glyph.getGlyphID()];
136992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1375fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
138992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::onFilterRec(SkScalerContextRec* rec) const {
139992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    rec->setHinting(SkPaint::kNo_Hinting);
140992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    rec->fMaskFormat = SkMask::kA8_Format;
141992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1425fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
143992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSkAdvancedTypefaceMetrics* SkTestTypeface::onGetAdvancedTypefaceMetrics(
14439a9a5069b25aa8b9529118cfd0ece5f412fb56breed                                PerGlyphInfo ,
145992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                                const uint32_t* glyphIDs,
146992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                                uint32_t glyphIDsCount) const {
147992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark// pdf only
148992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics;
149992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fEmSize = 0;
150992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fLastGlyphID = SkToU16(onCountGlyphs() - 1);
151992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fStyle = 0;
152992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fFontName.set(fTestFont->fName);
153992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fType = SkAdvancedTypefaceMetrics::kOther_Font;
154992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fItalicAngle = 0;
155992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fAscent = 0;
156992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fDescent = 0;
157992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fStemV = 0;
158992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fCapHeight = 0;
159992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    info->fBBox = SkIRect::MakeEmpty();
160992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return info;
161992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1625fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
163992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkvoid SkTestTypeface::onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const {
164992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    desc->setFamilyName(fTestFont->fName);
165992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    *isLocal = false;
166992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1675fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
168992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkint SkTestTypeface::onCharsToGlyphs(const void* chars, Encoding encoding,
169992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                            uint16_t glyphs[], int glyphCount) const {
170992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkASSERT(encoding == kUTF16_Encoding);
171992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < glyphCount; ++index) {
172992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkUnichar ch = ((SkUnichar*) chars)[index];
173992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        glyphs[index] = fTestFont->codeToIndex(ch);
1745fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
175992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return glyphCount;
176992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
1775fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
178b374d6a62c0259387d90cad74753d8bad9ee1beabungemanvoid SkTestTypeface::onGetFamilyName(SkString* familyName) const {
179b374d6a62c0259387d90cad74753d8bad9ee1beabungeman    *familyName = fTestFont->fName;
180b374d6a62c0259387d90cad74753d8bad9ee1beabungeman}
181b374d6a62c0259387d90cad74753d8bad9ee1beabungeman
182992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSkTypeface::LocalizedStrings* SkTestTypeface::onCreateFamilyNameIterator() const {
183992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString familyName(fTestFont->fName);
184992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString language("und"); //undetermined
185992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkSkASSERT(0);  // incomplete
186992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return NULL;
187992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark//     return new SkOTUtils::LocalizedStrings_SingleName(familyName, language);
1885fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
1895fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
1905fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkclass SkTestScalerContext : public SkScalerContext {
1915fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkpublic:
1925fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    SkTestScalerContext(SkTestTypeface* face, const SkDescriptor* desc)
1935fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        : SkScalerContext(face, desc)
1945fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        , fFace(face)
1955fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    {
1965fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fRec.getSingleMatrix(&fMatrix);
1975fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        this->forceGenerateImageFromPath();
1985fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
1995fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2005fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    virtual ~SkTestScalerContext() {
2015fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2025fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2035fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkprotected:
20436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    unsigned generateGlyphCount() override {
2055fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        return fFace->onCountGlyphs();
2065fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2075fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
20836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    uint16_t generateCharToGlyph(SkUnichar uni) override {
2095fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        uint16_t glyph;
210992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        (void) fFace->onCharsToGlyphs((const void *) &uni, SkTypeface::kUTF16_Encoding, &glyph, 1);
2115fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        return glyph;
2125fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2135fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
21436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateAdvance(SkGlyph* glyph) override {
2155fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getAdvance(glyph);
2165fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
21711fa2247b747eb75e2f158dc7571d458ed6c0115reed        const SkVector advance = fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX),
21811fa2247b747eb75e2f158dc7571d458ed6c0115reed                                               SkFixedToScalar(glyph->fAdvanceY));
2195fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fAdvanceX = SkScalarToFixed(advance.fX);
2205fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fAdvanceY = SkScalarToFixed(advance.fY);
2215fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2225fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
22336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateMetrics(SkGlyph* glyph) override {
2245fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getMetrics(glyph);
2255fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
22611fa2247b747eb75e2f158dc7571d458ed6c0115reed        const SkVector advance = fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX),
22711fa2247b747eb75e2f158dc7571d458ed6c0115reed                                               SkFixedToScalar(glyph->fAdvanceY));
2285fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fAdvanceX = SkScalarToFixed(advance.fX);
2295fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fAdvanceY = SkScalarToFixed(advance.fY);
2305fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2315fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPath path;
2325fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getPath(*glyph, &path);
2335fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        path.transform(fMatrix);
2345fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2355fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkRect storage;
2365fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        const SkPaint paint;
2375fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(),
2385fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                                                            &storage,
2395fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                                                            SkPaint::kFill_Style);
2405fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkIRect ibounds;
2415fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        newBounds.roundOut(&ibounds);
2425fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fLeft = ibounds.fLeft;
2435fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fTop = ibounds.fTop;
2445fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fWidth = ibounds.width();
2455fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fHeight = ibounds.height();
2465fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        glyph->fMaskFormat = SkMask::kARGB32_Format;
2475fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2485fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
24936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateImage(const SkGlyph& glyph) override {
2505fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPath path;
2515fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getPath(glyph, &path);
2525fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2535fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkBitmap bm;
2545fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        bm.installPixels(SkImageInfo::MakeN32Premul(glyph.fWidth, glyph.fHeight),
2555fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                            glyph.fImage, glyph.rowBytes());
2565fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        bm.eraseColor(0);
2575fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2585fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkCanvas canvas(bm);
2595fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        canvas.translate(-SkIntToScalar(glyph.fLeft),
2605fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                            -SkIntToScalar(glyph.fTop));
2615fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        canvas.concat(fMatrix);
2625fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPaint paint;
2635fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        paint.setAntiAlias(true);
2645fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        canvas.drawPath(path, paint);
2655fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2665fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
26736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generatePath(const SkGlyph& glyph, SkPath* path) override {
2685fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getPath(glyph, path);
2695fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        path->transform(fMatrix);
2705fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2715fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
27236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateFontMetrics(SkPaint::FontMetrics* metrics) override {
2735fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        fFace->getFontMetrics(metrics);
2745fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        if (metrics) {
2755fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            SkScalar scale = fMatrix.getScaleY();
2765fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fTop = SkScalarMul(metrics->fTop, scale);
2775fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fAscent = SkScalarMul(metrics->fAscent, scale);
2785fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fDescent = SkScalarMul(metrics->fDescent, scale);
2795fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fBottom = SkScalarMul(metrics->fBottom, scale);
2805fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fLeading = SkScalarMul(metrics->fLeading, scale);
2815fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale);
2825fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fXMin = SkScalarMul(metrics->fXMin, scale);
2835fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fXMax = SkScalarMul(metrics->fXMax, scale);
2845fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale);
2855fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        }
2865fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
2875fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2885fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkprivate:
2895fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    SkTestTypeface*  fFace;
2905fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    SkMatrix         fMatrix;
2915fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark};
2925fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
2935fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkSkScalerContext* SkTestTypeface::onCreateScalerContext(const SkDescriptor* desc) const {
2945fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    return SkNEW_ARGS(SkTestScalerContext, (const_cast<SkTestTypeface*>(this), desc));
2955fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
296