1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2018 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#ifndef SkRemoteTypeface_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkRemoteTypeface_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAdvancedTypefaceMetrics.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDescriptor.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFontDescriptor.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFontStyle.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkScalerContext.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypeface.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include <thread>
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkTypefaceProxy;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkRemoteScalerContext {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~SkRemoteScalerContext() {}
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // TODO: do metrics need effects?
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void generateFontMetrics(
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkTypefaceProxy& tf,
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalerContextRec& rec,
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint::FontMetrics*) = 0;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void generateMetrics(
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkTypefaceProxy& tf,
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalerContextRec& rec,
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkGlyph* glyph) = 0;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void generateImage(
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkTypefaceProxy& tf,
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalerContextRec& rec,
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkGlyph& glyph)  = 0;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void generatePath(
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkTypefaceProxy& tf,
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalerContextRec& rec,
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkGlyphID glyph, SkPath* path) = 0;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkScalerContextProxy : public SkScalerContext {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalerContextProxy(
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkTypeface> tf,
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkScalerContextEffects& effects,
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkDescriptor* desc,
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRemoteScalerContext* rsc);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    unsigned generateGlyphCount(void) override { SK_ABORT("Should never be called."); return 0;}
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint16_t generateCharToGlyph(SkUnichar uni) override {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateAdvance(SkGlyph* glyph) override { this->generateMetrics(glyph); }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateMetrics(SkGlyph* glyph) override;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateImage(const SkGlyph& glyph) override;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generatePath(SkGlyphID glyphID, SkPath* path) override;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void generateFontMetrics(SkPaint::FontMetrics* metrics) override;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypefaceProxy* typefaceProxy();
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRemoteScalerContext* const fRemote;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkScalerContext INHERITED;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkTypefaceProxy : public SkTypeface {
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypefaceProxy(
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkFontID fontId,
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            std::thread::id threadId,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkFontStyle& style,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bool isFixed,
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRemoteScalerContext* rsc)
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            : INHERITED{style, false}
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fFontId{fontId}
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fThreadId{threadId}
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fRsc{rsc} { }
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkFontID fontID() const {return fFontId;}
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onGetUPEM() const override { SK_ABORT("Should never be called."); return 0; }
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkStreamAsset* onOpenStream(int* ttcIndex) const override {
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkFontData> onMakeFontData() const override {
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     int coordinateCount) const override {
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onGetFamilyName(SkString* familyName) const override {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onGetTableTags(SkFontTableTag tags[]) const override {
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const override {
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalerContext* onCreateScalerContext(const SkScalerContextEffects& effects,
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           const SkDescriptor* desc) const override {
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        //std::cout << fFontId << fThreadId;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return new SkScalerContextProxy(sk_ref_sp(const_cast<SkTypefaceProxy*>(this)), effects,
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         desc, fRsc);
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onFilterRec(SkScalerContextRec* rec) const override {
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Add all the device information here.
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        //rec->fPost2x2[0][0] = 0.5f;
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // This would be the best place to run the host SkTypeface_* onFilterRec.
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Can we move onFilterRec to the FongMgr, that way we don't need to cross the boundary to
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // filter.
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onGetFontDescriptor(SkFontDescriptor*, bool*) const override {
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override {
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onCharsToGlyphs(const void* chars, Encoding,
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        uint16_t glyphs[], int glyphCount) const override {
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onCountGlyphs() const override {
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return 0;
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void* onGetCTFontRef() const override {
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("Should never be called.");
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkFontID fFontId;
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const std::thread::id fThreadId;
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRemoteScalerContext* const fRsc;
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkTypeface INHERITED;
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif  // SkRemoteTypeface_DEFINED
160