diff options
30 files changed, 611 insertions, 300 deletions
diff --git a/docs/SkBitmap_Reference.bmh b/docs/SkBitmap_Reference.bmh index 967b9d1ca9..8f241e3f85 100644 --- a/docs/SkBitmap_Reference.bmh +++ b/docs/SkBitmap_Reference.bmh @@ -1,6 +1,6 @@ #Topic Bitmap -#Alias Bitmaps -#Alias Bitmap_Reference +#Alias Bitmaps ## +#Alias Bitmap_Reference ## #Class SkBitmap @@ -11,7 +11,7 @@ Bitmap points to Pixel_Ref, which describes the physical array of pixels. Image_Info bounds may be located anywhere fully inside Pixel_Ref bounds. Bitmap can be drawn using Canvas. Bitmap can be a drawing destination for Canvas -draw member functionss. Bitmap flexibility as a pixel container limits some +draw member functions. Bitmap flexibility as a pixel container limits some optimizations available to the target platform. If pixel array is primarily read-only, use Image for better performance. diff --git a/docs/SkCanvas_Reference.bmh b/docs/SkCanvas_Reference.bmh index 2990a8c48c..ddf081cb1f 100644 --- a/docs/SkCanvas_Reference.bmh +++ b/docs/SkCanvas_Reference.bmh @@ -1,5 +1,5 @@ #Topic Canvas -#Alias Canvas_Reference +#Alias Canvas_Reference ## #Class SkCanvas @@ -1463,6 +1463,8 @@ depth = 1 #Subtopic Layer #Substitute layer #Alias Layers +#Substitute layers +## #Line # temporary Bitmap to draw into ## Layer allocates a temporary Bitmap to draw into. When the drawing is @@ -1691,13 +1693,12 @@ Call restoreToCount with returned value to restore this and subsequent saves. #Typedef uint32_t SaveLayerFlags #Line # options for SaveLayerRec ## +## SaveLayerFlags provides options that may be used in any combination in SaveLayerRec, defining how Layer allocated by saveLayer operates. It may be set to zero, kPreserveLCDText_SaveLayerFlag, kInitWithPrevious_SaveLayerFlag, or both flags. -## - #Const kPreserveLCDText_SaveLayerFlag 2 #Line # creates Layer for LCD text ## Creates Layer for LCD text. Flag is ignored if Layer Paint contains @@ -1751,8 +1752,6 @@ void draw(SkCanvas* canvas) { #Struct SaveLayerRec #Line # contains the state used to create the Layer ## -SaveLayerRec contains the state used to create the Layer. - #Code struct SaveLayerRec { SaveLayerRec*(... @@ -1764,6 +1763,8 @@ SaveLayerRec contains the state used to create the Layer. }; ## +SaveLayerRec contains the state used to create the Layer. + #Subtopic Overview #Populate ## @@ -2502,7 +2503,7 @@ The clip restriction is not recorded in pictures. Pass an empty rect to disable maximum clip. #Private -This is private API to be used only by Android framework. +This private API is for use by Android framework only. ## #Param rect maximum allowed clip in device coordinates @@ -4401,9 +4402,7 @@ are larger than dst; center and four sides are scaled to fit remaining space, if Additionally transform draw using Clip, Matrix, and optional Paint paint. -If Paint paint is supplied, apply Color_Filter, Color_Alpha, Image_Filter, -Blend_Mode, and Draw_Looper. If image is kAlpha_8_SkColorType, apply Shader. -If paint contains Mask_Filter, generate mask from image bounds. +#paint_as_used_by_draw_lattice_or_draw_nine(image)# If generated mask extends beyond image bounds, replicate image edge colors, just as Shader made from SkImage::makeShader with SkShader::kClamp_TileMode set @@ -4690,7 +4689,7 @@ Blend_Mode, and Draw_Looper. If #bitmap_or_image# is kAlpha_8_SkColorType, apply If paint contains Mask_Filter, generate mask from #bitmap_or_image# bounds. If paint Filter_Quality set to kNone_SkFilterQuality, disable pixel filtering. For all other values of paint Filter_Quality, use kLow_SkFilterQuality to filter pixels. -Any SkMaskFilter on the paint is ignored as is the paint's antialiasing state. +Any SkMaskFilter on paint is ignored as is paint Anti_Aliasing state. ## #Method void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, @@ -4767,14 +4766,6 @@ void draw(SkCanvas* canvas) { #Struct Lattice #Line # divides Bitmap or Image into a rectangular grid ## -Lattice divides Bitmap or Image into a rectangular grid. -Grid entries on even columns and even rows are fixed; these entries are -always drawn at their original size if the destination is large enough. -If the destination side is too small to hold the fixed entries, all fixed -entries are proportionately scaled down to fit. -The grid entries not on even columns and rows are scaled to fit the -remaining space, if any. - #Code struct Lattice { enum RectType ... @@ -4789,6 +4780,14 @@ remaining space, if any. }; ## +Lattice divides Bitmap or Image into a rectangular grid. +Grid entries on even columns and even rows are fixed; these entries are +always drawn at their original size if the destination is large enough. +If the destination side is too small to hold the fixed entries, all fixed +entries are proportionately scaled down to fit. +The grid entries not on even columns and rows are scaled to fit the +remaining space, if any. + #Subtopic Overview #Populate ## @@ -5192,7 +5191,7 @@ Paint paint. The number of entries in pos array must match the number of Glyphs described by byteLength of text. text meaning depends on Paint_Text_Encoding; by default, text is encoded as -UTF-8. pos elements' meaning depends on Paint_Text_Align and Paint_Vertical_Text; +UTF-8. pos elements meaning depends on Paint_Vertical_Text; by default each glyph left side bearing is positioned at x and its baseline is positioned at y. Text size is affected by Matrix and Paint_Text_Size. @@ -5238,7 +5237,7 @@ constY, using Clip, Matrix, and Paint paint. The number of entries in xpos array must match the number of Glyphs described by byteLength of text. text meaning depends on Paint_Text_Encoding; by default, text is encoded as -UTF-8. xpos elements' meaning depends on Paint_Text_Align and Paint_Vertical_Text; +UTF-8. xpos elements meaning depends on Paint_Vertical_Text; by default each glyph left side bearing is positioned at an xpos element and its baseline is positioned at constY. Text size is affected by Matrix and Paint_Text_Size. @@ -5332,21 +5331,22 @@ filled 12 point black Glyphs. Draw text on Path path, using Clip, Matrix, and Paint paint. Origin of text is at beginning of path offset by matrix, if not nullptr. -matrix also transforms text before text is mapped to path. If the path section +matrix transforms text before text is mapped to path. If the path section corresponding the glyph advance is curved, the glyph is drawn curved to match; control points in the glyph are mapped to projected points parallel to the path. If the text advance is larger than the path length, the excess text is clipped. +matrix does not effect paint Shader. + text meaning depends on Paint_Text_Encoding; by default, text is encoded as UTF-8. Origin meaning depends on Paint_Text_Align and Paint_Vertical_Text; by default text positions the first glyph left side bearing at origin x and its -baseline at origin y. Text size is affected by matrix parameter, Canvas_Matrix, +baseline at origin y. Text size is affected by matrix parameter, Canvas Matrix, and Paint_Text_Size. All elements of paint: Path_Effect, Mask_Filter, Shader, Color_Filter, Image_Filter, and Draw_Looper; apply to text. By default, draws -filled 12 point black Glyphs. Canvas Matrix does effect paint Shader, but -matrix parameter does not. +filled 12 point black Glyphs. #Param text character code points or Glyphs drawn ## #Param byteLength byte length of text array ## @@ -5391,8 +5391,8 @@ matrix parameter does not. Draw text, transforming each glyph by the corresponding SkRSXform, using Clip, Matrix, and Paint paint. -RSXform array specifies a separate square scale, rotation, and translation for -each glyph. +RSXform xform array specifies a separate square scale, rotation, and translation +for each glyph. xform does not affect paint Shader. Optional Rect cullRect is a conservative bounds of text, taking into account RSXform and paint. If cullRect is outside of Clip, canvas can skip drawing. diff --git a/docs/SkColor4f_Reference.bmh b/docs/SkColor4f_Reference.bmh index a2c3b0ea2d..a23431e827 100644 --- a/docs/SkColor4f_Reference.bmh +++ b/docs/SkColor4f_Reference.bmh @@ -1,5 +1,5 @@ #Topic Color4f -#Alias Color4f_Reference +#Alias Color4f_Reference ## #Struct SkColor4f diff --git a/docs/SkColor_Reference.bmh b/docs/SkColor_Reference.bmh index 67a47a297e..50b4eb5590 100644 --- a/docs/SkColor_Reference.bmh +++ b/docs/SkColor_Reference.bmh @@ -1,5 +1,5 @@ #Topic Color -#Alias Color_Reference +#Alias Color_Reference ## #Subtopic Overview #Populate @@ -36,7 +36,9 @@ floating point values. Unsigned integer Alpha ranges from zero, fully transparent, to all bits set, fully opaque. Floating point Alpha ranges from zero, fully transparent, to one, fully opaque. -#Alias Alpha +#Alias Alpha +#Substitute alpha +## #Typedef uint8_t SkAlpha #Line # defines Alpha as eight bits ## diff --git a/docs/SkIPoint_Reference.bmh b/docs/SkIPoint_Reference.bmh index 61c7394aeb..2ed3b7b80c 100644 --- a/docs/SkIPoint_Reference.bmh +++ b/docs/SkIPoint_Reference.bmh @@ -1,6 +1,6 @@ #Topic IPoint -#Alias IPoints -#Alias IPoint_Reference +#Alias IPoints ## +#Alias IPoint_Reference ## #Struct SkIPoint @@ -454,15 +454,15 @@ Can also be used to add IVector to IVector, returning IVector. #Subtopic IVector #Line # alias for IPoint ## - #Alias IVector - #Alias IVectors + #Alias IVector ## + #Alias IVectors ## #Typedef SkIPoint SkIVector #Line # alias for IPoint ## #Code typedef SkIPoint SkIVector; ## SkIVector provides an alternative name for SkIPoint. SkIVector and SkIPoint - can be used interchangably for all purposes. + can be used interchangeably for all purposes. #Typedef ## ## diff --git a/docs/SkIRect_Reference.bmh b/docs/SkIRect_Reference.bmh index db8d4ad501..f3c269b294 100644 --- a/docs/SkIRect_Reference.bmh +++ b/docs/SkIRect_Reference.bmh @@ -1,6 +1,6 @@ #Topic IRect -#Alias IRects -#Alias IRect_Reference +#Alias IRects ## +#Alias IRect_Reference ## #Struct SkIRect diff --git a/docs/SkImageInfo_Reference.bmh b/docs/SkImageInfo_Reference.bmh index 963bcd4181..02bdaf0c28 100644 --- a/docs/SkImageInfo_Reference.bmh +++ b/docs/SkImageInfo_Reference.bmh @@ -1,5 +1,5 @@ #Topic Image_Info -#Alias Image_Info_Reference +#Alias Image_Info_Reference ## Image_Info specifies the dimensions and encoding of the pixels in a Bitmap. The dimensions are integral width and height. The encoding is how pixel @@ -22,8 +22,8 @@ but Image and Surface may not contain Image_Info. # ------------------------------------------------------------------------------ #Subtopic Alpha_Type #Line # encoding for pixel transparency ## -#Alias Alpha_Type -#Alias Alpha_Types +#Alias Alpha_Type ## +#Alias Alpha_Types ## #PhraseDef list_of_alpha_types kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType, @@ -224,8 +224,8 @@ opaque, then the result of drawing any pixel with a Color_Alpha value less than # ------------------------------------------------------------------------------ #Subtopic Color_Type #Line # encoding for pixel color ## -#Alias Color_Type -#Alias Color_Types +#Alias Color_Type ## +#Alias Color_Types ## #PhraseDef list_of_color_types kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType, @@ -265,7 +265,7 @@ $$$# #Code ## Describes how pixel bits encode color. A pixel may be an alpha mask, a -grayscale, RGB, or ARGB. +Grayscale, RGB, or ARGB. kN32_SkColorType selects the native 32-bit ARGB format. On Little_Endian processors, pixels containing 8-bit ARGB components pack into 32-bit @@ -335,7 +335,7 @@ kRGBA_8888_SkColorType. ## #Const kGray_8_SkColorType 9 -#Line # pixel with grayscale level in 8-bit byte ## +#Line # pixel with Grayscale level in 8-bit byte ## #Details Gray_8 Stores 8-bit byte pixel encoding that equivalent to equal values for red, blue, and green, representing colors from black to white. @@ -355,7 +355,7 @@ kRGBA_8888_SkColorType. ## #Const kN32_SkColorType 4 or 6 -#Alias Native_Color_Type +#Alias Native_Color_Type ## #NoJustify #Line # native ARGB 32-bit encoding ## Encodes ARGB as either kRGBA_8888_SkColorType or @@ -733,8 +733,8 @@ kRGBA_8888_SkColorType. ## #Subtopic Gray_8 -#Line # encodes level of grayscale in 8 bits ## - kGray_8_SkColorType encodes grayscale level in eight bits that is equivalent +#Line # encodes level of Grayscale in 8 bits ## + kGray_8_SkColorType encodes Grayscale level in eight bits that is equivalent to equal values for red, blue, and green, representing colors from black to white. Pixels described by kGray_8_SkColorType are fully opaque as if its Color_Alpha was set to one, and should always be paired with @@ -980,7 +980,8 @@ and return true if alphaType is not kUnknown_SkAlphaType. # ------------------------------------------------------------------------------ #Subtopic YUV_ColorSpace #Line # color range of YUV pixels ## -#Alias YUV_ColorSpace +#Alias YUV_ColorSpace ## + #Enum SkYUVColorSpace #Line # color range of YUV pixels ## @@ -1037,7 +1038,6 @@ with studio range of 16 to 235 range for components. # ------------------------------------------------------------------------------ - #Struct SkImageInfo Describes pixel dimensions and encoding. Bitmap, Image, PixMap, and Surface diff --git a/docs/SkImage_Reference.bmh b/docs/SkImage_Reference.bmh index 614115cf01..3cdcd0513b 100644 --- a/docs/SkImage_Reference.bmh +++ b/docs/SkImage_Reference.bmh @@ -1,5 +1,5 @@ #Topic Image -#Alias Image_Reference +#Alias Image_Reference ## #Class SkImage @@ -19,7 +19,7 @@ include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details vary with platform. #Subtopic Raster_Image -#Alias Raster_Image +#Alias Raster_Image ## #Line # pixels decoded in Raster_Bitmap ## Raster_Image pixels are decoded in a Raster_Bitmap. These pixels may be read directly and in most cases written to, although edited pixels may not be drawn diff --git a/docs/SkMatrix_Reference.bmh b/docs/SkMatrix_Reference.bmh index e76accdb40..4ab498a2c8 100644 --- a/docs/SkMatrix_Reference.bmh +++ b/docs/SkMatrix_Reference.bmh @@ -1,6 +1,6 @@ #Topic Matrix -#Alias Matrices -#Alias Matrix_Reference +#Alias Matrices ## +#Alias Matrix_Reference ## #Class SkMatrix diff --git a/docs/SkPaint_Reference.bmh b/docs/SkPaint_Reference.bmh index 057135414e..d7738582e7 100644 --- a/docs/SkPaint_Reference.bmh +++ b/docs/SkPaint_Reference.bmh @@ -1,5 +1,5 @@ #Topic Paint -#Alias Paint_Reference +#Alias Paint_Reference ## #Class SkPaint @@ -440,8 +440,8 @@ as the Font_Engine. gray-level rendering. ## #Const kFull_Hinting 3 -#Line # modifies glyph outlines for maxiumum constrast ## - Modifies glyph outlines for maxiumum constrast. With FreeType, this selects +#Line # modifies glyph outlines for maximum constrast ## + Modifies glyph outlines for maximum constrast. With FreeType, this selects FT_LOAD_TARGET_LCD or FT_LOAD_TARGET_LCD_V if kLCDRenderText_Flag is set. FT_LOAD_TARGET_LCD is a variant of FT_LOAD_TARGET_NORMAL optimized for horizontally decimated LCD displays; FT_LOAD_TARGET_LCD_V is a @@ -450,9 +450,9 @@ as the Font_Engine. #Bug 915 On OS_X and iOS, hinting controls whether Core_Graphics dilates the font outlines -to account for LCD text. No hinting uses Core_Text gray scale output. +to account for LCD text. No hinting uses Core_Text Grayscale output. Normal hinting uses Core_Text LCD output. If kLCDRenderText_Flag is clear, -the LCD output is reduced to a single grayscale channel. +the LCD output is reduced to a single Grayscale channel. On Windows with DirectWrite, Hinting has no effect. @@ -650,11 +650,14 @@ All Flags members may be cleared, or one or more may be set. # ------------------------------------------------------------------------------ #Subtopic Anti_Alias #Alias Anti_Alias -#Substitute Anti-alias +#Substitute anti-alias +## #Alias Anti_Aliased -#Substitute Anti-aliased +#Substitute anti-aliased +## #Alias Anti_Aliasing -#Substitute Anti-aliasing +#Substitute anti-aliasing +## #In Related_Function #Line # approximating coverage with transparency ## @@ -948,7 +951,7 @@ kLCDRenderText_Flag or kSubpixelText_Flag (or both) at compile time. #Subtopic Device_Text ## #Subtopic Linear_Text -#Alias Linear_Text +#Alias Linear_Text ## #Line # selects text rendering as Glyph or Path ## Linear_Text selects whether text is rendered as a Glyph or as a Path. @@ -1025,7 +1028,7 @@ If kLinearText_Flag is clear, it is the same as setting Hinting to kNo_Hinting. #Subtopic Linear_Text ## #Subtopic Subpixel_Text -#Alias Subpixel_Text +#Alias Subpixel_Text ## #Line # uses pixel transparency to represent fractional offset ## Flags kSubpixelText_Flag uses the pixel transparency to represent a fractional offset. @@ -1085,9 +1088,12 @@ SkDebugf("paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelTex #Subtopic Subpixel_Text ## #Subtopic LCD_Text -#Substitute LCD text #Line # text relying on the order of RGB stripes ## -#Alias LCD_Text # makes this a top level name, since it is under subtopic Device_Text + +# make this a top level name, since it is under subtopic Device_Text +#Alias LCD_Text +#Substitute LCD text +## When set, Flags kLCDRenderText_Flag takes advantage of the organization of RGB stripes that create a color, and relies @@ -1151,7 +1157,7 @@ SkDebugf("paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderT # ------------------------------------------------------------------------------ #Subtopic Font_Embedded_Bitmaps #Line # custom sized bitmap Glyphs ## -#Alias Font_Embedded_Bitmaps # long-winded enough, alias so I don't type Paint_Font_... +#Alias Font_Embedded_Bitmaps ## # long-winded enough, alias so I don't type Paint_Font_... Font_Embedded_Bitmaps allows selecting custom sized bitmap Glyphs. Flags kEmbeddedBitmapText_Flag when set chooses an embedded bitmap glyph over an outline contained @@ -1515,7 +1521,7 @@ void draw(SkCanvas* canvas) { # ------------------------------------------------------------------------------ #Subtopic Full_Hinting_Spacing #Line # glyph spacing affected by hinting ## -#Alias Full_Hinting_Spacing # long winded enough -- maybe things with two underscores auto-aliased? +#Alias Full_Hinting_Spacing ## # long winded enough -- maybe things with two underscores auto-aliased? 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 @@ -1834,7 +1840,7 @@ may have gaps, and if kAntiAlias_Flag is set, Color_Alpha will increase to visua #Subtopic Hairline #Line # lines and curves with minimal width ## -#Alias Hairline # maybe should be Stroke_Hairline ? +#Alias Hairline ## # maybe should be Stroke_Hairline ? 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 @@ -3494,6 +3500,7 @@ Align defaults to kLeft_Align. #Const kAlignCount 3 #Line # number of different Text_Align values defined ## +May be used to verify that Align is a legal value. ## #Enum ## @@ -5053,7 +5060,7 @@ Paint may draw to. if (!path.isInverseFillType() && paint.canComputeFastBounds()) { SkRect storage; if (canvas->quickReject(paint.computeFastBounds(path.getBounds(), &storage))) { - return; // don't draw the path + return; // do not draw the path } } // draw the path diff --git a/docs/SkPath_Reference.bmh b/docs/SkPath_Reference.bmh index f43bd2b8e1..1b8f991c6a 100644 --- a/docs/SkPath_Reference.bmh +++ b/docs/SkPath_Reference.bmh @@ -1,6 +1,6 @@ #Topic Path -#Alias Path_Reference -#Alias Paths +#Alias Path_Reference ## +#Alias Paths ## Path contains Lines and Curves which can be stroked or filled. Contour is composed of a series of connected Lines and Curves. Path may contain zero, @@ -76,7 +76,7 @@ a new Path independent of the original. Internally, the copy does not duplicate its contents until it is edited, to reduce memory use and improve performance. #Subtopic Contour -#Alias Contours +#Alias Contours ## #Line # loop of lines and curves ## Contour contains one or more Verbs, and as many Points as @@ -135,7 +135,7 @@ void draw(SkCanvas* canvas) { ## #Subtopic Zero_Length -#Alias Zero_Length_Contour +#Alias Zero_Length_Contour ## #Line # consideration when contour has no length ## Contour length is distance traveled from first Point to Last_Point, plus, if Contour is closed, distance from Last_Point to first Point. @@ -214,7 +214,7 @@ SkPath::updateBoundsCache to make Path thread safe. ## #Subtopic Verb -#Alias Verbs +#Alias Verbs ## #Line # line and curve type ## #Enum Verb #Line # controls how Path Points are interpreted ## @@ -326,7 +326,7 @@ verbs: kMove_Verb kLine_Verb kQuad_Verb kClose_Verb kMove_Verb kCubic_Verb kConi # ------------------------------------------------------------------------------ #Subtopic Direction #Line # contour orientation, clockwise or counterclockwise ## -#Alias Directions +#Alias Directions ## #Enum Direction #Line # sets Contour clockwise or counterclockwise ## @@ -2316,10 +2316,10 @@ void draw(SkCanvas* canvas) { # ------------------------------------------------------------------------------ #Subtopic Quad -#Alias Quad -#Alias Quads -#Alias Quadratic_Bezier -#Alias Quadratic_Beziers +#Alias Quad ## +#Alias Quads ## +#Alias Quadratic_Bezier ## +#Alias Quadratic_Beziers ## #Line # curve described by second-order polynomial ## Quad describes a quadratic Bezier, a second-order curve identical to a section @@ -2491,7 +2491,7 @@ void draw(SkCanvas* canvas) { #Subtopic Conic #Line # conic section defined by three points and a weight ## -#Alias Conics +#Alias Conics ## Conic describes a conical section: a piece of an ellipse, or a piece of a parabola, or a piece of a hyperbola. Conic begins at a start Point, @@ -2502,8 +2502,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 -#Alias Conic_Weights -#Alias Weights +#Alias Conic_Weights ## +#Alias Weights ## #Line # strength of Conic control Point ## Weight determines both the strength of the control Point and the type of Conic. @@ -2512,7 +2512,7 @@ have no effect; Conic is identical to a line segment from start Point to end point. If Weight is less than one, Conic follows an elliptical arc. If Weight is exactly one, then Conic is identical to Quad; Conic follows a parabolic arc. If Weight is greater than one, Conic follows a hyperbolic -arc. If Weight is infinity, Conic is indentical to two line segments, connecting +arc. If Weight is infinity, Conic is identical to two line segments, connecting start Point to control Point, and control Point to end Point. #Example @@ -2788,10 +2788,10 @@ void draw(SkCanvas* canvas) { # ------------------------------------------------------------------------------ #Subtopic Cubic -#Alias Cubic -#Alias Cubics -#Alias Cubic_Bezier -#Alias Cubic_Beziers +#Alias Cubic ## +#Alias Cubics ## +#Alias Cubic_Bezier ## +#Alias Cubic_Beziers ## #Line # curve described by third-order polynomial ## Cubic describes a Bezier_Curve segment described by a third-order polynomial. @@ -5266,7 +5266,7 @@ length = 40; returned by readFromMemory = 36 # ------------------------------------------------------------------------------ #Subtopic Generation_ID -#Alias Generation_IDs +#Alias Generation_IDs ## #Line # value reflecting contents change ## Generation_ID provides a quick way to check if Verb_Array, Point_Array, or Conic_Weight has changed. Generation_ID is not a hash; identical Paths will @@ -5339,10 +5339,6 @@ empty genID = 1 #Class Iter #Line # data iterator ## -Iterates through Verb_Array, and associated Point_Array and Conic_Weight. -Provides options to treat open Contours as closed, and to ignore -degenerate data. - #Code class Iter { public: @@ -5356,6 +5352,10 @@ public: }; ## +Iterates through Verb_Array, and associated Point_Array and Conic_Weight. +Provides options to treat open Contours as closed, and to ignore +degenerate data. + #Example #Height 128 #Description @@ -5733,9 +5733,6 @@ with close(), forceClose is true : isClosedContour returns true #Class RawIter #Line # raw data iterator ## -Iterates through Verb_Array, and associated Point_Array and Conic_Weight. -Verb_Array, Point_Array, and Conic_Weight are returned unaltered. - #Code class RawIter { public: @@ -5748,6 +5745,9 @@ Verb_Array, Point_Array, and Conic_Weight are returned unaltered. } ## +Iterates through Verb_Array, and associated Point_Array and Conic_Weight. +Verb_Array, Point_Array, and Conic_Weight are returned unaltered. + #Method RawIter() #Line # constructs empty Path iterator ## diff --git a/docs/SkPixmap_Reference.bmh b/docs/SkPixmap_Reference.bmh index 03f2b714aa..432324e3e2 100644 --- a/docs/SkPixmap_Reference.bmh +++ b/docs/SkPixmap_Reference.bmh @@ -1,5 +1,5 @@ #Topic Pixmap -#Alias Pixmap_Reference +#Alias Pixmap_Reference ## #Class SkPixmap diff --git a/docs/SkPoint_Reference.bmh b/docs/SkPoint_Reference.bmh index 0f98f19326..fe48cd185f 100644 --- a/docs/SkPoint_Reference.bmh +++ b/docs/SkPoint_Reference.bmh @@ -1,6 +1,6 @@ #Topic Point -#Alias Points -#Alias Point_Reference +#Alias Points ## +#Alias Point_Reference ## #Struct SkPoint @@ -1261,8 +1261,8 @@ Returns the dot product of Vector and Vector vec. #Subtopic Vector #Line # alias for Point ## - #Alias Vector - #Alias Vectors + #Alias Vector ## + #Alias Vectors ## #Typedef SkPoint SkVector #Line # alias for Point ## #Code diff --git a/docs/SkRect_Reference.bmh b/docs/SkRect_Reference.bmh index 40fcfb39ae..2d878ef36d 100644 --- a/docs/SkRect_Reference.bmh +++ b/docs/SkRect_Reference.bmh @@ -1,6 +1,6 @@ #Topic Rect -#Alias Rects -#Alias Rect_Reference +#Alias Rects ## +#Alias Rect_Reference ## #Struct SkRect diff --git a/docs/SkSurface_Reference.bmh b/docs/SkSurface_Reference.bmh index b4faad3224..97ac249be6 100644 --- a/docs/SkSurface_Reference.bmh +++ b/docs/SkSurface_Reference.bmh @@ -1,5 +1,5 @@ #Topic Surface -#Alias Surface_Reference +#Alias Surface_Reference ## #Class SkSurface diff --git a/docs/undocumented.bmh b/docs/undocumented.bmh index be0c1b5c2c..9e982e5d9a 100644 --- a/docs/undocumented.bmh +++ b/docs/undocumented.bmh @@ -2,7 +2,6 @@ #External DirectWrite TrueType Windows Linux Android iOS __ANDROID_API__ AHardwareBuffer FreeType FreeType-based Harfbuzz - Descenders Kerning Unhinted LCD RGB sRGB ARGB BGR YUV SDTV HDTV YUV_Component_Y YUV_Component_U YUV_Component_V Unicode Unicode5 UTF-8 UTF-16 UTF-32 ASCII Unichar @@ -14,7 +13,7 @@ RFC NaN NaNs Bezier_Curve Coons_Patch Cartesian_Coordinate Euclidean_Distance Euclidean_Space Mip_Map - C C++ Destructor Subclasses + C C++ CSS HTML HTML_Gray HTML_DarkGray HTML_LightGray HTML_Silver HTML_Lime HTML_Green HTML_Aqua HTML_Fuchsia SVG_lightgray SVG_darkgray @@ -49,17 +48,49 @@ FT_Load_Glyph #External ## +# this jargon requires a substitute to lower-case the word. The word is uppercase because +# it is not a dictionary word. An alternative would be to put this in an exception list +# in the spell checker +#Topic Destructor +#Substitute destructor +## + +# see comment for Destructor above +#Topic Subclasses +#Substitute subclasses +## + +# see comment for Destructor above +#Topic Descenders +#Substitute descenders +## + +# see comment for Destructor above +#Topic Grayscale +#Substitute grayscale +## + +# see comment for Destructor above +#Topic Kerning +#Substitute kerning +## + +# see comment for Destructor above +#Topic Unhinted +#Substitute unhinted +## + #Topic Alias -#Alias Aliased -#Alias Aliasing +#Alias Aliased ## +#Alias Aliasing ## ## #Topic Arc -#Alias Arcs +#Alias Arcs ## #Topic ## #Topic Backend_Semaphore -#Alias Backend_Semaphores +#Alias Backend_Semaphores ## #Class GrBackendSemaphore ## ## @@ -81,7 +112,7 @@ FT_Load_Glyph #Topic ## #Topic Circle -#Alias Circles +#Alias Circles ## #Topic ## #Topic Clip_Op @@ -132,7 +163,7 @@ FT_Load_Glyph ## #Topic Curve -#Alias Curves +#Alias Curves ## ## #Topic Data @@ -261,7 +292,7 @@ FT_Load_Glyph #Topic ## #Topic Glyph -#Alias Glyphs +#Alias Glyphs ## ## #Topic GPU_Context @@ -309,7 +340,7 @@ FT_Load_Glyph ## #Topic Line -#Alias Lines +#Alias Lines ## #Topic ## # to be in Topic Malloc_Pixel_Ref @@ -372,7 +403,7 @@ FT_Load_Glyph #Typedef uint16_t SkGlyphID #Typedef ## #Topic Scalar - #Alias Scalar + #Alias Scalar ## #Typedef float SkScalar #Typedef ## ## @@ -420,7 +451,7 @@ FT_Load_Glyph ## #Topic Oval -#Alias Ovals +#Alias Ovals ## #Topic ## #Topic Paint_Defaults @@ -435,7 +466,7 @@ FT_Load_Glyph #Topic ## #Topic Patch -#Alias Patches +#Alias Patches ## #Topic ## #Topic Path_Effect @@ -495,10 +526,6 @@ FT_Load_Glyph #Enum SkPixelGeometry ## -# Topic Point_Array -# Substitute SkPoint arrays -# Topic ## - #Topic Point3 #Struct SkPoint3 ## @@ -512,7 +539,7 @@ FT_Load_Glyph ## #Topic Premultiply -#Alias Premultiplied +#Alias Premultiplied ## ## #Topic Raster_Engine @@ -597,7 +624,7 @@ FT_Load_Glyph ## #Topic Sprite -#Alias Sprites +#Alias Sprites ## #Topic ## #Topic Stream @@ -693,7 +720,7 @@ FT_Load_Glyph # end of defined in types #Topic Unpremultiply -#Alias Unpremultiplied +#Alias Unpremultiplied ## ## #Topic Vertices diff --git a/site/user/api/SkAutoCanvasRestore_Reference.md b/site/user/api/SkAutoCanvasRestore_Reference.md index cd8cd129e2..1deec31d38 100644 --- a/site/user/api/SkAutoCanvasRestore_Reference.md +++ b/site/user/api/SkAutoCanvasRestore_Reference.md @@ -96,7 +96,7 @@ utility to restore <a href='SkCanvas_Reference#Canvas'>Canvas</a> state on destr <a href='#SkAutoCanvasRestore_destructor'>~SkAutoCanvasRestore</a>() </pre> -Restores <a href='SkCanvas_Reference#Canvas'>Canvas</a> to saved state. Destructor is called when container goes out of +Restores <a href='SkCanvas_Reference#Canvas'>Canvas</a> to saved state. <a href='undocumented#Destructor'>Destructor</a> is called when container goes out of scope. ### See Also diff --git a/site/user/api/SkBitmap_Reference.md b/site/user/api/SkBitmap_Reference.md index b55f8cc832..3f82cd7220 100644 --- a/site/user/api/SkBitmap_Reference.md +++ b/site/user/api/SkBitmap_Reference.md @@ -11,7 +11,7 @@ describing the pixel format, and <a href='undocumented#Color_Space'>Color Space< <a href='SkImageInfo_Reference#Image_Info'>Image Info</a> bounds may be located anywhere fully inside <a href='undocumented#Pixel_Ref'>Pixel Ref</a> bounds. <a href='#Bitmap'>Bitmap</a> can be drawn using <a href='SkCanvas_Reference#Canvas'>Canvas</a>. <a href='#Bitmap'>Bitmap</a> can be a drawing destination for <a href='SkCanvas_Reference#Canvas'>Canvas</a> -draw member functionss. <a href='#Bitmap'>Bitmap</a> flexibility as a pixel container limits some +draw member functions. <a href='#Bitmap'>Bitmap</a> flexibility as a pixel container limits some optimizations available to the target platform. If pixel array is primarily read-only, use <a href='SkImage_Reference#Image'>Image</a> for better performance. diff --git a/site/user/api/SkCanvas_Reference.md b/site/user/api/SkCanvas_Reference.md index ee0bc58a10..eb82724346 100644 --- a/site/user/api/SkCanvas_Reference.md +++ b/site/user/api/SkCanvas_Reference.md @@ -19,7 +19,7 @@ Request <a href='#Canvas'>Canvas</a> from <a href='SkSurface_Reference#Surface'> <a href='#Canvas'>Canvas</a> generated by <a href='undocumented#GPU_Surface'>GPU Surface</a> uses Vulkan or OpenGL to draw to the GPU. To draw to a document, obtain <a href='#Canvas'>Canvas</a> from <a href='undocumented#Canvas'>SVG Canvas</a>, <a href='undocumented#PDF'>Document PDF</a>, or <a href='undocumented#Recorder'>Picture Recorder</a>. -<a href='undocumented#Document'>Document</a> based <a href='#Canvas'>Canvas</a> and other <a href='#Canvas'>Canvas</a> Subclasses reference <a href='undocumented#Device'>Device</a> describing the +<a href='undocumented#Document'>Document</a> based <a href='#Canvas'>Canvas</a> and other <a href='#Canvas'>Canvas</a> <a href='undocumented#Subclasses'>Subclasses</a> reference <a href='undocumented#Device'>Device</a> describing the destination. <a href='#Canvas'>Canvas</a> can be constructed to draw to <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> without first creating <a href='undocumented#Raster_Surface'>Raster Surface</a>. @@ -758,7 +758,7 @@ paint draws text top to bottom </pre> Creates <a href='#Canvas'>Canvas</a> of the specified dimensions without a <a href='SkSurface_Reference#Surface'>Surface</a>. -Used by Subclasses with custom implementations for draw member functions. +Used by <a href='undocumented#Subclasses'>Subclasses</a> with custom implementations for draw member functions. If <a href='#SkCanvas_int_int_const_SkSurfaceProps_star_props'>props</a> equals nullptr, <a href='undocumented#Surface_Properties'>Surface Properties</a> are created with <a href='undocumented#Legacy_Font_Host'>Surface Properties Legacy Font Host</a> settings, which choose the pixel striping @@ -993,7 +993,7 @@ Frees up resources used by <a href='#Canvas'>Canvas</a>. <div><fiddle-embed name="b7bc91ff16c9b9351b2a127f35394b82"><div><a href='#Canvas'>Canvas</a> <a href='#Layer'>Layer</a> draws into bitmap. <a href='#SkCanvas_saveLayerAlpha'>saveLayerAlpha</a> sets up an additional drawing surface that blends with the bitmap. When <a href='#Layer'>Layer</a> goes out of -scope, <a href='#Layer'>Layer</a> Destructor is called. The saved <a href='#Layer'>Layer</a> is restored, drawing +scope, <a href='#Layer'>Layer</a> <a href='undocumented#Destructor'>Destructor</a> is called. The saved <a href='#Layer'>Layer</a> is restored, drawing transparent letters. </div></fiddle-embed></div> @@ -2332,7 +2332,6 @@ scalePaint blends <a href='#Layer'>Layer</a> back with transparency. ## <a name='Layer_SaveLayerRec'>Layer SaveLayerRec</a> # <a name='SkCanvas_SaveLayerRec'>Struct SkCanvas::SaveLayerRec</a> -<a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec</a> contains the state used to create the <a href='#Layer'>Layer</a>. <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0"> struct <a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec</a> { @@ -2345,6 +2344,8 @@ scalePaint blends <a href='#Layer'>Layer</a> back with transparency. }; </pre> +<a href='#SkCanvas_SaveLayerRec_SaveLayerRec'>SaveLayerRec</a> contains the state used to create the <a href='#Layer'>Layer</a>. + ## <a name='Layer_SaveLayerRec_Overview'>Layer SaveLayerRec Overview</a> <table style='border-collapse: collapse; width: 62.5em'> @@ -3114,7 +3115,7 @@ The clip restriction is not recorded in pictures. Pass an empty <a href='#SkCanvas_androidFramework_setDeviceClipRestriction_rect'>rect</a> to disable maximum clip. -This is private API to be used only by Android framework. +This private API is for use by Android framework only. ### Parameters @@ -5108,7 +5109,7 @@ If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_ If <a href='#SkCanvas_drawImageNine_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageNine_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all other values of <a href='#SkCanvas_drawImageNine_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels. -Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on the <a href='#SkCanvas_drawImageNine_paint'>paint</a> is ignored as is the <a href='#SkCanvas_drawImageNine_paint'>paint</a>'s antialiasing state. +Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageNine_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageNine_paint'>paint</a> <a href='SkPaint_Reference#Anti_Alias'>Anti Aliasing</a> state. If generated mask extends beyond <a href='#SkCanvas_drawImageNine_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageNine_image'>image</a> edge colors, just as <a href='undocumented#Shader'>Shader</a> made from <a href='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <a href='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <a href='#SkCanvas_drawImageNine_image'>image</a> edge color when it samples outside of its bounds. @@ -5157,11 +5158,12 @@ the <a href='#SkCanvas_drawImageNine_2_center'>center</a>. Corners are not scale are larger than <a href='#SkCanvas_drawImageNine_2_dst'>dst</a>; <a href='#SkCanvas_drawImageNine_2_center'>center</a> and four sides are scaled to fit remaining space, if any. Additionally transform draw using <a href='#Clip'>Clip</a>, <a href='#Matrix'>Matrix</a>, and optional <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_2_paint'>paint</a>. - If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> is supplied, apply <a href='undocumented#Color_Filter'>Color Filter</a>, <a href='SkColor_Reference#Alpha'>Color Alpha</a>, <a href='undocumented#Image_Filter'>Image Filter</a>, -<a href='undocumented#Blend_Mode'>Blend Mode</a>, and <a href='undocumented#Draw_Looper'>Draw Looper</a>. If <a href='#SkCanvas_drawImageNine_2_image'>image</a> is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>. -If <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from <a href='#SkCanvas_drawImageNine_2_image'>image</a> bounds. - +<a href='undocumented#Blend_Mode'>Blend Mode</a>, and <a href='undocumented#Draw_Looper'>Draw Looper</a>. If image is <a href='SkImageInfo_Reference#kAlpha_8_SkColorType'>kAlpha_8_SkColorType</a>, apply <a href='undocumented#Shader'>Shader</a>. +If <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> +<a href='undocumented#Filter_Quality'>Filter Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all +other values of <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels. +Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageNine_2_paint'>paint</a> <a href='SkPaint_Reference#Anti_Alias'>Anti Aliasing</a> state. If generated mask extends beyond <a href='#SkCanvas_drawImageNine_2_image'>image</a> bounds, replicate <a href='#SkCanvas_drawImageNine_2_image'>image</a> edge colors, just as <a href='undocumented#Shader'>Shader</a> made from <a href='SkImage_Reference#SkImage_makeShader'>SkImage::makeShader</a> with <a href='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <a href='#SkCanvas_drawImageNine_2_image'>image</a> edge color when it samples outside of its bounds. @@ -5424,7 +5426,7 @@ If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapNine If <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from bitmap bounds. If <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all other values of <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels. -Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on the <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> is ignored as is the <a href='#SkCanvas_drawBitmapNine_paint'>paint</a>'s antialiasing state. +Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawBitmapNine_paint'>paint</a> <a href='SkPaint_Reference#Anti_Alias'>Anti Aliasing</a> state. If generated mask extends beyond <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> edge colors, just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with <a href='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapNine_bitmap'>bitmap</a> edge color when it samples @@ -5466,13 +5468,6 @@ and below <a href='#SkCanvas_drawBitmapNine_center'>center</a> to fill the remai ## <a name='Draw_Image_Lattice'>Draw Image Lattice</a> # <a name='SkCanvas_Lattice'>Struct SkCanvas::Lattice</a> -<a href='#SkCanvas_Lattice'>Lattice</a> divides <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> or <a href='SkImage_Reference#Image'>Image</a> into a rectangular grid. -Grid entries on even columns and even rows are fixed; these entries are -always drawn at their original size if the destination is large enough. -If the destination side is too small to hold the fixed entries, all fixed -entries are proportionately scaled down to fit. -The grid entries not on even columns and rows are scaled to fit the -remaining space, if any. <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0"> struct <a href='#SkCanvas_Lattice'>Lattice</a> { @@ -5488,6 +5483,14 @@ remaining space, if any. }; </pre> +<a href='#SkCanvas_Lattice'>Lattice</a> divides <a href='SkBitmap_Reference#Bitmap'>Bitmap</a> or <a href='SkImage_Reference#Image'>Image</a> into a rectangular grid. +Grid entries on even columns and even rows are fixed; these entries are +always drawn at their original size if the destination is large enough. +If the destination side is too small to hold the fixed entries, all fixed +entries are proportionately scaled down to fit. +The grid entries not on even columns and rows are scaled to fit the +remaining space, if any. + ## <a name='Draw_Image_Lattice_Overview'>Draw Image Lattice Overview</a> <table style='border-collapse: collapse; width: 62.5em'> @@ -5663,7 +5666,7 @@ If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawBitmapLatt If <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from bitmap bounds. If <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all other values of <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels. -Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on the <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> is ignored as is the <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a>'s antialiasing state. +Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawBitmapLattice_paint'>paint</a> <a href='SkPaint_Reference#Anti_Alias'>Anti Aliasing</a> state. If generated mask extends beyond <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> bounds, replicate <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> edge colors, just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with <a href='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the <a href='#SkCanvas_drawBitmapLattice_bitmap'>bitmap</a> edge color when it samples @@ -5724,7 +5727,7 @@ If <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawImageLatti If <a href='#SkCanvas_drawImageLattice_paint'>paint</a> contains <a href='undocumented#Mask_Filter'>Mask Filter</a>, generate mask from image bounds. If <a href='#SkCanvas_drawImageLattice_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a> set to <a href='undocumented#kNone_SkFilterQuality'>kNone_SkFilterQuality</a>, disable pixel filtering. For all other values of <a href='#SkCanvas_drawImageLattice_paint'>paint</a> <a href='undocumented#Filter_Quality'>Filter Quality</a>, use <a href='undocumented#kLow_SkFilterQuality'>kLow_SkFilterQuality</a> to filter pixels. -Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on the <a href='#SkCanvas_drawImageLattice_paint'>paint</a> is ignored as is the <a href='#SkCanvas_drawImageLattice_paint'>paint</a>'s antialiasing state. +Any <a href='undocumented#SkMaskFilter'>SkMaskFilter</a> on <a href='#SkCanvas_drawImageLattice_paint'>paint</a> is ignored as is <a href='#SkCanvas_drawImageLattice_paint'>paint</a> <a href='SkPaint_Reference#Anti_Alias'>Anti Aliasing</a> state. If generated mask extends beyond bitmap bounds, replicate bitmap edge colors, just as <a href='undocumented#Shader'>Shader</a> made from <a href='undocumented#SkShader_MakeBitmapShader'>SkShader::MakeBitmapShader</a> with <a href='undocumented#SkShader_kClamp_TileMode'>SkShader::kClamp TileMode</a> set replicates the bitmap edge color when it samples @@ -5978,7 +5981,7 @@ void <a href='#SkCanvas_drawPosText'>drawPosText</a>(const void* text, size_t by described by <a href='#SkCanvas_drawPosText_byteLength'>byteLength</a> of <a href='#SkCanvas_drawPosText_text'>text</a>. <a href='#SkCanvas_drawPosText_text'>text</a> meaning depends on <a href='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <a href='#SkCanvas_drawPosText_text'>text</a> is encoded as -UTF-8. <a href='#SkCanvas_drawPosText_pos'>pos</a> elements' meaning depends on <a href='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <a href='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; +UTF-8. <a href='#SkCanvas_drawPosText_pos'>pos</a> elements meaning depends on <a href='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default each glyph left side bearing is positioned at x and its baseline is positioned at y. <a href='undocumented#Text'>Text</a> size is affected by <a href='#Matrix'>Matrix</a> and <a href='SkPaint_Reference#Text_Size'>Paint Text Size</a>. @@ -6029,7 +6032,7 @@ void <a href='#SkCanvas_drawPosTextH'>drawPosTextH</a>(const void* text, size_t must match the number of <a href='undocumented#Glyph'>Glyphs</a> described by <a href='#SkCanvas_drawPosTextH_byteLength'>byteLength</a> of <a href='#SkCanvas_drawPosTextH_text'>text</a>. <a href='#SkCanvas_drawPosTextH_text'>text</a> meaning depends on <a href='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <a href='#SkCanvas_drawPosTextH_text'>text</a> is encoded as -UTF-8. <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> elements' meaning depends on <a href='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <a href='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; +UTF-8. <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> elements meaning depends on <a href='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default each glyph left side bearing is positioned at an <a href='#SkCanvas_drawPosTextH_xpos'>xpos</a> element and its baseline is positioned at <a href='#SkCanvas_drawPosTextH_constY'>constY</a>. <a href='undocumented#Text'>Text</a> size is affected by <a href='#Matrix'>Matrix</a> and <a href='SkPaint_Reference#Text_Size'>Paint Text Size</a>. @@ -6139,21 +6142,22 @@ void <a href='#SkCanvas_drawTextOnPath'>drawTextOnPath</a>(const void* text, siz <a href='#Draw'>Draw</a> <a href='#SkCanvas_drawTextOnPath_text'>text</a> on <a href='SkPath_Reference#Path'>Path</a> <a href='#SkCanvas_drawTextOnPath_path'>path</a>, using <a href='#Clip'>Clip</a>, <a href='#Matrix'>Matrix</a>, and <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawTextOnPath_paint'>paint</a>. Origin of <a href='#SkCanvas_drawTextOnPath_text'>text</a> is at beginning of <a href='#SkCanvas_drawTextOnPath_path'>path</a> offset by <a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a>, if not nullptr. -<a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> also transforms <a href='#SkCanvas_drawTextOnPath_text'>text</a> before <a href='#SkCanvas_drawTextOnPath_text'>text</a> is mapped to <a href='#SkCanvas_drawTextOnPath_path'>path</a>. If the <a href='#SkCanvas_drawTextOnPath_path'>path</a> section +<a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> transforms <a href='#SkCanvas_drawTextOnPath_text'>text</a> before <a href='#SkCanvas_drawTextOnPath_text'>text</a> is mapped to <a href='#SkCanvas_drawTextOnPath_path'>path</a>. If the <a href='#SkCanvas_drawTextOnPath_path'>path</a> section corresponding the glyph advance is curved, the glyph is drawn curved to match; control points in the glyph are mapped to projected points parallel to the <a href='#SkCanvas_drawTextOnPath_path'>path</a>. If the <a href='#SkCanvas_drawTextOnPath_text'>text</a> advance is larger than the <a href='#SkCanvas_drawTextOnPath_path'>path</a> length, the excess <a href='#SkCanvas_drawTextOnPath_text'>text</a> is clipped. +<a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> does not effect <a href='#SkCanvas_drawTextOnPath_paint'>paint</a> <a href='undocumented#Shader'>Shader</a>. + <a href='#SkCanvas_drawTextOnPath_text'>text</a> meaning depends on <a href='SkPaint_Reference#Text_Encoding'>Paint Text Encoding</a>; by default, <a href='#SkCanvas_drawTextOnPath_text'>text</a> is encoded as UTF-8. Origin meaning depends on <a href='SkPaint_Reference#Text_Align'>Paint Text Align</a> and <a href='SkPaint_Reference#Vertical_Text'>Paint Vertical Text</a>; by default <a href='#SkCanvas_drawTextOnPath_text'>text</a> positions the first glyph left side bearing at origin x and its -baseline at origin y. <a href='undocumented#Text'>Text</a> size is affected by <a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> parameter, <a href='#Matrix'>Canvas Matrix</a>, +baseline at origin y. <a href='undocumented#Text'>Text</a> size is affected by <a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> parameter, <a href='#Canvas'>Canvas</a> <a href='#Matrix'>Matrix</a>, and <a href='SkPaint_Reference#Text_Size'>Paint Text Size</a>. All elements of <a href='#SkCanvas_drawTextOnPath_paint'>paint</a>: <a href='undocumented#Path_Effect'>Path Effect</a>, <a href='undocumented#Mask_Filter'>Mask Filter</a>, <a href='undocumented#Shader'>Shader</a>, <a href='undocumented#Color_Filter'>Color Filter</a>, <a href='undocumented#Image_Filter'>Image Filter</a>, and <a href='undocumented#Draw_Looper'>Draw Looper</a>; apply to <a href='#SkCanvas_drawTextOnPath_text'>text</a>. By default, draws -filled 12 point black <a href='undocumented#Glyph'>Glyphs</a>. <a href='#Canvas'>Canvas</a> <a href='#Matrix'>Matrix</a> does effect <a href='#SkCanvas_drawTextOnPath_paint'>paint</a> <a href='undocumented#Shader'>Shader</a>, but -<a href='#SkCanvas_drawTextOnPath_matrix'>matrix</a> parameter does not. +filled 12 point black <a href='undocumented#Glyph'>Glyphs</a>. ### Parameters @@ -6196,8 +6200,8 @@ void <a href='#SkCanvas_drawTextRSXform'>drawTextRSXform</a>(const void* text, s <a href='#Draw'>Draw</a> <a href='#SkCanvas_drawTextRSXform_text'>text</a>, transforming each glyph by the corresponding <a href='undocumented#SkRSXform'>SkRSXform</a>, using <a href='#Clip'>Clip</a>, <a href='#Matrix'>Matrix</a>, and <a href='SkPaint_Reference#Paint'>Paint</a> <a href='#SkCanvas_drawTextRSXform_paint'>paint</a>. -<a href='undocumented#RSXform'>RSXform</a> array specifies a separate square scale, rotation, and translation for -each glyph. +<a href='undocumented#RSXform'>RSXform</a> <a href='#SkCanvas_drawTextRSXform_xform'>xform</a> array specifies a separate square scale, rotation, and translation +for each glyph. <a href='#SkCanvas_drawTextRSXform_xform'>xform</a> does not affect <a href='#SkCanvas_drawTextRSXform_paint'>paint</a> <a href='undocumented#Shader'>Shader</a>. Optional <a href='SkRect_Reference#Rect'>Rect</a> <a href='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is a conservative bounds of <a href='#SkCanvas_drawTextRSXform_text'>text</a>, taking into account <a href='undocumented#RSXform'>RSXform</a> and <a href='#SkCanvas_drawTextRSXform_paint'>paint</a>. If <a href='#SkCanvas_drawTextRSXform_cullRect'>cullRect</a> is outside of <a href='#Clip'>Clip</a>, canvas can skip drawing. diff --git a/site/user/api/SkIPoint_Reference.md b/site/user/api/SkIPoint_Reference.md index 68125d1348..a5f149b6d6 100644 --- a/site/user/api/SkIPoint_Reference.md +++ b/site/user/api/SkIPoint_Reference.md @@ -724,4 +724,4 @@ Can also be used to add <a href='#IVector'>IVector</a> to <a href='#IVector'>IVe </pre> <a href='#SkIVector'>SkIVector</a> provides an alternative name for <a href='#SkIPoint'>SkIPoint</a>. <a href='#SkIVector'>SkIVector</a> and <a href='#SkIPoint'>SkIPoint</a> -can be used interchangably for all purposes.
\ No newline at end of file +can be used interchangeably for all purposes.
\ No newline at end of file diff --git a/site/user/api/SkImageInfo_Reference.md b/site/user/api/SkImageInfo_Reference.md index f6cf52c5d7..4e0ac4bd69 100644 --- a/site/user/api/SkImageInfo_Reference.md +++ b/site/user/api/SkImageInfo_Reference.md @@ -69,7 +69,7 @@ SkImageInfo related constants are defined by <code>enum</code>, <code>enum class </tr> <tr style='background-color: #f0f0f0; '> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#kGray_8_SkColorType'>kGray_8_SkColorType</a></td> - <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>pixel with grayscale level in 8-bit byte</td> + <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>pixel with <a href='undocumented#Grayscale'>Grayscale</a> level in 8-bit byte</td> </tr> <tr> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#kJPEG_SkYUVColorSpace'>kJPEG_SkYUVColorSpace</a></td> @@ -346,7 +346,7 @@ true if <a href='#SkAlphaTypeIsOpaque_at'>at</a> equals <a href='#kOpaque_SkAlph </pre> Describes how pixel bits encode color. A pixel may be an alpha mask, a -grayscale, RGB, or ARGB. +<a href='undocumented#Grayscale'>Grayscale</a>, RGB, or ARGB. <a href='#kN32_SkColorType'>kN32_SkColorType</a> selects the native 32-bit ARGB format. On Little_Endian processors, pixels containing 8-bit ARGB components pack into 32-bit @@ -684,7 +684,7 @@ draw all colors possible to a <a href='#kRGB_101010x_SkColorType'>kRGB_101010x_S ## <a name='Color_Type_Gray_8'>Color Type Gray 8</a> -<a href='#kGray_8_SkColorType'>kGray_8_SkColorType</a> encodes grayscale level in eight bits that is equivalent +<a href='#kGray_8_SkColorType'>kGray_8_SkColorType</a> encodes <a href='undocumented#Grayscale'>Grayscale</a> level in eight bits that is equivalent to equal values for red, blue, and green, representing colors from black to white. Pixels described by <a href='#kGray_8_SkColorType'>kGray_8_SkColorType</a> are fully opaque as if its <a href='SkColor_Reference#Alpha'>Color Alpha</a> was set to one, and should always be paired with @@ -1146,7 +1146,7 @@ SkImageInfo global, <code>struct</code>, and <code>class</code> related member f </tr> <tr style='background-color: #f0f0f0; '> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Color_Type_Gray_8'>Color Type Gray 8</a></td> - <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>encodes level of grayscale in 8 bits</td> + <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>encodes level of <a href='undocumented#Grayscale'>Grayscale</a> in 8 bits</td> </tr> <tr> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#Color_Type_RGBA_1010102'>Color Type RGBA 1010102</a></td> diff --git a/site/user/api/SkPaint_Reference.md b/site/user/api/SkPaint_Reference.md index 66204867f9..725281a67b 100644 --- a/site/user/api/SkPaint_Reference.md +++ b/site/user/api/SkPaint_Reference.md @@ -349,7 +349,7 @@ SkPaint related constants are defined by <code>enum</code>, <code>enum class</co </tr> <tr> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_kFull_Hinting'>kFull Hinting</a></td> - <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>modifies glyph outlines for maxiumum constrast</td> + <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>modifies glyph outlines for maximum constrast</td> </tr> <tr style='background-color: #f0f0f0; '> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_kGlyphID_TextEncoding'>kGlyphID TextEncoding</a></td> @@ -1357,7 +1357,7 @@ gray-level rendering. <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kFull_Hinting'><code>SkPaint::kFull_Hinting</code></a></td> <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '> -Modifies glyph outlines for maxiumum constrast. With FreeType, this selects +Modifies glyph outlines for maximum constrast. With FreeType, this selects FT_LOAD_TARGET_LCD or FT_LOAD_TARGET_LCD_V if <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText Flag</a> is set. FT_LOAD_TARGET_LCD is a variant of FT_LOAD_TARGET_NORMAL optimized for horizontally decimated LCD displays; FT_LOAD_TARGET_LCD_V is a @@ -1367,9 +1367,9 @@ variant of FT_LOAD_TARGET_NORMAL optimized for vertically decimated LCD displays </table> On <a href='undocumented#OS_X'>OS X</a> and iOS, hinting controls whether <a href='undocumented#Core_Graphics'>Core Graphics</a> dilates the font outlines -to account for LCD text. No hinting uses <a href='undocumented#Core_Text'>Core Text</a> gray scale output. +to account for LCD text. No hinting uses <a href='undocumented#Core_Text'>Core Text</a> <a href='undocumented#Grayscale'>Grayscale</a> output. Normal hinting uses <a href='undocumented#Core_Text'>Core Text</a> LCD output. If <a href='#SkPaint_kLCDRenderText_Flag'>kLCDRenderText Flag</a> is clear, -the LCD output is reduced to a single grayscale channel. +the LCD output is reduced to a single <a href='undocumented#Grayscale'>Grayscale</a> channel. On Windows with DirectWrite, <a href='#SkPaint_Hinting'>Hinting</a> has no effect. @@ -2249,7 +2249,7 @@ is positioned to the right of the preceding glyph. <a href='#Vertical_Text'>Vert Skia can translate text character codes as a series of <a href='undocumented#Glyph'>Glyphs</a>, 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 <a href='undocumented#Kerning'>Kerning</a> pairs. Use a text shaping engine like <a href='https://harfbuzz.org/'>HarfBuzz</a></a> to translate text runs into glyph series. @@ -2416,12 +2416,12 @@ paint1 == paint2 ## <a name='Full_Hinting_Spacing'>Full Hinting Spacing</a> if <a href='#SkPaint_Hinting'>Hinting</a> is set to <a href='#SkPaint_kFull_Hinting'>kFull Hinting</a>, <a href='#Full_Hinting_Spacing'>Full Hinting Spacing</a> adjusts the character -spacing by the difference of the hinted and Unhinted <a href='undocumented#Left_Side_Bearing'>Left Side Bearing</a> and +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='#Full_Hinting_Spacing'>Full Hinting Spacing</a> only applies to platforms that use FreeType as their <a href='undocumented#Engine'>Font Engine</a>. -<a href='#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 Kerning tables. +<a href='#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 <a href='undocumented#Kerning'>Kerning</a> tables. <a name='SkPaint_isDevKernText'></a> ## isDevKernText @@ -4393,7 +4393,8 @@ and by its height if <a href='#SkPaint_Flags'>Flags</a> has <a href='#SkPaint_kV <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a name='SkPaint_kAlignCount'><code>SkPaint::kAlignCount</code></a></td> <td style='text-align: center; border: 2px solid #dddddd; padding: 8px; '>3</td> <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '> -number of different Text_Align values defined</td> +May be used to verify that <a href='#SkPaint_Align'>Align</a> is a legal value. +</td> </tr> </table> @@ -5788,7 +5789,7 @@ Uses <a href='#SkPaint_getPosTextPath_pos'>pos</a> array and <a href='#Text_Alig <a href='#Text_Intercepts'>Text Intercepts</a> describe the intersection of drawn text <a href='undocumented#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 @@ -6071,7 +6072,7 @@ For example: if (!path.isInverseFillType() && paint.<a href='#SkPaint_canComputeFastBounds'>canComputeFastBounds</a>) { <a href='SkRect_Reference#SkRect'>SkRect</a> <a href='#SkPaint_computeFastBounds_storage'>storage</a>; if (canvas->quickReject(paint.computeFastBounds(path.getBounds(), &<a href='#SkPaint_computeFastBounds_storage'>storage</a>))) { -return; // don't draw the path +return; // do not draw the path } } // draw the path diff --git a/site/user/api/SkPath_Reference.md b/site/user/api/SkPath_Reference.md index c5a7a9218e..a00c7922e4 100644 --- a/site/user/api/SkPath_Reference.md +++ b/site/user/api/SkPath_Reference.md @@ -998,7 +998,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 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 @@ -3228,7 +3228,7 @@ have no effect; <a href='#Conic'>Conic</a> is identical to a line segment from s point. If <a href='#Conic_Weight'>Weight</a> is less than one, <a href='#Conic'>Conic</a> follows an elliptical arc. If <a href='#Conic_Weight'>Weight</a> is exactly one, then <a href='#Conic'>Conic</a> is identical to <a href='#Quad'>Quad</a>; <a href='#Conic'>Conic</a> follows a parabolic arc. If <a href='#Conic_Weight'>Weight</a> is greater than one, <a href='#Conic'>Conic</a> follows a hyperbolic -arc. If <a href='#Conic_Weight'>Weight</a> is infinity, <a href='#Conic'>Conic</a> is indentical to two line segments, connecting +arc. If <a href='#Conic_Weight'>Weight</a> is infinity, <a href='#Conic'>Conic</a> is identical to two line segments, connecting start <a href='SkPoint_Reference#Point'>Point</a> to control <a href='SkPoint_Reference#Point'>Point</a>, and control <a href='SkPoint_Reference#Point'>Point</a> to end <a href='SkPoint_Reference#Point'>Point</a>. ### Example @@ -5334,7 +5334,7 @@ Returns zero if <a href='#Path'>Path</a> contains no <a href='undocumented#Line' ### Example -<div><fiddle-embed name="af0c66aea3ef81b709664c7007f48aae"> +<div><fiddle-embed name="657a3f3e11acafea92b84d6bb0c13633"> #### Example Output @@ -5746,9 +5746,7 @@ SkPath member functions read and modify the structure properties. <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Topic</th> <th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr> </table> -Iterates through <a href='#Verb_Array'>Verb Array</a>, and associated <a href='#Point_Array'>Point Array</a> and <a href='#Conic_Weight'>Conic Weight</a>. -Provides options to treat open <a href='#Contour'>Contours</a> as closed, and to ignore -degenerate data. + <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0"> class <a href='#SkPath_Iter_Iter'>Iter</a> { @@ -5763,6 +5761,10 @@ public: }; </pre> +Iterates through <a href='#Verb_Array'>Verb Array</a>, and associated <a href='#Point_Array'>Point Array</a> and <a href='#Conic_Weight'>Conic Weight</a>. +Provides options to treat open <a href='#Contour'>Contours</a> as closed, and to ignore +degenerate data. + ### Example <div><fiddle-embed name="2f53df9201769ab7e7c0e164a1334309"><div>Ignoring the actual <a href='#Verb'>Verbs</a> and replacing them with <a href='#Quad'>Quads</a> rounds the @@ -6120,8 +6122,7 @@ SkPath member functions read and modify the structure properties. <tr><th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Topic</th> <th style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>Description</th></tr> </table> -Iterates through <a href='#Verb_Array'>Verb Array</a>, and associated <a href='#Point_Array'>Point Array</a> and <a href='#Conic_Weight'>Conic Weight</a>. -<a href='#Verb_Array'>Verb Array</a>, <a href='#Point_Array'>Point Array</a>, and <a href='#Conic_Weight'>Conic Weight</a> are returned unaltered. + <pre style="padding: 1em 1em 1em 1em;width: 62.5em; background-color: #f0f0f0"> class <a href='#SkPath_RawIter_RawIter'>RawIter</a> { @@ -6135,6 +6136,9 @@ Iterates through <a href='#Verb_Array'>Verb Array</a>, and associated <a href='# } </pre> +Iterates through <a href='#Verb_Array'>Verb Array</a>, and associated <a href='#Point_Array'>Point Array</a> and <a href='#Conic_Weight'>Conic Weight</a>. +<a href='#Verb_Array'>Verb Array</a>, <a href='#Point_Array'>Point Array</a>, and <a href='#Conic_Weight'>Conic Weight</a> are returned unaltered. + <a name='SkPath_RawIter_RawIter'></a> ## RawIter diff --git a/site/user/api/undocumented.md b/site/user/api/undocumented.md index a3034eb73f..e1ae55b70c 100644 --- a/site/user/api/undocumented.md +++ b/site/user/api/undocumented.md @@ -180,6 +180,10 @@ SK_API void <a href='#SkDebugf'>SkDebugf</a>(const char format[], ...) # <a name='SkDeferredDisplayListRecorder'>Class SkDeferredDisplayListRecorder</a> +# <a name='Descenders'>Descenders</a> + +# <a name='Destructor'>Destructor</a> + # <a name='Device'>Device</a> # <a name='SkBaseDevice'>Class SkBaseDevice</a> @@ -293,6 +297,8 @@ void <a href='#GrContext_flush'>flush</a>() # <a name='Glyph'>Glyph</a> +# <a name='Grayscale'>Grayscale</a> + # <a name='HTML_Canvas'>HTML Canvas</a> ## <a name='ArcTo'>ArcTo</a> @@ -316,6 +322,8 @@ void <a href='#SkImageFilter_toString'>toString</a>(<a href='#SkString'>SkString # <a name='Image_Scaling'>Image Scaling</a> +# <a name='Kerning'>Kerning</a> + # <a name='Left_Side_Bearing'>Left Side Bearing</a> # <a name='Line'>Line</a> @@ -637,6 +645,8 @@ static <a href='#sk_sp'>sk sp</a><<a href='#SkShader'>SkShader</a>> <a hre # <a name='SkString'>Class SkString</a> +# <a name='Subclasses'>Subclasses</a> + # <a name='Supersampling'>Supersampling</a> # <a name='Surface_Characterization'>Surface Characterization</a> @@ -693,6 +703,8 @@ bool <a href='#GrBackendTexture_isValid'>isValid</a>() const # <a name='SkTypeface'>Class SkTypeface</a> +# <a name='Unhinted'>Unhinted</a> + # <a name='Unpremultiply'>Unpremultiply</a> # <a name='Vertices'>Vertices</a> diff --git a/tools/bookmaker/bookmaker.cpp b/tools/bookmaker/bookmaker.cpp index aaf3781974..e773df6da8 100644 --- a/tools/bookmaker/bookmaker.cpp +++ b/tools/bookmaker/bookmaker.cpp @@ -176,7 +176,7 @@ BmhParser::MarkProps BmhParser::kMarkProps[] = { , { "Set", MarkType::kSet, R_N, E_N, M(Example) | M(NoExample) } , { "StdOut", MarkType::kStdOut, R_N, E_N, M(Example) | M(NoExample) } , { "Struct", MarkType::kStruct, R_Y, E_O, M(Class) | M_ST } -, { "Substitute", MarkType::kSubstitute, R_N, E_N, M_ST } +, { "Substitute", MarkType::kSubstitute, R_N, E_N, M(Alias) | M_ST } , { "Subtopic", MarkType::kSubtopic, R_Y, E_Y, M_CSST } , { "Table", MarkType::kTable, R_Y, E_N, M(Method) | M_CSST | M_E } , { "Template", MarkType::kTemplate, R_Y, E_N, M_CSST } @@ -426,6 +426,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy case MarkType::kDescription: case MarkType::kStdOut: // may be one-liner + case MarkType::kAlias: case MarkType::kNoExample: case MarkType::kParam: case MarkType::kPhraseDef: @@ -474,6 +475,19 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy } fParent->fChildren.push_back(definition); } + if (MarkType::kAlias == markType) { + const char* end = definition->fChildren.size() > 0 ? + definition->fChildren[0]->fStart : definition->fContentEnd; + TextParser parser(definition->fFileName, definition->fContentStart, end, + definition->fLineCount); + parser.trimEnd(); + string key = string(parser.fStart, parser.lineLength()); + if (fAliasMap.end() != fAliasMap.find(key)) { + return this->reportError<bool>("duplicate alias"); + } + fAliasMap[key] = definition; + definition->fFiddle = definition->fParent->fFiddle; + } break; } else if (MarkType::kPhraseDef == markType) { bool hasParams = '(' == this->next(); @@ -563,7 +577,6 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy } break; // always treated as one-liners (can't detect misuse easily) - case MarkType::kAlias: case MarkType::kAnchor: case MarkType::kBug: case MarkType::kDeprecated: @@ -614,18 +627,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy definition->fContentEnd = link->fContentEnd; definition->fTerminator = fChar; definition->fChildren.emplace_back(link); - } else if (MarkType::kAlias == markType) { - this->skipWhiteSpace(); - const char* start = fChar; - this->skipToNonName(); - string alias(start, fChar - start); - if (fAliasMap.end() != fAliasMap.find(alias)) { - return this->reportError<bool>("duplicate alias"); - } - fAliasMap[alias] = definition; - definition->fFiddle = definition->fParent->fFiddle; - } - else if (MarkType::kLine == markType) { + } else if (MarkType::kLine == markType) { const char* nextLF = this->strnchr('\n', this->fEnd); const char* start = fChar; const char* end = this->trimmedBracketEnd(fMC); @@ -663,7 +665,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy fParent->fDetails = this->skipExact("soon") ? Definition::Details::kSoonToBe_Deprecated : this->skipExact("testing") ? Definition::Details::kTestingOnly_Experiment : - this->skipExact("do not use") ? Definition::Details::kDoNotUse_Experiement : + this->skipExact("do not use") ? Definition::Details::kDoNotUse_Experiment : this->skipExact("not ready") ? Definition::Details::kNotReady_Experiment : Definition::Details::kNone; this->skipSpace(); @@ -1317,7 +1319,9 @@ bool BmhParser::findDefinitions() { return this->reportError<bool>("duplicate name"); } if (hasEnd && expectEnd) { - SkASSERT(fMC != this->peek()); + if (fMC == this->peek()) { + return this->reportError<bool>("missing body"); + } } if (!this->addDefinition(defStart, hasEnd, markType, typeNameBuilder, HasTag::kYes)) { @@ -1847,6 +1851,10 @@ const Definition* BmhParser::parentSpace() const { return parent; } +// A full terminal statement is in the form: +// \n optional-white-space #MarkType white-space #[# white-space] +// \n optional-white-space #MarkType white-space Name white-space #[# white-space] +// MarkType must match definition->fMarkType const char* BmhParser::checkForFullTerminal(const char* end, const Definition* definition) const { const char* start = end; while ('\n' != start[0] && start > fStart) { @@ -1864,25 +1872,27 @@ const char* BmhParser::checkForFullTerminal(const char* end, const Definition* d return end; } parser.skipWhiteSpace(); - const char* nameStart = parser.fChar; - if (isupper(nameStart[0])) { - parser.skipToWhiteSpace(); - if (parser.eof()) { - return end; - } - string defName = string(nameStart, parser.fChar - nameStart); - size_t defNamePos = definition->fName.rfind(defName); - if (definition->fName.length() != defNamePos + defName.length()) { - return end; + TextParser startName(fFileName, definition->fStart, definition->fContentStart, + definition->fLineCount); + if ('#' == startName.next()) { + startName.skipToSpace(); + if (!startName.eof() && startName.skipSpace()) { + const char* nameBegin = startName.fChar; + startName.skipToWhiteSpace(); + string name(nameBegin, (int) (startName.fChar - nameBegin)); + if (fMC != parser.peek() && !parser.skipExact(name.c_str())) { + return end; + } + parser.skipSpace(); } } - parser.skipWhiteSpace(); - if (fMC != parser.next()) { + if (parser.eof() || fMC != parser.next()) { return end; } if (!parser.eof() && fMC != parser.next()) { return end; } + SkASSERT(parser.eof()); return start; } diff --git a/tools/bookmaker/bookmaker.h b/tools/bookmaker/bookmaker.h index 322aa4c446..1a85621d49 100644 --- a/tools/bookmaker/bookmaker.h +++ b/tools/bookmaker/bookmaker.h @@ -811,7 +811,7 @@ public: kNone, kSoonToBe_Deprecated, kTestingOnly_Experiment, - kDoNotUse_Experiement, + kDoNotUse_Experiment, kNotReady_Experiment, }; @@ -1107,6 +1107,11 @@ public: kYes, }; + enum class OneLine { + kNo, + kYes, + }; + ParserCommon() : TextParser() , fParent(nullptr) , fDebugOut(false) @@ -1209,7 +1214,7 @@ public: SkAssertResult(writeBlockTrim(size, data)); } - void writeBlockIndent(int size, const char* data); + bool writeBlockIndent(int size, const char* data); void writeBlockSeparator() { this->writeString( @@ -1225,7 +1230,12 @@ public: this->writeSpace(); } - void writeCommentTrailer() { + void writeCommentTrailer(OneLine oneLine) { + if (OneLine::kNo == oneLine) { + this->lf(1); + } else { + this->writeSpace(); + } this->writeString("*/"); this->lfcr(); } @@ -2012,6 +2022,11 @@ public: }; struct Item { + void reset() { + fName = ""; + fValue = ""; + } + string fName; string fValue; }; @@ -2047,9 +2062,9 @@ public: bool checkChildCommentLength(const Definition* parent, MarkType childType) const; void checkEnumLengths(const Definition& child, string enumName, ItemLength* length) const; - void constOut(const Definition* memberStart, const Definition& child, - const Definition* bmhConst); - void descriptionOut(const Definition* def, SkipFirstLine , Phrase ); + void constOut(const Definition* memberStart, const Definition* bmhConst); + void constSizeMembers(const RootDefinition* root); + bool descriptionOut(const Definition* def, SkipFirstLine , Phrase ); void enumHeaderOut(RootDefinition* root, const Definition& child); string enumMemberComment(const Definition* currentEnumItem, const Definition& child) const; const Definition* enumMemberForComment(const Definition* currentEnumItem) const; @@ -2080,6 +2095,8 @@ public: fBmhParser = nullptr; fEnumDef = nullptr; fMethodDef = nullptr; + fBmhConst = nullptr; + fConstDef = nullptr; fBmhStructDef = nullptr; fInStruct = false; fWroteMethod = false; @@ -2087,6 +2104,7 @@ public: fPendingMethod = false; } + string resolveAlias(const Definition* ); string resolveMethod(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, Phrase phrase); @@ -2101,6 +2119,9 @@ private: const Definition* fBmhMethod; const Definition* fEnumDef; const Definition* fMethodDef; + const Definition* fBmhConst; + const Definition* fConstDef; + const Definition* fLastDescription; Definition* fBmhStructDef; const char* fContinuation; // used to construct paren-qualified method name int fAnonymousEnumCount; @@ -2109,6 +2130,10 @@ private: int fStructMemberTab; int fStructValueTab; int fStructCommentTab; + int fStructMemberLength; + int fConstValueTab; + int fConstCommentTab; + int fConstLength; bool fInStruct; bool fWroteMethod; bool fIndentNext; diff --git a/tools/bookmaker/definition.cpp b/tools/bookmaker/definition.cpp index 1c6b1ebbe0..18ce808068 100644 --- a/tools/bookmaker/definition.cpp +++ b/tools/bookmaker/definition.cpp @@ -814,21 +814,20 @@ bool Definition::hasMatch(string name) const { } string Definition::incompleteMessage(DetailsType detailsType) const { - if (!IncompleteAllowed(fMarkType)) { - auto iter = std::find_if(fChildren.begin(), fChildren.end(), - [](const Definition* test) { return IncompleteAllowed(test->fMarkType); }); - SkASSERT(fChildren.end() != iter); - return (*iter)->incompleteMessage(detailsType); - } - string message = MarkType::kExperimental == fMarkType ? + SkASSERT(!IncompleteAllowed(fMarkType)); + auto iter = std::find_if(fChildren.begin(), fChildren.end(), + [](const Definition* test) { return IncompleteAllowed(test->fMarkType); }); + SkASSERT(fChildren.end() != iter); + SkASSERT(Details::kNone == (*iter)->fDetails); + string message = MarkType::kExperimental == (*iter)->fMarkType ? "Experimental." : "Deprecated."; - if (Definition::Details::kDoNotUse_Experiement == fDetails) { + if (Details::kDoNotUse_Experiment == fDetails) { message += " Do not use."; - } else if (Definition::Details::kNotReady_Experiment == fDetails) { + } else if (Details::kNotReady_Experiment == fDetails) { message += " Not ready for general use."; - } else if (Definition::Details::kSoonToBe_Deprecated == fDetails) { - message += " Soon to be deprecated."; - } else if (Definition::Details::kTestingOnly_Experiment == fDetails) { + } else if (Details::kSoonToBe_Deprecated == fDetails) { + message = "To be deprecated soon."; + } else if (Details::kTestingOnly_Experiment == fDetails) { message += " For testing only."; } if (DetailsType::kPhrase == detailsType) { diff --git a/tools/bookmaker/includeParser.cpp b/tools/bookmaker/includeParser.cpp index 12bd787eb8..56de4f6f15 100644 --- a/tools/bookmaker/includeParser.cpp +++ b/tools/bookmaker/includeParser.cpp @@ -1276,7 +1276,7 @@ bool IncludeParser::findComments(const Definition& includeDef, Definition* marku return true; } -// caller calls reportError, so just return false here +// caller just returns, so report error here bool IncludeParser::parseClass(Definition* includeDef, IsStruct isStruct) { SkASSERT(includeDef->fTokens.size() > 0); // parse class header @@ -1323,15 +1323,11 @@ bool IncludeParser::parseClass(Definition* includeDef, IsStruct isStruct) { while (iter != includeDef->fTokens.end() && (publicLen != (size_t) (iter->fContentEnd - iter->fStart) || strncmp(iter->fStart, publicName, publicLen))) { + iter->fPrivate = true; iter = std::next(iter); ++publicIndex; } } - auto childIter = includeDef->fChildren.begin(); - while (childIter != includeDef->fChildren.end() && (*childIter)->fParentIndex < publicIndex) { - (*childIter)->fPrivate = true; - childIter = std::next(childIter); - } int keyIndex = publicIndex; KeyWord currentKey = KeyWord::kPublic; const char* publicName = kKeyWords[(int) KeyWord::kPublic].fName; @@ -1340,9 +1336,12 @@ bool IncludeParser::parseClass(Definition* includeDef, IsStruct isStruct) { size_t protectedLen = strlen(protectedName); const char* privateName = kKeyWords[(int) KeyWord::kPrivate].fName; size_t privateLen = strlen(privateName); + auto childIter = includeDef->fChildren.begin(); + std::advance(childIter, publicIndex); while (childIter != includeDef->fChildren.end()) { Definition* child = *childIter; while (child->fParentIndex > keyIndex && iter != includeDef->fTokens.end()) { + iter->fPrivate = KeyWord::kPublic != currentKey; const char* testStart = iter->fStart; size_t testLen = (size_t) (iter->fContentEnd - testStart); iter = std::next(iter); @@ -1365,12 +1364,14 @@ bool IncludeParser::parseClass(Definition* includeDef, IsStruct isStruct) { if (!this->parseObject(child, markupDef)) { return false; } - } else { - child->fPrivate = true; } fLastObject = child; childIter = std::next(childIter); } + while (iter != includeDef->fTokens.end()) { + iter->fPrivate = KeyWord::kPublic != currentKey; + iter = std::next(iter); + } SkASSERT(fParent->fParent); fParent = fParent->fParent; return true; diff --git a/tools/bookmaker/includeWriter.cpp b/tools/bookmaker/includeWriter.cpp index 62e8205e3d..f05ef0ece1 100644 --- a/tools/bookmaker/includeWriter.cpp +++ b/tools/bookmaker/includeWriter.cpp @@ -58,22 +58,24 @@ void IncludeWriter::checkEnumLengths(const Definition& child, string enumName, I } } -void IncludeWriter::constOut(const Definition* memberStart, const Definition& child, - const Definition* bmhConst) { +void IncludeWriter::constOut(const Definition* memberStart, const Definition* bmhConst) { const char* bodyEnd = fDeferComment ? fDeferComment->fContentStart - 1 : memberStart->fContentStart; this->writeBlockTrim((int) (bodyEnd - fStart), fStart); // may write nothing this->lf(2); this->writeCommentHeader(); fIndent += 4; - this->descriptionOut(bmhConst, SkipFirstLine::kYes, Phrase::kNo); + if (!this->descriptionOut(bmhConst, SkipFirstLine::kYes, Phrase::kNo)) { + return memberStart->reportError<void>("expected description for const"); + } fIndent -= 4; - this->writeCommentTrailer(); + this->writeCommentTrailer(OneLine::kNo); fStart = memberStart->fContentStart; } -void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirstLine, +bool IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirstLine, Phrase phrase) { + bool wroteSomething = false; const char* commentStart = def->fContentStart; if (SkipFirstLine::kYes == skipFirstLine) { TextParser parser(def); @@ -87,8 +89,12 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs string message = def->incompleteMessage(Definition::DetailsType::kSentence); this->writeString(message); this->lfcr(); + wroteSomething = true; } + const Definition* lastDescription = def; for (auto prop : def->fChildren) { + fLastDescription = lastDescription; + lastDescription = prop; switch (prop->fMarkType) { case MarkType::kCode: { bool literal = false; @@ -98,6 +104,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs SkASSERT(commentLen < 1000); if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) { this->lf(2); + wroteSomething = true; } } size_t childSize = prop->fChildren.size(); @@ -116,14 +123,14 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs if (!literalOutdent) { fIndent += 4; } - this->writeBlockIndent(commentLen, commentStart); + wroteSomething |= this->writeBlockIndent(commentLen, commentStart); this->lf(2); if (!literalOutdent) { fIndent -= 4; } - commentStart = prop->fTerminator; SkDEBUGCODE(wroteCode = true); } + commentStart = prop->fTerminator; } break; case MarkType::kDefinedBy: commentStart = prop->fTerminator; @@ -133,6 +140,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs prop->fContentEnd - prop->fContentStart) + ')'); this->writeString(bugstr); this->lfcr(); + wroteSomething = true; } case MarkType::kDeprecated: case MarkType::kPrivate: @@ -141,10 +149,11 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs SkASSERT(commentLen < 1000); if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) { this->lfcr(); + wroteSomething = true; } } commentStart = prop->fContentStart; - if (' ' < commentStart[0]) { + if (MarkType::kPrivate != prop->fMarkType && ' ' < commentStart[0]) { commentStart = strchr(commentStart, '\n'); } if (MarkType::kBug == prop->fMarkType) { @@ -152,7 +161,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs } commentLen = (int) (prop->fContentEnd - commentStart); if (commentLen > 0) { - this->writeBlockIndent(commentLen, commentStart); + wroteSomething |= this->writeBlockIndent(commentLen, commentStart); const char* end = commentStart + commentLen; while (end > commentStart && ' ' == end[-1]) { --end; @@ -165,8 +174,6 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs commentLen = (int) (def->fContentEnd - commentStart); break; case MarkType::kExperimental: - this->writeString("EXPERIMENTAL:"); - this->writeSpace(); commentStart = prop->fContentStart; if (' ' < commentStart[0]) { commentStart = strchr(commentStart, '\n'); @@ -175,6 +182,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs if (commentLen > 0) { if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) { this->lfcr(); + wroteSomething = true; } } commentStart = prop->fTerminator; @@ -190,13 +198,14 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs } else { this->writeSpace(); } + wroteSomething = true; } } int saveIndent = fIndent; if (fIndent < fColumn + 1) { fIndent = fColumn + 1; } - this->writeBlockIndent(prop->length(), prop->fContentStart); + wroteSomething |= this->writeBlockIndent(prop->length(), prop->fContentStart); fIndent = saveIndent; commentStart = prop->fTerminator; commentLen = (int) (def->fContentEnd - commentStart); @@ -217,6 +226,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs SkASSERT(commentLen < 1000); if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) { this->lfcr(); + wroteSomething = true; } } commentStart = prop->fTerminator; @@ -228,6 +238,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) { this->lfcr(); + wroteSomething = true; } } for (auto row : prop->fChildren) { @@ -236,7 +247,7 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs SkASSERT(MarkType::kColumn == column->fMarkType); this->writeString("-"); this->writeSpace(); - this->descriptionOut(column, SkipFirstLine::kNo, Phrase::kNo); + wroteSomething |= this->descriptionOut(column, SkipFirstLine::kNo, Phrase::kNo); this->lf(1); } } @@ -252,10 +263,11 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs this->rewriteBlock(commentLen, commentStart, Phrase::kNo); // ince we don't do line wrapping, always insert LF before phrase this->lfcr(); // TODO: remove this once rewriteBlock rewraps paragraphs + wroteSomething = true; } auto iter = fBmhParser->fPhraseMap.find(prop->fName); if (fBmhParser->fPhraseMap.end() == iter) { - return this->reportError<void>("missing phrase definition"); + return this->reportError<bool>("missing phrase definition"); } Definition* phraseDef = iter->second; // TODO: given TextParser(commentStart, prop->fStart + up to #) return if @@ -289,12 +301,16 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs this->writeSpace(); } defIsPhrase = Phrase::kYes; + wroteSomething = true; } if (length > 0) { this->rewriteBlock(length, start, defIsPhrase); } commentStart = prop->fContentStart; commentLen = (int) (def->fContentEnd - commentStart); + if ('\n' == commentStart[0] && '\n' == commentStart[1]) { + this->lf(2); + } } break; default: commentLen = (int) (prop->fStart - commentStart); @@ -307,7 +323,9 @@ void IncludeWriter::descriptionOut(const Definition* def, SkipFirstLine skipFirs SkASSERT(wroteCode || (commentLen > 0 && commentLen < 1500) || def->fDeprecated); if (commentLen > 0) { this->rewriteBlock(commentLen, commentStart, phrase); + wroteSomething = true; } + return wroteSomething; } void IncludeWriter::enumHeaderOut(RootDefinition* root, const Definition& child) { @@ -435,7 +453,7 @@ void IncludeWriter::enumHeaderOut(RootDefinition* root, const Definition& child) if (wroteHeader) { fIndent -= 4; this->lfcr(); - this->writeCommentTrailer(); + this->writeCommentTrailer(OneLine::kNo); } Definition* braceHolder = child.fChildren[0]; if (KeyWord::kClass == braceHolder->fKeyWord) { @@ -474,7 +492,7 @@ string IncludeWriter::enumMemberComment(const Definition* currentEnumItem, break; } if (IncompleteAllowed(constItem->fMarkType)) { - shortComment = constItem->incompleteMessage(Definition::DetailsType::kPhrase); + shortComment = constItem->fParent->incompleteMessage(Definition::DetailsType::kPhrase); } } if (!shortComment.length()) { @@ -617,6 +635,7 @@ void IncludeWriter::enumMembersOut(Definition& child) { } if (ItemState::kNone != state) { this->enumMemberOut(currentEnumItem, child, item, preprocessor); + item.reset(); fStart = token.fContentStart; state = ItemState::kNone; last.fStart = nullptr; @@ -840,7 +859,7 @@ void IncludeWriter::methodOut(Definition* method, const Definition& child) { } fIndent -= 4; this->lfcr(); - this->writeCommentTrailer(); + this->writeCommentTrailer(OneLine::kNo); fBmhMethod = nullptr; fMethodDef = nullptr; fEnumDef = nullptr; @@ -864,7 +883,7 @@ void IncludeWriter::structOut(const Definition* root, const Definition& child, } fIndent -= 4; this->lfcr(); - this->writeCommentTrailer(); + this->writeCommentTrailer(OneLine::kNo); } bool IncludeWriter::findEnumSubtopic(string undername, const Definition** rootDefPtr) const { @@ -916,36 +935,18 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const string name(child.fContentStart, (int) (child.fContentEnd - child.fContentStart)); Definition* commentBlock = this->findMemberCommentBlock(fBmhStructDef->fChildren, name); if (!commentBlock) { - return memberStart->reportError<Definition*>("member missing comment block"); + return memberStart->reportError<Definition*>("member missing comment block 2"); } -#if 0 - if (!commentBlock->fShort) { - const char* commentStart = commentBlock->fContentStart; - ptrdiff_t commentLen = commentBlock->fContentEnd - commentStart; + auto lineIter = std::find_if(commentBlock->fChildren.begin(), commentBlock->fChildren.end(), + [](const Definition* def){ return MarkType::kLine == def->fMarkType; } ); + SkASSERT(commentBlock->fChildren.end() != lineIter); + const Definition* lineDef = *lineIter; + if (fStructMemberLength > 100) { this->writeCommentHeader(); - bool wroteLineFeed = false; - fIndent += 4; - for (auto child : commentBlock->fChildren) { - commentLen = child->fStart - commentStart; - wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart, Phrase::kNo); - if (MarkType::kFormula == child->fMarkType) { - this->writeSpace(); - this->writeBlock((int) (child->fContentEnd - child->fContentStart), - child->fContentStart); - } - commentStart = child->fTerminator; - } - commentLen = commentBlock->fContentEnd - commentStart; - wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart, Phrase::kNo); - fIndent -= 4; - if (wroteLineFeed || fColumn > 100 - 3 /* space * / */ ) { - this->lfcr(); - } else { - this->writeSpace(); - } - this->writeCommentTrailer(); + this->writeSpace(); + this->rewriteBlock(lineDef->length(), lineDef->fContentStart, Phrase::kYes); + this->writeCommentTrailer(OneLine::kYes); } -#endif this->lfcr(); this->writeBlock((int) (child.fStart - memberStart->fContentStart), memberStart->fContentStart); @@ -967,22 +968,80 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const valueStart->fContentStart); } this->writeString(";"); - /* if (commentBlock->fShort) */ { + if (fStructMemberLength <= 100) { this->indentToColumn(fStructCommentTab); this->writeString("//!<"); this->writeSpace(); - string extract = fBmhParser->extractText(commentBlock, BmhParser::TrimExtract::kYes); - this->rewriteBlock(extract.length(), &extract.front(), Phrase::kNo); + this->rewriteBlock(lineDef->length(), lineDef->fContentStart, Phrase::kYes); } - this->lf(2); + this->lf(1); return valueEnd; } +// const and constexpr and #define aren't contained in a braces like struct and enum. +// use a bmh subtopic to group like ones together, then measure them in the include as if +// they were formally linked together +void IncludeWriter::constSizeMembers(const RootDefinition* root) { + // fBmhConst->fParent is subtopic containing all grouped const expressions + // fConstDef is token of const include name, hopefully on same line as const start + string rootPrefix = root ? root->fName + "::" : ""; + const Definition* test = fConstDef; + int tokenIndex = test->fParentIndex; + int longestName = 0; + int longestValue = 0; + int longestComment = 0; + const Definition* subtopic = fBmhConst->fParent; + SkASSERT(subtopic); + SkASSERT(MarkType::kSubtopic == subtopic->fMarkType); + // back up to first token on line + size_t lineCount = test->fLineCount; + const Definition* last; + auto tokenIter = test->fParent->fTokens.begin(); + std::advance(tokenIter, tokenIndex); + do { + last = test; + std::advance(tokenIter, -1); + test = &*tokenIter; + SkASSERT(test->fParentIndex == --tokenIndex); + } while (lineCount == test->fLineCount); + test = last; + for (auto child : subtopic->fChildren) { + if (MarkType::kConst != child->fMarkType) { + continue; + } + // expect found name to be on the left of assign + // expect assign + // expect semicolon + // no parens, no braces + while (rootPrefix + test->fName != child->fName) { + std::advance(tokenIter, 1); + test = &*tokenIter; + SkASSERT(lineCount >= test->fLineCount); + } + ++lineCount; + TextParser constText(test); + const char* nameEnd = constText.trimmedBracketEnd('='); + SkAssertResult(constText.skipToEndBracket('=')); + const char* valueEnd = constText.trimmedBracketEnd(';'); + auto lineIter = std::find_if(child->fChildren.begin(), child->fChildren.end(), + [](const Definition* def){ return MarkType::kLine == def->fMarkType; }); + SkASSERT(child->fChildren.end() != lineIter); + longestName = SkTMax(longestName, (int) (nameEnd - constText.fStart)); + longestValue = SkTMax(longestValue, (int) (valueEnd - constText.fChar)); + longestComment = SkTMax(longestComment, (*lineIter)->length()); + } + // write fStructValueTab, fStructCommentTab + fConstValueTab = longestName + fIndent + 1; + fConstCommentTab = fConstValueTab + longestValue + 2; + fConstLength = fConstCommentTab + longestComment + (int) sizeof("//!<"); +} + void IncludeWriter::structSizeMembers(const Definition& child) { int longestType = 0; Definition* typeStart = nullptr; int longestName = 0; int longestValue = 0; + int longestComment = 0; SkASSERT(child.fChildren.size() == 1 || child.fChildren.size() == 2); bool inEnum = false; bool inMethod = false; @@ -1066,6 +1125,18 @@ void IncludeWriter::structSizeMembers(const Definition& child) { longestName = SkTMax(longestName, (int) (token.fContentEnd - token.fContentStart)); typeStart->fMemberStart = true; inMember = true; + string tokenName(token.fContentStart, (int) (token.fContentEnd - token.fContentStart)); + Definition* commentBlock = this->findMemberCommentBlock(fBmhStructDef->fChildren, + tokenName); + if (!commentBlock) { + return token.reportError<void>("member missing comment block 1"); + } + auto lineIter = std::find_if(commentBlock->fChildren.begin(), + commentBlock->fChildren.end(), + [](const Definition* def){ return MarkType::kLine == def->fMarkType; } ); + SkASSERT(commentBlock->fChildren.end() != lineIter); + const Definition* lineDef = *lineIter; + longestComment = SkTMax(longestComment, lineDef->length()); continue; } if (MarkType::kMethod == token.fMarkType) { @@ -1089,6 +1160,7 @@ void IncludeWriter::structSizeMembers(const Definition& child) { fStructCommentTab += longestValue + 3 /* space = space */ ; fStructValueTab -= 1 /* ; */ ; } + fStructMemberLength = fStructCommentTab + longestComment; // iterate through struct to ensure that members' comments fit on line // struct or class may not have any members (void) this->checkChildCommentLength(fBmhStructDef, MarkType::kMember); @@ -1218,6 +1290,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti params.skipToEndBracket('('); if (params.startsWith(child.fContentStart, childLen)) { this->methodOut(clonedMethod, child); + sawConst = false; break; } ++alternate; @@ -1263,6 +1336,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti return child.reportError<bool>("method not found"); } this->methodOut(method, child); + sawConst = false; continue; } if (Definition::Type::kPunctuation == child.fType && @@ -1283,6 +1357,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti continue; } this->methodOut(method, child); + sawConst = false; continue; } else if (fBmhStructDef && fBmhStructDef->fDeprecated) { fContinuation = nullptr; @@ -1343,6 +1418,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti continue; } this->methodOut(method, child); + sawConst = false; if (fAttrDeprecated) { startDef = fAttrDeprecated; fStart = fAttrDeprecated->fContentStart; @@ -1387,6 +1463,8 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti name = child.fName; } else if (1 == trial) { name = root->fName + "::" + child.fName; + } else if (2 == trial) { + name = root->fName; } else { SkASSERT(parent); name = parent->fName + "::" + child.fName; @@ -1451,11 +1529,12 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti continue; } #endif + Definition* priorBlock = fBmhStructDef; Definition* codeBlock = nullptr; Definition* nextBlock = nullptr; for (auto test : fBmhStructDef->fChildren) { if (MarkType::kCode == test->fMarkType) { - SkASSERT(!codeBlock); // FIXME: check enum for correct order earlier + SkASSERT(!codeBlock); // FIXME: check enum earlier codeBlock = test; continue; } @@ -1463,13 +1542,34 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti nextBlock = test; break; } + priorBlock = test; } - // FIXME: trigger error earlier if inner #Struct or #Class is missing #Code + // FIXME: trigger error earlier if inner #Struct or #Class is missing #Code if (!fBmhStructDef->fDeprecated) { SkASSERT(codeBlock); SkASSERT(nextBlock); // FIXME: check enum for correct order earlier const char* commentStart = codeBlock->fTerminator; const char* commentEnd = nextBlock->fStart; + // FIXME: trigger error if #Code is present but comment is before it earlier + SkASSERT(priorBlock); // code always preceded by #Line (I think) + TextParser priorComment(priorBlock->fFileName, + priorBlock->fTerminator, codeBlock->fStart, + priorBlock->fLineCount); + priorComment.trimEnd(); + if (!priorComment.eof()) { + return priorBlock->reportError<bool>( + "expect no comment before #Code"); + } + TextParser nextComment(codeBlock->fFileName, commentStart, + commentEnd, codeBlock->fLineCount); + nextComment.trimEnd(); + if (!priorComment.eof()) { + return priorBlock->reportError<bool>( + "expect comment after #Code"); + } + if (!nextComment.eof()) { + + } fIndentNext = true; this->structOut(root, *fBmhStructDef, commentStart, commentEnd); } @@ -1632,10 +1732,33 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti } } if (bmhConst) { - this->constOut(memberStart, child, bmhConst); + this->constOut(memberStart, bmhConst); fDeferComment = nullptr; sawConst = false; } + } else if (MarkType::kNone == child.fMarkType && sawConst && !fEnumDef) { + string match; + if (root) { + match = root->fName + "::"; + match += string(child.fContentStart, child.fContentEnd - child.fContentStart); + auto bmhClassIter = fBmhParser->fClassMap.find(root->fName); + if (fBmhParser->fClassMap.end() != bmhClassIter) { + RootDefinition& bmhClass = bmhClassIter->second; + auto constIter = std::find_if(bmhClass.fLeaves.begin(), bmhClass.fLeaves.end(), + [match](std::pair<const string, Definition>& leaf){ return match == leaf.second.fName; } ); + if (bmhClass.fLeaves.end() != constIter) { + const Definition& bmhConst = constIter->second; + if (MarkType::kConst == bmhConst.fMarkType + && MarkType::kSubtopic == bmhConst.fParent->fMarkType) { + fBmhConst = &bmhConst; + fConstDef = &child; + } + } + } + } else { + SkDebugf(""); // FIXME: support global constexpr + } + } if (child.fMemberStart) { memberStart = &child; @@ -1649,8 +1772,59 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti } if (Definition::Type::kPunctuation == child.fType) { if (Punctuation::kSemicolon == child.fPunctuation) { + if (sawConst && fBmhConst) { // find bmh documentation. Parent must be subtopic. + const Definition* subtopic = fBmhConst->fParent; + SkASSERT(subtopic); + SkASSERT(MarkType::kSubtopic == subtopic->fMarkType); + auto firstConst = std::find_if(subtopic->fChildren.begin(), + subtopic->fChildren.end(), + [](const Definition* def){ return MarkType::kConst == def->fMarkType;}); + SkASSERT(firstConst != subtopic->fChildren.end()); + bool constIsFirst = *firstConst == fBmhConst; + if (constIsFirst) { // If first #Const child, output subtopic description. + this->constOut(memberStart, subtopic); + // find member / value / comment tabs + // look for a one-to-one correspondence between bmh and include + this->constSizeMembers(root); + } + const char* blockStart = fDeferComment ? fLastComment->fContentEnd : fStart; + const char* blockEnd = fDeferComment ? fDeferComment->fStart - 1 : + memberStart->fStart; + this->writeBlockTrim((int) (blockEnd - blockStart), blockStart); + // after const code, output #Line description as short comment + auto lineIter = std::find_if(fBmhConst->fChildren.begin(), + fBmhConst->fChildren.end(), + [](const Definition* def){ return MarkType::kLine == def->fMarkType; }); + SkASSERT(fBmhConst->fChildren.end() != lineIter); + const Definition* lineDef = *lineIter; + if (fConstLength > 100) { + this->writeCommentHeader(); + this->writeSpace(); + this->rewriteBlock(lineDef->length(), lineDef->fContentStart, Phrase::kYes); + this->writeCommentTrailer(OneLine::kYes); + } + this->lfcr(); + TextParser constText(memberStart); + const char* nameEnd = constText.trimmedBracketEnd('='); + SkAssertResult(constText.skipToEndBracket('=')); + const char* valueEnd = constText.trimmedBracketEnd(';'); + this->writeBlock((int) (nameEnd - memberStart->fContentStart), + memberStart->fContentStart); + this->indentToColumn(fConstValueTab); + this->writeBlock((int) (valueEnd - constText.fChar), constText.fChar); + this->writeString(";"); + if (fConstLength <= 100) { + this->indentToColumn(fConstCommentTab); + this->writeString("//!<"); + this->writeSpace(); + this->rewriteBlock(lineDef->length(), lineDef->fContentStart, Phrase::kYes); + } + fStart = child.fContentStart + 1; + fDeferComment = nullptr; + fBmhConst = nullptr; + sawConst = false; + } memberStart = nullptr; - sawConst = false; staticOnly = false; if (inStruct) { fInStruct = false; @@ -1763,6 +1937,25 @@ string IncludeWriter::resolveMethod(const char* start, const char* end, bool fir RootDefinition::AllowParens::kNo); if (defRef && MarkType::kMethod == defRef->fMarkType) { substitute = methodname + "()"; + } else { + auto defineIter = fBmhParser->fDefineMap.find(methodname); + if (fBmhParser->fDefineMap.end() != defineIter) { + const RootDefinition& defineDef = defineIter->second; + auto codeIter = std::find_if(defineDef.fChildren.begin(), + defineDef.fChildren.end(), + [](Definition* child){ return MarkType::kCode == child->fMarkType; } ); + if (defineDef.fChildren.end() != codeIter) { + const Definition* codeDef = *codeIter; + string codeContents(codeDef->fContentStart, codeDef->length()); + size_t namePos = codeContents.find(methodname); + if (string::npos != namePos) { + size_t parenPos = namePos + methodname.length(); + if (parenPos < codeContents.length() && '(' == codeContents[parenPos]) { + substitute = methodname + "()"; + } + } + } + } } } if (fMethodDef && methodname == fMethodDef->fName) { @@ -1783,6 +1976,18 @@ string IncludeWriter::resolveMethod(const char* start, const char* end, bool fir return substitute; } +string IncludeWriter::resolveAlias(const Definition* def) { + for (auto child : def->fChildren) { + if (MarkType::kSubstitute == child->fMarkType) { + return string(child->fContentStart, (int) (child->fContentEnd - child->fContentStart)); + } + if (MarkType::kAlias == child->fMarkType && def->fName == child->fName) { + return this->resolveAlias(child); + } + } + return ""; +} + string IncludeWriter::resolveRef(const char* start, const char* end, bool first, RefType* refType) { // look up Xxx_Xxx @@ -1820,6 +2025,9 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first, } } } + if (!rootDef && fEnumDef && "Sk" + prefixedName == fEnumDef->fFiddle) { + rootDef = fEnumDef; + } if (!rootDef && !substitute.length()) { auto aliasIter = fBmhParser->fAliasMap.find(undername); if (fBmhParser->fAliasMap.end() != aliasIter) { @@ -1837,17 +2045,9 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first, } if (rootDef) { MarkType rootType = rootDef->fMarkType; - bool isTopic = MarkType::kSubtopic == rootType || MarkType::kTopic == rootType; - auto substituteParent = MarkType::kAlias == rootType ? rootDef->fParent : - isTopic ? rootDef : nullptr; - if (substituteParent) { - for (auto child : substituteParent->fChildren) { - if (MarkType::kSubstitute == child->fMarkType) { - substitute = string(child->fContentStart, - (int) (child->fContentEnd - child->fContentStart)); - break; - } - } + if (MarkType::kSubtopic == rootType || MarkType::kTopic == rootType + || MarkType::kAlias == rootType) { + substitute = this->resolveAlias(rootDef); } if (!substitute.length()) { string match = rootDef->fName; @@ -1856,7 +2056,7 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first, match.erase(index, 1); } string skmatch = "Sk" + match; - auto parent = substituteParent ? substituteParent : rootDef; + auto parent = MarkType::kAlias == rootType ? rootDef->fParent : rootDef; for (auto child : parent->fChildren) { // there may be more than one // prefer the one mostly closely matching in text @@ -1910,6 +2110,22 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first, substitute += ' '; substitute += ConvertRef(rootDef->fName, false); } else { + size_t underpos = undername.find('_'); + if (string::npos != underpos) { + string parentName = undername.substr(0, underpos); + string skName = "Sk" + parentName; + if (skName == parent->fName) { + SkASSERT(start >= fLastDescription->fContentStart); + string lastDescription = string(fLastDescription->fContentStart, + (int) (start - fLastDescription->fContentStart)); + size_t lineStart = lastDescription.rfind('\n'); + SkASSERT(string::npos != lineStart); + fLine = fLastDescription->fContentStart + lineStart + 1; + fChar = start; + fEnd = end; + return this->reportError<string>("remove underline"); + } + } substitute += ConvertRef(undername, first); } } diff --git a/tools/bookmaker/parserCommon.cpp b/tools/bookmaker/parserCommon.cpp index 3733aed366..652df53e51 100644 --- a/tools/bookmaker/parserCommon.cpp +++ b/tools/bookmaker/parserCommon.cpp @@ -102,7 +102,8 @@ bool ParserCommon::parseSetup(const char* path) { return true; } -void ParserCommon::writeBlockIndent(int size, const char* data) { +bool ParserCommon::writeBlockIndent(int size, const char* data) { + bool wroteSomething = false; while (size && ' ' >= data[size - 1]) { --size; } @@ -113,7 +114,7 @@ void ParserCommon::writeBlockIndent(int size, const char* data) { --size; } if (!size) { - return; + return wroteSomething; } if (newLine) { this->lf(1); @@ -130,7 +131,9 @@ void ParserCommon::writeBlockIndent(int size, const char* data) { size -= len; data += len; newLine = true; + wroteSomething = true; } + return wroteSomething; } bool ParserCommon::writeBlockTrim(int size, const char* data) { |