12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427 |
- /*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- /* Generated by tools/bookmaker from include/core/SkPaint.h and docs/SkPaint_Reference.bmh
- on 2018-08-28 10:32:58. Additional documentation and examples can be found at:
- https://skia.org/user/api/SkPaint_Reference
- You may edit either file directly. Structural changes to public interfaces require
- editing both files. After editing docs/SkPaint_Reference.bmh, run:
- bookmaker -b docs -i include/core/SkPaint.h -p
- to create an updated version of this file.
- */
- #ifndef SkPaint_DEFINED
- #define SkPaint_DEFINED
- #include "../private/SkTo.h"
- #include "SkBlendMode.h"
- #include "SkColor.h"
- #include "SkFilterQuality.h"
- #include "SkFontMetrics.h"
- #include "SkFontTypes.h"
- #include "SkMatrix.h"
- #include "SkRefCnt.h"
- #define SK_SUPPORT_LEGACY_FONTMETRICS_IN_PAINT
- class GrTextBlob;
- class SkAutoDescriptor;
- class SkColorFilter;
- class SkColorSpace;
- class SkData;
- class SkDescriptor;
- class SkDrawLooper;
- class SkGlyph;
- class SkGlyphRunBuilder;
- class SkGlyphRun;
- class SkGlyphRunListPainter;
- struct SkRect;
- class SkGlyphCache;
- class SkImageFilter;
- class SkMaskFilter;
- class SkPath;
- class SkPathEffect;
- struct SkPoint;
- class SkRunFont;
- class SkShader;
- class SkSurfaceProps;
- class SkTextBlob;
- class SkTextBlobRunIterator;
- class SkTypeface;
- #ifndef SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
- #define SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
- #endif
- /** \class SkPaint
- SkPaint controls options applied when drawing and measuring. SkPaint collects all
- options outside of the SkCanvas clip and SkCanvas matrix.
- Various options apply to text, strokes and fills, and images.
- Some options may not be implemented on all platforms; in these cases, setting
- the option has no effect. Some options are conveniences that duplicate SkCanvas
- functionality; for instance, text size is identical to matrix scale.
- SkPaint options are rarely exclusive; each option modifies a stage of the drawing
- pipeline and multiple pipeline stages may be affected by a single SkPaint.
- SkPaint collects effects and filters that describe single-pass and multiple-pass
- algorithms that alter the drawing geometry, color, and transparency. For instance,
- SkPaint does not directly implement dashing or blur, but contains the objects that do so.
- The objects contained by SkPaint are opaque, and cannot be edited outside of the SkPaint
- to affect it. The implementation is free to defer computations associated with the
- SkPaint, or ignore them altogether. For instance, some GPU implementations draw all
- SkPath geometries with anti-aliasing, regardless of how SkPaint::kAntiAlias_Flag
- is set in SkPaint.
- SkPaint describes a single color, a single font, a single image quality, and so on.
- Multiple colors are drawn either by using multiple paints or with objects like
- SkShader attached to SkPaint.
- */
- class SK_API SkPaint {
- public:
- /** Constructs SkPaint with default values.
- @return default initialized SkPaint
- */
- SkPaint();
- /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
- SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
- between the original paint and the copy. Objects containing SkRefCnt increment
- their references by one.
- The referenced objects SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
- SkDrawLooper, and SkImageFilter cannot be modified after they are created.
- This prevents objects with SkRefCnt from being modified once SkPaint refers to them.
- @param paint original to copy
- @return shallow copy of paint
- */
- SkPaint(const SkPaint& paint);
- /** Implements a move constructor to avoid increasing the reference counts
- of objects referenced by the paint.
- After the call, paint is undefined, and can be safely destructed.
- @param paint original to move
- @return content of paint
- */
- SkPaint(SkPaint&& paint);
- /** Decreases SkPaint SkRefCnt of owned objects: SkTypeface, SkPathEffect, SkShader,
- SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter. If the
- objects containing SkRefCnt go to zero, they are deleted.
- */
- ~SkPaint();
- /** Makes a shallow copy of SkPaint. SkTypeface, SkPathEffect, SkShader,
- SkMaskFilter, SkColorFilter, SkDrawLooper, and SkImageFilter are shared
- between the original paint and the copy. Objects containing SkRefCnt in the
- prior destination are decreased by one, and the referenced objects are deleted if the
- resulting count is zero. Objects containing SkRefCnt in the parameter paint
- are increased by one. paint is unmodified.
- @param paint original to copy
- @return content of paint
- */
- SkPaint& operator=(const SkPaint& paint);
- /** Moves the paint to avoid increasing the reference counts
- of objects referenced by the paint parameter. Objects containing SkRefCnt in the
- prior destination are decreased by one; those objects are deleted if the resulting count
- is zero.
- After the call, paint is undefined, and can be safely destructed.
- @param paint original to move
- @return content of paint
- */
- SkPaint& operator=(SkPaint&& paint);
- /** Compares a and b, and returns true if a and b are equivalent. May return false
- if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
- SkDrawLooper, or SkImageFilter have identical contents but different pointers.
- @param a SkPaint to compare
- @param b SkPaint to compare
- @return true if SkPaint pair are equivalent
- */
- SK_API friend bool operator==(const SkPaint& a, const SkPaint& b);
- /** Compares a and b, and returns true if a and b are not equivalent. May return true
- if SkTypeface, SkPathEffect, SkShader, SkMaskFilter, SkColorFilter,
- SkDrawLooper, or SkImageFilter have identical contents but different pointers.
- @param a SkPaint to compare
- @param b SkPaint to compare
- @return true if SkPaint pair are not equivalent
- */
- friend bool operator!=(const SkPaint& a, const SkPaint& b) {
- return !(a == b);
- }
- /** Returns a hash generated from SkPaint values and pointers.
- Identical hashes guarantee that the paints are
- equivalent, but differing hashes do not guarantee that the paints have differing
- contents.
- If operator==(const SkPaint& a, const SkPaint& b) returns true for two paints,
- their hashes are also equal.
- The hash returned is platform and implementation specific.
- @return a shallow hash
- */
- uint32_t getHash() const;
- /** Sets all SkPaint contents to their initial values. This is equivalent to replacing
- SkPaint with the result of SkPaint().
- */
- void reset();
- #ifdef SK_SUPPORT_LEGACY_NESTED_HINTINGENUM
- /** \enum SkPaint::Hinting
- Deprecated.
- Hinting adjusts the glyph outlines so that the shape provides a uniform
- look at a given point size on font engines that support it. Hinting may have a
- muted effect or no effect at all depending on the platform.
- The four levels roughly control corresponding features on platforms that use FreeType
- as the font engine.
- */
- enum Hinting : uint8_t {
- kNo_Hinting = 0, //!< glyph outlines unchanged
- kSlight_Hinting = 1, //!< minimal modification to improve constrast
- kNormal_Hinting = 2, //!< glyph outlines modified to improve constrast
- kFull_Hinting = 3, //!< modifies glyph outlines for maximum constrast
- };
- #endif
- /** Sets level of glyph outline adjustment.
- Does not check for valid values of hintingLevel.
- @param hintingLevel one of: SkFontHinting::kNone, SkFontHinting::kSlight,
- SkFontHinting::kNormal, SkFontHinting::kFull
- */
- void setHinting(SkFontHinting hintingLevel);
- /** Returns level of glyph outline adjustment.
- @return one of: SkFontHinting::kNone, SkFontHinting::kSlight, SkFontHinting::kNormal,
- SkFontHinting::kFull
- */
- SkFontHinting getHinting() const { return (SkFontHinting)fBitfields.fHinting; }
- /** \enum SkPaint::Flags
- The bit values stored in Flags.
- The default value for Flags, normally zero, can be changed at compile time
- with a custom definition of SkPaintDefaults_Flags.
- All flags can be read and written explicitly; Flags allows manipulating
- multiple settings at once.
- */
- enum Flags {
- kAntiAlias_Flag = 0x01, //!< mask for setting anti-alias
- kDither_Flag = 0x04, //!< mask for setting dither
- kFakeBoldText_Flag = 0x20, //!< mask for setting fake bold
- kLinearText_Flag = 0x40, //!< mask for setting linear text
- kSubpixelText_Flag = 0x80, //!< mask for setting subpixel text
- kLCDRenderText_Flag = 0x200, //!< mask for setting LCD text
- kEmbeddedBitmapText_Flag = 0x400, //!< mask for setting font embedded bitmaps
- kAutoHinting_Flag = 0x800, //!< mask for setting auto-hinting
- // 0x1000 used to be kVertical
- kAllFlags = 0xFFFF, //!< mask of all Flags
- };
- #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
- /** Private.
- */
- enum ReserveFlags {
- kUnderlineText_ReserveFlag = 0x08, //!< to be deprecated soon
- kStrikeThruText_ReserveFlag = 0x10, //!< to be deprecated soon
- };
- #endif
- /** Returns paint settings described by SkPaint::Flags. Each setting uses one
- bit, and can be tested with SkPaint::Flags members.
- @return zero, one, or more bits described by SkPaint::Flags
- */
- uint32_t getFlags() const { return fBitfields.fFlags; }
- /** Replaces SkPaint::Flags with flags, the union of the SkPaint::Flags members.
- All SkPaint::Flags members may be cleared, or one or more may be set.
- @param flags union of SkPaint::Flags for SkPaint
- */
- void setFlags(uint32_t flags);
- /** Returns true if pixels on the active edges of SkPath may be drawn with partial transparency.
- Equivalent to getFlags() masked with kAntiAlias_Flag.
- @return kAntiAlias_Flag state
- */
- bool isAntiAlias() const {
- return SkToBool(this->getFlags() & kAntiAlias_Flag);
- }
- /** Requests, but does not require, that edge pixels draw opaque or with
- partial transparency.
- Sets kAntiAlias_Flag if aa is true.
- Clears kAntiAlias_Flag if aa is false.
- @param aa setting for kAntiAlias_Flag
- */
- void setAntiAlias(bool aa);
- /** Returns true if color error may be distributed to smooth color transition.
- Equivalent to getFlags() masked with kDither_Flag.
- @return kDither_Flag state
- */
- bool isDither() const {
- return SkToBool(this->getFlags() & kDither_Flag);
- }
- /** Requests, but does not require, to distribute color error.
- Sets kDither_Flag if dither is true.
- Clears kDither_Flag if dither is false.
- @param dither setting for kDither_Flag
- */
- void setDither(bool dither);
- /** Returns true if text is converted to SkPath before drawing and measuring.
- Equivalent to getFlags() masked with kLinearText_Flag.
- @return kLinearText_Flag state
- */
- bool isLinearText() const {
- return SkToBool(this->getFlags() & kLinearText_Flag);
- }
- /** Requests, but does not require, that glyphs are converted to SkPath
- before drawing and measuring.
- By default, kLinearText_Flag is clear.
- Sets kLinearText_Flag if linearText is true.
- Clears kLinearText_Flag if linearText is false.
- @param linearText setting for kLinearText_Flag
- */
- void setLinearText(bool linearText);
- /** Returns true if glyphs at different sub-pixel positions may differ on pixel edge coverage.
- Equivalent to getFlags() masked with kSubpixelText_Flag.
- @return kSubpixelText_Flag state
- */
- bool isSubpixelText() const {
- return SkToBool(this->getFlags() & kSubpixelText_Flag);
- }
- /** Requests, but does not require, that glyphs respect sub-pixel positioning.
- Sets kSubpixelText_Flag if subpixelText is true.
- Clears kSubpixelText_Flag if subpixelText is false.
- @param subpixelText setting for kSubpixelText_Flag
- */
- void setSubpixelText(bool subpixelText);
- /** Returns true if glyphs may use LCD striping to improve glyph edges.
- Returns true if SkPaint::Flags kLCDRenderText_Flag is set.
- @return kLCDRenderText_Flag state
- */
- bool isLCDRenderText() const {
- return SkToBool(this->getFlags() & kLCDRenderText_Flag);
- }
- /** Requests, but does not require, that glyphs use LCD striping for glyph edges.
- Sets kLCDRenderText_Flag if lcdText is true.
- Clears kLCDRenderText_Flag if lcdText is false.
- @param lcdText setting for kLCDRenderText_Flag
- */
- void setLCDRenderText(bool lcdText);
- /** Returns true if font engine may return glyphs from font bitmaps instead of from outlines.
- Equivalent to getFlags() masked with kEmbeddedBitmapText_Flag.
- @return kEmbeddedBitmapText_Flag state
- */
- bool isEmbeddedBitmapText() const {
- return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag);
- }
- /** Requests, but does not require, to use bitmaps in fonts instead of outlines.
- Sets kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is true.
- Clears kEmbeddedBitmapText_Flag if useEmbeddedBitmapText is false.
- @param useEmbeddedBitmapText setting for kEmbeddedBitmapText_Flag
- */
- void setEmbeddedBitmapText(bool useEmbeddedBitmapText);
- /** Returns true if SkPaint::Hinting is set to SkFontHinting::kNormal or
- SkFontHinting::kFull, and if platform uses FreeType as the font manager.
- If true, instructs the font manager to always hint glyphs.
- Equivalent to getFlags() masked with kAutoHinting_Flag.
- @return kAutoHinting_Flag state
- */
- bool isAutohinted() const {
- return SkToBool(this->getFlags() & kAutoHinting_Flag);
- }
- /** Sets whether to always hint glyphs.
- If SkPaint::Hinting is set to SkFontHinting::kNormal or SkFontHinting::kFull
- and useAutohinter is set, instructs the font manager to always hint glyphs.
- auto-hinting has no effect if SkPaint::Hinting is set to SkFontHinting::kNone or
- SkFontHinting::kSlight.
- Only affects platforms that use FreeType as the font manager.
- Sets kAutoHinting_Flag if useAutohinter is true.
- Clears kAutoHinting_Flag if useAutohinter is false.
- @param useAutohinter setting for kAutoHinting_Flag
- */
- void setAutohinted(bool useAutohinter);
- /** Returns true if approximate bold by increasing the stroke width when creating glyph bitmaps
- from outlines.
- Equivalent to getFlags() masked with kFakeBoldText_Flag.
- @return kFakeBoldText_Flag state
- */
- bool isFakeBoldText() const {
- return SkToBool(this->getFlags() & kFakeBoldText_Flag);
- }
- /** Increases stroke width when creating glyph bitmaps to approximate a bold typeface.
- Sets kFakeBoldText_Flag if fakeBoldText is true.
- Clears kFakeBoldText_Flag if fakeBoldText is false.
- @param fakeBoldText setting for kFakeBoldText_Flag
- */
- void setFakeBoldText(bool fakeBoldText);
- /** Returns SkFilterQuality, the image filtering level. A lower setting
- draws faster; a higher setting looks better when the image is scaled.
- @return one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
- kMedium_SkFilterQuality, kHigh_SkFilterQuality
- */
- SkFilterQuality getFilterQuality() const {
- return (SkFilterQuality)fBitfields.fFilterQuality;
- }
- /** Sets SkFilterQuality, the image filtering level. A lower setting
- draws faster; a higher setting looks better when the image is scaled.
- Does not check to see if quality is valid.
- @param quality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
- kMedium_SkFilterQuality, kHigh_SkFilterQuality
- */
- void setFilterQuality(SkFilterQuality quality);
- /** \enum SkPaint::Style
- Set Style to fill, stroke, or both fill and stroke geometry.
- The stroke and fill
- share all paint attributes; for instance, they are drawn with the same color.
- Use kStrokeAndFill_Style to avoid hitting the same pixels twice with a stroke draw and
- a fill draw.
- */
- enum Style : uint8_t {
- kFill_Style, //!< set to fill geometry
- kStroke_Style, //!< set to stroke geometry
- kStrokeAndFill_Style, //!< sets to stroke and fill geometry
- };
- /** May be used to verify that SkPaint::Style is a legal value.
- */
- static constexpr int kStyleCount = kStrokeAndFill_Style + 1;
- /** Returns whether the geometry is filled, stroked, or filled and stroked.
- @return one of:kFill_Style, kStroke_Style, kStrokeAndFill_Style
- */
- Style getStyle() const { return (Style)fBitfields.fStyle; }
- /** Sets whether the geometry is filled, stroked, or filled and stroked.
- Has no effect if style is not a legal SkPaint::Style value.
- @param style one of: kFill_Style, kStroke_Style, kStrokeAndFill_Style
- */
- void setStyle(Style style);
- /** Retrieves alpha and RGB, unpremultiplied, packed into 32 bits.
- Use helpers SkColorGetA(), SkColorGetR(), SkColorGetG(), and SkColorGetB() to extract
- a color component.
- @return unpremultiplied ARGB
- */
- SkColor getColor() const { return fColor4f.toSkColor(); }
- /** Retrieves alpha and RGB, unpremultiplied, as four floating point values. RGB are
- are extended sRGB values (sRGB gamut, and encoded with the sRGB transfer function).
- @return unpremultiplied RGBA
- */
- SkColor4f getColor4f() const { return fColor4f; }
- /** Sets alpha and RGB used when stroking and filling. The color is a 32-bit value,
- unpremultiplied, packing 8-bit components for alpha, red, blue, and green.
- @param color unpremultiplied ARGB
- */
- void setColor(SkColor color);
- /** Sets alpha and RGB used when stroking and filling. The color is four floating
- point values, unpremultiplied. The color values are interpreted as being in
- the colorSpace. If colorSpace is nullptr, then color is assumed to be in the
- sRGB color space.
- @param color unpremultiplied RGBA
- @param colorSpace SkColorSpace describing the encoding of color
- */
- void setColor4f(const SkColor4f& color, SkColorSpace* colorSpace);
- /** Retrieves alpha from the color used when stroking and filling.
- @return alpha ranging from zero, fully transparent, to 255, fully opaque
- */
- uint8_t getAlpha() const { return sk_float_round2int(fColor4f.fA * 255); }
- /** Replaces alpha, leaving RGB
- unchanged. An out of range value triggers an assert in the debug
- build. a is a value from zero to 255.
- a set to zero makes color fully transparent; a set to 255 makes color
- fully opaque.
- @param a alpha component of color
- */
- void setAlpha(U8CPU a);
- /** Sets color used when drawing solid fills. The color components range from 0 to 255.
- The color is unpremultiplied; alpha sets the transparency independent of RGB.
- @param a amount of alpha, from fully transparent (0) to fully opaque (255)
- @param r amount of red, from no red (0) to full red (255)
- @param g amount of green, from no green (0) to full green (255)
- @param b amount of blue, from no blue (0) to full blue (255)
- */
- void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
- /** Returns the thickness of the pen used by SkPaint to
- outline the shape.
- @return zero for hairline, greater than zero for pen thickness
- */
- SkScalar getStrokeWidth() const { return fWidth; }
- /** Sets the thickness of the pen used by the paint to
- outline the shape.
- Has no effect if width is less than zero.
- @param width zero thickness for hairline; greater than zero for pen thickness
- */
- void setStrokeWidth(SkScalar width);
- /** Returns the limit at which a sharp corner is drawn beveled.
- @return zero and greater miter limit
- */
- SkScalar getStrokeMiter() const { return fMiterLimit; }
- /** Sets the limit at which a sharp corner is drawn beveled.
- Valid values are zero and greater.
- Has no effect if miter is less than zero.
- @param miter zero and greater miter limit
- */
- void setStrokeMiter(SkScalar miter);
- /** \enum SkPaint::Cap
- Cap draws at the beginning and end of an open path contour.
- */
- enum Cap {
- kButt_Cap, //!< no stroke extension
- kRound_Cap, //!< adds circle
- kSquare_Cap, //!< adds square
- kLast_Cap = kSquare_Cap, //!< largest Cap value
- kDefault_Cap = kButt_Cap, //!< equivalent to kButt_Cap
- };
- /** May be used to verify that SkPaint::Cap is a legal value.
- */
- static constexpr int kCapCount = kLast_Cap + 1;
- /** \enum SkPaint::Join
- Join specifies how corners are drawn when a shape is stroked. Join
- affects the four corners of a stroked rectangle, and the connected segments in a
- stroked path.
- Choose miter join to draw sharp corners. Choose round join to draw a circle with a
- radius equal to the stroke width on top of the corner. Choose bevel join to minimally
- connect the thick strokes.
- The fill path constructed to describe the stroked path respects the join setting but may
- not contain the actual join. For instance, a fill path constructed with round joins does
- not necessarily include circles at each connected segment.
- */
- enum Join : uint8_t {
- kMiter_Join, //!< extends to miter limit
- kRound_Join, //!< adds circle
- kBevel_Join, //!< connects outside edges
- kLast_Join = kBevel_Join, //!< equivalent to the largest value for Join
- kDefault_Join = kMiter_Join, //!< equivalent to kMiter_Join
- };
- /** May be used to verify that SkPaint::Join is a legal value.
- */
- static constexpr int kJoinCount = kLast_Join + 1;
- /** Returns the geometry drawn at the beginning and end of strokes.
- @return one of: kButt_Cap, kRound_Cap, kSquare_Cap
- */
- Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; }
- /** Sets the geometry drawn at the beginning and end of strokes.
- @param cap one of: kButt_Cap, kRound_Cap, kSquare_Cap;
- has no effect if cap is not valid
- */
- void setStrokeCap(Cap cap);
- /** Returns the geometry drawn at the corners of strokes.
- @return one of: kMiter_Join, kRound_Join, kBevel_Join
- */
- Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; }
- /** Sets the geometry drawn at the corners of strokes.
- @param join one of: kMiter_Join, kRound_Join, kBevel_Join;
- otherwise, has no effect
- */
- void setStrokeJoin(Join join);
- /** Returns the filled equivalent of the stroked path.
- @param src SkPath read to create a filled version
- @param dst resulting SkPath; may be the same as src, but may not be nullptr
- @param cullRect optional limit passed to SkPathEffect
- @param resScale if > 1, increase precision, else if (0 < resScale < 1) reduce precision
- to favor speed and size
- @return true if the path represents style fill, or false if it represents hairline
- */
- bool getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
- SkScalar resScale = 1) const;
- /** Returns the filled equivalent of the stroked path.
- Replaces dst with the src path modified by SkPathEffect and style stroke.
- SkPathEffect, if any, is not culled. stroke width is created with default precision.
- @param src SkPath read to create a filled version
- @param dst resulting SkPath dst may be the same as src, but may not be nullptr
- @return true if the path represents style fill, or false if it represents hairline
- */
- bool getFillPath(const SkPath& src, SkPath* dst) const {
- return this->getFillPath(src, dst, nullptr, 1);
- }
- /** Returns optional colors used when filling a path, such as a gradient.
- Does not alter SkShader SkRefCnt.
- @return SkShader if previously set, nullptr otherwise
- */
- SkShader* getShader() const { return fShader.get(); }
- /** Returns optional colors used when filling a path, such as a gradient.
- Increases SkShader SkRefCnt by one.
- @return SkShader if previously set, nullptr otherwise
- */
- sk_sp<SkShader> refShader() const;
- /** Sets optional colors used when filling a path, such as a gradient.
- Sets SkShader to shader, decreasing SkRefCnt of the previous SkShader.
- Increments shader SkRefCnt by one.
- @param shader how geometry is filled with color; if nullptr, color is used instead
- */
- void setShader(sk_sp<SkShader> shader);
- /** Returns SkColorFilter if set, or nullptr.
- Does not alter SkColorFilter SkRefCnt.
- @return SkColorFilter if previously set, nullptr otherwise
- */
- SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
- /** Returns SkColorFilter if set, or nullptr.
- Increases SkColorFilter SkRefCnt by one.
- @return SkColorFilter if set, or nullptr
- */
- sk_sp<SkColorFilter> refColorFilter() const;
- /** Sets SkColorFilter to filter, decreasing SkRefCnt of the previous
- SkColorFilter. Pass nullptr to clear SkColorFilter.
- Increments filter SkRefCnt by one.
- @param colorFilter SkColorFilter to apply to subsequent draw
- */
- void setColorFilter(sk_sp<SkColorFilter> colorFilter);
- /** Returns SkBlendMode.
- By default, returns SkBlendMode::kSrcOver.
- @return mode used to combine source color with destination color
- */
- SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; }
- /** Returns true if SkBlendMode is SkBlendMode::kSrcOver, the default.
- @return true if SkBlendMode is SkBlendMode::kSrcOver
- */
- bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; }
- /** Sets SkBlendMode to mode.
- Does not check for valid input.
- @param mode SkBlendMode used to combine source color and destination
- */
- void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
- /** Returns SkPathEffect if set, or nullptr.
- Does not alter SkPathEffect SkRefCnt.
- @return SkPathEffect if previously set, nullptr otherwise
- */
- SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
- /** Returns SkPathEffect if set, or nullptr.
- Increases SkPathEffect SkRefCnt by one.
- @return SkPathEffect if previously set, nullptr otherwise
- */
- sk_sp<SkPathEffect> refPathEffect() const;
- /** Sets SkPathEffect to pathEffect, decreasing SkRefCnt of the previous
- SkPathEffect. Pass nullptr to leave the path geometry unaltered.
- Increments pathEffect SkRefCnt by one.
- @param pathEffect replace SkPath with a modification when drawn
- */
- void setPathEffect(sk_sp<SkPathEffect> pathEffect);
- /** Returns SkMaskFilter if set, or nullptr.
- Does not alter SkMaskFilter SkRefCnt.
- @return SkMaskFilter if previously set, nullptr otherwise
- */
- SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
- /** Returns SkMaskFilter if set, or nullptr.
- Increases SkMaskFilter SkRefCnt by one.
- @return SkMaskFilter if previously set, nullptr otherwise
- */
- sk_sp<SkMaskFilter> refMaskFilter() const;
- /** Sets SkMaskFilter to maskFilter, decreasing SkRefCnt of the previous
- SkMaskFilter. Pass nullptr to clear SkMaskFilter and leave SkMaskFilter effect on
- mask alpha unaltered.
- Increments maskFilter SkRefCnt by one.
- @param maskFilter modifies clipping mask generated from drawn geometry
- */
- void setMaskFilter(sk_sp<SkMaskFilter> maskFilter);
- /** Returns SkTypeface if set, or nullptr.
- Does not alter SkTypeface SkRefCnt.
- @return SkTypeface if previously set, nullptr otherwise
- */
- SkTypeface* getTypeface() const { return fTypeface.get(); }
- /** Increases SkTypeface SkRefCnt by one.
- @return SkTypeface if previously set, nullptr otherwise
- */
- sk_sp<SkTypeface> refTypeface() const;
- /** Sets SkTypeface to typeface, decreasing SkRefCnt of the previous SkTypeface.
- Pass nullptr to clear SkTypeface and use the default typeface. Increments
- typeface SkRefCnt by one.
- @param typeface font and style used to draw text
- */
- void setTypeface(sk_sp<SkTypeface> typeface);
- /** Returns SkImageFilter if set, or nullptr.
- Does not alter SkImageFilter SkRefCnt.
- @return SkImageFilter if previously set, nullptr otherwise
- */
- SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
- /** Returns SkImageFilter if set, or nullptr.
- Increases SkImageFilter SkRefCnt by one.
- @return SkImageFilter if previously set, nullptr otherwise
- */
- sk_sp<SkImageFilter> refImageFilter() const;
- /** Sets SkImageFilter to imageFilter, decreasing SkRefCnt of the previous
- SkImageFilter. Pass nullptr to clear SkImageFilter, and remove SkImageFilter effect
- on drawing.
- Increments imageFilter SkRefCnt by one.
- @param imageFilter how SkImage is sampled when transformed
- */
- void setImageFilter(sk_sp<SkImageFilter> imageFilter);
- /** Returns SkDrawLooper if set, or nullptr.
- Does not alter SkDrawLooper SkRefCnt.
- @return SkDrawLooper if previously set, nullptr otherwise
- */
- SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
- /** Returns SkDrawLooper if set, or nullptr.
- Increases SkDrawLooper SkRefCnt by one.
- @return SkDrawLooper if previously set, nullptr otherwise
- */
- sk_sp<SkDrawLooper> refDrawLooper() const;
- /** Deprecated.
- (see skbug.com/6259)
- */
- SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
- /** Sets SkDrawLooper to drawLooper, decreasing SkRefCnt of the previous
- drawLooper. Pass nullptr to clear SkDrawLooper and leave SkDrawLooper effect on
- drawing unaltered.
- Increments drawLooper SkRefCnt by one.
- @param drawLooper iterates through drawing one or more time, altering SkPaint
- */
- void setDrawLooper(sk_sp<SkDrawLooper> drawLooper);
- /** Deprecated.
- (see skbug.com/6259)
- */
- void setLooper(sk_sp<SkDrawLooper> drawLooper);
- /** Returns text size in points.
- @return typographic height of text
- */
- SkScalar getTextSize() const { return fTextSize; }
- /** Sets text size in points.
- Has no effect if textSize is not greater than or equal to zero.
- @param textSize typographic height of text
- */
- void setTextSize(SkScalar textSize);
- /** Returns text scale on x-axis.
- Default value is 1.
- @return text horizontal scale
- */
- SkScalar getTextScaleX() const { return fTextScaleX; }
- /** Sets text scale on x-axis.
- Default value is 1.
- @param scaleX text horizontal scale
- */
- void setTextScaleX(SkScalar scaleX);
- /** Returns text skew on x-axis.
- Default value is zero.
- @return additional shear on x-axis relative to y-axis
- */
- SkScalar getTextSkewX() const { return fTextSkewX; }
- /** Sets text skew on x-axis.
- Default value is zero.
- @param skewX additional shear on x-axis relative to y-axis
- */
- void setTextSkewX(SkScalar skewX);
- /** \enum SkPaint::TextEncoding
- TextEncoding determines whether text specifies character codes and their encoded
- size, or glyph indices. Characters are encoded as specified by the Unicode standard.
- Character codes encoded size are specified by UTF-8, UTF-16, or UTF-32.
- All character code formats are able to represent all of Unicode, differing only
- in the total storage required.
- UTF-8 (RFC 3629) encodes each character as one or more 8-bit bytes.
- UTF-16 (RFC 2781) encodes each character as one or two 16-bit words.
- UTF-32 encodes each character as one 32-bit word.
- font manager uses font data to convert character code points into glyph indices.
- A glyph index is a 16-bit word.
- TextEncoding is set to kUTF8_TextEncoding by default.
- */
- enum TextEncoding : uint8_t {
- kUTF8_TextEncoding, //!< uses bytes to represent UTF-8 or ASCII
- kUTF16_TextEncoding, //!< uses two byte words to represent most of Unicode
- kUTF32_TextEncoding, //!< uses four byte words to represent all of Unicode
- kGlyphID_TextEncoding, //!< uses two byte words to represent glyph indices
- };
- /** Returns SkPaint::TextEncoding.
- SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
- @return one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
- kGlyphID_TextEncoding
- */
- TextEncoding getTextEncoding() const {
- return (TextEncoding)fBitfields.fTextEncoding;
- }
- /** Sets SkPaint::TextEncoding to encoding.
- SkPaint::TextEncoding determines how character code points are mapped to font glyph indices.
- Invalid values for encoding are ignored.
- @param encoding one of: kUTF8_TextEncoding, kUTF16_TextEncoding, kUTF32_TextEncoding, or
- kGlyphID_TextEncoding
- */
- void setTextEncoding(TextEncoding encoding);
- // Experimental
- void setTextEncoding(SkTextEncoding encoding) {
- this->setTextEncoding((TextEncoding)encoding);
- }
- #ifdef SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
- #ifdef SK_SUPPORT_LEGACY_FONTMETRICS_IN_PAINT
- /**
- SkFontMetrics is filled out by getFontMetrics(). SkFontMetrics contents reflect the values
- computed by font manager using SkTypeface. Values are set to zero if they are
- not available.
- All vertical values are relative to the baseline, on a y-axis pointing down.
- Zero is on the baseline, negative values are above the baseline, and positive
- values are below the baseline.
- fUnderlineThickness and fUnderlinePosition have a bit set in fFlags if their values
- are valid, since their value may be zero.
- fStrikeoutThickness and fStrikeoutPosition have a bit set in fFlags if their values
- are valid, since their value may be zero.
- */
- typedef SkFontMetrics FontMetrics;
- #endif
- /** Returns SkFontMetrics associated with SkTypeface.
- The return value is the recommended spacing between lines: the sum of metrics
- descent, ascent, and leading.
- If metrics is not nullptr, SkFontMetrics is copied to metrics.
- Results are scaled by text size but does not take into account
- dimensions required by text scale x, text skew x, fake bold,
- style stroke, and SkPathEffect.
- @param metrics storage for SkFontMetrics; may be nullptr
- @return recommended spacing between lines
- */
- SkScalar getFontMetrics(SkFontMetrics* metrics) const;
- /** Returns the recommended spacing between lines: the sum of metrics
- descent, ascent, and leading.
- Result is scaled by text size but does not take into account
- dimensions required by stroking and SkPathEffect.
- Returns the same result as getFontMetrics().
- @return recommended spacing between lines
- */
- SkScalar getFontSpacing() const { return this->getFontMetrics(nullptr); }
- /** Converts text into glyph indices.
- Returns the number of glyph indices represented by text.
- SkPaint::TextEncoding specifies how text represents characters or glyphs.
- glyphs may be nullptr, to compute the glyph count.
- Does not check text for valid character codes or valid glyph indices.
- If byteLength equals zero, returns zero.
- If byteLength includes a partial character, the partial character is ignored.
- If SkPaint::TextEncoding is kUTF8_TextEncoding and
- text contains an invalid UTF-8 sequence, zero is returned.
- @param text character storage encoded with SkPaint::TextEncoding
- @param byteLength length of character storage in bytes
- @param glyphs storage for glyph indices; may be nullptr
- @return number of glyphs represented by text of length byteLength
- */
- int textToGlyphs(const void* text, size_t byteLength,
- SkGlyphID glyphs[]) const;
- /** Returns true if all text corresponds to a non-zero glyph index.
- Returns false if any characters in text are not supported in
- SkTypeface.
- If SkPaint::TextEncoding is kGlyphID_TextEncoding,
- returns true if all glyph indices in text are non-zero;
- does not check to see if text contains valid glyph indices for SkTypeface.
- Returns true if byteLength is zero.
- @param text array of characters or glyphs
- @param byteLength number of bytes in text array
- @return true if all text corresponds to a non-zero glyph index
- */
- bool containsText(const void* text, size_t byteLength) const;
- /** Converts glyphs into text if possible.
- Glyph values without direct Unicode equivalents are mapped to zero.
- Uses the SkTypeface, but is unaffected
- by SkPaint::TextEncoding; the text values returned are equivalent to kUTF32_TextEncoding.
- Only supported on platforms that use FreeType as the font engine.
- @param glyphs array of indices into font
- @param count length of glyph array
- @param text storage for character codes, one per glyph
- */
- void glyphsToUnichars(const SkGlyphID glyphs[], int count, SkUnichar text[]) const;
- /** Returns the number of glyphs in text.
- Uses SkPaint::TextEncoding to count the glyphs.
- Returns the same result as textToGlyphs().
- @param text character storage encoded with SkPaint::TextEncoding
- @param byteLength length of character storage in bytes
- @return number of glyphs represented by text of length byteLength
- */
- int countText(const void* text, size_t byteLength) const;
- /** Returns the advance width of text.
- The advance is the normal distance to move before drawing additional text.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
- and text size, text scale x, text skew x, stroke width, and
- SkPathEffect to scale the metrics and bounds.
- Returns the bounding box of text if bounds is not nullptr.
- The bounding box is computed as if the text was drawn at the origin.
- @param text character codes or glyph indices to be measured
- @param length number of bytes of text to measure
- @param bounds returns bounding box relative to (0, 0) if not nullptr
- @return advance width or height
- */
- SkScalar measureText(const void* text, size_t length, SkRect* bounds) const;
- /** Returns the advance width of text.
- The advance is the normal distance to move before drawing additional text.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
- and text size to scale the metrics.
- Does not scale the advance or bounds by fake bold or SkPathEffect.
- @param text character codes or glyph indices to be measured
- @param length number of bytes of text to measure
- @return advance width or height
- */
- SkScalar measureText(const void* text, size_t length) const {
- return this->measureText(text, length, nullptr);
- }
- #endif
- /** Returns the bytes of text that fit within maxWidth.
- The text fragment fits if its advance width is less than or equal to maxWidth.
- Measures only while the advance is less than or equal to maxWidth.
- Returns the advance or the text fragment in measuredWidth if it not nullptr.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
- and text size to scale the metrics.
- Does not scale the advance or bounds by fake bold or SkPathEffect.
- @param text character codes or glyph indices to be measured
- @param length number of bytes of text to measure
- @param maxWidth advance limit; text is measured while advance is less than maxWidth
- @param measuredWidth returns the width of the text less than or equal to maxWidth
- @return bytes of text that fit, always less than or equal to length
- */
- size_t breakText(const void* text, size_t length, SkScalar maxWidth,
- SkScalar* measuredWidth = nullptr) const;
- #ifdef SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
- /** Retrieves the advance and bounds for each glyph in text, and returns
- the glyph count in text.
- Both widths and bounds may be nullptr.
- If widths is not nullptr, widths must be an array of glyph count entries.
- if bounds is not nullptr, bounds must be an array of glyph count entries.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the font metrics,
- and text size to scale the widths and bounds.
- Does not scale the advance by fake bold or SkPathEffect.
- Does include fake bold and SkPathEffect in the bounds.
- @param text character codes or glyph indices to be measured
- @param byteLength number of bytes of text to measure
- @param widths returns text advances for each glyph; may be nullptr
- @param bounds returns bounds for each glyph relative to (0, 0); may be nullptr
- @return glyph count in text
- */
- int getTextWidths(const void* text, size_t byteLength, SkScalar widths[],
- SkRect bounds[] = nullptr) const;
- /** Returns the geometry as SkPath equivalent to the drawn text.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- All of the glyph paths are stored in path.
- Uses x, y, to position path.
- @param text character codes or glyph indices
- @param length number of bytes of text
- @param x x-axis value of the origin of the text
- @param y y-axis value of the origin of the text
- @param path geometry of the glyphs
- */
- void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y,
- SkPath* path) const;
- /** Returns the geometry as SkPath equivalent to the drawn text.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- All of the glyph paths are stored in path.
- Uses pos array to position path.
- pos contains a position for each glyph.
- @param text character codes or glyph indices
- @param length number of bytes of text
- @param pos positions of each glyph
- @param path geometry of the glyphs
- */
- void getPosTextPath(const void* text, size_t length,
- const SkPoint pos[], SkPath* path) const;
- #ifdef SK_SUPPORT_LEGACY_TEXTINTERCEPTS
- public:
- #else
- private:
- #endif
- /** Returns the number of intervals that intersect bounds.
- bounds describes a pair of lines parallel to the text advance.
- The return count is zero or a multiple of two, and is at most twice the number of glyphs in
- the string.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- Uses x, y to position intervals.
- Pass nullptr for intervals to determine the size of the interval array.
- intervals are cached to improve performance for multiple calls.
- @param text character codes or glyph indices
- @param length number of bytes of text
- @param x x-axis value of the origin of the text
- @param y y-axis value of the origin of the text
- @param bounds lower and upper line parallel to the advance
- @param intervals returned intersections; may be nullptr
- @return number of intersections; may be zero
- */
- int getTextIntercepts(const void* text, size_t length, SkScalar x, SkScalar y,
- const SkScalar bounds[2], SkScalar* intervals) const;
- /** Returns the number of intervals that intersect bounds.
- bounds describes a pair of lines parallel to the text advance.
- The return count is zero or a multiple of two, and is at most twice the number of glyphs in
- the string.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- Uses pos array to position intervals.
- Pass nullptr for intervals to determine the size of the interval array.
- intervals are cached to improve performance for multiple calls.
- @param text character codes or glyph indices
- @param length number of bytes of text
- @param pos positions of each glyph
- @param bounds lower and upper line parallel to the advance
- @param intervals returned intersections; may be nullptr
- @return number of intersections; may be zero
- */
- int getPosTextIntercepts(const void* text, size_t length, const SkPoint pos[],
- const SkScalar bounds[2], SkScalar* intervals) const;
- /** Returns the number of intervals that intersect bounds.
- bounds describes a pair of lines parallel to the text advance.
- The return count is zero or a multiple of two, and is at most twice the number of glyphs in
- the string.
- Uses SkPaint::TextEncoding to decode text, SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- Uses xpos array, constY to position intervals.
- Pass nullptr for intervals to determine the size of the interval array.
- intervals are cached to improve performance for multiple calls.
- @param text character codes or glyph indices
- @param length number of bytes of text
- @param xpos positions of each glyph on x-axis
- @param constY position of each glyph on y-axis
- @param bounds lower and upper line parallel to the advance
- @param intervals returned intersections; may be nullptr
- @return number of intersections; may be zero
- */
- int getPosTextHIntercepts(const void* text, size_t length, const SkScalar xpos[],
- SkScalar constY, const SkScalar bounds[2], SkScalar* intervals) const;
- public:
- /** Returns the number of intervals that intersect bounds.
- bounds describes a pair of lines parallel to the text advance.
- The return count is zero or a multiple of two, and is at most twice the number of glyphs in
- the string.
- Uses SkTypeface to get the glyph paths,
- and text size, fake bold, and SkPathEffect to scale and modify the glyph paths.
- Uses run array to position intervals.
- SkPaint::TextEncoding must be set to SkPaint::kGlyphID_TextEncoding.
- Pass nullptr for intervals to determine the size of the interval array.
- intervals are cached to improve performance for multiple calls.
- @param blob glyphs, positions, and text paint attributes
- @param bounds lower and upper line parallel to the advance
- @param intervals returned intersections; may be nullptr
- @return number of intersections; may be zero
- */
- int getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds[2],
- SkScalar* intervals) const;
- /** Returns the union of bounds of all glyphs.
- Returned dimensions are computed by font manager from font data,
- ignoring SkPaint::Hinting. Includes font metrics, but not fake bold or SkPathEffect.
- If text size is large, text scale is one, and text skew is zero,
- returns the bounds as:
- { SkFontMetrics::fXMin, SkFontMetrics::fTop, SkFontMetrics::fXMax, SkFontMetrics::fBottom }.
- @return union of bounds of all glyphs
- */
- SkRect getFontBounds() const;
- #endif
- /** Returns true if SkPaint prevents all drawing;
- otherwise, the SkPaint may or may not allow drawing.
- Returns true if, for example, SkBlendMode combined with alpha computes a
- new alpha of zero.
- @return true if SkPaint prevents all drawing
- */
- bool nothingToDraw() const;
- /** (to be made private)
- Returns true if SkPaint does not include elements requiring extensive computation
- to compute SkBaseDevice bounds of drawn geometry. For instance, SkPaint with SkPathEffect
- always returns false.
- @return true if SkPaint allows for fast computation of bounds
- */
- bool canComputeFastBounds() const;
- /** (to be made private)
- Only call this if canComputeFastBounds() returned true. This takes a
- raw rectangle (the raw bounds of a shape), and adjusts it for stylistic
- effects in the paint (e.g. stroking). If needed, it uses the storage
- parameter. It returns the adjusted bounds that can then be used
- for SkCanvas::quickReject tests.
- The returned SkRect will either be orig or storage, thus the caller
- should not rely on storage being set to the result, but should always
- use the returned value. It is legal for orig and storage to be the same
- SkRect.
- For example:
- if (!path.isInverseFillType() && paint.canComputeFastBounds()) {
- SkRect storage;
- if (canvas->quickReject(paint.computeFastBounds(path.getBounds(), &storage))) {
- return; // do not draw the path
- }
- }
- // draw the path
- @param orig geometry modified by SkPaint when drawn
- @param storage computed bounds of geometry; may not be nullptr
- @return fast computed bounds
- */
- const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const {
- // Things like stroking, etc... will do math on the bounds rect, assuming that it's sorted.
- SkASSERT(orig.isSorted());
- SkPaint::Style style = this->getStyle();
- // ultra fast-case: filling with no effects that affect geometry
- if (kFill_Style == style) {
- uintptr_t effects = reinterpret_cast<uintptr_t>(this->getLooper());
- effects |= reinterpret_cast<uintptr_t>(this->getMaskFilter());
- effects |= reinterpret_cast<uintptr_t>(this->getPathEffect());
- effects |= reinterpret_cast<uintptr_t>(this->getImageFilter());
- if (!effects) {
- return orig;
- }
- }
- return this->doComputeFastBounds(orig, storage, style);
- }
- /** (to be made private)
- @param orig geometry modified by SkPaint when drawn
- @param storage computed bounds of geometry
- @return fast computed bounds
- */
- const SkRect& computeFastStrokeBounds(const SkRect& orig,
- SkRect* storage) const {
- return this->doComputeFastBounds(orig, storage, kStroke_Style);
- }
- /** (to be made private)
- Computes the bounds, overriding the SkPaint SkPaint::Style. This can be used to
- account for additional width required by stroking orig, without
- altering SkPaint::Style set to fill.
- @param orig geometry modified by SkPaint when drawn
- @param storage computed bounds of geometry
- @param style overrides SkPaint::Style
- @return fast computed bounds
- */
- const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
- Style style) const;
- private:
- friend class SkGlyphRun;
- friend class SkGlyphRunBuilder;
- SkPaint(const SkPaint&, const SkRunFont&);
- sk_sp<SkTypeface> fTypeface;
- sk_sp<SkPathEffect> fPathEffect;
- sk_sp<SkShader> fShader;
- sk_sp<SkMaskFilter> fMaskFilter;
- sk_sp<SkColorFilter> fColorFilter;
- sk_sp<SkDrawLooper> fDrawLooper;
- sk_sp<SkImageFilter> fImageFilter;
- SkScalar fTextSize;
- SkScalar fTextScaleX;
- SkScalar fTextSkewX;
- SkColor4f fColor4f;
- SkScalar fWidth;
- SkScalar fMiterLimit;
- uint32_t fBlendMode; // just need 5-6 bits
- union {
- struct {
- // all of these bitfields should add up to 32
- unsigned fFlags : 16;
- unsigned fCapType : 2;
- unsigned fJoinType : 2;
- unsigned fStyle : 2;
- unsigned fTextEncoding : 2; // 3 values
- unsigned fHinting : 2;
- unsigned fFilterQuality : 2;
- //unsigned fFreeBits : 4;
- } fBitfields;
- uint32_t fBitfieldsUInt;
- };
- SkScalar measure_text(SkGlyphCache*, const char* text, size_t length,
- int* count, SkRect* bounds) const;
- /*
- * The luminance color is used to determine which Gamma Canonical color to map to. This is
- * really only used by backends which want to cache glyph masks, and need some way to know if
- * they need to generate new masks based off a given color.
- */
- SkColor computeLuminanceColor() const;
- /* This is the size we use when we ask for a glyph's path. We then
- * post-transform it as we draw to match the request.
- * This is done to try to re-use cache entries for the path.
- *
- * This value is somewhat arbitrary. In theory, it could be 1, since
- * we store paths as floats. However, we get the path from the font
- * scaler, and it may represent its paths as fixed-point (or 26.6),
- * so we shouldn't ask for something too big (might overflow 16.16)
- * or too small (underflow 26.6).
- *
- * This value could track kMaxSizeForGlyphCache, assuming the above
- * constraints, but since we ask for unhinted paths, the two values
- * need not match per-se.
- */
- static constexpr int kCanonicalTextSizeForPaths = 64;
- static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM, SkScalar maxLimit);
- // Set flags/hinting/textSize up to use for drawing text as paths.
- // Returns scale factor to restore the original textSize, since will will
- // have change it to kCanonicalTextSizeForPaths.
- SkScalar setupForAsPaths();
- static SkScalar MaxCacheSize2(SkScalar maxLimit);
- friend class GrTextBlob;
- friend class GrTextContext;
- friend class GrGLPathRendering;
- friend class GrPathRendering;
- friend class SkAutoGlyphCacheNoGamma;
- friend class SkCanonicalizePaint;
- friend class SkCanvas;
- friend class SkDraw;
- friend class SkFont;
- friend class SkGlyphRunListPainter;
- friend class SkPaintPriv;
- friend class SkPDFDevice;
- friend class SkScalerContext; // for computeLuminanceColor()
- friend class SkTextBaseIter;
- friend class SkTextBlobCacheDiffCanvas;
- };
- #endif
|