Line data Source code
1 : /*
2 : * Copyright 2014 Google Inc.
3 : *
4 : * Use of this source code is governed by a BSD-style license that can be
5 : * found in the LICENSE file.
6 : */
7 :
8 : #ifndef SkFont_DEFINED
9 : #define SkFont_DEFINED
10 :
11 : #include "SkRefCnt.h"
12 : #include "SkScalar.h"
13 :
14 : class SkPaint;
15 : class SkTypeface;
16 :
17 : enum SkTextEncoding {
18 : kUTF8_SkTextEncoding,
19 : kUTF16_SkTextEncoding,
20 : kUTF32_SkTextEncoding,
21 : kGlyphID_SkTextEncoding,
22 : };
23 :
24 : /*
25 : 1. The Hinting enum in SkPaint is gone entirely, absorbed into SkFont's flags.
26 :
27 : 2. SkPaint Flags look like this today
28 :
29 : enum Flags {
30 : kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing
31 : kDither_Flag = 0x04, //!< mask to enable dithering
32 : kUnderlineText_Flag = 0x08, //!< mask to enable underline text
33 : kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text
34 : kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text
35 : kLinearText_Flag = 0x40, //!< mask to enable linear-text
36 : kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning
37 : kDevKernText_Flag = 0x100, //!< mask to enable device kerning text
38 : kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering
39 : kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes
40 : kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter
41 : kVerticalText_Flag = 0x1000,
42 : kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it
43 : };
44 :
45 : SkFont would absorb these:
46 :
47 : kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text
48 : kLinearText_Flag = 0x40, //!< mask to enable linear-text
49 : kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning
50 : kDevKernText_Flag = 0x100, //!< mask to enable device kerning text
51 : kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering
52 : kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes
53 : kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter
54 : kVerticalText_Flag = 0x1000,
55 : kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it
56 :
57 : leaving these still in paint
58 :
59 : kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing
60 : kDither_Flag = 0x04, //!< mask to enable dithering
61 : kUnderlineText_Flag = 0x08, //!< mask to enable underline text
62 : kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text
63 :
64 : 3. Antialiasing
65 :
66 : SkFont has a mask-type: BW, AA, LCD
67 : SkPaint has antialias boolean
68 :
69 : What to do if the font's mask-type disagrees with the paint?
70 :
71 : */
72 :
73 0 : class SkFont : public SkRefCnt {
74 : public:
75 : enum Flags {
76 : /**
77 : * Use the system's automatic hinting mechanism to hint the typeface.
78 : * This is a last resort hinting method applied only if other hinting methods do not apply.
79 : * TODO: where to put auto-normal vs auto-light?
80 : */
81 : kEnableAutoHints_Flag = 1 << 0,
82 :
83 : /**
84 : * If the typeface contains explicit bytecodes for hinting, use them.
85 : * If both bytecode and auto hints are specified, attempt to use the bytecodes first;
86 : * if that fails (e.g. there are no codes), then attempt to autohint.
87 : */
88 : kEnableByteCodeHints_Flag = 1 << 1,
89 :
90 : /**
91 : * If the typeface contains explicit bitmaps for hinting, use them.
92 : * If both bytecode and auto hints are also specified, attempt to use the bitmaps first;
93 : * if that fails (e.g. there are no bitmaps), then attempt to bytecode or autohint.
94 : */
95 : kEmbeddedBitmaps_Flag = 1 << 2,
96 :
97 : /**
98 : * Use rounded metric values (e.g. advance).
99 : * If either auto or bytecode hinting was used, apply those results to the metrics of the
100 : * glyphs as well. If no hinting was applied, the metrics will just be rounded to the
101 : * nearest integer.
102 : *
103 : * This applies to calls that return metrics (e.g. measureText) and to drawing the glyphs
104 : * (see SkCanvas drawText and drawPosText).
105 : */
106 : kUseNonlinearMetrics_Flag = 1 << 3,
107 :
108 : kVertical_Flag = 1 << 4,
109 : kGenA8FromLCD_Flag = 1 << 5,
110 : kEmbolden_Flag = 1 << 6,
111 : kDevKern_Flag = 1 << 7, // ifdef ANDROID ?
112 : };
113 :
114 : enum MaskType {
115 : kBW_MaskType,
116 : kA8_MaskType,
117 : kLCD_MaskType,
118 : };
119 :
120 : static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, MaskType, uint32_t flags);
121 : static sk_sp<SkFont> Make(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX,
122 : MaskType, uint32_t flags);
123 :
124 : /**
125 : * Return a font with the same attributes of this font, but with the specified size.
126 : * If size is not supported (e.g. <= 0 or non-finite) NULL will be returned.
127 : */
128 : sk_sp<SkFont> makeWithSize(SkScalar size) const;
129 : /**
130 : * Return a font with the same attributes of this font, but with the flags.
131 : */
132 : sk_sp<SkFont> makeWithFlags(uint32_t newFlags) const;
133 :
134 0 : SkTypeface* getTypeface() const { return fTypeface.get(); }
135 0 : SkScalar getSize() const { return fSize; }
136 0 : SkScalar getScaleX() const { return fScaleX; }
137 0 : SkScalar getSkewX() const { return fSkewX; }
138 0 : uint32_t getFlags() const { return fFlags; }
139 0 : MaskType getMaskType() const { return (MaskType)fMaskType; }
140 :
141 : bool isVertical() const { return SkToBool(fFlags & kVertical_Flag); }
142 : bool isEmbolden() const { return SkToBool(fFlags & kEmbolden_Flag); }
143 : bool isEnableAutoHints() const { return SkToBool(fFlags & kEnableAutoHints_Flag); }
144 : bool isEnableByteCodeHints() const { return SkToBool(fFlags & kEnableByteCodeHints_Flag); }
145 : bool isUseNonLinearMetrics() const { return SkToBool(fFlags & kUseNonlinearMetrics_Flag); }
146 : bool isDevKern() const { return SkToBool(fFlags & kDevKern_Flag); }
147 :
148 : int textToGlyphs(const void* text, size_t byteLength, SkTextEncoding,
149 : SkGlyphID glyphs[], int maxGlyphCount) const;
150 :
151 : int countText(const void* text, size_t byteLength, SkTextEncoding encoding) {
152 : return this->textToGlyphs(text, byteLength, encoding, nullptr, 0);
153 : }
154 :
155 : SkScalar measureText(const void* text, size_t byteLength, SkTextEncoding) const;
156 :
157 : static sk_sp<SkFont> Testing_CreateFromPaint(const SkPaint&);
158 :
159 : private:
160 : enum {
161 : kAllFlags = 0xFF,
162 : };
163 :
164 : SkFont(sk_sp<SkTypeface>, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType,
165 : uint32_t flags);
166 :
167 : sk_sp<SkTypeface> fTypeface;
168 : SkScalar fSize;
169 : SkScalar fScaleX;
170 : SkScalar fSkewX;
171 : uint16_t fFlags;
172 : uint8_t fMaskType;
173 : // uint8_t fPad;
174 : };
175 :
176 : #endif
|