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