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. 7831c4772b780c6ed4d37049b02b403b6db1356d5cbungeman * This is a last resort hinting method applied only if other hinting methods do not apply. 7931c4772b780c6ed4d37049b02b403b6db1356d5cbungeman * TODO: where to put auto-normal vs auto-light? 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 /** 9131c4772b780c6ed4d37049b02b403b6db1356d5cbungeman * If the typeface contains explicit bitmaps for hinting, use them. 9231c4772b780c6ed4d37049b02b403b6db1356d5cbungeman * If both bytecode and auto hints are also specified, attempt to use the bitmaps first; 9331c4772b780c6ed4d37049b02b403b6db1356d5cbungeman * if that fails (e.g. there are no bitmaps), then attempt to bytecode or autohint. 9431c4772b780c6ed4d37049b02b403b6db1356d5cbungeman */ 9531c4772b780c6ed4d37049b02b403b6db1356d5cbungeman kEmbeddedBitmaps_Flag = 1 << 2, 9631c4772b780c6ed4d37049b02b403b6db1356d5cbungeman 9731c4772b780c6ed4d37049b02b403b6db1356d5cbungeman /** 9843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Use rounded metric values (e.g. advance). 9943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If either auto or bytecode hinting was used, apply those results to the metrics of the 10043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * glyphs as well. If no hinting was applied, the metrics will just be rounded to the 10143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * nearest integer. 10243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * 10343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * This applies to calls that return metrics (e.g. measureText) and to drawing the glyphs 10443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * (see SkCanvas drawText and drawPosText). 10543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 10631c4772b780c6ed4d37049b02b403b6db1356d5cbungeman kUseNonlinearMetrics_Flag = 1 << 3, 10743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 10831c4772b780c6ed4d37049b02b403b6db1356d5cbungeman kVertical_Flag = 1 << 4, 10943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kGenA8FromLCD_Flag = 1 << 5, 11043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kEmbolden_Flag = 1 << 6, 11143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kDevKern_Flag = 1 << 7, // ifdef ANDROID ? 11243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 11343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 11443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum MaskType { 11543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kBW_MaskType, 11643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kA8_MaskType, 11743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kLCD_MaskType, 11843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 11943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 12013b9c95295f4c5732e34574789e721a6bc08f7b4bungeman static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, MaskType, uint32_t flags); 12113b9c95295f4c5732e34574789e721a6bc08f7b4bungeman static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX, 12213b9c95295f4c5732e34574789e721a6bc08f7b4bungeman MaskType, uint32_t flags); 12343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 12443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com /** 12543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * Return a font with the same attributes of this font, but with the specified size. 12643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com * If size is not supported (e.g. <= 0 or non-finite) NULL will be returned. 12743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com */ 12813b9c95295f4c5732e34574789e721a6bc08f7b4bungeman sk_sp<SkFont> makeWithSize(SkScalar size) const; 129e34f17d23699abfc672289f51319b37294b3c257robertphillips /** 130e34f17d23699abfc672289f51319b37294b3c257robertphillips * Return a font with the same attributes of this font, but with the flags. 131e34f17d23699abfc672289f51319b37294b3c257robertphillips */ 132e34f17d23699abfc672289f51319b37294b3c257robertphillips sk_sp<SkFont> makeWithFlags(uint32_t newFlags) const; 13343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 13413b9c95295f4c5732e34574789e721a6bc08f7b4bungeman SkTypeface* getTypeface() const { return fTypeface.get(); } 13543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getSize() const { return fSize; } 13643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getScaleX() const { return fScaleX; } 13743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar getSkewX() const { return fSkewX; } 13843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint32_t getFlags() const { return fFlags; } 13943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com MaskType getMaskType() const { return (MaskType)fMaskType; } 14043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 1417ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isVertical() const { return SkToBool(fFlags & kVertical_Flag); } 1427ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEmbolden() const { return SkToBool(fFlags & kEmbolden_Flag); } 1437ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEnableAutoHints() const { return SkToBool(fFlags & kEnableAutoHints_Flag); } 1447ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isEnableByteCodeHints() const { return SkToBool(fFlags & kEnableByteCodeHints_Flag); } 1457ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org bool isUseNonLinearMetrics() const { return SkToBool(fFlags & kUseNonlinearMetrics_Flag); } 146e34f17d23699abfc672289f51319b37294b3c257robertphillips bool isDevKern() const { return SkToBool(fFlags & kDevKern_Flag); } 1477ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org 14843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding, 149d0e95a524c20932e0f4e68bab43995188a281395halcanary SkGlyphID glyphs[], int maxGlyphCount) const; 15043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 151e34f17d23699abfc672289f51319b37294b3c257robertphillips int countText(const void* text, size_t byteLength, SkTextEncoding encoding) { 152e34f17d23699abfc672289f51319b37294b3c257robertphillips return this->textToGlyphs(text, byteLength, encoding, nullptr, 0); 153e34f17d23699abfc672289f51319b37294b3c257robertphillips } 154e34f17d23699abfc672289f51319b37294b3c257robertphillips 15543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding) const; 15643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 15713b9c95295f4c5732e34574789e721a6bc08f7b4bungeman static sk_sp<SkFont> Testing_CreateFromPaint(const SkPaint&); 15843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 15943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comprivate: 16043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com enum { 16143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com kAllFlags = 0xFF, 16243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com }; 163e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 16413b9c95295f4c5732e34574789e721a6bc08f7b4bungeman SkFont(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType, 16513b9c95295f4c5732e34574789e721a6bc08f7b4bungeman uint32_t flags); 16643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 16713b9c95295f4c5732e34574789e721a6bc08f7b4bungeman sk_sp<SkTypeface> fTypeface; 16843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fSize; 16943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fScaleX; 17043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkScalar fSkewX; 17143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint16_t fFlags; 17243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint8_t fMaskType; 173bafee11dd17d0d0c5e693ef2ba7b4d6a4b1e3786reed@google.com// uint8_t fPad; 17443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com}; 1757ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org 1767ae034d651f3536457b9654e3a36a91716a18948commit-bot@chromium.org#endif 177