blob: 829388bc24251afdacaccc26d86b338dd74d9ae5 [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 SkShader;
robertphillipsfcf78292015-06-19 11:49:52 -070034class SkSurfaceProps;
fmalitaeae6a912016-07-28 09:47:24 -070035class SkTextBlob;
reed@android.com8a1c16f2008-12-17 15:59:43 +000036class SkTypeface;
reed@android.com8a1c16f2008-12-17 15:59:43 +000037
reed@android.com8a1c16f2008-12-17 15:59:43 +000038/** \class SkPaint
Cary Clark50fa3ff2017-07-26 10:15:23 -040039 SkPaint controls options applied when drawing and measuring. SkPaint collects all
40 options outside of the SkCanvas clip and SkCanvas matrix.
reed@android.com8a1c16f2008-12-17 15:59:43 +000041
Cary Clark50fa3ff2017-07-26 10:15:23 -040042 Various options apply to text, strokes and fills, and images.
43
44 Some options may not be implemented on all platforms; in these cases, setting
45 the option has no effect. Some options are conveniences that duplicate SkCanvas
46 functionality; for instance, text size is identical to matrix scale.
47
48 SkPaint options are rarely exclusive; each option modifies a stage of the drawing
Cary Clark23890a92017-07-27 16:30:51 -040049 pipeline and multiple pipeline stages may be affected by a single SkPaint.
Cary Clark50fa3ff2017-07-26 10:15:23 -040050
Cary Clark23890a92017-07-27 16:30:51 -040051 SkPaint collects effects and filters that describe single-pass and multiple-pass
Cary Clark50fa3ff2017-07-26 10:15:23 -040052 algorithms that alter the drawing geometry, color, and transparency. For instance,
53 SkPaint does not directly implement dashing or blur, but contains the objects that do so.
54
55 The objects contained by SkPaint are opaque, and cannot be edited outside of the SkPaint
56 to affect it. The implementation is free to defer computations associated with the
57 SkPaint, or ignore them altogether. For instance, some GPU implementations draw all
Cary Clarkb7da7232017-09-01 13:49:54 -040058 SkPath geometries with anti-aliasing, regardless of how SkPaint::kAntiAlias_Flag
59 is set in SkPaint.
Cary Clark50fa3ff2017-07-26 10:15:23 -040060
61 SkPaint describes a single color, a single font, a single image quality, and so on.
62 Multiple colors are drawn either by using multiple paints or with objects like
63 SkShader attached to SkPaint.
reed@android.com8a1c16f2008-12-17 15:59:43 +000064*/
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +000065class SK_API SkPaint {
reed@android.com8a1c16f2008-12-17 15:59:43 +000066public:
Cary Clark50fa3ff2017-07-26 10:15:23 -040067
68 /** Constructs SkPaint with default values.
69
70 @return default initialized SkPaint
71 */
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 SkPaint();
Cary Clark50fa3ff2017-07-26 10:15:23 -040073
74 /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
Mike Reed8ad91a92018-01-19 19:09:32 -050075 SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
Cary Clarkb7da7232017-09-01 13:49:54 -040076 between the original paint and the copy. Objects containing SkRefCnt increment
77 their references by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -040078
Mike Reed8ad91a92018-01-19 19:09:32 -050079 The referenced objects SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
Cary Clark50fa3ff2017-07-26 10:15:23 -040080 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
Cary Clark8a02b0b2017-09-21 12:28:43 -040088 /** Implements a move constructor to avoid increasing the reference counts
Cary Clark50fa3ff2017-07-26 10:15:23 -040089 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,
Mike Reed8ad91a92018-01-19 19:09:32 -050099 SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter. If the
Cary Clarkb7da7232017-09-01 13:49:54 -0400100 objects containing SkRefCnt go to zero, they are deleted.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400101 */
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,
Mike Reed8ad91a92018-01-19 19:09:32 -0500105 SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
Cary Clarkb7da7232017-09-01 13:49:54 -0400106 between the original paint and the copy. Objects containing SkRefCnt in the
Cary Clark50fa3ff2017-07-26 10:15:23 -0400107 prior destination are decreased by one, and the referenced objects are deleted if the
Cary Clarkb7da7232017-09-01 13:49:54 -0400108 resulting count is zero. Objects containing SkRefCnt in the parameter paint
109 are increased by one. paint is unmodified.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400110
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
Cary Clark8a02b0b2017-09-21 12:28:43 -0400116 /** Moves the paint to avoid increasing the reference counts
Cary Clarkb7da7232017-09-01 13:49:54 -0400117 of objects referenced by the paint parameter. Objects containing SkRefCnt in the
118 prior destination are decreased by one; those objects are deleted if the resulting count
119 is zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400120
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
Mike Reed8ad91a92018-01-19 19:09:32 -0500129 if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400130 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
Mike Reed8ad91a92018-01-19 19:09:32 -0500139 if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400140 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
Cary Clarkb7da7232017-09-01 13:49:54 -0400177 @param buffer serialized data describing SkPaint content
Cary Clark75959392018-02-27 10:22:04 -0500178 @return false if the buffer contains invalid data
Cary Clark50fa3ff2017-07-26 10:15:23 -0400179 */
Mike Reede97e7922018-01-18 15:57:38 -0500180 bool unflatten(SkReadBuffer& buffer);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000181
Cary Clarkcc309eb2017-10-30 11:48:35 -0400182 /** Sets all SkPaint contents to their initial values. This is equivalent to replacing
183 SkPaint with the result of SkPaint().
reed@android.com8a1c16f2008-12-17 15:59:43 +0000184 */
185 void reset();
186
Cary Clark50fa3ff2017-07-26 10:15:23 -0400187 /** \enum SkPaint::Hinting
188 Hinting adjusts the glyph outlines so that the shape provides a uniform
189 look at a given point size on font engines that support it. Hinting may have a
190 muted effect or no effect at all depending on the platform.
191
192 The four levels roughly control corresponding features on platforms that use FreeType
193 as the font engine.
agl@chromium.org309485b2009-07-21 17:41:32 +0000194 */
195 enum Hinting {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400196 /** Leaves glyph outlines unchanged from their native representation.
197 With FreeType, this is equivalent to the FT_LOAD_NO_HINTING
198 bit-field constant supplied to FT_Load_Glyph, which indicates that the vector
199 outline being loaded should not be fitted to the pixel grid but simply scaled
200 to 26.6 fractional pixels.
201 */
202 kNo_Hinting = 0,
203
204 /** Modifies glyph outlines minimally to improve constrast.
205 With FreeType, this is equivalent in spirit to the
206 FT_LOAD_TARGET_LIGHT value supplied to FT_Load_Glyph. It chooses a
207 lighter hinting algorithm for non-monochrome modes.
208 Generated glyphs may be fuzzy but better resemble their original shape.
209 */
210 kSlight_Hinting = 1,
211
212 /** Modifies glyph outlines to improve constrast. This is the default.
213 With FreeType, this supplies FT_LOAD_TARGET_NORMAL to FT_Load_Glyph,
214 choosing the default hinting algorithm, which is optimized for standard
215 gray-level rendering.
216 */
217 kNormal_Hinting = 2,
218
219 /** Modifies glyph outlines for maxiumum constrast. With FreeType, this selects
220 FT_LOAD_TARGET_LCD or FT_LOAD_TARGET_LCD_V if kLCDRenderText_Flag is set.
221 FT_LOAD_TARGET_LCD is a variant of FT_LOAD_TARGET_NORMAL optimized for
222 horizontally decimated LCD displays; FT_LOAD_TARGET_LCD_V is a
223 variant of FT_LOAD_TARGET_NORMAL optimized for vertically decimated LCD displays.
224 */
225 kFull_Hinting = 3,
agl@chromium.org309485b2009-07-21 17:41:32 +0000226 };
227
Cary Clark50fa3ff2017-07-26 10:15:23 -0400228 /** Returns level of glyph outline adjustment.
229
230 @return one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting
231 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000232 Hinting getHinting() const {
reedf59eab22014-07-14 14:39:15 -0700233 return static_cast<Hinting>(fBitfields.fHinting);
agl@chromium.org309485b2009-07-21 17:41:32 +0000234 }
235
Cary Clark50fa3ff2017-07-26 10:15:23 -0400236 /** Sets level of glyph outline adjustment.
237 Does not check for valid values of hintingLevel.
238
239 @param hintingLevel one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting
240 */
djsollen@google.comf5dbe2f2011-04-15 13:41:26 +0000241 void setHinting(Hinting hintingLevel);
agl@chromium.org309485b2009-07-21 17:41:32 +0000242
Cary Clark50fa3ff2017-07-26 10:15:23 -0400243 /** \enum SkPaint::Flags
244 The bit values stored in Flags.
245 The default value for Flags, normally zero, can be changed at compile time
246 with a custom definition of SkPaintDefaults_Flags.
247 All flags can be read and written explicitly; Flags allows manipulating
248 multiple settings at once.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000249 */
250 enum Flags {
Cary Clark1eace2d2017-07-31 07:52:43 -0400251 kAntiAlias_Flag = 0x01, //!< mask for setting anti-alias
252 kDither_Flag = 0x04, //!< mask for setting dither
Cary Clark50fa3ff2017-07-26 10:15:23 -0400253 kFakeBoldText_Flag = 0x20, //!< mask for setting fake bold
254 kLinearText_Flag = 0x40, //!< mask for setting linear text
255 kSubpixelText_Flag = 0x80, //!< mask for setting subpixel text
256 kDevKernText_Flag = 0x100, //!< mask for setting full hinting spacing
Cary Clark75959392018-02-27 10:22:04 -0500257 kLCDRenderText_Flag = 0x200, //!< mask for setting LCD text
Cary Clark50fa3ff2017-07-26 10:15:23 -0400258 kEmbeddedBitmapText_Flag = 0x400, //!< mask for setting font embedded bitmaps
259 kAutoHinting_Flag = 0x800, //!< mask for setting auto-hinting
260 kVerticalText_Flag = 0x1000, //!< mask for setting vertical text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000261
Cary Clark50fa3ff2017-07-26 10:15:23 -0400262 /** Hack for GDI -- do not use if you can help it */
263 kGenA8FromLCD_Flag = 0x2000,
264
265 /** mask of all Flags, including private flags and flags reserved for future use */
266 kAllFlags = 0xFFFF,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000267 };
268
Cary Clark50fa3ff2017-07-26 10:15:23 -0400269 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
Mike Reedddbd37e2017-02-21 15:07:44 -0500270 enum ReserveFlags {
Cary Clark75959392018-02-27 10:22:04 -0500271 kUnderlineText_ReserveFlag = 0x08, //!< deprecated
272 kStrikeThruText_ReserveFlag = 0x10, //!< deprecated
Mike Reedddbd37e2017-02-21 15:07:44 -0500273 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400274 #endif
Mike Reedddbd37e2017-02-21 15:07:44 -0500275
Cary Clark50fa3ff2017-07-26 10:15:23 -0400276 /** Returns paint settings described by SkPaint::Flags. Each setting uses one
277 bit, and can be tested with SkPaint::Flags members.
278
279 @return zero, one, or more bits described by SkPaint::Flags
reed@android.com8a1c16f2008-12-17 15:59:43 +0000280 */
reedf59eab22014-07-14 14:39:15 -0700281 uint32_t getFlags() const { return fBitfields.fFlags; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000282
Cary Clark23890a92017-07-27 16:30:51 -0400283 /** Replaces SkPaint::Flags with flags, the union of the SkPaint::Flags members.
284 All SkPaint::Flags members may be cleared, or one or more may be set.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400285
286 @param flags union of SkPaint::Flags for SkPaint
reed@android.com8a1c16f2008-12-17 15:59:43 +0000287 */
288 void setFlags(uint32_t flags);
289
Cary Clark50fa3ff2017-07-26 10:15:23 -0400290 /** If true, pixels on the active edges of SkPath may be drawn with partial transparency.
291
Cary Clark579985c2017-07-31 11:48:27 -0400292 Equivalent to getFlags() masked with kAntiAlias_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400293
294 @return kAntiAlias_Flag state
295 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000296 bool isAntiAlias() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000297 return SkToBool(this->getFlags() & kAntiAlias_Flag);
298 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000299
Cary Clark50fa3ff2017-07-26 10:15:23 -0400300 /** Requests, but does not require, that SkPath edge pixels draw opaque or with
301 partial transparency.
302
303 Sets kAntiAlias_Flag if aa is true.
304 Clears kAntiAlias_Flag if aa is false.
305
306 @param aa setting for kAntiAlias_Flag
307 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000308 void setAntiAlias(bool aa);
reed@google.com9d07fec2011-03-16 20:02:59 +0000309
Cary Clark50fa3ff2017-07-26 10:15:23 -0400310 /** If true, color error may be distributed to smooth color transition.
311
Cary Clark579985c2017-07-31 11:48:27 -0400312 Equivalent to getFlags() masked with kDither_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400313
314 @return kDither_Flag state
315 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000316 bool isDither() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000317 return SkToBool(this->getFlags() & kDither_Flag);
318 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000319
Cary Clark50fa3ff2017-07-26 10:15:23 -0400320 /** Requests, but does not require, to distribute color error.
321
322 Sets kDither_Flag if dither is true.
323 Clears kDither_Flag if dither is false.
324
325 @param dither setting for kDither_Flag
326 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000327 void setDither(bool dither);
reed@google.com9d07fec2011-03-16 20:02:59 +0000328
Cary Clark50fa3ff2017-07-26 10:15:23 -0400329 /** If true, text is converted to SkPath before drawing and measuring.
330
Cary Clark579985c2017-07-31 11:48:27 -0400331 Equivalent to getFlags() masked with kLinearText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400332
333 @return kLinearText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000334 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000335 bool isLinearText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000336 return SkToBool(this->getFlags() & kLinearText_Flag);
337 }
338
Cary Clark50fa3ff2017-07-26 10:15:23 -0400339 /** If true, text is converted to SkPath before drawing and measuring.
340 By default, kLinearText_Flag is clear.
341
342 Sets kLinearText_Flag if linearText is true.
343 Clears kLinearText_Flag if linearText is false.
344
345 @param linearText setting for kLinearText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000346 */
347 void setLinearText(bool linearText);
348
Cary Clark50fa3ff2017-07-26 10:15:23 -0400349 /** If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
350
Cary Clark579985c2017-07-31 11:48:27 -0400351 Equivalent to getFlags() masked with kSubpixelText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400352
353 @return kSubpixelText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000354 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000355 bool isSubpixelText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000356 return SkToBool(this->getFlags() & kSubpixelText_Flag);
357 }
reed@google.com9d07fec2011-03-16 20:02:59 +0000358
Cary Clark50fa3ff2017-07-26 10:15:23 -0400359 /** Requests, but does not require, that glyphs respect sub-pixel positioning.
360
361 Sets kSubpixelText_Flag if subpixelText is true.
362 Clears kSubpixelText_Flag if subpixelText is false.
363
364 @param subpixelText setting for kSubpixelText_Flag
365 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000366 void setSubpixelText(bool subpixelText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000367
Cary Clark50fa3ff2017-07-26 10:15:23 -0400368 /** If true, glyphs may use LCD striping to improve glyph edges.
369
370 Returns true if SkPaint::Flags kLCDRenderText_Flag is set.
371
372 @return kLCDRenderText_Flag state
373 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000374 bool isLCDRenderText() const {
agl@chromium.org309485b2009-07-21 17:41:32 +0000375 return SkToBool(this->getFlags() & kLCDRenderText_Flag);
376 }
377
Cary Clark50fa3ff2017-07-26 10:15:23 -0400378 /** Requests, but does not require, that glyphs use LCD striping for glyph edges.
379
380 Sets kLCDRenderText_Flag if lcdText is true.
381 Clears kLCDRenderText_Flag if lcdText is false.
382
383 @param lcdText setting for kLCDRenderText_Flag
384 */
reed@google.com84b437e2011-08-01 12:45:35 +0000385 void setLCDRenderText(bool lcdText);
agl@chromium.org309485b2009-07-21 17:41:32 +0000386
Cary Clark50fa3ff2017-07-26 10:15:23 -0400387 /** If true, font engine may return glyphs from font bitmaps instead of from outlines.
388
Cary Clark579985c2017-07-31 11:48:27 -0400389 Equivalent to getFlags() masked with kEmbeddedBitmapText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400390
391 @return kEmbeddedBitmapText_Flag state
392 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000393 bool isEmbeddedBitmapText() const {
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000394 return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
395 }
396
Cary Clark50fa3ff2017-07-26 10:15:23 -0400397 /** Requests, but does not require, to use bitmaps in fonts instead of outlines.
398
399 Sets kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is true.
400 Clears kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is false.
401
402 @param useEmbeddedBitmapText setting for kEmbeddedBitmapText_Flag
agl@chromium.orge95c91e2010-01-04 18:27:55 +0000403 */
404 void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
405
Cary Clark50fa3ff2017-07-26 10:15:23 -0400406 /** If true, and if SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting, and if
407 platform uses FreeType as the font manager, instruct the font manager to always hint
Cary Clark1eace2d2017-07-31 07:52:43 -0400408 glyphs.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400409
Cary Clark579985c2017-07-31 11:48:27 -0400410 Equivalent to getFlags() masked with kAutoHinting_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400411
412 @return kAutoHinting_Flag state
413 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000414 bool isAutohinted() const {
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000415 return SkToBool(this->getFlags() & kAutoHinting_Flag);
416 }
417
Cary Clark50fa3ff2017-07-26 10:15:23 -0400418 /** If SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting and useAutohinter is set,
Cary Clark1eace2d2017-07-31 07:52:43 -0400419 instruct the font manager to always hint glyphs.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400420 auto-hinting has no effect if SkPaint::Hinting is set to kNo_Hinting or
421 kSlight_Hinting.
422
Cary Clark579985c2017-07-31 11:48:27 -0400423 Only affects platforms that use FreeType as the font manager.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400424
425 Sets kAutoHinting_Flag if useAutohinter is true.
426 Clears kAutoHinting_Flag if useAutohinter is false.
427
428 @param useAutohinter setting for kAutoHinting_Flag
agl@chromium.orga2c71cb2010-06-17 20:49:17 +0000429 */
430 void setAutohinted(bool useAutohinter);
431
Cary Clark50fa3ff2017-07-26 10:15:23 -0400432 /** If true, glyphs are drawn top to bottom instead of left to right.
433
Cary Clark579985c2017-07-31 11:48:27 -0400434 Equivalent to getFlags() masked with kVerticalText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400435
436 @return kVerticalText_Flag state
437 */
reed@google.com830a23e2011-11-10 15:20:49 +0000438 bool isVerticalText() const {
439 return SkToBool(this->getFlags() & kVerticalText_Flag);
440 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000441
Cary Clark50fa3ff2017-07-26 10:15:23 -0400442 /** If true, text advance positions the next glyph below the previous glyph instead of to the
443 right of previous glyph.
444
445 Sets kVerticalText_Flag if vertical is true.
446 Clears kVerticalText_Flag if vertical is false.
447
448 @param verticalText setting for kVerticalText_Flag
449 */
Cary Clark0418a882017-05-10 09:07:42 -0400450 void setVerticalText(bool verticalText);
reed@google.com830a23e2011-11-10 15:20:49 +0000451
Cary Clark50fa3ff2017-07-26 10:15:23 -0400452 /** If true, approximate bold by increasing the stroke width when creating glyph bitmaps
453 from outlines.
454
Cary Clark579985c2017-07-31 11:48:27 -0400455 Equivalent to getFlags() masked with kFakeBoldText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400456
457 @return kFakeBoldText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000458 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000459 bool isFakeBoldText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000460 return SkToBool(this->getFlags() & kFakeBoldText_Flag);
461 }
462
Cary Clarkb7da7232017-09-01 13:49:54 -0400463 /** Use increased stroke width when creating glyph bitmaps to approximate a bold typeface.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400464
465 Sets kFakeBoldText_Flag if fakeBoldText is true.
466 Clears kFakeBoldText_Flag if fakeBoldText is false.
467
468 @param fakeBoldText setting for kFakeBoldText_Flag
reed@android.com8a1c16f2008-12-17 15:59:43 +0000469 */
470 void setFakeBoldText(bool fakeBoldText);
471
Cary Clark50fa3ff2017-07-26 10:15:23 -0400472 /** Returns if character spacing may be adjusted by the hinting difference.
473
Cary Clark579985c2017-07-31 11:48:27 -0400474 Equivalent to getFlags() masked with kDevKernText_Flag.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400475
476 @return kDevKernText_Flag state
reed@android.com8a1c16f2008-12-17 15:59:43 +0000477 */
reed@google.com9d07fec2011-03-16 20:02:59 +0000478 bool isDevKernText() const {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000479 return SkToBool(this->getFlags() & kDevKernText_Flag);
480 }
481
Cary Clark50fa3ff2017-07-26 10:15:23 -0400482 /** Requests, but does not require, to use hinting to adjust glyph spacing.
483
484 Sets kDevKernText_Flag if devKernText is true.
485 Clears kDevKernText_Flag if devKernText is false.
486
487 @param devKernText setting for devKernText
reed@android.com8a1c16f2008-12-17 15:59:43 +0000488 */
489 void setDevKernText(bool devKernText);
490
Cary Clark50fa3ff2017-07-26 10:15:23 -0400491 /** Returns SkFilterQuality, the image filtering level. A lower setting
492 draws faster; a higher setting looks better when the image is scaled.
493
494 @return one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
495 kMedium_SkFilterQuality, kHigh_SkFilterQuality
496 */
reedf803da12015-01-23 05:58:07 -0800497 SkFilterQuality getFilterQuality() const {
498 return (SkFilterQuality)fBitfields.fFilterQuality;
499 }
mtkleinfe81e2d2015-09-09 07:35:42 -0700500
Cary Clark23890a92017-07-27 16:30:51 -0400501 /** Sets SkFilterQuality, the image filtering level. A lower setting
Cary Clark50fa3ff2017-07-26 10:15:23 -0400502 draws faster; a higher setting looks better when the image is scaled.
Cary Clark579985c2017-07-31 11:48:27 -0400503 Does not check to see if quality is valid.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400504
505 @param quality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
506 kMedium_SkFilterQuality, kHigh_SkFilterQuality
507 */
reedf803da12015-01-23 05:58:07 -0800508 void setFilterQuality(SkFilterQuality quality);
reed@google.comc9683152013-07-18 13:47:01 +0000509
Cary Clark50fa3ff2017-07-26 10:15:23 -0400510 /** \enum SkPaint::Style
Cary Clark23890a92017-07-27 16:30:51 -0400511 Set Style to fill, stroke, or both fill and stroke geometry.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400512 The stroke and fill
513 share all paint attributes; for instance, they are drawn with the same color.
reed@google.com9d07fec2011-03-16 20:02:59 +0000514
Cary Clark50fa3ff2017-07-26 10:15:23 -0400515 Use kStrokeAndFill_Style to avoid hitting the same pixels twice with a stroke draw and
516 a fill draw.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000517 */
518 enum Style {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400519 /** Set to fill geometry.
Cary Clark1eace2d2017-07-31 07:52:43 -0400520 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and text.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400521 SkBitmap, SkImage, patches, SkRegion, sprites, and vertices are painted as if
522 kFill_Style is set, and ignore the set Style.
523 The FillType specifies additional rules to fill the area outside the path edge,
524 and to create an unfilled hole inside the shape.
525 Style is set to kFill_Style by default.
526 */
527 kFill_Style,
528
529 /** Set to stroke geometry.
Cary Clarkb7da7232017-09-01 13:49:54 -0400530 Applies to SkRect, SkRegion, SkRRect, arcs, circles, ovals, SkPath, and text.
Cary Clark2823f9f2018-01-03 10:00:34 -0500531 Arcs, lines, and points, are always drawn as if kStroke_Style is set,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400532 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.
Cary Clark1eace2d2017-07-31 07:52:43 -0400538 Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and text.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400539 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
Cary Clark8a02b0b2017-09-21 12:28:43 -0400569 @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,
Cary Clarkb7da7232017-09-01 13:49:54 -0400574 unpremultiplied, packing 8-bit components for alpha, red, blue, and green.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400575
Cary Clark8a02b0b2017-09-21 12:28:43 -0400576 @param color unpremultiplied ARGB
reed@android.com8a1c16f2008-12-17 15:59:43 +0000577 */
578 void setColor(SkColor color);
579
Cary Clark1eace2d2017-07-31 07:52:43 -0400580 /** Retrieves alpha from the color used when stroking and filling.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400581
Cary Clark8a02b0b2017-09-21 12:28:43 -0400582 @return alpha ranging from zero, fully transparent, to 255, fully opaque
Cary Clark50fa3ff2017-07-26 10:15:23 -0400583 */
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.
Cary Clark1eace2d2017-07-31 07:52:43 -0400589 a set to zero makes color fully transparent; a set to 255 makes color
Cary Clark50fa3ff2017-07-26 10:15:23 -0400590 fully opaque.
591
Cary Clark8a02b0b2017-09-21 12:28:43 -0400592 @param a alpha component of color
reed@android.com8a1c16f2008-12-17 15:59:43 +0000593 */
594 void setAlpha(U8CPU a);
595
Cary Clark1eace2d2017-07-31 07:52:43 -0400596 /** Sets color used when drawing solid fills. The color components range from 0 to 255.
Cary Clarkb7da7232017-09-01 13:49:54 -0400597 The color is unpremultiplied; alpha sets the transparency independent of RGB.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400598
Cary Clarkb7da7232017-09-01 13:49:54 -0400599 @param a amount of color alpha, from fully transparent (0) to fully opaque (255)
600 @param r amount of color rgb red, from no red (0) to full red (255)
601 @param g amount of color rgb green, from no green (0) to full green (255)
602 @param b amount of color rgb blue, from no blue (0) to full blue (255)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000603 */
604 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
605
Cary Clark50fa3ff2017-07-26 10:15:23 -0400606 /** Returns the thickness of the pen used by SkPaint to
607 outline the shape.
608
Cary Clark1eace2d2017-07-31 07:52:43 -0400609 @return zero for hairline, greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000610 */
611 SkScalar getStrokeWidth() const { return fWidth; }
612
Cary Clark50fa3ff2017-07-26 10:15:23 -0400613 /** Sets the thickness of the pen used by the paint to
614 outline the shape.
615 Has no effect if width is less than zero.
616
Cary Clark1eace2d2017-07-31 07:52:43 -0400617 @param width zero thickness for hairline; greater than zero for pen thickness
reed@android.com8a1c16f2008-12-17 15:59:43 +0000618 */
619 void setStrokeWidth(SkScalar width);
620
Cary Clark50fa3ff2017-07-26 10:15:23 -0400621 /** The limit at which a sharp corner is drawn beveled.
622
623 @return zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000624 */
625 SkScalar getStrokeMiter() const { return fMiterLimit; }
626
Cary Clark50fa3ff2017-07-26 10:15:23 -0400627 /** The limit at which a sharp corner is drawn beveled.
628 Valid values are zero and greater.
629 Has no effect if miter is less than zero.
630
631 @param miter zero and greater miter limit
reed@android.com8a1c16f2008-12-17 15:59:43 +0000632 */
633 void setStrokeMiter(SkScalar miter);
634
Cary Clark50fa3ff2017-07-26 10:15:23 -0400635 /** \enum SkPaint::Cap
636 Cap draws at the beginning and end of an open path contour.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000637 */
638 enum Cap {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400639 kButt_Cap, //!< Does not extend the stroke past the beginning or the end.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000640
Cary Clark50fa3ff2017-07-26 10:15:23 -0400641 /** Adds a circle with a diameter equal to stroke width at the beginning
642 and end.
643 */
644 kRound_Cap,
645
646 /** Adds a square with sides equal to stroke width at the beginning
647 and end. The square sides are parallel to the initial and final direction
648 of the stroke.
649 */
650 kSquare_Cap,
651 kLast_Cap = kSquare_Cap, //!< Equivalent to the largest value for Cap.
652
653 /** Equivalent to kButt_Cap.
654 Cap is set to kButt_Cap by default.
655 */
656 kDefault_Cap = kButt_Cap,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000657 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400658
Cary Clark75959392018-02-27 10:22:04 -0500659 /** The number of different SkPaint::Cap values defined.
660 May be used to verify that SkPaint::Cap is a legal value.*/
bsalomona7d85ba2016-07-06 11:54:59 -0700661 static constexpr int kCapCount = kLast_Cap + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000662
Cary Clark50fa3ff2017-07-26 10:15:23 -0400663 /** \enum SkPaint::Join
Cary Clark1eace2d2017-07-31 07:52:43 -0400664 Join specifies how corners are drawn when a shape is stroked. Join
Cary Clark50fa3ff2017-07-26 10:15:23 -0400665 affects the four corners of a stroked rectangle, and the connected segments in a
666 stroked path.
667
668 Choose miter join to draw sharp corners. Choose round join to draw a circle with a
669 radius equal to the stroke width on top of the corner. Choose bevel join to minimally
670 connect the thick strokes.
671
672 The fill path constructed to describe the stroked path respects the join setting but may
673 not contain the actual join. For instance, a fill path constructed with round joins does
674 not necessarily include circles at each connected segment.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000675 */
676 enum Join {
Cary Clark23890a92017-07-27 16:30:51 -0400677 /** Extends the outside corner to the extent allowed by miter limit.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400678 If the extension exceeds miter limit, kBevel_Join is used instead.
679 */
680 kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000681
Cary Clark50fa3ff2017-07-26 10:15:23 -0400682 /** Adds a circle with a diameter of stroke width at the sharp corner. */
683 kRound_Join,
684 kBevel_Join, //!< Connects the outside edges of the sharp corner.
685 kLast_Join = kBevel_Join, //!< Equivalent to the largest value for Join.
686
687 /** Equivalent to kMiter_Join.
688 Join is set to kMiter_Join by default.
689 */
690 kDefault_Join = kMiter_Join,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000691 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400692
Cary Clark75959392018-02-27 10:22:04 -0500693 /** The number of different SkPaint::Join values defined.
694 May be used to verify that SkPaint::Join is a legal value.*/
bsalomona7d85ba2016-07-06 11:54:59 -0700695 static constexpr int kJoinCount = kLast_Join + 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000696
Cary Clark50fa3ff2017-07-26 10:15:23 -0400697 /** The geometry drawn at the beginning and end of strokes.
698
699 @return one of: kButt_Cap, kRound_Cap, kSquare_Cap
reed@android.com8a1c16f2008-12-17 15:59:43 +0000700 */
reedf59eab22014-07-14 14:39:15 -0700701 Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000702
Cary Clark50fa3ff2017-07-26 10:15:23 -0400703 /** The geometry drawn at the beginning and end of strokes.
704
705 @param cap one of: kButt_Cap, kRound_Cap, kSquare_Cap;
706 has no effect if cap is not valid
reed@android.com8a1c16f2008-12-17 15:59:43 +0000707 */
708 void setStrokeCap(Cap cap);
709
Cary Clark50fa3ff2017-07-26 10:15:23 -0400710 /** The geometry drawn at the corners of strokes.
711
712 @return one of: kMiter_Join, kRound_Join, kBevel_Join
reed@android.com8a1c16f2008-12-17 15:59:43 +0000713 */
reedf59eab22014-07-14 14:39:15 -0700714 Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000715
Cary Clark50fa3ff2017-07-26 10:15:23 -0400716 /** The geometry drawn at the corners of strokes.
717
718 @param join one of: kMiter_Join, kRound_Join, kBevel_Join;
Cary Clark579985c2017-07-31 11:48:27 -0400719 otherwise, has no effect
reed@android.com8a1c16f2008-12-17 15:59:43 +0000720 */
721 void setStrokeJoin(Join join);
722
Cary Clark50fa3ff2017-07-26 10:15:23 -0400723 /** The filled equivalent of the stroked path.
724
725 @param src SkPath read to create a filled version
726 @param dst resulting SkPath; may be the same as src, but may not be nullptr
727 @param cullRect optional limit passed to SkPathEffect
728 @param resScale if > 1, increase precision, else if (0 < res < 1) reduce precision
729 to favor speed and size
Cary Clark1eace2d2017-07-31 07:52:43 -0400730 @return true if the path represents style fill, or false if it represents hairline
Cary Clark50fa3ff2017-07-26 10:15:23 -0400731 */
reed05d90442015-02-12 13:35:52 -0800732 bool getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
733 SkScalar resScale = 1) const;
734
Cary Clark50fa3ff2017-07-26 10:15:23 -0400735 /** The filled equivalent of the stroked path.
736
Cary Clark23890a92017-07-27 16:30:51 -0400737 Replaces dst with the src path modified by SkPathEffect and style stroke.
738 SkPathEffect, if any, is not culled. stroke width is created with default precision.
739
740 @param src SkPath read to create a filled version
741 @param dst resulting SkPath dst may be the same as src, but may not be nullptr
Cary Clark1eace2d2017-07-31 07:52:43 -0400742 @return true if the path represents style fill, or false if it represents hairline
Cary Clark50fa3ff2017-07-26 10:15:23 -0400743 */
reed05d90442015-02-12 13:35:52 -0800744 bool getFillPath(const SkPath& src, SkPath* dst) const {
Ben Wagnera93a14a2017-08-28 10:34:05 -0400745 return this->getFillPath(src, dst, nullptr, 1);
reed05d90442015-02-12 13:35:52 -0800746 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000747
Cary Clark50fa3ff2017-07-26 10:15:23 -0400748 /** Optional colors used when filling a path, such as a gradient.
749
750 Does not alter SkShader SkRefCnt.
751
752 @return SkShader if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000753 */
reeda5ab9ec2016-03-06 18:10:48 -0800754 SkShader* getShader() const { return fShader.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400755
756 /** Optional colors used when filling a path, such as a gradient.
757
758 Increases SkShader SkRefCnt by one.
759
760 @return SkShader if previously set, nullptr otherwise
761 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500762 sk_sp<SkShader> refShader() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000763
Cary Clark50fa3ff2017-07-26 10:15:23 -0400764 /** Optional colors used when filling a path, such as a gradient.
765
Cary Clark8a02b0b2017-09-21 12:28:43 -0400766 Sets SkShader to shader, decreasing SkRefCnt of the previous SkShader.
767 Increments shader SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400768
Cary Clark1eace2d2017-07-31 07:52:43 -0400769 @param shader how geometry is filled with color; if nullptr, color is used instead
Cary Clark50fa3ff2017-07-26 10:15:23 -0400770 */
Cary Clark0418a882017-05-10 09:07:42 -0400771 void setShader(sk_sp<SkShader> shader);
reed@google.com9d07fec2011-03-16 20:02:59 +0000772
Cary Clark50fa3ff2017-07-26 10:15:23 -0400773 /** Returns SkColorFilter if set, or nullptr.
774 Does not alter SkColorFilter SkRefCnt.
775
776 @return SkColorFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000777 */
reeda5ab9ec2016-03-06 18:10:48 -0800778 SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400779
780 /** Returns SkColorFilter if set, or nullptr.
781 Increases SkColorFilter SkRefCnt by one.
782
783 @return SkColorFilter if set, or nullptr
784 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500785 sk_sp<SkColorFilter> refColorFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000786
Cary Clark8a02b0b2017-09-21 12:28:43 -0400787 /** Sets SkColorFilter to filter, decreasing SkRefCnt of the previous
788 SkColorFilter. Pass nullptr to clear SkColorFilter.
789
790 Increments filter SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400791
792 @param colorFilter SkColorFilter to apply to subsequent draw
reed@android.com8a1c16f2008-12-17 15:59:43 +0000793 */
Cary Clark0418a882017-05-10 09:07:42 -0400794 void setColorFilter(sk_sp<SkColorFilter> colorFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000795
Cary Clark50fa3ff2017-07-26 10:15:23 -0400796 /** Returns SkBlendMode.
Cary Clark579985c2017-07-31 11:48:27 -0400797 By default, returns SkBlendMode::kSrcOver.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400798
799 @return mode used to combine source color with destination color
800 */
reed374772b2016-10-05 17:33:02 -0700801 SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400802
803 /** Returns true if SkBlendMode is SkBlendMode::kSrcOver, the default.
804
805 @return true if SkBlendMode is SkBlendMode::kSrcOver
806 */
reed374772b2016-10-05 17:33:02 -0700807 bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400808
809 /** Sets SkBlendMode to mode.
810 Does not check for valid input.
811
812 @param mode SkBlendMode used to combine source color and destination
813 */
reed374772b2016-10-05 17:33:02 -0700814 void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
reed@android.coma0f5d152009-06-22 17:38:10 +0000815
Cary Clark50fa3ff2017-07-26 10:15:23 -0400816 /** Returns SkPathEffect if set, or nullptr.
817 Does not alter SkPathEffect SkRefCnt.
818
819 @return SkPathEffect if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000820 */
reeda5ab9ec2016-03-06 18:10:48 -0800821 SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400822
823 /** Returns SkPathEffect if set, or nullptr.
824 Increases SkPathEffect SkRefCnt by one.
825
826 @return SkPathEffect if previously set, nullptr otherwise
827 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500828 sk_sp<SkPathEffect> refPathEffect() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000829
Cary Clark8a02b0b2017-09-21 12:28:43 -0400830 /** Sets SkPathEffect to pathEffect, decreasing SkRefCnt of the previous
831 SkPathEffect. Pass nullptr to leave the path geometry unaltered.
832
833 Increments pathEffect SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400834
835 @param pathEffect replace SkPath with a modification when drawn
reed@android.com8a1c16f2008-12-17 15:59:43 +0000836 */
Cary Clark0418a882017-05-10 09:07:42 -0400837 void setPathEffect(sk_sp<SkPathEffect> pathEffect);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000838
Cary Clark50fa3ff2017-07-26 10:15:23 -0400839 /** Returns SkMaskFilter if set, or nullptr.
840 Does not alter SkMaskFilter SkRefCnt.
841
842 @return SkMaskFilter if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000843 */
reeda5ab9ec2016-03-06 18:10:48 -0800844 SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400845
846 /** Returns SkMaskFilter if set, or nullptr.
Cary Clark8a02b0b2017-09-21 12:28:43 -0400847
Cary Clark50fa3ff2017-07-26 10:15:23 -0400848 Increases SkMaskFilter SkRefCnt by one.
849
850 @return SkMaskFilter if previously set, nullptr otherwise
851 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500852 sk_sp<SkMaskFilter> refMaskFilter() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000853
Cary Clark8a02b0b2017-09-21 12:28:43 -0400854 /** Sets SkMaskFilter to maskFilter, decreasing SkRefCnt of the previous
855 SkMaskFilter. Pass nullptr to clear SkMaskFilter and leave SkMaskFilter effect on
856 mask alpha unaltered.
857
Cary Clark75959392018-02-27 10:22:04 -0500858 Increments maskFilter SkRefCnt by one.
859
Cary Clark50fa3ff2017-07-26 10:15:23 -0400860 @param maskFilter modifies clipping mask generated from drawn geometry
reed@android.com8a1c16f2008-12-17 15:59:43 +0000861 */
Cary Clark0418a882017-05-10 09:07:42 -0400862 void setMaskFilter(sk_sp<SkMaskFilter> maskFilter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000863
Cary Clark50fa3ff2017-07-26 10:15:23 -0400864 /** Returns SkTypeface if set, or nullptr.
Cary Clark8a02b0b2017-09-21 12:28:43 -0400865 Increments SkTypeface SkRefCnt by one.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000866
Cary Clark50fa3ff2017-07-26 10:15:23 -0400867 @return SkTypeface if previously set, nullptr otherwise
reed@android.com8a1c16f2008-12-17 15:59:43 +0000868 */
reeda5ab9ec2016-03-06 18:10:48 -0800869 SkTypeface* getTypeface() const { return fTypeface.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400870
871 /** Increases SkTypeface SkRefCnt by one.
872
873 @return SkTypeface if previously set, nullptr otherwise
874 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500875 sk_sp<SkTypeface> refTypeface() const;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000876
Cary Clark8a02b0b2017-09-21 12:28:43 -0400877 /** Sets SkTypeface to typeface, decreasing SkRefCnt of the previous SkTypeface.
878 Pass nullptr to clear SkTypeface and use the default typeface. Increments
879 typeface SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400880
881 @param typeface font and style used to draw text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000882 */
Cary Clark0418a882017-05-10 09:07:42 -0400883 void setTypeface(sk_sp<SkTypeface> typeface);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000884
Cary Clark50fa3ff2017-07-26 10:15:23 -0400885 /** Returns SkImageFilter if set, or nullptr.
886 Does not alter SkImageFilter SkRefCnt.
887
888 @return SkImageFilter if previously set, nullptr otherwise
889 */
reeda5ab9ec2016-03-06 18:10:48 -0800890 SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400891
892 /** Returns SkImageFilter if set, or nullptr.
893 Increases SkImageFilter SkRefCnt by one.
894
895 @return SkImageFilter if previously set, nullptr otherwise
896 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500897 sk_sp<SkImageFilter> refImageFilter() const;
Cary Clark50fa3ff2017-07-26 10:15:23 -0400898
Cary Clark8a02b0b2017-09-21 12:28:43 -0400899 /** Sets SkImageFilter to imageFilter, decreasing SkRefCnt of the previous
900 SkImageFilter. Pass nullptr to clear SkImageFilter, and remove SkImageFilter effect
Cary Clark50fa3ff2017-07-26 10:15:23 -0400901 on drawing.
Cary Clark8a02b0b2017-09-21 12:28:43 -0400902
Cary Clark75959392018-02-27 10:22:04 -0500903 Increments imageFilter SkRefCnt by one.
904
Cary Clark50fa3ff2017-07-26 10:15:23 -0400905 @param imageFilter how SkImage is sampled when transformed
906 */
Cary Clark0418a882017-05-10 09:07:42 -0400907 void setImageFilter(sk_sp<SkImageFilter> imageFilter);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000908
Cary Clark50fa3ff2017-07-26 10:15:23 -0400909 /** Returns SkDrawLooper if set, or nullptr.
910 Does not alter SkDrawLooper SkRefCnt.
911
912 @return SkDrawLooper if previously set, nullptr otherwise
913 */
reed46f2d0a2016-09-11 05:40:31 -0700914 SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400915
916 /** Returns SkDrawLooper if set, or nullptr.
917 Increases SkDrawLooper SkRefCnt by one.
918
919 @return SkDrawLooper if previously set, nullptr otherwise
920 */
Mike Reed693fdbd2017-01-12 10:13:40 -0500921 sk_sp<SkDrawLooper> refDrawLooper() const;
922
Cary Clark23890a92017-07-27 16:30:51 -0400923 /** Deprecated.
Cary Clark75959392018-02-27 10:22:04 -0500924 (see skbug.com/6259)
Cary Clark50fa3ff2017-07-26 10:15:23 -0400925 */
reed46f2d0a2016-09-11 05:40:31 -0700926 SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
Cary Clark50fa3ff2017-07-26 10:15:23 -0400927
Cary Clark8a02b0b2017-09-21 12:28:43 -0400928 /** Sets SkDrawLooper to drawLooper, decreasing SkRefCnt of the previous
929 drawLooper. Pass nullptr to clear SkDrawLooper and leave SkDrawLooper effect on
930 drawing unaltered.
931
932 Increments drawLooper SkRefCnt by one.
Cary Clark50fa3ff2017-07-26 10:15:23 -0400933
Cary Clarkb7da7232017-09-01 13:49:54 -0400934 @param drawLooper iterates through drawing one or more time, altering SkPaint
Cary Clark50fa3ff2017-07-26 10:15:23 -0400935 */
Cary Clark0418a882017-05-10 09:07:42 -0400936 void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
Mike Reed09d94352016-10-31 15:11:04 -0400937
Cary Clark23890a92017-07-27 16:30:51 -0400938 /** Deprecated.
Cary Clark75959392018-02-27 10:22:04 -0500939 (see skbug.com/6259)
Cary Clark50fa3ff2017-07-26 10:15:23 -0400940 */
Cary Clark0418a882017-05-10 09:07:42 -0400941 void setLooper(sk_sp<SkDrawLooper> drawLooper);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000942
Cary Clark50fa3ff2017-07-26 10:15:23 -0400943 /** \enum SkPaint::Align
944 Align adjusts the text relative to the text position.
945 Align affects glyphs drawn with: SkCanvas::drawText, SkCanvas::drawPosText,
946 SkCanvas::drawPosTextH, SkCanvas::drawTextOnPath,
947 SkCanvas::drawTextOnPathHV, SkCanvas::drawTextRSXform, SkCanvas::drawTextBlob,
948 and SkCanvas::drawString;
Cary Clark579985c2017-07-31 11:48:27 -0400949 as well as calls that place text glyphs like getTextWidths() and getTextPath().
Cary Clark50fa3ff2017-07-26 10:15:23 -0400950
951 The text position is set by the font for both horizontal and vertical text.
952 Typically, for horizontal text, the position is to the left side of the glyph on the
Cary Clark23890a92017-07-27 16:30:51 -0400953 base line; and for vertical text, the position is the horizontal center of the glyph
Cary Clark50fa3ff2017-07-26 10:15:23 -0400954 at the caps height.
955
956 Align adjusts the glyph position to center it or move it to abut the position
957 using the metrics returned by the font.
958
959 Align defaults to kLeft_Align.
960 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000961 enum Align {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400962 /** Leaves the glyph at the position computed by the font offset by the text position. */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000963 kLeft_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400964
965 /** Moves the glyph half its width if Flags has kVerticalText_Flag clear, and
966 half its height if Flags has kVerticalText_Flag set.
967 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000968 kCenter_Align,
Cary Clark50fa3ff2017-07-26 10:15:23 -0400969
970 /** Moves the glyph by its width if Flags has kVerticalText_Flag clear,
971 and by its height if Flags has kVerticalText_Flag set.
972 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000973 kRight_Align,
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +0000974 };
Cary Clark50fa3ff2017-07-26 10:15:23 -0400975
mike@reedtribe.orgddc813b2013-06-08 12:58:19 +0000976 enum {
Cary Clark50fa3ff2017-07-26 10:15:23 -0400977 kAlignCount = 3, //!< The number of different Align values defined.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000978 };
reed@google.com9d07fec2011-03-16 20:02:59 +0000979
Cary Clark50fa3ff2017-07-26 10:15:23 -0400980 /** Returns SkPaint::Align.
981 Returns kLeft_Align if SkPaint::Align has not been set.
982
983 @return text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +0000984 */
reedf59eab22014-07-14 14:39:15 -0700985 Align getTextAlign() const { return (Align)fBitfields.fTextAlign; }
reed@google.com9d07fec2011-03-16 20:02:59 +0000986
Cary Clark50fa3ff2017-07-26 10:15:23 -0400987 /** Sets SkPaint::Align to align.
988 Has no effect if align is an invalid value.
989
990 @param align text placement relative to position
reed@android.com8a1c16f2008-12-17 15:59:43 +0000991 */
992 void setTextAlign(Align align);
993
Cary Clark50fa3ff2017-07-26 10:15:23 -0400994 /** Returns text size in points.
995
996 @return typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000997 */
998 SkScalar getTextSize() const { return fTextSize; }
999
Cary Clark50fa3ff2017-07-26 10:15:23 -04001000 /** Sets text size in points.
1001 Has no effect if textSize is not greater than or equal to zero.
1002
1003 @param textSize typographic height of text
reed@android.com8a1c16f2008-12-17 15:59:43 +00001004 */
1005 void setTextSize(SkScalar textSize);
1006
Cary Clark50fa3ff2017-07-26 10:15:23 -04001007 /** Returns text scale x.
1008 Default value is 1.
1009
1010 @return text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001011 */
1012 SkScalar getTextScaleX() const { return fTextScaleX; }
1013
Cary Clark50fa3ff2017-07-26 10:15:23 -04001014 /** Sets text scale x.
1015 Default value is 1.
1016
1017 @param scaleX text horizontal scale
reed@android.com8a1c16f2008-12-17 15:59:43 +00001018 */
1019 void setTextScaleX(SkScalar scaleX);
1020
Cary Clark50fa3ff2017-07-26 10:15:23 -04001021 /** Returns text skew x.
1022 Default value is zero.
1023
1024 @return additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001025 */
1026 SkScalar getTextSkewX() const { return fTextSkewX; }
1027
Cary Clark50fa3ff2017-07-26 10:15:23 -04001028 /** Sets text skew x.
1029 Default value is zero.
1030
1031 @param skewX additional shear in x-axis relative to y-axis
reed@android.com8a1c16f2008-12-17 15:59:43 +00001032 */
1033 void setTextSkewX(SkScalar skewX);
1034
Cary Clark50fa3ff2017-07-26 10:15:23 -04001035 /** \enum SkPaint::TextEncoding
Cary Clark8a02b0b2017-09-21 12:28:43 -04001036 TextEncoding determines whether text specifies character codes and their encoded
Cary Clarkcc309eb2017-10-30 11:48:35 -04001037 size, or glyph indices. Characters are encoded as specified by the Unicode standard.
Cary Clark8a02b0b2017-09-21 12:28:43 -04001038
Cary Clark50fa3ff2017-07-26 10:15:23 -04001039 Character codes encoded size are specified by UTF-8, UTF-16, or UTF-32.
Cary Clarkcc309eb2017-10-30 11:48:35 -04001040 All character code formats are able to represent all of Unicode, differing only
1041 in the total storage required.
1042
1043 UTF-8 (RFC 3629) encodes each character as one or more 8-bit bytes.
1044
1045 UTF-16 (RFC 2781) encodes each character as one or two 16-bit words.
1046
1047 UTF-32 encodes each character as one 32-bit word.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001048
1049 font manager uses font data to convert character code points into glyph indices.
1050 A glyph index is a 16-bit word.
1051
1052 TextEncoding is set to kUTF8_TextEncoding by default.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001053 */
1054 enum TextEncoding {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001055 kUTF8_TextEncoding, //!< Uses bytes to represent UTF-8 or ASCII.
1056 kUTF16_TextEncoding, //!< Uses two byte words to represent most of Unicode.
1057 kUTF32_TextEncoding, //!< Uses four byte words to represent all of Unicode.
1058 kGlyphID_TextEncoding, //!< Uses two byte words to represent glyph indices.
reed@android.com8a1c16f2008-12-17 15:59:43 +00001059 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001060
Cary Clark50fa3ff2017-07-26 10:15:23 -04001061 /** Returns SkPaint::TextEncoding.
1062 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1063
1064 @return one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
1065 kGlyphID_TextEncoding
1066 */
reedf59eab22014-07-14 14:39:15 -07001067 TextEncoding getTextEncoding() const {
1068 return (TextEncoding)fBitfields.fTextEncoding;
1069 }
reed@android.com8a1c16f2008-12-17 15:59:43 +00001070
Cary Clark50fa3ff2017-07-26 10:15:23 -04001071 /** Sets SkPaint::TextEncoding to encoding.
1072 SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
1073 Invalid values for encoding are ignored.
1074
1075 @param encoding one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
Cary Clark579985c2017-07-31 11:48:27 -04001076 kGlyphID_TextEncoding
Cary Clark50fa3ff2017-07-26 10:15:23 -04001077 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001078 void setTextEncoding(TextEncoding encoding);
1079
Cary Clark50fa3ff2017-07-26 10:15:23 -04001080 /** \struct SkPaint::FontMetrics
Cary Clark579985c2017-07-31 11:48:27 -04001081 FontMetrics is filled out by getFontMetrics(). FontMetrics contents reflect the values
Cary Clark50fa3ff2017-07-26 10:15:23 -04001082 computed by font manager using SkTypeface. Values are set to zero if they are
Cary Clarkb7da7232017-09-01 13:49:54 -04001083 not available.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001084
Ben Wagnere5806492017-11-09 12:08:31 -05001085 All vertical values relative to the baseline are given y-down. As such, zero is on the
1086 baseline, negative values are above the baseline, and positive values are below the
1087 baseline.
1088
Cary Clark50fa3ff2017-07-26 10:15:23 -04001089 fUnderlineThickness and fUnderlinePosition have a bit set in fFlags if their values
1090 are valid, since their value may be zero.
1091
1092 fStrikeoutThickness and fStrikeoutPosition have a bit set in fFlags if their values
1093 are valid, since their value may be zero.
1094 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001095 struct FontMetrics {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001096
Cary Clarkcc309eb2017-10-30 11:48:35 -04001097 /** \enum SkPaint::FontMetrics::FontMetricsFlags
1098 FontMetricsFlags are set in fFlags when underline and strikeout metrics are valid;
1099 the underline or strikeout metric may be valid and zero.
1100 Fonts with embedded bitmaps may not have valid underline or strikeout metrics.
1101 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001102 enum FontMetricsFlags {
Cary Clark50fa3ff2017-07-26 10:15:23 -04001103 kUnderlineThicknessIsValid_Flag = 1 << 0, //!< Set if fUnderlineThickness is valid.
1104 kUnderlinePositionIsValid_Flag = 1 << 1, //!< Set if fUnderlinePosition is valid.
1105 kStrikeoutThicknessIsValid_Flag = 1 << 2, //!< Set if fStrikeoutThickness is valid.
1106 kStrikeoutPositionIsValid_Flag = 1 << 3, //!< Set if fStrikeoutPosition is valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001107 };
1108
Cary Clark50fa3ff2017-07-26 10:15:23 -04001109 uint32_t fFlags; //!< fFlags is set when underline metrics are valid.
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001110
Ben Wagnere5806492017-11-09 12:08:31 -05001111 /** Greatest extent above the baseline for any glyph.
1112 Typically less than zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001113 */
1114 SkScalar fTop;
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001115
Cary Clark50fa3ff2017-07-26 10:15:23 -04001116 /** Recommended distance above the baseline to reserve for a line of text.
Ben Wagnere5806492017-11-09 12:08:31 -05001117 Typically less than zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001118 */
1119 SkScalar fAscent;
Ben Wagner219f3622017-07-17 15:32:25 -04001120
Cary Clark50fa3ff2017-07-26 10:15:23 -04001121 /** Recommended distance below the baseline to reserve for a line of text.
Ben Wagnere5806492017-11-09 12:08:31 -05001122 Typically greater than zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001123 */
1124 SkScalar fDescent;
Ben Wagner219f3622017-07-17 15:32:25 -04001125
Cary Clark50fa3ff2017-07-26 10:15:23 -04001126 /** Greatest extent below the baseline for any glyph.
Ben Wagnere5806492017-11-09 12:08:31 -05001127 Typically greater than zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001128 */
1129 SkScalar fBottom;
1130
1131 /** Recommended distance to add between lines of text.
Ben Wagnere5806492017-11-09 12:08:31 -05001132 Typically greater than or equal to zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001133 */
1134 SkScalar fLeading;
1135
1136 /** Average character width, if it is available.
1137 Zero if no average width is stored in the font.
1138 */
1139 SkScalar fAvgCharWidth;
Cary Clarkcc309eb2017-10-30 11:48:35 -04001140
Cary Clark50fa3ff2017-07-26 10:15:23 -04001141 SkScalar fMaxCharWidth; //!< Maximum character width.
1142
1143 /** Minimum bounding box x value for all glyphs.
1144 Typically less than zero.
1145 */
1146 SkScalar fXMin;
1147
1148 /** Maximum bounding box x value for all glyphs.
1149 Typically greater than zero.
1150 */
1151 SkScalar fXMax;
1152
1153 /** Height of a lower-case 'x'.
1154 May be zero if no lower-case height is stored in the font.
1155 */
1156 SkScalar fXHeight;
1157
1158 /** Height of an upper-case letter.
1159 May be zero if no upper-case height is stored in the font.
1160 */
1161 SkScalar fCapHeight;
1162
Ben Wagnere5806492017-11-09 12:08:31 -05001163 /** Underline thickness.
1164
1165 If the metric is valid, the kUnderlineThicknessIsValid_Flag is set in fFlags.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001166 If kUnderlineThicknessIsValid_Flag is clear, fUnderlineThickness is zero.
1167 */
1168 SkScalar fUnderlineThickness;
1169
Ben Wagnere5806492017-11-09 12:08:31 -05001170 /** Position of the top of the underline stroke relative to the baseline.
1171 Typically positive when valid.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001172
1173 If the metric is valid, the kUnderlinePositionIsValid_Flag is set in fFlags.
1174 If kUnderlinePositionIsValid_Flag is clear, fUnderlinePosition is zero.
1175 */
1176 SkScalar fUnderlinePosition;
1177
Ben Wagnere5806492017-11-09 12:08:31 -05001178 /** Strikeout thickness.
1179
1180 If the metric is valid, the kStrikeoutThicknessIsValid_Flag is set in fFlags.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001181 If kStrikeoutThicknessIsValid_Flag is clear, fStrikeoutThickness is zero.
1182 */
1183 SkScalar fStrikeoutThickness;
1184
Ben Wagnere5806492017-11-09 12:08:31 -05001185 /** Position of the bottom of the strikeout stroke relative to the baseline.
1186 Typically negative when valid.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001187
1188 If the metric is valid, the kStrikeoutPositionIsValid_Flag is set in fFlags.
1189 If kStrikeoutPositionIsValid_Flag is clear, fStrikeoutPosition is zero.
1190 */
1191 SkScalar fStrikeoutPosition;
1192
1193 /** If SkPaint::FontMetrics has a valid underline thickness, return true, and set
Cary Clarkb7da7232017-09-01 13:49:54 -04001194 thickness to that value. If the underline thickness is not valid,
1195 return false, and ignore thickness.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001196
1197 @param thickness storage for underline width
1198 @return true if font specifies underline width
1199 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001200 bool hasUnderlineThickness(SkScalar* thickness) const {
Ben Wagner3318da52017-03-23 14:01:22 -04001201 if (SkToBool(fFlags & kUnderlineThicknessIsValid_Flag)) {
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001202 *thickness = fUnderlineThickness;
1203 return true;
1204 }
1205 return false;
1206 }
1207
Cary Clark50fa3ff2017-07-26 10:15:23 -04001208 /** If SkPaint::FontMetrics has a valid underline position, return true, and set
Cary Clarkb7da7232017-09-01 13:49:54 -04001209 position to that value. If the underline position is not valid,
1210 return false, and ignore position.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001211
1212 @param position storage for underline position
1213 @return true if font specifies underline position
1214 */
commit-bot@chromium.org0bc406d2014-03-01 20:12:26 +00001215 bool hasUnderlinePosition(SkScalar* position) const {
1216 if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) {
1217 *position = fUnderlinePosition;
1218 return true;
1219 }
1220 return false;
1221 }
1222
Cary Clark50fa3ff2017-07-26 10:15:23 -04001223 /** If SkPaint::FontMetrics has a valid strikeout thickness, return true, and set
Cary Clarkb7da7232017-09-01 13:49:54 -04001224 thickness to that value. If the underline thickness is not valid,
1225 return false, and ignore thickness.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001226
1227 @param thickness storage for strikeout width
1228 @return true if font specifies strikeout width
1229 */
Ben Wagner219f3622017-07-17 15:32:25 -04001230 bool hasStrikeoutThickness(SkScalar* thickness) const {
1231 if (SkToBool(fFlags & kStrikeoutThicknessIsValid_Flag)) {
1232 *thickness = fStrikeoutThickness;
1233 return true;
1234 }
1235 return false;
1236 }
1237
Cary Clark50fa3ff2017-07-26 10:15:23 -04001238 /** If SkPaint::FontMetrics has a valid strikeout position, return true, and set
Cary Clarkb7da7232017-09-01 13:49:54 -04001239 position to that value. If the underline position is not valid,
1240 return false, and ignore position.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001241
1242 @param position storage for strikeout position
1243 @return true if font specifies strikeout position
1244 */
Ben Wagner219f3622017-07-17 15:32:25 -04001245 bool hasStrikeoutPosition(SkScalar* position) const {
1246 if (SkToBool(fFlags & kStrikeoutPositionIsValid_Flag)) {
1247 *position = fStrikeoutPosition;
1248 return true;
1249 }
1250 return false;
1251 }
Cary Clark50fa3ff2017-07-26 10:15:23 -04001252
reed@android.com8a1c16f2008-12-17 15:59:43 +00001253 };
reed@google.com9d07fec2011-03-16 20:02:59 +00001254
Cary Clark50fa3ff2017-07-26 10:15:23 -04001255 /** Returns SkPaint::FontMetrics associated with SkTypeface.
1256 The return value is the recommended spacing between lines: the sum of metrics
1257 descent, ascent, and leading.
1258 If metrics is not nullptr, SkPaint::FontMetrics is copied to metrics.
1259 Results are scaled by text size but does not take into account
1260 dimensions required by text scale x, text skew x, fake bold,
1261 style stroke, and SkPathEffect.
1262 Results can be additionally scaled by scale; a scale of zero
1263 is ignored.
1264
1265 @param metrics storage for SkPaint::FontMetrics from SkTypeface; may be nullptr
1266 @param scale additional multiplier for returned values
1267 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001268 */
1269 SkScalar getFontMetrics(FontMetrics* metrics, SkScalar scale = 0) const;
reed@google.com9d07fec2011-03-16 20:02:59 +00001270
Cary Clark50fa3ff2017-07-26 10:15:23 -04001271 /** Returns the recommended spacing between lines: the sum of metrics
1272 descent, ascent, and leading.
1273 Result is scaled by text size but does not take into account
1274 dimensions required by stroking and SkPathEffect.
Cary Clark579985c2017-07-31 11:48:27 -04001275 Returns the same result as getFontMetrics().
Cary Clark50fa3ff2017-07-26 10:15:23 -04001276
1277 @return recommended spacing between lines
reed@android.com8a1c16f2008-12-17 15:59:43 +00001278 */
Ben Wagnera93a14a2017-08-28 10:34:05 -04001279 SkScalar getFontSpacing() const { return this->getFontMetrics(nullptr, 0); }
reed@android.com8a1c16f2008-12-17 15:59:43 +00001280
Cary Clark50fa3ff2017-07-26 10:15:23 -04001281 /** Converts text into glyph indices.
1282 Returns the number of glyph indices represented by text.
1283 SkPaint::TextEncoding specifies how text represents characters or glyphs.
1284 glyphs may be nullptr, to compute the glyph count.
1285
Cary Clarkcc309eb2017-10-30 11:48:35 -04001286 Does not check text for valid character codes or valid glyph indices.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001287
Cary Clark579985c2017-07-31 11:48:27 -04001288 If byteLength equals zero, returns zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001289 If byteLength includes a partial character, the partial character is ignored.
1290
1291 If SkPaint::TextEncoding is kUTF8_TextEncoding and
1292 text contains an invalid UTF-8 sequence, zero is returned.
1293
Cary Clarkb7da7232017-09-01 13:49:54 -04001294 @param text character storage encoded with SkPaint::TextEncoding
Cary Clark50fa3ff2017-07-26 10:15:23 -04001295 @param byteLength length of character storage in bytes
1296 @param glyphs storage for glyph indices; may be nullptr
1297 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001298 */
1299 int textToGlyphs(const void* text, size_t byteLength,
halcanaryd0e95a52016-07-25 07:18:12 -07001300 SkGlyphID glyphs[]) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001301
Cary Clark50fa3ff2017-07-26 10:15:23 -04001302 /** Returns true if all text corresponds to a non-zero glyph index.
1303 Returns false if any characters in text are not supported in
1304 SkTypeface.
reed@android.coma5dcaf62010-02-05 17:12:32 +00001305
Cary Clark579985c2017-07-31 11:48:27 -04001306 If SkPaint::TextEncoding is kGlyphID_TextEncoding,
1307 returns true if all glyph indices in text are non-zero;
Cary Clark50fa3ff2017-07-26 10:15:23 -04001308 does not check to see if text contains valid glyph indices for SkTypeface.
1309
Cary Clarkb7da7232017-09-01 13:49:54 -04001310 Returns true if byteLength is zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001311
1312 @param text array of characters or glyphs
1313 @param byteLength number of bytes in text array
1314 @return true if all text corresponds to a non-zero glyph index
1315 */
reed@android.coma5dcaf62010-02-05 17:12:32 +00001316 bool containsText(const void* text, size_t byteLength) const;
1317
Cary Clark50fa3ff2017-07-26 10:15:23 -04001318 /** Converts glyphs into text if possible.
1319 Glyph values without direct Unicode equivalents are mapped to zero.
1320 Uses the SkTypeface, but is unaffected
1321 by SkPaint::TextEncoding; the text values returned are equivalent to kUTF32_TextEncoding.
1322
1323 Only supported on platforms that use FreeType as the font engine.
1324
1325 @param glyphs array of indices into font
1326 @param count length of glyph array
1327 @param text storage for character codes, one per glyph
reed@android.com9d3a9852010-01-08 14:07:42 +00001328 */
halcanaryd0e95a52016-07-25 07:18:12 -07001329 void glyphsToUnichars(const SkGlyphID glyphs[], int count, SkUnichar text[]) const;
reed@android.com9d3a9852010-01-08 14:07:42 +00001330
Cary Clark50fa3ff2017-07-26 10:15:23 -04001331 /** Returns the number of glyphs in text.
1332 Uses SkPaint::TextEncoding to count the glyphs.
Cary Clark579985c2017-07-31 11:48:27 -04001333 Returns the same result as textToGlyphs().
Cary Clark50fa3ff2017-07-26 10:15:23 -04001334
Cary Clarkb7da7232017-09-01 13:49:54 -04001335 @param text character storage encoded with SkPaint::TextEncoding
Cary Clark50fa3ff2017-07-26 10:15:23 -04001336 @param byteLength length of character storage in bytes
1337 @return number of glyphs represented by text of length byteLength
reed@android.com8a1c16f2008-12-17 15:59:43 +00001338 */
reed@google.com9d07fec2011-03-16 20:02:59 +00001339 int countText(const void* text, size_t byteLength) const {
Ben Wagnera93a14a2017-08-28 10:34:05 -04001340 return this->textToGlyphs(text, byteLength, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +00001341 }
1342
Cary Clark50fa3ff2017-07-26 10:15:23 -04001343 /** Returns the advance width of text if kVerticalText_Flag is clear,
1344 and the height of text if kVerticalText_Flag is set.
1345 The advance is the normal distance to move before drawing additional text.
1346 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1347 and text size, text scale x, text skew x, stroke width, and
1348 SkPathEffect to scale the metrics and bounds.
1349 Returns the bounding box of text if bounds is not nullptr.
1350 The bounding box is computed as if the text was drawn at the origin.
1351
1352 @param text character codes or glyph indices to be measured
1353 @param length number of bytes of text to measure
1354 @param bounds returns bounding box relative to (0, 0) if not nullptr
1355 @return advance width or height
1356 */
reed99ae8812014-08-26 11:30:01 -07001357 SkScalar measureText(const void* text, size_t length, SkRect* bounds) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001358
Cary Clark50fa3ff2017-07-26 10:15:23 -04001359 /** Returns the advance width of text if kVerticalText_Flag is clear,
1360 and the height of text if kVerticalText_Flag is set.
1361 The advance is the normal distance to move before drawing additional text.
1362 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
Cary Clark23890a92017-07-27 16:30:51 -04001363 and text size to scale the metrics.
1364 Does not scale the advance or bounds by fake bold or SkPathEffect.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001365
1366 @param text character codes or glyph indices to be measured
1367 @param length number of bytes of text to measure
Cary Clark50fa3ff2017-07-26 10:15:23 -04001368 @return advance width or height
1369 */
reed@google.com9d07fec2011-03-16 20:02:59 +00001370 SkScalar measureText(const void* text, size_t length) const {
Ben Wagnera93a14a2017-08-28 10:34:05 -04001371 return this->measureText(text, length, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +00001372 }
reed@google.com9d07fec2011-03-16 20:02:59 +00001373
Cary Clark50fa3ff2017-07-26 10:15:23 -04001374 /** Returns the bytes of text that fit within maxWidth.
1375 If kVerticalText_Flag is clear, the text fragment fits if its advance width is less than or
1376 equal to maxWidth.
1377 If kVerticalText_Flag is set, the text fragment fits if its advance height is less than or
1378 equal to maxWidth.
1379 Measures only while the advance is less than or equal to maxWidth.
1380 Returns the advance or the text fragment in measuredWidth if it not nullptr.
1381 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1382 and text size to scale the metrics.
1383 Does not scale the advance or bounds by fake bold or SkPathEffect.
1384
1385 @param text character codes or glyph indices to be measured
1386 @param length number of bytes of text to measure
1387 @param maxWidth advance limit; text is measured while advance is less than maxWidth
1388 @param measuredWidth returns the width of the text less than or equal to maxWidth
1389 @return bytes of text that fit, always less than or equal to length
1390 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001391 size_t breakText(const void* text, size_t length, SkScalar maxWidth,
Ben Wagnera93a14a2017-08-28 10:34:05 -04001392 SkScalar* measuredWidth = nullptr) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001393
Cary Clark50fa3ff2017-07-26 10:15:23 -04001394 /** Retrieves the advance and bounds for each glyph in text, and returns
1395 the glyph count in text.
1396 Both widths and bounds may be nullptr.
1397 If widths is not nullptr, widths must be an array of glyph count entries.
1398 if bounds is not nullptr, bounds must be an array of glyph count entries.
1399 If kVerticalText_Flag is clear, widths returns the horizontal advance.
1400 If kVerticalText_Flag is set, widths returns the vertical advance.
1401 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
1402 and text size to scale the widths and bounds.
1403 Does not scale the advance by fake bold or SkPathEffect.
Cary Clark23890a92017-07-27 16:30:51 -04001404 Does include fake bold and SkPathEffect in the bounds.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001405
1406 @param text character codes or glyph indices to be measured
1407 @param byteLength number of bytes of text to measure
1408 @param widths returns text advances for each glyph; may be nullptr
1409 @param bounds returns bounds for each glyph relative to (0, 0); may be nullptr
1410 @return glyph count in text
1411 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001412 int getTextWidths(const void* text, size_t byteLength, SkScalar widths[],
Ben Wagnera93a14a2017-08-28 10:34:05 -04001413 SkRect bounds[] = nullptr) const;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001414
Cary Clark50fa3ff2017-07-26 10:15:23 -04001415 /** Returns the geometry as SkPath equivalent to the drawn text.
1416 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1417 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1418 All of the glyph paths are stored in path.
Cary Clark579985c2017-07-31 11:48:27 -04001419 Uses x, y, and SkPaint::Align to position path.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001420
1421 @param text character codes or glyph indices
1422 @param length number of bytes of text
1423 @param x x-coordinate of the origin of the text
1424 @param y y-coordinate of the origin of the text
1425 @param path geometry of the glyphs
1426 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00001427 void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y,
1428 SkPath* path) const;
1429
Cary Clark50fa3ff2017-07-26 10:15:23 -04001430 /** Returns the geometry as SkPath equivalent to the drawn text.
1431 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1432 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1433 All of the glyph paths are stored in path.
1434 Uses pos array and SkPaint::Align to position path.
1435 pos contains a position for each glyph.
1436
1437 @param text character codes or glyph indices
1438 @param length number of bytes of text
1439 @param pos positions of each glyph
1440 @param path geometry of the glyphs
1441 */
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001442 void getPosTextPath(const void* text, size_t length,
reed@google.comca0062e2012-07-20 11:20:32 +00001443 const SkPoint pos[], SkPath* path) const;
1444
Cary Clark50fa3ff2017-07-26 10:15:23 -04001445 /** Returns the number of intervals that intersect bounds.
1446 bounds describes a pair of lines parallel to the text advance.
1447 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1448 the string.
1449 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1450 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1451 Uses x, y, and SkPaint::Align to position intervals.
1452
1453 Pass nullptr for intervals to determine the size of the interval array.
1454
1455 intervals are cached to improve performance for multiple calls.
1456
1457 @param text character codes or glyph indices
1458 @param length number of bytes of text
1459 @param x x-coordinate of the origin of the text
1460 @param y y-coordinate of the origin of the text
1461 @param bounds lower and upper line parallel to the advance
1462 @param intervals returned intersections; may be nullptr
1463 @return number of intersections; may be zero
1464 */
caryclark0449bcf2016-02-09 13:25:45 -08001465 int getTextIntercepts(const void* text, size_t length, SkScalar x, SkScalar y,
1466 const SkScalar bounds[2], SkScalar* intervals) const;
1467
Cary Clark50fa3ff2017-07-26 10:15:23 -04001468 /** Returns the number of intervals that intersect bounds.
1469 bounds describes a pair of lines parallel to the text advance.
1470 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1471 the string.
1472 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1473 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1474 Uses pos array and SkPaint::Align to position intervals.
1475
1476 Pass nullptr for intervals to determine the size of the interval array.
1477
1478 intervals are cached to improve performance for multiple calls.
1479
1480 @param text character codes or glyph indices
1481 @param length number of bytes of text
1482 @param pos positions of each glyph
1483 @param bounds lower and upper line parallel to the advance
1484 @param intervals returned intersections; may be nullptr
Cary Clarkb7da7232017-09-01 13:49:54 -04001485 @return number of intersections; may be zero
Cary Clark50fa3ff2017-07-26 10:15:23 -04001486 */
caryclark0449bcf2016-02-09 13:25:45 -08001487 int getPosTextIntercepts(const void* text, size_t length, const SkPoint pos[],
1488 const SkScalar bounds[2], SkScalar* intervals) const;
1489
Cary Clark50fa3ff2017-07-26 10:15:23 -04001490 /** Returns the number of intervals that intersect bounds.
1491 bounds describes a pair of lines parallel to the text advance.
1492 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1493 the string.
1494 Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
1495 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1496 Uses xpos array, constY, and SkPaint::Align to position intervals.
1497
1498 Pass nullptr for intervals to determine the size of the interval array.
1499
1500 intervals are cached to improve performance for multiple calls.
1501
1502 @param text character codes or glyph indices
1503 @param length number of bytes of text
1504 @param xpos positions of each glyph in x
1505 @param constY position of each glyph in y
1506 @param bounds lower and upper line parallel to the advance
1507 @param intervals returned intersections; may be nullptr
1508 @return number of intersections; may be zero
1509 */
fmalitaeae6a912016-07-28 09:47:24 -07001510 int getPosTextHIntercepts(const void* text, size_t length, const SkScalar xpos[],
1511 SkScalar constY, const SkScalar bounds[2], SkScalar* intervals) const;
1512
Cary Clark50fa3ff2017-07-26 10:15:23 -04001513 /** Returns the number of intervals that intersect bounds.
1514 bounds describes a pair of lines parallel to the text advance.
1515 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
1516 the string.
Cary Clark2823f9f2018-01-03 10:00:34 -05001517 Uses SkTypeface to get the glyph paths,
Cary Clark50fa3ff2017-07-26 10:15:23 -04001518 and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
Cary Clarkb7da7232017-09-01 13:49:54 -04001519 Uses run array and SkPaint::Align to position intervals.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001520
Cary Clark2823f9f2018-01-03 10:00:34 -05001521 SkPaint::TextEncoding must be set to SkPaint::kGlyphID_TextEncoding.
1522
Cary Clark50fa3ff2017-07-26 10:15:23 -04001523 Pass nullptr for intervals to determine the size of the interval array.
1524
1525 intervals are cached to improve performance for multiple calls.
1526
Cary Clark8a02b0b2017-09-21 12:28:43 -04001527 @param blob glyphs, positions, and text paint attributes
Cary Clark50fa3ff2017-07-26 10:15:23 -04001528 @param bounds lower and upper line parallel to the advance
1529 @param intervals returned intersections; may be nullptr
1530 @return number of intersections; may be zero
1531 */
fmalitaeae6a912016-07-28 09:47:24 -07001532 int getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds[2],
1533 SkScalar* intervals) const;
1534
Cary Clark50fa3ff2017-07-26 10:15:23 -04001535 /** Returns the union of bounds of all glyphs.
1536 Returned dimensions are computed by font manager from font data,
Cary Clark579985c2017-07-31 11:48:27 -04001537 ignoring SkPaint::Hinting. Includes text size, text scale x,
Cary Clark50fa3ff2017-07-26 10:15:23 -04001538 and text skew x, but not fake bold or SkPathEffect.
1539
1540 If text size is large, text scale x is one, and text skew x is zero,
Cary Clark579985c2017-07-31 11:48:27 -04001541 returns the same bounds as SkPaint::FontMetrics { FontMetrics::fXMin,
Cary Clark50fa3ff2017-07-26 10:15:23 -04001542 FontMetrics::fTop, FontMetrics::fXMax, FontMetrics::fBottom }.
1543
1544 @return union of bounds of all glyphs
1545 */
reed8893e5f2014-12-15 13:27:26 -08001546 SkRect getFontBounds() const;
1547
Cary Clark579985c2017-07-31 11:48:27 -04001548 /** Returns true if SkPaint prevents all drawing;
1549 otherwise, the SkPaint may or may not allow drawing.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001550
Cary Clarkb7da7232017-09-01 13:49:54 -04001551 Returns true if, for example, SkBlendMode combined with color alpha computes a
1552 new alpha of zero.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001553
1554 @return true if SkPaint prevents all drawing
1555 */
reed@google.com632e1a22011-10-06 12:37:00 +00001556 bool nothingToDraw() const;
1557
Cary Clark2823f9f2018-01-03 10:00:34 -05001558 /** (to be made private)
Cary Clark50fa3ff2017-07-26 10:15:23 -04001559 Returns true if SkPaint does not include elements requiring extensive computation
1560 to compute SkBaseDevice bounds of drawn geometry. For instance, SkPaint with SkPathEffect
1561 always returns false.
reed@google.comd5f20792012-05-16 14:15:02 +00001562
Cary Clark50fa3ff2017-07-26 10:15:23 -04001563 @return true if SkPaint allows for fast computation of bounds
1564 */
senorblanco0abdf762015-08-20 11:10:41 -07001565 bool canComputeFastBounds() const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001566
Cary Clark2823f9f2018-01-03 10:00:34 -05001567 /** (to be made private)
Cary Clark579985c2017-07-31 11:48:27 -04001568 Only call this if canComputeFastBounds() returned true. This takes a
Cary Clark50fa3ff2017-07-26 10:15:23 -04001569 raw rectangle (the raw bounds of a shape), and adjusts it for stylistic
1570 effects in the paint (e.g. stroking). If needed, it uses the storage
Cary Clarkb7da7232017-09-01 13:49:54 -04001571 parameter. It returns the adjusted bounds that can then be used
Cary Clark50fa3ff2017-07-26 10:15:23 -04001572 for SkCanvas::quickReject tests.
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001573
Cary Clarkb7da7232017-09-01 13:49:54 -04001574 The returned SkRect will either be orig or storage, thus the caller
Cary Clark50fa3ff2017-07-26 10:15:23 -04001575 should not rely on storage being set to the result, but should always
Cary Clarkb7da7232017-09-01 13:49:54 -04001576 use the returned value. It is legal for orig and storage to be the same
1577 SkRect.
Cary Clark2823f9f2018-01-03 10:00:34 -05001578 e.g.
1579 if (paint.canComputeFastBounds()) {
1580 SkRect r, storage;
1581 path.computeBounds(&r, SkPath::kFast_BoundsType);
1582 const SkRect& fastR = paint.computeFastBounds(r, &storage);
1583 if (canvas->quickReject(fastR, ...)) {
1584 // don't draw the path
1585 }
1586 }
Cary Clark50fa3ff2017-07-26 10:15:23 -04001587
1588 @param orig geometry modified by SkPaint when drawn
1589 @param storage computed bounds of geometry; may not be nullptr
1590 @return fast computed bounds
1591 */
reed@google.coma584aed2012-05-16 14:06:02 +00001592 const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const {
Brian Osman60751d72017-05-12 11:21:36 -04001593 // Things like stroking, etc... will do math on the bounds rect, assuming that it's sorted.
1594 SkASSERT(orig.isSorted());
reed@google.coma584aed2012-05-16 14:06:02 +00001595 SkPaint::Style style = this->getStyle();
1596 // ultra fast-case: filling with no effects that affect geometry
1597 if (kFill_Style == style) {
1598 uintptr_t effects = reinterpret_cast<uintptr_t>(this->getLooper());
1599 effects |= reinterpret_cast<uintptr_t>(this->getMaskFilter());
1600 effects |= reinterpret_cast<uintptr_t>(this->getPathEffect());
senorblanco@chromium.org336d1d72014-01-27 21:03:17 +00001601 effects |= reinterpret_cast<uintptr_t>(this->getImageFilter());
reed@google.coma584aed2012-05-16 14:06:02 +00001602 if (!effects) {
1603 return orig;
1604 }
1605 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001606
reed@google.coma584aed2012-05-16 14:06:02 +00001607 return this->doComputeFastBounds(orig, storage, style);
1608 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001609
Cary Clark2823f9f2018-01-03 10:00:34 -05001610 /** (to be made private)
Cary Clark50fa3ff2017-07-26 10:15:23 -04001611
1612 @param orig geometry modified by SkPaint when drawn
1613 @param storage computed bounds of geometry
1614 @return fast computed bounds
1615 */
reed@google.coma584aed2012-05-16 14:06:02 +00001616 const SkRect& computeFastStrokeBounds(const SkRect& orig,
1617 SkRect* storage) const {
reed@google.com73a02582012-05-16 19:21:12 +00001618 return this->doComputeFastBounds(orig, storage, kStroke_Style);
reed@google.coma584aed2012-05-16 14:06:02 +00001619 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001620
Cary Clark2823f9f2018-01-03 10:00:34 -05001621 /** (to be made private)
Cary Clarkb7da7232017-09-01 13:49:54 -04001622 Computes the bounds, overriding the SkPaint SkPaint::Style. This can be used to
1623 account for additional width required by stroking orig, without
1624 altering SkPaint::Style set to fill.
Cary Clark50fa3ff2017-07-26 10:15:23 -04001625
1626 @param orig geometry modified by SkPaint when drawn
1627 @param storage computed bounds of geometry
1628 @param style overrides SkPaint::Style
1629 @return fast computed bounds
1630 */
reed@google.coma584aed2012-05-16 14:06:02 +00001631 const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
Cary Clark0418a882017-05-10 09:07:42 -04001632 Style style) const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +00001633
Cary Clark23890a92017-07-27 16:30:51 -04001634 /** macro expands to: void toString(SkString* str) const;
Cary Clarkb7da7232017-09-01 13:49:54 -04001635 Creates string representation of SkPaint. The representation is read by
1636 internal debugging tools. The interface and implementation may be
1637 suppressed by defining SK_IGNORE_TO_STRING.
Cary Clark0418a882017-05-10 09:07:42 -04001638
Cary Clarkb7da7232017-09-01 13:49:54 -04001639 @param str storage for string representation of SkPaint
Cary Clark50fa3ff2017-07-26 10:15:23 -04001640 */
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +00001641 SK_TO_STRING_NONVIRT()
robertphillips@google.com791f12e2013-02-14 13:53:53 +00001642
reed@google.comd5f20792012-05-16 14:15:02 +00001643private:
Cary Clark0418a882017-05-10 09:07:42 -04001644 typedef const SkGlyph& (*GlyphCacheProc)(SkGlyphCache*, const char**);
1645
reeda5ab9ec2016-03-06 18:10:48 -08001646 sk_sp<SkTypeface> fTypeface;
1647 sk_sp<SkPathEffect> fPathEffect;
1648 sk_sp<SkShader> fShader;
reeda5ab9ec2016-03-06 18:10:48 -08001649 sk_sp<SkMaskFilter> fMaskFilter;
1650 sk_sp<SkColorFilter> fColorFilter;
reed46f2d0a2016-09-11 05:40:31 -07001651 sk_sp<SkDrawLooper> fDrawLooper;
reeda5ab9ec2016-03-06 18:10:48 -08001652 sk_sp<SkImageFilter> fImageFilter;
reed@google.comd5f20792012-05-16 14:15:02 +00001653
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001654 SkScalar fTextSize;
1655 SkScalar fTextScaleX;
1656 SkScalar fTextSkewX;
reed@google.comd5f20792012-05-16 14:15:02 +00001657 SkColor fColor;
1658 SkScalar fWidth;
1659 SkScalar fMiterLimit;
Mike Reed71fecc32016-11-18 17:19:54 -05001660 uint32_t fBlendMode; // just need 5-6 bits
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001661 union {
1662 struct {
1663 // all of these bitfields should add up to 32
1664 unsigned fFlags : 16;
1665 unsigned fTextAlign : 2;
1666 unsigned fCapType : 2;
1667 unsigned fJoinType : 2;
1668 unsigned fStyle : 2;
1669 unsigned fTextEncoding : 2; // 3 values
1670 unsigned fHinting : 2;
reedf803da12015-01-23 05:58:07 -08001671 unsigned fFilterQuality : 2;
commit-bot@chromium.org85faf502014-04-16 12:58:02 +00001672 //unsigned fFreeBits : 2;
reedf59eab22014-07-14 14:39:15 -07001673 } fBitfields;
1674 uint32_t fBitfieldsUInt;
commit-bot@chromium.orgaca1c012014-02-21 18:18:05 +00001675 };
commit-bot@chromium.orge8807f42014-03-24 23:03:11 +00001676
robertphillipse34f17d2016-07-19 07:59:22 -07001677 static GlyphCacheProc GetGlyphCacheProc(TextEncoding encoding,
1678 bool isDevKern,
1679 bool needFullMetrics);
reed@google.comd5f20792012-05-16 14:15:02 +00001680
1681 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length,
1682 int* count, SkRect* bounds) const;
1683
joshualitt9e36c1a2015-04-14 12:17:27 -07001684 /*
1685 * The luminance color is used to determine which Gamma Canonical color to map to. This is
1686 * really only used by backends which want to cache glyph masks, and need some way to know if
1687 * they need to generate new masks based off a given color.
1688 */
1689 SkColor computeLuminanceColor() const;
1690
reed@android.com8a1c16f2008-12-17 15:59:43 +00001691 enum {
reed@google.comed43dff2013-06-04 16:56:27 +00001692 /* This is the size we use when we ask for a glyph's path. We then
1693 * post-transform it as we draw to match the request.
1694 * This is done to try to re-use cache entries for the path.
1695 *
1696 * This value is somewhat arbitrary. In theory, it could be 1, since
1697 * we store paths as floats. However, we get the path from the font
1698 * scaler, and it may represent its paths as fixed-point (or 26.6),
1699 * so we shouldn't ask for something too big (might overflow 16.16)
1700 * or too small (underflow 26.6).
1701 *
1702 * This value could track kMaxSizeForGlyphCache, assuming the above
1703 * constraints, but since we ask for unhinted paths, the two values
1704 * need not match per-se.
1705 */
1706 kCanonicalTextSizeForPaths = 64,
reed@android.com8a1c16f2008-12-17 15:59:43 +00001707 };
reed@google.comed43dff2013-06-04 16:56:27 +00001708
Jim Van Verthc65b65d2018-01-16 16:26:35 -05001709 static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM, SkScalar maxLimit);
reed@google.comed43dff2013-06-04 16:56:27 +00001710
reed@google.comed43dff2013-06-04 16:56:27 +00001711 // Set flags/hinting/textSize up to use for drawing text as paths.
1712 // Returns scale factor to restore the original textSize, since will will
1713 // have change it to kCanonicalTextSizeForPaths.
1714 SkScalar setupForAsPaths();
1715
Jim Van Verthc65b65d2018-01-16 16:26:35 -05001716 static SkScalar MaxCacheSize2(SkScalar maxLimit);
reed@google.comed43dff2013-06-04 16:56:27 +00001717
Herb Derby980a48d2018-01-23 13:39:21 -05001718 friend class GrAtlasTextBlob;
1719 friend class GrAtlasTextContext;
1720 friend class GrGLPathRendering;
1721 friend class GrPathRendering;
Herb Derby980a48d2018-01-23 13:39:21 -05001722 friend class GrTextUtils;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001723 friend class SkAutoGlyphCache;
jvanverth2d2a68c2014-06-10 06:42:56 -07001724 friend class SkAutoGlyphCacheNoGamma;
Herb Derby980a48d2018-01-23 13:39:21 -05001725 friend class SkCanonicalizePaint;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001726 friend class SkCanvas;
1727 friend class SkDraw;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001728 friend class SkPDFDevice;
Herb Derby980a48d2018-01-23 13:39:21 -05001729 friend class SkScalerContext; // for computeLuminanceColor()
caryclark0449bcf2016-02-09 13:25:45 -08001730 friend class SkTextBaseIter;
reed@android.com8a1c16f2008-12-17 15:59:43 +00001731};
1732
reed@android.com8a1c16f2008-12-17 15:59:43 +00001733#endif