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