diff --git a/docs/SkBitmap_Reference.bmh b/docs/SkBitmap_Reference.bmh
index 35f4de6dcb..27580233da 100644
--- a/docs/SkBitmap_Reference.bmh
+++ b/docs/SkBitmap_Reference.bmh
@@ -223,6 +223,7 @@ or setPixelRef was called.
SkDebugf("pixel address = %p\n", bitmap.getPixels());
}
#StdOut
+#Volatile
pixel address = (nil)
pixel address = 0x560ddd0ac670
##
diff --git a/docs/SkCanvas_Reference.bmh b/docs/SkCanvas_Reference.bmh
index 3e7369176e..486fe46d71 100644
--- a/docs/SkCanvas_Reference.bmh
+++ b/docs/SkCanvas_Reference.bmh
@@ -6104,4 +6104,55 @@ Returns false if the clip is empty, or if it is not Rect.
##
#Class SkCanvas ##
+
+#Class SkAutoCanvasRestore
+
+Stack helper class calls SkCanvas::restoreToCount() when SkAutoCanvasRestore
+goes out of scope. Use this to guarantee that the canvas is restored to a known
+state.
+
+#Method SkAutoCanvasRestore(SkCanvas* canvas, bool doSave)
+
+Preserves Canvas save count. Optionally saves Canvas Clip and Matrix.
+
+#Param canvas Canvas to guard ##
+#Param doSave call SkCanvas::save() ##
+
+#Return utility to restore Canvas state on destructor ##
+
+#Example
+// incomplete
+##
+
+#SeeAlso SkCanvas::save SkCanvas::restore
+
+##
+
+#Method ~SkAutoCanvasRestore()
+
+Restores Canvas to saved state.
+
+#Example
+// incomplete
+##
+
+#SeeAlso SkCanvas::save SkCanvas::restore
+
+##
+
+#Method void restore()
+
+Restores Canvas to saved state immediately. Subsequent calls and class
+destructor have no effect.
+
+#Example
+// incomplete
+##
+
+#SeeAlso SkCanvas::save SkCanvas::restore
+
+##
+
+#Class SkAutoCanvasRestore ##
+
#Topic Canvas ##
diff --git a/docs/SkIRect_Reference.bmh b/docs/SkIRect_Reference.bmh
index 0a9ddf8bf4..d92c08715d 100644
--- a/docs/SkIRect_Reference.bmh
+++ b/docs/SkIRect_Reference.bmh
@@ -23,10 +23,10 @@ its top, it is considered empty.
#Subtopic Operators
#Table
#Legend
-# description # function ##
+# description # function ##
#Legend ##
-# friend bool operator!=(const SkIRect& a, const SkIRect& b) # Returns true if members are unequal. ##
-# friend bool operator==(const SkIRect& a, const SkIRect& b) # Returns true if members are equal. ##
+# bool operator!=(const SkIRect& a, const SkIRect& b) # Returns true if members are unequal. ##
+# bool operator==(const SkIRect& a, const SkIRect& b) # Returns true if members are equal. ##
#Table ##
#Subtopic ##
@@ -106,7 +106,7 @@ When equal to or less than fTop, IRect is empty.
# ------------------------------------------------------------------------------
-#Method static SkIRect SK_WARN_UNUSED_RESULT MakeEmpty()
+#Method static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeEmpty()
Returns constructed IRect set to (0, 0, 0, 0).
Many other rectangles are empty; if left is equal to or greater than right,
@@ -166,7 +166,7 @@ outset isEmpty: true
# ------------------------------------------------------------------------------
-#Method static SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t h)
+#Method static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t h)
Returns constructed IRect set to (0, 0, w, h). Does not validate input; w or h
may be negative.
@@ -194,7 +194,7 @@ all equal
# ------------------------------------------------------------------------------
-#Method static SkIRect SK_WARN_UNUSED_RESULT MakeSize(const SkISize& size)
+#Method static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeSize(const SkISize& size)
Returns constructed IRect set to (0, 0, size.width(), size.height()).
Does not validate input; size.width() or size.height() may be negative.
@@ -221,7 +221,7 @@ floor width: 25 height: 35
# ------------------------------------------------------------------------------
-#Method static SkIRect SK_WARN_UNUSED_RESULT MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
+#Method static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
Returns constructed IRect set to (l, t, r, b). Does not sort input; Rect may
result in fLeft greater than fRight, or fTop greater than fBottom.
@@ -252,7 +252,7 @@ rect: 5, 25, 15, 35 isEmpty: false
# ------------------------------------------------------------------------------
-#Method static SkIRect SK_WARN_UNUSED_RESULT MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
+#Method static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
Returns constructed IRect set to
#Formula
@@ -266,7 +266,7 @@ w or h may be negative.
#Param w added to x and stored in fRight ##
#Param h added to y and stored in fBottom ##
-#Return bounds (x, y, x + w, y + h) ##
+#Return bounds at (x, y) with width w and height h ##
#Example
SkIRect rect = SkIRect::MakeXYWH(5, 35, -15, 25);
@@ -627,7 +627,7 @@ large is empty: false
# ------------------------------------------------------------------------------
-#Method friend bool operator==(const SkIRect& a, const SkIRect& b)
+#Method bool operator==(const SkIRect& a, const SkIRect& b)
Returns true if all members in a: fLeft, fTop, fRight, and fBottom; are
identical to corresponding members in b.
@@ -652,7 +652,7 @@ test == sorted
# ------------------------------------------------------------------------------
-#Method friend bool operator!=(const SkIRect& a, const SkIRect& b)
+#Method bool operator!=(const SkIRect& a, const SkIRect& b)
Returns true if any member in a: fLeft, fTop, fRight, and fBottom; is not
identical to the corresponding member in b.
diff --git a/docs/SkMatrix_Reference.bmh b/docs/SkMatrix_Reference.bmh
index db7e7c3c73..0db0fa881e 100644
--- a/docs/SkMatrix_Reference.bmh
+++ b/docs/SkMatrix_Reference.bmh
@@ -3,10 +3,13 @@
#Class SkMatrix
-The SkMatrix class holds a 3x3 matrix for transforming coordinates.
+Matrix holds a 3x3 matrix for transforming coordinates.
+Matrix elements are in column major order.
+
SkMatrix does not have a constructor, so it must be explicitly initialized
using either reset() - to construct an identity matrix, or one of the set
functions (e.g. setTranslate, setRotate, etc.).
+
SkMatrix is not thread safe unless getType is called first.
#Topic Overview
@@ -25,8 +28,10 @@ SkMatrix is not thread safe unless getType is called first.
#Legend
# description # function ##
#Legend ##
-# friend SK_API bool operator!=(const SkMatrix& a, const SkMatrix& b) # ##
-# friend SK_API bool operator==(const SkMatrix& a, const SkMatrix& b) # ##
+# friend SK_API bool operator!=(const SkMatrix& a, const SkMatrix& b) # Returns true if members are unequal. ##
+# friend SK_API bool operator==(const SkMatrix& a, const SkMatrix& b) # Returns true if members are equal. ##
+# SkScalar operator[](int index) const # Returns one of nine Matrix values. ##
+# SkScalar& operator[](int index) # Returns a writable reference to one of nine Matrix values. ##
#Table ##
#Subtopic ##
@@ -35,46 +40,45 @@ SkMatrix is not thread safe unless getType is called first.
#Legend
# description # function ##
#Legend ##
-# Concat # ##
-# GetMapPtsProc # ##
-# GetMapXYProc # ##
-# I # ##
-# InvalidMatrix # ##
-# MakeRectToRect # ##
-# MakeScale # ##
-# MakeTrans # ##
-# SetAffineIdentity # ##
-# [ # ##
-# asAffine # ##
-# cheapEqualTo # ##
-# decomposeScale # ##
-# dirtyMatrixTypeCache # ##
-# dump # ##
-# fixedStepInX # ##
-# get # ##
-# get9 # ##
-# getMapPtsProc # ##
-# getMapXYProc # ##
-# getMaxScale # ##
-# getMinMaxScales # ##
-# getMinScale # ##
-# getPerspX # ##
-# getPerspY # ##
-# getScaleX # ##
-# getScaleY # ##
-# getSkewX # ##
-# getSkewY # ##
-# getTranslateX # ##
-# getTranslateY # ##
-# getType # ##
-# hasPerspective # ##
-# invert # ##
-# isFinite # ##
-# isFixedStepInX # ##
-# isIdentity # ##
-# isScaleTranslate # ##
-# isSimilarity # ##
-# isTranslate # ##
+# Concat # Returns the concatenation of Matrix pair. ##
+# GetMapPtsProc # Returns optimal function to map Point array. ##
+# GetMapXYProc # Returns optimal function to map one Point. ##
+# I # Returns a reference to a const identity Matrix. ##
+# InvalidMatrix # Returns a reference to a const invalid Matrix. ##
+# MakeRectToRect # Constructs from source Rect to destination Rect. ##
+# MakeScale # Constructs from scale in x and y. ##
+# MakeTrans # Constructs from translate in x and y. ##
+# SetAffineIdentity # Sets 2x3 array to identity. ##
+# asAffine # Copies to 2x3 array. ##
+# cheapEqualTo # Compares Matrix pair using memcmp(). ##
+# decomposeScale # Separates scale if possible. ##
+# dirtyMatrixTypeCache # Private; used by testing. ##
+# dump # Sends text representation using floats to standard output. ##
+# fixedStepInX # Returns step in x for a position in y. ##
+# get # Returns one of nine Matrix values. ##
+# get9 # Returns all nine Matrix values. ##
+# getMapPtsProc # Returns optimal function to map Point array. ##
+# getMapXYProc # Returns optimal function to map one Point. ##
+# getMaxScale # Returns maximum scaling, if possible. ##
+# getMinMaxScales # Returns minimum and maximum scaling, if possible. ##
+# getMinScale # Returns minimum scaling, if possible. ##
+# getPerspX # Returns horizontal perspective factor. ##
+# getPerspY # Returns vertical perspective factor. ##
+# getScaleX # Returns horizontal scale factor. ##
+# getScaleY # Returns vertical scale factor.##
+# getSkewX # Returns horizontal skew factor. ##
+# getSkewY # Returns vertical skew factor. ##
+# getTranslateX # Returns horizontal translation factor. ##
+# getTranslateY # Returns vertical translation factor. ##
+# getType # Returns transform complexity. ##
+# hasPerspective # Returns if transform includes perspective. ##
+# invert # Returns inverse, if possible. ##
+# isFinite # Returns if all Matrix values are not infinity, NaN. ##
+# isFixedStepInX # Returns if transformation supports fixed step in x. ##
+# isIdentity # Returns if matrix equals the identity Matrix .##
+# isScaleTranslate # Returns if transform is limited to scale and translate. ##
+# isSimilarity # Returns if transform is limited to square scale and rotation. ##
+# isTranslate # Returns if transform is limited to translate. ##
# mapHomogeneousPoints # ##
# mapPoints # ##
# mapPointsWithStride # ##
diff --git a/docs/SkPath_Reference.bmh b/docs/SkPath_Reference.bmh
index 8eb00777b7..e38b30da77 100644
--- a/docs/SkPath_Reference.bmh
+++ b/docs/SkPath_Reference.bmh
@@ -1025,7 +1025,7 @@ canvas->drawPath(path, paint);
#Enum Convexity
#Code
- enum Convexity {
+ enum Convexity : uint8_t {
kUnknown_Convexity,
kConvex_Convexity,
kConcave_Convexity,
diff --git a/docs/SkRect_Reference.bmh b/docs/SkRect_Reference.bmh
index 57f3ec6b98..7dc1e3776a 100644
--- a/docs/SkRect_Reference.bmh
+++ b/docs/SkRect_Reference.bmh
@@ -28,10 +28,10 @@ integer input cannot convert to SkScalar without loss of precision.
#Subtopic Operators
#Table
#Legend
-# description # function ##
+# description # function ##
#Legend ##
-# friend bool operator!=(const SkRect& a, const SkRect& b) # Returns true if member bits are unequal. ##
-# friend bool operator==(const SkRect& a, const SkRect& b) # Returns true if member bits are equal. ##
+# bool operator!=(const SkRect& a, const SkRect& b) # Returns true if member bits are unequal. ##
+# bool operator==(const SkRect& a, const SkRect& b) # Returns true if member bits are equal. ##
#Table ##
#Subtopic ##
@@ -47,6 +47,7 @@ integer input cannot convert to SkScalar without loss of precision.
# MakeIWH # Constructs from int input returning (0, 0, width, height). ##
# MakeLTRB # Constructs from SkScalar left, top, right, bottom. ##
# MakeLargest # Constructs (SK_ScalarMin, SK_ScalarMin, SK_ScalarMax, SK_ScalarMax). ##
+# MakeLargestS32 # Constructs largest signed integers that fit in 32-bit float. ##
# MakeSize # Constructs from Size returning (0, 0, width, height). ##
# MakeWH # Constructs from SkScalar input returning (0, 0, width, height). ##
# MakeXYWH # Constructs from SkScalar input returning (x, y, width, height). ##
@@ -184,13 +185,42 @@ outset a little more isFinite: false
##
##
-#SeeAlso isLargest setLargest SkIRect::MakeLargest
+#SeeAlso MakeLargestS32 isLargest setLargest SkIRect::MakeLargest
##
# ------------------------------------------------------------------------------
-#Method static SkRect SK_WARN_UNUSED_RESULT MakeWH(SkScalar w, SkScalar h)
+#Method static SkRect SK_WARN_UNUSED_RESULT MakeLargestS32()
+
+Returns constructed Rect that can be represented exactly with IRect. The left
+and top are set to the most negative integer value that fits in a 32-bit float,
+and the right and bottom are set to the most positive finite value that fits in
+a 32-bit float.
+
+These are the largest values for which round() is well defined.
+
+#Return bounds (SK_MinS32FitsInFloat, SK_MinS32FitsInFloat,
+ SK_MaxS32FitsInFloat, SK_MaxS32FitsInFloat)
+##
+
+#Example
+ SkRect f_rect = SkRect::MakeLargestS32();
+ SkIRect i_rect = f_rect.round();
+ SkRect r_rect = SkRect::Make(i_rect);
+ SkDebugf("f_rect %c= r_rect\n", f_rect == r_rect ? '=' : '!');
+#StdOut
+f_rect == r_rect
+##
+##
+
+#SeeAlso MakeLargest isLargest setLargest SkIRect::MakeLargest
+
+##
+
+# ------------------------------------------------------------------------------
+
+#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeWH(SkScalar w, SkScalar h)
Returns constructed Rect set to SkScalar values (0, 0, w, h). Does not
validate input; w or h may be negative.
@@ -253,7 +283,7 @@ i_rect width: 125000111 f_rect width:125000112
# ------------------------------------------------------------------------------
-#Method static SkRect SK_WARN_UNUSED_RESULT MakeSize(const SkSize& size)
+#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeSize(const SkSize& size)
Returns constructed Rect set to (0, 0, size.width(), size.height()). Does not
validate input; size.width() or size.height() may be negative.
@@ -313,7 +343,7 @@ rect: 5, 25, 15, 35 isEmpty: false
# ------------------------------------------------------------------------------
-#Method static SkRect SK_WARN_UNUSED_RESULT MakeXYWH(SkScalar x, SkScalar y, SkScalar w, SkScalar h)
+#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeXYWH(SkScalar x, SkScalar y, SkScalar w, SkScalar h)
Returns constructed Rect set to
#Formula
@@ -327,7 +357,7 @@ w or h may be negative.
#Param w added to x and stored in fRight ##
#Param h added to y and stored in fBottom ##
-#Return bounds (x, y, x + w, y + h) ##
+#Return bounds at (x, y) with width w and height h ##
#Example
SkRect rect = SkRect::MakeXYWH(5, 35, -15, 25);
@@ -784,7 +814,7 @@ left: 2e+38 right: 3e+38 centerX: inf safe mid x: 2.5e+38
# ------------------------------------------------------------------------------
-#Method friend bool operator==(const SkRect& a, const SkRect& b)
+#Method bool operator==(const SkRect& a, const SkRect& b)
Returns true if all members in a: fLeft, fTop, fRight, and fBottom; are
equal to the corresponding members in b.
@@ -827,7 +857,7 @@ tests are equal
# ------------------------------------------------------------------------------
-#Method friend bool operator!=(const SkRect& a, const SkRect& b)
+#Method bool operator!=(const SkRect& a, const SkRect& b)
Returns true if any in a: fLeft, fTop, fRight, and fBottom; does not
equal the corresponding members in b.
@@ -1962,7 +1992,7 @@ rect: 30, 50, 40, 60
# ------------------------------------------------------------------------------
-#Method bool contains(const SkRect& r) const {
+#Method bool contains(const SkRect& r) const
Returns true if Rect contains r.
Returns false if Rect is empty or r is empty.
diff --git a/docs/undocumented.bmh b/docs/undocumented.bmh
index d6a77b9743..0239034eec 100644
--- a/docs/undocumented.bmh
+++ b/docs/undocumented.bmh
@@ -443,6 +443,12 @@ FT_Load_Glyph
#Typedef SkScalar
#Typedef ##
##
+ #Const SK_MinS32FitsInFloat
+ to be written
+ ##
+ #Const SK_MaxS32FitsInFloat
+ to be written
+ ##
#Const SK_ScalarMin
to be written
##
diff --git a/site/user/api/SkBitmap_Reference.md b/site/user/api/SkBitmap_Reference.md
index 076cebac50..abff9ffbb1 100644
--- a/site/user/api/SkBitmap_Reference.md
+++ b/site/user/api/SkBitmap_Reference.md
@@ -211,6 +211,7 @@ true if pixels are allocated
#### Example Output
~~~~
+#Volatile
pixel address = (nil)
pixel address = 0x560ddd0ac670
~~~~
diff --git a/site/user/api/SkCanvas_Reference.md b/site/user/api/SkCanvas_Reference.md
index 1c5d804692..8d39ac47ed 100644
--- a/site/user/api/SkCanvas_Reference.md
+++ b/site/user/api/SkCanvas_Reference.md
@@ -5245,3 +5245,77 @@ clip is not rect
---
+# Class SkAutoCanvasRestore
+Stack helper class calls
+
+
+## SkAutoCanvasRestore
+
+
+SkAutoCanvasRestore(SkCanvas* canvas, bool doSave)
+
+
+Preserves Canvas save count. Optionally saves Canvas Clip and Matrix.
+
+### Parameters
+
+
+
+### Return Value
+
+utility to restore Canvas state on destructor
+
+### Example
+
+
+
+### See Also
+
+SkCanvas::save SkCanvas::restore
+
+---
+
+
+## ~SkAutoCanvasRestore
+
+
+~SkAutoCanvasRestore()
+
+
+Restores Canvas to saved state.
+
+### Example
+
+
+
+### See Also
+
+SkCanvas::save SkCanvas::restore
+
+---
+
+
+## restore
+
+
+void restore()
+
+
+Restores Canvas to saved state immediately. Subsequent calls and class
+destructor have no effect.
+
+### Example
+
+
+
+### See Also
+
+SkCanvas::save SkCanvas::restore
+
+---
+
diff --git a/site/user/api/SkIRect_Reference.md b/site/user/api/SkIRect_Reference.md
index c7c643103b..1982c5094d 100644
--- a/site/user/api/SkIRect_Reference.md
+++ b/site/user/api/SkIRect_Reference.md
@@ -21,8 +21,8 @@ its top, it is considered empty.
| description | function |
| --- | --- |
-| friend bool operator!=(const SkIRect& a, const SkIRect& b) | Returns true if members are unequal. |
-| friend bool operator==(const SkIRect& a, const SkIRect& b) | Returns true if members are equal. |
+| bool operator!=(const SkIRect& a, const SkIRect& b) | Returns true if members are unequal. |
+| bool operator==(const SkIRect& a, const SkIRect& b) | Returns true if members are equal. |
## Member Functions
@@ -97,7 +97,7 @@ When equal to or less than fTop, IR
## MakeEmpty
-static SkIRect SK_WARN_UNUSED_RESULT MakeEmpty()
+static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeEmpty()
Returns constructed IRect set to (0, 0, 0, 0).
@@ -169,7 +169,7 @@ outset isEmpty: true
## MakeWH
-static SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t h)
+static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t h)
Returns constructed IRect set to (0, 0, w, h). Does not validate input; w or h
@@ -210,7 +210,7 @@ all equal
## MakeSize
-static SkIRect SK_WARN_UNUSED_RESULT MakeSize(const SkISize& size)
+static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeSize(const SkISize& size)
Returns constructed IRect set to (0, 0, size.width, size.height).
@@ -250,8 +250,8 @@ floor width: 25 height: 35
## MakeLTRB
-static SkIRect SK_WARN_UNUSED_RESULT MakeLTRB(int32_t l, int32_t t, int32_t r,
- int32_t b)
+static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeLTRB(int32_t l, int32_t t,
+ int32_t r, int32_t b)
Returns constructed IRect set to (l, t, r, b). Does not sort input; Rect may
@@ -297,8 +297,8 @@ rect: 5, 25, 15, 35 isEmpty: false
## MakeXYWH
-static SkIRect SK_WARN_UNUSED_RESULT MakeXYWH(int32_t x, int32_t y, int32_t w,
- int32_t h)
+static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeXYWH(int32_t x, int32_t y,
+ int32_t w, int32_t h)
Returns constructed IRect set to(x, y, x + w, y + h).
@@ -320,7 +320,7 @@ added to y and stored in fBo
### Return Value
-bounds (x, y, x + w, y + h)
+bounds at (x, y) with width w and height h
### Example
@@ -783,7 +783,7 @@ large is empty: false
## operator==
-friend bool operator==(const SkIRect& a, const SkIRect& b)
+bool operator==(const SkIRect& a, const SkIRect& b)
Returns true if all members in a: fLeft, fTop, fRight, and fBottom; are
@@ -824,7 +824,7 @@ test == sorted
## operator!=
-friend bool operator!=(const SkIRect& a, const SkIRect& b)
+bool operator!=(const SkIRect& a, const SkIRect& b)
Returns true if any member in a: fLeft, fTop, fRight, and fBottom; is not
@@ -1019,9 +1019,9 @@ rect2: {3, 4, 1, 2}
void setXYWH(int32_t x, int32_t y, int32_t width, int32_t height)
-Sets IRect to(x, y, x + w, y + h).
+Sets IRect to(x, y, x + width, y + height).
Does not validate input;
-w or h may be negative.
+width or height may be negative.
### Parameters
@@ -1174,7 +1174,7 @@ If dy is positive, IRectRect inset symetrically left and right, top and bottom
+Rect inset symmetrically left and right, top and bottom
### Example
@@ -1220,7 +1220,7 @@ If dy is positive, IRect
### Return Value
-Rect outset symetrically left and right, top and bottom
+Rect outset symmetrically left and right, top and bottom
### Example
diff --git a/site/user/api/SkPath_Reference.md b/site/user/api/SkPath_Reference.md
index 791dc17213..bb3634e373 100644
--- a/site/user/api/SkPath_Reference.md
+++ b/site/user/api/SkPath_Reference.md
@@ -843,7 +843,7 @@ unmodified by the original FillType.
## Enum SkPath::Convexity
-enum Convexity {
+enum Convexity : uint8_t {
kUnknown Convexity,
kConvex Convexity,
kConcave Convexity,
diff --git a/site/user/api/SkRect_Reference.md b/site/user/api/SkRect_Reference.md
index e067bf379c..4dd16b897e 100644
--- a/site/user/api/SkRect_Reference.md
+++ b/site/user/api/SkRect_Reference.md
@@ -24,8 +24,8 @@ integer input cannot convert to SkScalar wit
| description | function |
| --- | --- |
-| friend bool operator!=(const SkRect& a, const SkRect& b) | Returns true if member bits are unequal. |
-| friend bool operator==(const SkRect& a, const SkRect& b) | Returns true if member bits are equal. |
+| bool operator!=(const SkRect& a, const SkRect& b) | Returns true if member bits are unequal. |
+| bool operator==(const SkRect& a, const SkRect& b) | Returns true if member bits are equal. |
## Member Functions
@@ -38,6 +38,7 @@ integer input cannot convert to SkScalar wit
| MakeIWH | Constructs from int input returning (0, 0, width, height). |
| MakeLTRB | Constructs from SkScalar left, top, right, bottom. |
| MakeLargest | Constructs (SK ScalarMin, SK ScalarMin, SK ScalarMax, SK ScalarMax). |
+| MakeLargestS32 | Constructs largest signed integers that fit in 32-bit float. |
| MakeSize | Constructs from Size returning (0, 0, width, height). |
| MakeWH | Constructs from SkScalar input returning (0, 0, width, height). |
| MakeXYWH | Constructs from SkScalar input returning (x, y, width, height). |
@@ -180,7 +181,44 @@ outset a little more isFinite: false
### See Also
-isLargest setLargest SkIRect::MakeLargest
+MakeLargestS32 isLargest setLargest SkIRect::MakeLargest
+
+---
+
+
+## MakeLargestS32
+
+
+static SkRect SK_WARN_UNUSED_RESULT MakeLargestS32()
+
+
+Returns constructed Rect that can be represented exactly with IRect. The left
+and top are set to the most negative integer value that fits in a 32-bit float,
+and the right and bottom are set to the most positive finite value that fits in
+a 32-bit float.
+
+These are the largest values for which round is well defined.
+
+### Return Value
+
+bounds (SK MinS32FitsInFloat, SK MinS32FitsInFloat,
+SK MaxS32FitsInFloat, SK MaxS32FitsInFloat)
+
+### Example
+
+
+
+#### Example Output
+
+~~~~
+f_rect == r_rect
+~~~~
+
+
+
+### See Also
+
+MakeLargest isLargest setLargest SkIRect::MakeLargest
---
@@ -188,7 +226,7 @@ outset a little more isFinite: false
## MakeWH
-static SkRect SK_WARN_UNUSED_RESULT MakeWH(SkScalar w, SkScalar h)
+static constexpr SkRect SK_WARN_UNUSED_RESULT MakeWH(SkScalar w, SkScalar h)
Returns constructed Rect set to SkScalar values (0, 0, w, h). Does not
@@ -277,7 +315,7 @@ i_rect width: 125000111 f_rect width:125000112
## MakeSize
-static SkRect SK_WARN_UNUSED_RESULT MakeSize(const SkSize& size)
+static constexpr SkRect SK_WARN_UNUSED_RESULT MakeSize(const SkSize& size)
Returns constructed Rect set to (0, 0, size.width, size.height). Does not
@@ -364,8 +402,8 @@ rect: 5, 25, 15, 35 isEmpty: false
## MakeXYWH
-static SkRect SK_WARN_UNUSED_RESULT MakeXYWH(SkScalar x, SkScalar y, SkScalar w,
- SkScalar h)
+static constexpr SkRect SK_WARN_UNUSED_RESULT MakeXYWH(SkScalar x, SkScalar y,
+ SkScalar w, SkScalar h)
Returns constructed Rect set to(x, y, x + w, y + h).
@@ -387,7 +425,7 @@ added to y and stored in fBott
### Return Value
-bounds (x, y, x + w, y + h)
+bounds at (x, y) with width w and height h
### Example
@@ -978,7 +1016,7 @@ left: 2e+38 right: 3e+38 centerX: inf safe mid x: 2.5e+38
## operator==
-friend bool operator==(const SkRect& a, const SkRect& b)
+bool operator==(const SkRect& a, const SkRect& b)
Returns true if all members in a: fLeft, fTop, fRight, and fBottom; are
@@ -1025,7 +1063,7 @@ tests are equal
## operator!=
-friend bool operator!=(const SkRect& a, const SkRect& b)
+bool operator!=(const SkRect& a, const SkRect& b)
Returns true if any in a: fLeft, fTop, fRight, and fBottom; does not
@@ -1502,9 +1540,9 @@ corner to include
void setXYWH(SkScalar x, SkScalar y, SkScalar width, SkScalar height)
-Sets Rect to(x, y, x + w, y + h).
+Sets Rect to(x, y, x + width, y + height).
Does not validate input;
-w or h may be negative.
+width or height may be negative.
### Parameters
@@ -1545,8 +1583,8 @@ rect: -10, 35, 5, 60 isEmpty: false
void setWH(SkScalar width, SkScalar height)
-Sets Rect to (0, 0, w, h). Does not validate input;
-w or h may be negative.
+Sets Rect to (0, 0, width, height). Does not validate input;
+width or height may be negative.
### Parameters
@@ -1711,7 +1749,7 @@ added to fTop and subtracted from Rect inset symetrically left and right, top and bottom
+Rect inset symmetrically left and right, top and bottom
### Example
@@ -1757,7 +1795,7 @@ subtracted to fTop and added from Rect outset symetrically left and right, top and bottom
+Rect outset symmetrically left and right, top and bottom
### Example
@@ -2330,7 +2368,7 @@ void joinNonEmptyArg(const SkRect& r)
Sets Rect to the union of itself and r.
Asserts if r is empty and SK DEBUG is defined.
-If Rect is empty, sets rect to r.
+If Rect is empty, sets Rect to r.
May produce incorrect results if r is empty.
@@ -2343,7 +2381,7 @@ expansion Rect
### Example
-Since rect is not sorted, first result is copy of toJoin.
+Since
Rect is not sorted, first result is copy of toJoin.
#### Example Output
@@ -2380,7 +2418,7 @@ expansion Rect
### Example
-Since rect is not sorted, first result is not useful.
+Since
Rect is not sorted, first result is not useful.
#### Example Output
@@ -2521,7 +2559,7 @@ rect: 30, 50, 40, 60
## contains
-bool contains(const SkRect& r) const {
+bool contains(const SkRect& r) const
Returns true if Rect contains r.
diff --git a/site/user/api/undocumented.md b/site/user/api/undocumented.md
index 721283cdd1..cd6cb5fbd1 100644
--- a/site/user/api/undocumented.md
+++ b/site/user/api/undocumented.md
@@ -736,6 +736,12 @@ template <typename D, typename S> inline bool SkTFitsIn(S s)
### Constants
+
+ SK_MinS32FitsInFloat | to be written | |
+
+
+ SK_MaxS32FitsInFloat | to be written | |
+
SK_ScalarMin | to be written | |
diff --git a/tools/bookmaker/bookmaker.cpp b/tools/bookmaker/bookmaker.cpp
index 33feda5a35..cc454982fd 100644
--- a/tools/bookmaker/bookmaker.cpp
+++ b/tools/bookmaker/bookmaker.cpp
@@ -21,7 +21,7 @@ DEFINE_string2(ref, r, "", "Resolve refs and write bmh_*.md files to path. (Requ
DEFINE_string2(spellcheck, s, "", "Spell-check [once, all, mispelling]. (Requires -b)");
DEFINE_string2(tokens, t, "", "Directory to write bmh from include. (Requires -i)");
DEFINE_bool2(crosscheck, x, false, "Check bmh against includes. (Requires -b -i)");
-DEFINE_bool2(skip, z, false, "Skip missing example error.");
+DEFINE_bool2(skip, z, false, "Skip degenerate missed in legacy preprocessor.");
/* recipe for generating timestamps for existing doxygen comments
find include/core -type f -name '*.h' -print -exec git blame {} \; > ~/all.blame.txt
@@ -390,9 +390,6 @@ bool Definition::checkMethod() const {
string paramName;
methodParser.fChar = nextEnd + 1;
methodParser.skipSpace();
- if (1494 == methodParser.fLineCount) {
- SkDebugf("");
- }
if (!this->nextMethodParam(&methodParser, &nextEnd, ¶mName)) {
continue;
}
@@ -823,11 +820,12 @@ bool RootDefinition::dumpUnVisited() {
for (auto& leaf : fLeaves) {
if (!leaf.second.fVisited) {
// TODO: parse embedded struct in includeParser phase, then remove this condition
- size_t firstColon = leaf.first.find("::");
- size_t lastColon = leaf.first.rfind("::");
- if (firstColon != lastColon) { // struct, two sets
- allStructElementsFound = false;
- continue;
+ if (FLAGS_skip) {
+ const Definition& def = leaf.second;
+ if (def.fChildren.size() > 0 &&
+ MarkType::kDeprecated == def.fChildren[0]->fMarkType) {
+ continue;
+ }
}
SkDebugf("defined in bmh but missing in include: %s\n", leaf.first.c_str());
}
@@ -1120,9 +1118,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
if (definition->fChildren.size() == 0) {
TextParser emptyCheck(definition);
if (emptyCheck.eof() || !emptyCheck.skipWhiteSpace()) {
- if (!FLAGS_skip) {
- return this->reportError("missing example body");
- }
+ return this->reportError("missing example body");
}
}
}
diff --git a/tools/bookmaker/bookmaker.h b/tools/bookmaker/bookmaker.h
index 3954c6eaad..857caf4c10 100644
--- a/tools/bookmaker/bookmaker.h
+++ b/tools/bookmaker/bookmaker.h
@@ -1099,9 +1099,6 @@ public:
}
writePending();
if (fDebugOut) {
- if (!strncmp("SK_SUPPORT", data, 10)) {
- SkDebugf("");
- }
string check(data, size);
SkDebugf("%s", check.c_str());
}
@@ -1874,7 +1871,7 @@ public:
Definition* structMemberOut(const Definition* memberStart, const Definition& child);
void structOut(const Definition* root, const Definition& child,
const char* commentStart, const char* commentEnd);
- void structSizeMembers(Definition& child);
+ void structSizeMembers(const Definition& child);
private:
BmhParser* fBmhParser;
diff --git a/tools/bookmaker/includeParser.cpp b/tools/bookmaker/includeParser.cpp
index 1e055db17f..4ad83d8aa7 100644
--- a/tools/bookmaker/includeParser.cpp
+++ b/tools/bookmaker/includeParser.cpp
@@ -199,16 +199,48 @@ string IncludeParser::className() const {
return result;
}
+#include
+#include
+
bool IncludeParser::crossCheck(BmhParser& bmhParser) {
- string className = this->className();
- string classPrefix = className + "::";
- RootDefinition* root = &bmhParser.fClassMap[className];
- root->clearVisited();
for (auto& classMapper : fIClassMap) {
- if (className != classMapper.first
- && classPrefix != classMapper.first.substr(0, classPrefix.length())) {
+ string className = classMapper.first;
+ auto finder = bmhParser.fClassMap.find(className);
+ if (bmhParser.fClassMap.end() == finder) {
+ SkASSERT(string::npos != className.find("::"));
continue;
}
+ RootDefinition* root = &finder->second;
+ root->clearVisited();
+ }
+ for (auto& classMapper : fIClassMap) {
+ string className = classMapper.first;
+ std::istringstream iss(className);
+ string classStr;
+ string classBase;
+ RootDefinition* root = nullptr;
+ while (std::getline(iss, classStr, ':')) {
+ if (root) {
+ if (!classStr.length()) {
+ continue;
+ }
+ classBase += "::" + classStr;
+ auto finder = root->fBranches.find(classBase);
+ if (root->fBranches.end() != finder) {
+ root = finder->second;
+ } else {
+ SkASSERT(0);
+ }
+ } else {
+ classBase = classStr;
+ auto finder = bmhParser.fClassMap.find(classBase);
+ if (bmhParser.fClassMap.end() != finder) {
+ root = &finder->second;
+ } else {
+ SkASSERT(0);
+ }
+ }
+ }
auto& classMap = classMapper.second;
auto& tokens = classMap.fTokens;
for (const auto& token : tokens) {
@@ -399,10 +431,18 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
}
}
}
- if (!root->dumpUnVisited()) {
- SkDebugf("some struct elements not found; struct finding in includeParser is missing\n");
+ for (auto& classMapper : fIClassMap) {
+ string className = classMapper.first;
+ auto finder = bmhParser.fClassMap.find(className);
+ if (bmhParser.fClassMap.end() == finder) {
+ continue;
+ }
+ RootDefinition* root = &finder->second;
+ if (!root->dumpUnVisited()) {
+ SkDebugf("some struct elements not found; struct finding in includeParser is missing\n");
+ }
+ SkDebugf("cross-checked %s\n", className.c_str());
}
- SkDebugf("cross-checked %s\n", className.c_str());
bmhParser.fWroteOut = true;
return true;
}
@@ -1044,32 +1084,45 @@ bool IncludeParser::parseClass(Definition* includeDef, IsStruct isStruct) {
(*childIter)->fPrivate = true;
childIter = std::next(childIter);
}
- int lastPublic = publicIndex;
+ int keyIndex = publicIndex;
+ KeyWord currentKey = KeyWord::kPublic;
+ const char* publicName = kKeyWords[(int) KeyWord::kPublic].fName;
+ size_t publicLen = strlen(publicName);
const char* protectedName = kKeyWords[(int) KeyWord::kProtected].fName;
size_t protectedLen = strlen(protectedName);
const char* privateName = kKeyWords[(int) KeyWord::kPrivate].fName;
size_t privateLen = strlen(privateName);
- while (iter != includeDef->fTokens.end()
- && (protectedLen != (size_t) (iter->fContentEnd - iter->fStart)
- || strncmp(iter->fStart, protectedName, protectedLen))
- && (privateLen != (size_t) (iter->fContentEnd - iter->fStart)
- || strncmp(iter->fStart, privateName, privateLen))) {
- iter = std::next(iter);
- ++lastPublic;
- }
- fLastObject = nullptr;
- while (childIter != includeDef->fChildren.end() && (*childIter)->fParentIndex < lastPublic) {
+ while (childIter != includeDef->fChildren.end()) {
Definition* child = *childIter;
- if (!this->parseObject(child, markupDef)) {
- return false;
+ while (child->fParentIndex > keyIndex && iter != includeDef->fTokens.end()) {
+ const char* testStart = iter->fStart;
+ size_t testLen = (size_t) (iter->fContentEnd - testStart);
+ iter = std::next(iter);
+ ++keyIndex;
+ if (publicLen == testLen && !strncmp(testStart, publicName, testLen)) {
+ currentKey = KeyWord::kPublic;
+ break;
+ }
+ if (protectedLen == testLen && !strncmp(testStart, protectedName, testLen)) {
+ currentKey = KeyWord::kProtected;
+ break;
+ }
+ if (privateLen == testLen && !strncmp(testStart, privateName, testLen)) {
+ currentKey = KeyWord::kPrivate;
+ break;
+ }
+ }
+ fLastObject = nullptr;
+ if (KeyWord::kPublic == currentKey) {
+ if (!this->parseObject(child, markupDef)) {
+ return false;
+ }
+ } else {
+ child->fPrivate = true;
}
fLastObject = child;
childIter = std::next(childIter);
}
- while (childIter != includeDef->fChildren.end()) {
- (*childIter)->fPrivate = true;
- childIter = std::next(childIter);
- }
SkASSERT(fParent->fParent);
fParent = fParent->fParent;
return true;
@@ -1242,6 +1295,23 @@ bool IncludeParser::parseEnum(Definition* child, Definition* markupDef) {
}
markupChild->fChildren.push_back(member);
} while (true);
+ for (auto count : child->fChildren) {
+ if (Definition::Type::kBracket == count->fType) {
+ continue;
+ }
+ SkASSERT(Definition::Type::kKeyWord == count->fType);
+ if (KeyWord::kClass == count->fKeyWord) {
+ continue;
+ }
+ SkASSERT(KeyWord::kStatic == count->fKeyWord);
+ markupChild->fTokens.emplace_back(MarkType::kMember, count->fContentStart,
+ count->fContentEnd, count->fLineCount, markupChild);
+ Definition* member = &markupChild->fTokens.back();
+ member->fName = count->fName;
+ // FIXME: ? add comment as well ?
+ markupChild->fChildren.push_back(member);
+ break;
+ }
IClassDefinition& classDef = fIClassMap[markupDef->fName];
SkASSERT(classDef.fStart);
string uniqueName = this->uniqueName(classDef.fEnums, nameStr);
@@ -1320,9 +1390,6 @@ bool IncludeParser::parseMethod(Definition* child, Definition* markupDef) {
std::advance(tokenIter, child->fParentIndex);
tokenIter = std::prev(tokenIter);
string nameStr(tokenIter->fStart, tokenIter->fContentEnd - tokenIter->fStart);
- if (0 == nameStr.find("SK_ATTR_DEPRECATED")) {
- SkDebugf("");
- }
while (tokenIter != child->fParent->fTokens.begin()) {
auto testIter = std::prev(tokenIter);
switch (testIter->fType) {
@@ -1355,9 +1422,14 @@ bool IncludeParser::parseMethod(Definition* child, Definition* markupDef) {
}
tokenIter->fName = nameStr;
tokenIter->fMarkType = MarkType::kMethod;
+ tokenIter->fPrivate = string::npos != nameStr.find("::");
auto testIter = child->fParent->fTokens.begin();
SkASSERT(child->fParentIndex > 0);
std::advance(testIter, child->fParentIndex - 1);
+ if (tokenIter->fParent && KeyWord::kIfdef == tokenIter->fParent->fKeyWord &&
+ 0 == tokenIter->fParentIndex) {
+ tokenIter = std::next(tokenIter);
+ }
const char* start = tokenIter->fContentStart;
const char* end = tokenIter->fContentEnd;
const char kDebugCodeStr[] = "SkDEBUGCODE";
diff --git a/tools/bookmaker/includeWriter.cpp b/tools/bookmaker/includeWriter.cpp
index 38213618c5..ff7c0e3c56 100644
--- a/tools/bookmaker/includeWriter.cpp
+++ b/tools/bookmaker/includeWriter.cpp
@@ -673,7 +673,7 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const
return valueEnd;
}
-void IncludeWriter::structSizeMembers(Definition& child) {
+void IncludeWriter::structSizeMembers(const Definition& child) {
int longestType = 0;
Definition* typeStart = nullptr;
int longestName = 0;
@@ -815,6 +815,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
fContinuation = nullptr;
bool inStruct = false;
bool inConstructor = false;
+ bool inInline = false;
for (auto& child : def->fTokens) {
if (memberEnd) {
if (memberEnd != &child) {
@@ -824,8 +825,34 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
memberEnd = nullptr;
}
if (child.fPrivate) {
+ if (MarkType::kMethod == child.fMarkType) {
+ inInline = true;
+ }
continue;
}
+ if (inInline) {
+ if (Definition::Type::kKeyWord == child.fType) {
+ SkASSERT(MarkType::kMethod != child.fMarkType);
+ continue;
+ }
+ if (Definition::Type::kPunctuation == child.fType) {
+ if (Punctuation::kLeftBrace == child.fPunctuation) {
+ inInline = false;
+ } else {
+ SkASSERT(Punctuation::kAsterisk == child.fPunctuation);
+ }
+ continue;
+ }
+ if (Definition::Type::kWord == child.fType) {
+ string name(child.fContentStart, child.fContentEnd - child.fContentStart);
+ SkASSERT(string::npos != name.find("::"));
+ continue;
+ }
+ if (Definition::Type::kBracket == child.fType) {
+ SkASSERT(Bracket::kParen == child.fBracket);
+ continue;
+ }
+ }
if (fContinuation) {
if (Definition::Type::kKeyWord == child.fType) {
if (KeyWord::kFriend == child.fKeyWord ||
@@ -1131,6 +1158,16 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
if (Definition::Type::kWord == child.fType) {
if (MarkType::kMember == child.fMarkType) {
+ if (!memberStart) {
+ auto iter = def->fTokens.begin();
+ std::advance(iter, child.fParentIndex - 1);
+ memberStart = &*iter;
+ if (!fStructDef) {
+ SkASSERT(KeyWord::kStruct == def->fParent->fKeyWord);
+ fStructDef = def->fParent;
+ this->structSizeMembers(*fStructDef);
+ }
+ }
memberEnd = this->structMemberOut(memberStart, child);
fStart = child.fContentEnd + 1;
fDeferComment = nullptr;
diff --git a/tools/bookmaker/spellCheck.cpp b/tools/bookmaker/spellCheck.cpp
index b2091640d0..3a32f37bc4 100644
--- a/tools/bookmaker/spellCheck.cpp
+++ b/tools/bookmaker/spellCheck.cpp
@@ -595,7 +595,6 @@ void SpellCheck::wordCheck(const string& str) {
sawSpecial = true;
continue;
}
- SkDebugf("");
SkASSERT(0);
}
if (sawSpecial && !hasParen) {