1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAdvancedTypefaceMetrics.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGlyph.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkMakeUnique.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandomScalerContext.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkDescriptor;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkRandomScalerContext : public SkScalerContext {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandomScalerContext(sk_sp<SkRandomTypeface>, const SkScalerContextEffects&,
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkDescriptor*, bool fFakeIt);
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    unsigned generateGlyphCount() override;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint16_t generateCharToGlyph(SkUnichar) override;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateAdvance(SkGlyph*) override;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateMetrics(SkGlyph*) override;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateImage(const SkGlyph&) override;
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generatePath(SkGlyphID, SkPath*) override;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateFontMetrics(SkPaint::FontMetrics*) override;
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandomTypeface* getRandomTypeface() const {
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return static_cast<SkRandomTypeface*>(this->getTypeface());
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkScalerContext> fProxy;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fFakeIt;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkRandomScalerContext::SkRandomScalerContext(sk_sp<SkRandomTypeface> face,
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkScalerContextEffects& effects,
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkDescriptor* desc,
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             bool fakeIt)
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : SkScalerContext(std::move(face), effects, desc)
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fFakeIt(fakeIt) {
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy = this->getRandomTypeface()->proxy()->createScalerContext(effects, desc);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotunsigned SkRandomScalerContext::generateGlyphCount() {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->getGlyphCount();
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotuint16_t SkRandomScalerContext::generateCharToGlyph(SkUnichar uni) {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->charToGlyphID(uni);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomScalerContext::generateAdvance(SkGlyph* glyph) {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->getAdvance(glyph);
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomScalerContext::generateMetrics(SkGlyph* glyph) {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Here we will change the mask format of the glyph
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // NOTE this is being overridden by the base class
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMask::Format format = SkMask::kARGB32_Format; // init to handle defective compilers
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    switch (glyph->getGlyphID() % 4) {
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 0:
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kLCD16_Format;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 1:
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kA8_Format;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 2:
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kARGB32_Format;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 3:
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kBW_Format;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->getMetrics(glyph);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    glyph->fMaskFormat = format;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fFakeIt) {
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (SkMask::kARGB32_Format == format) {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath path;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fProxy->getPath(glyph->getPackedID(), &path);
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect storage;
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkPaint& paint = this->getRandomTypeface()->paint();
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect& newBounds = paint.doComputeFastBounds(path.getBounds(),
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            &storage,
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            SkPaint::kFill_Style);
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect ibounds;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        newBounds.roundOut(&ibounds);
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fLeft = ibounds.fLeft;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fTop = ibounds.fTop;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fWidth = ibounds.width();
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fHeight = ibounds.height();
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath      devPath, fillPath;
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkMatrix    fillToDevMatrix;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->internalGetPath(glyph->getPackedID(), &fillPath, &devPath, &fillToDevMatrix);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // just use devPath
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkIRect ir = devPath.getBounds().roundOut();
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (ir.isEmpty() || !ir.is16Bit()) {
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            glyph->fLeft    = 0;
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            glyph->fTop     = 0;
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            glyph->fWidth   = 0;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            glyph->fHeight  = 0;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fLeft    = ir.fLeft;
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fTop     = ir.fTop;
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fWidth   = SkToU16(ir.width());
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        glyph->fHeight  = SkToU16(ir.height());
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (glyph->fWidth > 0) {
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            switch (glyph->fMaskFormat) {
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case SkMask::kLCD16_Format:
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                glyph->fWidth += 2;
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                glyph->fLeft -= 1;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            default:
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomScalerContext::generateImage(const SkGlyph& glyph) {
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMask::Format format = (SkMask::Format)glyph.fMaskFormat;
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    switch (glyph.getGlyphID() % 4) {
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 0:
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kLCD16_Format;
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 1:
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kA8_Format;
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 2:
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kARGB32_Format;
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 3:
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            format = SkMask::kBW_Format;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const_cast<SkGlyph&>(glyph).fMaskFormat = format;
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // if the format is ARGB, we just draw the glyph from path ourselves.  Otherwise, we force
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // our proxy context to generate the image from paths.
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fFakeIt) {
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SkMask::kARGB32_Format == glyph.fMaskFormat) {
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPath path;
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fProxy->getPath(glyph.getPackedID(), &path);
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBitmap bm;
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.installPixels(SkImageInfo::MakeN32Premul(glyph.fWidth, glyph.fHeight),
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             glyph.fImage, glyph.rowBytes());
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bm.eraseColor(0);
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkCanvas canvas(bm);
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas.translate(-SkIntToScalar(glyph.fLeft),
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             -SkIntToScalar(glyph.fTop));
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas.drawPath(path, this->getRandomTypeface()->paint());
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fProxy->forceGenerateImageFromPath();
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fProxy->getImage(glyph);
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fProxy->forceOffGenerateImageFromPath();
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_bzero(glyph.fImage, glyph.computeImageSize());
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomScalerContext::generatePath(SkGlyphID glyph, SkPath* path) {
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->generatePath(glyph, path);
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomScalerContext::generateFontMetrics(SkPaint::FontMetrics* metrics) {
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->getFontMetrics(metrics);
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypefaceCache.h"
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkRandomTypeface::SkRandomTypeface(sk_sp<SkTypeface> proxy, const SkPaint& paint, bool fakeIt)
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : SkTypeface(proxy->fontStyle(), false)
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fProxy(std::move(proxy))
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fPaint(paint)
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fFakeIt(fakeIt) {}
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkScalerContext* SkRandomTypeface::onCreateScalerContext(const SkScalerContextEffects& effects,
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         const SkDescriptor* desc) const {
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return new SkRandomScalerContext(sk_ref_sp(const_cast<SkRandomTypeface*>(this)),
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     effects, desc, fFakeIt);
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomTypeface::onFilterRec(SkScalerContextRec* rec) const {
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->filterRec(rec);
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    rec->setHinting(SkPaint::kNo_Hinting);
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    rec->fMaskFormat = SkMask::kARGB32_Format;
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstd::unique_ptr<SkAdvancedTypefaceMetrics> SkRandomTypeface::onGetAdvancedMetrics() const {
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->getAdvancedMetrics();
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkStreamAsset* SkRandomTypeface::onOpenStream(int* ttcIndex) const {
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->openStream(ttcIndex);
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomTypeface::onGetFontDescriptor(SkFontDescriptor* desc,
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      bool* isLocal) const {
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->getFontDescriptor(desc, isLocal);
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint SkRandomTypeface::onCharsToGlyphs(const void* chars, Encoding encoding,
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 uint16_t glyphs[], int glyphCount) const {
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->charsToGlyphs(chars, encoding, glyphs, glyphCount);
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint SkRandomTypeface::onCountGlyphs() const {
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->countGlyphs();
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint SkRandomTypeface::onGetUPEM() const {
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->getUnitsPerEm();
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkRandomTypeface::onGetFamilyName(SkString* familyName) const {
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fProxy->getFamilyName(familyName);
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkTypeface::LocalizedStrings* SkRandomTypeface::onCreateFamilyNameIterator() const {
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->createFamilyNameIterator();
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint SkRandomTypeface::onGetVariationDesignPosition(
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot{
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->onGetVariationDesignPosition(coordinates, coordinateCount);
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint SkRandomTypeface::onGetTableTags(SkFontTableTag tags[]) const {
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->getTableTags(tags);
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsize_t SkRandomTypeface::onGetTableData(SkFontTableTag tag, size_t offset,
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    size_t length, void* data) const {
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fProxy->getTableData(tag, offset, length, data);
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
258