SkRandomScalerContext.cpp revision fe17456d5e528078ce69b5f15cf7adf1fab963f
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