1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 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 SkFont_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkFont_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRefCnt.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkScalar.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPaint; 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkTypeface; 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum SkTextEncoding { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUTF8_SkTextEncoding, 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUTF16_SkTextEncoding, 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUTF32_SkTextEncoding, 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGlyphID_SkTextEncoding, 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1. The Hinting enum in SkPaint is gone entirely, absorbed into SkFont's flags. 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 2. SkPaint Flags look like this today 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum Flags { 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDither_Flag = 0x04, //!< mask to enable dithering 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUnderlineText_Flag = 0x08, //!< mask to enable underline text 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLinearText_Flag = 0x40, //!< mask to enable linear-text 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDevKernText_Flag = 0x100, //!< mask to enable device kerning text 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kVerticalText_Flag = 0x1000, 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFont would absorb these: 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLinearText_Flag = 0x40, //!< mask to enable linear-text 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDevKernText_Flag = 0x100, //!< mask to enable device kerning text 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kVerticalText_Flag = 0x1000, 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot leaving these still in paint 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDither_Flag = 0x04, //!< mask to enable dithering 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUnderlineText_Flag = 0x08, //!< mask to enable underline text 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 3. Antialiasing 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFont has a mask-type: BW, AA, LCD 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint has antialias boolean 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot What to do if the font's mask-type disagrees with the paint? 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkFont : public SkRefCnt { 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum Flags { 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use the system's automatic hinting mechanism to hint the typeface. 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This is a last resort hinting method applied only if other hinting methods do not apply. 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * TODO: where to put auto-normal vs auto-light? 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEnableAutoHints_Flag = 1 << 0, 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the typeface contains explicit bytecodes for hinting, use them. 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If both bytecode and auto hints are specified, attempt to use the bytecodes first; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * if that fails (e.g. there are no codes), then attempt to autohint. 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEnableByteCodeHints_Flag = 1 << 1, 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the typeface contains explicit bitmaps for hinting, use them. 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If both bytecode and auto hints are also specified, attempt to use the bitmaps first; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * if that fails (e.g. there are no bitmaps), then attempt to bytecode or autohint. 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEmbeddedBitmaps_Flag = 1 << 2, 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use rounded metric values (e.g. advance). 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If either auto or bytecode hinting was used, apply those results to the metrics of the 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * glyphs as well. If no hinting was applied, the metrics will just be rounded to the 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * nearest integer. 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This applies to calls that return metrics (e.g. measureText) and to drawing the glyphs 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * (see SkCanvas drawText and drawPosText). 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUseNonlinearMetrics_Flag = 1 << 3, 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kVertical_Flag = 1 << 4, 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGenA8FromLCD_Flag = 1 << 5, 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kEmbolden_Flag = 1 << 6, 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDevKern_Flag = 1 << 7, // ifdef ANDROID ? 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum MaskType { 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBW_MaskType, 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kA8_MaskType, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLCD_MaskType, 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, MaskType, uint32_t flags); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX, 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot MaskType, uint32_t flags); 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a font with the same attributes of this font, but with the specified size. 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If size is not supported (e.g. <= 0 or non-finite) NULL will be returned. 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkFont> makeWithSize(SkScalar size) const; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Return a font with the same attributes of this font, but with the flags. 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkFont> makeWithFlags(uint32_t newFlags) const; 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* getTypeface() const { return fTypeface.get(); } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar getSize() const { return fSize; } 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar getScaleX() const { return fScaleX; } 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar getSkewX() const { return fSkewX; } 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t getFlags() const { return fFlags; } 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot MaskType getMaskType() const { return (MaskType)fMaskType; } 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isVertical() const { return SkToBool(fFlags & kVertical_Flag); } 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isEmbolden() const { return SkToBool(fFlags & kEmbolden_Flag); } 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isEnableAutoHints() const { return SkToBool(fFlags & kEnableAutoHints_Flag); } 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isEnableByteCodeHints() const { return SkToBool(fFlags & kEnableByteCodeHints_Flag); } 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isUseNonLinearMetrics() const { return SkToBool(fFlags & kUseNonlinearMetrics_Flag); } 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isDevKern() const { return SkToBool(fFlags & kDevKern_Flag); } 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding, 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkGlyphID glyphs[], int maxGlyphCount) const; 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int countText(const void* text, size_t byteLength, SkTextEncoding encoding) { 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->textToGlyphs(text, byteLength, encoding, nullptr, 0); 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding) const; 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static sk_sp<SkFont> Testing_CreateFromPaint(const SkPaint&); 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAllFlags = 0xFF, 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFont(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType, 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t flags); 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> fTypeface; 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fSize; 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fScaleX; 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fSkewX; 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint16_t fFlags; 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t fMaskType; 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// uint8_t fPad; 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 177