blob: 33e586a5be81e7354c42482fcaff4c65fa5d1f1f [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkPaint_DEFINED
9#define SkPaint_DEFINED
10
reed374772b2016-10-05 17:33:02 -070011#include "SkBlendMode.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012#include "SkColor.h"
reedf803da12015-01-23 05:58:07 -080013#include "SkFilterQuality.h"
reed@google.comed43dff2013-06-04 16:56:27 +000014#include "SkMatrix.h"
Mike Reed71fecc32016-11-18 17:19:54 -050015#include "SkRefCnt.h"
reed@android.coma0f5d152009-06-22 17:38:10 +000016
joshualitt2b6acb42015-04-01 11:30:27 -070017class SkAutoDescriptor;
reed@android.com8a1c16f2008-12-17 15:59:43 +000018class SkAutoGlyphCache;
19class SkColorFilter;
joshualittfd450792015-03-13 08:38:43 -070020class SkData;
reed@android.com8a1c16f2008-12-17 15:59:43 +000021class SkDescriptor;
senorblanco0abdf762015-08-20 11:10:41 -070022class SkDrawLooper;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000023class SkReadBuffer;
24class SkWriteBuffer;
herbb69d0e02015-02-25 06:47:06 -080025class SkGlyph;
reed@android.com8a1c16f2008-12-17 15:59:43 +000026struct SkRect;
27class SkGlyphCache;
reed@google.com15356a62011-11-03 19:29:08 +000028class SkImageFilter;
reed@android.com8a1c16f2008-12-17 15:59:43 +000029class SkMaskFilter;
reed@android.com8a1c16f2008-12-17 15:59:43 +000030class SkPath;
31class SkPathEffect;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000032struct SkPoint;
reed@android.com8a1c16f2008-12-17 15:59:43 +000033class SkRasterizer;
reeda9322c22016-04-12 06:47:05 -070034struct SkScalerContextEffects;
reed@android.com8a1c16f2008-12-17 15:59:43 +000035class SkShader;
robertphillipsfcf78292015-06-19 11:49:52 -070036class SkSurfaceProps;
fmalitaeae6a912016-07-28 09:47:24 -070037class SkTextBlob;
reed@android.com8a1c16f2008-12-17 15:59:43 +000038class SkTypeface;
reed@android.com8a1c16f2008-12-17 15:59:43 +000039
reed@android.com8a1c16f2008-12-17 15:59:43 +000040/** \class SkPaint
Cary Clark50fa3ff2017-07-26 10:15:23 -040041 SkPaint controls options applied when drawing and measuring. SkPaint collects all
42 options outside of the SkCanvas clip and SkCanvas matrix.
reed@android.com8a1c16f2008-12-17 15:59:43 +000043
Cary Clark50fa3ff2017-07-26 10:15:23 -040044 Various options apply to text, strokes and fills, and images.
45
46 Some options may not be implemented on all platforms; in these cases, setting
47 the option has no effect. Some options are conveniences that duplicate SkCanvas
48 functionality; for instance, text size is identical to matrix scale.
49
50 SkPaint options are rarely exclusive; each option modifies a stage of the drawing
51 pipeline and multiple pipeline stages may be effected by a single SkPaint.
52
53 SkPaint collects effect and filters that describe single-pass and multiple-pass
54 algorithms that alter the drawing geometry, color, and transparency. For instance,
55 SkPaint does not directly implement dashing or blur, but contains the objects that do so.
56
57 The objects contained by SkPaint are opaque, and cannot be edited outside of the SkPaint
58 to affect it. The implementation is free to defer computations associated with the
59 SkPaint, or ignore them altogether. For instance, some GPU implementations draw all
60 SkPath geometries with anti-aliasing, regardless of SkPaint::kAntiAlias_Flag setting.
61
62 SkPaint describes a single color, a single font, a single image quality, and so on.
63 Multiple colors are drawn either by using multiple paints or with objects like
64 SkShader attached to SkPaint.
reed@android.com8a1c16f2008-12-17 15:59:43 +000065*/
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +000066class SK_API SkPaint {
reed@android.com8a1c16f2008-12-17 15:59:43 +000067public:
Cary Clark50fa3ff2017-07-26 10:15:23 -040068
69 /** Constructs SkPaint with default values.
70
71 @return default initialized SkPaint
72 */
reed@android.com8a1c16f2008-12-17 15:59:43 +000073 SkPaint();
Cary Clark50fa3ff2017-07-26 10:15:23 -040074
75 /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
76 SkMaskFilter, SkColorFilter, SkRasterizer, SkDrawLooper, and SkImageFilter are shared
77 between the original paint and the copy. These objects' SkRefCnt are increased.
78
79 The referenced objects SkPathEffect, SkShader, SkMaskFilter, SkColorFilter, SkRasterizer,
80 SkDrawLooper, and SkImageFilter cannot be modified after they are created.
81 This prevents objects with SkRefCnt from being modified once SkPaint refers to them.
82
83 @param paint original to copy
84 @return shallow copy of paint
85 */
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 SkPaint(const SkPaint& paint);
Cary Clark50fa3ff2017-07-26 10:15:23 -040087
88 /** Implements a move constructor to avoid incrementing the reference counts
89 of objects referenced by the paint.
90
91 After the call, paint is undefined, and can be safely destructed.
92
93 @param paint original to move
94 @return content of paint
95 */
bungemanccce0e02016-02-07 14:37:23 -080096 SkPaint(SkPaint&& paint);
Cary Clark50fa3ff2017-07-26 10:15:23 -040097
98 /** Decreases SkPaint SkRefCnt of owned objects: SkTypeface, SkPathEffect, SkShader,
99 SkMaskFilter, SkColorFilter, SkRasterizer, SkDrawLooper, and SkImageFilter. If the
100 objects' reference count goes to zero, they are deleted.
101 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102 ~SkPaint();
103
Cary Clark50fa3ff2017-07-26 10:15:23 -0400104 /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
105 SkMaskFilter, SkColorFilter, SkRasterizer, SkDrawLooper, and SkImageFilter are shared
106 between the original paint and the copy. The objects' SkRefCnt are in the
107 prior destination are decreased by one, and the referenced objects are deleted if the
108 resulting count is zero. The objects' SkRefCnt in the parameter paint are increased
109 by one. paint is unmodified.
110
111 @param paint original to copy
112 @return content of paint
113 */
Cary Clark0418a882017-05-10 09:07:42 -0400114 SkPaint& operator=(const SkPaint& paint);
Cary Clark50fa3ff2017-07-26 10:15:23 -0400115
116 /** Moves the paint to avoid incrementing the reference counts
117 of objects referenced by the paint parameter. The objects' SkRefCnt are in the
118 prior destination are decreased by one, and the referenced objects are deleted if the
119 resulting count is zero.
120
121 After the call, paint is undefined, and can be safely destructed.
122
123 @param paint original to move
124 @return content of paint
125 */
Cary Clark0418a882017-05-10 09:07:42 -0400126 SkPaint& operator=(SkPaint&& paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127
Cary Clark50fa3ff2017-07-26 10:15:23 -0400128 /** Compares a and b, and returns true if a and b are equivalent. May return false
129 if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter, SkRasterizer,
130 SkDrawLooper, or SkImageFilter have identical contents but different pointers.
131
132 @param a SkPaint to compare
133 @param b SkPaint to compare
134 @return true if SkPaint pair are equivalent
mtkleinbc97ef42014-08-25 10:10:47 -0700135 */
robertphillips@google.comb2657412013-08-07 22:36:29 +0000136 SK_API friend bool operator==(const SkPaint& a, const SkPaint& b);
Cary Clark50fa3ff2017-07-26 10:15:23 -0400137
138 /** Compares a and b, and returns true if a and b are not equivalent. May return true
139 if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter, SkRasterizer,
140 SkDrawLooper, or SkImageFilter have identical contents but different pointers.
141
142 @param a SkPaint to compare
143 @param b SkPaint to compare
144 @return true if SkPaint pair are not equivalent
145 */
robertphillips@google.comb2657412013-08-07 22:36:29 +0000146 friend bool operator!=(const SkPaint& a, const SkPaint& b) {
147 return !(a == b);
148 }
149
Cary Clark50fa3ff2017-07-26 10:15:23 -0400150 /** Returns a hash generated from SkPaint values and pointers.
151 Identical hashes guarantee that the paints are
152 equivalent, but differing hashes do not guarantee that the paints have differing
153 contents.
154
155 If operator==(const SkPaint& a, const SkPaint& b) returns true for two paints,
156 their hashes are also equal.
157
158 The hash returned is platform and implementation specific.
159
160 @return a shallow hash
161 */
mtkleinfb1fe4f2014-10-07 09:26:10 -0700162 uint32_t getHash() const;
163
Cary Clark50fa3ff2017-07-26 10:15:23 -0400164 /** Serializes SkPaint into a buffer. A companion unflatten() call
165 can reconstitute the paint at a later time.
166
167 @param buffer SkWriteBuffer receiving the flattened SkPaint data
168 */
Cary Clark0418a882017-05-10 09:07:42 -0400169 void flatten(SkWriteBuffer& buffer) const;
Cary Clark50fa3ff2017-07-26 10:15:23 -0400170
171 /** Populates SkPaint, typically from a serialized stream, created by calling
172 flatten() at an earlier time.
173
174 SkReadBuffer class is not public, so unflatten() cannot be meaningfully called
175 by the client.
176
177 @param buffer serialized data to unflatten
178 */
Cary Clark0418a882017-05-10 09:07:42 -0400179 void unflatten(SkReadBuffer& buffer);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180
Cary Clark50fa3ff2017-07-26 10:15:23 -0400181 /** Sets all paint's contents to their initial values. This is equivalent to replacing
182 the paint with the result of SkPaint().
reed@android.com8a1c16f2008-12-17 15:59:43 +0000183 */
184 void reset();
185
Cary Clark50fa3ff2017-07-26 10:15:23 -0400186 /** \enum SkPaint::Hinting
187 Hinting adjusts the glyph outlines so that the shape provides a uniform
188 look at a given point size on font engines that support it. Hinting may have a
189 muted effect or no effect at all depending on the platform.
190
191 The four levels roughly control corresponding features on platforms that use FreeType
192 as the font engine.
agl@chromium.org309485b2009-07-21 17:41:32 +0000193 */
194 enum Hinting {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400195 /** Leaves glyph outlines unchanged from their native representation.
196 With FreeType, this is equivalent to the FT_LOAD_NO_HINTING
197 bit-field constant supplied to FT_Load_Glyph, which indicates that the vector
198 outline being loaded should not be fitted to the pixel grid but simply scaled
199 to 26.6 fractional pixels.
200 */
201 kNo_Hinting = 0,
202
203 /** Modifies glyph outlines minimally to improve constrast.
204 With FreeType, this is equivalent in spirit to the
205 FT_LOAD_TARGET_LIGHT value supplied to FT_Load_Glyph. It chooses a
206 lighter hinting algorithm for non-monochrome modes.
207 Generated glyphs may be fuzzy but better resemble their original shape.
208 */
209 kSlight_Hinting = 1,
210
211 /** Modifies glyph outlines to improve constrast. This is the default.
212 With FreeType, this supplies FT_LOAD_TARGET_NORMAL to FT_Load_Glyph,
213 choosing the default hinting algorithm, which is optimized for standard
214 gray-level rendering.
215 */
216 kNormal_Hinting = 2,
217
218 /** Modifies glyph outlines for maxiumum constrast. With FreeType, this selects
219 FT_LOAD_TARGET_LCD or FT_LOAD_TARGET_LCD_V if kLCDRenderText_Flag is set.
220 FT_LOAD_TARGET_LCD is a variant of FT_LOAD_TARGET_NORMAL optimized for
221 horizontally decimated LCD displays; FT_LOAD_TARGET_LCD_V is a
222 variant of FT_LOAD_TARGET_NORMAL optimized for vertically decimated LCD displays.
223 */
224 kFull_Hinting = 3,
agl@chromium.org309485b2009-07-21 17:41:32 +0000225 };
226
Cary Clark50fa3ff2017-07-26 10:15:23 -0400227 /** Returns level of glyph outline adjustment.
228
229 @return one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting
230 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000231 Hinting getHinting() const {
reedf59eab22014-07-14 14:39:15 -0700232 return static_cast<Hinting>(fBitfields.fHinting);
agl@chromium.org309485b2009-07-21 17:41:32 +0000233 }
234
Cary Clark50fa3ff2017-07-26 10:15:23 -0400235 /** Sets level of glyph outline adjustment.
236 Does not check for valid values of hintingLevel.
237
238 @param hintingLevel one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting
239 */
djsollen@google.comf5dbe2f2011-04-15 13:41:26 +0000240 void setHinting(Hinting hintingLevel);
agl@chromium.org309485b2009-07-21 17:41:32 +0000241
Cary Clark50fa3ff2017-07-26 10:15:23 -0400242 /** \enum SkPaint::Flags
243 The bit values stored in Flags.
244 The default value for Flags, normally zero, can be changed at compile time
245 with a custom definition of SkPaintDefaults_Flags.
246 All flags can be read and written explicitly; Flags allows manipulating
247 multiple settings at once.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000248 */
249 enum Flags {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400250 kAntiAlias_Flag = 0x01, //!< mask for setting Anti-alias
251 kDither_Flag = 0x04, //!< mask for setting Dither
252 kFakeBoldText_Flag = 0x20, //!< mask for setting fake bold
253 kLinearText_Flag = 0x40, //!< mask for setting linear text
254 kSubpixelText_Flag = 0x80, //!< mask for setting subpixel text
255 kDevKernText_Flag = 0x100, //!< mask for setting full hinting spacing
256 kLCDRenderText_Flag = 0x200, //!< mask for setting lcd text
257 kEmbeddedBitmapText_Flag = 0x400, //!< mask for setting font embedded bitmaps
258 kAutoHinting_Flag = 0x800, //!< mask for setting auto-hinting
259 kVerticalText_Flag = 0x1000, //!< mask for setting vertical text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000260
Cary Clark50fa3ff2017-07-26 10:15:23 -0400261 /** Hack for GDI -- do not use if you can help it */
262 kGenA8FromLCD_Flag = 0x2000,
263
264 /** mask of all Flags, including private flags and flags reserved for future use */
265 kAllFlags = 0xFFFF,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000266 };
267
Cary Clark50fa3ff2017-07-26 10:15:23 -0400268 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
Mike Reedddbd37e2017-02-21 15:07:44 -0500269 enum ReserveFlags {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400270 kUnderlineText_ReserveFlag = 0x08, //!< mask for underline text
271 kStrikeThruText_ReserveFlag = 0x10, //!< mask for strike-thru text
Mike Reedddbd37e2017-02-21 15:07:44 -0500272 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400273 #endif
Mike Reedddbd37e2017-02-21 15:07:44 -0500274
Cary Clark50fa3ff2017-07-26 10:15:23 -0400275 /** Returns paint settings described by SkPaint::Flags. Each setting uses one
276 bit, and can be tested with SkPaint::Flags members.
277
278 @return zero, one, or more bits described by SkPaint::Flags
reed@android.com8a1c16f2008-12-17 15:59:43 +0000279 */
reedf59eab22014-07-14 14:39:15 -0700280 uint32_t getFlags() const { return fBitfields.fFlags; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000281
Cary Clark50fa3ff2017-07-26 10:15:23 -0400282 /** Sets SkPaint::Flags to the union of the SkPaint::Flags members.
283
284 @param flags union of SkPaint::Flags for SkPaint
reed@android.com8a1c16f2008-12-17 15:59:43 +0000285 */
286 void setFlags(uint32_t flags);
287
Cary Clark50fa3ff2017-07-26 10:15:23 -0400288 /** If true, pixels on the active edges of SkPath may be drawn with partial transparency.
289
290 Equivalent to getFlags masked with kAntiAlias_Flag.
291
292 @return kAntiAlias_Flag state
293 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000294 bool isAntiAlias() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000295 return SkToBool(this->getFlags() & kAntiAlias_Flag);
296 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000297
Cary Clark50fa3ff2017-07-26 10:15:23 -0400298 /** Requests, but does not require, that SkPath edge pixels draw opaque or with
299 partial transparency.
300
301 Sets kAntiAlias_Flag if aa is true.
302 Clears kAntiAlias_Flag if aa is false.
303
304 @param aa setting for kAntiAlias_Flag
305 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000306 void setAntiAlias(bool aa);
reed@google.com9d07fec2011-03-16 20:02:59 +0000307
Cary Clark50fa3ff2017-07-26 10:15:23 -0400308 /** If true, color error may be distributed to smooth color transition.
309
310 Equivalent to getFlags masked with kDither_Flag.
311
312 @return kDither_Flag state
313 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000314 bool isDither() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000315 return SkToBool(this->getFlags() & kDither_Flag);
316 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000317
Cary Clark50fa3ff2017-07-26 10:15:23 -0400318 /** Requests, but does not require, to distribute color error.
319
320 Sets kDither_Flag if dither is true.
321 Clears kDither_Flag if dither is false.
322
323 @param dither setting for kDither_Flag
324 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000325 void setDither(bool dither);
reed@google.com9d07fec2011-03-16 20:02:59 +0000326
Cary Clark50fa3ff2017-07-26 10:15:23 -0400327 /** If true, text is converted to SkPath before drawing and measuring.
328
329 Equivalent to getFlags masked with kLinearText_Flag.
330
331 @return kLinearText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000332 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000333 bool isLinearText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000334 return SkToBool(this->getFlags() & kLinearText_Flag);
335 }
336
Cary Clark50fa3ff2017-07-26 10:15:23 -0400337 /** If true, text is converted to SkPath before drawing and measuring.
338 By default, kLinearText_Flag is clear.
339
340 Sets kLinearText_Flag if linearText is true.
341 Clears kLinearText_Flag if linearText is false.
342
343 @param linearText setting for kLinearText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000344 */
345 void setLinearText(bool linearText);
346
Cary Clark50fa3ff2017-07-26 10:15:23 -0400347 /** If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
348
349 Equivalent to getFlags masked with kSubpixelText_Flag.
350
351 @return kSubpixelText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000352 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000353 bool isSubpixelText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000354 return SkToBool(this->getFlags() & kSubpixelText_Flag);
355 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000356
Cary Clark50fa3ff2017-07-26 10:15:23 -0400357 /** Requests, but does not require, that glyphs respect sub-pixel positioning.
358
359 Sets kSubpixelText_Flag if subpixelText is true.
360 Clears kSubpixelText_Flag if subpixelText is false.
361
362 @param subpixelText setting for kSubpixelText_Flag
363 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000364 void setSubpixelText(bool subpixelText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000365
Cary Clark50fa3ff2017-07-26 10:15:23 -0400366 /** If true, glyphs may use LCD striping to improve glyph edges.
367
368 Returns true if SkPaint::Flags kLCDRenderText_Flag is set.
369
370 @return kLCDRenderText_Flag state
371 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000372 bool isLCDRenderText() const {
agl@chromium.org309485b2009-07-21 17:41:32 +0000373 return SkToBool(this->getFlags() & kLCDRenderText_Flag);
374 }
375
Cary Clark50fa3ff2017-07-26 10:15:23 -0400376 /** Requests, but does not require, that glyphs use LCD striping for glyph edges.
377
378 Sets kLCDRenderText_Flag if lcdText is true.
379 Clears kLCDRenderText_Flag if lcdText is false.
380
381 @param lcdText setting for kLCDRenderText_Flag
382 */
reed@google.com84b437e2011-08-01 12:45:35 +0000383 void setLCDRenderText(bool lcdText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000384
Cary Clark50fa3ff2017-07-26 10:15:23 -0400385 /** If true, font engine may return glyphs from font bitmaps instead of from outlines.
386
387 Equivalent to getFlags masked with kEmbeddedBitmapText_Flag.
388
389 @return kEmbeddedBitmapText_Flag state
390 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000391 bool isEmbeddedBitmapText() const {
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000392 return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
393 }
394
Cary Clark50fa3ff2017-07-26 10:15:23 -0400395 /** Requests, but does not require, to use bitmaps in fonts instead of outlines.
396
397 Sets kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is true.
398 Clears kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is false.
399
400 @param useEmbeddedBitmapText setting for kEmbeddedBitmapText_Flag
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000401 */
402 void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
403
Cary Clark50fa3ff2017-07-26 10:15:23 -0400404 /** If true, and if SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting, and if
405 platform uses FreeType as the font manager, instruct the font manager to always hint
406 Glyphs.
407
408 Equivalent to getFlags masked with kAutoHinting_Flag.
409
410 @return kAutoHinting_Flag state
411 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000412 bool isAutohinted() const {
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000413 return SkToBool(this->getFlags() & kAutoHinting_Flag);
414 }
415
Cary Clark50fa3ff2017-07-26 10:15:23 -0400416 /** If SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting and useAutohinter is set,
417 instruct the font manager to always hint Glyphs.
418 auto-hinting has no effect if SkPaint::Hinting is set to kNo_Hinting or
419 kSlight_Hinting.
420
421 setAutohinted only effects platforms that use FreeType as the font manager.
422
423 Sets kAutoHinting_Flag if useAutohinter is true.
424 Clears kAutoHinting_Flag if useAutohinter is false.
425
426 @param useAutohinter setting for kAutoHinting_Flag
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000427 */
428 void setAutohinted(bool useAutohinter);
429
Cary Clark50fa3ff2017-07-26 10:15:23 -0400430 /** If true, glyphs are drawn top to bottom instead of left to right.
431
432 Equivalent to getFlags masked with kVerticalText_Flag.
433
434 @return kVerticalText_Flag state
435 */
reed@google.com830a23e2011-11-10 15:20:49 +0000436 bool isVerticalText() const {
437 return SkToBool(this->getFlags() & kVerticalText_Flag);
438 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000439
Cary Clark50fa3ff2017-07-26 10:15:23 -0400440 /** If true, text advance positions the next glyph below the previous glyph instead of to the
441 right of previous glyph.
442
443 Sets kVerticalText_Flag if vertical is true.
444 Clears kVerticalText_Flag if vertical is false.
445
446 @param verticalText setting for kVerticalText_Flag
447 */
Cary Clark0418a882017-05-10 09:07:42 -0400448 void setVerticalText(bool verticalText);
reed@google.com830a23e2011-11-10 15:20:49 +0000449
Cary Clark50fa3ff2017-07-26 10:15:23 -0400450 /** If true, approximate bold by increasing the stroke width when creating glyph bitmaps
451 from outlines.
452
453 Equivalent to getFlags masked with kFakeBoldText_Flag.
454
455 @return kFakeBoldText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000456 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000457 bool isFakeBoldText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000458 return SkToBool(this->getFlags() & kFakeBoldText_Flag);
459 }
460
Cary Clark50fa3ff2017-07-26 10:15:23 -0400461 /** Use increased stroke width when creating glyph bitmaps to approximate bolding.
462
463 Sets kFakeBoldText_Flag if fakeBoldText is true.
464 Clears kFakeBoldText_Flag if fakeBoldText is false.
465
466 @param fakeBoldText setting for kFakeBoldText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000467 */
468 void setFakeBoldText(bool fakeBoldText);
469
Cary Clark50fa3ff2017-07-26 10:15:23 -0400470 /** Returns if character spacing may be adjusted by the hinting difference.
471
472 Equivalent to getFlags masked with kDevKernText_Flag.
473
474 @return kDevKernText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000475 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000476 bool isDevKernText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000477 return SkToBool(this->getFlags() & kDevKernText_Flag);
478 }
479
Cary Clark50fa3ff2017-07-26 10:15:23 -0400480 /** Requests, but does not require, to use hinting to adjust glyph spacing.
481
482 Sets kDevKernText_Flag if devKernText is true.
483 Clears kDevKernText_Flag if devKernText is false.
484
485 @param devKernText setting for devKernText
reed@android.com8a1c16f2008-12-17 15:59:43 +0000486 */
487 void setDevKernText(bool devKernText);
488
Cary Clark50fa3ff2017-07-26 10:15:23 -0400489 /** Returns SkFilterQuality, the image filtering level. A lower setting
490 draws faster; a higher setting looks better when the image is scaled.
491
492 @return one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
493 kMedium_SkFilterQuality, kHigh_SkFilterQuality
494 */
reedf803da12015-01-23 05:58:07 -0800495 SkFilterQuality getFilterQuality() const {
496 return (SkFilterQuality)fBitfields.fFilterQuality;
497 }
mtkleinfe81e2d2015-09-09 07:35:42 -0700498
Cary Clark50fa3ff2017-07-26 10:15:23 -0400499 /** Sets or clears SkFilterQuality, the image filtering level. A lower setting
500 draws faster; a higher setting looks better when the image is scaled.
501 setFilterQuality does not check to see if quality is valid.
502
503 @param quality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
504 kMedium_SkFilterQuality, kHigh_SkFilterQuality
505 */
reedf803da12015-01-23 05:58:07 -0800506 void setFilterQuality(SkFilterQuality quality);
reed@google.comc9683152013-07-18 13:47:01 +0000507
Cary Clark50fa3ff2017-07-26 10:15:23 -0400508 /** \enum SkPaint::Style
509 Set Style to kStrokeAndFill_Style to fill, stroke, or both fill and stroke geometry.
510 The stroke and fill
511 share all paint attributes; for instance, they are drawn with the same color.
reed@google.com9d07fec2011-03-16 20:02:59 +0000512
Cary Clark50fa3ff2017-07-26 10:15:23 -0400513 Use kStrokeAndFill_Style to avoid hitting the same pixels twice with a stroke draw and
514 a fill draw.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000515 */
516 enum Style {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400517 /** Set to fill geometry.
518 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and Text.
519 SkBitmap, SkImage, patches, SkRegion, sprites, and vertices are painted as if
520 kFill_Style is set, and ignore the set Style.
521 The FillType specifies additional rules to fill the area outside the path edge,
522 and to create an unfilled hole inside the shape.
523 Style is set to kFill_Style by default.
524 */
525 kFill_Style,
526
527 /** Set to stroke geometry.
528 Applies to SkRect, SkRegion, SkRRect, arcs, circles, ovals,
529 SkPath, and Text.
530 arcs, lines, SkPoint, and SkPoint arrays are always drawn as if kStroke_Style is set,
531 and ignore the set Style.
532 The stroke construction is unaffected by the FillType.
533 */
534 kStroke_Style,
535
536 /** Set to stroke and fill geometry.
537 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and Text.
538 SkPath is treated as if it is set to SkPath::kWinding_FillType,
539 and the set FillType is ignored.
540 */
541 kStrokeAndFill_Style,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000542 };
543
Cary Clark50fa3ff2017-07-26 10:15:23 -0400544 enum {
545 /** The number of different Style values defined.
546 May be used to verify that Style is a legal value.
547 */
548 kStyleCount = kStrokeAndFill_Style + 1,
549 };
550
551 /** Whether the geometry is filled, stroked, or filled and stroked.
552
553 @return one of:kFill_Style, kStroke_Style, kStrokeAndFill_Style
reed@android.com8a1c16f2008-12-17 15:59:43 +0000554 */
reedf59eab22014-07-14 14:39:15 -0700555 Style getStyle() const { return (Style)fBitfields.fStyle; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000556
Cary Clark50fa3ff2017-07-26 10:15:23 -0400557 /** Sets whether the geometry is filled, stroked, or filled and stroked.
558 Has no effect if style is not a legal SkPaint::Style value.
559
560 @param style one of: kFill_Style, kStroke_Style, kStrokeAndFill_Style
reed@android.com8a1c16f2008-12-17 15:59:43 +0000561 */
562 void setStyle(Style style);
563
Cary Clark50fa3ff2017-07-26 10:15:23 -0400564 /** Retrieves alpha and RGB, unpremultiplied, packed into 32 bits.
565 Use helpers SkColorGetA(), SkColorGetR(), SkColorGetG(), and SkColorGetB() to extract
566 a color component.
567
568 @return Unpremultiplied ARGB
reed@android.com8a1c16f2008-12-17 15:59:43 +0000569 */
570 SkColor getColor() const { return fColor; }
571
Cary Clark50fa3ff2017-07-26 10:15:23 -0400572 /** Sets alpha and RGB used when stroking and filling. The color is a 32-bit value,
573 unpremutiplied, packing 8-bit components for alpha, red, blue, and green.
574
575 @param color Unpremultiplied ARGB
reed@android.com8a1c16f2008-12-17 15:59:43 +0000576 */
577 void setColor(SkColor color);
578
Cary Clark50fa3ff2017-07-26 10:15:23 -0400579 /** Retrieves alpha from the Color used when stroking and filling.
580
581 @return alpha ranging from zero, fully transparent, to 255, fully opaque
582 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000583 uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); }
reed@google.com9d07fec2011-03-16 20:02:59 +0000584
Cary Clark50fa3ff2017-07-26 10:15:23 -0400585 /** Replaces alpha, leaving RGB
586 unchanged. An out of range value triggers an assert in the debug
587 build. a is a value from zero to 255.
588 a set to zero makes Color fully transparent; a set to 255 makes Color
589 fully opaque.
590
591 @param a alpha component of Color
reed@android.com8a1c16f2008-12-17 15:59:43 +0000592 */
593 void setAlpha(U8CPU a);
594
Cary Clark50fa3ff2017-07-26 10:15:23 -0400595 /** Sets Color used when drawing solid fills. The color components range from 0 to 255.
596 The color is unpremultiplied;
597 alpha sets the transparency independent of RGB.
598
599 @param a amount of alpha, from fully transparent (0) to fully opaque (255)
600 @param r amount of red, from no red (0) to full red (255)
601 @param g amount of green, from no green (0) to full green (255)
602 @param b amount of blue, from no blue (0) to full blue (255)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000603 */
604 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
605
Cary Clark50fa3ff2017-07-26 10:15:23 -0400606 /** Returns the thickness of the pen used by SkPaint to
607 outline the shape.
608
609 @return zero for Hairline, greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000610 */
611 SkScalar getStrokeWidth() const { return fWidth; }
612
Cary Clark50fa3ff2017-07-26 10:15:23 -0400613 /** Sets the thickness of the pen used by the paint to
614 outline the shape.
615 Has no effect if width is less than zero.
616
617 @param width zero thickness for Hairline; greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000618 */
619 void setStrokeWidth(SkScalar width);
620
Cary Clark50fa3ff2017-07-26 10:15:23 -0400621 /** The limit at which a sharp corner is drawn beveled.
622
623 @return zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000624 */
625 SkScalar getStrokeMiter() const { return fMiterLimit; }
626
Cary Clark50fa3ff2017-07-26 10:15:23 -0400627 /** The limit at which a sharp corner is drawn beveled.
628 Valid values are zero and greater.
629 Has no effect if miter is less than zero.
630
631 @param miter zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000632 */
633 void setStrokeMiter(SkScalar miter);
634
Cary Clark50fa3ff2017-07-26 10:15:23 -0400635 /** \enum SkPaint::Cap
636 Cap draws at the beginning and end of an open path contour.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000637 */
638 enum Cap {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400639 kButt_Cap, //!< Does not extend the stroke past the beginning or the end.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000640
Cary Clark50fa3ff2017-07-26 10:15:23 -0400641 /** Adds a circle with a diameter equal to stroke width at the beginning
642 and end.
643 */
644 kRound_Cap,
645
646 /** Adds a square with sides equal to stroke width at the beginning
647 and end. The square sides are parallel to the initial and final direction
648 of the stroke.
649 */
650 kSquare_Cap,
651 kLast_Cap = kSquare_Cap, //!< Equivalent to the largest value for Cap.
652
653 /** Equivalent to kButt_Cap.
654 Cap is set to kButt_Cap by default.
655 */
656 kDefault_Cap = kButt_Cap,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000657 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400658
bsalomona7d85ba2016-07-06 11:54:59 -0700659 static constexpr int kCapCount = kLast_Cap + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000660
Cary Clark50fa3ff2017-07-26 10:15:23 -0400661 /** \enum SkPaint::Join
662 Join specifies how corners are drawn when a shape is stroked. The paint's Join setting
663 affects the four corners of a stroked rectangle, and the connected segments in a
664 stroked path.
665
666 Choose miter join to draw sharp corners. Choose round join to draw a circle with a
667 radius equal to the stroke width on top of the corner. Choose bevel join to minimally
668 connect the thick strokes.
669
670 The fill path constructed to describe the stroked path respects the join setting but may
671 not contain the actual join. For instance, a fill path constructed with round joins does
672 not necessarily include circles at each connected segment.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000673 */
674 enum Join {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400675 /** Extends the outside of the to the extent allowed by miter limit.
676 If the extension exceeds miter limit, kBevel_Join is used instead.
677 */
678 kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000679
Cary Clark50fa3ff2017-07-26 10:15:23 -0400680 /** Adds a circle with a diameter of stroke width at the sharp corner. */
681 kRound_Join,
682 kBevel_Join, //!< Connects the outside edges of the sharp corner.
683 kLast_Join = kBevel_Join, //!< Equivalent to the largest value for Join.
684
685 /** Equivalent to kMiter_Join.
686 Join is set to kMiter_Join by default.
687 */
688 kDefault_Join = kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000689 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400690
bsalomona7d85ba2016-07-06 11:54:59 -0700691 static constexpr int kJoinCount = kLast_Join + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000692
Cary Clark50fa3ff2017-07-26 10:15:23 -0400693 /** The geometry drawn at the beginning and end of strokes.
694
695 @return one of: kButt_Cap, kRound_Cap, kSquare_Cap
reed@android.com8a1c16f2008-12-17 15:59:43 +0000696 */
reedf59eab22014-07-14 14:39:15 -0700697 Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000698
Cary Clark50fa3ff2017-07-26 10:15:23 -0400699 /** The geometry drawn at the beginning and end of strokes.
700
701 @param cap one of: kButt_Cap, kRound_Cap, kSquare_Cap;
702 has no effect if cap is not valid
reed@android.com8a1c16f2008-12-17 15:59:43 +0000703 */
704 void setStrokeCap(Cap cap);
705
Cary Clark50fa3ff2017-07-26 10:15:23 -0400706 /** The geometry drawn at the corners of strokes.
707
708 @return one of: kMiter_Join, kRound_Join, kBevel_Join
reed@android.com8a1c16f2008-12-17 15:59:43 +0000709 */
reedf59eab22014-07-14 14:39:15 -0700710 Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000711
Cary Clark50fa3ff2017-07-26 10:15:23 -0400712 /** The geometry drawn at the corners of strokes.
713
714 @param join one of: kMiter_Join, kRound_Join, kBevel_Join;
715 otherwise, setStrokeJoin has no effect
reed@android.com8a1c16f2008-12-17 15:59:43 +0000716 */
717 void setStrokeJoin(Join join);
718
Cary Clark50fa3ff2017-07-26 10:15:23 -0400719 /** The filled equivalent of the stroked path.
720
721 @param src SkPath read to create a filled version
722 @param dst resulting SkPath; may be the same as src, but may not be nullptr
723 @param cullRect optional limit passed to SkPathEffect
724 @param resScale if > 1, increase precision, else if (0 < res < 1) reduce precision
725 to favor speed and size
726 @return true if the path represents style fill, or false if it represents Hairline
727 */
reed05d90442015-02-12 13:35:52 -0800728 bool getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
729 SkScalar resScale = 1) const;
730
Cary Clark50fa3ff2017-07-26 10:15:23 -0400731 /** The filled equivalent of the stroked path.
732
733 @param src SkPath read to create a filled version
734 @param dst resulting SkPath; may be the same as src, but may not be nullptr
735 @param cullRect optional limit passed to SkPathEffect
736 @param resScale if > 1, increase precision, else if (0 < res < 1) reduce precision
737 to favor speed and size
738 @return true if the path represents style fill, or false if it represents Hairline
739 */
reed05d90442015-02-12 13:35:52 -0800740 bool getFillPath(const SkPath& src, SkPath* dst) const {
741 return this->getFillPath(src, dst, NULL, 1);
742 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000743
Cary Clark50fa3ff2017-07-26 10:15:23 -0400744 /** Optional colors used when filling a path, such as a gradient.
745
746 Does not alter SkShader SkRefCnt.
747
748 @return SkShader if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000749 */
reeda5ab9ec2016-03-06 18:10:48 -0800750 SkShader* getShader() const { return fShader.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400751
752 /** Optional colors used when filling a path, such as a gradient.
753
754 Increases SkShader SkRefCnt by one.
755
756 @return SkShader if previously set, nullptr otherwise
757 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500758 sk_sp<SkShader> refShader() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000759
Cary Clark50fa3ff2017-07-26 10:15:23 -0400760 /** Optional colors used when filling a path, such as a gradient.
761
762 Sets SkShader to shader, decrementing SkRefCnt of the previous SkShader.
763 Does not alter shader SkRefCnt.
764
765 @param shader how geometry is filled with color; if nullptr, Color is used instead
766 */
Cary Clark0418a882017-05-10 09:07:42 -0400767 void setShader(sk_sp<SkShader> shader);
reed@google.com9d07fec2011-03-16 20:02:59 +0000768
Cary Clark50fa3ff2017-07-26 10:15:23 -0400769 /** Returns SkColorFilter if set, or nullptr.
770 Does not alter SkColorFilter SkRefCnt.
771
772 @return SkColorFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000773 */
reeda5ab9ec2016-03-06 18:10:48 -0800774 SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400775
776 /** Returns SkColorFilter if set, or nullptr.
777 Increases SkColorFilter SkRefCnt by one.
778
779 @return SkColorFilter if set, or nullptr
780 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500781 sk_sp<SkColorFilter> refColorFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000782
Cary Clark50fa3ff2017-07-26 10:15:23 -0400783 /** Sets SkColorFilter to filter, decrementing SkRefCnt of the previous SkColorFilter.
784 Pass nullptr to clear SkColorFilter.
785 Does not alter filter SkRefCnt.
786
787 @param colorFilter SkColorFilter to apply to subsequent draw
reed@android.com8a1c16f2008-12-17 15:59:43 +0000788 */
Cary Clark0418a882017-05-10 09:07:42 -0400789 void setColorFilter(sk_sp<SkColorFilter> colorFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000790
Cary Clark50fa3ff2017-07-26 10:15:23 -0400791 /** Returns SkBlendMode.
792 By default, getBlendMode returns SkBlendMode::kSrcOver.
793
794 @return mode used to combine source color with destination color
795 */
reed374772b2016-10-05 17:33:02 -0700796 SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400797
798 /** Returns true if SkBlendMode is SkBlendMode::kSrcOver, the default.
799
800 @return true if SkBlendMode is SkBlendMode::kSrcOver
801 */
reed374772b2016-10-05 17:33:02 -0700802 bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400803
804 /** Sets SkBlendMode to mode.
805 Does not check for valid input.
806
807 @param mode SkBlendMode used to combine source color and destination
808 */
reed374772b2016-10-05 17:33:02 -0700809 void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
reed@android.coma0f5d152009-06-22 17:38:10 +0000810
Cary Clark50fa3ff2017-07-26 10:15:23 -0400811 /** Returns SkPathEffect if set, or nullptr.
812 Does not alter SkPathEffect SkRefCnt.
813
814 @return SkPathEffect if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000815 */
reeda5ab9ec2016-03-06 18:10:48 -0800816 SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400817
818 /** Returns SkPathEffect if set, or nullptr.
819 Increases SkPathEffect SkRefCnt by one.
820
821 @return SkPathEffect if previously set, nullptr otherwise
822 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500823 sk_sp<SkPathEffect> refPathEffect() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000824
Cary Clark50fa3ff2017-07-26 10:15:23 -0400825 /** Sets SkPathEffect to pathEffect,
826 decrementing SkRefCnt of the previous SkPathEffect.
827 Pass nullptr to leave the path geometry unaltered.
828 Does not alter pathEffect SkRefCnt.
829
830 @param pathEffect replace SkPath with a modification when drawn
reed@android.com8a1c16f2008-12-17 15:59:43 +0000831 */
Cary Clark0418a882017-05-10 09:07:42 -0400832 void setPathEffect(sk_sp<SkPathEffect> pathEffect);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000833
Cary Clark50fa3ff2017-07-26 10:15:23 -0400834 /** Returns SkMaskFilter if set, or nullptr.
835 Does not alter SkMaskFilter SkRefCnt.
836
837 @return SkMaskFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000838 */
reeda5ab9ec2016-03-06 18:10:48 -0800839 SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400840
841 /** Returns SkMaskFilter if set, or nullptr.
842 Increases SkMaskFilter SkRefCnt by one.
843
844 @return SkMaskFilter if previously set, nullptr otherwise
845 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500846 sk_sp<SkMaskFilter> refMaskFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000847
Cary Clark50fa3ff2017-07-26 10:15:23 -0400848 /** Sets SkMaskFilter to maskFilter,
849 decrementing SkRefCnt of the previous SkMaskFilter.
850 Pass nullptr to clear SkMaskFilter and leave SkMaskFilter effect on mask alpha unaltered.
851 Does not affect SkRasterizer.
852 Does not alter maskFilter SkRefCnt.
853
854 @param maskFilter modifies clipping mask generated from drawn geometry
reed@android.com8a1c16f2008-12-17 15:59:43 +0000855 */
Cary Clark0418a882017-05-10 09:07:42 -0400856 void setMaskFilter(sk_sp<SkMaskFilter> maskFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000857
Cary Clark50fa3ff2017-07-26 10:15:23 -0400858 /** Returns SkTypeface if set, or nullptr.
859 Does not alter SkTypeface SkRefCnt.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000860
Cary Clark50fa3ff2017-07-26 10:15:23 -0400861 @return SkTypeface if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000862 */
reeda5ab9ec2016-03-06 18:10:48 -0800863 SkTypeface* getTypeface() const { return fTypeface.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400864
865 /** Increases SkTypeface SkRefCnt by one.
866
867 @return SkTypeface if previously set, nullptr otherwise
868 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500869 sk_sp<SkTypeface> refTypeface() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000870
Cary Clark50fa3ff2017-07-26 10:15:23 -0400871 /** Sets SkTypeface to typeface,
872 decrementing SkRefCnt of the previous SkTypeface.
873 Pass nullptr to clear SkTypeface and use the default typeface.
874 Does not alter typeface SkRefCnt.
875
876 @param typeface font and style used to draw text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000877 */
Cary Clark0418a882017-05-10 09:07:42 -0400878 void setTypeface(sk_sp<SkTypeface> typeface);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000879
Cary Clark50fa3ff2017-07-26 10:15:23 -0400880 /** Returns SkRasterizer if set, or nullptr.
881 Does not alter SkRasterizer SkRefCnt.
882
883 @return SkRasterizer if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000884 */
reeda5ab9ec2016-03-06 18:10:48 -0800885 SkRasterizer* getRasterizer() const { return fRasterizer.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400886
887 /** refRasterizer() returns SkRasterizer if set, or nullptr.
888 refRasterizer increases SkRasterizer SkRefCnt by one.
889
890 @return SkRasterizer if previously set, nullptr otherwise
891 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500892 sk_sp<SkRasterizer> refRasterizer() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000893
Cary Clark50fa3ff2017-07-26 10:15:23 -0400894 /** Sets SkRasterizer to rasterizer,
895 decrementing SkRefCnt of the previous SkRasterizer.
896 Pass nullptr to clear SkRasterizer and leave SkRasterizer effect on mask alpha unaltered.
897 Does not affect SkMaskFilter.
898 Does not alter rasterizer SkRefCnt.
899
900 @param rasterizer how geometry is converted to mask alpha
reed@android.com8a1c16f2008-12-17 15:59:43 +0000901 */
Cary Clark0418a882017-05-10 09:07:42 -0400902 void setRasterizer(sk_sp<SkRasterizer> rasterizer);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000903
Cary Clark50fa3ff2017-07-26 10:15:23 -0400904 /** Returns SkImageFilter if set, or nullptr.
905 Does not alter SkImageFilter SkRefCnt.
906
907 @return SkImageFilter if previously set, nullptr otherwise
908 */
reeda5ab9ec2016-03-06 18:10:48 -0800909 SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400910
911 /** Returns SkImageFilter if set, or nullptr.
912 Increases SkImageFilter SkRefCnt by one.
913
914 @return SkImageFilter if previously set, nullptr otherwise
915 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500916 sk_sp<SkImageFilter> refImageFilter() const;
Cary Clark50fa3ff2017-07-26 10:15:23 -0400917
918 /** Sets SkImageFilter to imageFilter,
919 decrementing SkRefCnt of the previous SkImageFilter.
920 Pass nullptr to clear SkImageFilter, and remove SkImageFilter effect
921 on drawing.
922 Does not affect SkRasterizer or SkMaskFilter.
923 Does not alter imageFilter SkRefCnt.
924
925 @param imageFilter how SkImage is sampled when transformed
926 */
Cary Clark0418a882017-05-10 09:07:42 -0400927 void setImageFilter(sk_sp<SkImageFilter> imageFilter);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000928
Cary Clark50fa3ff2017-07-26 10:15:23 -0400929 /** Returns SkDrawLooper if set, or nullptr.
930 Does not alter SkDrawLooper SkRefCnt.
931
932 @return SkDrawLooper if previously set, nullptr otherwise
933 */
reed46f2d0a2016-09-11 05:40:31 -0700934 SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400935
936 /** Returns SkDrawLooper if set, or nullptr.
937 Increases SkDrawLooper SkRefCnt by one.
938
939 @return SkDrawLooper if previously set, nullptr otherwise
940 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500941 sk_sp<SkDrawLooper> refDrawLooper() const;
942
Cary Clark50fa3ff2017-07-26 10:15:23 -0400943 /** (to be deprecated)
944
945 @return SkDrawLooper if previously set, nullptr otherwise
946 */
reed46f2d0a2016-09-11 05:40:31 -0700947 SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400948
949 /** Sets SkDrawLooper to drawLooper,
950 decrementing SkRefCnt of the previous drawLooper.
951 Pass nullptr to clear SkDrawLooper and leave SkDrawLooper effect on drawing unaltered.
952 setDrawLooper does not alter drawLooper SkRefCnt.
953
954 @param drawLooper Iterates through drawing one or more time, altering SkPaint
955 */
Cary Clark0418a882017-05-10 09:07:42 -0400956 void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
Mike Reed09d94352016-10-31 15:11:04 -0400957
Cary Clark50fa3ff2017-07-26 10:15:23 -0400958 /** (to be deprecated)
959
960 @param drawLooper sets SkDrawLooper to drawLooper
961 */
Cary Clark0418a882017-05-10 09:07:42 -0400962 void setLooper(sk_sp<SkDrawLooper> drawLooper);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000963
Cary Clark50fa3ff2017-07-26 10:15:23 -0400964 /** \enum SkPaint::Align
965 Align adjusts the text relative to the text position.
966 Align affects glyphs drawn with: SkCanvas::drawText, SkCanvas::drawPosText,
967 SkCanvas::drawPosTextH, SkCanvas::drawTextOnPath,
968 SkCanvas::drawTextOnPathHV, SkCanvas::drawTextRSXform, SkCanvas::drawTextBlob,
969 and SkCanvas::drawString;
970 as well as calls that place text glyphs like getTextWidths and getTextPath.
971
972 The text position is set by the font for both horizontal and vertical text.
973 Typically, for horizontal text, the position is to the left side of the glyph on the
974 base line;and for vertical text, the position is the horizontal center at the glyph
975 at the caps height.
976
977 Align adjusts the glyph position to center it or move it to abut the position
978 using the metrics returned by the font.
979
980 Align defaults to kLeft_Align.
981 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000982 enum Align {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400983 /** Leaves the glyph at the position computed by the font offset by the text position. */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000984 kLeft_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400985
986 /** Moves the glyph half its width if Flags has kVerticalText_Flag clear, and
987 half its height if Flags has kVerticalText_Flag set.
988 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000989 kCenter_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400990
991 /** Moves the glyph by its width if Flags has kVerticalText_Flag clear,
992 and by its height if Flags has kVerticalText_Flag set.
993 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000994 kRight_Align,
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +0000995 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400996
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +0000997 enum {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400998 kAlignCount = 3, //!< The number of different Align values defined.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000999 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001000
Cary Clark50fa3ff2017-07-26 10:15:23 -04001001 /** Returns SkPaint::Align.
1002 Returns kLeft_Align if SkPaint::Align has not been set.
1003
1004 @return text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +00001005 */
reedf59eab22014-07-14 14:39:15 -07001006 Align getTextAlign() const { return (Align)fBitfields.fTextAlign; }
reed@google.com9d07fec2011-03-16 20:02:59 +00001007
Cary Clark50fa3ff2017-07-26 10:15:23 -04001008 /** Sets SkPaint::Align to align.
1009 Has no effect if align is an invalid value.
1010
1011 @param align text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +00001012 */
1013 void setTextAlign(Align align);
1014
Cary Clark50fa3ff2017-07-26 10:15:23 -04001015 /** Returns text size in points.
1016
1017 @return typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +00001018 */
1019 SkScalar getTextSize() const { return fTextSize; }
1020
Cary Clark50fa3ff2017-07-26 10:15:23 -04001021 /** Sets text size in points.
1022 Has no effect if textSize is not greater than or equal to zero.
1023
1024 @param textSize typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +00001025 */
1026 void setTextSize(SkScalar textSize);
1027
Cary Clark50fa3ff2017-07-26 10:15:23 -04001028 /** Returns text scale x.
1029 Default value is 1.
1030
1031 @return text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001032 */
1033 SkScalar getTextScaleX() const { return fTextScaleX; }
1034
Cary Clark50fa3ff2017-07-26 10:15:23 -04001035 /** Sets text scale x.
1036 Default value is 1.
1037
1038 @param scaleX text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001039 */
1040 void setTextScaleX(SkScalar scaleX);
1041
Cary Clark50fa3ff2017-07-26 10:15:23 -04001042 /** Returns text skew x.
1043 Default value is zero.
1044
1045 @return additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001046 */
1047 SkScalar getTextSkewX() const { return fTextSkewX; }
1048
Cary Clark50fa3ff2017-07-26 10:15:23 -04001049 /** Sets text skew x.
1050 Default value is zero.
1051
1052 @param skewX additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001053 */
1054 void setTextSkewX(SkScalar skewX);
1055
Cary Clark50fa3ff2017-07-26 10:15:23 -04001056 /** \enum SkPaint::TextEncoding
1057 TextEncoding determines whether text specifies character codes and their encoded size,
1058 or glyph indices. Character codes use the encoding specified by the Unicode standard .
1059 Character codes encoded size are specified by UTF-8, UTF-16, or UTF-32.
1060 All character encoding are able to represent all of Unicode, differing only
1061 in the total storage required. UTF-8 (RFC 3629) is made up of 8-bit bytes,
1062 and is a superset of ASCII. UTF-16 (RFC 2781) is made up of 16-bit words,
1063 and is a superset of Unicode ranges 0x0000 to 0xD7FF and 0xE000 to 0xFFFF. UTF-32 is
1064 made up of 32-bit words, and is a superset of Unicode.
1065
1066 font manager uses font data to convert character code points into glyph indices.
1067 A glyph index is a 16-bit word.
1068
1069 TextEncoding is set to kUTF8_TextEncoding by default.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001070 */
1071 enum TextEncoding {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001072 kUTF8_TextEncoding, //!< Uses bytes to represent UTF-8 or ASCII.
1073 kUTF16_TextEncoding, //!< Uses two byte words to represent most of Unicode.
1074 kUTF32_TextEncoding, //!< Uses four byte words to represent all of Unicode.
1075 kGlyphID_TextEncoding, //!< Uses two byte words to represent glyph indices.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001076 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001077
Cary Clark50fa3ff2017-07-26 10:15:23 -04001078 /** Returns SkPaint::TextEncoding.
1079 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1080
1081 @return one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
1082 kGlyphID_TextEncoding
1083 */
reedf59eab22014-07-14 14:39:15 -07001084 TextEncoding getTextEncoding() const {
1085 return (TextEncoding)fBitfields.fTextEncoding;
1086 }
reed@android.com8a1c16f2008-12-17 15:59:43 +00001087
Cary Clark50fa3ff2017-07-26 10:15:23 -04001088 /** Sets SkPaint::TextEncoding to encoding.
1089 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1090 Invalid values for encoding are ignored.
1091
1092 @param encoding one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
1093 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001094 void setTextEncoding(TextEncoding encoding);
1095
Cary Clark50fa3ff2017-07-26 10:15:23 -04001096 /** \struct SkPaint::FontMetrics
1097 FontMetrics is filled out by getFontMetrics. FontMetrics contents reflect the values
1098 computed by font manager using SkTypeface. Values are set to zero if they are
1099 not availble.
1100
1101 fUnderlineThickness and fUnderlinePosition have a bit set in fFlags if their values
1102 are valid, since their value may be zero.
1103
1104 fStrikeoutThickness and fStrikeoutPosition have a bit set in fFlags if their values
1105 are valid, since their value may be zero.
1106 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001107 struct FontMetrics {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001108
1109 /** \enum SkPaint::FontMetrics::FontMetricsFlags
1110 FontMetricsFlags are set in fFlags when underline metrics are valid;
1111 the underline metric may be valid and zero.
1112 Fonts with embedded bitmaps may not have valid underline metrics.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001113 */
1114 enum FontMetricsFlags {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001115 kUnderlineThicknessIsValid_Flag = 1 << 0, //!< Set if fUnderlineThickness is valid.
1116 kUnderlinePositionIsValid_Flag = 1 << 1, //!< Set if fUnderlinePosition is valid.
1117 kStrikeoutThicknessIsValid_Flag = 1 << 2, //!< Set if fStrikeoutThickness is valid.
1118 kStrikeoutPositionIsValid_Flag = 1 << 3, //!< Set if fStrikeoutPosition is valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001119 };
1120
Cary Clark50fa3ff2017-07-26 10:15:23 -04001121 uint32_t fFlags; //!< fFlags is set when underline metrics are valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001122
Cary Clark50fa3ff2017-07-26 10:15:23 -04001123 /** Largest height for any glyph.
1124 A measure from the baseline, and is less than or equal to zero.
1125 */
1126 SkScalar fTop;
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001127
Cary Clark50fa3ff2017-07-26 10:15:23 -04001128 /** Recommended distance above the baseline to reserve for a line of text.
1129 A measure from the baseline, and is less than or equal to zero.
1130 */
1131 SkScalar fAscent;
Ben Wagner219f3622017-07-17 15:32:25 -04001132
Cary Clark50fa3ff2017-07-26 10:15:23 -04001133 /** Recommended distance below the baseline to reserve for a line of text.
1134 A measure from the baseline, and is greater than or equal to zero.
1135 */
1136 SkScalar fDescent;
Ben Wagner219f3622017-07-17 15:32:25 -04001137
Cary Clark50fa3ff2017-07-26 10:15:23 -04001138 /** Greatest extent below the baseline for any glyph.
1139 A measure from the baseline, and is greater than or equal to zero.
1140 */
1141 SkScalar fBottom;
1142
1143 /** Recommended distance to add between lines of text.
1144 Greater than or equal to zero.
1145 */
1146 SkScalar fLeading;
1147
1148 /** Average character width, if it is available.
1149 Zero if no average width is stored in the font.
1150 */
1151 SkScalar fAvgCharWidth;
1152 SkScalar fMaxCharWidth; //!< Maximum character width.
1153
1154 /** Minimum bounding box x value for all glyphs.
1155 Typically less than zero.
1156 */
1157 SkScalar fXMin;
1158
1159 /** Maximum bounding box x value for all glyphs.
1160 Typically greater than zero.
1161 */
1162 SkScalar fXMax;
1163
1164 /** Height of a lower-case 'x'.
1165 May be zero if no lower-case height is stored in the font.
1166 */
1167 SkScalar fXHeight;
1168
1169 /** Height of an upper-case letter.
1170 May be zero if no upper-case height is stored in the font.
1171 */
1172 SkScalar fCapHeight;
1173
1174 /** Underline thickness. If the metric
1175 is valid, the kUnderlineThicknessIsValid_Flag is set in fFlags.
1176 If kUnderlineThicknessIsValid_Flag is clear, fUnderlineThickness is zero.
1177 */
1178 SkScalar fUnderlineThickness;
1179
1180 /** Underline position relative to the baseline.
1181 It may be negative, to draw the underline above the baseline, zero
1182 to draw the underline on the baseline, or positive to draw the underline
1183 below the baseline.
1184
1185 If the metric is valid, the kUnderlinePositionIsValid_Flag is set in fFlags.
1186 If kUnderlinePositionIsValid_Flag is clear, fUnderlinePosition is zero.
1187 */
1188 SkScalar fUnderlinePosition;
1189
1190 /** Strikeout thickness. If the metric
1191 is valid, the kStrikeoutThicknessIsValid_Flag is set in fFlags.
1192 If kStrikeoutThicknessIsValid_Flag is clear, fStrikeoutThickness is zero.
1193 */
1194 SkScalar fStrikeoutThickness;
1195
1196 /** Strikeout position relative to the baseline.
1197 It may be negative, to draw the strikeout above the baseline, zero
1198 to draw the strikeout on the baseline, or positive to draw the strikeout
1199 below the baseline.
1200
1201 If the metric is valid, the kStrikeoutPositionIsValid_Flag is set in fFlags.
1202 If kStrikeoutPositionIsValid_Flag is clear, fStrikeoutPosition is zero.
1203 */
1204 SkScalar fStrikeoutPosition;
1205
1206 /** If SkPaint::FontMetrics has a valid underline thickness, return true, and set
1207 thickness to that value. If it doesn't, return false, and ignore
1208 thickness.
1209
1210 @param thickness storage for underline width
1211 @return true if font specifies underline width
1212 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001213 bool hasUnderlineThickness(SkScalar* thickness) const {
Ben Wagner3318da52017-03-23 14:01:22 -04001214 if (SkToBool(fFlags & kUnderlineThicknessIsValid_Flag)) {
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001215 *thickness = fUnderlineThickness;
1216 return true;
1217 }
1218 return false;
1219 }
1220
Cary Clark50fa3ff2017-07-26 10:15:23 -04001221 /** If SkPaint::FontMetrics has a valid underline position, return true, and set
1222 position to that value. If it doesn't, return false, and ignore
1223 position.
1224
1225 @param position storage for underline position
1226 @return true if font specifies underline position
1227 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001228 bool hasUnderlinePosition(SkScalar* position) const {
1229 if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) {
1230 *position = fUnderlinePosition;
1231 return true;
1232 }
1233 return false;
1234 }
1235
Cary Clark50fa3ff2017-07-26 10:15:23 -04001236 /** If SkPaint::FontMetrics has a valid strikeout thickness, return true, and set
1237 thickness to that value. If it doesn't, return false, and ignore
1238 thickness.
1239
1240 @param thickness storage for strikeout width
1241 @return true if font specifies strikeout width
1242 */
Ben Wagner219f3622017-07-17 15:32:25 -04001243 bool hasStrikeoutThickness(SkScalar* thickness) const {
1244 if (SkToBool(fFlags & kStrikeoutThicknessIsValid_Flag)) {
1245 *thickness = fStrikeoutThickness;
1246 return true;
1247 }
1248 return false;
1249 }
1250
Cary Clark50fa3ff2017-07-26 10:15:23 -04001251 /** If SkPaint::FontMetrics has a valid strikeout position, return true, and set
1252 position to that value. If it doesn't, return false, and ignore
1253 position.
1254
1255 @param position storage for strikeout position
1256 @return true if font specifies strikeout position
1257 */
Ben Wagner219f3622017-07-17 15:32:25 -04001258 bool hasStrikeoutPosition(SkScalar* position) const {
1259 if (SkToBool(fFlags & kStrikeoutPositionIsValid_Flag)) {
1260 *position = fStrikeoutPosition;
1261 return true;
1262 }
1263 return false;
1264 }
Cary Clark50fa3ff2017-07-26 10:15:23 -04001265
reed@android.com8a1c16f2008-12-17 15:59:43 +00001266 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001267
Cary Clark50fa3ff2017-07-26 10:15:23 -04001268 /** Returns SkPaint::FontMetrics associated with SkTypeface.
1269 The return value is the recommended spacing between lines: the sum of metrics
1270 descent, ascent, and leading.
1271 If metrics is not nullptr, SkPaint::FontMetrics is copied to metrics.
1272 Results are scaled by text size but does not take into account
1273 dimensions required by text scale x, text skew x, fake bold,
1274 style stroke, and SkPathEffect.
1275 Results can be additionally scaled by scale; a scale of zero
1276 is ignored.
1277
1278 @param metrics storage for SkPaint::FontMetrics from SkTypeface; may be nullptr
1279 @param scale additional multiplier for returned values
1280 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001281 */
1282 SkScalar getFontMetrics(FontMetrics* metrics, SkScalar scale = 0) const;
reed@google.com9d07fec2011-03-16 20:02:59 +00001283
Cary Clark50fa3ff2017-07-26 10:15:23 -04001284 /** Returns the recommended spacing between lines: the sum of metrics
1285 descent, ascent, and leading.
1286 Result is scaled by text size but does not take into account
1287 dimensions required by stroking and SkPathEffect.
1288 getFontSpacing returns the same result as getFontMetrics.
1289
1290 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001291 */
1292 SkScalar getFontSpacing() const { return this->getFontMetrics(NULL, 0); }
1293
Cary Clark50fa3ff2017-07-26 10:15:23 -04001294 /** Converts text into glyph indices.
1295 Returns the number of glyph indices represented by text.
1296 SkPaint::TextEncoding specifies how text represents characters or glyphs.
1297 glyphs may be nullptr, to compute the glyph count.
1298
1299 Does not check text for valid character encoding or valid
1300 glyph indices.
1301
1302 If byteLength equals zero, textToGlyphs returns zero.
1303 If byteLength includes a partial character, the partial character is ignored.
1304
1305 If SkPaint::TextEncoding is kUTF8_TextEncoding and
1306 text contains an invalid UTF-8 sequence, zero is returned.
1307
1308 @param text character stroage encoded with SkPaint::TextEncoding
1309 @param byteLength length of character storage in bytes
1310 @param glyphs storage for glyph indices; may be nullptr
1311 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001312 */
1313 int textToGlyphs(const void* text, size_t byteLength,
halcanaryd0e95a52016-07-25 07:18:12 -07001314 SkGlyphID glyphs[]) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001315
Cary Clark50fa3ff2017-07-26 10:15:23 -04001316 /** Returns true if all text corresponds to a non-zero glyph index.
1317 Returns false if any characters in text are not supported in
1318 SkTypeface.
reed@android.coma5dcaf62010-02-05 17:12:32 +00001319
Cary Clark50fa3ff2017-07-26 10:15:23 -04001320 If SkPaint::TextEncoding is kGlyphID_TextEncoding, containsText
1321 returns true if all glyph indices in text are non-zero; containsText
1322 does not check to see if text contains valid glyph indices for SkTypeface.
1323
1324 Returns true if bytelength is zero.
1325
1326 @param text array of characters or glyphs
1327 @param byteLength number of bytes in text array
1328 @return true if all text corresponds to a non-zero glyph index
1329 */
reed@android.coma5dcaf62010-02-05 17:12:32 +00001330 bool containsText(const void* text, size_t byteLength) const;
1331
Cary Clark50fa3ff2017-07-26 10:15:23 -04001332 /** Converts glyphs into text if possible.
1333 Glyph values without direct Unicode equivalents are mapped to zero.
1334 Uses the SkTypeface, but is unaffected
1335 by SkPaint::TextEncoding; the text values returned are equivalent to kUTF32_TextEncoding.
1336
1337 Only supported on platforms that use FreeType as the font engine.
1338
1339 @param glyphs array of indices into font
1340 @param count length of glyph array
1341 @param text storage for character codes, one per glyph
reed@android.com9d3a9852010-01-08 14:07:42 +00001342 */
halcanaryd0e95a52016-07-25 07:18:12 -07001343 void glyphsToUnichars(const SkGlyphID glyphs[], int count, SkUnichar text[]) const;
reed@android.com9d3a9852010-01-08 14:07:42 +00001344
Cary Clark50fa3ff2017-07-26 10:15:23 -04001345 /** Returns the number of glyphs in text.
1346 Uses SkPaint::TextEncoding to count the glyphs.
1347 Returns the same result as textToGlyphs.
1348
1349 @param text character stroage encoded with SkPaint::TextEncoding
1350 @param byteLength length of character storage in bytes
1351 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001352 */
reed@google.com9d07fec2011-03-16 20:02:59 +00001353 int countText(const void* text, size_t byteLength) const {
reed@android.com8a1c16f2008-12-17 15:59:43 +00001354 return this->textToGlyphs(text, byteLength, NULL);
1355 }
1356
Cary Clark50fa3ff2017-07-26 10:15:23 -04001357 /** Returns the advance width of text if kVerticalText_Flag is clear,
1358 and the height of text if kVerticalText_Flag is set.
1359 The advance is the normal distance to move before drawing additional text.
1360 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1361 and text size, text scale x, text skew x, stroke width, and
1362 SkPathEffect to scale the metrics and bounds.
1363 Returns the bounding box of text if bounds is not nullptr.
1364 The bounding box is computed as if the text was drawn at the origin.
1365
1366 @param text character codes or glyph indices to be measured
1367 @param length number of bytes of text to measure
1368 @param bounds returns bounding box relative to (0, 0) if not nullptr
1369 @return advance width or height
1370 */
reed99ae8812014-08-26 11:30:01 -07001371 SkScalar measureText(const void* text, size_t length, SkRect* bounds) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001372
Cary Clark50fa3ff2017-07-26 10:15:23 -04001373 /** Returns the advance width of text if kVerticalText_Flag is clear,
1374 and the height of text if kVerticalText_Flag is set.
1375 The advance is the normal distance to move before drawing additional text.
1376 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1377 and text size, text scale x, text skew x, stroke width, and
1378 SkPathEffect to scale the metrics and bounds.
1379 Returns the bounding box of text if bounds is not nullptr.
1380 The bounding box is computed as if the text was drawn at the origin.
1381
1382 @param text character codes or glyph indices to be measured
1383 @param length number of bytes of text to measure
1384 @param bounds returns bounding box relative to (0, 0) if not nullptr
1385 @return advance width or height
1386 */
reed@google.com9d07fec2011-03-16 20:02:59 +00001387 SkScalar measureText(const void* text, size_t length) const {
reed99ae8812014-08-26 11:30:01 -07001388 return this->measureText(text, length, NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +00001389 }
reed@google.com9d07fec2011-03-16 20:02:59 +00001390
Cary Clark50fa3ff2017-07-26 10:15:23 -04001391 /** Returns the bytes of text that fit within maxWidth.
1392 If kVerticalText_Flag is clear, the text fragment fits if its advance width is less than or
1393 equal to maxWidth.
1394 If kVerticalText_Flag is set, the text fragment fits if its advance height is less than or
1395 equal to maxWidth.
1396 Measures only while the advance is less than or equal to maxWidth.
1397 Returns the advance or the text fragment in measuredWidth if it not nullptr.
1398 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1399 and text size to scale the metrics.
1400 Does not scale the advance or bounds by fake bold or SkPathEffect.
1401
1402 @param text character codes or glyph indices to be measured
1403 @param length number of bytes of text to measure
1404 @param maxWidth advance limit; text is measured while advance is less than maxWidth
1405 @param measuredWidth returns the width of the text less than or equal to maxWidth
1406 @return bytes of text that fit, always less than or equal to length
1407 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001408 size_t breakText(const void* text, size_t length, SkScalar maxWidth,
reed9e96aa02014-10-03 12:44:37 -07001409 SkScalar* measuredWidth = NULL) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001410
Cary Clark50fa3ff2017-07-26 10:15:23 -04001411 /** Retrieves the advance and bounds for each glyph in text, and returns
1412 the glyph count in text.
1413 Both widths and bounds may be nullptr.
1414 If widths is not nullptr, widths must be an array of glyph count entries.
1415 if bounds is not nullptr, bounds must be an array of glyph count entries.
1416 If kVerticalText_Flag is clear, widths returns the horizontal advance.
1417 If kVerticalText_Flag is set, widths returns the vertical advance.
1418 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1419 and text size to scale the widths and bounds.
1420 Does not scale the advance by fake bold or SkPathEffect.
1421 Does return include fake bold and SkPathEffect in the bounds.
1422
1423 @param text character codes or glyph indices to be measured
1424 @param byteLength number of bytes of text to measure
1425 @param widths returns text advances for each glyph; may be nullptr
1426 @param bounds returns bounds for each glyph relative to (0, 0); may be nullptr
1427 @return glyph count in text
1428 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001429 int getTextWidths(const void* text, size_t byteLength, SkScalar widths[],
1430 SkRect bounds[] = NULL) const;
1431
Cary Clark50fa3ff2017-07-26 10:15:23 -04001432 /** Returns the geometry as SkPath equivalent to the drawn text.
1433 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1434 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1435 All of the glyph paths are stored in path.
1436 getTextPath uses x, y, and SkPaint::Align to position path.
1437
1438 @param text character codes or glyph indices
1439 @param length number of bytes of text
1440 @param x x-coordinate of the origin of the text
1441 @param y y-coordinate of the origin of the text
1442 @param path geometry of the glyphs
1443 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001444 void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y,
1445 SkPath* path) const;
1446
Cary Clark50fa3ff2017-07-26 10:15:23 -04001447 /** Returns the geometry as SkPath equivalent to the drawn text.
1448 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1449 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1450 All of the glyph paths are stored in path.
1451 Uses pos array and SkPaint::Align to position path.
1452 pos contains a position for each glyph.
1453
1454 @param text character codes or glyph indices
1455 @param length number of bytes of text
1456 @param pos positions of each glyph
1457 @param path geometry of the glyphs
1458 */
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001459 void getPosTextPath(const void* text, size_t length,
reed@google.comca0062e2012-07-20 11:20:32 +00001460 const SkPoint pos[], SkPath* path) const;
1461
Cary Clark50fa3ff2017-07-26 10:15:23 -04001462 /** Returns the number of intervals that intersect bounds.
1463 bounds describes a pair of lines parallel to the text advance.
1464 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1465 the string.
1466 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1467 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1468 Uses x, y, and SkPaint::Align to position intervals.
1469
1470 Pass nullptr for intervals to determine the size of the interval array.
1471
1472 intervals are cached to improve performance for multiple calls.
1473
1474 @param text character codes or glyph indices
1475 @param length number of bytes of text
1476 @param x x-coordinate of the origin of the text
1477 @param y y-coordinate of the origin of the text
1478 @param bounds lower and upper line parallel to the advance
1479 @param intervals returned intersections; may be nullptr
1480 @return number of intersections; may be zero
1481 */
caryclark0449bcf2016-02-09 13:25:45 -08001482 int getTextIntercepts(const void* text, size_t length, SkScalar x, SkScalar y,
1483 const SkScalar bounds[2], SkScalar* intervals) const;
1484
Cary Clark50fa3ff2017-07-26 10:15:23 -04001485 /** Returns the number of intervals that intersect bounds.
1486 bounds describes a pair of lines parallel to the text advance.
1487 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1488 the string.
1489 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1490 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1491 Uses pos array and SkPaint::Align to position intervals.
1492
1493 Pass nullptr for intervals to determine the size of the interval array.
1494
1495 intervals are cached to improve performance for multiple calls.
1496
1497 @param text character codes or glyph indices
1498 @param length number of bytes of text
1499 @param pos positions of each glyph
1500 @param bounds lower and upper line parallel to the advance
1501 @param intervals returned intersections; may be nullptr
1502 @return The number of intersections; may be zero
1503 */
caryclark0449bcf2016-02-09 13:25:45 -08001504 int getPosTextIntercepts(const void* text, size_t length, const SkPoint pos[],
1505 const SkScalar bounds[2], SkScalar* intervals) const;
1506
Cary Clark50fa3ff2017-07-26 10:15:23 -04001507 /** Returns the number of intervals that intersect bounds.
1508 bounds describes a pair of lines parallel to the text advance.
1509 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1510 the string.
1511 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1512 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1513 Uses xpos array, constY, and SkPaint::Align to position intervals.
1514
1515 Pass nullptr for intervals to determine the size of the interval array.
1516
1517 intervals are cached to improve performance for multiple calls.
1518
1519 @param text character codes or glyph indices
1520 @param length number of bytes of text
1521 @param xpos positions of each glyph in x
1522 @param constY position of each glyph in y
1523 @param bounds lower and upper line parallel to the advance
1524 @param intervals returned intersections; may be nullptr
1525 @return number of intersections; may be zero
1526 */
fmalitaeae6a912016-07-28 09:47:24 -07001527 int getPosTextHIntercepts(const void* text, size_t length, const SkScalar xpos[],
1528 SkScalar constY, const SkScalar bounds[2], SkScalar* intervals) const;
1529
Cary Clark50fa3ff2017-07-26 10:15:23 -04001530 /** Returns the number of intervals that intersect bounds.
1531 bounds describes a pair of lines parallel to the text advance.
1532 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1533 the string.
1534 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1535 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1536 Uses pos array and SkPaint::Align to position intervals.
1537
1538 Pass nullptr for intervals to determine the size of the interval array.
1539
1540 intervals are cached to improve performance for multiple calls.
1541
1542 @param blob glyphs, positions, and text paint attributes
1543 @param bounds lower and upper line parallel to the advance
1544 @param intervals returned intersections; may be nullptr
1545 @return number of intersections; may be zero
1546 */
fmalitaeae6a912016-07-28 09:47:24 -07001547 int getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds[2],
1548 SkScalar* intervals) const;
1549
Cary Clark50fa3ff2017-07-26 10:15:23 -04001550 /** Returns the union of bounds of all glyphs.
1551 Returned dimensions are computed by font manager from font data,
1552 ignoring SkPaint::Hinting. getFontBounds includes text size, text scale x,
1553 and text skew x, but not fake bold or SkPathEffect.
1554
1555 If text size is large, text scale x is one, and text skew x is zero,
1556 getFontBounds returns the same bounds as SkPaint::FontMetrics { FontMetrics::fXMin,
1557 FontMetrics::fTop, FontMetrics::fXMax, FontMetrics::fBottom }.
1558
1559 @return union of bounds of all glyphs
1560 */
reed8893e5f2014-12-15 13:27:26 -08001561 SkRect getFontBounds() const;
1562
Cary Clark50fa3ff2017-07-26 10:15:23 -04001563 /** Returns true if SkPaint prevents all drawing.
1564 If nothingToDraw returns false, the SkPaint may or may not allow drawing.
1565
1566 Returns true if SkBlendMode and alpha are enabled,
1567 and computed alpha is zero.
1568
1569 @return true if SkPaint prevents all drawing
1570 */
reed@google.com632e1a22011-10-06 12:37:00 +00001571 bool nothingToDraw() const;
1572
Cary Clark50fa3ff2017-07-26 10:15:23 -04001573 /** (to be made private)
1574 Returns true if SkPaint does not include elements requiring extensive computation
1575 to compute SkBaseDevice bounds of drawn geometry. For instance, SkPaint with SkPathEffect
1576 always returns false.
reed@google.comd5f20792012-05-16 14:15:02 +00001577
Cary Clark50fa3ff2017-07-26 10:15:23 -04001578 @return true if SkPaint allows for fast computation of bounds
1579 */
senorblanco0abdf762015-08-20 11:10:41 -07001580 bool canComputeFastBounds() const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001581
Cary Clark50fa3ff2017-07-26 10:15:23 -04001582 /** (to be made private)
1583 Only call this if canComputeFastBounds returned true. This takes a
1584 raw rectangle (the raw bounds of a shape), and adjusts it for stylistic
1585 effects in the paint (e.g. stroking). If needed, it uses the storage
1586 rect parameter. It returns the adjusted bounds that can then be used
1587 for SkCanvas::quickReject tests.
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001588
Cary Clark50fa3ff2017-07-26 10:15:23 -04001589 The returned rect will either be orig or storage, thus the caller
1590 should not rely on storage being set to the result, but should always
1591 use the retured value. It is legal for orig and storage to be the same
1592 rect.
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001593
Cary Clark50fa3ff2017-07-26 10:15:23 -04001594 e.g.
1595 if (paint.canComputeFastBounds()) {
1596 SkRect r, storage;
1597 path.computeBounds(&r, SkPath::kFast_BoundsType);
1598 const SkRect& fastR = paint.computeFastBounds(r, &storage);
1599 if (canvas->quickReject(fastR, ...)) {
1600 // don't draw the path
1601 }
1602 }
1603
1604 @param orig geometry modified by SkPaint when drawn
1605 @param storage computed bounds of geometry; may not be nullptr
1606 @return fast computed bounds
1607 */
reed@google.coma584aed2012-05-16 14:06:02 +00001608 const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const {
Brian Osman60751d72017-05-12 11:21:36 -04001609 // Things like stroking, etc... will do math on the bounds rect, assuming that it's sorted.
1610 SkASSERT(orig.isSorted());
reed@google.coma584aed2012-05-16 14:06:02 +00001611 SkPaint::Style style = this->getStyle();
1612 // ultra fast-case: filling with no effects that affect geometry
1613 if (kFill_Style == style) {
1614 uintptr_t effects = reinterpret_cast<uintptr_t>(this->getLooper());
1615 effects |= reinterpret_cast<uintptr_t>(this->getMaskFilter());
1616 effects |= reinterpret_cast<uintptr_t>(this->getPathEffect());
senorblanco@chromium.org336d1d72014-01-27 21:03:17 +00001617 effects |= reinterpret_cast<uintptr_t>(this->getImageFilter());
reed@google.coma584aed2012-05-16 14:06:02 +00001618 if (!effects) {
1619 return orig;
1620 }
1621 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001622
reed@google.coma584aed2012-05-16 14:06:02 +00001623 return this->doComputeFastBounds(orig, storage, style);
1624 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001625
Cary Clark50fa3ff2017-07-26 10:15:23 -04001626 /** (to be made private)
1627
1628 @param orig geometry modified by SkPaint when drawn
1629 @param storage computed bounds of geometry
1630 @return fast computed bounds
1631 */
reed@google.coma584aed2012-05-16 14:06:02 +00001632 const SkRect& computeFastStrokeBounds(const SkRect& orig,
1633 SkRect* storage) const {
reed@google.com73a02582012-05-16 19:21:12 +00001634 return this->doComputeFastBounds(orig, storage, kStroke_Style);
reed@google.coma584aed2012-05-16 14:06:02 +00001635 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001636
Cary Clark50fa3ff2017-07-26 10:15:23 -04001637 /** (to be made private)
1638 Take the style explicitly, so the caller can force us to be stroked
1639 without having to make a copy of the paint just to change that field.
1640
1641 @param orig geometry modified by SkPaint when drawn
1642 @param storage computed bounds of geometry
1643 @param style overrides SkPaint::Style
1644 @return fast computed bounds
1645 */
reed@google.coma584aed2012-05-16 14:06:02 +00001646 const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
Cary Clark0418a882017-05-10 09:07:42 -04001647 Style style) const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001648
Cary Clark50fa3ff2017-07-26 10:15:23 -04001649 /**
1650 Converts SkPaint to machine parsable form in developer mode.
Cary Clark0418a882017-05-10 09:07:42 -04001651
Cary Clark50fa3ff2017-07-26 10:15:23 -04001652 @param str storage for string containing parsable SkPaint
1653 */
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +00001654 SK_TO_STRING_NONVIRT()
robertphillips@google.com791f12e2013-02-14 13:53:53 +00001655
reed@google.comd5f20792012-05-16 14:15:02 +00001656private:
Cary Clark0418a882017-05-10 09:07:42 -04001657 typedef const SkGlyph& (*GlyphCacheProc)(SkGlyphCache*, const char**);
1658
reeda5ab9ec2016-03-06 18:10:48 -08001659 sk_sp<SkTypeface> fTypeface;
1660 sk_sp<SkPathEffect> fPathEffect;
1661 sk_sp<SkShader> fShader;
reeda5ab9ec2016-03-06 18:10:48 -08001662 sk_sp<SkMaskFilter> fMaskFilter;
1663 sk_sp<SkColorFilter> fColorFilter;
1664 sk_sp<SkRasterizer> fRasterizer;
reed46f2d0a2016-09-11 05:40:31 -07001665 sk_sp<SkDrawLooper> fDrawLooper;
reeda5ab9ec2016-03-06 18:10:48 -08001666 sk_sp<SkImageFilter> fImageFilter;
reed@google.comd5f20792012-05-16 14:15:02 +00001667
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001668 SkScalar fTextSize;
1669 SkScalar fTextScaleX;
1670 SkScalar fTextSkewX;
reed@google.comd5f20792012-05-16 14:15:02 +00001671 SkColor fColor;
1672 SkScalar fWidth;
1673 SkScalar fMiterLimit;
Mike Reed71fecc32016-11-18 17:19:54 -05001674 uint32_t fBlendMode; // just need 5-6 bits
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001675 union {
1676 struct {
1677 // all of these bitfields should add up to 32
1678 unsigned fFlags : 16;
1679 unsigned fTextAlign : 2;
1680 unsigned fCapType : 2;
1681 unsigned fJoinType : 2;
1682 unsigned fStyle : 2;
1683 unsigned fTextEncoding : 2; // 3 values
1684 unsigned fHinting : 2;
reedf803da12015-01-23 05:58:07 -08001685 unsigned fFilterQuality : 2;
commit-bot@chromium.org85faf502014-04-16 12:58:02 +00001686 //unsigned fFreeBits : 2;
reedf59eab22014-07-14 14:39:15 -07001687 } fBitfields;
1688 uint32_t fBitfieldsUInt;
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001689 };
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001690
robertphillipse34f17d2016-07-19 07:59:22 -07001691 static GlyphCacheProc GetGlyphCacheProc(TextEncoding encoding,
1692 bool isDevKern,
1693 bool needFullMetrics);
reed@google.comd5f20792012-05-16 14:15:02 +00001694
1695 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length,
1696 int* count, SkRect* bounds) const;
1697
brianosmana1e8f8d2016-04-08 06:47:54 -07001698 enum ScalerContextFlags : uint32_t {
1699 kNone_ScalerContextFlags = 0,
1700
1701 kFakeGamma_ScalerContextFlag = 1 << 0,
1702 kBoostContrast_ScalerContextFlag = 1 << 1,
1703
1704 kFakeGammaAndBoostContrast_ScalerContextFlags =
1705 kFakeGamma_ScalerContextFlag | kBoostContrast_ScalerContextFlag,
bungemanf6d1e602016-02-22 13:20:28 -08001706 };
1707
joshualittfd450792015-03-13 08:38:43 -07001708 /*
1709 * Allocs an SkDescriptor on the heap and return it to the caller as a refcnted
1710 * SkData. Caller is responsible for managing the lifetime of this object.
1711 */
reeda9322c22016-04-12 06:47:05 -07001712 void getScalerContextDescriptor(SkScalerContextEffects*, SkAutoDescriptor*,
1713 const SkSurfaceProps& surfaceProps,
brianosmana1e8f8d2016-04-08 06:47:54 -07001714 uint32_t scalerContextFlags, const SkMatrix*) const;
joshualittfd450792015-03-13 08:38:43 -07001715
brianosmana1e8f8d2016-04-08 06:47:54 -07001716 SkGlyphCache* detachCache(const SkSurfaceProps* surfaceProps, uint32_t scalerContextFlags,
bungemanf6d1e602016-02-22 13:20:28 -08001717 const SkMatrix*) const;
reed@google.comd5f20792012-05-16 14:15:02 +00001718
brianosmana1e8f8d2016-04-08 06:47:54 -07001719 void descriptorProc(const SkSurfaceProps* surfaceProps, uint32_t scalerContextFlags,
bungemanf6d1e602016-02-22 13:20:28 -08001720 const SkMatrix* deviceMatrix,
reeda9322c22016-04-12 06:47:05 -07001721 void (*proc)(SkTypeface*, const SkScalerContextEffects&,
1722 const SkDescriptor*, void*),
bungemanf6d1e602016-02-22 13:20:28 -08001723 void* context) const;
reed@android.comd252db02009-04-01 18:31:44 +00001724
joshualitt9e36c1a2015-04-14 12:17:27 -07001725 /*
1726 * The luminance color is used to determine which Gamma Canonical color to map to. This is
1727 * really only used by backends which want to cache glyph masks, and need some way to know if
1728 * they need to generate new masks based off a given color.
1729 */
1730 SkColor computeLuminanceColor() const;
1731
reed@android.com8a1c16f2008-12-17 15:59:43 +00001732 enum {
reed@google.comed43dff2013-06-04 16:56:27 +00001733 /* This is the size we use when we ask for a glyph's path. We then
1734 * post-transform it as we draw to match the request.
1735 * This is done to try to re-use cache entries for the path.
1736 *
1737 * This value is somewhat arbitrary. In theory, it could be 1, since
1738 * we store paths as floats. However, we get the path from the font
1739 * scaler, and it may represent its paths as fixed-point (or 26.6),
1740 * so we shouldn't ask for something too big (might overflow 16.16)
1741 * or too small (underflow 26.6).
1742 *
1743 * This value could track kMaxSizeForGlyphCache, assuming the above
1744 * constraints, but since we ask for unhinted paths, the two values
1745 * need not match per-se.
1746 */
1747 kCanonicalTextSizeForPaths = 64,
reed@android.com8a1c16f2008-12-17 15:59:43 +00001748 };
reed@google.comed43dff2013-06-04 16:56:27 +00001749
1750 static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM);
1751
reed@google.comed43dff2013-06-04 16:56:27 +00001752 // Set flags/hinting/textSize up to use for drawing text as paths.
1753 // Returns scale factor to restore the original textSize, since will will
1754 // have change it to kCanonicalTextSizeForPaths.
1755 SkScalar setupForAsPaths();
1756
Mike Reedd5bee5d2017-06-01 14:45:44 -04001757 static SkScalar MaxCacheSize2();
reed@google.comed43dff2013-06-04 16:56:27 +00001758
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001759 friend class SkAutoGlyphCache;
jvanverth2d2a68c2014-06-10 06:42:56 -07001760 friend class SkAutoGlyphCacheNoGamma;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001761 friend class SkCanvas;
1762 friend class SkDraw;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001763 friend class SkPDFDevice;
joshualitte76b4bb2015-12-28 07:23:58 -08001764 friend class GrAtlasTextBlob;
joshualittdbd35932015-04-02 09:19:04 -07001765 friend class GrAtlasTextContext;
kkinnunenc6cb56f2014-06-24 00:12:27 -07001766 friend class GrStencilAndCoverTextContext;
cdalton855d83f2014-09-18 13:51:53 -07001767 friend class GrPathRendering;
joshualitt0a42e682015-12-10 13:20:58 -08001768 friend class GrTextUtils;
cdalton855d83f2014-09-18 13:51:53 -07001769 friend class GrGLPathRendering;
joshualitt9e36c1a2015-04-14 12:17:27 -07001770 friend class SkScalerContext;
caryclark0449bcf2016-02-09 13:25:45 -08001771 friend class SkTextBaseIter;
reed@google.comed43dff2013-06-04 16:56:27 +00001772 friend class SkCanonicalizePaint;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001773};
1774
reed@android.com8a1c16f2008-12-17 15:59:43 +00001775#endif