1/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkPaint_DEFINED
9#define SkPaint_DEFINED
10
11#include "SkBlendMode.h"
12#include "SkColor.h"
13#include "SkFilterQuality.h"
14#include "SkMatrix.h"
15#include "SkRefCnt.h"
16
17class SkAutoDescriptor;
18class SkAutoGlyphCache;
19class SkColorFilter;
20class SkData;
21class SkDescriptor;
22class SkDrawLooper;
23class SkReadBuffer;
24class SkWriteBuffer;
25class SkGlyph;
26struct SkRect;
27class SkGlyphCache;
28class SkImageFilter;
29class SkMaskFilter;
30class SkPath;
31class SkPathEffect;
32struct SkPoint;
33class SkShader;
34class SkSurfaceProps;
35class SkTextBlob;
36class SkTypeface;
37
38/** \class SkPaint
39    SkPaint controls options applied when drawing and measuring. SkPaint collects all
40    options outside of the SkCanvas clip and SkCanvas matrix.
41
42    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
49    pipeline and multiple pipeline stages may be affected by a single SkPaint.
50
51    SkPaint collects effects and filters that describe single-pass and multiple-pass
52    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
58    SkPath geometries with anti-aliasing, regardless of how SkPaint::kAntiAlias_Flag
59    is set in SkPaint.
60
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.
64*/
65class SK_API SkPaint {
66public:
67
68    /** Constructs SkPaint with default values.
69
70        @return  default initialized SkPaint
71    */
72    SkPaint();
73
74    /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
75        SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
76        between the original paint and the copy. Objects containing SkRefCnt increment
77        their references by one.
78
79        The referenced objects SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
80        SkDrawLooper, and SkImageFilter cannot be modified after they are created.
81        This prevents objects with SkRefCnt from being modified once SkPaint refers to them.
82
83        @param paint  original to copy
84        @return       shallow copy of paint
85    */
86    SkPaint(const SkPaint& paint);
87
88    /** Implements a move constructor to avoid increasing the reference counts
89        of objects referenced by the paint.
90
91        After the call, paint is undefined, and can be safely destructed.
92
93        @param paint  original to move
94        @return       content of paint
95    */
96    SkPaint(SkPaint&& paint);
97
98    /** Decreases SkPaint SkRefCnt of owned objects: SkTypeface, SkPathEffect, SkShader,
99        SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter. If the
100        objects containing SkRefCnt go to zero, they are deleted.
101    */
102    ~SkPaint();
103
104    /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
105        SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
106        between the original paint and the copy. Objects containing SkRefCnt in the
107        prior destination are decreased by one, and the referenced objects are deleted if the
108        resulting count is zero. Objects containing SkRefCnt in the parameter paint
109        are increased by one. paint is unmodified.
110
111        @param paint  original to copy
112        @return       content of paint
113    */
114    SkPaint& operator=(const SkPaint& paint);
115
116    /** Moves the paint to avoid increasing the reference counts
117        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.
120
121        After the call, paint is undefined, and can be safely destructed.
122
123        @param paint  original to move
124        @return       content of paint
125    */
126    SkPaint& operator=(SkPaint&& paint);
127
128    /** Compares a and b, and returns true if a and b are equivalent. May return false
129        if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
130        SkDrawLooper, or SkImageFilter have identical contents but different pointers.
131
132        @param a  SkPaint to compare
133        @param b  SkPaint to compare
134        @return   true if SkPaint pair are equivalent
135    */
136    SK_API friend bool operator==(const SkPaint& a, const SkPaint& b);
137
138    /** Compares a and b, and returns true if a and b are not equivalent. May return true
139        if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
140        SkDrawLooper, or SkImageFilter have identical contents but different pointers.
141
142        @param a  SkPaint to compare
143        @param b  SkPaint to compare
144        @return   true if SkPaint pair are not equivalent
145    */
146    friend bool operator!=(const SkPaint& a, const SkPaint& b) {
147        return !(a == b);
148    }
149
150    /** 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    */
162    uint32_t getHash() const;
163
164    /** 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    */
169    void flatten(SkWriteBuffer& buffer) const;
170
171    /** Populates SkPaint, typically from a serialized stream, created by calling
172        flatten() at an earlier time.
173
174        SkReadBuffer class is not public, so unflatten() cannot be meaningfully called
175        by the client.
176
177        @param buffer  serialized data describing SkPaint content
178        @return        false if the buffer contains invalid data
179    */
180    bool unflatten(SkReadBuffer& buffer);
181
182    /** Sets all SkPaint contents to their initial values. This is equivalent to replacing
183        SkPaint with the result of SkPaint().
184    */
185    void reset();
186
187    /** \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.
194    */
195    enum Hinting {
196        /** 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,
226    };
227
228    /** Returns level of glyph outline adjustment.
229
230        @return  one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting
231    */
232    Hinting getHinting() const {
233        return static_cast<Hinting>(fBitfields.fHinting);
234    }
235
236    /** 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    */
241    void setHinting(Hinting hintingLevel);
242
243    /** \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.
249    */
250    enum Flags {
251        kAntiAlias_Flag          = 0x01,   //!< mask for setting anti-alias
252        kDither_Flag             = 0x04,   //!< mask for setting dither
253        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
257        kLCDRenderText_Flag      = 0x200,  //!< mask for setting LCD text
258        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
261
262        /** 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,
267    };
268
269    #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
270    enum ReserveFlags {
271        kUnderlineText_ReserveFlag  = 0x08, //!< deprecated
272        kStrikeThruText_ReserveFlag = 0x10, //!< deprecated
273    };
274    #endif
275
276    /** 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
280    */
281    uint32_t getFlags() const { return fBitfields.fFlags; }
282
283    /** 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.
285
286        @param flags  union of SkPaint::Flags for SkPaint
287    */
288    void setFlags(uint32_t flags);
289
290    /** If true, pixels on the active edges of SkPath may be drawn with partial transparency.
291
292        Equivalent to getFlags() masked with kAntiAlias_Flag.
293
294        @return  kAntiAlias_Flag state
295    */
296    bool isAntiAlias() const {
297        return SkToBool(this->getFlags() & kAntiAlias_Flag);
298    }
299
300    /** 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    */
308    void setAntiAlias(bool aa);
309
310    /** If true, color error may be distributed to smooth color transition.
311
312        Equivalent to getFlags() masked with kDither_Flag.
313
314        @return  kDither_Flag state
315    */
316    bool isDither() const {
317        return SkToBool(this->getFlags() & kDither_Flag);
318    }
319
320    /** 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    */
327    void setDither(bool dither);
328
329    /** If true, text is converted to SkPath before drawing and measuring.
330
331        Equivalent to getFlags() masked with kLinearText_Flag.
332
333        @return  kLinearText_Flag state
334    */
335    bool isLinearText() const {
336        return SkToBool(this->getFlags() & kLinearText_Flag);
337    }
338
339    /** 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
346    */
347    void setLinearText(bool linearText);
348
349    /** If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
350
351        Equivalent to getFlags() masked with kSubpixelText_Flag.
352
353        @return  kSubpixelText_Flag state
354    */
355    bool isSubpixelText() const {
356        return SkToBool(this->getFlags() & kSubpixelText_Flag);
357    }
358
359    /** 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    */
366    void setSubpixelText(bool subpixelText);
367
368    /** 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    */
374    bool isLCDRenderText() const {
375        return SkToBool(this->getFlags() & kLCDRenderText_Flag);
376    }
377
378    /** 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    */
385    void setLCDRenderText(bool lcdText);
386
387    /** If true, font engine may return glyphs from font bitmaps instead of from outlines.
388
389        Equivalent to getFlags() masked with kEmbeddedBitmapText_Flag.
390
391        @return  kEmbeddedBitmapText_Flag state
392    */
393    bool isEmbeddedBitmapText() const {
394        return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
395    }
396
397    /** 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
403    */
404    void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
405
406    /** 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
408        glyphs.
409
410        Equivalent to getFlags() masked with kAutoHinting_Flag.
411
412        @return  kAutoHinting_Flag state
413    */
414    bool isAutohinted() const {
415        return SkToBool(this->getFlags() & kAutoHinting_Flag);
416    }
417
418    /** If SkPaint::Hinting is set to kNormal_Hinting or kFull_Hinting and useAutohinter is set,
419        instruct the font manager to always hint glyphs.
420        auto-hinting has no effect if SkPaint::Hinting is set to kNo_Hinting or
421        kSlight_Hinting.
422
423        Only affects platforms that use FreeType as the font manager.
424
425        Sets kAutoHinting_Flag if useAutohinter is true.
426        Clears kAutoHinting_Flag if useAutohinter is false.
427
428        @param useAutohinter  setting for kAutoHinting_Flag
429    */
430    void setAutohinted(bool useAutohinter);
431
432    /** If true, glyphs are drawn top to bottom instead of left to right.
433
434        Equivalent to getFlags() masked with kVerticalText_Flag.
435
436        @return  kVerticalText_Flag state
437    */
438    bool isVerticalText() const {
439        return SkToBool(this->getFlags() & kVerticalText_Flag);
440    }
441
442    /** 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    */
450    void setVerticalText(bool verticalText);
451
452    /** If true, approximate bold by increasing the stroke width when creating glyph bitmaps
453        from outlines.
454
455        Equivalent to getFlags() masked with kFakeBoldText_Flag.
456
457        @return  kFakeBoldText_Flag state
458    */
459    bool isFakeBoldText() const {
460        return SkToBool(this->getFlags() & kFakeBoldText_Flag);
461    }
462
463    /** Use increased stroke width when creating glyph bitmaps to approximate a bold typeface.
464
465        Sets kFakeBoldText_Flag if fakeBoldText is true.
466        Clears kFakeBoldText_Flag if fakeBoldText is false.
467
468        @param fakeBoldText  setting for kFakeBoldText_Flag
469    */
470    void setFakeBoldText(bool fakeBoldText);
471
472    /** Returns if character spacing may be adjusted by the hinting difference.
473
474        Equivalent to getFlags() masked with kDevKernText_Flag.
475
476        @return  kDevKernText_Flag state
477    */
478    bool isDevKernText() const {
479        return SkToBool(this->getFlags() & kDevKernText_Flag);
480    }
481
482    /** 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
488    */
489    void setDevKernText(bool devKernText);
490
491    /** 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    */
497    SkFilterQuality getFilterQuality() const {
498        return (SkFilterQuality)fBitfields.fFilterQuality;
499    }
500
501    /** Sets SkFilterQuality, the image filtering level. A lower setting
502        draws faster; a higher setting looks better when the image is scaled.
503        Does not check to see if quality is valid.
504
505        @param quality  one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
506                        kMedium_SkFilterQuality, kHigh_SkFilterQuality
507    */
508    void setFilterQuality(SkFilterQuality quality);
509
510    /** \enum SkPaint::Style
511        Set Style to fill, stroke, or both fill and stroke geometry.
512        The stroke and fill
513        share all paint attributes; for instance, they are drawn with the same color.
514
515        Use kStrokeAndFill_Style to avoid hitting the same pixels twice with a stroke draw and
516        a fill draw.
517    */
518    enum Style {
519        /** Set to fill geometry.
520            Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and text.
521            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.
530            Applies to SkRect, SkRegion, SkRRect, arcs, circles, ovals, SkPath, and text.
531            Arcs, lines, and points, are always drawn as if kStroke_Style is set,
532            and ignore the set Style.
533            The stroke construction is unaffected by the FillType.
534        */
535        kStroke_Style,
536
537        /** Set to stroke and fill geometry.
538            Applies to SkRect, SkRegion, SkRRect, circles, ovals, SkPath, and text.
539            SkPath is treated as if it is set to SkPath::kWinding_FillType,
540            and the set FillType is ignored.
541        */
542        kStrokeAndFill_Style,
543    };
544
545    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
555    */
556    Style getStyle() const { return (Style)fBitfields.fStyle; }
557
558    /** 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
562    */
563    void setStyle(Style style);
564
565    /** Retrieves alpha and RGB, unpremultiplied, packed into 32 bits.
566        Use helpers SkColorGetA(), SkColorGetR(), SkColorGetG(), and SkColorGetB() to extract
567        a color component.
568
569        @return  unpremultiplied ARGB
570    */
571    SkColor getColor() const { return fColor; }
572
573    /** Sets alpha and RGB used when stroking and filling. The color is a 32-bit value,
574        unpremultiplied, packing 8-bit components for alpha, red, blue, and green.
575
576        @param color  unpremultiplied ARGB
577    */
578    void setColor(SkColor color);
579
580    /** Retrieves alpha from the color used when stroking and filling.
581
582        @return  alpha ranging from zero, fully transparent, to 255, fully opaque
583    */
584    uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); }
585
586    /** Replaces alpha, leaving RGB
587        unchanged. An out of range value triggers an assert in the debug
588        build. a is a value from zero to 255.
589        a set to zero makes color fully transparent; a set to 255 makes color
590        fully opaque.
591
592        @param a  alpha component of color
593    */
594    void setAlpha(U8CPU a);
595
596    /** Sets color used when drawing solid fills. The color components range from 0 to 255.
597        The color is unpremultiplied; alpha sets the transparency independent of RGB.
598
599        @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)
603    */
604    void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
605
606    /** Returns the thickness of the pen used by SkPaint to
607        outline the shape.
608
609        @return  zero for hairline, greater than zero for pen thickness
610    */
611    SkScalar getStrokeWidth() const { return fWidth; }
612
613    /** Sets the thickness of the pen used by the paint to
614        outline the shape.
615        Has no effect if width is less than zero.
616
617        @param width  zero thickness for hairline; greater than zero for pen thickness
618    */
619    void setStrokeWidth(SkScalar width);
620
621    /** The limit at which a sharp corner is drawn beveled.
622
623        @return  zero and greater miter limit
624    */
625    SkScalar getStrokeMiter() const { return fMiterLimit; }
626
627    /** 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
632    */
633    void setStrokeMiter(SkScalar miter);
634
635    /** \enum SkPaint::Cap
636        Cap draws at the beginning and end of an open path contour.
637    */
638    enum Cap {
639        kButt_Cap,                  //!< Does not extend the stroke past the beginning or the end.
640
641        /** 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,
657    };
658
659    /** The number of different SkPaint::Cap values defined.
660        May be used to verify that SkPaint::Cap is a legal value.*/
661    static constexpr int kCapCount = kLast_Cap + 1;
662
663    /** \enum SkPaint::Join
664        Join specifies how corners are drawn when a shape is stroked. Join
665        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.
675    */
676    enum Join {
677        /** Extends the outside corner to the extent allowed by miter limit.
678            If the extension exceeds miter limit, kBevel_Join is used instead.
679        */
680        kMiter_Join,
681
682        /** 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,
691    };
692
693    /** The number of different SkPaint::Join values defined.
694        May be used to verify that SkPaint::Join is a legal value.*/
695    static constexpr int kJoinCount = kLast_Join + 1;
696
697    /** The geometry drawn at the beginning and end of strokes.
698
699        @return  one of: kButt_Cap, kRound_Cap, kSquare_Cap
700    */
701    Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; }
702
703    /** 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
707    */
708    void setStrokeCap(Cap cap);
709
710    /** The geometry drawn at the corners of strokes.
711
712        @return  one of: kMiter_Join, kRound_Join, kBevel_Join
713    */
714    Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; }
715
716    /** The geometry drawn at the corners of strokes.
717
718        @param join  one of: kMiter_Join, kRound_Join, kBevel_Join;
719                     otherwise, has no effect
720    */
721    void setStrokeJoin(Join join);
722
723    /** 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
730        @return          true if the path represents style fill, or false if it represents hairline
731    */
732    bool getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
733                     SkScalar resScale = 1) const;
734
735    /** The filled equivalent of the stroked path.
736
737        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
742        @return     true if the path represents style fill, or false if it represents hairline
743    */
744    bool getFillPath(const SkPath& src, SkPath* dst) const {
745        return this->getFillPath(src, dst, nullptr, 1);
746    }
747
748    /** 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
753    */
754    SkShader* getShader() const { return fShader.get(); }
755
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    */
762    sk_sp<SkShader> refShader() const;
763
764    /** Optional colors used when filling a path, such as a gradient.
765
766        Sets SkShader to shader, decreasing SkRefCnt of the previous SkShader.
767        Increments shader SkRefCnt by one.
768
769        @param shader  how geometry is filled with color; if nullptr, color is used instead
770    */
771    void setShader(sk_sp<SkShader> shader);
772
773    /** Returns SkColorFilter if set, or nullptr.
774        Does not alter SkColorFilter SkRefCnt.
775
776        @return  SkColorFilter if previously set, nullptr otherwise
777    */
778    SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
779
780    /** Returns SkColorFilter if set, or nullptr.
781        Increases SkColorFilter SkRefCnt by one.
782
783        @return  SkColorFilter if set, or nullptr
784    */
785    sk_sp<SkColorFilter> refColorFilter() const;
786
787    /** Sets SkColorFilter to filter, decreasing SkRefCnt of the previous
788        SkColorFilter. Pass nullptr to clear SkColorFilter.
789
790        Increments filter SkRefCnt by one.
791
792        @param colorFilter  SkColorFilter to apply to subsequent draw
793    */
794    void setColorFilter(sk_sp<SkColorFilter> colorFilter);
795
796    /** Returns SkBlendMode.
797        By default, returns SkBlendMode::kSrcOver.
798
799        @return  mode used to combine source color with destination color
800    */
801    SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; }
802
803    /** Returns true if SkBlendMode is SkBlendMode::kSrcOver, the default.
804
805        @return  true if SkBlendMode is SkBlendMode::kSrcOver
806    */
807    bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; }
808
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    */
814    void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
815
816    /** Returns SkPathEffect if set, or nullptr.
817        Does not alter SkPathEffect SkRefCnt.
818
819        @return  SkPathEffect if previously set, nullptr otherwise
820    */
821    SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
822
823    /** Returns SkPathEffect if set, or nullptr.
824        Increases SkPathEffect SkRefCnt by one.
825
826        @return  SkPathEffect if previously set, nullptr otherwise
827    */
828    sk_sp<SkPathEffect> refPathEffect() const;
829
830    /** 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.
834
835        @param pathEffect  replace SkPath with a modification when drawn
836    */
837    void setPathEffect(sk_sp<SkPathEffect> pathEffect);
838
839    /** Returns SkMaskFilter if set, or nullptr.
840        Does not alter SkMaskFilter SkRefCnt.
841
842        @return  SkMaskFilter if previously set, nullptr otherwise
843    */
844    SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
845
846    /** Returns SkMaskFilter if set, or nullptr.
847
848        Increases SkMaskFilter SkRefCnt by one.
849
850        @return  SkMaskFilter if previously set, nullptr otherwise
851    */
852    sk_sp<SkMaskFilter> refMaskFilter() const;
853
854    /** 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
858        Increments maskFilter SkRefCnt by one.
859
860        @param maskFilter  modifies clipping mask generated from drawn geometry
861    */
862    void setMaskFilter(sk_sp<SkMaskFilter> maskFilter);
863
864    /** Returns SkTypeface if set, or nullptr.
865        Increments SkTypeface SkRefCnt by one.
866
867        @return  SkTypeface if previously set, nullptr otherwise
868    */
869    SkTypeface* getTypeface() const { return fTypeface.get(); }
870
871    /** Increases SkTypeface SkRefCnt by one.
872
873        @return  SkTypeface if previously set, nullptr otherwise
874    */
875    sk_sp<SkTypeface> refTypeface() const;
876
877    /** 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.
880
881        @param typeface  font and style used to draw text
882    */
883    void setTypeface(sk_sp<SkTypeface> typeface);
884
885    /** Returns SkImageFilter if set, or nullptr.
886        Does not alter SkImageFilter SkRefCnt.
887
888        @return  SkImageFilter if previously set, nullptr otherwise
889    */
890    SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
891
892    /** Returns SkImageFilter if set, or nullptr.
893        Increases SkImageFilter SkRefCnt by one.
894
895        @return  SkImageFilter if previously set, nullptr otherwise
896    */
897    sk_sp<SkImageFilter> refImageFilter() const;
898
899    /** Sets SkImageFilter to imageFilter, decreasing SkRefCnt of the previous
900        SkImageFilter. Pass nullptr to clear SkImageFilter, and remove SkImageFilter effect
901        on drawing.
902
903        Increments imageFilter SkRefCnt by one.
904
905        @param imageFilter  how SkImage is sampled when transformed
906    */
907    void setImageFilter(sk_sp<SkImageFilter> imageFilter);
908
909    /** Returns SkDrawLooper if set, or nullptr.
910        Does not alter SkDrawLooper SkRefCnt.
911
912        @return  SkDrawLooper if previously set, nullptr otherwise
913    */
914    SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
915
916    /** Returns SkDrawLooper if set, or nullptr.
917        Increases SkDrawLooper SkRefCnt by one.
918
919        @return  SkDrawLooper if previously set, nullptr otherwise
920    */
921    sk_sp<SkDrawLooper> refDrawLooper() const;
922
923    /** Deprecated.
924        (see skbug.com/6259)
925    */
926    SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
927
928    /** 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.
933
934        @param drawLooper  iterates through drawing one or more time, altering SkPaint
935    */
936    void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
937
938    /** Deprecated.
939        (see skbug.com/6259)
940    */
941    void setLooper(sk_sp<SkDrawLooper> drawLooper);
942
943    /** \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;
949        as well as calls that place text glyphs like getTextWidths() and getTextPath().
950
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
953        base line; and for vertical text, the position is the horizontal center of the glyph
954        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    */
961    enum Align {
962        /** Leaves the glyph at the position computed by the font offset by the text position. */
963        kLeft_Align,
964
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        */
968        kCenter_Align,
969
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        */
973        kRight_Align,
974    };
975
976    enum {
977        kAlignCount = 3, //!< The number of different Align values defined.
978    };
979
980    /** Returns SkPaint::Align.
981        Returns kLeft_Align if SkPaint::Align has not been set.
982
983        @return  text placement relative to position
984    */
985    Align   getTextAlign() const { return (Align)fBitfields.fTextAlign; }
986
987    /** Sets SkPaint::Align to align.
988        Has no effect if align is an invalid value.
989
990        @param align  text placement relative to position
991    */
992    void    setTextAlign(Align align);
993
994    /** Returns text size in points.
995
996        @return  typographic height of text
997    */
998    SkScalar getTextSize() const { return fTextSize; }
999
1000    /** 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
1004    */
1005    void setTextSize(SkScalar textSize);
1006
1007    /** Returns text scale x.
1008        Default value is 1.
1009
1010        @return  text horizontal scale
1011    */
1012    SkScalar getTextScaleX() const { return fTextScaleX; }
1013
1014    /** Sets text scale x.
1015        Default value is 1.
1016
1017        @param scaleX  text horizontal scale
1018    */
1019    void setTextScaleX(SkScalar scaleX);
1020
1021    /** Returns text skew x.
1022        Default value is zero.
1023
1024        @return  additional shear in x-axis relative to y-axis
1025    */
1026    SkScalar getTextSkewX() const { return fTextSkewX; }
1027
1028    /** Sets text skew x.
1029        Default value is zero.
1030
1031        @param skewX  additional shear in x-axis relative to y-axis
1032    */
1033    void setTextSkewX(SkScalar skewX);
1034
1035    /** \enum SkPaint::TextEncoding
1036        TextEncoding determines whether text specifies character codes and their encoded
1037        size, or glyph indices. Characters are encoded as specified by the Unicode standard.
1038
1039        Character codes encoded size are specified by UTF-8, UTF-16, or UTF-32.
1040        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.
1048
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.
1053    */
1054    enum TextEncoding {
1055        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.
1059    };
1060
1061    /** 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    */
1067    TextEncoding getTextEncoding() const {
1068      return (TextEncoding)fBitfields.fTextEncoding;
1069    }
1070
1071    /** 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
1076                         kGlyphID_TextEncoding
1077    */
1078    void setTextEncoding(TextEncoding encoding);
1079
1080    /** \struct SkPaint::FontMetrics
1081        FontMetrics is filled out by getFontMetrics(). FontMetrics contents reflect the values
1082        computed by font manager using SkTypeface. Values are set to zero if they are
1083        not available.
1084
1085        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
1089        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    */
1095    struct FontMetrics {
1096
1097        /** \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        */
1102        enum FontMetricsFlags {
1103            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.
1107        };
1108
1109        uint32_t fFlags;              //!< fFlags is set when underline metrics are valid.
1110
1111        /** Greatest extent above the baseline for any glyph.
1112            Typically less than zero.
1113        */
1114        SkScalar fTop;
1115
1116        /** Recommended distance above the baseline to reserve for a line of text.
1117            Typically less than zero.
1118        */
1119        SkScalar fAscent;
1120
1121        /** Recommended distance below the baseline to reserve for a line of text.
1122            Typically greater than zero.
1123        */
1124        SkScalar fDescent;
1125
1126        /** Greatest extent below the baseline for any glyph.
1127            Typically greater than zero.
1128        */
1129        SkScalar fBottom;
1130
1131        /** Recommended distance to add between lines of text.
1132            Typically greater than or equal to zero.
1133        */
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;
1140
1141        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
1163        /** Underline thickness.
1164
1165            If the metric is valid, the kUnderlineThicknessIsValid_Flag is set in fFlags.
1166            If kUnderlineThicknessIsValid_Flag is clear, fUnderlineThickness is zero.
1167        */
1168        SkScalar fUnderlineThickness;
1169
1170        /** Position of the top of the underline stroke relative to the baseline.
1171            Typically positive when valid.
1172
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
1178        /** Strikeout thickness.
1179
1180            If the metric is valid, the kStrikeoutThicknessIsValid_Flag is set in fFlags.
1181            If kStrikeoutThicknessIsValid_Flag is clear, fStrikeoutThickness is zero.
1182        */
1183        SkScalar fStrikeoutThickness;
1184
1185        /** Position of the bottom of the strikeout stroke relative to the baseline.
1186            Typically negative when valid.
1187
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
1194            thickness to that value. If the underline thickness is not valid,
1195            return false, and ignore thickness.
1196
1197            @param thickness  storage for underline width
1198            @return           true if font specifies underline width
1199        */
1200        bool hasUnderlineThickness(SkScalar* thickness) const {
1201            if (SkToBool(fFlags & kUnderlineThicknessIsValid_Flag)) {
1202                *thickness = fUnderlineThickness;
1203                return true;
1204            }
1205            return false;
1206        }
1207
1208        /** If SkPaint::FontMetrics has a valid underline position, return true, and set
1209            position to that value. If the underline position is not valid,
1210            return false, and ignore position.
1211
1212            @param position  storage for underline position
1213            @return          true if font specifies underline position
1214        */
1215        bool hasUnderlinePosition(SkScalar* position) const {
1216            if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) {
1217                *position = fUnderlinePosition;
1218                return true;
1219            }
1220            return false;
1221        }
1222
1223        /** If SkPaint::FontMetrics has a valid strikeout thickness, return true, and set
1224            thickness to that value. If the underline thickness is not valid,
1225            return false, and ignore thickness.
1226
1227            @param thickness  storage for strikeout width
1228            @return           true if font specifies strikeout width
1229        */
1230        bool hasStrikeoutThickness(SkScalar* thickness) const {
1231            if (SkToBool(fFlags & kStrikeoutThicknessIsValid_Flag)) {
1232                *thickness = fStrikeoutThickness;
1233                return true;
1234            }
1235            return false;
1236        }
1237
1238        /** If SkPaint::FontMetrics has a valid strikeout position, return true, and set
1239            position to that value. If the underline position is not valid,
1240            return false, and ignore position.
1241
1242            @param position  storage for strikeout position
1243            @return          true if font specifies strikeout position
1244        */
1245        bool hasStrikeoutPosition(SkScalar* position) const {
1246            if (SkToBool(fFlags & kStrikeoutPositionIsValid_Flag)) {
1247                *position = fStrikeoutPosition;
1248                return true;
1249            }
1250            return false;
1251        }
1252
1253    };
1254
1255    /** 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
1268    */
1269    SkScalar getFontMetrics(FontMetrics* metrics, SkScalar scale = 0) const;
1270
1271    /** 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.
1275        Returns the same result as getFontMetrics().
1276
1277        @return  recommended spacing between lines
1278    */
1279    SkScalar getFontSpacing() const { return this->getFontMetrics(nullptr, 0); }
1280
1281    /** 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
1286        Does not check text for valid character codes or valid glyph indices.
1287
1288        If byteLength equals zero, returns zero.
1289        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
1294        @param text        character storage encoded with SkPaint::TextEncoding
1295        @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
1298    */
1299    int textToGlyphs(const void* text, size_t byteLength,
1300                     SkGlyphID glyphs[]) const;
1301
1302    /** 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.
1305
1306        If SkPaint::TextEncoding is kGlyphID_TextEncoding,
1307        returns true if all glyph indices in text are non-zero;
1308        does not check to see if text contains valid glyph indices for SkTypeface.
1309
1310        Returns true if byteLength is zero.
1311
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    */
1316    bool containsText(const void* text, size_t byteLength) const;
1317
1318    /** 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
1328    */
1329    void glyphsToUnichars(const SkGlyphID glyphs[], int count, SkUnichar text[]) const;
1330
1331    /** Returns the number of glyphs in text.
1332        Uses SkPaint::TextEncoding to count the glyphs.
1333        Returns the same result as textToGlyphs().
1334
1335        @param text        character storage encoded with SkPaint::TextEncoding
1336        @param byteLength  length of character storage in bytes
1337        @return            number of glyphs represented by text of length byteLength
1338    */
1339    int countText(const void* text, size_t byteLength) const {
1340        return this->textToGlyphs(text, byteLength, nullptr);
1341    }
1342
1343    /** 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    */
1357    SkScalar measureText(const void* text, size_t length, SkRect* bounds) const;
1358
1359    /** 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,
1363        and text size to scale the metrics.
1364        Does not scale the advance or bounds by fake bold or SkPathEffect.
1365
1366        @param text    character codes or glyph indices to be measured
1367        @param length  number of bytes of text to measure
1368        @return        advance width or height
1369    */
1370    SkScalar measureText(const void* text, size_t length) const {
1371        return this->measureText(text, length, nullptr);
1372    }
1373
1374    /** 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    */
1391    size_t  breakText(const void* text, size_t length, SkScalar maxWidth,
1392                      SkScalar* measuredWidth = nullptr) const;
1393
1394    /** 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.
1404        Does include fake bold and SkPathEffect in the bounds.
1405
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    */
1412    int getTextWidths(const void* text, size_t byteLength, SkScalar widths[],
1413                      SkRect bounds[] = nullptr) const;
1414
1415    /** 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.
1419        Uses x, y, and SkPaint::Align to position path.
1420
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    */
1427    void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y,
1428                     SkPath* path) const;
1429
1430    /** 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    */
1442    void getPosTextPath(const void* text, size_t length,
1443                        const SkPoint pos[], SkPath* path) const;
1444
1445    /** 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    */
1465    int getTextIntercepts(const void* text, size_t length, SkScalar x, SkScalar y,
1466                          const SkScalar bounds[2], SkScalar* intervals) const;
1467
1468    /** 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
1485        @return           number of intersections; may be zero
1486    */
1487    int getPosTextIntercepts(const void* text, size_t length, const SkPoint pos[],
1488                             const SkScalar bounds[2], SkScalar* intervals) const;
1489
1490    /** 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    */
1510    int getPosTextHIntercepts(const void* text, size_t length, const SkScalar xpos[],
1511                              SkScalar constY, const SkScalar bounds[2], SkScalar* intervals) const;
1512
1513    /** 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.
1517        Uses SkTypeface to get the glyph paths,
1518        and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
1519        Uses run array and SkPaint::Align to position intervals.
1520
1521        SkPaint::TextEncoding must be set to SkPaint::kGlyphID_TextEncoding.
1522
1523        Pass nullptr for intervals to determine the size of the interval array.
1524
1525        intervals are cached to improve performance for multiple calls.
1526
1527        @param blob       glyphs, positions, and text paint attributes
1528        @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    */
1532    int getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds[2],
1533                              SkScalar* intervals) const;
1534
1535    /** Returns the union of bounds of all glyphs.
1536        Returned dimensions are computed by font manager from font data,
1537        ignoring SkPaint::Hinting. Includes text size, text scale x,
1538        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,
1541        returns the same bounds as SkPaint::FontMetrics { FontMetrics::fXMin,
1542        FontMetrics::fTop, FontMetrics::fXMax, FontMetrics::fBottom }.
1543
1544        @return  union of bounds of all glyphs
1545    */
1546    SkRect getFontBounds() const;
1547
1548    /** Returns true if SkPaint prevents all drawing;
1549        otherwise, the SkPaint may or may not allow drawing.
1550
1551        Returns true if, for example, SkBlendMode combined with color alpha computes a
1552        new alpha of zero.
1553
1554        @return  true if SkPaint prevents all drawing
1555    */
1556    bool nothingToDraw() const;
1557
1558    /**     (to be made private)
1559        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.
1562
1563        @return  true if SkPaint allows for fast computation of bounds
1564    */
1565    bool canComputeFastBounds() const;
1566
1567    /**     (to be made private)
1568        Only call this if canComputeFastBounds() returned true. This takes a
1569        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
1571        parameter. It returns the adjusted bounds that can then be used
1572        for SkCanvas::quickReject tests.
1573
1574        The returned SkRect will either be orig or storage, thus the caller
1575        should not rely on storage being set to the result, but should always
1576        use the returned value. It is legal for orig and storage to be the same
1577        SkRect.
1578            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            }
1587
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    */
1592    const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const {
1593        // Things like stroking, etc... will do math on the bounds rect, assuming that it's sorted.
1594        SkASSERT(orig.isSorted());
1595        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());
1601            effects |= reinterpret_cast<uintptr_t>(this->getImageFilter());
1602            if (!effects) {
1603                return orig;
1604            }
1605        }
1606
1607        return this->doComputeFastBounds(orig, storage, style);
1608    }
1609
1610    /**     (to be made private)
1611
1612        @param orig     geometry modified by SkPaint when drawn
1613        @param storage  computed bounds of geometry
1614        @return         fast computed bounds
1615    */
1616    const SkRect& computeFastStrokeBounds(const SkRect& orig,
1617                                          SkRect* storage) const {
1618        return this->doComputeFastBounds(orig, storage, kStroke_Style);
1619    }
1620
1621    /**     (to be made private)
1622        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.
1625
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    */
1631    const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
1632                                      Style style) const;
1633
1634    /** macro expands to: void toString(SkString* str) const;
1635        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.
1638
1639        @param str  storage for string representation of SkPaint
1640    */
1641    SK_TO_STRING_NONVIRT()
1642
1643private:
1644    typedef const SkGlyph& (*GlyphCacheProc)(SkGlyphCache*, const char**);
1645
1646    sk_sp<SkTypeface>     fTypeface;
1647    sk_sp<SkPathEffect>   fPathEffect;
1648    sk_sp<SkShader>       fShader;
1649    sk_sp<SkMaskFilter>   fMaskFilter;
1650    sk_sp<SkColorFilter>  fColorFilter;
1651    sk_sp<SkDrawLooper>   fDrawLooper;
1652    sk_sp<SkImageFilter>  fImageFilter;
1653
1654    SkScalar        fTextSize;
1655    SkScalar        fTextScaleX;
1656    SkScalar        fTextSkewX;
1657    SkColor         fColor;
1658    SkScalar        fWidth;
1659    SkScalar        fMiterLimit;
1660    uint32_t        fBlendMode; // just need 5-6 bits
1661    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;
1671            unsigned        fFilterQuality : 2;
1672            //unsigned      fFreeBits : 2;
1673        } fBitfields;
1674        uint32_t fBitfieldsUInt;
1675    };
1676
1677    static GlyphCacheProc GetGlyphCacheProc(TextEncoding encoding,
1678                                            bool isDevKern,
1679                                            bool needFullMetrics);
1680
1681    SkScalar measure_text(SkGlyphCache*, const char* text, size_t length,
1682                          int* count, SkRect* bounds) const;
1683
1684    /*
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
1691    enum {
1692        /*  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,
1707    };
1708
1709    static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM, SkScalar maxLimit);
1710
1711    // 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
1716    static SkScalar MaxCacheSize2(SkScalar maxLimit);
1717
1718    friend class GrAtlasTextBlob;
1719    friend class GrAtlasTextContext;
1720    friend class GrGLPathRendering;
1721    friend class GrPathRendering;
1722    friend class GrTextUtils;
1723    friend class SkAutoGlyphCache;
1724    friend class SkAutoGlyphCacheNoGamma;
1725    friend class SkCanonicalizePaint;
1726    friend class SkCanvas;
1727    friend class SkDraw;
1728    friend class SkPDFDevice;
1729    friend class SkScalerContext;  // for computeLuminanceColor()
1730    friend class SkTextBaseIter;
1731};
1732
1733#endif
1734