wip spelling mania

Work on spell-checker
to identify errors and
isolate more concepts
requiring definitions.

Docs-Preview: https://skia.org/?cl=41180
TBR: reed@google.com
Bug: skia: 6898
Change-Id: I0759beb42eaf6095908a9bd7decfcd0026253609
Reviewed-on: https://skia-review.googlesource.com/41180
Reviewed-by: Cary Clark <caryclark@skia.org>
Commit-Queue: Cary Clark <caryclark@skia.org>
This commit is contained in:
Cary Clark 2017-09-01 13:39:19 -04:00 committed by Skia Commit-Bot
parent dbb24efcc5
commit da65a0489a
15 changed files with 2355 additions and 1946 deletions

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,7 @@ Paint does not directly implement dashing or blur, but contains the objects that
The objects contained by Paint are opaque, and cannot be edited outside of the Paint
to affect it. The implementation is free to defer computations associated with the
Paint, or ignore them altogether. For instance, some GPU implementations draw all
Path geometries with anti-aliasing, regardless of how SkPaint::kAntiAlias_Flag
Path geometries with Anti-aliasing, regardless of how SkPaint::kAntiAlias_Flag
is set in Paint.
Paint describes a single color, a single font, a single image quality, and so on.
@ -46,7 +46,7 @@ Shader attached to Paint.
# Anti-alias # Approximating coverage with transparency. ##
# Dither # Distributing color error. ##
# Device_Text # Increase precision of glyph position. ##
# Font_Embedded_Bitmaps # Custom-sized bitmap glyphs. ##
# Font_Embedded_Bitmaps # Custom sized bitmap Glyphs. ##
# Automatic_Hinting # Always adjust glyph paths. ##
# Vertical_Text # Orient text from top to bottom. ##
# Fake_Bold # Approximate font styles. ##
@ -72,12 +72,12 @@ Shader attached to Paint.
# Text_Size # Overall height in points. ##
# Text_Scale_X # Text horizontal scale. ##
# Text_Skew_X # Text horizontal slant. ##
# Text_Encoding # Text encoded as characters or glyphs. ##
# Text_Encoding # Text encoded as characters or Glyphs. ##
# Font_Metrics # Common glyph dimensions. ##
# Measure_Text # Width, height, bounds of text. ##
# Text_Path # Geometry of glyphs. ##
# Text_Path # Geometry of Glyphs. ##
# Text_Intercepts # Advanced underline, strike through. ##
# Fast_Bounds # Appproxiate area required by Paint. ##
# Fast_Bounds # Approximate area required by Paint. ##
#Table ##
#Subtopic ##
@ -139,12 +139,12 @@ Shader attached to Paint.
# canComputeFastBounds # Returns true if settings allow for fast bounds computation. ##
# computeFastBounds # Returns fill bounds for quick reject tests. ##
# computeFastStrokeBounds # Returns stroke bounds for quick reject tests. ##
# containsText # Returns if all text corresponds to glyphs. ##
# countText # Returns number of glyphs in text. ##
# containsText # Returns if all text corresponds to Glyphs. ##
# countText # Returns number of Glyphs in text. ##
# doComputeFastBounds # Returns bounds for quick reject tests. ##
# flatten() # Serializes into a buffer. ##
# getAlpha # Returns Color_Alpha, color opacity. ##
# getBlendMode # Returns Blend_Mode, how colors combine with dest. ##
# getBlendMode # Returns Blend_Mode, how colors combine with Device. ##
# getColor # Returns Color_Alpha and Color_RGB, one drawing color. ##
# getColorFilter # Returns Color_Filter, how colors are altered. ##
# getDrawLooper # Returns Draw_Looper, multiple layers. ##
@ -179,9 +179,9 @@ Shader attached to Paint.
# getTextSize # Returns text size in points. ##
# getTextWidths # Returns advance and bounds for each glyph in text. ##
# getTypeface # Returns Typeface, font description. ##
# glyphsToUnichars # Converts glyphs into text. ##
# glyphsToUnichars # Converts Glyphs into text. ##
# isAntiAlias # Returns true if Anti-alias is set. ##
# isAutohinted # Returns true if glyphs are always hinted. ##
# isAutohinted # Returns true if Glyphs are always hinted. ##
# isDevKernText # Returns true if Full_Hinting_Spacing is set. ##
# isDither # Returns true if Dither is set. ##
# isEmbeddedBitmapText # Returns true if Font_Embedded_Bitmaps is set. ##
@ -204,7 +204,7 @@ Shader attached to Paint.
# setAlpha # Sets Color_Alpha, color opacity. ##
# setAntiAlias # Sets or clears Anti-alias. ##
# setARGB # Sets color by component. ##
# setAutohinted # Sets glyphs to always be hinted. ##
# setAutohinted # Sets Glyphs to always be hinted. ##
# setBlendMode # Sets Blend_Mode, how colors combine with destination. ##
# setColor # Sets Color_Alpha and Color_RGB, one drawing color. ##
# setColorFilter # Sets Color_Filter, alters color. ##
@ -236,7 +236,7 @@ Shader attached to Paint.
# setTypeface # Sets Typeface, font description. ##
# setVerticalText # Sets or clears Vertical_Text. ##
# textToGlyphs # Converts text into glyph indices. ##
# toString # Converts Paint to machine parsable form (Developer_Mode) ##
# toString # Converts Paint to machine readable form. ##
# unflatten() # Populates from a serialized stream. ##
#Table ##
#Subtopic ##
@ -255,7 +255,7 @@ Constructs Paint with default values.
# attribute # default value ##
#Legend ##
# Anti-alias # false ##
# Blend_Mode # SkBlendMode::kSrcOver ##
# Blend_Mode # SkBlendMode::kSrcOver ##
# Color # SK_ColorBLACK ##
# Color_Alpha # 255 ##
# Color_Filter # nullptr ##
@ -290,7 +290,7 @@ Constructs Paint with default values.
#Table ##
The flags, text size, hinting, and miter limit may be overridden at compile time by defining
paint default values. The overrides may be included in SkUserConfig.h or predefined by the
paint default values. The overrides may be included in "SkUserConfig.h" or predefined by the
build system.
#Return default initialized Paint ##
@ -622,7 +622,7 @@ flatten() at an earlier time.
SkReadBuffer class is not public, so unflatten() cannot be meaningfully called
by the client.
#Param buffer serialized data to unflatten ##
#Param buffer serialized data describing Paint content ##
# why is unflatten() public?
#Bug 6172 ##
@ -669,7 +669,7 @@ as the Font_Engine.
With FreeType, this is equivalent in spirit to the
FT_LOAD_TARGET_LIGHT value supplied to FT_Load_Glyph. It chooses a
lighter hinting algorithm for non-monochrome modes.
Generated glyphs may be fuzzy but better resemble their original shape.
Generated Glyphs may be fuzzy but better resemble their original shape.
##
#Const kNormal_Hinting 2
Modifies glyph outlines to improve constrast. This is the default.
@ -733,9 +733,9 @@ Set SkPaintDefaults_Hinting at compile time to change the default setting.
# Hinting # value # effect on generated glyph outlines ##
##
# kNo_Hinting # 0 # leaves glyph outlines unchanged from their native representation ##
# kSlight_Hinting # 1 # modifies glyph outlines minimally to improve constrast ##
# kNormal_Hinting # 2 # modifies glyph outlines to improve constrast ##
# kFull_Hinting # 3 # modifies glyph outlines for maxiumum constrast ##
# kSlight_Hinting # 1 # modifies glyph outlines minimally to improve contrast ##
# kNormal_Hinting # 2 # modifies glyph outlines to improve contrast ##
# kFull_Hinting # 3 # modifies glyph outlines for maximum contrast ##
##
#Param hintingLevel one of: kNo_Hinting, kSlight_Hinting, kNormal_Hinting, kFull_Hinting ##
@ -901,19 +901,19 @@ Anti-alias drawing approximates partial pixel coverage with transparency.
If kAntiAlias_Flag is clear, pixel centers contained by the shape edge are drawn opaque.
If kAntiAlias_Flag is set, pixels are drawn with Color_Alpha equal to their coverage.
The rule for aliased pixels is inconsistent across platforms. A shape edge
The rule for Aliased pixels is inconsistent across platforms. A shape edge
passing through the pixel center may, but is not required to, draw the pixel.
Raster_Engine draws aliased pixels whose centers are on or to the right of the start of an
Raster_Engine draws Aliased pixels whose centers are on or to the right of the start of an
active Path edge, and whose center is to the left of the end of the active Path edge.
#ToDo add illustration of raster pixels ##
A platform may only support anti-aliased drawing. Some GPU-backed platforms use
supersampling to anti-alias all drawing, and have no mechanism to selectively
alias.
A platform may only support Anti-aliased drawing. Some GPU-backed platforms use
Supersampling to Anti-alias all drawing, and have no mechanism to selectively
Alias.
The amount of coverage computed for anti-aliased pixels also varies across platforms.
The amount of coverage computed for Anti-aliased pixels also varies across platforms.
Anti-alias is disabled by default.
Anti-alias can be enabled by default by setting SkPaintDefaults_Flags to kAntiAlias_Flag
@ -924,8 +924,8 @@ at compile time.
#Description
A red line is drawn with transparency on the edges to make it look smoother.
A blue line draws only where the pixel centers are contained.
The lines are drawn into an offscreen bitmap, then drawn magified to make the
aliasing easier to see.
The lines are drawn into Bitmap, then drawn magnified to make the
Aliasing easier to see.
##
void draw(SkCanvas* canvas) {
@ -1000,7 +1000,7 @@ at compile time.
# ------------------------------------------------------------------------------
#Topic Dither
Dither increases fidelity by adjusting the color of adjcent pixels.
Dither increases fidelity by adjusting the color of adjacent pixels.
This can help to smooth color transitions and reducing banding in gradients.
Dithering lessens visible banding from kRGB_565_SkColorType
and kRGBA_8888_SkColorType gradients,
@ -1133,7 +1133,7 @@ LCD_Text and Subpixel_Text increase the precision of glyph position.
When set, Flags kLCDRenderText_Flag takes advantage of the organization of Color_RGB stripes that
create a color, and relies
on the small size of the stripe and visual perception to make the color fringing inperceptible.
on the small size of the stripe and visual perception to make the color fringing imperceptible.
LCD_Text can be enabled on devices that orient stripes horizontally or vertically, and that order
the color components as Color_RGB or Color_RBG.
@ -1149,8 +1149,8 @@ kLCDRenderText_Flag or kSubpixelText_Flag (or both) at compile time.
#Example
#Description
Four commas are drawn normally and with combinations of LCD_Text and Subpixel_Text.
When Subpixel_Text is disabled, the comma glyphs are indentical, but not evenly spaced.
When Subpixel_Text is enabled, the comma glyphs are unique, but appear evenly spaced.
When Subpixel_Text is disabled, the comma Glyphs are identical, but not evenly spaced.
When Subpixel_Text is enabled, the comma Glyphs are unique, but appear evenly spaced.
##
SkBitmap bitmap;
@ -1254,7 +1254,7 @@ of the color increases, the edge of the glyph appears to move towards the outsid
#Method bool isSubpixelText() const
If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
If true, Glyphs at different sub-pixel positions may differ on pixel edge coverage.
Equivalent to getFlags masked with kSubpixelText_Flag.
@ -1278,7 +1278,7 @@ SkDebugf("paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelTex
#Method void setSubpixelText(bool subpixelText)
Requests, but does not require, that glyphs respect sub-pixel positioning.
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.
@ -1305,13 +1305,13 @@ SkDebugf("paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelTex
When set, Flags kLCDRenderText_Flag takes advantage of the organization of Color_RGB stripes that
create a color, and relies
on the small size of the stripe and visual perception to make the color fringing inperceptible.
on the small size of the stripe and visual perception to make the color fringing imperceptible.
LCD_Text can be enabled on devices that orient stripes horizontally or vertically, and that order
the color components as Color_RGB or Color_RBG.
#Method bool isLCDRenderText() const
If true, glyphs may use LCD striping to improve glyph edges.
If true, Glyphs may use LCD striping to improve glyph edges.
Returns true if Flags kLCDRenderText_Flag is set.
@ -1335,7 +1335,7 @@ SkDebugf("paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderT
#Method void setLCDRenderText(bool lcdText)
Requests, but does not require, that glyphs use LCD striping for glyph edges.
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.
@ -1363,7 +1363,7 @@ SkDebugf("paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderT
#Topic Font_Embedded_Bitmaps
#Alias Font_Embedded_Bitmaps # long-winded enough, alias so I don't type Paint_Font_...
Font_Embedded_Bitmaps allows selecting custom-sized bitmap glyphs.
Font_Embedded_Bitmaps allows selecting custom sized bitmap Glyphs.
Flags kEmbeddedBitmapText_Flag when set chooses an embedded bitmap glyph over an outline contained
in a font if the platform supports this option.
@ -1380,10 +1380,11 @@ kEmbeddedBitmapText_Flag at compile time.
#ToDo image will only output on Ubuntu ... how to handle that in fiddle? ##
#Platform !fiddle
#Description
The hintgasp TrueType font in the Skia resources/fonts directory includes an embedded
bitmap glyph at odd font sizes. This example works on platforms that use FreeType
as their Font_Engine.
Windows may, but is not required to, return a bitmap glyph if kEmbeddedBitmapText_Flag is set.
The "hintgasp" TrueType font in the Skia resources/fonts directory
includes an embedded bitmap Glyph at odd font sizes. This example works
on platforms that use FreeType as their Font_Engine.
Windows may, but is not required to, return a bitmap glyph if
kEmbeddedBitmapText_Flag is set.
##
#Image embeddedbitmap.png
@ -1406,7 +1407,7 @@ kEmbeddedBitmapText_Flag at compile time.
#Method bool isEmbeddedBitmapText() const
If true, Font_Engine may return glyphs from font bitmaps instead of from outlines.
If true, Font_Engine may return Glyphs from font bitmaps instead of from outlines.
Equivalent to getFlags masked with kEmbeddedBitmapText_Flag.
@ -1460,7 +1461,7 @@ kEmbeddedBitmapText_Flag at compile time.
#Substitute auto-hinting
If Hinting is set to kNormal_Hinting or kFull_Hinting, Automatic_Hinting
instructs the Font_Manager to always hint glyphs.
instructs the Font_Manager to always hint Glyphs.
Automatic_Hinting has no effect if Hinting is set to kNo_Hinting or
kSlight_Hinting.
@ -1470,7 +1471,7 @@ Automatic_Hinting only affects platforms that use FreeType as the Font_Manager.
If true, and if Hinting is set to kNormal_Hinting or kFull_Hinting, and if
platform uses FreeType as the Font_Manager, instruct the Font_Manager to always hint
glyphs.
Glyphs.
Equivalent to getFlags masked with kAutoHinting_Flag.
@ -1498,7 +1499,7 @@ Automatic_Hinting only affects platforms that use FreeType as the Font_Manager.
#Method void setAutohinted(bool useAutohinter)
If Hinting is set to kNormal_Hinting or kFull_Hinting and useAutohinter is set,
instruct the Font_Manager to always hint glyphs.
instruct the Font_Manager to always hint Glyphs.
Automatic_Hinting has no effect if Hinting is set to kNo_Hinting or
kSlight_Hinting.
@ -1536,13 +1537,13 @@ Automatic_Hinting only affects platforms that use FreeType as the Font_Manager.
#Topic Vertical_Text
Text may be drawn by positioning each glyph, or by positioning the first glyph and
using Font_Advance to position subsequent glyphs. By default, each successive glyph
is positioned to the right of the preceeding glyph. Vertical_Text sets successive
glyphs to position below the preceeding glyph.
using Font_Advance to position subsequent Glyphs. By default, each successive glyph
is positioned to the right of the preceding glyph. Vertical_Text sets successive
Glyphs to position below the preceding glyph.
Skia can translate text character codes as a series of glyphs, but does not implement
Skia can translate text character codes as a series of Glyphs, but does not implement
font substitution,
textual substitution, line layout, or contextual spacing like kerning pairs. Use
textual substitution, line layout, or contextual spacing like Kerning pairs. Use
a text shaping engine like #A HarfBuzz # http://harfbuzz.org/ ## to translate text runs
into glyph series.
@ -1571,7 +1572,7 @@ void draw(SkCanvas* canvas) {
#Method bool isVerticalText() const
If true, glyphs are drawn top to bottom instead of left to right.
If true, Glyphs are drawn top to bottom instead of left to right.
Equivalent to getFlags masked with kVerticalText_Flag.
@ -1628,8 +1629,8 @@ bold font face using the platform's Font_Manager.
Use Text_Skew_X to approximate an italic font style when the italic font face
is not available.
A FreeType-based port may define SK_USE_FREETYPE_EMBOLDEN at compile time to direct
the font engine to create the bold glyphs. Otherwise, the extra bold is computed
A FreeType based port may define SK_USE_FREETYPE_EMBOLDEN at compile time to direct
the font engine to create the bold Glyphs. Otherwise, the extra bold is computed
by increasing the stroke width and setting the Style to kStrokeAndFill_Style as needed.
Fake_Bold is disabled by default.
@ -1678,7 +1679,7 @@ void draw(SkCanvas* canvas) {
#Method void setFakeBoldText(bool fakeBoldText)
Use increased stroke width when creating glyph bitmaps to approximate bolding.
Use increased 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.
@ -1704,13 +1705,13 @@ void draw(SkCanvas* canvas) {
#Topic Full_Hinting_Spacing
#Alias Full_Hinting_Spacing # long winded enough -- maybe things with two underscores auto-aliased?
Full_Hinting_Spacing adjusts the character spacing by the difference of the
hinted and unhinted left and right side bearings,
if Hinting is set to kFull_Hinting. Full_Hinting_Spacing only
applies to platforms that use FreeType as their Font_Engine.
if Hinting is set to kFull_Hinting, Full_Hinting_Spacing adjusts the character
spacing by the difference of the hinted and Unhinted Left_Side_Bearing and
Right_Side_Bearing. Full_Hinting_Spacing only applies to platforms that use
FreeType as their Font_Engine.
Full_Hinting_Spacing is not related to text kerning, where the space between
a specific pair of characters is adjusted using data in the font's kerning tables.
Full_Hinting_Spacing is not related to text Kerning, where the space between
a specific pair of characters is adjusted using data in the font's Kerning tables.
#Method bool isDevKernText() const
@ -1760,8 +1761,8 @@ a specific pair of characters is adjusted using data in the font's kerning table
Filter_Quality trades speed for image filtering when the image is scaled.
A lower Filter_Quality draws faster, but has less fidelity.
A higher Filter_Quality draws slower, but looks better.
If the image is unscaled, the Filter_Quality choice will not result in a noticable
difference.
If the image is drawn without scaling, the Filter_Quality choice will not result
in a noticeable difference.
Filter_Quality is used in Paint passed as a parameter to
#List
@ -1846,7 +1847,7 @@ or stroked shape in a
32-bit value. Each component occupies 8-bits, ranging from zero: no contribution;
to 255: full intensity. All values in any combination are valid.
Color is not premultiplied;
Color is not Premultiplied;
Color_Alpha sets the transparency independent of Color_RGB: Color_RGB_Red, Color_RGB_Blue, and Color_RGB_Green.
The bit positions of Color_Alpha and Color_RGB are independent of the bit positions
@ -1875,7 +1876,7 @@ on the output device, which may have more or fewer bits, and may have a differen
#Method SkColor getColor() const
Retrieves Color_Alpha and Color_RGB, unpremultiplied, packed into 32 bits.
Retrieves Alpha and Color_RGB, Unpremultiplied, packed into 32 bits.
Use helpers SkColorGetA, SkColorGetR, SkColorGetG, and SkColorGetB to extract
a color component.
@ -1899,8 +1900,8 @@ on the output device, which may have more or fewer bits, and may have a differen
#Method void setColor(SkColor color)
Sets Color_Alpha and Color_RGB used when stroking and filling. The color is a 32-bit value,
unpremutiplied, packing 8-bit components for Color_Alpha, Color_RGB_Red, Color_RGB_Blue, and Color_RGB_Green.
Sets Alpha and Color_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 Color_ARGB ##
@ -1929,9 +1930,9 @@ Color_Alpha sets the transparency independent of Color_RGB: Color_RGB_Red, Color
#Method uint8_t getAlpha() const
Retrieves Color_Alpha from the Color used when stroking and filling.
Retrieves Alpha from the Color used when stroking and filling.
#Return Color_Alpha ranging from zero, fully transparent, to 255, fully opaque ##
#Return Alpha ranging from zero, fully transparent, to 255, fully opaque ##
#Example
SkPaint paint;
@ -1946,13 +1947,13 @@ Color_Alpha sets the transparency independent of Color_RGB: Color_RGB_Red, Color
#Method void setAlpha(U8CPU a)
Replaces Color_Alpha, leaving Color_RGB
Replaces Alpha, leaving Color_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 Color_Alpha component of Color ##
#Param a Alpha component of Color ##
#Example
SkPaint paint;
@ -1972,8 +1973,7 @@ Color_Alpha sets the transparency independent of Color_RGB: Color_RGB_Red, Color
#Method void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
Sets Color used when drawing solid fills. The color components range from 0 to 255.
The color is unpremultiplied;
Color_Alpha sets the transparency independent of Color_RGB.
The color is Unpremultiplied; Alpha sets the transparency independent of Color_RGB.
#Param a amount of Color_Alpha, from fully transparent (0) to fully opaque (255) ##
#Param r amount of Color_RGB_Red, from no red (0) to full red (255) ##
@ -2033,7 +2033,7 @@ Stroke_Width of zero has a special meaning and switches drawing to use Hairline.
Hairline draws the thinnest continuous frame. If kAntiAlias_Flag is clear, adjacent pixels
flow horizontally, vertically,or diagonally.
#ToDo what is the description of anti-aliased hairlines? ##
#ToDo what is the description of Anti-aliased hairlines? ##
Path drawing with Hairline may hit the same pixel more than once. For instance, Path containing
two lines in one Path_Contour will draw the corner point once, but may both lines may draw the adjacent
@ -2062,8 +2062,8 @@ a fill draw.
#Const kFill_Style 0
Set to fill geometry.
Applies to Rect, Region, Round_Rect, Circle, Oval, Path, and Text.
Bitmap, Image, Patch, Region, Sprite, and Vertices are painted as if
Applies to Rect, Region, Round_Rect, Circles, Ovals, Path, and Text.
Bitmap, Image, Patches, Region, Sprites, and Vertices are painted as if
kFill_Style is set, and ignore the set Style.
The Path_Fill_Type specifies additional rules to fill the area outside the path edge,
and to create an unfilled hole inside the shape.
@ -2072,16 +2072,15 @@ a fill draw.
#Const kStroke_Style 1
Set to stroke geometry.
Applies to Rect, Region, Round_Rect, Arc, Circle, Oval,
Path, and Text.
Arc, Line, Point, and Point_Array are always drawn as if kStroke_Style is set,
Applies to Rect, Region, Round_Rect, Arcs, Circles, Ovals, Path, and Text.
Arcs, Lines, and Points, are always drawn as if kStroke_Style is set,
and ignore the set Style.
The stroke construction is unaffected by the Path_Fill_Type.
##
#Const kStrokeAndFill_Style 2
Set to stroke and fill geometry.
Applies to Rect, Region, Round_Rect, Circle, Oval, Path, and Text.
Applies to Rect, Region, Round_Rect, Circles, Ovals, Path, and Text.
Path is treated as if it is set to SkPath::kWinding_FillType,
and the set Path_Fill_Type is ignored.
##
@ -2264,7 +2263,7 @@ Miter_Limit can be computed from the corner angle:
Miter_Limit default value is 4.
The default may be changed at compile time by setting SkPaintDefaults_MiterLimit
in SkUserConfig.h or as a define supplied by the build environment.
in "SkUserConfig.h" or as a define supplied by the build environment.
Here are some miter limits and the angles that triggers them.
#Table
@ -2673,8 +2672,8 @@ returns false since Hairline has no filled equivalent.
#Example
#Height 192
#Description
A very small quad stroke is turned into a filled path with increasing levels of precision.
At the lowest precision, the quad stroke is approximated by a rectangle.
A very small Quad stroke is turned into a filled path with increasing levels of precision.
At the lowest precision, the Quad stroke is approximated by a rectangle.
At the highest precision, the filled path has high fidelity compared to the original stroke.
##
void draw(SkCanvas* canvas) {
@ -3141,7 +3140,7 @@ If Paint has no Path_Effect, the path geometry is unaltered when filled or strok
# ------------------------------------------------------------------------------
#Topic Mask_Filter_Methods
Mask_Filter uses Color_Alpha of the shape drawn to create Mask_Alpha.
Mask_Filter uses coverage of the shape drawn to create Mask_Alpha.
Mask_Filter operates at a lower level than Rasterizer; Mask_Filter takes a Mask,
and returns a Mask.
Mask_Filter may change the geometry and transparency of the shape, such as creating a blur effect.
@ -3329,7 +3328,7 @@ and returns a Mask.
Rasterizer may change the geometry and transparency of the shape, such as
creating a shadow effect. Rasterizer forms the base of Rasterizer_Layer, which
creates effects like embossing and outlining.
Rasterizer applies to Rect, Region, Round_Rect, Arc, Circle, Oval,
Rasterizer applies to Rect, Region, Round_Rect, Arcs, Circles, Ovals,
Path, and Text.
#Example
@ -3450,7 +3449,7 @@ Image_Filter operates on the pixel representation of the shape, as modified by P
with Blend_Mode set to SkBlendMode::kSrcOver. Image_Filter creates a new bitmap,
which is drawn to the device using the set Blend_Mode.
Image_Filter is higher level than Mask_Filter; for instance, an Image_Filter
can operate on all channels of Color, while Mask_Filter generates Color_Alpha only.
can operate on all channels of Color, while Mask_Filter generates Alpha only.
Image_Filter operates independently of and can be used in combination with
Mask_Filter and Rasterizer.
@ -3690,11 +3689,11 @@ Deprecated.
##
Align adjusts the text relative to the text position.
Align affects glyphs drawn with: SkCanvas::drawText, SkCanvas::drawPosText,
Align affects Glyphs drawn with: SkCanvas::drawText, SkCanvas::drawPosText,
SkCanvas::drawPosTextH, SkCanvas::drawTextOnPath,
SkCanvas::drawTextOnPathHV, SkCanvas::drawTextRSXform, SkCanvas::drawTextBlob,
and SkCanvas::drawString;
as well as calls that place text glyphs like getTextWidths and getTextPath.
as well as calls that place text Glyphs like getTextWidths and getTextPath.
The text position is set by the font for both horizontal and vertical text.
Typically, for horizontal text, the position is to the left side of the glyph on the
@ -4105,7 +4104,7 @@ void draw(SkCanvas* canvas) {
# ------------------------------------------------------------------------------
#Topic Font_Metrics
Font_Metrics describe dimensions common to the glyphs in Typeface.
Font_Metrics describe dimensions common to the Glyphs in Typeface.
The dimensions are computed by Font_Manager from font data and do not take
Paint settings other than Text_Size into account.
@ -4195,7 +4194,7 @@ void draw(SkCanvas* canvas) {
FontMetrics is filled out by getFontMetrics. FontMetrics contents reflect the values
computed by Font_Manager using Typeface. Values are set to zero if they are
not availble.
not available.
fUnderlineThickness and fUnderlinePosition have a bit set in fFlags if their values
are valid, since their value may be zero.
@ -4271,12 +4270,12 @@ void draw(SkCanvas* canvas) {
##
#Member SkScalar fXMin
Minimum bounding box x value for all glyphs.
Minimum bounding box x value for all Glyphs.
Typically less than zero.
##
#Member SkScalar fXMax
Maximum bounding box x value for all glyphs.
Maximum bounding box x value for all Glyphs.
Typically greater than zero.
##
@ -4325,8 +4324,8 @@ void draw(SkCanvas* canvas) {
#Method bool hasUnderlineThickness(SkScalar* thickness) const
If Font_Metrics has a valid underline thickness, return true, and set
thickness to that value. If it doesn't, return false, and ignore
thickness.
thickness to that value. If the underline thickness is not valid,
return false, and ignore thickness.
#Param thickness storage for underline width ##
@ -4339,8 +4338,8 @@ void draw(SkCanvas* canvas) {
#Method bool hasUnderlinePosition(SkScalar* position) const
If Font_Metrics has a valid underline position, return true, and set
position to that value. If it doesn't, return false, and ignore
position.
position to that value. If the underline position is not valid,
return false, and ignore position.
#Param position storage for underline position ##
@ -4353,8 +4352,8 @@ void draw(SkCanvas* canvas) {
#Method bool hasStrikeoutThickness(SkScalar* thickness) const
If Font_Metrics has a valid strikeout thickness, return true, and set
thickness to that value. If it doesn't, return false, and ignore
thickness.
thickness to that value. If the underline thickness is not valid,
return false, and ignore thickness.
#Param thickness storage for strikeout width ##
@ -4367,8 +4366,8 @@ void draw(SkCanvas* canvas) {
#Method bool hasStrikeoutPosition(SkScalar* position) const
If Font_Metrics has a valid strikeout position, return true, and set
position to that value. If it doesn't, return false, and ignore
position.
position to that value. If the underline position is not valid,
return false, and ignore position.
#Param position storage for strikeout position ##
@ -4448,7 +4447,7 @@ void draw(SkCanvas* canvas) {
#Method SkRect getFontBounds() const
Returns the union of bounds of all glyphs.
Returns the union of bounds of all Glyphs.
Returned dimensions are computed by Font_Manager from font data,
ignoring Hinting. Includes Text_Size, Text_Scale_X,
and Text_Skew_X, but not Fake_Bold or Path_Effect.
@ -4457,7 +4456,7 @@ If Text_Size is large, Text_Scale_X is one, and Text_Skew_X is zero,
returns the same bounds as Font_Metrics { FontMetrics::fXMin,
FontMetrics::fTop, FontMetrics::fXMax, FontMetrics::fBottom }.
#Return union of bounds of all glyphs ##
#Return union of bounds of all Glyphs ##
#Example
SkPaint paint;
@ -4495,7 +4494,7 @@ If byteLength includes a partial character, the partial character is ignored.
If Text_Encoding is kUTF8_TextEncoding and
text contains an invalid UTF-8 sequence, zero is returned.
#Param text character stroage encoded with Text_Encoding ##
#Param text character storage encoded with Text_Encoding ##
#Param byteLength length of character storage in bytes ##
#Param glyphs storage for glyph indices; may be nullptr ##
@ -4520,14 +4519,14 @@ text contains an invalid UTF-8 sequence, zero is returned.
#Method int countText(const void* text, size_t byteLength) const
Returns the number of glyphs in text.
Uses Text_Encoding to count the glyphs.
Returns the number of Glyphs in text.
Uses Text_Encoding to count the Glyphs.
Returns the same result as textToGlyphs.
#Param text character stroage encoded with Text_Encoding ##
#Param text character storage encoded with Text_Encoding ##
#Param byteLength length of character storage in bytes ##
#Return number of glyphs represented by text of length byteLength ##
#Return number of Glyphs represented by text of length byteLength ##
#Example
SkPaint paint;
@ -4552,9 +4551,9 @@ text contains an invalid UTF-8 sequence, zero is returned.
returns true if all glyph indices in text are non-zero;
does not check to see if text contains valid glyph indices for Typeface.
Returns true if bytelength is zero.
Returns true if byteLength is zero.
#Param text array of characters or glyphs ##
#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 ##
@ -4781,7 +4780,7 @@ text contains an invalid UTF-8 sequence, zero is returned.
#Example
#Height 160
#Description
Bounds of glyphs increase for stroked text, but text advance remains the same.
Bounds of Glyphs increase for stroked text, but text advance remains the same.
The underlines show the text advance, spaced to keep them distinct.
##
void draw(SkCanvas* canvas) {
@ -4821,7 +4820,7 @@ text contains an invalid UTF-8 sequence, zero is returned.
# ------------------------------------------------------------------------------
#Topic Text_Path
Text_Path describes the geometry of glyphs used to draw text.
Text_Path describes the geometry of Glyphs used to draw text.
#Method void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y,
SkPath* path) const
@ -4836,7 +4835,7 @@ Uses x, y, and Text_Align to position path.
#Param length number of bytes of text ##
#Param x x-coordinate of the origin of the text ##
#Param y y-coordinate of the origin of the text ##
#Param path geometry of the glyphs ##
#Param path geometry of the Glyphs ##
#Example
#Description
@ -4872,12 +4871,12 @@ 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 ##
#Param path geometry of the Glyphs ##
#Example
#Height 85
#Description
Simplifies three glyphs to eliminate overlaps, and strokes the result.
Simplifies three Glyphs to eliminate overlaps, and strokes the result.
##
void draw(SkCanvas* canvas) {
SkPaint paint;
@ -4897,16 +4896,16 @@ pos contains a position for each glyph.
# ------------------------------------------------------------------------------
#Topic Text_Intercepts
Text_Intercepts describe the intersection of drawn text glyphs with a pair
Text_Intercepts describe the intersection of drawn text Glyphs with a pair
of lines parallel to the text advance. Text_Intercepts permits creating a
underline that skips descenders.
underline that skips Descenders.
#Method 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 return count is zero or a multiple of two, and is at most twice the number of Glyphs in
the string.
Uses Text_Encoding to decode text, Typeface to get the glyph paths,
and Text_Size, Fake_Bold, and Path_Effect to scale and modify the glyph paths.
@ -4928,7 +4927,7 @@ underline that skips descenders.
#Example
#Height 128
#Description
Underline uses intercepts to draw on either side of the glyph descender.
Underline uses intercepts to draw on either side of the glyph Descender.
##
void draw(SkCanvas* canvas) {
SkPaint paint;
@ -4959,7 +4958,7 @@ void draw(SkCanvas* canvas) {
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 return count is zero or a multiple of two, and is at most twice the number of Glyphs in
the string.
Uses Text_Encoding to decode text, Typeface to get the glyph paths,
and Text_Size, Fake_Bold, and Path_Effect to scale and modify the glyph paths.
@ -4979,7 +4978,7 @@ void draw(SkCanvas* canvas) {
#Example
#Description
Text intercepts draw on either side of, but not inside, glyphs in a run.
Text intercepts draw on either side of, but not inside, Glyphs in a run.
##
void draw(SkCanvas* canvas) {
SkPaint paint;
@ -5012,7 +5011,7 @@ void draw(SkCanvas* canvas) {
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 return count is zero or a multiple of two, and is at most twice the number of Glyphs in
the string.
Uses Text_Encoding to decode text, Typeface to get the glyph paths,
and Text_Size, Fake_Bold, and Path_Effect to scale and modify the glyph paths.
@ -5070,17 +5069,17 @@ void draw(SkCanvas* canvas) {
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 return count is zero or a multiple of two, and is at most twice the number of Glyphs in
the string.
Uses Text_Encoding to decode text, Typeface to get the glyph paths,
and Text_Size, Fake_Bold, and Path_Effect to scale and modify the glyph paths.
Uses pos array and Text_Align to position intervals.
Uses run array and Text_Align 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 blob glyphs, positions, and text paint attributes ##
#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 ##
@ -5127,8 +5126,8 @@ void draw(SkCanvas* canvas) {
Returns true if Paint prevents all drawing;
otherwise, the Paint may or may not allow drawing.
Returns true if Blend_Mode and Color_Alpha are enabled,
and computed Color_Alpha is zero.
Returns true if, for example, Blend_Mode combined with Color_Alpha computes a
new Alpha of zero.
#Return true if Paint prevents all drawing ##
@ -5187,13 +5186,13 @@ Paint may draw to.
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
rect parameter. It returns the adjusted bounds that can then be used
parameter. It returns the adjusted bounds that can then be used
for SkCanvas::quickReject tests.
The returned rect will either be orig or storage, thus the caller
The returned Rect will either be orig or storage, thus the caller
should not rely on storage being set to the result, but should always
use the retured value. It is legal for orig and storage to be the same
rect.
use the returned value. It is legal for orig and storage to be the same
Rect.
#Private
e.g.
@ -5231,8 +5230,9 @@ Paint may draw to.
(to be made private)
##
Take the style explicitly, so the caller can force us to be stroked
without having to make a copy of the paint just to change that field.
Computes the bounds, overriding the Paint Style. This can be used to
account for additional width required by stroking orig, without
altering Style set to fill.
#Param orig geometry modified by Paint when drawn ##
#Param storage computed bounds of geometry ##
@ -5252,9 +5252,11 @@ Paint may draw to.
macro expands to: void toString(SkString* str) const;
##
Converts Paint to machine parsable form in developer mode.
Creates string representation of Paint. The representation is read by
internal debugging tools. The interface and implementation may be
suppressed by defining SK_IGNORE_TO_STRING.
#Param str storage for string containing parsable Paint ##
#Param str storage for string representation of Paint ##
#Example
SkPaint paint;

View File

@ -16,7 +16,7 @@ the middle entry as the end of the first Line and the start of the second Line.
Path components Arc, Rect, Round_Rect, Circle, and Oval are composed of
Lines and Curves with as many Verbs and Points required
for an exact description. Once added to Path, these components may lose their
identity; although Path can be inspected to determine if it decribes a single
identity; although Path can be inspected to determine if it describes a single
Rect, Oval, Round_Rect, and so on.
#Example
@ -103,7 +103,7 @@ SkPath::kMove_Verb; each SkPath::kMove_Verb that follows starts a new Contour.
#Example
#Description
Each SkPath::moveTo starts a new Contour, and content after SkPath::close()
also starts a new Contour. Since SkPath::conicTo wasn't preceded by
also starts a new Contour. Since SkPath::conicTo is not preceded by
SkPath::moveTo, the first Point of the third Contour starts at the last Point
of the second Contour.
##
@ -188,10 +188,10 @@ Paths contain geometry. Paths may be empty, or contain one or more Verbs that
outline a figure. Path always starts with a move verb to a Cartesian
coordinate, and may be followed by additional verbs that add lines or curves.
Adding a close verb makes the geometry into a continuous loop, a closed contour.
Paths may contain any number of contours, each beginnning with a move verb.
Paths may contain any number of contours, each beginning with a move verb.
Path contours may contain only a move verb, or may also contain lines,
quadratic Beziers, conics, and cubic Beziers. Path contours may be open or
Quadratic_Beziers, Conics, and Cubic_Beziers. Path contours may be open or
closed.
When used to draw a filled area, Path describes whether the fill is inside or
@ -210,7 +210,7 @@ SkPath::updateBoundsCache to make Path thread safe.
# constants # description ##
#Legend ##
# AddPathMode # Sets addPath options. ##
# ArcSize # Sets arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y) options. ##
# ArcSize # Used by arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y).##
# Convexity # Returns if Path is convex or concave. ##
# Direction # Sets Contour clockwise or counterclockwise. ##
# FillType # Sets winding rule and inverse fill. ##
@ -279,8 +279,8 @@ SkPath::updateBoundsCache to make Path thread safe.
# countPoints # Returns Point_Array length. ##
# countVerbs # Returns Verb_Array length. ##
# cubicTo # Appends Cubic. ##
# dump() # Sends text representation using floats to stdout. ##
# dumpHex # Sends text representation using hexadecimal to stdout. ##
# dump() # Sends text representation using floats to standard output. ##
# dumpHex # Sends text representation using hexadecimal to standard output. ##
# getBounds # Returns maximum and minimum of Point_Array. ##
# getConvexity # Returns geometry convexity, computing if necessary. ##
# getConvexityOrUnknown # Returns geometry convexity if known. ##
@ -569,7 +569,7 @@ Releases ownership of any shared data and deletes data if Path is sole owner.
#Example
#Description
delete calls Path destructor, but copy of original in path2 is unaffected.
delete calls Path Destructor, but copy of original in path2 is unaffected.
##
void draw(SkCanvas* canvas) {
SkPath* path = new SkPath();
@ -596,7 +596,7 @@ Copying Paths by assignment is very efficient and never allocates memory.
Paths are always copied by value from the interface; the underlying shared
pointers are not exposed.
#Param path Verb_Array, Point_Array, Weights, amd Fill_Type to copy ##
#Param path Verb_Array, Point_Array, Weights, and Fill_Type to copy ##
#Return Path copied by value ##
@ -708,7 +708,7 @@ Return true if Paths contain equal Verbs and equal Weights.
If Paths contain one or more Conics, the Weights must match.
conicTo may add different Verbs depending on Conic_Weight, so it is not
trival to interpolate a pair of Paths containing Conics with different
trivial to interpolate a pair of Paths containing Conics with different
Conic_Weight values.
#Param compare Path to compare ##
@ -1289,7 +1289,7 @@ void draw(SkCanvas* canvas) {
unsigned* start = nullptr) const
Returns true if constructed by addRoundRect, addRRect; and if construction
is not empty, not Rect, and not Oval. Path constructed with other other calls
is not empty, not Rect, and not Oval. Path constructed with other calls
will not return true though Path draws Round_Rect.
rrect receives bounds of Round_Rect.
@ -1305,9 +1305,13 @@ Triggers performance optimizations on some GPU_Surface implementations.
#Param dir storage for Direction; may be nullptr ##
#Param start storage for start of Round_Rect; may be nullptr ##
#Return true for Round_Rect Path constructed by addRoundRect or addRRect ##
#Return true if Path contains only Round_Rect ##
#Example
#Description
Draw rounded rectangle and its bounds. Draw an arc indicating where the rounded
rectangle starts and its direction.
##
void draw(SkCanvas* canvas) {
SkPaint paint;
SkPath path;
@ -1343,7 +1347,7 @@ void draw(SkCanvas* canvas) {
#Method void reset()
Sets Path to its intial state.
Sets Path to its initial state.
Removes Verb_Array, Point_Array, and Weights, and sets FillType to kWinding_FillType.
Internal storage associated with Path is released.
@ -1364,7 +1368,7 @@ Internal storage associated with Path is released.
#Method void rewind()
Sets Path to its intial state, preserving internal storage.
Sets Path to its initial state, preserving internal storage.
Removes Verb_Array, Point_Array, and Weights, and sets FillType to kWinding_FillType.
Internal storage associated with Path is retained.
@ -1535,7 +1539,7 @@ Mark temporary paths, discarded or modified after use, as volatile
to inform Device that the path need not be cached.
Mark animating Path volatile to improve performance.
Mark unchanging Path non-volative to improve repeated rendering.
Mark unchanging Path non-volatile to improve repeated rendering.
Raster_Surface Path draws are affected by volatile for some shadows.
GPU_Surface Path draws are affected by volatile for some shadows and concave geometries.
@ -1582,8 +1586,8 @@ If false, returns true if p1 equals or nearly equals p2.
#Example
#Description
As single precision floats, 100 and 100.000001f have the same bit representation,
and are exactly equal. 100 and 100.0001f have different bit representations, and
As single precision floats, 100 and 100.000001 have the same bit representation,
and are exactly equal. 100 and 100.0001 have different bit representations, and
are not exactly equal, but are nearly equal.
##
void draw(SkCanvas* canvas) {
@ -1617,9 +1621,9 @@ Test if Quad is degenerate.
Quad with no length or that moves a very short distance is degenerate; it is
treated as a point.
#Param p1 quad start point ##
#Param p2 quad control point ##
#Param p3 quad end point ##
#Param p1 Quad start point ##
#Param p2 Quad control point ##
#Param p3 Quad end point ##
#Param exact if true, returns true only if p1, p2, and p3 are equal;
if false, returns true if p1, p2, and p3 are equal or nearly equal
##
@ -1628,9 +1632,9 @@ treated as a point.
#Example
#Description
As single precision floats: 100, 100.00001f, and 100.00002f have different bit representations
As single precision floats: 100, 100.00001, and 100.00002 have different bit representations
but nearly the same value. Translating all three by 1000 gives them the same bit representation;
the fractional portion of the number can't be represented by the float and is lost.
the fractional portion of the number can not be represented by the float and is lost.
##
void draw(SkCanvas* canvas) {
auto debugster = [](const SkPath& path, bool exact) -> void {
@ -1669,10 +1673,10 @@ Test if Cubic is degenerate.
Cubic with no length or that moves a very short distance is degenerate; it is
treated as a point.
#Param p1 cubic start point ##
#Param p2 cubic control point 1 ##
#Param p3 cubic control point 2 ##
#Param p4 cubic end point ##
#Param p1 Cubic start point ##
#Param p2 Cubic control point 1 ##
#Param p3 Cubic control point 2 ##
#Param p4 Cubic end point ##
#Param exact if true, returns true only if p1, p2, p3, and p4 are equal;
if false, returns true if p1, p2, p3, and p4 are equal or nearly equal
##
@ -1759,7 +1763,7 @@ second move is not line
Point_Array contains Points satisfying the allocated Points for
each Verb in Verb_Array. For instance, Path containing one Contour with Line
and Quad is described by Verb_Array: move to, line to, quad to; and
and Quad is described by Verb_Array: Verb::kMoveTo, Verb::kLineTo, Verb::kQuadTo; and
one Point for move, one Point for Line, two Points for Quad; totaling four Points.
Point_Array may be read directly from Path with getPoints, or inspected with
@ -1960,7 +1964,7 @@ Cached state is also exchanged. swap() internally exchanges pointers, so
it is lightweight and does not allocate memory.
swap() usage has largely been replaced by operator=(const SkPath& path).
Paths do not copy their content on assignment util they are written to,
Paths do not copy their content on assignment until they are written to,
making assignment as efficient as swap().
#Param other Path exchanged by value ##
@ -2163,7 +2167,7 @@ grows Path Verb_Array and Point_Array to contain extraPtCount additional Points.
May improve performance and use less memory by
reducing the number and size of allocations when creating Path.
#Param extraPtCount number of additional Points to preallocate ##
#Param extraPtCount number of additional Points to allocate ##
#Example
#Height 192
@ -2257,7 +2261,7 @@ void draw(SkCanvas* canvas) {
Adds beginning of Contour relative to Last_Point.
If Path is empty, starts Contour at (dx, dy).
Otherwise, start Contour at Last_Point offset by (dx, dy).
Function name stands for relative move to.
Function name stands for "relative move to".
#Param dx offset from Last_Point x to Contour start x ##
#Param dy offset from Last_Point y to Contour start y ##
@ -2365,7 +2369,7 @@ kClose_Verb, Last_Point is set to (0, 0) before adding Line.
Appends kMove_Verb to Verb_Array and (0, 0) to Point_Array, if needed;
then appends kLine_Verb to Verb_Array and Line end to Point_Array.
Line end is Last_Point plus Vector (dx, dy).
Function name stands for relative line to.
Function name stands for "relative line to".
#Param dx offset from Last_Point x to Line end x ##
#Param dy offset from Last_Point y to Line end y ##
@ -2395,8 +2399,10 @@ void draw(SkCanvas* canvas) {
# ------------------------------------------------------------------------------
#Topic Quad
#Substitute quads
#Alias Quad
#Alias Quads
#Alias Quadratic_Bezier
#Alias Quadratic_Beziers
Quad describes a quadratic Bezier, a second-order curve identical to a section
of a parabola. Quad begins at a start Point, curves towards a control Point,
@ -2529,7 +2535,7 @@ void draw(SkCanvas* canvas) {
control and Quad end to Point_Array.
Quad control is Last_Point plus Vector (dx1, dy1).
Quad end is Last_Point plus Vector (dx2, dy2).
Function name stands for relative quad to.
Function name stands for "relative quad to".
#Param dx1 offset from Last_Point x to Quad control x ##
#Param dy1 offset from Last_Point x to Quad control y ##
@ -2561,7 +2567,6 @@ void draw(SkCanvas* canvas) {
# ------------------------------------------------------------------------------
#Topic Conic
#Substitute conics
#Alias Conics
Conic describes a conical section: a piece of an ellipse, or a piece of a
@ -2573,9 +2578,8 @@ Each Conic in Path adds two Points and one Conic_Weight. Conic_Weights in Path
may be inspected with Iter, or with RawIter.
#Subtopic Weight
#Substitute weights
#Alias Weights
#Alias Conic_Weights
#Alias Weights
Weight determines both the strength of the control Point and the type of Conic.
If Weight is exactly one, then Conic is identical to Quad; it is always a
@ -2651,7 +2655,7 @@ done
##
##
If weight is greater than one, Conic is a hyperbolic segment. As w gets large,
If weight is greater than one, Conic is a hyperbolic segment. As weight gets large,
a hyperbolic segment can be approximated by straight lines connecting the
control Point with the end Points.
@ -2767,7 +2771,7 @@ void draw(SkCanvas* canvas) {
#Height 128
#Description
Conics and arcs use identical representations. As the arc sweep increases
the conic weight also increases, but remains smaller than one.
the Conic_Weight also increases, but remains smaller than one.
##
void draw(SkCanvas* canvas) {
SkPaint paint;
@ -2817,7 +2821,7 @@ void draw(SkCanvas* canvas) {
control is Last_Point plus Vector (dx1, dy1).
end is Last_Point plus Vector (dx2, dy2).
Function name stands for relative conic to.
Function name stands for "relative conic to".
#Param dx1 offset from Last_Point x to Conic control x ##
#Param dy1 offset from Last_Point x to Conic control y ##
@ -2849,10 +2853,12 @@ void draw(SkCanvas* canvas) {
# ------------------------------------------------------------------------------
#Topic Cubic
#Substitute cubics
#Alias Cubic
#Alias Cubics
#Alias Cubic_Bezier
#Alias Cubic_Beziers
Cubic describes a cubic Bezier, a third-order curve.
Cubic describes a Bezier curve segment described by a third-order polynomial.
Cubic begins at a start Point, curving towards the first control Point;
and curves from the end Point towards the second control Point.
@ -2970,7 +2976,7 @@ to Point_Array.
control and Cubic end to Point_Array.
Cubic control is Last_Point plus Vector (dx1, dy1).
Cubic end is Last_Point plus Vector (dx2, dy2).
Function name stands for relative cubic to.
Function name stands for "relative cubic to".
#Param x1 offset from Last_Point x to first Cubic control x ##
#Param y1 offset from Last_Point x to first Cubic control y ##
@ -3335,7 +3341,7 @@ Arc sweep is always less than 180 degrees. If radius is zero, or if
tangents are nearly parallel, arcTo appends Line from last Path Point to (x1, y1).
arcTo appends at most one Line and one Conic.
arcTo implements the functionality of PostScript_arct and HTML_Canvas_arcTo.
arcTo implements the functionality of PostScript_Arct and HTML_Canvas_ArcTo.
#Param x1 x common to pair of tangents ##
#Param y1 y common to pair of tangents ##
@ -3398,7 +3404,7 @@ Arc sweep is always less than 180 degrees. If radius is zero, or if
tangents are nearly parallel, arcTo appends Line from last Path Point to p1.
arcTo appends at most one Line and one Conic.
arcTo implements the functionality of PostScript_arct and HTML_Canvas_arcTo.
arcTo implements the functionality of PostScript_Arct and HTML_Canvas_ArcTo.
#Param p1 Point common to pair of tangents ##
#Param p2 end of second tangent ##
@ -3499,7 +3505,7 @@ void draw(SkCanvas* canvas) {
#Method void arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc,
Direction sweep, SkScalar x, SkScalar y)
Append Arc to Path. Arc is implemented by one or more Conic weighted to describe part of Oval
Append Arc to Path. Arc is implemented by one or more Conics weighted to describe part of Oval
with radii (rx, ry) rotated by xAxisRotate degrees. Arc curves from last Path Point to (x, y),
choosing one of four possible routes: clockwise or counterclockwise, and smaller or larger.
@ -3508,13 +3514,13 @@ or if last Path Point equals (x, y). arcTo scales radii (rx, ry) to fit last Pat
(x, y) if both are greater than zero but too small.
arcTo appends up to four Conic curves.
arcTo implements the functionatlity of SVG_Arc, although SVG sweep-flag value is
opposite the integer value of sweep; SVG sweep-flag uses 1 for clockwise, while kCW_Direction
arcTo implements the functionality of SVG_Arc, although SVG "sweep-flag" value is
opposite the integer value of sweep; SVG "sweep-flag" uses 1 for clockwise, while kCW_Direction
cast to int is zero.
#Param rx radius in x before x-axis rotation ##
#Param ry radius in y before x-axis rotation ##
#Param xAxisRotate x-axis rotation in degrees; positve values are clockwise ##
#Param xAxisRotate x-axis rotation in degrees; positive values are clockwise ##
#Param largeArc chooses smaller or larger Arc ##
#Param sweep chooses clockwise or counterclockwise Arc ##
#Param x end of Arc ##
@ -3557,15 +3563,15 @@ and smaller or larger.
Arc sweep is always less than 360 degrees. arcTo appends Line to xy if either radii are zero,
or if last Path Point equals (x, y). arcTo scales radii r to fit last Path Point and
xy if both are greater than zero but too small.
xy if both are greater than zero but too small to describe an arc.
arcTo appends up to four Conic curves.
arcTo implements the functionatlity of SVG_Arc, although SVG sweep-flag value is
opposite the integer value of sweep; SVG sweep-flag uses 1 for clockwise, while kCW_Direction
cast to int is zero.
arcTo implements the functionality of SVG_Arc, although SVG "sweep-flag" value is
opposite the integer value of sweep; SVG "sweep-flag" uses 1 for clockwise, while
kCW_Direction cast to int is zero.
#Param r radii in x and y before x-axis rotation ##
#Param xAxisRotate x-axis rotation in degrees; positve values are clockwise ##
#Param xAxisRotate x-axis rotation in degrees; positive values are clockwise ##
#Param largeArc chooses smaller or larger Arc ##
#Param sweep chooses clockwise or counterclockwise Arc ##
#Param xy end of Arc ##
@ -3594,8 +3600,8 @@ void draw(SkCanvas* canvas) {
Direction sweep, SkScalar dx, SkScalar dy)
Append Arc to Path, relative to last Path Point. Arc is implemented by one or
more Conic, weighted to describe part of Oval with radii (r.fX, r.fY) rotated by
xAxisRotate degrees. Arc curves from last Path Point (x0, y0) to
more Conic, weighted to describe part of Oval with radii (rx, ry) rotated by
xAxisRotate degrees. Arc curves from last Path Point (x0, y0) to end Point
#Formula
(x0 + dx, y0 + dy)
##
@ -3603,18 +3609,19 @@ xAxisRotate degrees. Arc curves from last Path Point (x0, y0) to
counterclockwise, and smaller or larger. If Path is empty, the start Arc Point
is (0, 0).
Arc sweep is always less than 360 degrees. arcTo appends Line to xy if either
radii are zero, or if last Path Point equals (x, y). arcTo scales radii r to fit
last Path Point and xy if both are greater than zero but too small.
Arc sweep is always less than 360 degrees. arcTo appends Line to end Point
if either radii are zero, or if last Path Point equals end Point.
arcTo scales radii (rx, ry) to fit last Path Point and end Point if both are
greater than zero but too small to describe an arc.
arcTo appends up to four Conic curves.
arcTo implements the functionatlity of SVG_Arc, although SVG sweep-flag value is
opposite the integer value of sweep; SVG sweep-flag uses 1 for clockwise, while
arcTo implements the functionality of SVG_Arc, although SVG "sweep-flag" value is
opposite the integer value of sweep; SVG "sweep-flag" uses 1 for clockwise, while
kCW_Direction cast to int is zero.
#Param rx radius in x before x-axis rotation ##
#Param ry radius in y before x-axis rotation ##
#Param xAxisRotate x-axis rotation in degrees; positve values are clockwise ##
#Param xAxisRotate x-axis rotation in degrees; positive values are clockwise ##
#Param largeArc chooses smaller or larger Arc ##
#Param sweep chooses clockwise or counterclockwise Arc ##
#Param dx x offset end of Arc from last Path Point ##
@ -3645,7 +3652,7 @@ void draw(SkCanvas* canvas) {
#Method void close()
Append kClose_Verb to Path. A closed Contour connects the first and last Point
with Line, forming a continous loop. Open and closed Contour draw the same
with Line, forming a continuous loop. Open and closed Contour draw the same
with SkPaint::kFill_Style. With SkPaint::kStroke_Style, open Contour draws
Paint_Stroke_Cap at Contour start and end; closed Contour draws
Paint_Stroke_Join at Contour start and end.
@ -3862,7 +3869,7 @@ void draw(SkCanvas* canvas) {
#Method bool isRect(SkRect* rect, bool* isClosed = nullptr, Direction* direction = nullptr) const
Returns true if Path is eqivalent to Rect when filled.
Returns true if Path is equivalent to Rect when filled.
If false: rect, isClosed, and direction are unchanged.
If true: rect, isClosed, and direction are written to if not nullptr.
@ -4466,7 +4473,7 @@ Add Contour created from Line array, adding
#Formula
count - 1
##
Line segments. Contour added starts at pt[0], then adds a line
Line segments. Contour added starts at pts[0], then adds a line
for every additional Point in pts array. If close is true,
appends kClose_Verb to Path, connecting pts[count - 1] and pts[0].
@ -5036,13 +5043,13 @@ for (int y = 2; y < 256; y += 9) {
#Method void dump(SkWStream* stream, bool forceClose, bool dumpAsHex) const
Writes text representation of Path to stream. If stream is nullptr, dump() writes to
stdout. Set forceClose to true to get
standard output. Set forceClose to true to get
edges used to fill Path. Set dumpAsHex true to get exact binary representations
of floating point numbers used in Point_Array and Conic_Weights.
#Param stream writable Stream receiving Path text representation; may be nullptr ##
#Param forceClose true if missing kClose_Verb is output ##
#Param dumpAsHex true if SkScalar values are written as hexidecimal ##
#Param dumpAsHex true if SkScalar values are written as hexadecimal ##
#Example
SkPath path;
@ -5084,7 +5091,7 @@ path.close();
#Method void dump() const
Writes text representation of Path to stdout. The representation may be
Writes text representation of Path to standard output. The representation may be
directly compiled as C++ code. Floating point values are written
with limited precision; it may not be possible to reconstruct original Path
from output.
@ -5113,7 +5120,7 @@ path is not equal to copy
#Method void dumpHex() const
Writes text representation of Path to stdout. The representation may be
Writes text representation of Path to standard output. The representation may be
directly compiled as C++ code. Floating point values are written
in hexadecimal to preserve their exact bit pattern. The output reconstructs the
original Path.

View File

@ -1,30 +1,24 @@
# external references that will be documented eventually ...
#External
DirectWrite TrueType Windows Linux Android
DirectWrite TrueType Windows Linux Android iOS
FreeType FreeType-based Harfbuzz
PostScript PostScript_arct
OS_X Core_Graphics Core_Text iOS
Descenders Kerning Unhinted
LCD RGB
Premultiplied Unpremultiplied
Unicode Unicode5 UTF-8 UTF-16 UTF-32 ASCII Unichar
HTML_Canvas HTML_Canvas_arcTo
API
CPU
GPU GPU-backed OpenGL Vulkan
NULL
RFC
Bezier Coons Cartesian
C C++
C C++ Destructor Subclasses
SaveLayerFlags # not external; need to add typedef support
SkUserConfig.h # not external, but still thinking about how markup refers to this
SkUserConfig # not external, but still thinking about how markup refers to this
SkXXX.h # ditto
Skia # ditto
SK_USE_FREETYPE_EMBOLDEN # ditto
SK_SUPPORT_LEGACY_PAINT_TEXTDECORATION # ditto
SK_BUILD_FOR_ANDROID_FRAMEWORK # ditto
Developer_Mode # ditto
Draw_Layer # ditto
Raster_Engine # ditto
SK_IGNORE_TO_STRING # ditto
# FreeType related
FT_LOAD_TARGET_LIGHT
@ -36,8 +30,18 @@ FT_Load_Glyph
#External ##
#Topic Alias
#Alias Aliased
#Alias Aliasing
##
#Topic Anti-alias
#Alias Anti-aliased
#Alias Anti-aliasing
##
#Topic Arc
#Substitute arcs
#Alias Arcs
#Topic ##
#Topic BBH_Factory
@ -64,7 +68,7 @@ FT_Load_Glyph
#Topic ##
#Topic Circle
#Substitute circles
#Alias Circles
#Topic ##
#Topic Clip_Op
@ -103,18 +107,18 @@ FT_Load_Glyph
#Const SK_ColorWHITE 0xFFFFFFFF
##
#Subtopic Alpha
#Substitute alpha
#Alias Alpha
#Subtopic ##
#Subtopic RGB
#Substitute RGB
#Subtopic Red
#Substitute red
#Alias Red
#Subtopic ##
#Subtopic Blue
#Substitute blue
#Alias Blue
#Subtopic ##
#Subtopic Green
#Substitute green
#Alias Green
#Subtopic ##
#Subtopic ##
#Subtopic ARGB
@ -139,6 +143,14 @@ FT_Load_Glyph
#Topic Color_Space
##
#Topic Core_Graphics
#Substitute Core Graphics
##
#Topic Core_Text
#Substitute Core Text
##
#Topic Curve
#Alias Curves
##
@ -166,6 +178,9 @@ FT_Load_Glyph
##
##
#Topic Draw_Layer
##
#Topic Draw_Looper
#Class SkDrawLooper
#Class ##
@ -207,6 +222,7 @@ FT_Load_Glyph
#Topic ##
#Topic Glyph
#Alias Glyphs
##
#Topic GPU_Context
@ -217,6 +233,13 @@ FT_Load_Glyph
#Substitute GPU surface
##
#Topic HTML_Canvas
#Substitute HTML Canvas
#Subtopic ArcTo
#Substitute HTML Canvas arcTo
##
##
#Topic Image
#Subtopic Alpha_Type
#Enum SkAlphaType
@ -277,8 +300,10 @@ FT_Load_Glyph
##
##
#Topic Left_Side_Bearing
##
#Topic Line
#Substitute lines
#Alias Lines
#Topic ##
@ -324,8 +349,12 @@ FT_Load_Glyph
#Typedef ##
#Topic ##
#Topic OS_X
#Substitute OS X
##
#Topic Oval
#Substitute ovals
#Alias Ovals
#Topic ##
#Topic Paint_Defaults
@ -340,7 +369,7 @@ FT_Load_Glyph
#Topic ##
#Topic Patch
#Substitute patches
#Alias Patches
#Topic ##
#Topic Path_Effect
@ -395,6 +424,20 @@ FT_Load_Glyph
#Subtopic ##
#Topic ##
#Topic PostScript
#Substitute PostScript
#Subtopic Arct
#Substitute PostScript arct
##
##
#Topic Premultiply
#Alias Premultiplied
##
#Topic Raster_Engine
##
#Topic Raster_Handle_Allocator
#Class SkRasterHandleAllocator
#Struct Rec
@ -437,6 +480,9 @@ FT_Load_Glyph
##
#Topic ##
#Topic Right_Side_Bearing
##
#Topic Round_Rect
#Class SkRRect
#Method void dump() const
@ -466,7 +512,7 @@ FT_Load_Glyph
#Topic ##
#Topic Sprite
#Substitute sprites
#Alias Sprites
#Topic ##
#Topic Stream
@ -479,6 +525,9 @@ FT_Load_Glyph
#Class ##
#Topic ##
#Topic Supersampling
##
#Topic Surface
#Class SkSurface
#Method static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo&, void* pixels, size_t rowBytes,
@ -517,13 +566,16 @@ FT_Load_Glyph
#Class ##
#Topic ##
#Topic Unpremultiply
#Alias Unpremultiplied
##
#Topic Vector
#Struct SkVector
##
##
#Topic Vertices
#Substitute vertices
#Subtopic Colors
##
#Subtopic Texs

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,7 @@ algorithms that alter the drawing geometry, color, and transparency. For instanc
The objects contained by <a href="#Paint">Paint</a> are opaque, and cannot be edited outside of the <a href="#Paint">Paint</a>
to affect it. The implementation is free to defer computations associated with the
<a href="#Paint">Paint</a>, or ignore them altogether. For instance, some <a href="undocumented#GPU">GPU</a> implementations draw all
<a href="SkPath_Reference#Path">Path</a> geometries with anti-aliasing, regardless of how <a href="#SkPaint_kAntiAlias_Flag">SkPaint::kAntiAlias Flag</a>
<a href="SkPath_Reference#Path">Path</a> geometries with <a href="undocumented#Anti_alias">Anti-aliasing</a>, regardless of how <a href="#SkPaint_kAntiAlias_Flag">SkPaint::kAntiAlias Flag</a>
is set in <a href="#Paint">Paint</a>.
<a href="#Paint">Paint</a> describes a single color, a single font, a single image quality, and so on.
@ -37,14 +37,14 @@ Multiple colors are drawn either by using multiple paints or with objects like
| topics | description |
| --- | --- |
| <a href="#Initializers">Initializers</a> | Constructors and initialization. |
| <a href="#Destructor">Destructor</a> | <a href="#Paint">Paint</a> termination. |
| <a href="undocumented#Destructor">Destructor</a> | <a href="#Paint">Paint</a> termination. |
| <a href="#Management">Management</a> | <a href="#Paint">Paint</a> copying, moving, comparing. |
| <a href="#SkPaint_Hinting">Hinting</a> | <a href="undocumented#Glyph">Glyph</a> outline adjustment. |
| <a href="#SkPaint_Flags">Flags</a> | Attributes represented by single bits. |
| <a href="SkPaint_Reference#Anti_alias">Anti-alias</a> | Approximating coverage with transparency. |
| <a href="#Dither">Dither</a> | Distributing color error. |
| <a href="#Device_Text">Device Text</a> | Increase precision of glyph position. |
| <a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a> | Custom-sized bitmap glyphs. |
| <a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a> | Custom sized bitmap <a href="#Glyph">Glyphs</a>. |
| <a href="#Automatic_Hinting">Automatic Hinting</a> | Always adjust glyph paths. |
| <a href="#Vertical_Text">Vertical Text</a> | Orient text from top to bottom. |
| <a href="#Fake_Bold">Fake Bold</a> | Approximate font styles. |
@ -70,12 +70,12 @@ Multiple colors are drawn either by using multiple paints or with objects like
| <a href="#Text_Size">Text Size</a> | Overall height in points. |
| <a href="#Text_Scale_X">Text Scale X</a> | <a href="undocumented#Text">Text</a> horizontal scale. |
| <a href="#Text_Skew_X">Text Skew X</a> | <a href="undocumented#Text">Text</a> horizontal slant. |
| <a href="#Text_Encoding">Text Encoding</a> | <a href="undocumented#Text">Text</a> encoded as characters or glyphs. |
| <a href="#Text_Encoding">Text Encoding</a> | <a href="undocumented#Text">Text</a> encoded as characters or <a href="#Glyph">Glyphs</a>. |
| <a href="#Font_Metrics">Font Metrics</a> | Common glyph dimensions. |
| <a href="#Measure_Text">Measure Text</a> | Width, height, bounds of text. |
| <a href="#Text_Path">Text Path</a> | Geometry of glyphs. |
| <a href="#Text_Path">Text Path</a> | Geometry of <a href="#Glyph">Glyphs</a>. |
| <a href="#Text_Intercepts">Text Intercepts</a> | Advanced underline, strike through. |
| <a href="#Fast_Bounds">Fast Bounds</a> | Appproxiate area required by <a href="#Paint">Paint</a>. |
| <a href="#Fast_Bounds">Fast Bounds</a> | Approximate area required by <a href="#Paint">Paint</a>. |
## <a name="Constants"></a> Constants
@ -122,12 +122,12 @@ Multiple colors are drawn either by using multiple paints or with objects like
| <a href="#SkPaint_canComputeFastBounds">canComputeFastBounds</a> | Returns true if settings allow for fast bounds computation. |
| <a href="#SkPaint_computeFastBounds">computeFastBounds</a> | Returns fill bounds for quick reject tests. |
| <a href="#SkPaint_computeFastStrokeBounds">computeFastStrokeBounds</a> | Returns stroke bounds for quick reject tests. |
| <a href="#SkPaint_containsText">containsText</a> | Returns if all text corresponds to glyphs. |
| <a href="#SkPaint_countText">countText</a> | Returns number of glyphs in text. |
| <a href="#SkPaint_containsText">containsText</a> | Returns if all text corresponds to <a href="#Glyph">Glyphs</a>. |
| <a href="#SkPaint_countText">countText</a> | Returns number of <a href="#Glyph">Glyphs</a> in text. |
| <a href="#SkPaint_doComputeFastBounds">doComputeFastBounds</a> | Returns bounds for quick reject tests. |
| <a href="#SkPaint_flatten">flatten</a> | Serializes into a buffer. |
| <a href="#SkPaint_getAlpha">getAlpha</a> | Returns <a href="#Alpha">Color Alpha</a>, color opacity. |
| <a href="#SkPaint_getBlendMode">getBlendMode</a> | Returns <a href="undocumented#Blend_Mode">Blend Mode</a>, how colors combine with dest. |
| <a href="#SkPaint_getBlendMode">getBlendMode</a> | Returns <a href="undocumented#Blend_Mode">Blend Mode</a>, how colors combine with <a href="undocumented#Device">Device</a>. |
| <a href="#SkPaint_getColor">getColor</a> | Returns <a href="#Alpha">Color Alpha</a> and <a href="#RGB">Color RGB</a>, one drawing color. |
| <a href="#SkPaint_getColorFilter">getColorFilter</a> | Returns <a href="undocumented#Color_Filter">Color Filter</a>, how colors are altered. |
| <a href="#SkPaint_getDrawLooper">getDrawLooper</a> | Returns <a href="undocumented#Draw_Looper">Draw Looper</a>, multiple layers. |
@ -162,9 +162,9 @@ Multiple colors are drawn either by using multiple paints or with objects like
| <a href="#SkPaint_getTextSize">getTextSize</a> | Returns text size in points. |
| <a href="#SkPaint_getTextWidths">getTextWidths</a> | Returns advance and bounds for each glyph in text. |
| <a href="#SkPaint_getTypeface">getTypeface</a> | Returns <a href="undocumented#Typeface">Typeface</a>, font description. |
| <a href="#SkPaint_glyphsToUnichars">glyphsToUnichars</a> | Converts glyphs into text. |
| <a href="#SkPaint_glyphsToUnichars">glyphsToUnichars</a> | Converts <a href="#Glyph">Glyphs</a> into text. |
| <a href="#SkPaint_isAntiAlias">isAntiAlias</a> | Returns true if <a href="SkPaint_Reference#Anti_alias">Anti-alias</a> is set. |
| <a href="#SkPaint_isAutohinted">isAutohinted</a> | Returns true if glyphs are always hinted. |
| <a href="#SkPaint_isAutohinted">isAutohinted</a> | Returns true if <a href="#Glyph">Glyphs</a> are always hinted. |
| <a href="#SkPaint_isDevKernText">isDevKernText</a> | Returns true if <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> is set. |
| <a href="#SkPaint_isDither">isDither</a> | Returns true if <a href="#Dither">Dither</a> is set. |
| <a href="#SkPaint_isEmbeddedBitmapText">isEmbeddedBitmapText</a> | Returns true if <a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a> is set. |
@ -187,7 +187,7 @@ Multiple colors are drawn either by using multiple paints or with objects like
| <a href="#SkPaint_setAlpha">setAlpha</a> | Sets <a href="#Alpha">Color Alpha</a>, color opacity. |
| <a href="#SkPaint_setAntiAlias">setAntiAlias</a> | Sets or clears <a href="SkPaint_Reference#Anti_alias">Anti-alias</a>. |
| <a href="#SkPaint_setARGB">setARGB</a> | Sets color by component. |
| <a href="#SkPaint_setAutohinted">setAutohinted</a> | Sets glyphs to always be hinted. |
| <a href="#SkPaint_setAutohinted">setAutohinted</a> | Sets <a href="#Glyph">Glyphs</a> to always be hinted. |
| <a href="#SkPaint_setBlendMode">setBlendMode</a> | Sets <a href="undocumented#Blend_Mode">Blend Mode</a>, how colors combine with destination. |
| <a href="#SkPaint_setColor">setColor</a> | Sets <a href="#Alpha">Color Alpha</a> and <a href="#RGB">Color RGB</a>, one drawing color. |
| <a href="#SkPaint_setColorFilter">setColorFilter</a> | Sets <a href="undocumented#Color_Filter">Color Filter</a>, alters color. |
@ -219,7 +219,7 @@ Multiple colors are drawn either by using multiple paints or with objects like
| <a href="#SkPaint_setTypeface">setTypeface</a> | Sets <a href="undocumented#Typeface">Typeface</a>, font description. |
| <a href="#SkPaint_setVerticalText">setVerticalText</a> | Sets or clears <a href="#Vertical_Text">Vertical Text</a>. |
| <a href="#SkPaint_textToGlyphs">textToGlyphs</a> | Converts text into glyph indices. |
| <a href="#SkPaint_toString">toString</a> | Converts <a href="#Paint">Paint</a> to machine parsable form (<a href="undocumented#Developer_Mode">Developer Mode</a>) |
| <a href="#SkPaint_toString">toString</a> | Converts <a href="#Paint">Paint</a> to machine readable form. |
| <a href="#SkPaint_unflatten">unflatten</a> | Populates from a serialized stream. |
# <a name="Initializers"></a> Initializers
@ -270,7 +270,7 @@ Constructs <a href="#Paint">Paint</a> with default values.
| <a href="#Vertical_Text">Vertical Text</a> | false |
The flags, text size, hinting, and miter limit may be overridden at compile time by defining
paint default values. The overrides may be included in <a href="undocumented#SkUserConfig.h">SkUserConfig.h</a> or predefined by the
paint default values. The overrides may be included in "<a href="undocumented#SkUserConfig">SkUserConfig</a>.h" or predefined by the
build system.
### Return Value
@ -643,7 +643,7 @@ by the client.
### Parameters
<table> <tr> <td><a name="SkPaint_unflatten_buffer"> <code><strong>buffer </strong></code> </a></td> <td>
serialized data to <a href="#SkPaint_unflatten">unflatten</a></td>
serialized data describing <a href="#Paint">Paint</a> content</td>
</tr>
</table>
@ -683,7 +683,7 @@ to 26.6 fractional pixels.</td>
With <a href="undocumented#FreeType">FreeType</a>, this is equivalent in spirit to the
<a href="undocumented#FT_LOAD_TARGET_LIGHT">FT LOAD TARGET LIGHT</a> value supplied to <a href="undocumented#FT_Load_Glyph">FT Load Glyph</a>. It chooses a
lighter hinting algorithm for non-monochrome modes.
Generated glyphs may be fuzzy but better resemble their original shape.</td>
Generated <a href="#Glyph">Glyphs</a> may be fuzzy but better resemble their original shape.</td>
</tr>
<tr>
<td><a name="SkPaint_kNormal_Hinting"> <code><strong>SkPaint::kNormal_Hinting </strong></code> </a></td><td>2</td><td>Modifies glyph outlines to improve constrast. This is the default.
@ -747,9 +747,9 @@ Does not check for valid values of <a href="#SkPaint_setHinting_hintingLevel">hi
| <a href="#Hinting">Hinting</a> | value | effect on generated glyph outlines |
| --- | --- | --- |
| <a href="#SkPaint_kNo_Hinting">kNo Hinting</a> | 0 | leaves glyph outlines unchanged from their native representation |
| <a href="#SkPaint_kSlight_Hinting">kSlight Hinting</a> | 1 | modifies glyph outlines minimally to improve constrast |
| <a href="#SkPaint_kNormal_Hinting">kNormal Hinting</a> | 2 | modifies glyph outlines to improve constrast |
| <a href="#SkPaint_kFull_Hinting">kFull Hinting</a> | 3 | modifies glyph outlines for maxiumum constrast |
| <a href="#SkPaint_kSlight_Hinting">kSlight Hinting</a> | 1 | modifies glyph outlines minimally to improve contrast |
| <a href="#SkPaint_kNormal_Hinting">kNormal Hinting</a> | 2 | modifies glyph outlines to improve contrast |
| <a href="#SkPaint_kFull_Hinting">kFull Hinting</a> | 3 | modifies glyph outlines for maximum contrast |
### Parameters
@ -929,17 +929,17 @@ paint.isDither()
If <a href="#SkPaint_kAntiAlias_Flag">kAntiAlias Flag</a> is clear, pixel centers contained by the shape edge are drawn opaque.
If <a href="#SkPaint_kAntiAlias_Flag">kAntiAlias Flag</a> is set, pixels are drawn with <a href="#Alpha">Color Alpha</a> equal to their coverage.
The rule for aliased pixels is inconsistent across platforms. A shape edge
The rule for <a href="#Alias">Aliased</a> pixels is inconsistent across platforms. A shape edge
passing through the pixel center may, but is not required to, draw the pixel.
<a href="undocumented#Raster_Engine">Raster Engine</a> draws aliased pixels whose centers are on or to the right of the start of an
<a href="undocumented#Raster_Engine">Raster Engine</a> draws <a href="#Alias">Aliased</a> pixels whose centers are on or to the right of the start of an
active <a href="SkPath_Reference#Path">Path</a> edge, and whose center is to the left of the end of the active <a href="SkPath_Reference#Path">Path</a> edge.
A platform may only support anti-aliased drawing. Some <a href="undocumented#GPU_backed">GPU-backed</a> platforms use
supersampling to anti-alias all drawing, and have no mechanism to selectively
alias.
A platform may only support <a href="undocumented#Anti_alias">Anti-aliased</a> drawing. Some <a href="undocumented#GPU_backed">GPU-backed</a> platforms use
<a href="undocumented#Supersampling">Supersampling</a> to <a href="SkPaint_Reference#Anti_alias">Anti-alias</a> all drawing, and have no mechanism to selectively
<a href="undocumented#Alias">Alias</a>.
The amount of coverage computed for anti-aliased pixels also varies across platforms.
The amount of coverage computed for <a href="undocumented#Anti_alias">Anti-aliased</a> pixels also varies across platforms.
<a href="SkPaint_Reference#Anti_alias">Anti-alias</a> is disabled by default.
<a href="SkPaint_Reference#Anti_alias">Anti-alias</a> can be enabled by default by setting <a href="undocumented#SkPaintDefaults_Flags">SkPaintDefaults Flags</a> to <a href="#SkPaint_kAntiAlias_Flag">kAntiAlias Flag</a>
@ -949,8 +949,8 @@ at compile time.
<div><fiddle-embed name="a6575a49467ce8d28bb01cc7638fa04d"><div>A red line is drawn with transparency on the edges to make it look smoother.
A blue line draws only where the pixel centers are contained.
The lines are drawn into an offscreen bitmap, then drawn magified to make the
aliasing easier to see.</div></fiddle-embed></div>
The lines are drawn into <a href="undocumented#Bitmap">Bitmap</a>, then drawn magnified to make the
<a href="#Alias">Aliasing</a> easier to see.</div></fiddle-embed></div>
<a name="SkPaint_isAntiAlias"></a>
## isAntiAlias
@ -1017,7 +1017,7 @@ paint1 == paint2
---
# <a name="Dither"></a> Dither
<a href="#Dither">Dither</a> increases fidelity by adjusting the color of adjcent pixels.
<a href="#Dither">Dither</a> increases fidelity by adjusting the color of adjacent pixels.
This can help to smooth color transitions and reducing banding in gradients.
Dithering lessens visible banding from <a href="undocumented#SkColorType">kRGB 565 SkColorType</a>
and <a href="undocumented#SkColorType">kRGBA 8888 SkColorType</a> gradients,
@ -1120,7 +1120,7 @@ Gradient <a href="undocumented#RGB_565">Color RGB-565</a>
When set, <a href="#SkPaint_Flags">Flags</a> <a href="#SkPaint_kLCDRenderText_Flag">kLCDRenderText Flag</a> takes advantage of the organization of <a href="#RGB">Color RGB</a> stripes that
create a color, and relies
on the small size of the stripe and visual perception to make the color fringing inperceptible.
on the small size of the stripe and visual perception to make the color fringing imperceptible.
<a href="SkPaint_Reference#LCD_Text">LCD Text</a> can be enabled on devices that orient stripes horizontally or vertically, and that order
the color components as <a href="#RGB">Color RGB</a> or <a href="#RBG">Color RBG</a>.
@ -1136,8 +1136,8 @@ Either or both techniques can be enabled.
### Example
<div><fiddle-embed name="4606ae1be792d6bc46d496432f050ee9"><div>Four commas are drawn normally and with combinations of <a href="SkPaint_Reference#LCD_Text">LCD Text</a> and <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a>.
When <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a> is disabled, the comma glyphs are indentical, but not evenly spaced.
When <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a> is enabled, the comma glyphs are unique, but appear evenly spaced.</div></fiddle-embed></div>
When <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a> is disabled, the comma <a href="#Glyph">Glyphs</a> are identical, but not evenly spaced.
When <a href="SkPaint_Reference#Subpixel_Text">Subpixel Text</a> is enabled, the comma <a href="#Glyph">Glyphs</a> are unique, but appear evenly spaced.</div></fiddle-embed></div>
## <a name="Linear_Text"></a> Linear Text
@ -1213,7 +1213,7 @@ of the color increases, the edge of the glyph appears to move towards the outsid
bool isSubpixelText() const
</pre>
If true, glyphs at different sub-pixel positions may differ on pixel edge coverage.
If true, <a href="#Glyph">Glyphs</a> at different sub-pixel positions may differ on pixel edge coverage.
Equivalent to <a href="#SkPaint_getFlags">getFlags</a> masked with <a href="#SkPaint_kSubpixelText_Flag">kSubpixelText Flag</a>.
@ -1243,7 +1243,7 @@ paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)
void setSubpixelText(bool subpixelText)
</pre>
Requests, but does not require, that glyphs respect sub-pixel positioning.
Requests, but does not require, that <a href="#Glyph">Glyphs</a> respect sub-pixel positioning.
Sets <a href="#SkPaint_kSubpixelText_Flag">kSubpixelText Flag</a> if <a href="#SkPaint_setSubpixelText_subpixelText">subpixelText</a> is true.
Clears <a href="#SkPaint_kSubpixelText_Flag">kSubpixelText Flag</a> if <a href="#SkPaint_setSubpixelText_subpixelText">subpixelText</a> is false.
@ -1273,7 +1273,7 @@ paint1 == paint2
When set, <a href="#SkPaint_Flags">Flags</a> <a href="#SkPaint_kLCDRenderText_Flag">kLCDRenderText Flag</a> takes advantage of the organization of <a href="#RGB">Color RGB</a> stripes that
create a color, and relies
on the small size of the stripe and visual perception to make the color fringing inperceptible.
on the small size of the stripe and visual perception to make the color fringing imperceptible.
<a href="SkPaint_Reference#LCD_Text">LCD Text</a> can be enabled on devices that orient stripes horizontally or vertically, and that order
the color components as <a href="#RGB">Color RGB</a> or <a href="#RBG">Color RBG</a>.
@ -1284,7 +1284,7 @@ the color components as <a href="#RGB">Color RGB</a> or <a href="#RBG">Color RBG
bool isLCDRenderText() const
</pre>
If true, glyphs may use <a href="undocumented#LCD">LCD</a> striping to improve glyph edges.
If true, <a href="#Glyph">Glyphs</a> may use <a href="undocumented#LCD">LCD</a> striping to improve glyph edges.
Returns true if <a href="#SkPaint_Flags">Flags</a> <a href="#SkPaint_kLCDRenderText_Flag">kLCDRenderText Flag</a> is set.
@ -1314,7 +1314,7 @@ paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)
void setLCDRenderText(bool lcdText)
</pre>
Requests, but does not require, that glyphs use <a href="undocumented#LCD">LCD</a> striping for glyph edges.
Requests, but does not require, that <a href="#Glyph">Glyphs</a> use <a href="undocumented#LCD">LCD</a> striping for glyph edges.
Sets <a href="#SkPaint_kLCDRenderText_Flag">kLCDRenderText Flag</a> if <a href="#SkPaint_setLCDRenderText_lcdText">lcdText</a> is true.
Clears <a href="#SkPaint_kLCDRenderText_Flag">kLCDRenderText Flag</a> if <a href="#SkPaint_setLCDRenderText_lcdText">lcdText</a> is false.
@ -1341,7 +1341,7 @@ paint1 == paint2
---
# <a name="Font_Embedded_Bitmaps"></a> Font Embedded Bitmaps
<a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a> allows selecting custom-sized bitmap glyphs.
<a href="SkPaint_Reference#Font_Embedded_Bitmaps">Font Embedded Bitmaps</a> allows selecting custom sized bitmap <a href="#Glyph">Glyphs</a>.
<a href="#SkPaint_Flags">Flags</a> <a href="#SkPaint_kEmbeddedBitmapText_Flag">kEmbeddedBitmapText Flag</a> when set chooses an embedded bitmap glyph over an outline contained
in a font if the platform supports this option.
@ -1357,10 +1357,11 @@ the outline glyph if <a href="#SkPaint_kEmbeddedBitmapText_Flag">kEmbeddedBitmap
### Example
<pre style="padding: 1em 1em 1em 1em;width: 44em; background-color: #f0f0f0">
!fiddle<div>The hintgasp <a href="undocumented#TrueType">TrueType</a> font in the <a href="undocumented#Skia">Skia</a> resources/fonts directory includes an embedded
bitmap glyph at odd font sizes. This example works on platforms that use <a href="undocumented#FreeType">FreeType</a>
as their <a href="#Engine">Font Engine</a>.
<a href="undocumented#Windows">Windows</a> may, but is not required to, return a bitmap glyph if <a href="#SkPaint_kEmbeddedBitmapText_Flag">kEmbeddedBitmapText Flag</a> is set.</div><a href="undocumented#SkBitmap">SkBitmap</a> bitmap;
<div>The "" <a href="undocumented#TrueType">TrueType</a> font in the <a href="undocumented#Skia">Skia</a> resources/fonts directory
includes an embedded bitmap <a href="undocumented#Glyph">Glyph</a> at odd font sizes. This example works
on platforms that use <a href="undocumented#FreeType">FreeType</a> as their <a href="#Engine">Font Engine</a>.
<a href="undocumented#Windows">Windows</a> may, but is not required to, return a bitmap glyph if
<a href="#SkPaint_kEmbeddedBitmapText_Flag">kEmbeddedBitmapText Flag</a> is set.</div><a href="undocumented#SkBitmap">SkBitmap</a> bitmap;
bitmap.allocN32Pixels(30, 15);
bitmap.eraseColor(0);
<a href="SkCanvas_Reference#SkCanvas">SkCanvas</a> offscreen(bitmap);
@ -1374,7 +1375,7 @@ paint.</pre>
bool isEmbeddedBitmapText() const
</pre>
If true, <a href="#Engine">Font Engine</a> may return glyphs from font bitmaps instead of from outlines.
If true, <a href="#Engine">Font Engine</a> may return <a href="#Glyph">Glyphs</a> from font bitmaps instead of from outlines.
Equivalent to <a href="#SkPaint_getFlags">getFlags</a> masked with <a href="#SkPaint_kEmbeddedBitmapText_Flag">kEmbeddedBitmapText Flag</a>.
@ -1432,7 +1433,7 @@ paint1 == paint2
# <a name="Automatic_Hinting"></a> Automatic Hinting
If <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kNormal_Hinting">kNormal Hinting</a> or <a href="#SkPaint_kFull_Hinting">kFull Hinting</a>, <a href="#Automatic_Hinting">Automatic Hinting</a>
instructs the <a href="undocumented#Font_Manager">Font Manager</a> to always hint glyphs.
instructs the <a href="undocumented#Font_Manager">Font Manager</a> to always hint <a href="#Glyph">Glyphs</a>.
<a href="#Automatic_Hinting">Automatic Hinting</a> has no effect if <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kNo_Hinting">kNo Hinting</a> or
<a href="#SkPaint_kSlight_Hinting">kSlight Hinting</a>.
@ -1447,7 +1448,7 @@ bool isAutohinted() const
If true, and if <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kNormal_Hinting">kNormal Hinting</a> or <a href="#SkPaint_kFull_Hinting">kFull Hinting</a>, and if
platform uses <a href="undocumented#FreeType">FreeType</a> as the <a href="undocumented#Font_Manager">Font Manager</a>, instruct the <a href="undocumented#Font_Manager">Font Manager</a> to always hint
glyphs.
<a href="#Glyph">Glyphs</a>.
Equivalent to <a href="#SkPaint_getFlags">getFlags</a> masked with <a href="#SkPaint_kAutoHinting_Flag">kAutoHinting Flag</a>.
@ -1482,7 +1483,7 @@ void setAutohinted(bool useAutohinter)
</pre>
If <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kNormal_Hinting">kNormal Hinting</a> or <a href="#SkPaint_kFull_Hinting">kFull Hinting</a> and <a href="#SkPaint_setAutohinted_useAutohinter">useAutohinter</a> is set,
instruct the <a href="undocumented#Font_Manager">Font Manager</a> to always hint glyphs.
instruct the <a href="undocumented#Font_Manager">Font Manager</a> to always hint <a href="#Glyph">Glyphs</a>.
<a href="#Automatic_Hinting">Automatic Hinting</a> has no effect if <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kNo_Hinting">kNo Hinting</a> or
<a href="#SkPaint_kSlight_Hinting">kSlight Hinting</a>.
@ -1510,14 +1511,14 @@ setting for <a href="#SkPaint_kAutoHinting_Flag">kAutoHinting Flag</a></td>
# <a name="Vertical_Text"></a> Vertical Text
<a href="undocumented#Text">Text</a> may be drawn by positioning each glyph, or by positioning the first glyph and
using <a href="#Advance">Font Advance</a> to position subsequent glyphs. By default, each successive glyph
is positioned to the right of the preceeding glyph. <a href="#Vertical_Text">Vertical Text</a> sets successive
glyphs to position below the preceeding glyph.
using <a href="#Advance">Font Advance</a> to position subsequent <a href="#Glyph">Glyphs</a>. By default, each successive glyph
is positioned to the right of the preceding glyph. <a href="#Vertical_Text">Vertical Text</a> sets successive
<a href="#Glyph">Glyphs</a> to position below the preceding glyph.
<a href="undocumented#Skia">Skia</a> can translate text character codes as a series of glyphs, but does not implement
<a href="undocumented#Skia">Skia</a> can translate text character codes as a series of <a href="#Glyph">Glyphs</a>, but does not implement
font substitution,
textual substitution, line layout, or contextual spacing like kerning pairs. Use
a text shaping engine likeHarfBuzzhttp://harfbuzz.org/to translate text runs
textual substitution, line layout, or contextual spacing like <a href="undocumented#Kerning">Kerning</a> pairs. Use
a text shaping engine likeHarfBuzzto translate text runs
into glyph series.
<a href="#Vertical_Text">Vertical Text</a> is clear if text is drawn left to right or set if drawn from top to bottom.
@ -1540,7 +1541,7 @@ into glyph series.
bool isVerticalText() const
</pre>
If true, glyphs are drawn top to bottom instead of left to right.
If true, <a href="#Glyph">Glyphs</a> are drawn top to bottom instead of left to right.
Equivalent to <a href="#SkPaint_getFlags">getFlags</a> masked with <a href="#SkPaint_kVerticalText_Flag">kVerticalText Flag</a>.
@ -1605,8 +1606,8 @@ bold font face using the platform's <a href="undocumented#Font_Manager">Font Man
Use <a href="#Text_Skew_X">Text Skew X</a> to approximate an italic font style when the italic font face
is not available.
A <a href="undocumented#FreeType_based">FreeType-based</a> port may define <a href="undocumented#SK_USE_FREETYPE_EMBOLDEN">SK USE FREETYPE EMBOLDEN</a> at compile time to direct
the font engine to create the bold glyphs. Otherwise, the extra bold is computed
A <a href="undocumented#FreeType">FreeType</a> based port may define <a href="undocumented#SK_USE_FREETYPE_EMBOLDEN">SK USE FREETYPE EMBOLDEN</a> at compile time to direct
the font engine to create the bold <a href="#Glyph">Glyphs</a>. Otherwise, the extra bold is computed
by increasing the stroke width and setting the <a href="#SkPaint_Style">Style</a> to <a href="#SkPaint_kStrokeAndFill_Style">kStrokeAndFill Style</a> as needed.
<a href="#Fake_Bold">Fake Bold</a> is disabled by default.
@ -1653,7 +1654,7 @@ paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)
void setFakeBoldText(bool fakeBoldText)
</pre>
Use increased stroke width when creating glyph bitmaps to approximate bolding.
Use increased stroke width when creating glyph bitmaps to approximate a bold typeface.
Sets <a href="#SkPaint_kFakeBoldText_Flag">kFakeBoldText Flag</a> if <a href="#SkPaint_setFakeBoldText_fakeBoldText">fakeBoldText</a> is true.
Clears <a href="#SkPaint_kFakeBoldText_Flag">kFakeBoldText Flag</a> if <a href="#SkPaint_setFakeBoldText_fakeBoldText">fakeBoldText</a> is false.
@ -1680,13 +1681,13 @@ paint1 == paint2
---
# <a name="Full_Hinting_Spacing"></a> Full Hinting Spacing
<a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> adjusts the character spacing by the difference of the
hinted and unhinted left and right side bearings,
if <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kFull_Hinting">kFull Hinting</a>. <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> only
applies to platforms that use <a href="undocumented#FreeType">FreeType</a> as their <a href="#Engine">Font Engine</a>.
if <a href="#SkPaint_Hinting">Hinting</a> is set to <a href="#SkPaint_kFull_Hinting">kFull Hinting</a>, <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> adjusts the character
spacing by the difference of the hinted and <a href="undocumented#Unhinted">Unhinted</a> <a href="undocumented#Left_Side_Bearing">Left Side Bearing</a> and
<a href="undocumented#Right_Side_Bearing">Right Side Bearing</a>. <a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> only applies to platforms that use
<a href="undocumented#FreeType">FreeType</a> as their <a href="#Engine">Font Engine</a>.
<a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> is not related to text kerning, where the space between
a specific pair of characters is adjusted using data in the font's kerning tables.
<a href="SkPaint_Reference#Full_Hinting_Spacing">Full Hinting Spacing</a> is not related to text <a href="undocumented#Kerning">Kerning</a>, where the space between
a specific pair of characters is adjusted using data in the font's <a href="undocumented#Kerning">Kerning</a> tables.
<a name="SkPaint_isDevKernText"></a>
## isDevKernText
@ -1746,8 +1747,8 @@ paint1 == paint2
<a href="undocumented#Filter_Quality">Filter Quality</a> trades speed for image filtering when the image is scaled.
A lower <a href="undocumented#Filter_Quality">Filter Quality</a> draws faster, but has less fidelity.
A higher <a href="undocumented#Filter_Quality">Filter Quality</a> draws slower, but looks better.
If the image is unscaled, the <a href="undocumented#Filter_Quality">Filter Quality</a> choice will not result in a noticable
difference.
If the image is drawn without scaling, the <a href="undocumented#Filter_Quality">Filter Quality</a> choice will not result
in a noticeable difference.
<a href="undocumented#Filter_Quality">Filter Quality</a> is used in <a href="#Paint">Paint</a> passed as a parameter to
@ -1838,7 +1839,7 @@ or stroked shape in a
32-bit value. Each component occupies 8-bits, ranging from zero: no contribution;
to 255: full intensity. All values in any combination are valid.
<a href="undocumented#Color">Color</a> is not premultiplied;
<a href="undocumented#Color">Color</a> is not <a href="#Premultiply">Premultiplied</a>;
<a href="#Alpha">Color Alpha</a> sets the transparency independent of <a href="#RGB">Color RGB</a>: <a href="#RGB_Red">Color RGB Red</a>, <a href="#RGB_Blue">Color RGB Blue</a>, and <a href="#RGB_Green">Color RGB Green</a>.
The bit positions of <a href="#Alpha">Color Alpha</a> and <a href="#RGB">Color RGB</a> are independent of the bit positions
@ -1859,13 +1860,13 @@ on the output device, which may have more or fewer bits, and may have a differen
SkColor getColor() const
</pre>
Retrieves <a href="#Alpha">Color Alpha</a> and <a href="#RGB">Color RGB</a>, unpremultiplied, packed into 32 bits.
Retrieves <a href="#Alpha">Alpha</a> and <a href="#RGB">Color RGB</a>, <a href="#Unpremultiply">Unpremultiplied</a>, packed into 32 bits.
Use helpers <a href="undocumented#SkColorGetA">SkColorGetA</a>, <a href="undocumented#SkColorGetR">SkColorGetR</a>, <a href="undocumented#SkColorGetG">SkColorGetG</a>, and <a href="undocumented#SkColorGetB">SkColorGetB</a> to extract
a color component.
### Return Value
<a href="undocumented#Unpremultiplied">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a>
<a href="#Unpremultiply">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a>
### Example
@ -1892,13 +1893,13 @@ Yellow is 100% red, 100% green, and 0% blue.
void setColor(SkColor color)
</pre>
Sets <a href="#Alpha">Color Alpha</a> and <a href="#RGB">Color RGB</a> used when stroking and filling. The <a href="#SkPaint_setColor_color">color</a> is a 32-bit value,
unpremutiplied, packing 8-bit components for <a href="#Alpha">Color Alpha</a>, <a href="#RGB_Red">Color RGB Red</a>, <a href="#RGB_Blue">Color RGB Blue</a>, and <a href="#RGB_Green">Color RGB Green</a>.
Sets <a href="#Alpha">Alpha</a> and <a href="#RGB">Color RGB</a> used when stroking and filling. The <a href="#SkPaint_setColor_color">color</a> is a 32-bit value,
<a href="#Unpremultiply">Unpremultiplied</a>, packing 8-bit components for <a href="#Alpha">Alpha</a>, <a href="#Red">Red</a>, <a href="#Blue">Blue</a>, and <a href="#Green">Green</a>.
### Parameters
<table> <tr> <td><a name="SkPaint_setColor_color"> <code><strong>color </strong></code> </a></td> <td>
<a href="undocumented#Unpremultiplied">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a></td>
<a href="#Unpremultiply">Unpremultiplied</a> <a href="#ARGB">Color ARGB</a></td>
</tr>
</table>
@ -1931,11 +1932,11 @@ green1 == green2
uint8_t getAlpha() const
</pre>
Retrieves <a href="#Alpha">Color Alpha</a> from the <a href="undocumented#Color">Color</a> used when stroking and filling.
Retrieves <a href="#Alpha">Alpha</a> from the <a href="undocumented#Color">Color</a> used when stroking and filling.
### Return Value
<a href="#Alpha">Color Alpha</a> ranging from zero, fully transparent, to 255, fully opaque
<a href="#Alpha">Alpha</a> ranging from zero, fully transparent, to 255, fully opaque
### Example
@ -1958,7 +1959,7 @@ Retrieves <a href="#Alpha">Color Alpha</a> from the <a href="undocumented#Color"
void setAlpha(U8CPU a)
</pre>
Replaces <a href="#Alpha">Color Alpha</a>, leaving <a href="#RGB">Color RGB</a>
Replaces <a href="#Alpha">Alpha</a>, leaving <a href="#RGB">Color RGB</a>
unchanged. An out of range value triggers an assert in the debug
build. <a href="#SkPaint_setAlpha_a">a</a> is <a href="#SkPaint_setAlpha_a">a</a> value from zero to 255.
<a href="#SkPaint_setAlpha_a">a</a> set to zero makes <a href="undocumented#Color">Color</a> fully transparent; <a href="#SkPaint_setAlpha_a">a</a> set to 255 makes <a href="undocumented#Color">Color</a>
@ -1967,7 +1968,7 @@ fully opaque.
### Parameters
<table> <tr> <td><a name="SkPaint_setAlpha_a"> <code><strong>a </strong></code> </a></td> <td>
<a href="#Alpha">Color Alpha</a> component of <a href="undocumented#Color">Color</a></td>
<a href="#Alpha">Alpha</a> component of <a href="undocumented#Color">Color</a></td>
</tr>
</table>
@ -1993,8 +1994,7 @@ void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
</pre>
Sets <a href="undocumented#Color">Color</a> used when drawing solid fills. The color components range from 0 to 255.
The color is unpremultiplied;
<a href="#Alpha">Color Alpha</a> sets the transparency independent of <a href="#RGB">Color RGB</a>.
The color is <a href="#Unpremultiply">Unpremultiplied</a>; <a href="#Alpha">Alpha</a> sets the transparency independent of <a href="#RGB">Color RGB</a>.
### Parameters
@ -2085,8 +2085,8 @@ a fill draw.
<table>
<tr>
<td><a name="SkPaint_kFill_Style"> <code><strong>SkPaint::kFill_Style </strong></code> </a></td><td>0</td><td>Set to fill geometry.
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="undocumented#Circle">Circle</a>, <a href="undocumented#Oval">Oval</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="undocumented#Bitmap">Bitmap</a>, <a href="undocumented#Image">Image</a>, <a href="undocumented#Patch">Patch</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Sprite">Sprite</a>, and <a href="undocumented#Vertices">Vertices</a> are painted as if
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="#Circle">Circles</a>, <a href="#Oval">Ovals</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="undocumented#Bitmap">Bitmap</a>, <a href="undocumented#Image">Image</a>, <a href="#Patch">Patches</a>, <a href="undocumented#Region">Region</a>, <a href="#Sprite">Sprites</a>, and <a href="undocumented#Vertices">Vertices</a> are painted as if
<a href="#SkPaint_kFill_Style">kFill Style</a> is set, and ignore the set <a href="#SkPaint_Style">Style</a>.
The <a href="#Fill_Type">Path Fill Type</a> specifies additional rules to fill the area outside the path edge,
and to create an unfilled hole inside the shape.
@ -2094,15 +2094,14 @@ and to create an unfilled hole inside the shape.
</tr>
<tr>
<td><a name="SkPaint_kStroke_Style"> <code><strong>SkPaint::kStroke_Style </strong></code> </a></td><td>1</td><td>Set to stroke geometry.
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="undocumented#Arc">Arc</a>, <a href="undocumented#Circle">Circle</a>, <a href="undocumented#Oval">Oval</a>,
<a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="undocumented#Arc">Arc</a>, <a href="undocumented#Line">Line</a>, <a href="undocumented#Point">Point</a>, and <a href="#Array">Point Array</a> are always drawn as if <a href="#SkPaint_kStroke_Style">kStroke Style</a> is set,
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="#Arc">Arcs</a>, <a href="#Circle">Circles</a>, <a href="#Oval">Ovals</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="#Arc">Arcs</a>, <a href="#Line">Lines</a>, and <a href="#Point">Points</a>, are always drawn as if <a href="#SkPaint_kStroke_Style">kStroke Style</a> is set,
and ignore the set <a href="#SkPaint_Style">Style</a>.
The stroke construction is unaffected by the <a href="#Fill_Type">Path Fill Type</a>.</td>
</tr>
<tr>
<td><a name="SkPaint_kStrokeAndFill_Style"> <code><strong>SkPaint::kStrokeAndFill_Style </strong></code> </a></td><td>2</td><td>Set to stroke and fill geometry.
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="undocumented#Circle">Circle</a>, <a href="undocumented#Oval">Oval</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
Applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="#Circle">Circles</a>, <a href="#Oval">Ovals</a>, <a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
<a href="SkPath_Reference#Path">Path</a> is treated as if it is set to <a href="#SkPath_kWinding_FillType">SkPath::kWinding FillType</a>,
and the set <a href="#Fill_Type">Path Fill Type</a> is ignored.</td>
</tr>
@ -2204,7 +2203,7 @@ The default width for the paint is zero.
### Example
<div><fiddle-embed name="01e3e08a3022a351628ff54e84887756">raster gpu<div>The pixels hit to represent thin lines vary with the angle of the
<div><fiddle-embed name="01e3e08a3022a351628ff54e84887756"><div>The pixels hit to represent thin lines vary with the angle of the
line and the platform's implementation.</div></fiddle-embed></div>
<a name="SkPaint_getStrokeWidth"></a>
@ -2282,7 +2281,7 @@ is replaced with <a href="#SkPaint_kBevel_Join">kBevel Join</a>.
miter limit = 1 / sin ( angle / 2 )<a href="#Miter_Limit">Miter Limit</a> default value is 4.
The default may be changed at compile time by setting <a href="undocumented#SkPaintDefaults_MiterLimit">SkPaintDefaults MiterLimit</a>
in <a href="undocumented#SkUserConfig.h">SkUserConfig.h</a> or as a define supplied by the build environment.
in "<a href="undocumented#SkUserConfig">SkUserConfig</a>.h" or as a define supplied by the build environment.
Here are some miter limits and the angles that triggers them.
@ -2698,8 +2697,8 @@ true if the path represents <a href="#Style_Fill">Style Fill</a>, or false if it
### Example
<div><fiddle-embed name="cedd6233848198e1fca4d1e14816baaf"><div>A very small quad stroke is turned into a filled path with increasing levels of precision.
At the lowest precision, the quad stroke is approximated by a rectangle.
<div><fiddle-embed name="cedd6233848198e1fca4d1e14816baaf"><div>A very small <a href="#Quad">Quad</a> stroke is turned into a filled path with increasing levels of precision.
At the lowest precision, the <a href="#Quad">Quad</a> stroke is approximated by a rectangle.
At the highest precision, the filled path has high fidelity compared to the original stroke.</div></fiddle-embed></div>
---
@ -3134,7 +3133,7 @@ replace <a href="SkPath_Reference#Path">Path</a> with a modification when drawn<
---
# <a name="Mask_Filter_Methods"></a> Mask Filter Methods
<a href="undocumented#Mask_Filter">Mask Filter</a> uses <a href="#Alpha">Color Alpha</a> of the shape drawn to create <a href="undocumented#Mask_Alpha">Mask Alpha</a>.
<a href="undocumented#Mask_Filter">Mask Filter</a> uses coverage of the shape drawn to create <a href="undocumented#Mask_Alpha">Mask Alpha</a>.
<a href="undocumented#Mask_Filter">Mask Filter</a> operates at a lower level than <a href="undocumented#Rasterizer">Rasterizer</a>; <a href="undocumented#Mask_Filter">Mask Filter</a> takes a <a href="undocumented#Mask">Mask</a>,
and returns a <a href="undocumented#Mask">Mask</a>.
<a href="undocumented#Mask_Filter">Mask Filter</a> may change the geometry and transparency of the shape, such as creating a blur effect.
@ -3327,7 +3326,7 @@ and returns a <a href="undocumented#Mask">Mask</a>.
<a href="undocumented#Rasterizer">Rasterizer</a> may change the geometry and transparency of the shape, such as
creating a shadow effect. <a href="undocumented#Rasterizer">Rasterizer</a> forms the base of <a href="#Layer">Rasterizer Layer</a>, which
creates effects like embossing and outlining.
<a href="undocumented#Rasterizer">Rasterizer</a> applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="undocumented#Arc">Arc</a>, <a href="undocumented#Circle">Circle</a>, <a href="undocumented#Oval">Oval</a>,
<a href="undocumented#Rasterizer">Rasterizer</a> applies to <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Region">Region</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="#Arc">Arcs</a>, <a href="#Circle">Circles</a>, <a href="#Oval">Ovals</a>,
<a href="SkPath_Reference#Path">Path</a>, and <a href="undocumented#Text">Text</a>.
### Example
@ -3423,7 +3422,7 @@ how geometry is converted to <a href="undocumented#Mask_Alpha">Mask Alpha</a></t
with <a href="undocumented#Blend_Mode">Blend Mode</a> set to <a href="#SkBlendMode_kSrcOver">SkBlendMode::kSrcOver</a>. <a href="undocumented#Image_Filter">Image Filter</a> creates a new bitmap,
which is drawn to the device using the set <a href="undocumented#Blend_Mode">Blend Mode</a>.
<a href="undocumented#Image_Filter">Image Filter</a> is higher level than <a href="undocumented#Mask_Filter">Mask Filter</a>; for instance, an <a href="undocumented#Image_Filter">Image Filter</a>
can operate on all channels of <a href="undocumented#Color">Color</a>, while <a href="undocumented#Mask_Filter">Mask Filter</a> generates <a href="#Alpha">Color Alpha</a> only.
can operate on all channels of <a href="undocumented#Color">Color</a>, while <a href="undocumented#Mask_Filter">Mask Filter</a> generates <a href="#Alpha">Alpha</a> only.
<a href="undocumented#Image_Filter">Image Filter</a> operates independently of and can be used in combination with
<a href="undocumented#Mask_Filter">Mask Filter</a> and <a href="undocumented#Rasterizer">Rasterizer</a>.
@ -3660,11 +3659,11 @@ enum <a href="#SkPaint_Align">Align</a> {
};</pre>
<a href="#SkPaint_Align">Align</a> adjusts the text relative to the text position.
<a href="#SkPaint_Align">Align</a> affects glyphs drawn with: <a href="#SkCanvas_drawText">SkCanvas::drawText</a>, <a href="#SkCanvas_drawPosText">SkCanvas::drawPosText</a>,
<a href="#SkPaint_Align">Align</a> affects <a href="#Glyph">Glyphs</a> drawn with: <a href="#SkCanvas_drawText">SkCanvas::drawText</a>, <a href="#SkCanvas_drawPosText">SkCanvas::drawPosText</a>,
<a href="#SkCanvas_drawPosTextH">SkCanvas::drawPosTextH</a>, <a href="#SkCanvas_drawTextOnPath">SkCanvas::drawTextOnPath</a>,
<a href="#SkCanvas_drawTextOnPathHV">SkCanvas::drawTextOnPathHV</a>, <a href="#SkCanvas_drawTextRSXform">SkCanvas::drawTextRSXform</a>, <a href="#SkCanvas_drawTextBlob">SkCanvas::drawTextBlob</a>,
and <a href="#SkCanvas_drawString">SkCanvas::drawString</a>;
as well as calls that place text glyphs like <a href="#SkPaint_getTextWidths">getTextWidths</a> and <a href="#SkPaint_getTextPath">getTextPath</a>.
as well as calls that place text <a href="#Glyph">Glyphs</a> like <a href="#SkPaint_getTextWidths">getTextWidths</a> and <a href="#SkPaint_getTextPath">getTextPath</a>.
The text position is set by the font for both horizontal and vertical text.
Typically, for horizontal text, the position is to the left side of the glyph on the
@ -3942,16 +3941,16 @@ enum <a href="#SkPaint_TextEncoding">TextEncoding</a> {
};</pre>
<a href="#SkPaint_TextEncoding">TextEncoding</a> determines whether text specifies character codes and their encoded size,
or glyph indices. Character codes use the encoding specified by the<a href="undocumented#Unicode">Unicode</a> standardhttp://unicode.org/standard/standard.html.
or glyph indices. Character codes use the encoding specified by the<a href="undocumented#Unicode">Unicode</a> standard.
Character codes encoded size are specified by <a href="undocumented#UTF_8">UTF-8</a>, <a href="undocumented#UTF_16">UTF-16</a>, or <a href="undocumented#UTF_32">UTF-32</a>.
All character encoding are able to represent all of <a href="undocumented#Unicode">Unicode</a>, differing only
in the total storage required.
<a href="undocumented#UTF_8">UTF-8</a> (<a href="undocumented#RFC">RFC</a> 3629)https://tools.ietf.org/html/rfc3629is made up of 8-bit bytes,
<a href="undocumented#UTF_8">UTF-8</a> (<a href="undocumented#RFC">RFC</a> 3629)is made up of 8-bit bytes,
and is a superset of <a href="undocumented#ASCII">ASCII</a>.
<a href="undocumented#UTF_16">UTF-16</a> (<a href="undocumented#RFC">RFC</a> 2781)https://tools.ietf.org/html/rfc2781is made up of 16-bit words,
<a href="undocumented#UTF_16">UTF-16</a> (<a href="undocumented#RFC">RFC</a> 2781)is made up of 16-bit words,
and is a superset of <a href="undocumented#Unicode">Unicode</a> ranges 0x0000 to 0xD7FF and 0xE000 to 0xFFFF.
<a href="undocumented#UTF_32">UTF-32</a>http://www.unicode.org/versions/<a href="undocumented#Unicode5">Unicode5</a>.0.0/ch03.pdfis
<a href="undocumented#UTF_32">UTF-32</a>is
made up of 32-bit words, and is a superset of <a href="undocumented#Unicode">Unicode</a>.
<a href="undocumented#Font_Manager">Font Manager</a> uses font data to convert character code points into glyph indices.
@ -4050,7 +4049,7 @@ one of: <a href="#SkPaint_kUTF8_TextEncoding">kUTF8 TextEncoding</a>, <a href="#
---
# <a name="Font_Metrics"></a> Font Metrics
<a href="#Font_Metrics">Font Metrics</a> describe dimensions common to the glyphs in <a href="undocumented#Typeface">Typeface</a>.
<a href="#Font_Metrics">Font Metrics</a> describe dimensions common to the <a href="#Glyph">Glyphs</a> in <a href="undocumented#Typeface">Typeface</a>.
The dimensions are computed by <a href="undocumented#Font_Manager">Font Manager</a> from font data and do not take
<a href="#Paint">Paint</a> settings other than <a href="#Text_Size">Text Size</a> into account.
@ -4099,7 +4098,7 @@ bool <a href="#SkPaint_FontMetrics_hasStrikeoutPosition">hasStrikeoutPosition(Sk
<a href="#SkPaint_FontMetrics">FontMetrics</a> is filled out by <a href="#SkPaint_getFontMetrics">getFontMetrics</a>. <a href="#SkPaint_FontMetrics">FontMetrics</a> contents reflect the values
computed by <a href="undocumented#Font_Manager">Font Manager</a> using <a href="undocumented#Typeface">Typeface</a>. Values are set to zero if they are
not availble.
not available.
<a href="#SkPaint_FontMetrics_fUnderlineThickness">fUnderlineThickness</a> and <a href="#SkPaint_FontMetrics_fUnderlinePosition">fUnderlinePosition</a> have a bit set in <a href="#SkPaint_FontMetrics_fFlags">fFlags</a> if their values
are valid, since their value may be zero.
@ -4178,12 +4177,12 @@ Maximum character width.
<a name="SkPaint_FontMetrics_fXMin"> <code><strong>SkScalar fXMin</strong></code> </a>
Minimum bounding box x value for all glyphs.
Minimum bounding box x value for all <a href="#Glyph">Glyphs</a>.
Typically less than zero.
<a name="SkPaint_FontMetrics_fXMax"> <code><strong>SkScalar fXMax</strong></code> </a>
Maximum bounding box x value for all glyphs.
Maximum bounding box x value for all <a href="#Glyph">Glyphs</a>.
Typically greater than zero.
<a name="SkPaint_FontMetrics_fXHeight"> <code><strong>SkScalar fXHeight</strong></code> </a>
@ -4236,8 +4235,8 @@ bool hasUnderlineThickness(SkScalar* thickness) const
</pre>
If <a href="#Font_Metrics">Font Metrics</a> has a valid underline <a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a>, return true, and set
<a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a> to that value. If it doesn't, return false, and ignore
<a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a>.
<a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a> to that value. If the underline <a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a> is not valid,
return false, and ignore <a href="#SkPaint_FontMetrics_hasUnderlineThickness_thickness">thickness</a>.
### Parameters
@ -4260,8 +4259,8 @@ bool hasUnderlinePosition(SkScalar* position) const
</pre>
If <a href="#Font_Metrics">Font Metrics</a> has a valid underline <a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a>, return true, and set
<a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a> to that value. If it doesn't, return false, and ignore
<a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a>.
<a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a> to that value. If the underline <a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a> is not valid,
return false, and ignore <a href="#SkPaint_FontMetrics_hasUnderlinePosition_position">position</a>.
### Parameters
@ -4284,8 +4283,8 @@ bool hasStrikeoutThickness(SkScalar* thickness) const
</pre>
If <a href="#Font_Metrics">Font Metrics</a> has a valid strikeout <a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a>, return true, and set
<a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a> to that value. If it doesn't, return false, and ignore
<a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a>.
<a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a> to that value. If the underline <a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a> is not valid,
return false, and ignore <a href="#SkPaint_FontMetrics_hasStrikeoutThickness_thickness">thickness</a>.
### Parameters
@ -4308,8 +4307,8 @@ bool hasStrikeoutPosition(SkScalar* position) const
</pre>
If <a href="#Font_Metrics">Font Metrics</a> has a valid strikeout <a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a>, return true, and set
<a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a> to that value. If it doesn't, return false, and ignore
<a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a>.
<a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a> to that value. If the underline <a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a> is not valid,
return false, and ignore <a href="#SkPaint_FontMetrics_hasStrikeoutPosition_position">position</a>.
### Parameters
@ -4405,7 +4404,7 @@ textSize: 32 fontSpacing: 37.25
SkRect getFontBounds() const
</pre>
Returns the union of bounds of all glyphs.
Returns the union of bounds of all <a href="#Glyph">Glyphs</a>.
Returned dimensions are computed by <a href="undocumented#Font_Manager">Font Manager</a> from font data,
ignoring <a href="#SkPaint_Hinting">Hinting</a>. Includes <a href="#Text_Size">Text Size</a>, <a href="#Text_Scale_X">Text Scale X</a>,
and <a href="#Text_Skew_X">Text Skew X</a>, but not <a href="#Fake_Bold">Fake Bold</a> or <a href="undocumented#Path_Effect">Path Effect</a>.
@ -4416,7 +4415,7 @@ returns the same bounds as <a href="#Font_Metrics">Font Metrics</a> { <a href="#
### Return Value
union of bounds of all glyphs
union of bounds of all <a href="#Glyph">Glyphs</a>
### Example
@ -4457,7 +4456,7 @@ If <a href="#Text_Encoding">Text Encoding</a> is <a href="#SkPaint_kUTF8_TextEnc
### Parameters
<table> <tr> <td><a name="SkPaint_textToGlyphs_text"> <code><strong>text </strong></code> </a></td> <td>
character stroage encoded with <a href="#Text_Encoding">Text Encoding</a></td>
character storage encoded with <a href="#Text_Encoding">Text Encoding</a></td>
</tr> <tr> <td><a name="SkPaint_textToGlyphs_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
length of character storage in bytes</td>
</tr> <tr> <td><a name="SkPaint_textToGlyphs_glyphs"> <code><strong>glyphs </strong></code> </a></td> <td>
@ -4482,14 +4481,14 @@ number of <a href="#SkPaint_textToGlyphs_glyphs">glyphs</a> represented by <a hr
int countText(const void* text, size_t byteLength) const
</pre>
Returns the number of glyphs in <a href="#SkPaint_countText_text">text</a>.
Uses <a href="#Text_Encoding">Text Encoding</a> to count the glyphs.
Returns the number of <a href="#Glyph">Glyphs</a> in <a href="#SkPaint_countText_text">text</a>.
Uses <a href="#Text_Encoding">Text Encoding</a> to count the <a href="#Glyph">Glyphs</a>.
Returns the same result as <a href="#SkPaint_textToGlyphs">textToGlyphs</a>.
### Parameters
<table> <tr> <td><a name="SkPaint_countText_text"> <code><strong>text </strong></code> </a></td> <td>
character stroage encoded with <a href="#Text_Encoding">Text Encoding</a></td>
character storage encoded with <a href="#Text_Encoding">Text Encoding</a></td>
</tr> <tr> <td><a name="SkPaint_countText_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
length of character storage in bytes</td>
</tr>
@ -4497,7 +4496,7 @@ length of character storage in bytes</td>
### Return Value
number of glyphs represented by <a href="#SkPaint_countText_text">text</a> of length <a href="#SkPaint_countText_byteLength">byteLength</a>
number of <a href="#Glyph">Glyphs</a> represented by <a href="#SkPaint_countText_text">text</a> of length <a href="#SkPaint_countText_byteLength">byteLength</a>
### Example
@ -4528,12 +4527,12 @@ If <a href="#Text_Encoding">Text Encoding</a> is <a href="#SkPaint_kGlyphID_Text
returns true if all glyph indices in <a href="#SkPaint_containsText_text">text</a> are non-zero;
does not check to see if <a href="#SkPaint_containsText_text">text</a> contains valid glyph indices for <a href="undocumented#Typeface">Typeface</a>.
Returns true if bytelength is zero.
Returns true if <a href="#SkPaint_containsText_byteLength">byteLength</a> is zero.
### Parameters
<table> <tr> <td><a name="SkPaint_containsText_text"> <code><strong>text </strong></code> </a></td> <td>
array of characters or glyphs</td>
array of characters or <a href="#Glyph">Glyphs</a></td>
</tr> <tr> <td><a name="SkPaint_containsText_byteLength"> <code><strong>byteLength </strong></code> </a></td> <td>
number of bytes in <a href="#SkPaint_containsText_text">text</a> array</td>
</tr>
@ -4769,13 +4768,13 @@ glyph count in <a href="#SkPaint_getTextWidths_text">text</a>
### Example
<div><fiddle-embed name="6b9e101f49e9c2c28755c5bdcef64dfb"><div>Bounds of glyphs increase for stroked <a href="#SkPaint_getTextWidths_text">text</a>, but <a href="#SkPaint_getTextWidths_text">text</a> advance remains the same.
<div><fiddle-embed name="6b9e101f49e9c2c28755c5bdcef64dfb"><div>Bounds of <a href="#Glyph">Glyphs</a> increase for stroked <a href="#SkPaint_getTextWidths_text">text</a>, but <a href="#SkPaint_getTextWidths_text">text</a> advance remains the same.
The underlines show the <a href="#SkPaint_getTextWidths_text">text</a> advance, spaced to keep them distinct.</div></fiddle-embed></div>
---
# <a name="Text_Path"></a> Text Path
<a href="#Text_Path">Text Path</a> describes the geometry of glyphs used to draw text.
<a href="#Text_Path">Text Path</a> describes the geometry of <a href="#Glyph">Glyphs</a> used to draw text.
<a name="SkPaint_getTextPath"></a>
## getTextPath
@ -4802,7 +4801,7 @@ x-coordinate of the origin of the <a href="#SkPaint_getTextPath_text">text</a></
</tr> <tr> <td><a name="SkPaint_getTextPath_y"> <code><strong>y </strong></code> </a></td> <td>
y-coordinate of the origin of the <a href="#SkPaint_getTextPath_text">text</a></td>
</tr> <tr> <td><a name="SkPaint_getTextPath_path"> <code><strong>path </strong></code> </a></td> <td>
geometry of the glyphs</td>
geometry of the <a href="#Glyph">Glyphs</a></td>
</tr>
</table>
@ -4837,20 +4836,20 @@ number of bytes of <a href="#SkPaint_getPosTextPath_text">text</a></td>
</tr> <tr> <td><a name="SkPaint_getPosTextPath_pos"> <code><strong>pos </strong></code> </a></td> <td>
positions of each glyph</td>
</tr> <tr> <td><a name="SkPaint_getPosTextPath_path"> <code><strong>path </strong></code> </a></td> <td>
geometry of the glyphs</td>
geometry of the <a href="#Glyph">Glyphs</a></td>
</tr>
</table>
### Example
<div><fiddle-embed name="7f27c93472aa99a7542fb3493076f072"><div>Simplifies three glyphs to eliminate overlaps, and strokes the result.</div></fiddle-embed></div>
<div><fiddle-embed name="7f27c93472aa99a7542fb3493076f072"><div>Simplifies three <a href="#Glyph">Glyphs</a> to eliminate overlaps, and strokes the result.</div></fiddle-embed></div>
---
# <a name="Text_Intercepts"></a> Text Intercepts
<a href="#Text_Intercepts">Text Intercepts</a> describe the intersection of drawn text glyphs with a pair
<a href="#Text_Intercepts">Text Intercepts</a> describe the intersection of drawn text <a href="#Glyph">Glyphs</a> with a pair
of lines parallel to the text advance. <a href="#Text_Intercepts">Text Intercepts</a> permits creating a
underline that skips descenders.
underline that skips <a href="undocumented#Descenders">Descenders</a>.
<a name="SkPaint_getTextIntercepts"></a>
## getTextIntercepts
@ -4862,7 +4861,7 @@ int getTextIntercepts(const void* text, size_t length, SkScalar x, SkScalar y,
Returns the number of <a href="#SkPaint_getTextIntercepts_intervals">intervals</a> that intersect <a href="#SkPaint_getTextIntercepts_bounds">bounds</a>.
<a href="#SkPaint_getTextIntercepts_bounds">bounds</a> describes a pair of lines parallel to the <a href="#SkPaint_getTextIntercepts_text">text</a> advance.
The return count is zero or a multiple of two, and is at most twice the number of glyphs in
The return count is zero or a multiple of two, and is at most twice the number of <a href="#Glyph">Glyphs</a> in
the string.
Uses <a href="#Text_Encoding">Text Encoding</a> to decode <a href="#SkPaint_getTextIntercepts_text">text</a>, <a href="undocumented#Typeface">Typeface</a> to get the glyph paths,
and <a href="#Text_Size">Text Size</a>, <a href="#Fake_Bold">Fake Bold</a>, and <a href="undocumented#Path_Effect">Path Effect</a> to scale and modify the glyph paths.
@ -4893,7 +4892,7 @@ number of intersections; may be zero
### Example
<div><fiddle-embed name="2a0b80ed20d193c688085b79deb5bdc9"><div>Underline uses intercepts to draw on either side of the glyph descender.</div></fiddle-embed></div>
<div><fiddle-embed name="2a0b80ed20d193c688085b79deb5bdc9"><div>Underline uses intercepts to draw on either side of the glyph Descender.</div></fiddle-embed></div>
---
@ -4907,7 +4906,7 @@ int getPosTextIntercepts(const void* text, size_t length, const SkPoint pos[],
Returns the number of <a href="#SkPaint_getPosTextIntercepts_intervals">intervals</a> that intersect <a href="#SkPaint_getPosTextIntercepts_bounds">bounds</a>.
<a href="#SkPaint_getPosTextIntercepts_bounds">bounds</a> describes a pair of lines parallel to the <a href="#SkPaint_getPosTextIntercepts_text">text</a> advance.
The return count is zero or a multiple of two, and is at most twice the number of glyphs in
The return count is zero or a multiple of two, and is at most twice the number of <a href="#Glyph">Glyphs</a> in
the string.
Uses <a href="#Text_Encoding">Text Encoding</a> to decode <a href="#SkPaint_getPosTextIntercepts_text">text</a>, <a href="undocumented#Typeface">Typeface</a> to get the glyph paths,
and <a href="#Text_Size">Text Size</a>, <a href="#Fake_Bold">Fake Bold</a>, and <a href="undocumented#Path_Effect">Path Effect</a> to scale and modify the glyph paths.
@ -4936,7 +4935,7 @@ number of intersections; may be zero
### Example
<div><fiddle-embed name="98b2dfc552d0540a7c041fe7a2839bd7"><div><a href="undocumented#Text">Text</a> intercepts draw on either side of, but not inside, glyphs in a run.</div></fiddle-embed></div>
<div><fiddle-embed name="98b2dfc552d0540a7c041fe7a2839bd7"><div><a href="undocumented#Text">Text</a> intercepts draw on either side of, but not inside, <a href="#Glyph">Glyphs</a> in a run.</div></fiddle-embed></div>
---
@ -4951,7 +4950,7 @@ int getPosTextHIntercepts(const void* text, size_t length, const SkScalar xpos[]
Returns the number of <a href="#SkPaint_getPosTextHIntercepts_intervals">intervals</a> that intersect <a href="#SkPaint_getPosTextHIntercepts_bounds">bounds</a>.
<a href="#SkPaint_getPosTextHIntercepts_bounds">bounds</a> describes a pair of lines parallel to the <a href="#SkPaint_getPosTextHIntercepts_text">text</a> advance.
The return count is zero or a multiple of two, and is at most twice the number of glyphs in
The return count is zero or a multiple of two, and is at most twice the number of <a href="#Glyph">Glyphs</a> in
the string.
Uses <a href="#Text_Encoding">Text Encoding</a> to decode <a href="#SkPaint_getPosTextHIntercepts_text">text</a>, <a href="undocumented#Typeface">Typeface</a> to get the glyph paths,
and <a href="#Text_Size">Text Size</a>, <a href="#Fake_Bold">Fake Bold</a>, and <a href="undocumented#Path_Effect">Path Effect</a> to scale and modify the glyph paths.
@ -4996,18 +4995,18 @@ int getTextBlobIntercepts(const SkTextBlob* blob, const SkScalar bounds[2],
Returns the number of <a href="#SkPaint_getTextBlobIntercepts_intervals">intervals</a> that intersect <a href="#SkPaint_getTextBlobIntercepts_bounds">bounds</a>.
<a href="#SkPaint_getTextBlobIntercepts_bounds">bounds</a> 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 return count is zero or a multiple of two, and is at most twice the number of <a href="#Glyph">Glyphs</a> in
the string.
Uses <a href="#Text_Encoding">Text Encoding</a> to decode text, <a href="undocumented#Typeface">Typeface</a> to get the glyph paths,
and <a href="#Text_Size">Text Size</a>, <a href="#Fake_Bold">Fake Bold</a>, and <a href="undocumented#Path_Effect">Path Effect</a> to scale and modify the glyph paths.
Uses pos array and <a href="#Text_Align">Text Align</a> to position <a href="#SkPaint_getTextBlobIntercepts_intervals">intervals</a>.
Uses run array and <a href="#Text_Align">Text Align</a> to position <a href="#SkPaint_getTextBlobIntercepts_intervals">intervals</a>.
Pass nullptr for <a href="#SkPaint_getTextBlobIntercepts_intervals">intervals</a> to determine the size of the interval array.
<a href="#SkPaint_getTextBlobIntercepts_intervals">intervals</a> are cached to improve performance for multiple calls.
### Parameters
<table> <tr> <td><a name="SkPaint_getTextBlobIntercepts_blob"> <code><strong>blob </strong></code> </a></td> <td>
glyphs, positions, and text paint attributes</td>
<a href="#Glyph">Glyphs</a>, positions, and text paint attributes</td>
</tr> <tr> <td><a name="SkPaint_getTextBlobIntercepts_bounds"> <code><strong>bounds </strong></code> </a></td> <td>
lower and upper line parallel to the advance</td>
</tr> <tr> <td><a name="SkPaint_getTextBlobIntercepts_intervals"> <code><strong>intervals </strong></code> </a></td> <td>
@ -5035,8 +5034,8 @@ bool nothingToDraw() const
Returns true if <a href="#Paint">Paint</a> prevents all drawing;
otherwise, the <a href="#Paint">Paint</a> may or may not allow drawing.
Returns true if <a href="undocumented#Blend_Mode">Blend Mode</a> and <a href="#Alpha">Color Alpha</a> are enabled,
and computed <a href="#Alpha">Color Alpha</a> is zero.
Returns true if, for example, <a href="undocumented#Blend_Mode">Blend Mode</a> combined with <a href="#Alpha">Color Alpha</a> computes a
new <a href="#Alpha">Alpha</a> of zero.
### Return Value
@ -5090,13 +5089,13 @@ const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const
Only call this if <a href="#SkPaint_canComputeFastBounds">canComputeFastBounds</a> 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 <a href="#SkPaint_computeFastBounds_storage">storage</a>
rect parameter. It returns the adjusted bounds that can then be used
parameter. It returns the adjusted bounds that can then be used
for <a href="#SkCanvas_quickReject">SkCanvas::quickReject</a> tests.
The returned rect will either be <a href="#SkPaint_computeFastBounds_orig">orig</a> or <a href="#SkPaint_computeFastBounds_storage">storage</a>, thus the caller
The returned <a href="undocumented#Rect">Rect</a> will either be <a href="#SkPaint_computeFastBounds_orig">orig</a> or <a href="#SkPaint_computeFastBounds_storage">storage</a>, thus the caller
should not rely on <a href="#SkPaint_computeFastBounds_storage">storage</a> being set to the result, but should always
use the retured value. It is legal for <a href="#SkPaint_computeFastBounds_orig">orig</a> and <a href="#SkPaint_computeFastBounds_storage">storage</a> to be the same
rect.
use the returned value. It is legal for <a href="#SkPaint_computeFastBounds_orig">orig</a> and <a href="#SkPaint_computeFastBounds_storage">storage</a> to be the same
<a href="undocumented#Rect">Rect</a>.
### Parameters
@ -5143,8 +5142,9 @@ const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
Style style) const
</pre>
Take the <a href="#SkPaint_doComputeFastBounds_style">style</a> explicitly, so the caller can force us to be stroked
without having to make a copy of the paint just to change that field.
Computes the bounds, overriding the <a href="#Paint">Paint</a> <a href="#SkPaint_Style">Style</a>. This can be used to
account for additional width required by stroking <a href="#SkPaint_doComputeFastBounds_orig">orig</a>, without
altering <a href="#SkPaint_Style">Style</a> set to fill.
### Parameters
@ -5170,12 +5170,14 @@ fast computed bounds
void toString(SkString* str) const;
</pre>
Converts <a href="#Paint">Paint</a> to machine parsable form in developer mode.
Creates string representation of <a href="#Paint">Paint</a>. The representation is read by
internal debugging tools. The interface and implementation may be
suppressed by defining <a href="undocumented#SK_IGNORE_TO_STRING">SK IGNORE TO STRING</a>.
### Parameters
<table> <tr> <td><a name="SkPaint_toString_str"> <code><strong>str </strong></code> </a></td> <td>
storage for string containing parsable <a href="#Paint">Paint</a></td>
storage for string representation of <a href="#Paint">Paint</a></td>
</tr>
</table>

View File

@ -16,7 +16,7 @@ the middle entry as the end of the first <a href="undocumented#Line">Line</a> an
<a href="#Path">Path</a> components <a href="#Arc">Arc</a>, <a href="undocumented#Rect">Rect</a>, <a href="undocumented#Round_Rect">Round Rect</a>, <a href="undocumented#Circle">Circle</a>, and <a href="undocumented#Oval">Oval</a> are composed of
<a href="#Line">Lines</a> and <a href="#Curve">Curves</a> with as many <a href="#Verb">Verbs</a> and <a href="#Point">Points</a> required
for an exact description. Once added to <a href="#Path">Path</a>, these components may lose their
identity; although <a href="#Path">Path</a> can be inspected to determine if it decribes a single
identity; although <a href="#Path">Path</a> can be inspected to determine if it describes a single
<a href="undocumented#Rect">Rect</a>, <a href="undocumented#Oval">Oval</a>, <a href="undocumented#Round_Rect">Round Rect</a>, and so on.
### Example
@ -51,7 +51,7 @@ are required to satisfy <a href="#Verb_Array">Verb Array</a>. First <a href="#Ve
### Example
<div><fiddle-embed name="0374f2dcd7effeb1dd435205a6c2de6f"><div>Each <a href="#SkPath_moveTo">SkPath::moveTo</a> starts a new <a href="#Contour">Contour</a>, and content after <a href="#SkPath_close">SkPath::close()</a>
also starts a new <a href="#Contour">Contour</a>. Since <a href="#SkPath_conicTo">SkPath::conicTo</a> wasn't preceded by
also starts a new <a href="#Contour">Contour</a>. Since <a href="#SkPath_conicTo">SkPath::conicTo</a> is not preceded by
<a href="#SkPath_moveTo">SkPath::moveTo</a>, the first <a href="undocumented#Point">Point</a> of the third <a href="#Contour">Contour</a> starts at the last <a href="undocumented#Point">Point</a>
of the second <a href="#Contour">Contour</a>.</div></fiddle-embed></div>
@ -82,10 +82,10 @@ makes them visible.
outline a figure. <a href="#Path">Path</a> always starts with a move verb to a <a href="undocumented#Cartesian">Cartesian</a>
coordinate, and may be followed by additional verbs that add lines or curves.
Adding a <a href="#SkPath_close">close</a> verb makes the geometry into a continuous loop, a closed contour.
<a href="#Path">Paths</a> may contain any number of contours, each beginnning with a move verb.
<a href="#Path">Paths</a> may contain any number of contours, each beginning with a move verb.
<a href="#Path">Path</a> contours may contain only a move verb, or may also contain lines,
quadratic Beziers, conics, and cubic Beziers. <a href="#Path">Path</a> contours may be open or
<a href="#Quad">Quadratic Beziers</a>, <a href="#Conic">Conics</a>, and <a href="#Cubic">Cubic Beziers</a>. <a href="#Path">Path</a> contours may be open or
closed.
When used to draw a filled area, <a href="#Path">Path</a> describes whether the fill is inside or
@ -102,12 +102,11 @@ Internally, <a href="#Path">Path</a> lazily computes metrics likes bounds and co
| constants | description |
| --- | --- |
| <a href="#SkPath_AddPathMode">AddPathMode</a> | Sets <a href="#SkPath_addPath">addPath</a> options. |
| <a href="#SkPath_ArcSize">ArcSize</a> | Sets <a href="#SkPath_arcTo_4">arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y)</a> options. |
| <a href="#SkPath_ArcSize">ArcSize</a> | Used by <a href="#SkPath_arcTo_4">arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc, Direction sweep, SkScalar x, SkScalar y)</a>. |
| <a href="#SkPath_Convexity">Convexity</a> | Returns if <a href="#Path">Path</a> is convex or concave. |
| <a href="#SkPath_Direction">Direction</a> | Sets <a href="#Contour">Contour</a> clockwise or counterclockwise. |
| <a href="#SkPath_FillType">FillType</a> | Sets winding rule and inverse fill. |
| <a href="#SkPath_SegmentMask">SegmentMask</a> |
<a href="#SkPath_Verb">Verb</a>| Controls how <a href="#Path">Path</a> <a href="#Point">Points</a> are interpreted. |
| <a href="#SkPath_SegmentMask">SegmentMask</a> | <a href="#SkPath_Verb">Verb</a> | Controls how <a href="#Path">Path</a> <a href="#Point">Points</a> are interpreted. |
## <a name="Classes_and_Structs"></a> Classes and Structs
@ -159,8 +158,8 @@ Internally, <a href="#Path">Path</a> lazily computes metrics likes bounds and co
| <a href="#SkPath_countPoints">countPoints</a> | Returns <a href="#Point_Array">Point Array</a> length. |
| <a href="#SkPath_countVerbs">countVerbs</a> | Returns <a href="#Verb_Array">Verb Array</a> length. |
| <a href="#SkPath_cubicTo">cubicTo</a> | Appends <a href="#Cubic">Cubic</a>. |
| <a href="#SkPath_dump_2">dump</a> | Sends text representation using floats to stdout. |
| <a href="#SkPath_dumpHex">dumpHex</a> | Sends text representation using hexadecimal to stdout. |
| <a href="#SkPath_dump_2">dump</a> | Sends text representation using floats to standard output. |
| <a href="#SkPath_dumpHex">dumpHex</a> | Sends text representation using hexadecimal to standard output. |
| <a href="#SkPath_getBounds">getBounds</a> | Returns maximum and minimum of <a href="#Point_Array">Point Array</a>. |
| <a href="#SkPath_getConvexity">getConvexity</a> | Returns geometry convexity, computing if necessary. |
| <a href="#SkPath_getConvexityOrUnknown">getConvexityOrUnknown</a> | Returns geometry convexity if known. |
@ -430,7 +429,7 @@ Releases ownership of any shared data and deletes data if <a href="#Path">Path</
### Example
<div><fiddle-embed name="01ad6be9b7d15a2217daea273eb3d466"><div>delete calls <a href="#Path">Path</a> destructor, but copy of original in path2 is unaffected.</div></fiddle-embed></div>
<div><fiddle-embed name="01ad6be9b7d15a2217daea273eb3d466"><div>delete calls <a href="#Path">Path</a> <a href="undocumented#Destructor">Destructor</a>, but copy of original in path2 is unaffected.</div></fiddle-embed></div>
### See Also
@ -456,7 +455,7 @@ pointers are not exposed.
### Parameters
<table> <tr> <td><a name="SkPath_copy_assignment_operator_path"> <code><strong>path </strong></code> </a></td> <td>
<a href="#Verb_Array">Verb Array</a>, <a href="#Point_Array">Point Array</a>, <a href="#Weight">Weights</a>, amd <a href="#Fill_Type">Fill Type</a> to copy</td>
<a href="#Verb_Array">Verb Array</a>, <a href="#Point_Array">Point Array</a>, <a href="#Weight">Weights</a>, and <a href="#Fill_Type">Fill Type</a> to copy</td>
</tr>
</table>
@ -575,7 +574,7 @@ Return true if <a href="#Path">Paths</a> contain equal <a href="#Verb">Verbs</a>
If <a href="#Path">Paths</a> contain one or more <a href="#Conic">Conics</a>, the <a href="#Weight">Weights</a> must match.
<a href="#SkPath_conicTo">conicTo</a> may add different <a href="#Verb">Verbs</a> depending on <a href="#Conic_Weight">Conic Weight</a>, so it is not
trival to <a href="#SkPath_interpolate">interpolate</a> a pair of <a href="#Path">Paths</a> containing <a href="#Conic">Conics</a> with different
trivial to <a href="#SkPath_interpolate">interpolate</a> a pair of <a href="#Path">Paths</a> containing <a href="#Conic">Conics</a> with different
<a href="#Conic_Weight">Conic Weight</a> values.
### Parameters
@ -1064,7 +1063,7 @@ bool isRRect(SkRRect* rrect, Direction* dir = nullptr, unsigned* start = nullptr
</pre>
Returns true if constructed by <a href="#SkPath_addRoundRect">addRoundRect</a>, <a href="#SkPath_addRRect">addRRect</a>; and if construction
is not empty, not <a href="undocumented#Rect">Rect</a>, and not <a href="undocumented#Oval">Oval</a>. <a href="#Path">Path</a> constructed with other other calls
is not empty, not <a href="undocumented#Rect">Rect</a>, and not <a href="undocumented#Oval">Oval</a>. <a href="#Path">Path</a> constructed with other calls
will not return true though <a href="#Path">Path</a> draws <a href="undocumented#Round_Rect">Round Rect</a>.
<a href="#SkPath_isRRect_rrect">rrect</a> receives bounds of <a href="undocumented#Round_Rect">Round Rect</a>.
@ -1089,11 +1088,12 @@ storage for <a href="#SkPath_isRRect_start">start</a> of <a href="undocumented#R
### Return Value
true for <a href="undocumented#Round_Rect">Round Rect</a> <a href="#Path">Path</a> constructed by <a href="#SkPath_addRoundRect">addRoundRect</a> or <a href="#SkPath_addRRect">addRRect</a>
true if <a href="#Path">Path</a> <a href="#SkPath_contains">contains</a> only <a href="undocumented#Round_Rect">Round Rect</a>
### Example
<div><fiddle-embed name="f2b7e57a385e6604475c99ec8daa2697"></fiddle-embed></div>
<div><fiddle-embed name="f2b7e57a385e6604475c99ec8daa2697"><div>Draw rounded rectangle and its bounds. Draw an arc indicating where the rounded
rectangle starts and its direction.</div></fiddle-embed></div>
### See Also
@ -1108,7 +1108,7 @@ true for <a href="undocumented#Round_Rect">Round Rect</a> <a href="#Path">Path</
void reset()
</pre>
Sets <a href="#Path">Path</a> to its intial state.
Sets <a href="#Path">Path</a> to its initial state.
Removes <a href="#Verb_Array">Verb Array</a>, <a href="#Point_Array">Point Array</a>, and <a href="#Weight">Weights</a>, and sets <a href="#SkPath_FillType">FillType</a> to <a href="#SkPath_kWinding_FillType">kWinding FillType</a>.
Internal storage associated with <a href="#Path">Path</a> is released.
@ -1129,7 +1129,7 @@ Internal storage associated with <a href="#Path">Path</a> is released.
void rewind()
</pre>
Sets <a href="#Path">Path</a> to its intial state, preserving internal storage.
Sets <a href="#Path">Path</a> to its initial state, preserving internal storage.
Removes <a href="#Verb_Array">Verb Array</a>, <a href="#Point_Array">Point Array</a>, and <a href="#Weight">Weights</a>, and sets <a href="#SkPath_FillType">FillType</a> to <a href="#SkPath_kWinding_FillType">kWinding FillType</a>.
Internal storage associated with <a href="#Path">Path</a> is retained.
@ -1303,7 +1303,7 @@ Mark temporary paths, discarded or modified after use, as volatile
to inform <a href="undocumented#Device">Device</a> that the path need not be cached.
Mark animating <a href="#Path">Path</a> volatile to improve performance.
Mark unchanging <a href="#Path">Path</a> non-volative to improve repeated rendering.
Mark unchanging <a href="#Path">Path</a> non-volatile to improve repeated rendering.
<a href="undocumented#Raster_Surface">Raster Surface</a> <a href="#Path">Path</a> draws are affected by volatile for some shadows.
<a href="undocumented#GPU_Surface">GPU Surface</a> <a href="#Path">Path</a> draws are affected by volatile for some shadows and concave geometries.
@ -1356,8 +1356,8 @@ true if <a href="undocumented#Line">Line</a> is degenerate; its length is effect
### Example
<div><fiddle-embed name="97a031f9186ade586928563840ce9116"><div>As single precision floats, 100 and 100.000001f have the same bit representation,
and are exactly equal. 100 and 100.0001f have different bit representations, and
<div><fiddle-embed name="97a031f9186ade586928563840ce9116"><div>As single precision floats, 100 and 100.000001 have the same bit representation,
and are exactly equal. 100 and 100.0001 have different bit representations, and
are not exactly equal, but are nearly equal.</div>
#### Example Output
@ -1392,11 +1392,11 @@ treated as a point.
### Parameters
<table> <tr> <td><a name="SkPath_IsQuadDegenerate_p1"> <code><strong>p1 </strong></code> </a></td> <td>
quad start point</td>
<a href="#Quad">Quad</a> start point</td>
</tr> <tr> <td><a name="SkPath_IsQuadDegenerate_p2"> <code><strong>p2 </strong></code> </a></td> <td>
quad control point</td>
<a href="#Quad">Quad</a> control point</td>
</tr> <tr> <td><a name="SkPath_IsQuadDegenerate_p3"> <code><strong>p3 </strong></code> </a></td> <td>
quad end point</td>
<a href="#Quad">Quad</a> end point</td>
</tr> <tr> <td><a name="SkPath_IsQuadDegenerate_exact"> <code><strong>exact </strong></code> </a></td> <td>
if true, returns true only if <a href="#SkPath_IsQuadDegenerate_p1">p1</a>, <a href="#SkPath_IsQuadDegenerate_p2">p2</a>, and <a href="#SkPath_IsQuadDegenerate_p3">p3</a> are equal;
if false, returns true if <a href="#SkPath_IsQuadDegenerate_p1">p1</a>, <a href="#SkPath_IsQuadDegenerate_p2">p2</a>, and <a href="#SkPath_IsQuadDegenerate_p3">p3</a> are equal or nearly equal</td>
@ -1409,9 +1409,9 @@ true if <a href="#Quad">Quad</a> is degenerate; its length is effectively zero
### Example
<div><fiddle-embed name="1d50896c528cd4581966646b7d96acff"><div>As single precision floats: 100, 100.00001f, and 100.00002f have different bit representations
<div><fiddle-embed name="1d50896c528cd4581966646b7d96acff"><div>As single precision floats: 100, 100.00001, and 100.00002 have different bit representations
but nearly the same value. Translating all three by 1000 gives them the same bit representation;
the fractional portion of the number can't be represented by the float and is lost.</div>
the fractional portion of the number can not be represented by the float and is lost.</div>
#### Example Output
@ -1445,13 +1445,13 @@ treated as a point.
### Parameters
<table> <tr> <td><a name="SkPath_IsCubicDegenerate_p1"> <code><strong>p1 </strong></code> </a></td> <td>
cubic start point</td>
<a href="#Cubic">Cubic</a> start point</td>
</tr> <tr> <td><a name="SkPath_IsCubicDegenerate_p2"> <code><strong>p2 </strong></code> </a></td> <td>
cubic control point 1</td>
<a href="#Cubic">Cubic</a> control point 1</td>
</tr> <tr> <td><a name="SkPath_IsCubicDegenerate_p3"> <code><strong>p3 </strong></code> </a></td> <td>
cubic control point 2</td>
<a href="#Cubic">Cubic</a> control point 2</td>
</tr> <tr> <td><a name="SkPath_IsCubicDegenerate_p4"> <code><strong>p4 </strong></code> </a></td> <td>
cubic end point</td>
<a href="#Cubic">Cubic</a> end point</td>
</tr> <tr> <td><a name="SkPath_IsCubicDegenerate_exact"> <code><strong>exact </strong></code> </a></td> <td>
if true, returns true only if <a href="#SkPath_IsCubicDegenerate_p1">p1</a>, <a href="#SkPath_IsCubicDegenerate_p2">p2</a>, <a href="#SkPath_IsCubicDegenerate_p3">p3</a>, and <a href="#SkPath_IsCubicDegenerate_p4">p4</a> are equal;
if false, returns true if <a href="#SkPath_IsCubicDegenerate_p1">p1</a>, <a href="#SkPath_IsCubicDegenerate_p2">p2</a>, <a href="#SkPath_IsCubicDegenerate_p3">p3</a>, and <a href="#SkPath_IsCubicDegenerate_p4">p4</a> are equal or nearly equal</td>
@ -1522,7 +1522,7 @@ second move is not line
<a href="#Point_Array">Point Array</a> <a href="#SkPath_contains">contains</a> <a href="#Point">Points</a> satisfying the allocated <a href="#Point">Points</a> for
each <a href="#SkPath_Verb">Verb</a> in <a href="#Verb_Array">Verb Array</a>. For instance, <a href="#Path">Path</a> containing one <a href="#Contour">Contour</a> with <a href="undocumented#Line">Line</a>
and <a href="#Quad">Quad</a> is described by <a href="#Verb_Array">Verb Array</a>: move to, line to, quad to; and
and <a href="#Quad">Quad</a> is described by <a href="#Verb_Array">Verb Array</a>: Verb::kMoveTo, Verb::kLineTo, Verb::kQuadTo; and
one <a href="undocumented#Point">Point</a> for move, one <a href="undocumented#Point">Point</a> for <a href="undocumented#Line">Line</a>, two <a href="#Point">Points</a> for <a href="#Quad">Quad</a>; totaling four <a href="#Point">Points</a>.
<a href="#Point_Array">Point Array</a> may be read directly from <a href="#Path">Path</a> with <a href="#SkPath_getPoints">getPoints</a>, or inspected with
@ -1749,7 +1749,7 @@ Cached state is also exchanged. <a href="#SkPath_swap">swap</a> internally excha
it is lightweight and does not allocate memory.
<a href="#SkPath_swap">swap</a> usage has largely been replaced by <a href="#SkPath_copy_assignment_operator">operator=(const SkPath& path)</a>.
<a href="#Path">Paths</a> do not copy their content on assignment util they are written to,
<a href="#Path">Paths</a> do not copy their content on assignment until they are written to,
making assignment as efficient as <a href="#SkPath_swap">swap</a>.
### Parameters
@ -1946,7 +1946,7 @@ reducing the number and size of allocations when creating <a href="#Path">Path</
### Parameters
<table> <tr> <td><a name="SkPath_incReserve_extraPtCount"> <code><strong>extraPtCount </strong></code> </a></td> <td>
number of additional <a href="#Point">Points</a> to preallocate</td>
number of additional <a href="#Point">Points</a> to allocate</td>
</tr>
</table>
@ -2021,7 +2021,7 @@ void rMoveTo(SkScalar dx, SkScalar dy)
Adds beginning of <a href="#Contour">Contour</a> relative to <a href="#Last_Point">Last Point</a>.
If <a href="#Path">Path</a> is empty, starts <a href="#Contour">Contour</a> at (<a href="#SkPath_rMoveTo_dx">dx</a>, <a href="#SkPath_rMoveTo_dy">dy</a>).
Otherwise, start <a href="#Contour">Contour</a> at <a href="#Last_Point">Last Point</a> <a href="#SkPath_offset">offset</a> by (<a href="#SkPath_rMoveTo_dx">dx</a>, <a href="#SkPath_rMoveTo_dy">dy</a>).
Function name stands for relative move to.
Function name stands for "relative move to".
### Parameters
@ -2114,7 +2114,7 @@ Adds <a href="undocumented#Line">Line</a> from <a href="#Last_Point">Last Point<
Appends <a href="#SkPath_kMove_Verb">kMove Verb</a> to <a href="#Verb_Array">Verb Array</a> and (0, 0) to <a href="#Point_Array">Point Array</a>, if needed;
then appends <a href="#SkPath_kLine_Verb">kLine Verb</a> to <a href="#Verb_Array">Verb Array</a> and <a href="undocumented#Line">Line</a> end to <a href="#Point_Array">Point Array</a>.
<a href="undocumented#Line">Line</a> end is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (<a href="#SkPath_rLineTo_dx">dx</a>, <a href="#SkPath_rLineTo_dy">dy</a>).
Function name stands for relative line to.
Function name stands for "relative line to".
### Parameters
@ -2239,7 +2239,7 @@ if needed; then appends <a href="#SkPath_kQuad_Verb">kQuad Verb</a> to <a href="
control and <a href="#Quad">Quad</a> end to <a href="#Point_Array">Point Array</a>.
<a href="#Quad">Quad</a> control is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (<a href="#SkPath_rQuadTo_dx1">dx1</a>, <a href="#SkPath_rQuadTo_dy1">dy1</a>).
<a href="#Quad">Quad</a> end is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (<a href="#SkPath_rQuadTo_dx2">dx2</a>, <a href="#SkPath_rQuadTo_dy2">dy2</a>).
Function name stands for relative quad to.
Function name stands for "relative quad to".
### Parameters
@ -2309,7 +2309,7 @@ done
</fiddle-embed></div>
If weight is greater than one, <a href="#Conic">Conic</a> is a hyperbolic segment. As w gets large,
If weight is greater than one, <a href="#Conic">Conic</a> is a hyperbolic segment. As weight gets large,
a hyperbolic segment can be approximated by straight lines connecting the
control <a href="undocumented#Point">Point</a> with the end <a href="#Point">Points</a>.
@ -2410,7 +2410,7 @@ weight of added <a href="#Conic">Conic</a></td>
### Example
<div><fiddle-embed name="22d25e03b19d5bae92118877e462361b"><div><a href="#Conic">Conics</a> and arcs use identical representations. As the arc sweep increases
the conic weight also increases, but remains smaller than one.</div></fiddle-embed></div>
the <a href="#Conic_Weight">Conic Weight</a> also increases, but remains smaller than one.</div></fiddle-embed></div>
### See Also
@ -2440,7 +2440,7 @@ In all cases appends <a href="#Point">Points</a> control and end to <a href="#Po
control is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (<a href="#SkPath_rConicTo_dx1">dx1</a>, <a href="#SkPath_rConicTo_dy1">dy1</a>).
end is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (<a href="#SkPath_rConicTo_dx2">dx2</a>, <a href="#SkPath_rConicTo_dy2">dy2</a>).
Function name stands for relative conic to.
Function name stands for "relative conic to".
### Parameters
@ -2468,7 +2468,7 @@ weight of added <a href="#Conic">Conic</a></td>
---
# <a name="Cubic"></a> Cubic
<a href="#Cubic">Cubic</a> describes a cubic <a href="undocumented#Bezier">Bezier</a>, a third-order curve.
<a href="#Cubic">Cubic</a> describes a <a href="undocumented#Bezier">Bezier</a> curve segment described by a third-order polynomial.
<a href="#Cubic">Cubic</a> begins at a start <a href="undocumented#Point">Point</a>, curving towards the first control <a href="undocumented#Point">Point</a>;
and curves from the end <a href="undocumented#Point">Point</a> towards the second control <a href="undocumented#Point">Point</a>.
@ -2570,7 +2570,7 @@ if needed; then appends <a href="#SkPath_kCubic_Verb">kCubic Verb</a> to <a href
control and <a href="#Cubic">Cubic</a> end to <a href="#Point_Array">Point Array</a>.
<a href="#Cubic">Cubic</a> control is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (dx1, dy1).
<a href="#Cubic">Cubic</a> end is <a href="#Last_Point">Last Point</a> plus <a href="undocumented#Vector">Vector</a> (dx2, dy2).
Function name stands for relative cubic to.
Function name stands for "relative cubic to".
### Parameters
@ -2717,7 +2717,7 @@ The length of <a href="undocumented#Vector">Vector</a> from (<a href="#SkPath_ar
tangents are nearly parallel, <a href="#SkPath_arcTo">arcTo</a> appends <a href="undocumented#Line">Line</a> from last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> to (<a href="#SkPath_arcTo_2_x1">x1</a>, <a href="#SkPath_arcTo_2_y1">y1</a>).
<a href="#SkPath_arcTo">arcTo</a> appends at most one <a href="undocumented#Line">Line</a> and one <a href="#Conic">Conic</a>.
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="undocumented#PostScript_arct">PostScript arct</a> and <a href="undocumented#HTML_Canvas_arcTo">HTML Canvas arcTo</a>.
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="#Arct">PostScript Arct</a> and <a href="undocumented#HTML_Canvas_ArcTo">HTML Canvas ArcTo</a>.
### Parameters
@ -2770,7 +2770,7 @@ The length of <a href="undocumented#Vector">Vector</a> from <a href="#SkPath_arc
tangents are nearly parallel, <a href="#SkPath_arcTo">arcTo</a> appends <a href="undocumented#Line">Line</a> from last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> to <a href="#SkPath_arcTo_3_p1">p1</a>.
<a href="#SkPath_arcTo">arcTo</a> appends at most one <a href="undocumented#Line">Line</a> and one <a href="#Conic">Conic</a>.
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="undocumented#PostScript_arct">PostScript arct</a> and <a href="undocumented#HTML_Canvas_arcTo">HTML Canvas arcTo</a>.
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="#Arct">PostScript Arct</a> and <a href="undocumented#HTML_Canvas_ArcTo">HTML Canvas ArcTo</a>.
### Parameters
@ -2840,7 +2840,7 @@ void arcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc,
Direction sweep, SkScalar x, SkScalar y)
</pre>
Append <a href="#Arc">Arc</a> to <a href="#Path">Path</a>. <a href="#Arc">Arc</a> is implemented by one or more <a href="#Conic">Conic</a> weighted to describe part of <a href="undocumented#Oval">Oval</a>
Append <a href="#Arc">Arc</a> to <a href="#Path">Path</a>. <a href="#Arc">Arc</a> is implemented by one or more <a href="#Conic">Conics</a> weighted to describe part of <a href="undocumented#Oval">Oval</a>
with radii (<a href="#SkPath_arcTo_4_rx">rx</a>, <a href="#SkPath_arcTo_4_ry">ry</a>) rotated by <a href="#SkPath_arcTo_4_xAxisRotate">xAxisRotate</a> degrees. <a href="#Arc">Arc</a> curves from last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> to (<a href="#SkPath_arcTo_4_x">x</a>, <a href="#SkPath_arcTo_4_y">y</a>),
choosing one of four possible routes: clockwise or counterclockwise, and smaller or larger.
@ -2849,8 +2849,8 @@ or if last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> equal
(<a href="#SkPath_arcTo_4_x">x</a>, <a href="#SkPath_arcTo_4_y">y</a>) if both are greater than zero but too small.
<a href="#SkPath_arcTo">arcTo</a> appends up to four <a href="#Conic">Conic</a> curves.
<a href="#SkPath_arcTo">arcTo</a> implements the functionatlity of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> sweep-flag value is
opposite the integer value of <a href="#SkPath_arcTo_4_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> sweep-flag uses 1 for clockwise, while <a href="#SkPath_kCW_Direction">kCW Direction</a>
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> "" value is
opposite the integer value of <a href="#SkPath_arcTo_4_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> "" uses 1 for clockwise, while <a href="#SkPath_kCW_Direction">kCW Direction</a>
cast to int is zero.
### Parameters
@ -2860,7 +2860,7 @@ radius in <a href="#SkPath_arcTo_4_x">x</a> before x-axis rotation</td>
</tr> <tr> <td><a name="SkPath_arcTo_4_ry"> <code><strong>ry </strong></code> </a></td> <td>
radius in <a href="#SkPath_arcTo_4_y">y</a> before x-axis rotation</td>
</tr> <tr> <td><a name="SkPath_arcTo_4_xAxisRotate"> <code><strong>xAxisRotate </strong></code> </a></td> <td>
x-axis rotation in degrees; positve values are clockwise</td>
x-axis rotation in degrees; positive values are clockwise</td>
</tr> <tr> <td><a name="SkPath_arcTo_4_largeArc"> <code><strong>largeArc </strong></code> </a></td> <td>
chooses smaller or larger <a href="#Arc">Arc</a></td>
</tr> <tr> <td><a name="SkPath_arcTo_4_sweep"> <code><strong>sweep </strong></code> </a></td> <td>
@ -2894,19 +2894,19 @@ and smaller or larger.
<a href="#Arc">Arc</a> <a href="#SkPath_arcTo_5_sweep">sweep</a> is always less than 360 degrees. <a href="#SkPath_arcTo">arcTo</a> appends <a href="undocumented#Line">Line</a> to <a href="#SkPath_arcTo_5_xy">xy</a> if either radii are zero,
or if last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> equals (x, y). <a href="#SkPath_arcTo">arcTo</a> scales radii <a href="#SkPath_arcTo_5_r">r</a> to fit last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> and
<a href="#SkPath_arcTo_5_xy">xy</a> if both are greater than zero but too small.
<a href="#SkPath_arcTo_5_xy">xy</a> if both are greater than zero but too small to describe an arc.
<a href="#SkPath_arcTo">arcTo</a> appends up to four <a href="#Conic">Conic</a> curves.
<a href="#SkPath_arcTo">arcTo</a> implements the functionatlity of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> sweep-flag value is
opposite the integer value of <a href="#SkPath_arcTo_5_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> sweep-flag uses 1 for clockwise, while <a href="#SkPath_kCW_Direction">kCW Direction</a>
cast to int is zero.
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> "" value is
opposite the integer value of <a href="#SkPath_arcTo_5_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> "" uses 1 for clockwise, while
<a href="#SkPath_kCW_Direction">kCW Direction</a> cast to int is zero.
### Parameters
<table> <tr> <td><a name="SkPath_arcTo_5_r"> <code><strong>r </strong></code> </a></td> <td>
radii in x and y before x-axis rotation</td>
</tr> <tr> <td><a name="SkPath_arcTo_5_xAxisRotate"> <code><strong>xAxisRotate </strong></code> </a></td> <td>
x-axis rotation in degrees; positve values are clockwise</td>
x-axis rotation in degrees; positive values are clockwise</td>
</tr> <tr> <td><a name="SkPath_arcTo_5_largeArc"> <code><strong>largeArc </strong></code> </a></td> <td>
chooses smaller or larger <a href="#Arc">Arc</a></td>
</tr> <tr> <td><a name="SkPath_arcTo_5_sweep"> <code><strong>sweep </strong></code> </a></td> <td>
@ -2935,19 +2935,20 @@ void rArcTo(SkScalar rx, SkScalar ry, SkScalar xAxisRotate, ArcSize largeArc,
</pre>
Append <a href="#Arc">Arc</a> to <a href="#Path">Path</a>, relative to last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a>. <a href="#Arc">Arc</a> is implemented by one or
more <a href="#Conic">Conic</a>, weighted to describe part of <a href="undocumented#Oval">Oval</a> with radii (r.fX, r.fY) rotated by
<a href="#SkPath_rArcTo_xAxisRotate">xAxisRotate</a> degrees. <a href="#Arc">Arc</a> curves from last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> (x0, y0) to(x0 + <a href="#SkPath_rArcTo_dx">dx</a>, y0 + <a href="#SkPath_rArcTo_dy">dy</a>),
more <a href="#Conic">Conic</a>, weighted to describe part of <a href="undocumented#Oval">Oval</a> with radii (<a href="#SkPath_rArcTo_rx">rx</a>, <a href="#SkPath_rArcTo_ry">ry</a>) rotated by
<a href="#SkPath_rArcTo_xAxisRotate">xAxisRotate</a> degrees. <a href="#Arc">Arc</a> curves from last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> (x0, y0) to end <a href="undocumented#Point">Point</a>(x0 + <a href="#SkPath_rArcTo_dx">dx</a>, y0 + <a href="#SkPath_rArcTo_dy">dy</a>),
choosing one of four possible routes: clockwise or
counterclockwise, and smaller or larger. If <a href="#Path">Path</a> is empty, the start <a href="#Arc">Arc</a> <a href="undocumented#Point">Point</a>
is (0, 0).
<a href="#Arc">Arc</a> <a href="#SkPath_rArcTo_sweep">sweep</a> is always less than 360 degrees. <a href="#SkPath_arcTo">arcTo</a> appends <a href="undocumented#Line">Line</a> to xy if either
radii are zero, or if last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> equals (x, y). <a href="#SkPath_arcTo">arcTo</a> scales radii r to fit
last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> and xy if both are greater than zero but too small.
<a href="#Arc">Arc</a> <a href="#SkPath_rArcTo_sweep">sweep</a> is always less than 360 degrees. <a href="#SkPath_arcTo">arcTo</a> appends <a href="undocumented#Line">Line</a> to end <a href="undocumented#Point">Point</a>
if either radii are zero, or if last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> equals end <a href="undocumented#Point">Point</a>.
<a href="#SkPath_arcTo">arcTo</a> scales radii (<a href="#SkPath_rArcTo_rx">rx</a>, <a href="#SkPath_rArcTo_ry">ry</a>) to fit last <a href="#Path">Path</a> <a href="undocumented#Point">Point</a> and end <a href="undocumented#Point">Point</a> if both are
greater than zero but too small to describe an arc.
<a href="#SkPath_arcTo">arcTo</a> appends up to four <a href="#Conic">Conic</a> curves.
<a href="#SkPath_arcTo">arcTo</a> implements the functionatlity of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> sweep-flag value is
opposite the integer value of <a href="#SkPath_rArcTo_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> sweep-flag uses 1 for clockwise, while
<a href="#SkPath_arcTo">arcTo</a> implements the functionality of <a href="#Arc">SVG Arc</a>, although <a href="undocumented#SVG">SVG</a> "" value is
opposite the integer value of <a href="#SkPath_rArcTo_sweep">sweep</a>; <a href="undocumented#SVG">SVG</a> "" uses 1 for clockwise, while
<a href="#SkPath_kCW_Direction">kCW Direction</a> cast to int is zero.
### Parameters
@ -2957,7 +2958,7 @@ radius in x before x-axis rotation</td>
</tr> <tr> <td><a name="SkPath_rArcTo_ry"> <code><strong>ry </strong></code> </a></td> <td>
radius in y before x-axis rotation</td>
</tr> <tr> <td><a name="SkPath_rArcTo_xAxisRotate"> <code><strong>xAxisRotate </strong></code> </a></td> <td>
x-axis rotation in degrees; positve values are clockwise</td>
x-axis rotation in degrees; positive values are clockwise</td>
</tr> <tr> <td><a name="SkPath_rArcTo_largeArc"> <code><strong>largeArc </strong></code> </a></td> <td>
chooses smaller or larger <a href="#Arc">Arc</a></td>
</tr> <tr> <td><a name="SkPath_rArcTo_sweep"> <code><strong>sweep </strong></code> </a></td> <td>
@ -2987,7 +2988,7 @@ void close()
</pre>
Append <a href="#SkPath_kClose_Verb">kClose Verb</a> to <a href="#Path">Path</a>. A closed <a href="#Contour">Contour</a> connects the first and last <a href="undocumented#Point">Point</a>
with <a href="undocumented#Line">Line</a>, forming a continous loop. Open and closed <a href="#Contour">Contour</a> draw the same
with <a href="undocumented#Line">Line</a>, forming a continuous loop. Open and closed <a href="#Contour">Contour</a> draw the same
with <a href="#SkPaint_kFill_Style">SkPaint::kFill Style</a>. With <a href="#SkPaint_kStroke_Style">SkPaint::kStroke Style</a>, open <a href="#Contour">Contour</a> draws
<a href="#Stroke_Cap">Paint Stroke Cap</a> at <a href="#Contour">Contour</a> start and end; closed <a href="#Contour">Contour</a> draws
<a href="#Stroke_Join">Paint Stroke Join</a> at <a href="#Contour">Contour</a> start and end.
@ -3167,7 +3168,7 @@ bool isRect(SkRect* rect, bool* isClosed = nullptr,
Direction* direction = nullptr) const
</pre>
Returns true if <a href="#Path">Path</a> is eqivalent to <a href="undocumented#Rect">Rect</a> when filled.
Returns true if <a href="#Path">Path</a> is equivalent to <a href="undocumented#Rect">Rect</a> when filled.
If false: <a href="#SkPath_isRect_rect">rect</a>, <a href="#SkPath_isRect_isClosed">isClosed</a>, and <a href="#SkPath_isRect_direction">direction</a> are unchanged.
If true: <a href="#SkPath_isRect_rect">rect</a>, <a href="#SkPath_isRect_isClosed">isClosed</a>, and <a href="#SkPath_isRect_direction">direction</a> are written to if not nullptr.
@ -3692,7 +3693,7 @@ index of initial point of <a href="undocumented#Round_Rect">Round Rect</a></td>
void addPoly(const SkPoint pts[], int count, bool close)
</pre>
Add <a href="#Contour">Contour</a> created from <a href="undocumented#Line">Line</a> array, adding<a href="#SkPath_addPoly_count">count</a> - 1<a href="undocumented#Line">Line</a> segments. <a href="#Contour">Contour</a> added starts at pt[0], then adds a line
Add <a href="#Contour">Contour</a> created from <a href="undocumented#Line">Line</a> array, adding<a href="#SkPath_addPoly_count">count</a> - 1<a href="undocumented#Line">Line</a> segments. <a href="#Contour">Contour</a> added starts at <a href="#SkPath_addPoly_pts">pts</a>[0], then adds a line
for every additional <a href="undocumented#Point">Point</a> in <a href="#SkPath_addPoly_pts">pts</a> array. If <a href="#SkPath_close">close</a> is true,
appends <a href="#SkPath_kClose_Verb">kClose Verb</a> to <a href="#Path">Path</a>, connecting <a href="#SkPath_addPoly_pts">pts</a>[<a href="#SkPath_addPoly_count">count</a> - 1] and <a href="#SkPath_addPoly_pts">pts</a>[0].
@ -4223,7 +4224,7 @@ void dump(SkWStream* stream, bool forceClose, bool dumpAsHex) const
</pre>
Writes text representation of <a href="#Path">Path</a> to <a href="#SkPath_dump_stream">stream</a>. If <a href="#SkPath_dump_stream">stream</a> is nullptr, <a href="#SkPath_dump_2">dump</a> writes to
stdout. Set <a href="#SkPath_dump_forceClose">forceClose</a> to true to get
standard output. Set <a href="#SkPath_dump_forceClose">forceClose</a> to true to get
edges used to fill <a href="#Path">Path</a>. Set <a href="#SkPath_dump_dumpAsHex">dumpAsHex</a> true to get exact binary representations
of floating point numbers used in <a href="#Point_Array">Point Array</a> and <a href="#Weight">Conic Weights</a>.
@ -4234,7 +4235,7 @@ writable <a href="undocumented#Stream">Stream</a> receiving <a href="#Path">Path
</tr> <tr> <td><a name="SkPath_dump_forceClose"> <code><strong>forceClose </strong></code> </a></td> <td>
true if missing <a href="#SkPath_kClose_Verb">kClose Verb</a> is output</td>
</tr> <tr> <td><a name="SkPath_dump_dumpAsHex"> <code><strong>dumpAsHex </strong></code> </a></td> <td>
true if <a href="undocumented#SkScalar">SkScalar</a> values are written as hexidecimal</td>
true if <a href="undocumented#SkScalar">SkScalar</a> values are written as hexadecimal</td>
</tr>
</table>
@ -4275,7 +4276,7 @@ path.close();
void dump() const
</pre>
Writes text representation of <a href="#Path">Path</a> to stdout. The representation may be
Writes text representation of <a href="#Path">Path</a> to standard output. The representation may be
directly compiled as <a href="undocumented#C">C</a>++ code. Floating point values are written
with limited precision; it may not be possible to reconstruct original <a href="#Path">Path</a>
from output.
@ -4308,12 +4309,12 @@ path is not equal to copy
void dumpHex() const
</pre>
Writes text representation of <a href="#Path">Path</a> to stdout. The representation may be
Writes text representation of <a href="#Path">Path</a> to standard output. The representation may be
directly compiled as <a href="undocumented#C">C</a>++ code. Floating point values are written
in hexadecimal to preserve their exact bit pattern. The output reconstructs the
original <a href="#Path">Path</a>.
Use instead of <a href="#SkPath_dump_2">dump</a> when submittingbug reports against <a href="undocumented#Skia">Skia</a>http://bug.skia.org.
Use instead of <a href="#SkPath_dump_2">dump</a> when submittingbug reports against <a href="undocumented#Skia">Skia</a>.
Slight value changes in <a href="#Point_Array">Point Array</a> may cause the bug to disappear.
### Example

View File

@ -93,6 +93,10 @@ bool equalsWithinTolerance(const SkPoint& p) const
# <a name="SkDumpCanvas"></a> Class SkDumpCanvas
# <a name="Alias"></a> Alias
# <a name="Anti-alias"></a> Anti-alias
# <a name="BBH_Factory"></a> BBH Factory
# <a name="SkBBHFactory"></a> Class SkBBHFactory
@ -229,12 +233,18 @@ int SkColorSetARGB(a, r, g, b)
# <a name="Color_Space"></a> Color Space
# <a name="Core_Graphics"></a> Core Graphics
# <a name="Core_Text"></a> Core Text
# <a name="Data"></a> Data
# <a name="Draw_Filter"></a> Draw Filter
# <a name="SkDrawFilter"></a> Class SkDrawFilter
# <a name="Draw_Layer"></a> Draw Layer
# <a name="Draw_Looper"></a> Draw Looper
# <a name="SkDrawLooper"></a> Class SkDrawLooper
@ -306,6 +316,10 @@ static std::unique_ptr<SkCanvas>
# <a name="GPU_Surface"></a> GPU Surface
# <a name="HTML_Canvas"></a> HTML Canvas
## <a name="ArcTo"></a> ArcTo
# <a name="Image"></a> Image
## <a name="Alpha_Type"></a> Alpha Type
@ -403,6 +417,8 @@ sk_sp<SkShader> makeShader(SkShader::TileMode, SkShader::TileMode,
# <a name="SkIRect"></a> Struct SkIRect
# <a name="Left_Side_Bearing"></a> Left Side Bearing
# <a name="Mask"></a> Mask
# <a name="Mask_Alpha"></a> Mask Alpha
@ -436,6 +452,8 @@ sk_sp<SkShader> makeShader(SkShader::TileMode, SkShader::TileMode,
</tr>
</table>
# <a name="OS_X"></a> OS X
# <a name="Paint_Defaults"></a> Paint Defaults
### Constants
@ -507,6 +525,14 @@ SkCanvas* beginRecording(const SkRect& bounds, SkBBHFactory* bbhFactory = NULL,
# <a name="SkPixmap"></a> Class SkPixmap
# <a name="PostScript"></a> PostScript
## <a name="Arct"></a> Arct
# <a name="Premultiply"></a> Premultiply
# <a name="Raster_Engine"></a> Raster Engine
# <a name="Raster_Surface"></a> Raster Surface
# <a name="Rasterizer"></a> Rasterizer
@ -519,6 +545,8 @@ SkCanvas* beginRecording(const SkRect& bounds, SkBBHFactory* bbhFactory = NULL,
# <a name="sk_sp"></a> Class sk_sp
# <a name="Right_Side_Bearing"></a> Right Side Bearing
# <a name="Round_Rect"></a> Round Rect
# <a name="SkRRect"></a> Class SkRRect
@ -583,6 +611,8 @@ static sk_sp<SkShader> MakeBitmapShader(const SkBitmap& src, TileMode tmx,
# <a name="SkString"></a> Class SkString
# <a name="Supersampling"></a> Supersampling
# <a name="Surface"></a> Surface
# <a name="SkSurface"></a> Class SkSurface
@ -627,6 +657,8 @@ static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo&, void* pixels,
# <a name="SkTextBlob"></a> Class SkTextBlob
# <a name="Unpremultiply"></a> Unpremultiply
# <a name="Vertices"></a> Vertices
## <a name="Colors"></a> Colors

View File

@ -4,7 +4,7 @@ usingBookmaker
# <a name="Bookmaker"></a> Bookmaker
How to use the <a href="#Bookmaker">Bookmaker</a> utility.
Install<a href="usingBookmaker#Go">Go</a>https://golang.org/doc/installif needed.
Install<a href="usingBookmaker#Go">Go</a>if needed.
Get the fiddle command line interface tool.
By default this will appear in your home directory.
@ -94,4 +94,4 @@ $ ./out/dir/bookmaker -p -b docs -i include/core/<a href="usingBookmaker#SkXXX">
## <a name="Bugs"></a> Bugs
<a href="#Bookmaker">Bookmaker</a> bugs are trackedherebug.skia.org/6898.
<a href="#Bookmaker">Bookmaker</a> bugs are trackedhere.

View File

@ -7,7 +7,6 @@
#include "bookmaker.h"
#include "SkCommandLineFlags.h"
#include "SkOSFile.h"
#include "SkOSPath.h"
@ -790,12 +789,12 @@ bool RootDefinition::dumpUnVisited() {
return allStructElementsFound;
}
const Definition* RootDefinition::find(const string& ref) const {
const Definition* RootDefinition::find(const string& ref, AllowParens allowParens) const {
const auto leafIter = fLeaves.find(ref);
if (leafIter != fLeaves.end()) {
return &leafIter->second;
}
if (string::npos == ref.find("()")) {
if (AllowParens::kYes == allowParens && string::npos == ref.find("()")) {
string withParens = ref + "()";
const auto parensIter = fLeaves.find(withParens);
if (parensIter != fLeaves.end()) {
@ -810,7 +809,7 @@ const Definition* RootDefinition::find(const string& ref) const {
const Definition* result = nullptr;
for (const auto& branch : fBranches) {
const RootDefinition* rootDef = branch.second;
result = rootDef->find(ref);
result = rootDef->find(ref, allowParens);
if (result) {
break;
}
@ -866,7 +865,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
}
definition = fParent;
} else {
if (!hasEnd && fRoot->find(name)) {
if (!hasEnd && fRoot->find(name, RootDefinition::AllowParens::kNo)) {
return this->reportError<bool>("duplicate symbol");
}
if (MarkType::kStruct == markType || MarkType::kClass == markType) {
@ -990,7 +989,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
case MarkType::kDefinedBy: {
string prefixed(fRoot->fName);
const char* start = fChar;
string name(start, this->trimmedBracketEnd(fMC, OneLine::kYes) - start);
string name(start, this->trimmedBracketEnd(fMC) - start);
prefixed += "::" + name;
this->skipToEndBracket(fMC);
const auto leafIter = fRoot->fLeaves.find(prefixed);
@ -1039,7 +1038,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
definition->fName = typeNameBuilder[0];
definition->fFiddle = fParent->fFiddle;
definition->fContentStart = fChar;
definition->fContentEnd = this->trimmedBracketEnd(fMC, OneLine::kYes);
definition->fContentEnd = this->trimmedBracketEnd(fMC);
this->skipToEndBracket(fMC);
SkAssertResult(fMC == this->next());
SkAssertResult(fMC == this->next());
@ -1079,6 +1078,9 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
fMarkup.emplace_front(markType, defStart, fLineCount, fParent);
definition = &fMarkup.front();
definition->fContentStart = fChar;
if (MarkType::kFormula == markType && MarkType::kRow == definition->fParent->fMarkType) {
SkDebugf("");
}
definition->fName = typeNameBuilder[0];
definition->fFiddle = fParent->fFiddle;
char suffix = '\0';
@ -1127,7 +1129,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
definition->fName = typeNameBuilder[0];
definition->fFiddle = normalized_name(typeNameBuilder[0]);
definition->fContentStart = fChar;
definition->fContentEnd = this->trimmedBracketEnd('\n', OneLine::kYes);
definition->fContentEnd = this->trimmedBracketEnd('\n');
definition->fTerminator = this->lineEnd() - 1;
fParent->fChildren.push_back(definition);
if (MarkType::kAnchor == markType) {
@ -1137,7 +1139,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
this->skipWhiteSpace();
Definition* link = &fMarkup.front();
link->fContentStart = fChar;
link->fContentEnd = this->trimmedBracketEnd(fMC, OneLine::kYes);
link->fContentEnd = this->trimmedBracketEnd(fMC);
this->skipToEndBracket(fMC);
SkAssertResult(fMC == this->next());
SkAssertResult(fMC == this->next());
@ -1393,14 +1395,29 @@ int BmhParser::endHashCount() const {
return count;
}
bool BmhParser::endTableColumn(const char* end, const char* terminator) {
if (!this->popParentStack(fParent)) {
return false;
}
fWorkingColumn->fContentEnd = end;
fWorkingColumn->fTerminator = terminator;
fColStart = fChar - 1;
this->skipSpace();
fTableState = TableState::kColumnStart;
return true;
}
// FIXME: some examples may produce different output on different platforms
// if the text output can be different, think of how to author that
bool BmhParser::findDefinitions() {
bool lineStart = true;
const char* lastChar = nullptr;
const char* lastMC = nullptr;
fParent = nullptr;
while (!this->eof()) {
if (this->peek() == fMC) {
lastMC = fChar;
this->next();
if (this->peek() == fMC) {
this->next();
@ -1408,10 +1425,25 @@ bool BmhParser::findDefinitions() {
return this->reportError<bool>("expected definition");
}
if (this->peek() != fMC) {
vector<string> parentName;
parentName.push_back(fParent->fName);
if (!this->addDefinition(fChar - 1, true, fParent->fMarkType, parentName)) {
return false;
if (MarkType::kColumn == fParent->fMarkType) {
SkASSERT(TableState::kColumnEnd == fTableState);
if (!this->endTableColumn(lastChar, lastMC)) {
return false;
}
SkASSERT(fRow);
if (!this->popParentStack(fParent)) {
return false;
}
fRow->fContentEnd = fWorkingColumn->fContentEnd;
fWorkingColumn = nullptr;
fRow = nullptr;
fTableState = TableState::kNone;
} else {
vector<string> parentName;
parentName.push_back(fParent->fName);
if (!this->addDefinition(fChar - 1, true, fParent->fMarkType, parentName)) {
return false;
}
}
} else {
SkAssertResult(this->next() == fMC);
@ -1462,15 +1494,22 @@ bool BmhParser::findDefinitions() {
&& MarkType::kLegend != fParent->fMarkType
&& MarkType::kList != fParent->fMarkType)) {
int endHashes = this->endHashCount();
if (endHashes <= 1) { // one line comment
if (endHashes <= 1) {
if (fParent) {
fMarkup.emplace_front(MarkType::kComment, fChar - 1, fLineCount, fParent);
Definition* comment = &fMarkup.front();
comment->fContentStart = fChar - 1;
this->skipToEndBracket('\n');
comment->fContentEnd = fChar;
comment->fTerminator = fChar;
fParent->fChildren.push_back(comment);
if (TableState::kColumnEnd == fTableState) {
if (!this->endTableColumn(lastChar, lastMC)) {
return false;
}
} else { // one line comment
fMarkup.emplace_front(MarkType::kComment, fChar - 1, fLineCount,
fParent);
Definition* comment = &fMarkup.front();
comment->fContentStart = fChar - 1;
this->skipToEndBracket('\n');
comment->fContentEnd = fChar;
comment->fTerminator = fChar;
fParent->fChildren.push_back(comment);
}
} else {
fChar = fLine + this->lineLength() - 1;
}
@ -1485,41 +1524,37 @@ bool BmhParser::findDefinitions() {
return this->reportError<bool>("missing table");
}
}
} else {
} else if (TableState::kNone == fTableState) {
bool parentIsList = MarkType::kList == fParent->fMarkType;
// fixme? no nested tables for now
const char* colStart = fChar - 1;
fMarkup.emplace_front(MarkType::kRow, colStart, fLineCount, fParent);
Definition* row = &fMarkup.front();
this->skipWhiteSpace();
row->fContentStart = fChar;
this->setAsParent(row);
const char* lineEnd = this->lineEnd();
do {
fMarkup.emplace_front(MarkType::kColumn, colStart, fLineCount, fParent);
Definition* column = &fMarkup.front();
column->fContentStart = fChar;
column->fContentEnd = this->trimmedBracketEnd(fMC,
parentIsList ? OneLine::kNo : OneLine::kYes);
this->skipToEndBracket(fMC);
colStart = fChar;
SkAssertResult(fMC == this->next());
if (fMC == this->peek()) {
this->next();
}
column->fTerminator = fChar;
fParent->fChildren.push_back(column);
this->skipSpace();
} while (fChar < lineEnd && '\n' != this->peek());
if (!this->popParentStack(fParent)) {
return false;
if (parentIsList && fLineCount > 1230) {
SkDebugf("");
}
const Definition* lastCol = row->fChildren.back();
row->fContentEnd = lastCol->fContentEnd;
// fixme? no nested tables for now
fColStart = fChar - 1;
fMarkup.emplace_front(MarkType::kRow, fColStart, fLineCount, fParent);
fRow = &fMarkup.front();
fRow->fName = fParent->fName;
this->skipWhiteSpace();
fRow->fContentStart = fChar;
this->setAsParent(fRow);
fTableState = TableState::kColumnStart;
}
if (TableState::kColumnStart == fTableState) {
fMarkup.emplace_front(MarkType::kColumn, fColStart, fLineCount, fParent);
fWorkingColumn = &fMarkup.front();
fWorkingColumn->fName = fParent->fName;
fWorkingColumn->fContentStart = fChar;
this->setAsParent(fWorkingColumn);
fTableState = TableState::kColumnEnd;
continue;
}
}
}
lineStart = this->next() == '\n';
char nextChar = this->next();
lineStart = nextChar == '\n';
if (' ' < nextChar) {
lastChar = fChar;
}
}
if (fParent) {
return this->reportError<bool>("mismatched end");
@ -2115,7 +2150,7 @@ DEFINE_string2(include, i, "", "A path to a *.h file or a directory.");
DEFINE_bool2(hack, k, false, "Do a find/replace hack to update all *.bmh files. (Requires -b)");
DEFINE_bool2(populate, p, false, "Populate include from bmh. (Requires -b -i)");
DEFINE_string2(ref, r, "", "Resolve refs and write bmh_*.md files to path. (Requires -b)");
DEFINE_bool2(spellcheck, s, false, "Spell-check. (Requires -b)");
DEFINE_string2(spellcheck, s, "", "Spell-check [once, all, mispellings]. (Requires -b)");
DEFINE_bool2(tokens, t, false, "Output include tokens. (Requires -i)");
DEFINE_bool2(crosscheck, x, false, "Check bmh against includes. (Requires -b -i)");
@ -2198,7 +2233,7 @@ int main(int argc, char** const argv) {
SkCommandLineFlags::PrintUsage();
return 1;
}
if (FLAGS_bmh.isEmpty() && FLAGS_spellcheck) {
if (FLAGS_bmh.isEmpty() && !FLAGS_spellcheck.isEmpty()) {
SkDebugf("-s requires -b\n");
SkCommandLineFlags::PrintUsage();
return 1;
@ -2257,8 +2292,8 @@ int main(int argc, char** const argv) {
MdOut mdOut(bmhParser);
mdOut.buildReferences(FLAGS_bmh[0], FLAGS_ref[0]);
}
if (!done && FLAGS_spellcheck && FLAGS_examples.isEmpty()) {
bmhParser.spellCheck(FLAGS_bmh[0]);
if (!done && !FLAGS_spellcheck.isEmpty() && FLAGS_examples.isEmpty()) {
bmhParser.spellCheck(FLAGS_bmh[0], FLAGS_spellcheck);
done = true;
}
int examples = 0;

View File

@ -10,6 +10,7 @@
#define STDOUT_TO_IDE_OUT 0
#include "SkCommandLineFlags.h"
#include "SkData.h"
#include <algorithm>
@ -205,11 +206,6 @@ class TextParser : public NonAssignable {
TextParser() {} // only for ParserCommon to call
friend class ParserCommon;
public:
enum OneLine {
kNo,
kYes
};
class Save {
public:
Save(TextParser* parser) {
@ -435,7 +431,7 @@ public:
void skipToNonAlphaNum() {
while (fChar < fEnd && (isalnum(fChar[0])
|| '_' == fChar[0] || '-' == fChar[0]
|| (':' == fChar[0] && fChar +1 < fEnd && ':' == fChar[1])
|| (':' == fChar[0] && fChar + 1 < fEnd && ':' == fChar[1])
|| ('.' == fChar[0] && fChar + 1 < fEnd && isalpha(fChar[1])))) {
if (':' == fChar[0] && fChar +1 < fEnd && ':' == fChar[1]) {
fChar++;
@ -452,7 +448,7 @@ public:
bool skipName(const char* word) {
size_t len = strlen(word);
if (len < (size_t) (fEnd - fChar) && !strncmp(word, fChar, len)) {
if (len <= (size_t) (fEnd - fChar) && !strncmp(word, fChar, len)) {
fChar += len;
}
return this->eof() || ' ' >= fChar[0];
@ -495,7 +491,7 @@ public:
bool startsWith(const char* str) const {
size_t len = strlen(str);
ptrdiff_t lineLen = this->lineLength();
ptrdiff_t lineLen = fEnd - fChar;
return len <= (size_t) lineLen && 0 == strncmp(str, fChar, len);
}
@ -556,8 +552,8 @@ public:
return nullptr;
}
const char* trimmedBracketEnd(const char bracket, OneLine oneLine) const {
int max = (int) (OneLine::kYes == oneLine ? this->lineLength() : fEnd - fChar);
const char* trimmedBracketEnd(const char bracket) const {
int max = (int) (this->lineLength());
int index = 0;
while (index < max && bracket != fChar[index]) {
++index;
@ -899,6 +895,11 @@ public:
class RootDefinition : public Definition {
public:
enum class AllowParens {
kNo,
kYes,
};
RootDefinition() {
}
@ -920,7 +921,7 @@ public:
const RootDefinition* asRoot() const override { return this; }
void clearVisited();
bool dumpUnVisited();
const Definition* find(const string& ref) const;
const Definition* find(const string& ref, AllowParens ) const;
bool isRoot() const override { return true; }
RootDefinition* rootParent() override { return fRootParent; }
void setRootParent(RootDefinition* rootParent) { fRootParent = rootParent; }
@ -1108,6 +1109,9 @@ public:
}
void writeString(const char* str) {
if (!strcmp("utf-8", str)) {
SkDebugf("");
}
SkASSERT(strlen(str) > 0);
SkASSERT(' ' < str[0]);
SkASSERT(' ' < str[strlen(str) - 1]);
@ -1194,6 +1198,12 @@ public:
kOptional,
};
enum class TableState {
kNone,
kColumnStart,
kColumnEnd,
};
#define M(mt) (1LL << (int) MarkType::k##mt)
#define M_D M(Description)
#define M_CS M(Class) | M(Struct)
@ -1216,60 +1226,61 @@ public:
, fMaps {
// names without formal definitions (e.g. Column) aren't included
// fill in other names once they're actually used
{ "", nullptr, MarkType::kNone, R_Y, E_N, 0 }
, { "A", nullptr, MarkType::kAnchor, R_Y, E_N, 0 }
, { "Alias", nullptr, MarkType::kAlias, R_N, E_N, 0 }
, { "Bug", nullptr, MarkType::kBug, R_N, E_N, 0 }
, { "Class", &fClassMap, MarkType::kClass, R_Y, E_O, M_CSST | M(Root) }
, { "Code", nullptr, MarkType::kCode, R_Y, E_N, M_CSST | M_E }
, { "", nullptr, MarkType::kColumn, R_Y, E_N, M(Row) }
, { "", nullptr, MarkType::kComment, R_N, E_N, 0 }
, { "Const", &fConstMap, MarkType::kConst, R_Y, E_N, M_E | M_ST }
, { "Define", nullptr, MarkType::kDefine, R_O, E_N, M_ST }
, { "DefinedBy", nullptr, MarkType::kDefinedBy, R_N, E_N, M(Method) }
, { "Deprecated", nullptr, MarkType::kDeprecated, R_Y, E_N, 0 }
, { "Description", nullptr, MarkType::kDescription, R_Y, E_N, M(Example) }
, { "Doxygen", nullptr, MarkType::kDoxygen, R_Y, E_N, 0 }
, { "Enum", &fEnumMap, MarkType::kEnum, R_Y, E_O, M_CSST | M(Root) }
, { "EnumClass", &fClassMap, MarkType::kEnumClass, R_Y, E_O, M_CSST | M(Root) }
, { "Error", nullptr, MarkType::kError, R_N, E_N, M(Example) }
, { "Example", nullptr, MarkType::kExample, R_O, E_N, M_CSST | M_E | M(Method) }
{ "", nullptr, MarkType::kNone, R_Y, E_N, 0 }
, { "A", nullptr, MarkType::kAnchor, R_Y, E_N, 0 }
, { "Alias", nullptr, MarkType::kAlias, R_N, E_N, 0 }
, { "Bug", nullptr, MarkType::kBug, R_N, E_N, 0 }
, { "Class", &fClassMap, MarkType::kClass, R_Y, E_O, M_CSST | M(Root) }
, { "Code", nullptr, MarkType::kCode, R_Y, E_N, M_CSST | M_E }
, { "", nullptr, MarkType::kColumn, R_Y, E_N, M(Row) }
, { "", nullptr, MarkType::kComment, R_N, E_N, 0 }
, { "Const", &fConstMap, MarkType::kConst, R_Y, E_N, M_E | M_ST }
, { "Define", nullptr, MarkType::kDefine, R_O, E_N, M_ST }
, { "DefinedBy", nullptr, MarkType::kDefinedBy, R_N, E_N, M(Method) }
, { "Deprecated", nullptr, MarkType::kDeprecated, R_Y, E_N, 0 }
, { "Description", nullptr, MarkType::kDescription, R_Y, E_N, M(Example) }
, { "Doxygen", nullptr, MarkType::kDoxygen, R_Y, E_N, 0 }
, { "Enum", &fEnumMap, MarkType::kEnum, R_Y, E_O, M_CSST | M(Root) }
, { "EnumClass", &fClassMap, MarkType::kEnumClass, R_Y, E_O, M_CSST | M(Root) }
, { "Error", nullptr, MarkType::kError, R_N, E_N, M(Example) }
, { "Example", nullptr, MarkType::kExample, R_O, E_N, M_CSST | M_E | M(Method) }
, { "Experimental", nullptr, MarkType::kExperimental, R_Y, E_N, 0 }
, { "External", nullptr, MarkType::kExternal, R_Y, E_N, M(Root) }
, { "File", nullptr, MarkType::kFile, R_N, E_N, M(Track) }
, { "Formula", nullptr, MarkType::kFormula, R_O, E_N, M_ST | M(Member) | M(Method) | M_D }
, { "Function", nullptr, MarkType::kFunction, R_O, E_N, M(Example) }
, { "Height", nullptr, MarkType::kHeight, R_N, E_N, M(Example) }
, { "Image", nullptr, MarkType::kImage, R_N, E_N, M(Example) }
, { "Legend", nullptr, MarkType::kLegend, R_Y, E_N, M(Table) }
, { "", nullptr, MarkType::kLink, R_Y, E_N, M(Anchor) }
, { "List", nullptr, MarkType::kList, R_Y, E_N, M(Method) | M_CSST | M_E | M_D }
, { "", nullptr, MarkType::kMarkChar, R_N, E_N, 0 }
, { "Member", nullptr, MarkType::kMember, R_Y, E_N, M(Class) | M(Struct) }
, { "Method", &fMethodMap, MarkType::kMethod, R_Y, E_Y, M_CSST }
, { "NoExample", nullptr, MarkType::kNoExample, R_Y, E_N, 0 }
, { "Param", nullptr, MarkType::kParam, R_Y, E_N, M(Method) }
, { "Platform", nullptr, MarkType::kPlatform, R_Y, E_N, M(Example) }
, { "Private", nullptr, MarkType::kPrivate, R_N, E_N, 0 }
, { "Return", nullptr, MarkType::kReturn, R_Y, E_N, M(Method) }
, { "", nullptr, MarkType::kRoot, R_Y, E_N, 0 }
, { "", nullptr, MarkType::kRow, R_Y, E_N, M(Table) | M(List) }
, { "SeeAlso", nullptr, MarkType::kSeeAlso, R_Y, E_N, M_CSST | M_E | M(Method) }
, { "StdOut", nullptr, MarkType::kStdOut, R_N, E_N, M(Example) }
, { "Struct", &fClassMap, MarkType::kStruct, R_Y, E_O, M(Class) | M(Root) | M_ST }
, { "Substitute", nullptr, MarkType::kSubstitute, R_N, E_N, M_ST }
, { "Subtopic", nullptr, MarkType::kSubtopic, R_Y, E_Y, M_CSST }
, { "Table", nullptr, MarkType::kTable, R_Y, E_N, M(Method) | M_CSST | M_E }
, { "Template", nullptr, MarkType::kTemplate, R_Y, E_N, 0 }
, { "", nullptr, MarkType::kText, R_Y, E_N, 0 }
, { "Time", nullptr, MarkType::kTime, R_Y, E_N, M(Track) }
, { "ToDo", nullptr, MarkType::kToDo, R_N, E_N, 0 }
, { "Topic", nullptr, MarkType::kTopic, R_Y, E_Y, M_CS | M(Root) | M(Topic) }
, { "Track", nullptr, MarkType::kTrack, R_Y, E_N, M_E | M_ST }
, { "Typedef", &fTypedefMap, MarkType::kTypedef, R_Y, E_N, M(Subtopic) | M(Topic) }
, { "", nullptr, MarkType::kUnion, R_Y, E_N, 0 }
, { "Volatile", nullptr, MarkType::kVolatile, R_N, E_N, M(StdOut) }
, { "Width", nullptr, MarkType::kWidth, R_N, E_N, M(Example) } }
, { "External", nullptr, MarkType::kExternal, R_Y, E_N, M(Root) }
, { "File", nullptr, MarkType::kFile, R_N, E_N, M(Track) }
, { "Formula", nullptr, MarkType::kFormula, R_O, E_N,
M(Column) | M_ST | M(Member) | M(Method) | M_D }
, { "Function", nullptr, MarkType::kFunction, R_O, E_N, M(Example) }
, { "Height", nullptr, MarkType::kHeight, R_N, E_N, M(Example) }
, { "Image", nullptr, MarkType::kImage, R_N, E_N, M(Example) }
, { "Legend", nullptr, MarkType::kLegend, R_Y, E_N, M(Table) }
, { "", nullptr, MarkType::kLink, R_N, E_N, M(Anchor) }
, { "List", nullptr, MarkType::kList, R_Y, E_N, M(Method) | M_CSST | M_E | M_D }
, { "", nullptr, MarkType::kMarkChar, R_N, E_N, 0 }
, { "Member", nullptr, MarkType::kMember, R_Y, E_N, M(Class) | M(Struct) }
, { "Method", &fMethodMap, MarkType::kMethod, R_Y, E_Y, M_CSST }
, { "NoExample", nullptr, MarkType::kNoExample, R_Y, E_N, 0 }
, { "Param", nullptr, MarkType::kParam, R_Y, E_N, M(Method) }
, { "Platform", nullptr, MarkType::kPlatform, R_N, E_N, M(Example) }
, { "Private", nullptr, MarkType::kPrivate, R_N, E_N, 0 }
, { "Return", nullptr, MarkType::kReturn, R_Y, E_N, M(Method) }
, { "", nullptr, MarkType::kRoot, R_Y, E_N, 0 }
, { "", nullptr, MarkType::kRow, R_Y, E_N, M(Table) | M(List) }
, { "SeeAlso", nullptr, MarkType::kSeeAlso, R_Y, E_N, M_CSST | M_E | M(Method) }
, { "StdOut", nullptr, MarkType::kStdOut, R_N, E_N, M(Example) }
, { "Struct", &fClassMap, MarkType::kStruct, R_Y, E_O, M(Class) | M(Root) | M_ST }
, { "Substitute", nullptr, MarkType::kSubstitute, R_N, E_N, M_ST }
, { "Subtopic", nullptr, MarkType::kSubtopic, R_Y, E_Y, M_CSST }
, { "Table", nullptr, MarkType::kTable, R_Y, E_N, M(Method) | M_CSST | M_E }
, { "Template", nullptr, MarkType::kTemplate, R_Y, E_N, 0 }
, { "", nullptr, MarkType::kText, R_Y, E_N, 0 }
, { "Time", nullptr, MarkType::kTime, R_Y, E_N, M(Track) }
, { "ToDo", nullptr, MarkType::kToDo, R_N, E_N, 0 }
, { "Topic", nullptr, MarkType::kTopic, R_Y, E_Y, M_CS | M(Root) | M(Topic) }
, { "Track", nullptr, MarkType::kTrack, R_Y, E_N, M_E | M_ST }
, { "Typedef", &fTypedefMap, MarkType::kTypedef, R_Y, E_N, M(Subtopic) | M(Topic) }
, { "", nullptr, MarkType::kUnion, R_Y, E_N, 0 }
, { "Volatile", nullptr, MarkType::kVolatile, R_N, E_N, M(StdOut) }
, { "Width", nullptr, MarkType::kWidth, R_N, E_N, M(Example) } }
{
this->reset();
}
@ -1296,6 +1307,7 @@ public:
string className(MarkType markType);
bool collectExternals();
int endHashCount() const;
bool endTableColumn(const char* end, const char* terminator);
RootDefinition* findBmhObject(MarkType markType, const string& typeName) {
auto map = fMaps[(int) markType].fBmh;
@ -1326,6 +1338,9 @@ public:
void reset() override {
INHERITED::resetCommon();
fRoot = nullptr;
fWorkingColumn = nullptr;
fRow = nullptr;
fTableState = TableState::kNone;
fMC = '#';
fInChar = false;
fInCharCommentString = false;
@ -1337,7 +1352,7 @@ public:
bool skipNoName();
bool skipToDefinitionEnd(MarkType markType);
void spellCheck(const char* match) const;
void spellCheck(const char* match, SkCommandLineFlags::StringArray report) const;
vector<string> topicName();
vector<string> typeName(MarkType markType, bool* expectEnd);
string uniqueName(const string& base, MarkType markType);
@ -1368,6 +1383,10 @@ public:
unordered_map<string, Definition*> fTopicMap;
unordered_map<string, Definition*> fAliasMap;
RootDefinition* fRoot;
Definition* fWorkingColumn;
Definition* fRow;
const char* fColStart;
TableState fTableState;
mutable char fMC; // markup character
bool fAnonymous;
bool fCloned;
@ -1639,6 +1658,12 @@ public:
kSpace,
};
enum class RefType {
kUndefined,
kNormal,
kExternal,
};
enum class Wrote {
kNone,
kLF,
@ -1699,7 +1724,7 @@ public:
}
string resolveMethod(const char* start, const char* end, bool first);
string resolveRef(const char* start, const char* end, bool first);
string resolveRef(const char* start, const char* end, bool first, RefType* refType);
Wrote rewriteBlock(int size, const char* data);
Definition* structMemberOut(const Definition* memberStart, const Definition& child);
void structOut(const Definition* root, const Definition& child,

View File

@ -231,7 +231,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
continue;
}
string fullName = classMapper.first + "::" + token.fName;
const Definition* def = root->find(fullName);
const Definition* def = root->find(fullName, RootDefinition::AllowParens::kYes);
switch (token.fMarkType) {
case MarkType::kMethod: {
if (this->internalName(token)) {
@ -241,7 +241,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
string paramName = className + "::";
paramName += string(token.fContentStart,
token.fContentEnd - token.fContentStart);
def = root->find(paramName);
def = root->find(paramName, RootDefinition::AllowParens::kYes);
if (!def && 0 == token.fName.find("operator")) {
string operatorName = className + "::";
TextParser oper("", token.fStart, token.fContentEnd, 0);
@ -258,7 +258,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
} while (!oper.eof() && oper.next() && parens > 0);
operatorName += string(start, oper.fChar - start);
def = root->find(operatorName);
def = root->find(operatorName, RootDefinition::AllowParens::kYes);
}
}
if (!def) {
@ -267,17 +267,18 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
string constructorName = className + "::";
constructorName += string(token.fContentStart + skip,
token.fContentEnd - token.fContentStart - skip);
def = root->find(constructorName);
def = root->find(constructorName, RootDefinition::AllowParens::kYes);
}
if (!def && 0 == token.fName.find("SK_")) {
string incName = token.fName + "()";
string macroName = className + "::" + incName;
def = root->find(macroName);
def = root->find(macroName, RootDefinition::AllowParens::kYes);
if (def) {
if (def->fName == incName) {
def->fVisited = true;
if ("SK_TO_STRING_NONVIRT" == token.fName) {
def = root->find(className + "::toString");
def = root->find(className + "::toString",
RootDefinition::AllowParens::kYes);
if (def) {
def->fVisited = true;
} else {
@ -300,7 +301,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
if (allLower) {
string lowerName = className + "::" + token.fName + "()";
def = root->find(lowerName);
def = root->find(lowerName, RootDefinition::AllowParens::kYes);
}
}
if (!def) {
@ -314,7 +315,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
if (!def) {
// simple method names inside nested classes have a bug and are missing trailing parens
string withParens = fullName + "()"; // FIXME: this shouldn't be necessary
def = root->find(withParens);
def = root->find(withParens, RootDefinition::AllowParens::kNo);
}
if (!def) {
SkDebugf("method missing from bmh: %s\n", fullName.c_str());
@ -359,7 +360,7 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
++lastUnderscore;
string anonName = className + "::" + string(lastUnderscore,
wordEnd - lastUnderscore) + 's';
def = root->find(anonName);
def = root->find(anonName, RootDefinition::AllowParens::kYes);
}
if (!def) {
SkDebugf("enum missing from bmh: %s\n", fullName.c_str());
@ -386,10 +387,10 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
string constName = MarkType::kEnumClass == token.fMarkType ?
fullName : className;
constName += "::" + child->fName;
def = root->find(constName);
def = root->find(constName, RootDefinition::AllowParens::kYes);
if (!def) {
string innerName = classMapper.first + "::" + child->fName;
def = root->find(innerName);
def = root->find(innerName, RootDefinition::AllowParens::kYes);
}
if (!def) {
if (string::npos == child->fName.find("Legacy_")) {
@ -1142,7 +1143,7 @@ bool IncludeParser::parseMember(Definition* child, Definition* markupDef) {
break;
}
const char* start = parser.fChar;
const char* end = parser.trimmedBracketEnd('\n', OneLine::kYes);
const char* end = parser.trimmedBracketEnd('\n');
if (Bracket::kSlashStar == comment->fBracket) {
const char* commentEnd = parser.strnstr("*/", end);
if (commentEnd) {
@ -1450,6 +1451,7 @@ bool IncludeParser::parseChar() {
return reportError<bool>("malformed closing comment");
}
if (Bracket::kSlashStar == this->topBracket()) {
this->next(); // include close in bracket -- FIXME? will this skip stuff?
this->popBracket();
}
break;

View File

@ -33,9 +33,9 @@ void IncludeWriter::enumHeaderOut(const RootDefinition* root,
child.fChildren[0]->fName = enumName;
}
fullName = root->fName + "::" + enumName;
enumDef = root->find(enumName);
enumDef = root->find(enumName, RootDefinition::AllowParens::kNo);
if (!enumDef) {
enumDef = root->find(fullName);
enumDef = root->find(fullName, RootDefinition::AllowParens::kNo);
}
SkASSERT(enumDef);
// child[0] should be #Code comment starts at child[0].fTerminator
@ -48,7 +48,7 @@ void IncludeWriter::enumHeaderOut(const RootDefinition* root,
if (fAnonymousEnumCount > 1) {
enumName += '_' + to_string(fAnonymousEnumCount);
}
enumDef = root->find(enumName);
enumDef = root->find(enumName, RootDefinition::AllowParens::kNo);
SkASSERT(enumDef);
++fAnonymousEnumCount;
}
@ -794,7 +794,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
++alternate;
string alternateMethod = methodName + '_' + to_string(alternate);
clonedMethod = root->find(alternateMethod);
clonedMethod = root->find(alternateMethod, RootDefinition::AllowParens::kNo);
} while (clonedMethod);
if (!clonedMethod) {
return this->reportError<bool>("cloned method not found");
@ -823,7 +823,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
--continueEnd;
}
methodName += string(fContinuation, continueEnd - fContinuation);
method = root->find(methodName);
method = root->find(methodName, RootDefinition::AllowParens::kNo);
if (!method) {
fLineCount = child.fLineCount;
fclose(fOut); // so we can see what we've written so far
@ -836,7 +836,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
continue;
}
methodName += "()";
method = root->find(methodName);
method = root->find(methodName, RootDefinition::AllowParens::kNo);
if (method && MarkType::kDefinedBy == method->fMarkType) {
method = method->fParent;
}
@ -873,7 +873,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
methodName = root->fName + "::" + child.fName;
inConstructor = root->fName == child.fName;
fContinuation = child.fContentEnd;
method = root->find(methodName);
method = root->find(methodName, RootDefinition::AllowParens::kNo);
if (!method) {
continue;
}
@ -905,9 +905,10 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
if (fInStruct) {
fIndent += 4;
fStructDef = root->find(child.fName);
fStructDef = root->find(child.fName, RootDefinition::AllowParens::kNo);
if (nullptr == structDef) {
fStructDef = root->find(root->fName + "::" + child.fName);
fStructDef = root->find(root->fName + "::" + child.fName,
RootDefinition::AllowParens::kNo);
}
this->structSizeMembers(child);
fIndent -= 4;
@ -937,9 +938,10 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
SkASSERT(0); // incomplete
}
} else {
structDef = root->find(child.fName);
structDef = root->find(child.fName, RootDefinition::AllowParens::kNo);
if (nullptr == structDef) {
structDef = root->find(root->fName + "::" + child.fName);
structDef = root->find(root->fName + "::" + child.fName,
RootDefinition::AllowParens::kNo);
}
if (!structDef) {
this->lf(2);
@ -1162,7 +1164,8 @@ string IncludeWriter::resolveMethod(const char* start, const char* end, bool fir
}
}
SkASSERT(parent);
auto defRef = parent->find(parent->fName + "::" + methodname);
auto defRef = parent->find(parent->fName + "::" + methodname,
RootDefinition::AllowParens::kNo);
if (defRef && MarkType::kMethod == defRef->fMarkType) {
substitute = methodname + "()";
}
@ -1175,9 +1178,17 @@ string IncludeWriter::resolveMethod(const char* start, const char* end, bool fir
return substitute;
}
string IncludeWriter::resolveRef(const char* start, const char* end, bool first) {
string IncludeWriter::resolveRef(const char* start, const char* end, bool first,
RefType* refType) {
// look up Xxx_Xxx
string undername(start, end - start);
for (const auto& external : fBmhParser->fExternals) {
if (external.fName == undername) {
*refType = RefType::kExternal;
return external.fName;
}
}
*refType = RefType::kNormal;
SkASSERT(string::npos == undername.find(' '));
const Definition* rootDef = nullptr;
{
@ -1200,11 +1211,6 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first)
if (fBmhParser->fAliasMap.end() != aliasIter) {
rootDef = aliasIter->second->fParent;
} else if (!first) {
for (const auto& external : fBmhParser->fExternals) {
if (external.fName == undername) {
return external.fName;
}
}
SkDebugf("unfound: %s\n", undername.c_str());
this->reportError("reference unfound");
return "";
@ -1291,11 +1297,12 @@ int IncludeWriter::lookupReference(const PunctuationState punctuation, const Wor
const int start, const int run, int lastWrite, const char last, const char* data) {
const int end = PunctuationState::kDelimiter == punctuation ||
PunctuationState::kPeriod == punctuation ? run - 1 : run;
string temp = this->resolveRef(&data[start], &data[end], Word::kFirst == word);
RefType refType = RefType::kUndefined;
string resolved = string(&data[start], (size_t) (end - start));
string temp = this->resolveRef(&data[start], &data[end], Word::kFirst == word, &refType);
if (!temp.length()) {
if (Word::kFirst != word && '_' != last) {
temp = string(&data[start], (size_t) (end - start));
temp = ConvertRef(temp, false);
temp = ConvertRef(resolved, false);
}
}
if (temp.length()) {
@ -1439,6 +1446,7 @@ IncludeWriter::Wrote IncludeWriter::rewriteBlock(int size, const char* data) {
embeddedSymbol = true;
break;
case '\'': // possessive apostrophe isn't treated as delimiting punctation
case '\"': // quote is passed straight through
case '=':
case '!': // assumed not to be punctuation, but a programming symbol
case '&': case '>': case '<': case '{': case '}': case '/': case '*': case '[': case ']':

View File

@ -184,7 +184,8 @@ string MdOut::addReferences(const char* refStart, const char* refEnd,
for (string prefix : { "_", "::" } ) {
RootDefinition* root = test->asRoot();
string prefixed = root->fName + prefix + ref;
if (const Definition* def = root->find(prefixed)) {
if (const Definition* def = root->find(prefixed,
RootDefinition::AllowParens::kYes)) {
result += linkRef(leadingSpaces, def, ref);
goto found;
}
@ -363,7 +364,7 @@ const Definition* MdOut::isDefined(const TextParser& parser, const string& ref,
if (ref == fRoot->fName) {
return fRoot;
}
if (const Definition* definition = fRoot->find(ref)) {
if (const Definition* definition = fRoot->find(ref, RootDefinition::AllowParens::kYes)) {
return definition;
}
Definition* test = fRoot;
@ -376,14 +377,16 @@ const Definition* MdOut::isDefined(const TextParser& parser, const string& ref,
if (ref == leaf.first) {
return leaf.second;
}
const Definition* definition = leaf.second->find(ref);
const Definition* definition = leaf.second->find(ref,
RootDefinition::AllowParens::kYes);
if (definition) {
return definition;
}
}
for (string prefix : { "::", "_" } ) {
string prefixed = root->fName + prefix + ref;
if (const Definition* definition = root->find(prefixed)) {
if (const Definition* definition = root->find(prefixed,
RootDefinition::AllowParens::kYes)) {
return definition;
}
if (isupper(prefixed[0])) {
@ -401,7 +404,7 @@ const Definition* MdOut::isDefined(const TextParser& parser, const string& ref,
auto classIter = fBmhParser.fClassMap.find(className);
if (classIter != fBmhParser.fClassMap.end()) {
const RootDefinition& classDef = classIter->second;
const Definition* result = classDef.find(ref);
const Definition* result = classDef.find(ref, RootDefinition::AllowParens::kYes);
if (result) {
return result;
}
@ -414,7 +417,7 @@ const Definition* MdOut::isDefined(const TextParser& parser, const string& ref,
// try with a prefix
if ('k' == ref[0]) {
for (auto const& iter : fBmhParser.fEnumMap) {
if (iter.second.find(ref)) {
if (iter.second.find(ref, RootDefinition::AllowParens::kYes)) {
return &iter.second;
}
}
@ -456,13 +459,15 @@ const Definition* MdOut::isDefined(const TextParser& parser, const string& ref,
string className(ref, 0, pos);
auto classIter = fBmhParser.fClassMap.find(className);
if (classIter != fBmhParser.fClassMap.end()) {
if (const Definition* definition = classIter->second.find(ref)) {
if (const Definition* definition = classIter->second.find(ref,
RootDefinition::AllowParens::kYes)) {
return definition;
}
}
auto enumIter = fBmhParser.fEnumMap.find(className);
if (enumIter != fBmhParser.fEnumMap.end()) {
if (const Definition* definition = enumIter->second.find(ref)) {
if (const Definition* definition = enumIter->second.find(ref,
RootDefinition::AllowParens::kYes)) {
return definition;
}
}
@ -682,7 +687,7 @@ void MdOut::markTypeOut(Definition* def) {
TextParser tp(def->fFileName, def->fStart, def->fContentStart, def->fLineCount);
tp.skipExact("#Member");
tp.skipWhiteSpace();
const char* end = tp.trimmedBracketEnd('\n', TextParser::OneLine::kYes);
const char* end = tp.trimmedBracketEnd('\n');
this->lfAlways(2);
fprintf(fOut, "<a name=\"%s\"> <code><strong>%.*s</strong></code> </a>",
def->fFiddle.c_str(), (int) (end - tp.fChar), tp.fChar);

View File

@ -34,7 +34,7 @@ public:
this->reset();
}
bool check(const char* match);
void report();
void report(SkCommandLineFlags::StringArray report);
private:
enum class TableState {
kNone,
@ -56,6 +56,7 @@ private:
fTableState = TableState::kNone;
fInCode = false;
fInConst = false;
fInFormula = false;
fInDescription = false;
fInStdOut = false;
}
@ -77,6 +78,7 @@ private:
bool fInCode;
bool fInConst;
bool fInDescription;
bool fInFormula;
bool fInStdOut;
typedef ParserCommon INHERITED;
};
@ -88,10 +90,10 @@ private:
modifiers to try to maintain a consistent voice.
Maybe also look for passive verbs (e.g. 'is') and suggest active ones?
*/
void BmhParser::spellCheck(const char* match) const {
void BmhParser::spellCheck(const char* match, SkCommandLineFlags::StringArray report) const {
SpellCheck checker(*this);
checker.check(match);
checker.report();
checker.report(report);
}
bool SpellCheck::check(const char* match) {
@ -112,13 +114,22 @@ bool SpellCheck::check(const char* match) {
return true;
}
static bool all_lower(const string& str) {
for (auto c : str) {
if (!islower(c)) {
return false;
}
}
return true;
}
bool SpellCheck::check(Definition* def) {
fFileName = def->fFileName;
fLineCount = def->fLineCount;
string printable = def->printableName();
const char* textStart = def->fContentStart;
if (MarkType::kParam != def->fMarkType && MarkType::kConst != def->fMarkType &&
TableState::kNone != fTableState) {
MarkType::kPrivate != def->fMarkType && TableState::kNone != fTableState) {
fTableState = TableState::kNone;
}
switch (def->fMarkType) {
@ -170,11 +181,14 @@ bool SpellCheck::check(Definition* def) {
break;
case MarkType::kExample:
break;
case MarkType::kExperimental:
break;
case MarkType::kExternal:
break;
case MarkType::kFile:
break;
case MarkType::kFormula:
fInFormula = true;
break;
case MarkType::kFunction:
break;
@ -184,12 +198,19 @@ bool SpellCheck::check(Definition* def) {
break;
case MarkType::kLegend:
break;
case MarkType::kLink:
break;
case MarkType::kList:
break;
case MarkType::kMarkChar:
break;
case MarkType::kMember:
break;
case MarkType::kMethod: {
string method_name = def->methodName();
if (all_lower(method_name)) {
method_name += "()";
}
string formattedStr = def->formatFunction();
if (!def->isClone()) {
this->wordCheck(method_name);
@ -197,6 +218,8 @@ bool SpellCheck::check(Definition* def) {
fTableState = TableState::kNone;
fMethod = def;
} break;
case MarkType::kNoExample:
break;
case MarkType::kParam: {
if (TableState::kNone == fTableState) {
fTableState = TableState::kRow;
@ -219,6 +242,8 @@ bool SpellCheck::check(Definition* def) {
} break;
case MarkType::kPlatform:
break;
case MarkType::kPrivate:
break;
case MarkType::kReturn:
break;
case MarkType::kRow:
@ -240,6 +265,8 @@ bool SpellCheck::check(Definition* def) {
fRoot = def->asRoot();
this->wordCheck(def->fName);
break;
case MarkType::kSubstitute:
break;
case MarkType::kSubtopic:
this->printCheck(printable);
break;
@ -263,6 +290,8 @@ bool SpellCheck::check(Definition* def) {
break;
case MarkType::kUnion:
break;
case MarkType::kVolatile:
break;
case MarkType::kWidth:
break;
default:
@ -284,6 +313,9 @@ bool SpellCheck::check(Definition* def) {
break;
case MarkType::kExample:
break;
case MarkType::kFormula:
fInFormula = false;
break;
case MarkType::kLegend:
break;
case MarkType::kMethod:
@ -336,21 +368,90 @@ void SpellCheck::childCheck(const Definition* def, const char* start) {
}
void SpellCheck::leafCheck(const char* start, const char* end) {
TextParser text("", start, end, fLineCount);
const char* chPtr = start;
int inAngles = 0;
int inParens = 0;
bool inQuotes = false;
bool allLower = true;
char priorCh = 0;
char lastCh = 0;
const char* wordStart = nullptr;
const char* wordEnd = nullptr;
const char* possibleEnd = nullptr;
do {
const char* lineStart = text.fChar;
text.skipToAlpha();
if (text.eof()) {
if (wordStart && wordEnd) {
if (!allLower || (!inQuotes && '\"' != lastCh && !inParens
&& ')' != lastCh && !inAngles && '>' != lastCh)) {
string word(wordStart, (possibleEnd ? possibleEnd : wordEnd) - wordStart);
wordCheck(word);
}
wordStart = nullptr;
}
if (chPtr == end) {
break;
}
const char* wordStart = text.fChar;
text.fChar = lineStart;
text.skipTo(wordStart); // advances line number
text.skipToNonAlphaNum();
fLineCount = text.fLineCount;
string word(wordStart, text.fChar - wordStart);
wordCheck(word);
} while (!text.eof());
switch (*chPtr) {
case '>':
if (isalpha(lastCh)) {
--inAngles;
SkASSERT(inAngles >= 0);
}
wordEnd = chPtr;
break;
case '(':
++inParens;
possibleEnd = chPtr;
break;
case ')':
--inParens;
if ('(' == lastCh) {
wordEnd = chPtr + 1;
} else {
wordEnd = chPtr;
}
SkASSERT(inParens >= 0);
break;
case '\"':
inQuotes = !inQuotes;
wordEnd = chPtr;
SkASSERT(inQuotes == !wordStart);
break;
case 'A': case 'B': case 'C': case 'D': case 'E':
case 'F': case 'G': case 'H': case 'I': case 'J':
case 'K': case 'L': case 'M': case 'N': case 'O':
case 'P': case 'Q': case 'R': case 'S': case 'T':
case 'U': case 'V': case 'W': case 'X': case 'Y':
case 'Z':
allLower = false;
case 'a': case 'b': case 'c': case 'd': case 'e':
case 'f': case 'g': case 'h': case 'i': case 'j':
case 'k': case 'l': case 'm': case 'n': case 'o':
case 'p': case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x': case 'y':
case 'z':
if (!wordStart) {
wordStart = chPtr;
wordEnd = nullptr;
possibleEnd = nullptr;
allLower = 'a' <= *chPtr;
if ('<' == lastCh || ('<' == priorCh && '/' == lastCh)) {
++inAngles;
}
}
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '_':
allLower = false;
case '-': // note that dash doesn't clear allLower
break;
default:
wordEnd = chPtr;
break;
}
priorCh = lastCh;
lastCh = *chPtr;
} while (++chPtr <= end);
}
void SpellCheck::printCheck(const string& str) {
@ -360,25 +461,107 @@ void SpellCheck::printCheck(const string& str) {
}
}
void SpellCheck::report() {
for (auto iter : fWords) {
if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
continue;
static bool stringCompare(std::pair<string, CheckEntry>& i, std::pair<string, CheckEntry>& j) {
return i.first.compare(j.first) < 0;
}
void SpellCheck::report(SkCommandLineFlags::StringArray report) {
vector<std::pair<string, CheckEntry>> elems(fWords.begin(), fWords.end());
std::sort(elems.begin(), elems.end(), stringCompare);
if (report.contains("once")) {
for (auto iter : elems) {
if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("markup.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
continue;
}
if (iter.second.fCount == 1) {
SkDebugf("%s(%d): %s\n", iter.second.fFile.c_str(), iter.second.fLine,
iter.first.c_str());
}
}
if (string::npos != iter.second.fFile.find("markup.bmh")) {
continue;
SkDebugf("\n");
}
if (report.contains("all")) {
int column = 0;
for (auto iter : elems) {
if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("markup.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
continue;
}
string check = iter.first.c_str();
bool allLower = true;
for (auto c : check) {
if (isupper(c)) {
allLower = false;
break;
}
}
if (!allLower) {
continue;
}
if (column + check.length() > 100) {
SkDebugf("\n");
column = 0;
}
SkDebugf("%s ", check.c_str());
column += check.length();
}
if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
continue;
}
if (iter.second.fCount == 1) {
SkDebugf("%s %s %d\n", iter.first.c_str(), iter.second.fFile.c_str(),
iter.second.fLine);
SkDebugf("\n\n");
}
if (report.contains("mispellings")) {
const char* mispelled[] = {
"decrementing",
"differentially",
"incrementing",
"superset",
};
const char** mispellPtr = mispelled;
const char** mispellEnd = &mispelled[SK_ARRAY_COUNT(mispelled)];
for (auto iter : elems) {
if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("markup.bmh")) {
continue;
}
if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
continue;
}
string check = iter.first.c_str();
while (check.compare(*mispellPtr) > 0) {
SkDebugf("%s not found\n", *mispellPtr);
if (mispellEnd == ++mispellPtr) {
break;
}
}
if (mispellEnd == mispellPtr) {
break;
}
if (check.compare(*mispellPtr) == 0) {
SkDebugf("%s(%d): %s\n", iter.second.fFile.c_str(), iter.second.fLine,
iter.first.c_str());
if (mispellEnd == ++mispellPtr) {
break;
}
}
}
}
}
void SpellCheck::wordCheck(const string& str) {
if ("nullptr" == str) {
return; // doesn't seem worth it, treating nullptr as a word in need of correction
}
bool hasColon = false;
bool hasDot = false;
bool hasParen = false;
@ -433,11 +616,20 @@ void SpellCheck::wordCheck(const string& str) {
&& islower(str[0]) && isupper(str[1])) {
inCode = true;
}
bool methodParam = false;
if (fMethod) {
for (auto child : fMethod->fChildren) {
if (MarkType::kParam == child->fMarkType && str == child->fName) {
methodParam = true;
break;
}
}
}
auto& mappy = hasColon ? fColons :
hasDot ? fDots :
hasParen ? fParens :
hasUnderscore ? fUnderscores :
fInStdOut || inCode || fInConst ? fCode :
fInStdOut || fInFormula || inCode || fInConst || methodParam ? fCode :
sawDigit ? fDigits : fWords;
auto iter = mappy.find(str);
if (mappy.end() != iter) {