1d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com/* 2d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com * Copyright 2013 Google Inc. 3d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com * 4d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com * Use of this source code is governed by a BSD-style license that can be 5d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com * found in the LICENSE file. 6d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com */ 7d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 8d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkGScalerContext.h" 9d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkGlyph.h" 10d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkPath.h" 11d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkCanvas.h" 12d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 13d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comclass SkGScalerContext : public SkScalerContext { 14d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.compublic: 15d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkGScalerContext(SkGTypeface*, const SkDescriptor*); 16d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual ~SkGScalerContext(); 179a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 18d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comprotected: 19d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual unsigned generateGlyphCount() SK_OVERRIDE; 20d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual uint16_t generateCharToGlyph(SkUnichar) SK_OVERRIDE; 21d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual void generateAdvance(SkGlyph*) SK_OVERRIDE; 22d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual void generateMetrics(SkGlyph*) SK_OVERRIDE; 23d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual void generateImage(const SkGlyph&) SK_OVERRIDE; 24d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual void generatePath(const SkGlyph&, SkPath*) SK_OVERRIDE; 25d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual void generateFontMetrics(SkPaint::FontMetrics* mX, 26d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPaint::FontMetrics* mY) SK_OVERRIDE; 279a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 28d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comprivate: 29d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkGTypeface* fFace; 30d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkScalerContext* fProxy; 31d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkMatrix fMatrix; 32d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com}; 33d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 34d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#define STD_SIZE 1 35d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 36d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkDescriptor.h" 37d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 38d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkGScalerContext::SkGScalerContext(SkGTypeface* face, const SkDescriptor* desc) 39d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com : SkScalerContext(face, desc) 40d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com , fFace(face) 41d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com{ 42d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 43d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com size_t descSize = SkDescriptor::ComputeOverhead(1) + sizeof(SkScalerContext::Rec); 44d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkAutoDescriptor ad(descSize); 45d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkDescriptor* newDesc = ad.getDesc(); 46d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 47d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com newDesc->init(); 48d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com void* entry = newDesc->addEntry(kRec_SkDescriptorTag, 49d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com sizeof(SkScalerContext::Rec), &fRec); 50d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com { 51d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkScalerContext::Rec* rec = (SkScalerContext::Rec*)entry; 52d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com rec->fTextSize = STD_SIZE; 53d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com rec->fPreScaleX = SK_Scalar1; 54d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com rec->fPreSkewX = 0; 55d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1; 56d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com rec->fPost2x2[1][0] = rec->fPost2x2[0][1] = 0; 57d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } 58d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkASSERT(descSize == newDesc->getLength()); 59d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com newDesc->computeChecksum(); 60d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 61d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy = face->proxy()->createScalerContext(newDesc); 62d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 63d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fRec.getSingleMatrix(&fMatrix); 64d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fMatrix.preScale(SK_Scalar1 / STD_SIZE, SK_Scalar1 / STD_SIZE); 65d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 66d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 67d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkGScalerContext::~SkGScalerContext() { 68d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkDELETE(fProxy); 69d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 70d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 71d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comunsigned SkGScalerContext::generateGlyphCount() { 72d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->getGlyphCount(); 73d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 74d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 75d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comuint16_t SkGScalerContext::generateCharToGlyph(SkUnichar uni) { 76d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->charToGlyphID(uni); 77d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 78d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 79d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGScalerContext::generateAdvance(SkGlyph* glyph) { 80d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getAdvance(glyph); 819a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 82d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkVector advance; 83d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX), 84d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkFixedToScalar(glyph->fAdvanceY), &advance); 85d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fAdvanceX = SkScalarToFixed(advance.fX); 86d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fAdvanceY = SkScalarToFixed(advance.fY); 87d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 88d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 89d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGScalerContext::generateMetrics(SkGlyph* glyph) { 90d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getMetrics(glyph); 91d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 92d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkVector advance; 93d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fMatrix.mapXY(SkFixedToScalar(glyph->fAdvanceX), 94d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkFixedToScalar(glyph->fAdvanceY), &advance); 95d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fAdvanceX = SkScalarToFixed(advance.fX); 96d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fAdvanceY = SkScalarToFixed(advance.fY); 97d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 98d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPath path; 99d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getPath(*glyph, &path); 100d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com path.transform(fMatrix); 101d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 102d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkRect storage; 103d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com const SkPaint& paint = fFace->paint(); 104d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(), 105d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com &storage, 106d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPaint::kFill_Style); 107d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkIRect ibounds; 108d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com newBounds.roundOut(&ibounds); 109d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fLeft = ibounds.fLeft; 110d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fTop = ibounds.fTop; 111d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fWidth = ibounds.width(); 112d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fHeight = ibounds.height(); 113d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph->fMaskFormat = SkMask::kARGB32_Format; 114d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 115d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 116d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGScalerContext::generateImage(const SkGlyph& glyph) { 117d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com if (SkMask::kARGB32_Format == glyph.fMaskFormat) { 118d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPath path; 119d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getPath(glyph, &path); 1209a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 121d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkBitmap bm; 122d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com bm.setConfig(SkBitmap::kARGB_8888_Config, glyph.fWidth, glyph.fHeight, 123d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com glyph.rowBytes()); 124d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com bm.setPixels(glyph.fImage); 125d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com bm.eraseColor(0); 1269a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 127d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkCanvas canvas(bm); 128817c08145760e96ff2fc7772b6b2821b9df9575dreed@google.com canvas.translate(-SkIntToScalar(glyph.fLeft), 129817c08145760e96ff2fc7772b6b2821b9df9575dreed@google.com -SkIntToScalar(glyph.fTop)); 130d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com canvas.concat(fMatrix); 131d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com canvas.drawPath(path, fFace->paint()); 132d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } else { 133d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getImage(glyph); 134d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } 135d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 136d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 137d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGScalerContext::generatePath(const SkGlyph& glyph, SkPath* path) { 138d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getPath(glyph, path); 139d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com path->transform(fMatrix); 140d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 141d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 142d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGScalerContext::generateFontMetrics(SkPaint::FontMetrics*, 143d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPaint::FontMetrics* metrics) { 144d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getFontMetrics(metrics); 145d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com if (metrics) { 146d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkScalar scale = fMatrix.getScaleY(); 147d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fTop = SkScalarMul(metrics->fTop, scale); 148d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fAscent = SkScalarMul(metrics->fAscent, scale); 149d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fDescent = SkScalarMul(metrics->fDescent, scale); 150d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fBottom = SkScalarMul(metrics->fBottom, scale); 151d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fLeading = SkScalarMul(metrics->fLeading, scale); 152d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fAvgCharWidth = SkScalarMul(metrics->fAvgCharWidth, scale); 153d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fXMin = SkScalarMul(metrics->fXMin, scale); 154d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fXMax = SkScalarMul(metrics->fXMax, scale); 155d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com metrics->fXHeight = SkScalarMul(metrics->fXHeight, scale); 156d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } 157d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 158d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 159d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com/////////////////////////////////////////////////////////////////////////////// 160d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 161d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#include "SkTypefaceCache.h" 162d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 163d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkGTypeface::SkGTypeface(SkTypeface* proxy, const SkPaint& paint) 164d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com : SkTypeface(proxy->style(), SkTypefaceCache::NewFontID(), false) 165d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com , fProxy(SkRef(proxy)) 166d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com , fPaint(paint) {} 167d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 168d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkGTypeface::~SkGTypeface() { 169d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->unref(); 170d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 171d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 172d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkScalerContext* SkGTypeface::onCreateScalerContext( 173d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com const SkDescriptor* desc) const { 174d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return SkNEW_ARGS(SkGScalerContext, (const_cast<SkGTypeface*>(this), desc)); 175d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 176d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 177d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGTypeface::onFilterRec(SkScalerContextRec* rec) const { 178d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->filterRec(rec); 179d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 180d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 181d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkAdvancedTypefaceMetrics* SkGTypeface::onGetAdvancedTypefaceMetrics( 182d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkAdvancedTypefaceMetrics::PerGlyphInfo info, 183d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com const uint32_t* glyphIDs, 184d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com uint32_t glyphIDsCount) const { 185d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->getAdvancedTypefaceMetrics(info, glyphIDs, glyphIDsCount); 186d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 187d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 188d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comSkStream* SkGTypeface::onOpenStream(int* ttcIndex) const { 189d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->openStream(ttcIndex); 190d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 191d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 192d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comvoid SkGTypeface::onGetFontDescriptor(SkFontDescriptor* desc, 193d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com bool* isLocal) const { 194d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com fProxy->getFontDescriptor(desc, isLocal); 195d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 196d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 197b948d6f0934a94ce6b0bf3c53c3fa4be61ee54c2bungeman@google.comint SkGTypeface::onCountGlyphs() const { 198b948d6f0934a94ce6b0bf3c53c3fa4be61ee54c2bungeman@google.com return fProxy->countGlyphs(); 199b948d6f0934a94ce6b0bf3c53c3fa4be61ee54c2bungeman@google.com} 200b948d6f0934a94ce6b0bf3c53c3fa4be61ee54c2bungeman@google.com 201d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comint SkGTypeface::onGetUPEM() const { 202d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->getUnitsPerEm(); 203d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 204d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 2056e20a74d8cbcf19195559e8d98896fa22ebc535fbungeman@google.comSkTypeface::LocalizedStrings* SkGTypeface::onCreateFamilyNameIterator() const { 2066e20a74d8cbcf19195559e8d98896fa22ebc535fbungeman@google.com return fProxy->createFamilyNameIterator(); 207ee8341d57355c54ea8db5fb21be75e7354069fb3bungeman@google.com} 208ee8341d57355c54ea8db5fb21be75e7354069fb3bungeman@google.com 209d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comint SkGTypeface::onGetTableTags(SkFontTableTag tags[]) const { 210d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->getTableTags(tags); 211d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 212d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 213d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comsize_t SkGTypeface::onGetTableData(SkFontTableTag tag, size_t offset, 214d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com size_t length, void* data) const { 215d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fProxy->getTableData(tag, offset, length, data); 216d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com} 217d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 218836008c1588a111f090a606726822d62d3026e00reed@google.comSkTypeface* SkGTypeface::onRefMatchingStyle(Style style) const { 219836008c1588a111f090a606726822d62d3026e00reed@google.com if (this->style() == style) { 220836008c1588a111f090a606726822d62d3026e00reed@google.com return const_cast<SkGTypeface*>(SkRef(this)); 221836008c1588a111f090a606726822d62d3026e00reed@google.com } 222836008c1588a111f090a606726822d62d3026e00reed@google.com 223836008c1588a111f090a606726822d62d3026e00reed@google.com SkAutoTUnref<SkTypeface> other(fProxy->refMatchingStyle(style)); 224836008c1588a111f090a606726822d62d3026e00reed@google.com return SkNEW_ARGS(SkGTypeface, (other, fPaint)); 225836008c1588a111f090a606726822d62d3026e00reed@google.com} 226836008c1588a111f090a606726822d62d3026e00reed@google.com 227d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com/////////////////////////////////////////////////////////////////////////////// 228d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 229d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#if 0 230d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com// under construction -- defining a font purely in terms of skia primitives 231d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com// ala an SVG-font. 232d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comclass SkGFont : public SkRefCnt { 233d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.compublic: 234d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com virtual ~SkGFont(); 2359a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 236d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com int unicharToGlyph(SkUnichar) const; 2379a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 238d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com int countGlyphs() const { return fCount; } 2399a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 240d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com float getAdvance(int index) const { 241d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkASSERT((unsigned)index < (unsigned)fCount); 242d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fGlyphs[index].fAdvance; 243d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } 2449a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 245d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com const SkPath& getPath(int index) const { 246d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkASSERT((unsigned)index < (unsigned)fCount); 247d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com return fGlyphs[index].fPath; 248d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com } 2499a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 250d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comprivate: 251d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com struct Glyph { 252d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkUnichar fUni; 253d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com float fAdvance; 254d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkPath fPath; 255d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com }; 256d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com int fCount; 257d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com Glyph* fGlyphs; 2589a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 259d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com friend class SkGFontBuilder; 260d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com SkGFont(int count, Glyph* array); 261d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com}; 262d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com 263d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.comclass SkGFontBuilder { 264d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.compublic: 2659a5c2d9d22a4c746bc7af32a14e55d5264952200skia.committer@gmail.com 266d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com}; 267d99807c4fc926df9e8ddf102afcb90726ec64f9ereed@google.com#endif 268