blob: 5fc8f451fd42a07417a35f89a09228bcb49de7e8 [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
Cary Clark23890a92017-07-27 16:30:51 -040051 pipeline and multiple pipeline stages may be affected by a single SkPaint.
Cary Clark50fa3ff2017-07-26 10:15:23 -040052
Cary Clark23890a92017-07-27 16:30:51 -040053 SkPaint collects effects and filters that describe single-pass and multiple-pass
Cary Clark50fa3ff2017-07-26 10:15:23 -040054 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 Clark23890a92017-07-27 16:30:51 -0400282 /** Replaces SkPaint::Flags with flags, the union of the SkPaint::Flags members.
283 All SkPaint::Flags members may be cleared, or one or more may be set.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400284
285 @param flags union of SkPaint::Flags for SkPaint
reed@android.com8a1c16f2008-12-17 15:59:43 +0000286 */
287 void setFlags(uint32_t flags);
288
Cary Clark50fa3ff2017-07-26 10:15:23 -0400289 /** If true, pixels on the active edges of SkPath may be drawn with partial transparency.
290
291 Equivalent to getFlags masked with kAntiAlias_Flag.
292
293 @return kAntiAlias_Flag state
294 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000295 bool isAntiAlias() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000296 return SkToBool(this->getFlags() & kAntiAlias_Flag);
297 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000298
Cary Clark50fa3ff2017-07-26 10:15:23 -0400299 /** Requests, but does not require, that SkPath edge pixels draw opaque or with
300 partial transparency.
301
302 Sets kAntiAlias_Flag if aa is true.
303 Clears kAntiAlias_Flag if aa is false.
304
305 @param aa setting for kAntiAlias_Flag
306 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000307 void setAntiAlias(bool aa);
reed@google.com9d07fec2011-03-16 20:02:59 +0000308
Cary Clark50fa3ff2017-07-26 10:15:23 -0400309 /** If true, color error may be distributed to smooth color transition.
310
311 Equivalent to getFlags masked with kDither_Flag.
312
313 @return kDither_Flag state
314 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000315 bool isDither() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000316 return SkToBool(this->getFlags() & kDither_Flag);
317 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000318
Cary Clark50fa3ff2017-07-26 10:15:23 -0400319 /** Requests, but does not require, to distribute color error.
320
321 Sets kDither_Flag if dither is true.
322 Clears kDither_Flag if dither is false.
323
324 @param dither setting for kDither_Flag
325 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000326 void setDither(bool dither);
reed@google.com9d07fec2011-03-16 20:02:59 +0000327
Cary Clark50fa3ff2017-07-26 10:15:23 -0400328 /** If true, text is converted to SkPath before drawing and measuring.
329
330 Equivalent to getFlags masked with kLinearText_Flag.
331
332 @return kLinearText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000333 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000334 bool isLinearText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000335 return SkToBool(this->getFlags() & kLinearText_Flag);
336 }
337
Cary Clark50fa3ff2017-07-26 10:15:23 -0400338 /** If true, text is converted to SkPath before drawing and measuring.
339 By default, kLinearText_Flag is clear.
340
341 Sets kLinearText_Flag if linearText is true.
342 Clears kLinearText_Flag if linearText is false.
343
344 @param linearText setting for kLinearText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000345 */
346 void setLinearText(bool linearText);
347
Cary Clark50fa3ff2017-07-26 10:15:23 -0400348 /** If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
349
350 Equivalent to getFlags masked with kSubpixelText_Flag.
351
352 @return kSubpixelText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000353 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000354 bool isSubpixelText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000355 return SkToBool(this->getFlags() & kSubpixelText_Flag);
356 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000357
Cary Clark50fa3ff2017-07-26 10:15:23 -0400358 /** Requests, but does not require, that glyphs respect sub-pixel positioning.
359
360 Sets kSubpixelText_Flag if subpixelText is true.
361 Clears kSubpixelText_Flag if subpixelText is false.
362
363 @param subpixelText setting for kSubpixelText_Flag
364 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000365 void setSubpixelText(bool subpixelText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000366
Cary Clark50fa3ff2017-07-26 10:15:23 -0400367 /** If true, glyphs may use LCD striping to improve glyph edges.
368
369 Returns true if SkPaint::Flags kLCDRenderText_Flag is set.
370
371 @return kLCDRenderText_Flag state
372 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000373 bool isLCDRenderText() const {
agl@chromium.org309485b2009-07-21 17:41:32 +0000374 return SkToBool(this->getFlags() & kLCDRenderText_Flag);
375 }
376
Cary Clark50fa3ff2017-07-26 10:15:23 -0400377 /** Requests, but does not require, that glyphs use LCD striping for glyph edges.
378
379 Sets kLCDRenderText_Flag if lcdText is true.
380 Clears kLCDRenderText_Flag if lcdText is false.
381
382 @param lcdText setting for kLCDRenderText_Flag
383 */
reed@google.com84b437e2011-08-01 12:45:35 +0000384 void setLCDRenderText(bool lcdText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000385
Cary Clark50fa3ff2017-07-26 10:15:23 -0400386 /** If true, font engine may return glyphs from font bitmaps instead of from outlines.
387
388 Equivalent to getFlags masked with kEmbeddedBitmapText_Flag.
389
390 @return kEmbeddedBitmapText_Flag state
391 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000392 bool isEmbeddedBitmapText() const {
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000393 return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
394 }
395
Cary Clark50fa3ff2017-07-26 10:15:23 -0400396 /** Requests, but does not require, to use bitmaps in fonts instead of outlines.
397
398 Sets kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is true.
399 Clears kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is false.
400
401 @param useEmbeddedBitmapText setting for kEmbeddedBitmapText_Flag
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000402 */
403 void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
404
Cary Clark50fa3ff2017-07-26 10:15:23 -0400405 /** If true, and if SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting, and if
406 platform uses FreeType as the font manager, instruct the font manager to always hint
407 Glyphs.
408
409 Equivalent to getFlags masked with kAutoHinting_Flag.
410
411 @return kAutoHinting_Flag state
412 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000413 bool isAutohinted() const {
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000414 return SkToBool(this->getFlags() & kAutoHinting_Flag);
415 }
416
Cary Clark50fa3ff2017-07-26 10:15:23 -0400417 /** If SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting and useAutohinter is set,
418 instruct the font manager to always hint Glyphs.
419 auto-hinting has no effect if SkPaint::Hinting is set to kNo_Hinting or
420 kSlight_Hinting.
421
Cary Clark23890a92017-07-27 16:30:51 -0400422 setAutohinted only affects platforms that use FreeType as the font manager.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400423
424 Sets kAutoHinting_Flag if useAutohinter is true.
425 Clears kAutoHinting_Flag if useAutohinter is false.
426
427 @param useAutohinter setting for kAutoHinting_Flag
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000428 */
429 void setAutohinted(bool useAutohinter);
430
Cary Clark50fa3ff2017-07-26 10:15:23 -0400431 /** If true, glyphs are drawn top to bottom instead of left to right.
432
433 Equivalent to getFlags masked with kVerticalText_Flag.
434
435 @return kVerticalText_Flag state
436 */
reed@google.com830a23e2011-11-10 15:20:49 +0000437 bool isVerticalText() const {
438 return SkToBool(this->getFlags() & kVerticalText_Flag);
439 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000440
Cary Clark50fa3ff2017-07-26 10:15:23 -0400441 /** If true, text advance positions the next glyph below the previous glyph instead of to the
442 right of previous glyph.
443
444 Sets kVerticalText_Flag if vertical is true.
445 Clears kVerticalText_Flag if vertical is false.
446
447 @param verticalText setting for kVerticalText_Flag
448 */
Cary Clark0418a882017-05-10 09:07:42 -0400449 void setVerticalText(bool verticalText);
reed@google.com830a23e2011-11-10 15:20:49 +0000450
Cary Clark50fa3ff2017-07-26 10:15:23 -0400451 /** If true, approximate bold by increasing the stroke width when creating glyph bitmaps
452 from outlines.
453
454 Equivalent to getFlags masked with kFakeBoldText_Flag.
455
456 @return kFakeBoldText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000457 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000458 bool isFakeBoldText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000459 return SkToBool(this->getFlags() & kFakeBoldText_Flag);
460 }
461
Cary Clark50fa3ff2017-07-26 10:15:23 -0400462 /** Use increased stroke width when creating glyph bitmaps to approximate bolding.
463
464 Sets kFakeBoldText_Flag if fakeBoldText is true.
465 Clears kFakeBoldText_Flag if fakeBoldText is false.
466
467 @param fakeBoldText setting for kFakeBoldText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000468 */
469 void setFakeBoldText(bool fakeBoldText);
470
Cary Clark50fa3ff2017-07-26 10:15:23 -0400471 /** Returns if character spacing may be adjusted by the hinting difference.
472
473 Equivalent to getFlags masked with kDevKernText_Flag.
474
475 @return kDevKernText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000476 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000477 bool isDevKernText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000478 return SkToBool(this->getFlags() & kDevKernText_Flag);
479 }
480
Cary Clark50fa3ff2017-07-26 10:15:23 -0400481 /** Requests, but does not require, to use hinting to adjust glyph spacing.
482
483 Sets kDevKernText_Flag if devKernText is true.
484 Clears kDevKernText_Flag if devKernText is false.
485
486 @param devKernText setting for devKernText
reed@android.com8a1c16f2008-12-17 15:59:43 +0000487 */
488 void setDevKernText(bool devKernText);
489
Cary Clark50fa3ff2017-07-26 10:15:23 -0400490 /** Returns SkFilterQuality, the image filtering level. A lower setting
491 draws faster; a higher setting looks better when the image is scaled.
492
493 @return one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
494 kMedium_SkFilterQuality, kHigh_SkFilterQuality
495 */
reedf803da12015-01-23 05:58:07 -0800496 SkFilterQuality getFilterQuality() const {
497 return (SkFilterQuality)fBitfields.fFilterQuality;
498 }
mtkleinfe81e2d2015-09-09 07:35:42 -0700499
Cary Clark23890a92017-07-27 16:30:51 -0400500 /** Sets SkFilterQuality, the image filtering level. A lower setting
Cary Clark50fa3ff2017-07-26 10:15:23 -0400501 draws faster; a higher setting looks better when the image is scaled.
502 setFilterQuality does not check to see if quality is valid.
503
504 @param quality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
505 kMedium_SkFilterQuality, kHigh_SkFilterQuality
506 */
reedf803da12015-01-23 05:58:07 -0800507 void setFilterQuality(SkFilterQuality quality);
reed@google.comc9683152013-07-18 13:47:01 +0000508
Cary Clark50fa3ff2017-07-26 10:15:23 -0400509 /** \enum SkPaint::Style
Cary Clark23890a92017-07-27 16:30:51 -0400510 Set Style to fill, stroke, or both fill and stroke geometry.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400511 The stroke and fill
512 share all paint attributes; for instance, they are drawn with the same color.
reed@google.com9d07fec2011-03-16 20:02:59 +0000513
Cary Clark50fa3ff2017-07-26 10:15:23 -0400514 Use kStrokeAndFill_Style to avoid hitting the same pixels twice with a stroke draw and
515 a fill draw.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000516 */
517 enum Style {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400518 /** Set to fill geometry.
519 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and Text.
520 SkBitmap, SkImage, patches, SkRegion, sprites, and vertices are painted as if
521 kFill_Style is set, and ignore the set Style.
522 The FillType specifies additional rules to fill the area outside the path edge,
523 and to create an unfilled hole inside the shape.
524 Style is set to kFill_Style by default.
525 */
526 kFill_Style,
527
528 /** Set to stroke geometry.
529 Applies to SkRect, SkRegion, SkRRect, arcs, circles, ovals,
530 SkPath, and Text.
531 arcs, lines, SkPoint, and SkPoint arrays are always drawn as if kStroke_Style is set,
532 and ignore the set Style.
533 The stroke construction is unaffected by the FillType.
534 */
535 kStroke_Style,
536
537 /** Set to stroke and fill geometry.
538 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and Text.
539 SkPath is treated as if it is set to SkPath::kWinding_FillType,
540 and the set FillType is ignored.
541 */
542 kStrokeAndFill_Style,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000543 };
544
Cary Clark50fa3ff2017-07-26 10:15:23 -0400545 enum {
546 /** The number of different Style values defined.
547 May be used to verify that Style is a legal value.
548 */
549 kStyleCount = kStrokeAndFill_Style + 1,
550 };
551
552 /** Whether the geometry is filled, stroked, or filled and stroked.
553
554 @return one of:kFill_Style, kStroke_Style, kStrokeAndFill_Style
reed@android.com8a1c16f2008-12-17 15:59:43 +0000555 */
reedf59eab22014-07-14 14:39:15 -0700556 Style getStyle() const { return (Style)fBitfields.fStyle; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000557
Cary Clark50fa3ff2017-07-26 10:15:23 -0400558 /** Sets whether the geometry is filled, stroked, or filled and stroked.
559 Has no effect if style is not a legal SkPaint::Style value.
560
561 @param style one of: kFill_Style, kStroke_Style, kStrokeAndFill_Style
reed@android.com8a1c16f2008-12-17 15:59:43 +0000562 */
563 void setStyle(Style style);
564
Cary Clark50fa3ff2017-07-26 10:15:23 -0400565 /** Retrieves alpha and RGB, unpremultiplied, packed into 32 bits.
566 Use helpers SkColorGetA(), SkColorGetR(), SkColorGetG(), and SkColorGetB() to extract
567 a color component.
568
569 @return Unpremultiplied ARGB
reed@android.com8a1c16f2008-12-17 15:59:43 +0000570 */
571 SkColor getColor() const { return fColor; }
572
Cary Clark50fa3ff2017-07-26 10:15:23 -0400573 /** Sets alpha and RGB used when stroking and filling. The color is a 32-bit value,
574 unpremutiplied, packing 8-bit components for alpha, red, blue, and green.
575
576 @param color Unpremultiplied ARGB
reed@android.com8a1c16f2008-12-17 15:59:43 +0000577 */
578 void setColor(SkColor color);
579
Cary Clark50fa3ff2017-07-26 10:15:23 -0400580 /** Retrieves alpha from the Color used when stroking and filling.
581
582 @return alpha ranging from zero, fully transparent, to 255, fully opaque
583 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000584 uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); }
reed@google.com9d07fec2011-03-16 20:02:59 +0000585
Cary Clark50fa3ff2017-07-26 10:15:23 -0400586 /** Replaces alpha, leaving RGB
587 unchanged. An out of range value triggers an assert in the debug
588 build. a is a value from zero to 255.
589 a set to zero makes Color fully transparent; a set to 255 makes Color
590 fully opaque.
591
592 @param a alpha component of Color
reed@android.com8a1c16f2008-12-17 15:59:43 +0000593 */
594 void setAlpha(U8CPU a);
595
Cary Clark50fa3ff2017-07-26 10:15:23 -0400596 /** Sets Color used when drawing solid fills. The color components range from 0 to 255.
597 The color is unpremultiplied;
598 alpha sets the transparency independent of RGB.
599
600 @param a amount of alpha, from fully transparent (0) to fully opaque (255)
601 @param r amount of red, from no red (0) to full red (255)
602 @param g amount of green, from no green (0) to full green (255)
603 @param b amount of blue, from no blue (0) to full blue (255)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000604 */
605 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
606
Cary Clark50fa3ff2017-07-26 10:15:23 -0400607 /** Returns the thickness of the pen used by SkPaint to
608 outline the shape.
609
610 @return zero for Hairline, greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000611 */
612 SkScalar getStrokeWidth() const { return fWidth; }
613
Cary Clark50fa3ff2017-07-26 10:15:23 -0400614 /** Sets the thickness of the pen used by the paint to
615 outline the shape.
616 Has no effect if width is less than zero.
617
618 @param width zero thickness for Hairline; greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000619 */
620 void setStrokeWidth(SkScalar width);
621
Cary Clark50fa3ff2017-07-26 10:15:23 -0400622 /** The limit at which a sharp corner is drawn beveled.
623
624 @return zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000625 */
626 SkScalar getStrokeMiter() const { return fMiterLimit; }
627
Cary Clark50fa3ff2017-07-26 10:15:23 -0400628 /** The limit at which a sharp corner is drawn beveled.
629 Valid values are zero and greater.
630 Has no effect if miter is less than zero.
631
632 @param miter zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000633 */
634 void setStrokeMiter(SkScalar miter);
635
Cary Clark50fa3ff2017-07-26 10:15:23 -0400636 /** \enum SkPaint::Cap
637 Cap draws at the beginning and end of an open path contour.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000638 */
639 enum Cap {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400640 kButt_Cap, //!< Does not extend the stroke past the beginning or the end.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000641
Cary Clark50fa3ff2017-07-26 10:15:23 -0400642 /** Adds a circle with a diameter equal to stroke width at the beginning
643 and end.
644 */
645 kRound_Cap,
646
647 /** Adds a square with sides equal to stroke width at the beginning
648 and end. The square sides are parallel to the initial and final direction
649 of the stroke.
650 */
651 kSquare_Cap,
652 kLast_Cap = kSquare_Cap, //!< Equivalent to the largest value for Cap.
653
654 /** Equivalent to kButt_Cap.
655 Cap is set to kButt_Cap by default.
656 */
657 kDefault_Cap = kButt_Cap,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000658 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400659
bsalomona7d85ba2016-07-06 11:54:59 -0700660 static constexpr int kCapCount = kLast_Cap + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000661
Cary Clark50fa3ff2017-07-26 10:15:23 -0400662 /** \enum SkPaint::Join
663 Join specifies how corners are drawn when a shape is stroked. The paint's Join setting
664 affects the four corners of a stroked rectangle, and the connected segments in a
665 stroked path.
666
667 Choose miter join to draw sharp corners. Choose round join to draw a circle with a
668 radius equal to the stroke width on top of the corner. Choose bevel join to minimally
669 connect the thick strokes.
670
671 The fill path constructed to describe the stroked path respects the join setting but may
672 not contain the actual join. For instance, a fill path constructed with round joins does
673 not necessarily include circles at each connected segment.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000674 */
675 enum Join {
Cary Clark23890a92017-07-27 16:30:51 -0400676 /** Extends the outside corner to the extent allowed by miter limit.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400677 If the extension exceeds miter limit, kBevel_Join is used instead.
678 */
679 kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000680
Cary Clark50fa3ff2017-07-26 10:15:23 -0400681 /** Adds a circle with a diameter of stroke width at the sharp corner. */
682 kRound_Join,
683 kBevel_Join, //!< Connects the outside edges of the sharp corner.
684 kLast_Join = kBevel_Join, //!< Equivalent to the largest value for Join.
685
686 /** Equivalent to kMiter_Join.
687 Join is set to kMiter_Join by default.
688 */
689 kDefault_Join = kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000690 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400691
bsalomona7d85ba2016-07-06 11:54:59 -0700692 static constexpr int kJoinCount = kLast_Join + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000693
Cary Clark50fa3ff2017-07-26 10:15:23 -0400694 /** The geometry drawn at the beginning and end of strokes.
695
696 @return one of: kButt_Cap, kRound_Cap, kSquare_Cap
reed@android.com8a1c16f2008-12-17 15:59:43 +0000697 */
reedf59eab22014-07-14 14:39:15 -0700698 Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000699
Cary Clark50fa3ff2017-07-26 10:15:23 -0400700 /** The geometry drawn at the beginning and end of strokes.
701
702 @param cap one of: kButt_Cap, kRound_Cap, kSquare_Cap;
703 has no effect if cap is not valid
reed@android.com8a1c16f2008-12-17 15:59:43 +0000704 */
705 void setStrokeCap(Cap cap);
706
Cary Clark50fa3ff2017-07-26 10:15:23 -0400707 /** The geometry drawn at the corners of strokes.
708
709 @return one of: kMiter_Join, kRound_Join, kBevel_Join
reed@android.com8a1c16f2008-12-17 15:59:43 +0000710 */
reedf59eab22014-07-14 14:39:15 -0700711 Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000712
Cary Clark50fa3ff2017-07-26 10:15:23 -0400713 /** The geometry drawn at the corners of strokes.
714
715 @param join one of: kMiter_Join, kRound_Join, kBevel_Join;
716 otherwise, setStrokeJoin has no effect
reed@android.com8a1c16f2008-12-17 15:59:43 +0000717 */
718 void setStrokeJoin(Join join);
719
Cary Clark50fa3ff2017-07-26 10:15:23 -0400720 /** The filled equivalent of the stroked path.
721
722 @param src SkPath read to create a filled version
723 @param dst resulting SkPath; may be the same as src, but may not be nullptr
724 @param cullRect optional limit passed to SkPathEffect
725 @param resScale if > 1, increase precision, else if (0 < res < 1) reduce precision
726 to favor speed and size
727 @return true if the path represents style fill, or false if it represents Hairline
728 */
reed05d90442015-02-12 13:35:52 -0800729 bool getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
730 SkScalar resScale = 1) const;
731
Cary Clark50fa3ff2017-07-26 10:15:23 -0400732 /** The filled equivalent of the stroked path.
733
Cary Clark23890a92017-07-27 16:30:51 -0400734 Replaces dst with the src path modified by SkPathEffect and style stroke.
735 SkPathEffect, if any, is not culled. stroke width is created with default precision.
736
737 @param src SkPath read to create a filled version
738 @param dst resulting SkPath dst may be the same as src, but may not be nullptr
739 @return true if the path represents style fill, or false if it represents Hairline
Cary Clark50fa3ff2017-07-26 10:15:23 -0400740 */
reed05d90442015-02-12 13:35:52 -0800741 bool getFillPath(const SkPath& src, SkPath* dst) const {
742 return this->getFillPath(src, dst, NULL, 1);
743 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000744
Cary Clark50fa3ff2017-07-26 10:15:23 -0400745 /** Optional colors used when filling a path, such as a gradient.
746
747 Does not alter SkShader SkRefCnt.
748
749 @return SkShader if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000750 */
reeda5ab9ec2016-03-06 18:10:48 -0800751 SkShader* getShader() const { return fShader.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400752
753 /** Optional colors used when filling a path, such as a gradient.
754
755 Increases SkShader SkRefCnt by one.
756
757 @return SkShader if previously set, nullptr otherwise
758 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500759 sk_sp<SkShader> refShader() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000760
Cary Clark50fa3ff2017-07-26 10:15:23 -0400761 /** Optional colors used when filling a path, such as a gradient.
762
763 Sets SkShader to shader, decrementing SkRefCnt of the previous SkShader.
764 Does not alter shader SkRefCnt.
765
766 @param shader how geometry is filled with color; if nullptr, Color is used instead
767 */
Cary Clark0418a882017-05-10 09:07:42 -0400768 void setShader(sk_sp<SkShader> shader);
reed@google.com9d07fec2011-03-16 20:02:59 +0000769
Cary Clark50fa3ff2017-07-26 10:15:23 -0400770 /** Returns SkColorFilter if set, or nullptr.
771 Does not alter SkColorFilter SkRefCnt.
772
773 @return SkColorFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000774 */
reeda5ab9ec2016-03-06 18:10:48 -0800775 SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400776
777 /** Returns SkColorFilter if set, or nullptr.
778 Increases SkColorFilter SkRefCnt by one.
779
780 @return SkColorFilter if set, or nullptr
781 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500782 sk_sp<SkColorFilter> refColorFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000783
Cary Clark50fa3ff2017-07-26 10:15:23 -0400784 /** Sets SkColorFilter to filter, decrementing SkRefCnt of the previous SkColorFilter.
785 Pass nullptr to clear SkColorFilter.
786 Does not alter filter SkRefCnt.
787
788 @param colorFilter SkColorFilter to apply to subsequent draw
reed@android.com8a1c16f2008-12-17 15:59:43 +0000789 */
Cary Clark0418a882017-05-10 09:07:42 -0400790 void setColorFilter(sk_sp<SkColorFilter> colorFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000791
Cary Clark50fa3ff2017-07-26 10:15:23 -0400792 /** Returns SkBlendMode.
793 By default, getBlendMode returns SkBlendMode::kSrcOver.
794
795 @return mode used to combine source color with destination color
796 */
reed374772b2016-10-05 17:33:02 -0700797 SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400798
799 /** Returns true if SkBlendMode is SkBlendMode::kSrcOver, the default.
800
801 @return true if SkBlendMode is SkBlendMode::kSrcOver
802 */
reed374772b2016-10-05 17:33:02 -0700803 bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400804
805 /** Sets SkBlendMode to mode.
806 Does not check for valid input.
807
808 @param mode SkBlendMode used to combine source color and destination
809 */
reed374772b2016-10-05 17:33:02 -0700810 void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
reed@android.coma0f5d152009-06-22 17:38:10 +0000811
Cary Clark50fa3ff2017-07-26 10:15:23 -0400812 /** Returns SkPathEffect if set, or nullptr.
813 Does not alter SkPathEffect SkRefCnt.
814
815 @return SkPathEffect if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000816 */
reeda5ab9ec2016-03-06 18:10:48 -0800817 SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400818
819 /** Returns SkPathEffect if set, or nullptr.
820 Increases SkPathEffect SkRefCnt by one.
821
822 @return SkPathEffect if previously set, nullptr otherwise
823 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500824 sk_sp<SkPathEffect> refPathEffect() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000825
Cary Clark50fa3ff2017-07-26 10:15:23 -0400826 /** Sets SkPathEffect to pathEffect,
827 decrementing SkRefCnt of the previous SkPathEffect.
828 Pass nullptr to leave the path geometry unaltered.
829 Does not alter pathEffect SkRefCnt.
830
831 @param pathEffect replace SkPath with a modification when drawn
reed@android.com8a1c16f2008-12-17 15:59:43 +0000832 */
Cary Clark0418a882017-05-10 09:07:42 -0400833 void setPathEffect(sk_sp<SkPathEffect> pathEffect);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000834
Cary Clark50fa3ff2017-07-26 10:15:23 -0400835 /** Returns SkMaskFilter if set, or nullptr.
836 Does not alter SkMaskFilter SkRefCnt.
837
838 @return SkMaskFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000839 */
reeda5ab9ec2016-03-06 18:10:48 -0800840 SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400841
842 /** Returns SkMaskFilter if set, or nullptr.
843 Increases SkMaskFilter SkRefCnt by one.
844
845 @return SkMaskFilter if previously set, nullptr otherwise
846 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500847 sk_sp<SkMaskFilter> refMaskFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000848
Cary Clark50fa3ff2017-07-26 10:15:23 -0400849 /** Sets SkMaskFilter to maskFilter,
850 decrementing SkRefCnt of the previous SkMaskFilter.
851 Pass nullptr to clear SkMaskFilter and leave SkMaskFilter effect on mask alpha unaltered.
852 Does not affect SkRasterizer.
853 Does not alter maskFilter SkRefCnt.
854
855 @param maskFilter modifies clipping mask generated from drawn geometry
reed@android.com8a1c16f2008-12-17 15:59:43 +0000856 */
Cary Clark0418a882017-05-10 09:07:42 -0400857 void setMaskFilter(sk_sp<SkMaskFilter> maskFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000858
Cary Clark50fa3ff2017-07-26 10:15:23 -0400859 /** Returns SkTypeface if set, or nullptr.
860 Does not alter SkTypeface SkRefCnt.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000861
Cary Clark50fa3ff2017-07-26 10:15:23 -0400862 @return SkTypeface if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000863 */
reeda5ab9ec2016-03-06 18:10:48 -0800864 SkTypeface* getTypeface() const { return fTypeface.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400865
866 /** Increases SkTypeface SkRefCnt by one.
867
868 @return SkTypeface if previously set, nullptr otherwise
869 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500870 sk_sp<SkTypeface> refTypeface() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000871
Cary Clark50fa3ff2017-07-26 10:15:23 -0400872 /** Sets SkTypeface to typeface,
873 decrementing SkRefCnt of the previous SkTypeface.
874 Pass nullptr to clear SkTypeface and use the default typeface.
875 Does not alter typeface SkRefCnt.
876
877 @param typeface font and style used to draw text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000878 */
Cary Clark0418a882017-05-10 09:07:42 -0400879 void setTypeface(sk_sp<SkTypeface> typeface);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000880
Cary Clark50fa3ff2017-07-26 10:15:23 -0400881 /** Returns SkRasterizer if set, or nullptr.
882 Does not alter SkRasterizer SkRefCnt.
883
884 @return SkRasterizer if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000885 */
reeda5ab9ec2016-03-06 18:10:48 -0800886 SkRasterizer* getRasterizer() const { return fRasterizer.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400887
Cary Clark23890a92017-07-27 16:30:51 -0400888 /** Returns SkRasterizer if set, or nullptr.
889 Increases SkRasterizer SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400890
891 @return SkRasterizer if previously set, nullptr otherwise
892 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500893 sk_sp<SkRasterizer> refRasterizer() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000894
Cary Clark50fa3ff2017-07-26 10:15:23 -0400895 /** Sets SkRasterizer to rasterizer,
896 decrementing SkRefCnt of the previous SkRasterizer.
897 Pass nullptr to clear SkRasterizer and leave SkRasterizer effect on mask alpha unaltered.
898 Does not affect SkMaskFilter.
899 Does not alter rasterizer SkRefCnt.
900
901 @param rasterizer how geometry is converted to mask alpha
reed@android.com8a1c16f2008-12-17 15:59:43 +0000902 */
Cary Clark0418a882017-05-10 09:07:42 -0400903 void setRasterizer(sk_sp<SkRasterizer> rasterizer);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000904
Cary Clark50fa3ff2017-07-26 10:15:23 -0400905 /** Returns SkImageFilter if set, or nullptr.
906 Does not alter SkImageFilter SkRefCnt.
907
908 @return SkImageFilter if previously set, nullptr otherwise
909 */
reeda5ab9ec2016-03-06 18:10:48 -0800910 SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400911
912 /** Returns SkImageFilter if set, or nullptr.
913 Increases SkImageFilter SkRefCnt by one.
914
915 @return SkImageFilter if previously set, nullptr otherwise
916 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500917 sk_sp<SkImageFilter> refImageFilter() const;
Cary Clark50fa3ff2017-07-26 10:15:23 -0400918
919 /** Sets SkImageFilter to imageFilter,
920 decrementing SkRefCnt of the previous SkImageFilter.
921 Pass nullptr to clear SkImageFilter, and remove SkImageFilter effect
922 on drawing.
923 Does not affect SkRasterizer or SkMaskFilter.
924 Does not alter imageFilter SkRefCnt.
925
926 @param imageFilter how SkImage is sampled when transformed
927 */
Cary Clark0418a882017-05-10 09:07:42 -0400928 void setImageFilter(sk_sp<SkImageFilter> imageFilter);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000929
Cary Clark50fa3ff2017-07-26 10:15:23 -0400930 /** Returns SkDrawLooper if set, or nullptr.
931 Does not alter SkDrawLooper SkRefCnt.
932
933 @return SkDrawLooper if previously set, nullptr otherwise
934 */
reed46f2d0a2016-09-11 05:40:31 -0700935 SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400936
937 /** Returns SkDrawLooper if set, or nullptr.
938 Increases SkDrawLooper SkRefCnt by one.
939
940 @return SkDrawLooper if previously set, nullptr otherwise
941 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500942 sk_sp<SkDrawLooper> refDrawLooper() const;
943
Cary Clark23890a92017-07-27 16:30:51 -0400944 /** Deprecated.
945 (see bug.skia.org/6259)
Cary Clark50fa3ff2017-07-26 10:15:23 -0400946
947 @return SkDrawLooper if previously set, nullptr otherwise
948 */
reed46f2d0a2016-09-11 05:40:31 -0700949 SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400950
951 /** Sets SkDrawLooper to drawLooper,
952 decrementing SkRefCnt of the previous drawLooper.
953 Pass nullptr to clear SkDrawLooper and leave SkDrawLooper effect on drawing unaltered.
954 setDrawLooper does not alter drawLooper SkRefCnt.
955
956 @param drawLooper Iterates through drawing one or more time, altering SkPaint
957 */
Cary Clark0418a882017-05-10 09:07:42 -0400958 void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
Mike Reed09d94352016-10-31 15:11:04 -0400959
Cary Clark23890a92017-07-27 16:30:51 -0400960 /** Deprecated.
961 (see bug.skia.org/6259)
Cary Clark50fa3ff2017-07-26 10:15:23 -0400962
963 @param drawLooper sets SkDrawLooper to drawLooper
964 */
Cary Clark0418a882017-05-10 09:07:42 -0400965 void setLooper(sk_sp<SkDrawLooper> drawLooper);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000966
Cary Clark50fa3ff2017-07-26 10:15:23 -0400967 /** \enum SkPaint::Align
968 Align adjusts the text relative to the text position.
969 Align affects glyphs drawn with: SkCanvas::drawText, SkCanvas::drawPosText,
970 SkCanvas::drawPosTextH, SkCanvas::drawTextOnPath,
971 SkCanvas::drawTextOnPathHV, SkCanvas::drawTextRSXform, SkCanvas::drawTextBlob,
972 and SkCanvas::drawString;
973 as well as calls that place text glyphs like getTextWidths and getTextPath.
974
975 The text position is set by the font for both horizontal and vertical text.
976 Typically, for horizontal text, the position is to the left side of the glyph on the
Cary Clark23890a92017-07-27 16:30:51 -0400977 base line; and for vertical text, the position is the horizontal center of the glyph
Cary Clark50fa3ff2017-07-26 10:15:23 -0400978 at the caps height.
979
980 Align adjusts the glyph position to center it or move it to abut the position
981 using the metrics returned by the font.
982
983 Align defaults to kLeft_Align.
984 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000985 enum Align {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400986 /** Leaves the glyph at the position computed by the font offset by the text position. */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000987 kLeft_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400988
989 /** Moves the glyph half its width if Flags has kVerticalText_Flag clear, and
990 half its height if Flags has kVerticalText_Flag set.
991 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000992 kCenter_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400993
994 /** Moves the glyph by its width if Flags has kVerticalText_Flag clear,
995 and by its height if Flags has kVerticalText_Flag set.
996 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000997 kRight_Align,
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +0000998 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400999
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +00001000 enum {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001001 kAlignCount = 3, //!< The number of different Align values defined.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001002 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001003
Cary Clark50fa3ff2017-07-26 10:15:23 -04001004 /** Returns SkPaint::Align.
1005 Returns kLeft_Align if SkPaint::Align has not been set.
1006
1007 @return text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +00001008 */
reedf59eab22014-07-14 14:39:15 -07001009 Align getTextAlign() const { return (Align)fBitfields.fTextAlign; }
reed@google.com9d07fec2011-03-16 20:02:59 +00001010
Cary Clark50fa3ff2017-07-26 10:15:23 -04001011 /** Sets SkPaint::Align to align.
1012 Has no effect if align is an invalid value.
1013
1014 @param align text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +00001015 */
1016 void setTextAlign(Align align);
1017
Cary Clark50fa3ff2017-07-26 10:15:23 -04001018 /** Returns text size in points.
1019
1020 @return typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +00001021 */
1022 SkScalar getTextSize() const { return fTextSize; }
1023
Cary Clark50fa3ff2017-07-26 10:15:23 -04001024 /** Sets text size in points.
1025 Has no effect if textSize is not greater than or equal to zero.
1026
1027 @param textSize typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +00001028 */
1029 void setTextSize(SkScalar textSize);
1030
Cary Clark50fa3ff2017-07-26 10:15:23 -04001031 /** Returns text scale x.
1032 Default value is 1.
1033
1034 @return text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001035 */
1036 SkScalar getTextScaleX() const { return fTextScaleX; }
1037
Cary Clark50fa3ff2017-07-26 10:15:23 -04001038 /** Sets text scale x.
1039 Default value is 1.
1040
1041 @param scaleX text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001042 */
1043 void setTextScaleX(SkScalar scaleX);
1044
Cary Clark50fa3ff2017-07-26 10:15:23 -04001045 /** Returns text skew x.
1046 Default value is zero.
1047
1048 @return additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001049 */
1050 SkScalar getTextSkewX() const { return fTextSkewX; }
1051
Cary Clark50fa3ff2017-07-26 10:15:23 -04001052 /** Sets text skew x.
1053 Default value is zero.
1054
1055 @param skewX additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001056 */
1057 void setTextSkewX(SkScalar skewX);
1058
Cary Clark50fa3ff2017-07-26 10:15:23 -04001059 /** \enum SkPaint::TextEncoding
1060 TextEncoding determines whether text specifies character codes and their encoded size,
1061 or glyph indices. Character codes use the encoding specified by the Unicode standard .
1062 Character codes encoded size are specified by UTF-8, UTF-16, or UTF-32.
1063 All character encoding are able to represent all of Unicode, differing only
1064 in the total storage required. UTF-8 (RFC 3629) is made up of 8-bit bytes,
1065 and is a superset of ASCII. UTF-16 (RFC 2781) is made up of 16-bit words,
1066 and is a superset of Unicode ranges 0x0000 to 0xD7FF and 0xE000 to 0xFFFF. UTF-32 is
1067 made up of 32-bit words, and is a superset of Unicode.
1068
1069 font manager uses font data to convert character code points into glyph indices.
1070 A glyph index is a 16-bit word.
1071
1072 TextEncoding is set to kUTF8_TextEncoding by default.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001073 */
1074 enum TextEncoding {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001075 kUTF8_TextEncoding, //!< Uses bytes to represent UTF-8 or ASCII.
1076 kUTF16_TextEncoding, //!< Uses two byte words to represent most of Unicode.
1077 kUTF32_TextEncoding, //!< Uses four byte words to represent all of Unicode.
1078 kGlyphID_TextEncoding, //!< Uses two byte words to represent glyph indices.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001079 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001080
Cary Clark50fa3ff2017-07-26 10:15:23 -04001081 /** Returns SkPaint::TextEncoding.
1082 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1083
1084 @return one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
1085 kGlyphID_TextEncoding
1086 */
reedf59eab22014-07-14 14:39:15 -07001087 TextEncoding getTextEncoding() const {
1088 return (TextEncoding)fBitfields.fTextEncoding;
1089 }
reed@android.com8a1c16f2008-12-17 15:59:43 +00001090
Cary Clark50fa3ff2017-07-26 10:15:23 -04001091 /** Sets SkPaint::TextEncoding to encoding.
1092 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1093 Invalid values for encoding are ignored.
1094
1095 @param encoding one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
1096 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001097 void setTextEncoding(TextEncoding encoding);
1098
Cary Clark50fa3ff2017-07-26 10:15:23 -04001099 /** \struct SkPaint::FontMetrics
1100 FontMetrics is filled out by getFontMetrics. FontMetrics contents reflect the values
1101 computed by font manager using SkTypeface. Values are set to zero if they are
1102 not availble.
1103
1104 fUnderlineThickness and fUnderlinePosition have a bit set in fFlags if their values
1105 are valid, since their value may be zero.
1106
1107 fStrikeoutThickness and fStrikeoutPosition have a bit set in fFlags if their values
1108 are valid, since their value may be zero.
1109 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001110 struct FontMetrics {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001111
1112 /** \enum SkPaint::FontMetrics::FontMetricsFlags
Cary Clark23890a92017-07-27 16:30:51 -04001113 FontMetricsFlags are set in fFlags when underline and strikeout metrics are valid;
1114 the underline or strikeout metric may be valid and zero.
1115 Fonts with embedded bitmaps may not have valid underline or strikeout metrics.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001116 */
1117 enum FontMetricsFlags {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001118 kUnderlineThicknessIsValid_Flag = 1 << 0, //!< Set if fUnderlineThickness is valid.
1119 kUnderlinePositionIsValid_Flag = 1 << 1, //!< Set if fUnderlinePosition is valid.
1120 kStrikeoutThicknessIsValid_Flag = 1 << 2, //!< Set if fStrikeoutThickness is valid.
1121 kStrikeoutPositionIsValid_Flag = 1 << 3, //!< Set if fStrikeoutPosition is valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001122 };
1123
Cary Clark50fa3ff2017-07-26 10:15:23 -04001124 uint32_t fFlags; //!< fFlags is set when underline metrics are valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001125
Cary Clark50fa3ff2017-07-26 10:15:23 -04001126 /** Largest height for any glyph.
1127 A measure from the baseline, and is less than or equal to zero.
1128 */
1129 SkScalar fTop;
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001130
Cary Clark50fa3ff2017-07-26 10:15:23 -04001131 /** Recommended distance above the baseline to reserve for a line of text.
1132 A measure from the baseline, and is less than or equal to zero.
1133 */
1134 SkScalar fAscent;
Ben Wagner219f3622017-07-17 15:32:25 -04001135
Cary Clark50fa3ff2017-07-26 10:15:23 -04001136 /** Recommended distance below the baseline to reserve for a line of text.
1137 A measure from the baseline, and is greater than or equal to zero.
1138 */
1139 SkScalar fDescent;
Ben Wagner219f3622017-07-17 15:32:25 -04001140
Cary Clark50fa3ff2017-07-26 10:15:23 -04001141 /** Greatest extent below the baseline for any glyph.
1142 A measure from the baseline, and is greater than or equal to zero.
1143 */
1144 SkScalar fBottom;
1145
1146 /** Recommended distance to add between lines of text.
1147 Greater than or equal to zero.
1148 */
1149 SkScalar fLeading;
1150
1151 /** Average character width, if it is available.
1152 Zero if no average width is stored in the font.
1153 */
1154 SkScalar fAvgCharWidth;
1155 SkScalar fMaxCharWidth; //!< Maximum character width.
1156
1157 /** Minimum bounding box x value for all glyphs.
1158 Typically less than zero.
1159 */
1160 SkScalar fXMin;
1161
1162 /** Maximum bounding box x value for all glyphs.
1163 Typically greater than zero.
1164 */
1165 SkScalar fXMax;
1166
1167 /** Height of a lower-case 'x'.
1168 May be zero if no lower-case height is stored in the font.
1169 */
1170 SkScalar fXHeight;
1171
1172 /** Height of an upper-case letter.
1173 May be zero if no upper-case height is stored in the font.
1174 */
1175 SkScalar fCapHeight;
1176
1177 /** Underline thickness. If the metric
1178 is valid, the kUnderlineThicknessIsValid_Flag is set in fFlags.
1179 If kUnderlineThicknessIsValid_Flag is clear, fUnderlineThickness is zero.
1180 */
1181 SkScalar fUnderlineThickness;
1182
1183 /** Underline position relative to the baseline.
1184 It may be negative, to draw the underline above the baseline, zero
1185 to draw the underline on the baseline, or positive to draw the underline
1186 below the baseline.
1187
1188 If the metric is valid, the kUnderlinePositionIsValid_Flag is set in fFlags.
1189 If kUnderlinePositionIsValid_Flag is clear, fUnderlinePosition is zero.
1190 */
1191 SkScalar fUnderlinePosition;
1192
1193 /** Strikeout thickness. If the metric
1194 is valid, the kStrikeoutThicknessIsValid_Flag is set in fFlags.
1195 If kStrikeoutThicknessIsValid_Flag is clear, fStrikeoutThickness is zero.
1196 */
1197 SkScalar fStrikeoutThickness;
1198
1199 /** Strikeout position relative to the baseline.
1200 It may be negative, to draw the strikeout above the baseline, zero
1201 to draw the strikeout on the baseline, or positive to draw the strikeout
1202 below the baseline.
1203
1204 If the metric is valid, the kStrikeoutPositionIsValid_Flag is set in fFlags.
1205 If kStrikeoutPositionIsValid_Flag is clear, fStrikeoutPosition is zero.
1206 */
1207 SkScalar fStrikeoutPosition;
1208
1209 /** If SkPaint::FontMetrics has a valid underline thickness, return true, and set
1210 thickness to that value. If it doesn't, return false, and ignore
1211 thickness.
1212
1213 @param thickness storage for underline width
1214 @return true if font specifies underline width
1215 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001216 bool hasUnderlineThickness(SkScalar* thickness) const {
Ben Wagner3318da52017-03-23 14:01:22 -04001217 if (SkToBool(fFlags & kUnderlineThicknessIsValid_Flag)) {
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001218 *thickness = fUnderlineThickness;
1219 return true;
1220 }
1221 return false;
1222 }
1223
Cary Clark50fa3ff2017-07-26 10:15:23 -04001224 /** If SkPaint::FontMetrics has a valid underline position, return true, and set
1225 position to that value. If it doesn't, return false, and ignore
1226 position.
1227
1228 @param position storage for underline position
1229 @return true if font specifies underline position
1230 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001231 bool hasUnderlinePosition(SkScalar* position) const {
1232 if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) {
1233 *position = fUnderlinePosition;
1234 return true;
1235 }
1236 return false;
1237 }
1238
Cary Clark50fa3ff2017-07-26 10:15:23 -04001239 /** If SkPaint::FontMetrics has a valid strikeout thickness, return true, and set
1240 thickness to that value. If it doesn't, return false, and ignore
1241 thickness.
1242
1243 @param thickness storage for strikeout width
1244 @return true if font specifies strikeout width
1245 */
Ben Wagner219f3622017-07-17 15:32:25 -04001246 bool hasStrikeoutThickness(SkScalar* thickness) const {
1247 if (SkToBool(fFlags & kStrikeoutThicknessIsValid_Flag)) {
1248 *thickness = fStrikeoutThickness;
1249 return true;
1250 }
1251 return false;
1252 }
1253
Cary Clark50fa3ff2017-07-26 10:15:23 -04001254 /** If SkPaint::FontMetrics has a valid strikeout position, return true, and set
1255 position to that value. If it doesn't, return false, and ignore
1256 position.
1257
1258 @param position storage for strikeout position
1259 @return true if font specifies strikeout position
1260 */
Ben Wagner219f3622017-07-17 15:32:25 -04001261 bool hasStrikeoutPosition(SkScalar* position) const {
1262 if (SkToBool(fFlags & kStrikeoutPositionIsValid_Flag)) {
1263 *position = fStrikeoutPosition;
1264 return true;
1265 }
1266 return false;
1267 }
Cary Clark50fa3ff2017-07-26 10:15:23 -04001268
reed@android.com8a1c16f2008-12-17 15:59:43 +00001269 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001270
Cary Clark50fa3ff2017-07-26 10:15:23 -04001271 /** Returns SkPaint::FontMetrics associated with SkTypeface.
1272 The return value is the recommended spacing between lines: the sum of metrics
1273 descent, ascent, and leading.
1274 If metrics is not nullptr, SkPaint::FontMetrics is copied to metrics.
1275 Results are scaled by text size but does not take into account
1276 dimensions required by text scale x, text skew x, fake bold,
1277 style stroke, and SkPathEffect.
1278 Results can be additionally scaled by scale; a scale of zero
1279 is ignored.
1280
1281 @param metrics storage for SkPaint::FontMetrics from SkTypeface; may be nullptr
1282 @param scale additional multiplier for returned values
1283 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001284 */
1285 SkScalar getFontMetrics(FontMetrics* metrics, SkScalar scale = 0) const;
reed@google.com9d07fec2011-03-16 20:02:59 +00001286
Cary Clark50fa3ff2017-07-26 10:15:23 -04001287 /** Returns the recommended spacing between lines: the sum of metrics
1288 descent, ascent, and leading.
1289 Result is scaled by text size but does not take into account
1290 dimensions required by stroking and SkPathEffect.
1291 getFontSpacing returns the same result as getFontMetrics.
1292
1293 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001294 */
1295 SkScalar getFontSpacing() const { return this->getFontMetrics(NULL, 0); }
1296
Cary Clark50fa3ff2017-07-26 10:15:23 -04001297 /** Converts text into glyph indices.
1298 Returns the number of glyph indices represented by text.
1299 SkPaint::TextEncoding specifies how text represents characters or glyphs.
1300 glyphs may be nullptr, to compute the glyph count.
1301
1302 Does not check text for valid character encoding or valid
1303 glyph indices.
1304
1305 If byteLength equals zero, textToGlyphs returns zero.
1306 If byteLength includes a partial character, the partial character is ignored.
1307
1308 If SkPaint::TextEncoding is kUTF8_TextEncoding and
1309 text contains an invalid UTF-8 sequence, zero is returned.
1310
1311 @param text character stroage encoded with SkPaint::TextEncoding
1312 @param byteLength length of character storage in bytes
1313 @param glyphs storage for glyph indices; may be nullptr
1314 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001315 */
1316 int textToGlyphs(const void* text, size_t byteLength,
halcanaryd0e95a52016-07-25 07:18:12 -07001317 SkGlyphID glyphs[]) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001318
Cary Clark50fa3ff2017-07-26 10:15:23 -04001319 /** Returns true if all text corresponds to a non-zero glyph index.
1320 Returns false if any characters in text are not supported in
1321 SkTypeface.
reed@android.coma5dcaf62010-02-05 17:12:32 +00001322
Cary Clark50fa3ff2017-07-26 10:15:23 -04001323 If SkPaint::TextEncoding is kGlyphID_TextEncoding, containsText
1324 returns true if all glyph indices in text are non-zero; containsText
1325 does not check to see if text contains valid glyph indices for SkTypeface.
1326
1327 Returns true if bytelength is zero.
1328
1329 @param text array of characters or glyphs
1330 @param byteLength number of bytes in text array
1331 @return true if all text corresponds to a non-zero glyph index
1332 */
reed@android.coma5dcaf62010-02-05 17:12:32 +00001333 bool containsText(const void* text, size_t byteLength) const;
1334
Cary Clark50fa3ff2017-07-26 10:15:23 -04001335 /** Converts glyphs into text if possible.
1336 Glyph values without direct Unicode equivalents are mapped to zero.
1337 Uses the SkTypeface, but is unaffected
1338 by SkPaint::TextEncoding; the text values returned are equivalent to kUTF32_TextEncoding.
1339
1340 Only supported on platforms that use FreeType as the font engine.
1341
1342 @param glyphs array of indices into font
1343 @param count length of glyph array
1344 @param text storage for character codes, one per glyph
reed@android.com9d3a9852010-01-08 14:07:42 +00001345 */
halcanaryd0e95a52016-07-25 07:18:12 -07001346 void glyphsToUnichars(const SkGlyphID glyphs[], int count, SkUnichar text[]) const;
reed@android.com9d3a9852010-01-08 14:07:42 +00001347
Cary Clark50fa3ff2017-07-26 10:15:23 -04001348 /** Returns the number of glyphs in text.
1349 Uses SkPaint::TextEncoding to count the glyphs.
1350 Returns the same result as textToGlyphs.
1351
1352 @param text character stroage encoded with SkPaint::TextEncoding
1353 @param byteLength length of character storage in bytes
1354 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001355 */
reed@google.com9d07fec2011-03-16 20:02:59 +00001356 int countText(const void* text, size_t byteLength) const {
reed@android.com8a1c16f2008-12-17 15:59:43 +00001357 return this->textToGlyphs(text, byteLength, NULL);
1358 }
1359
Cary Clark50fa3ff2017-07-26 10:15:23 -04001360 /** Returns the advance width of text if kVerticalText_Flag is clear,
1361 and the height of text if kVerticalText_Flag is set.
1362 The advance is the normal distance to move before drawing additional text.
1363 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1364 and text size, text scale x, text skew x, stroke width, and
1365 SkPathEffect to scale the metrics and bounds.
1366 Returns the bounding box of text if bounds is not nullptr.
1367 The bounding box is computed as if the text was drawn at the origin.
1368
1369 @param text character codes or glyph indices to be measured
1370 @param length number of bytes of text to measure
1371 @param bounds returns bounding box relative to (0, 0) if not nullptr
1372 @return advance width or height
1373 */
reed99ae8812014-08-26 11:30:01 -07001374 SkScalar measureText(const void* text, size_t length, SkRect* bounds) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001375
Cary Clark50fa3ff2017-07-26 10:15:23 -04001376 /** Returns the advance width of text if kVerticalText_Flag is clear,
1377 and the height of text if kVerticalText_Flag is set.
1378 The advance is the normal distance to move before drawing additional text.
1379 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
Cary Clark23890a92017-07-27 16:30:51 -04001380 and text size to scale the metrics.
1381 Does not scale the advance or bounds by fake bold or SkPathEffect.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001382
1383 @param text character codes or glyph indices to be measured
1384 @param length number of bytes of text to measure
Cary Clark50fa3ff2017-07-26 10:15:23 -04001385 @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.
Cary Clark23890a92017-07-27 16:30:51 -04001421 Does include fake bold and SkPathEffect in the bounds.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001422
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.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001593 e.g.
1594 if (paint.canComputeFastBounds()) {
1595 SkRect r, storage;
1596 path.computeBounds(&r, SkPath::kFast_BoundsType);
1597 const SkRect& fastR = paint.computeFastBounds(r, &storage);
1598 if (canvas->quickReject(fastR, ...)) {
1599 // don't draw the path
1600 }
1601 }
1602
1603 @param orig geometry modified by SkPaint when drawn
1604 @param storage computed bounds of geometry; may not be nullptr
1605 @return fast computed bounds
1606 */
reed@google.coma584aed2012-05-16 14:06:02 +00001607 const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const {
Brian Osman60751d72017-05-12 11:21:36 -04001608 // Things like stroking, etc... will do math on the bounds rect, assuming that it's sorted.
1609 SkASSERT(orig.isSorted());
reed@google.coma584aed2012-05-16 14:06:02 +00001610 SkPaint::Style style = this->getStyle();
1611 // ultra fast-case: filling with no effects that affect geometry
1612 if (kFill_Style == style) {
1613 uintptr_t effects = reinterpret_cast<uintptr_t>(this->getLooper());
1614 effects |= reinterpret_cast<uintptr_t>(this->getMaskFilter());
1615 effects |= reinterpret_cast<uintptr_t>(this->getPathEffect());
senorblanco@chromium.org336d1d72014-01-27 21:03:17 +00001616 effects |= reinterpret_cast<uintptr_t>(this->getImageFilter());
reed@google.coma584aed2012-05-16 14:06:02 +00001617 if (!effects) {
1618 return orig;
1619 }
1620 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001621
reed@google.coma584aed2012-05-16 14:06:02 +00001622 return this->doComputeFastBounds(orig, storage, style);
1623 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001624
Cary Clark50fa3ff2017-07-26 10:15:23 -04001625 /** (to be made private)
1626
1627 @param orig geometry modified by SkPaint when drawn
1628 @param storage computed bounds of geometry
1629 @return fast computed bounds
1630 */
reed@google.coma584aed2012-05-16 14:06:02 +00001631 const SkRect& computeFastStrokeBounds(const SkRect& orig,
1632 SkRect* storage) const {
reed@google.com73a02582012-05-16 19:21:12 +00001633 return this->doComputeFastBounds(orig, storage, kStroke_Style);
reed@google.coma584aed2012-05-16 14:06:02 +00001634 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001635
Cary Clark50fa3ff2017-07-26 10:15:23 -04001636 /** (to be made private)
1637 Take the style explicitly, so the caller can force us to be stroked
1638 without having to make a copy of the paint just to change that field.
1639
1640 @param orig geometry modified by SkPaint when drawn
1641 @param storage computed bounds of geometry
1642 @param style overrides SkPaint::Style
1643 @return fast computed bounds
1644 */
reed@google.coma584aed2012-05-16 14:06:02 +00001645 const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
Cary Clark0418a882017-05-10 09:07:42 -04001646 Style style) const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001647
Cary Clark23890a92017-07-27 16:30:51 -04001648 /** macro expands to: void toString(SkString* str) const;
Cary Clark50fa3ff2017-07-26 10:15:23 -04001649 Converts SkPaint to machine parsable form in developer mode.
Cary Clark0418a882017-05-10 09:07:42 -04001650
Cary Clark50fa3ff2017-07-26 10:15:23 -04001651 @param str storage for string containing parsable SkPaint
1652 */
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +00001653 SK_TO_STRING_NONVIRT()
robertphillips@google.com791f12e2013-02-14 13:53:53 +00001654
reed@google.comd5f20792012-05-16 14:15:02 +00001655private:
Cary Clark0418a882017-05-10 09:07:42 -04001656 typedef const SkGlyph& (*GlyphCacheProc)(SkGlyphCache*, const char**);
1657
reeda5ab9ec2016-03-06 18:10:48 -08001658 sk_sp<SkTypeface> fTypeface;
1659 sk_sp<SkPathEffect> fPathEffect;
1660 sk_sp<SkShader> fShader;
reeda5ab9ec2016-03-06 18:10:48 -08001661 sk_sp<SkMaskFilter> fMaskFilter;
1662 sk_sp<SkColorFilter> fColorFilter;
1663 sk_sp<SkRasterizer> fRasterizer;
reed46f2d0a2016-09-11 05:40:31 -07001664 sk_sp<SkDrawLooper> fDrawLooper;
reeda5ab9ec2016-03-06 18:10:48 -08001665 sk_sp<SkImageFilter> fImageFilter;
reed@google.comd5f20792012-05-16 14:15:02 +00001666
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001667 SkScalar fTextSize;
1668 SkScalar fTextScaleX;
1669 SkScalar fTextSkewX;
reed@google.comd5f20792012-05-16 14:15:02 +00001670 SkColor fColor;
1671 SkScalar fWidth;
1672 SkScalar fMiterLimit;
Mike Reed71fecc32016-11-18 17:19:54 -05001673 uint32_t fBlendMode; // just need 5-6 bits
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001674 union {
1675 struct {
1676 // all of these bitfields should add up to 32
1677 unsigned fFlags : 16;
1678 unsigned fTextAlign : 2;
1679 unsigned fCapType : 2;
1680 unsigned fJoinType : 2;
1681 unsigned fStyle : 2;
1682 unsigned fTextEncoding : 2; // 3 values
1683 unsigned fHinting : 2;
reedf803da12015-01-23 05:58:07 -08001684 unsigned fFilterQuality : 2;
commit-bot@chromium.org85faf502014-04-16 12:58:02 +00001685 //unsigned fFreeBits : 2;
reedf59eab22014-07-14 14:39:15 -07001686 } fBitfields;
1687 uint32_t fBitfieldsUInt;
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001688 };
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001689
robertphillipse34f17d2016-07-19 07:59:22 -07001690 static GlyphCacheProc GetGlyphCacheProc(TextEncoding encoding,
1691 bool isDevKern,
1692 bool needFullMetrics);
reed@google.comd5f20792012-05-16 14:15:02 +00001693
1694 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length,
1695 int* count, SkRect* bounds) const;
1696
brianosmana1e8f8d2016-04-08 06:47:54 -07001697 enum ScalerContextFlags : uint32_t {
1698 kNone_ScalerContextFlags = 0,
1699
1700 kFakeGamma_ScalerContextFlag = 1 << 0,
1701 kBoostContrast_ScalerContextFlag = 1 << 1,
1702
1703 kFakeGammaAndBoostContrast_ScalerContextFlags =
1704 kFakeGamma_ScalerContextFlag | kBoostContrast_ScalerContextFlag,
bungemanf6d1e602016-02-22 13:20:28 -08001705 };
1706
joshualittfd450792015-03-13 08:38:43 -07001707 /*
1708 * Allocs an SkDescriptor on the heap and return it to the caller as a refcnted
1709 * SkData. Caller is responsible for managing the lifetime of this object.
1710 */
reeda9322c22016-04-12 06:47:05 -07001711 void getScalerContextDescriptor(SkScalerContextEffects*, SkAutoDescriptor*,
1712 const SkSurfaceProps& surfaceProps,
brianosmana1e8f8d2016-04-08 06:47:54 -07001713 uint32_t scalerContextFlags, const SkMatrix*) const;
joshualittfd450792015-03-13 08:38:43 -07001714
brianosmana1e8f8d2016-04-08 06:47:54 -07001715 SkGlyphCache* detachCache(const SkSurfaceProps* surfaceProps, uint32_t scalerContextFlags,
bungemanf6d1e602016-02-22 13:20:28 -08001716 const SkMatrix*) const;
reed@google.comd5f20792012-05-16 14:15:02 +00001717
brianosmana1e8f8d2016-04-08 06:47:54 -07001718 void descriptorProc(const SkSurfaceProps* surfaceProps, uint32_t scalerContextFlags,
bungemanf6d1e602016-02-22 13:20:28 -08001719 const SkMatrix* deviceMatrix,
reeda9322c22016-04-12 06:47:05 -07001720 void (*proc)(SkTypeface*, const SkScalerContextEffects&,
1721 const SkDescriptor*, void*),
bungemanf6d1e602016-02-22 13:20:28 -08001722 void* context) const;
reed@android.comd252db02009-04-01 18:31:44 +00001723
joshualitt9e36c1a2015-04-14 12:17:27 -07001724 /*
1725 * The luminance color is used to determine which Gamma Canonical color to map to. This is
1726 * really only used by backends which want to cache glyph masks, and need some way to know if
1727 * they need to generate new masks based off a given color.
1728 */
1729 SkColor computeLuminanceColor() const;
1730
reed@android.com8a1c16f2008-12-17 15:59:43 +00001731 enum {
reed@google.comed43dff2013-06-04 16:56:27 +00001732 /* This is the size we use when we ask for a glyph's path. We then
1733 * post-transform it as we draw to match the request.
1734 * This is done to try to re-use cache entries for the path.
1735 *
1736 * This value is somewhat arbitrary. In theory, it could be 1, since
1737 * we store paths as floats. However, we get the path from the font
1738 * scaler, and it may represent its paths as fixed-point (or 26.6),
1739 * so we shouldn't ask for something too big (might overflow 16.16)
1740 * or too small (underflow 26.6).
1741 *
1742 * This value could track kMaxSizeForGlyphCache, assuming the above
1743 * constraints, but since we ask for unhinted paths, the two values
1744 * need not match per-se.
1745 */
1746 kCanonicalTextSizeForPaths = 64,
reed@android.com8a1c16f2008-12-17 15:59:43 +00001747 };
reed@google.comed43dff2013-06-04 16:56:27 +00001748
1749 static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM);
1750
reed@google.comed43dff2013-06-04 16:56:27 +00001751 // Set flags/hinting/textSize up to use for drawing text as paths.
1752 // Returns scale factor to restore the original textSize, since will will
1753 // have change it to kCanonicalTextSizeForPaths.
1754 SkScalar setupForAsPaths();
1755
Mike Reedd5bee5d2017-06-01 14:45:44 -04001756 static SkScalar MaxCacheSize2();
reed@google.comed43dff2013-06-04 16:56:27 +00001757
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001758 friend class SkAutoGlyphCache;
jvanverth2d2a68c2014-06-10 06:42:56 -07001759 friend class SkAutoGlyphCacheNoGamma;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001760 friend class SkCanvas;
1761 friend class SkDraw;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001762 friend class SkPDFDevice;
joshualitte76b4bb2015-12-28 07:23:58 -08001763 friend class GrAtlasTextBlob;
joshualittdbd35932015-04-02 09:19:04 -07001764 friend class GrAtlasTextContext;
kkinnunenc6cb56f2014-06-24 00:12:27 -07001765 friend class GrStencilAndCoverTextContext;
cdalton855d83f2014-09-18 13:51:53 -07001766 friend class GrPathRendering;
joshualitt0a42e682015-12-10 13:20:58 -08001767 friend class GrTextUtils;
cdalton855d83f2014-09-18 13:51:53 -07001768 friend class GrGLPathRendering;
joshualitt9e36c1a2015-04-14 12:17:27 -07001769 friend class SkScalerContext;
caryclark0449bcf2016-02-09 13:25:45 -08001770 friend class SkTextBaseIter;
reed@google.comed43dff2013-06-04 16:56:27 +00001771 friend class SkCanonicalizePaint;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001772};
1773
reed@android.com8a1c16f2008-12-17 15:59:43 +00001774#endif