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