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