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