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