143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com/* 243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Copyright 2014 Google Inc. 343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * 443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Use of this source code is governed by a BSD-style license that can be 543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * found in the LICENSE file. 643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 87ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org#ifndef SkFont_DEFINED 97ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org#define SkFont_DEFINED 107ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org 1143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com#include "SkRefCnt.h" 1243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com#include "SkScalar.h" 1343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 1443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comclass SkPaint; 1543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comclass SkTypeface; 1643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 1743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comenum SkTextEncoding { 1843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUTF8_SkTextEncoding, 1943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUTF16_SkTextEncoding, 2043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUTF32_SkTextEncoding, 2143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kGlyphID_SkTextEncoding, 2243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com}; 2343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 2443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com/* 2543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 1. The Hinting enum in SkPaint is gone entirely, absorbed into SkFont's flags. 26e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 2743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 2. SkPaint Flags look like this today 28e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 2943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum Flags { 3043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing 3143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDither_Flag = 0x04, //!< mask to enable dithering 3243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUnderlineText_Flag = 0x08, //!< mask to enable underline text 3343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text 3443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text 3543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLinearText_Flag = 0x40, //!< mask to enable linear-text 3643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning 3743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDevKernText_Flag = 0x100, //!< mask to enable device kerning text 3843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering 3943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes 4043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter 4143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kVerticalText_Flag = 0x1000, 4243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it 4343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 4443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 4543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkFont would absorb these: 46e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 4743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text 4843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLinearText_Flag = 0x40, //!< mask to enable linear-text 4943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning 5043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDevKernText_Flag = 0x100, //!< mask to enable device kerning text 5143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering 5243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes 5343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter 5443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kVerticalText_Flag = 0x1000, 5543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it 5643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 5743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com leaving these still in paint 5843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 5943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing 6043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDither_Flag = 0x04, //!< mask to enable dithering 6143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUnderlineText_Flag = 0x08, //!< mask to enable underline text 6243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text 6343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 6443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 3. Antialiasing 65e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 6643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkFont has a mask-type: BW, AA, LCD 6743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkPaint has antialias boolean 68e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 6943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com What to do if the font's mask-type disagrees with the paint? 7043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 7143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 7243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 7343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comclass SkFont : public SkRefCnt { 7443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.compublic: 7543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum Flags { 7643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com /** 7743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Use the system's automatic hinting mechanism to hint the typeface. 7843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If both bytecode and auto hints are specified, attempt to use the bytecodes first. 7943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If that fails (e.g. there are no codes), then attempt to autohint. 8043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 8143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEnableAutoHints_Flag = 1 << 0, 8243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 8343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com /** 8443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If the typeface contains explicit bytecodes for hinting, use them. 8543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If both bytecode and auto hints are specified, attempt to use the bytecodes first; 8643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * if that fails (e.g. there are no codes), then attempt to autohint. 8743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 8843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEnableByteCodeHints_Flag = 1 << 1, 8943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 9043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com /** 9143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Use rounded metric values (e.g. advance). 9243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If either auto or bytecode hinting was used, apply those results to the metrics of the 9343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * glyphs as well. If no hinting was applied, the metrics will just be rounded to the 9443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * nearest integer. 9543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * 9643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * This applies to calls that return metrics (e.g. measureText) and to drawing the glyphs 9743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * (see SkCanvas drawText and drawPosText). 9843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 9943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kUseNonlinearMetrics_Flag = 1 << 2, 10043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 10143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kVertical_Flag = 1 << 3, 10243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEmbeddedBitmaps_Flag = 1 << 4, 10343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kGenA8FromLCD_Flag = 1 << 5, 10443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEmbolden_Flag = 1 << 6, 10543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDevKern_Flag = 1 << 7, // ifdef ANDROID ? 10643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 10743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 10843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum MaskType { 10943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kBW_MaskType, 11043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kA8_MaskType, 11143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLCD_MaskType, 11243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 11343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 11443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com static SkFont* Create(SkTypeface*, SkScalar size, MaskType, uint32_t flags); 11543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com static SkFont* Create(SkTypeface*, SkScalar size, SkScalar scaleX, SkScalar skewX, 11643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com MaskType, uint32_t flags); 11743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 11843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com /** 11943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Return a font with the same attributes of this font, but with the specified size. 12043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If size is not supported (e.g. <= 0 or non-finite) NULL will be returned. 12143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 12243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkFont* cloneWithSize(SkScalar size) const; 12343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 12443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkTypeface* getTypeface() const { return fTypeface; } 12543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getSize() const { return fSize; } 12643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getScaleX() const { return fScaleX; } 12743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getSkewX() const { return fSkewX; } 12843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint32_t getFlags() const { return fFlags; } 12943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com MaskType getMaskType() const { return (MaskType)fMaskType; } 13043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 1317ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isVertical() const { return SkToBool(fFlags & kVertical_Flag); } 1327ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEmbolden() const { return SkToBool(fFlags & kEmbolden_Flag); } 1337ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEnableAutoHints() const { return SkToBool(fFlags & kEnableAutoHints_Flag); } 1347ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEnableByteCodeHints() const { return SkToBool(fFlags & kEnableByteCodeHints_Flag); } 1357ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isUseNonLinearMetrics() const { return SkToBool(fFlags & kUseNonlinearMetrics_Flag); } 1367ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org 13743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding, 13843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint16_t glyphs[], int maxGlyphCount) const; 13943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 14043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding) const; 14143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 14243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com static SkFont* Testing_CreateFromPaint(const SkPaint&); 14343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 14443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comprivate: 14543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum { 14643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAllFlags = 0xFF, 14743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 148e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 14943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkFont(SkTypeface*, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType, uint32_t flags); 15043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com virtual ~SkFont(); 15143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 15243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkTypeface* fTypeface; 15343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fSize; 15443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fScaleX; 15543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fSkewX; 15643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint16_t fFlags; 15743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint8_t fMaskType; 158bafee11dd17d0d0c5e693ef2ba7b4d6a4b1e3786reed@google.com// uint8_t fPad; 15943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com}; 1607ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org 1617ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org#endif 162