| #Topic RRect | |
| #Alias Round_Rect ## | |
| #Alias RRect_Reference ## | |
| #Class SkRRect | |
| #Code | |
| class SkRRect { | |
| public: | |
| SkRRect() = default; | |
| SkRRect(const SkRRect& rrect) = default; | |
| SkRRect& operator=(const SkRRect& rrect) = default; | |
| enum Type { | |
| kEmpty_Type, | |
| kRect_Type, | |
| kOval_Type, | |
| kSimple_Type, | |
| kNinePatch_Type, | |
| kComplex_Type, | |
| kLastType = kComplex_Type, | |
| }; | |
| Type getType() const; | |
| Type type() const; | |
| bool isEmpty() const; | |
| bool isRect() const; | |
| bool isOval() const; | |
| bool isSimple() const; | |
| bool isNinePatch() const; | |
| bool isComplex() const; | |
| SkScalar width() const; | |
| SkScalar height() const; | |
| SkVector getSimpleRadii() const; | |
| void setEmpty(); | |
| void setRect(const SkRect& rect); | |
| static SkRRect MakeEmpty(); | |
| static SkRRect MakeRect(const SkRect& r); | |
| static SkRRect MakeOval(const SkRect& oval); | |
| static SkRRect MakeRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad); | |
| void setOval(const SkRect& oval); | |
| void setRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad); | |
| void setNinePatch(const SkRect& rect, SkScalar leftRad, SkScalar topRad, | |
| SkScalar rightRad, SkScalar bottomRad); | |
| void setRectRadii(const SkRect& rect, const SkVector radii[4]); | |
| enum Corner { | |
| kUpperLeft_Corner, | |
| kUpperRight_Corner, | |
| kLowerRight_Corner, | |
| kLowerLeft_Corner, | |
| }; | |
| const SkRect& rect() const; | |
| SkVector radii(Corner corner) const; | |
| const SkRect& getBounds() const; | |
| friend bool operator==(const SkRRect& a, const SkRRect& b); | |
| friend bool operator!=(const SkRRect& a, const SkRRect& b); | |
| void inset(SkScalar dx, SkScalar dy, SkRRect* dst) const; | |
| void inset(SkScalar dx, SkScalar dy); | |
| void outset(SkScalar dx, SkScalar dy, SkRRect* dst) const; | |
| void outset(SkScalar dx, SkScalar dy); | |
| void offset(SkScalar dx, SkScalar dy); | |
| SkRRect makeOffset(SkScalar dx, SkScalar dy) const; | |
| bool contains(const SkRect& rect) const; | |
| bool isValid() const; | |
| static constexpr size_t kSizeInMemory = 12 * sizeof(SkScalar); | |
| size_t writeToMemory(void* buffer) const; | |
| size_t readFromMemory(const void* buffer, size_t length); | |
| bool transform(const SkMatrix& matrix, SkRRect* dst) const; | |
| void dump(bool asHex) const; | |
| void dump() const; | |
| void dumpHex() const; | |
| }; | |
| ## | |
| SkRRect describes a rounded rectangle with a bounds and a pair of radii for each corner. | |
| The bounds and radii can be set so that SkRRect describes: a rectangle with sharp corners; | |
| a Circle; an Oval; or a rectangle with one or more rounded corners. | |
| SkRRect allows implementing CSS properties that describe rounded corners. | |
| SkRRect may have up to eight different radii, one for each axis on each of its four | |
| corners. | |
| SkRRect may modify the provided parameters when initializing bounds and radii. | |
| If either axis radii is zero or less: radii are stored as zero; corner is square. | |
| If corner curves overlap, radii are proportionally reduced to fit within bounds. | |
| # ------------------------------------------------------------------------------ | |
| #Method SkRRect() | |
| #In Constructors | |
| #Line # creates with zeroed bounds and corner radii ## | |
| #Populate | |
| #Example | |
| #Height 60 | |
| SkRRect rrect; | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| canvas->drawRRect(rrect, p); | |
| rrect.setRect({10, 10, 100, 50}); | |
| canvas->drawRRect(rrect, p); | |
| ## | |
| #SeeAlso setEmpty isEmpty | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkRRect(const SkRRect& rrect) | |
| #In Constructors | |
| #Line # copies bounds and corner radii ## | |
| #Populate | |
| #Example | |
| #Height 60 | |
| SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50}); | |
| SkRRect rrect2(rrect); | |
| rrect2.inset(20, 20); | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| canvas->drawRRect(rrect, p); | |
| canvas->drawRRect(rrect2, p); | |
| ## | |
| #SeeAlso operator=(const SkRRect& rrect) MakeRect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkRRect& operator=(const SkRRect& rrect) | |
| #In Operators | |
| #Line # copies bounds and corner radii ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkRRect rrect = SkRRect::MakeRect({40, 40, 100, 70}); | |
| SkRRect rrect2 = rrect; | |
| rrect2.inset(-20, -20); | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| canvas->drawRRect(rrect, p); | |
| canvas->drawRRect(rrect2, p); | |
| ## | |
| #SeeAlso SkRRect(const SkRRect& rrect) MakeRect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Subtopic Type | |
| #Line # specialization of Round_Rect geometry ## | |
| #PhraseDef list_of_rrect_types | |
| kEmpty_Type, kRect_Type, kOval_Type, kSimple_Type, kNinePatch_Type, | |
| kComplex_Type | |
| ## | |
| #Enum Type | |
| #Line # specialization of Round_Rect geometry ## | |
| #Code | |
| enum Type { | |
| kEmpty_Type, | |
| kRect_Type, | |
| kOval_Type, | |
| kSimple_Type, | |
| kNinePatch_Type, | |
| kComplex_Type, | |
| kLastType = kComplex_Type, | |
| }; | |
| ## | |
| Type describes possible specializations of Round_Rect. Each Type is | |
| exclusive; a Round_Rect may only have one type. | |
| Type members become progressively less restrictive; larger values of | |
| Type have more degrees of freedom than smaller values. | |
| #Const kEmpty_Type 0 | |
| #Line # zero width or height ## | |
| Round_Rect has zero width or height. All radii are zero. | |
| ## | |
| #Const kRect_Type 1 | |
| #Line # non-zero width and height, and zeroed radii ## | |
| Round_Rect has width and height. All radii are zero. | |
| ## | |
| #Const kOval_Type 2 | |
| #Line # non-zero width and height filled with radii ## | |
| Round_Rect has width and height. All four x-radii are equal, | |
| and at least half the width. All four y-radii are equal, | |
| and at least half the height. | |
| ## | |
| #Const kSimple_Type 3 | |
| #Line # non-zero width and height with equal radii ## | |
| Round_Rect has width and height. All four x-radii are equal and | |
| greater than zero, and all four y-radii are equal and greater than | |
| zero. Either x-radii are less than half the width, or y-radii is | |
| less than half the height, or both. | |
| ## | |
| #Const kNinePatch_Type 4 | |
| #Line # non-zero width and height with axis-aligned radii ## | |
| Round_Rect has width and height. Left x-radii are equal, top | |
| y-radii are equal, right x-radii are equal, and bottom y-radii | |
| are equal. The radii do not describe Rect, Oval, or simple type. | |
| The centers of the corner ellipses form an axis-aligned rectangle | |
| that divides the Round_Rect into nine rectangular patches; an | |
| interior rectangle, four edges, and four corners. | |
| ## | |
| #Const kComplex_Type 5 | |
| #Line # non-zero width and height with arbitrary radii ## | |
| both radii are non-zero. | |
| ## | |
| #Const kLastType 5 | |
| #Line # largest Type value ## | |
| ## | |
| #Example | |
| #Height 128 | |
| struct Radii { SkVector data[4]; }; | |
| auto drawRRectType = [=](const SkRect& rect, const Radii& radii) { | |
| SkRRect rrect; | |
| rrect.setRectRadii(rect, radii.data); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| const char* typeStr[] = { "empty", "rect", "oval", "simple", "nine patch", "complex" }; | |
| canvas->drawString(typeStr[(int) rrect.type()], rect.centerX(), rect.bottom() + 20, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| }; | |
| drawRRectType({ 45, 30, 45, 30}, {{{ 5, 5}, { 5, 5}, { 5, 5}, { 5, 5}}}); | |
| drawRRectType({ 90, 10, 140, 30}, {{{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}}}); | |
| drawRRectType({160, 10, 210, 30}, {{{25, 10}, {25, 10}, {25, 10}, {25, 10}}}); | |
| drawRRectType({ 20, 80, 70, 100}, {{{ 5, 5}, { 5, 5}, { 5, 5}, { 5, 5}}}); | |
| drawRRectType({ 90, 80, 140, 100}, {{{ 5, 5}, {10, 5}, {10, 5}, { 5, 5}}}); | |
| drawRRectType({160, 80, 210, 100}, {{{ 5, 5}, {10, 5}, { 5, 5}, { 5, 5}}}); | |
| ## | |
| #SeeAlso Rect Path | |
| #Enum ## | |
| # ------------------------------------------------------------------------------ | |
| #Method Type getType() const | |
| #In Property | |
| #Line # returns Type ## | |
| Returns Type, one of: #list_of_rrect_types#. | |
| #Return Type ## | |
| #Example | |
| #Height 100 | |
| #Description | |
| rrect2 is not a Rect; inset() has made it empty. | |
| ## | |
| SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50}); | |
| SkRRect rrect2(rrect); | |
| rrect2.inset(20, 20); | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| std::string str("Type "); | |
| str += SkRRect::kRect_Type == rrect2.getType() ? "=" : "!"; | |
| str += "= SkRRect::kRect_Type"; | |
| canvas->drawString(str.c_str(), 20, 80, SkPaint()); | |
| canvas->drawRRect(rrect2, p); | |
| ## | |
| #SeeAlso Type type | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method Type type() const | |
| #In Property | |
| #Line # returns Type ## | |
| Returns Type, one of: #list_of_rrect_types#. | |
| #Return Type ## | |
| #Example | |
| #Height 100 | |
| #Description | |
| inset() has made rrect2 empty. | |
| ## | |
| SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50}); | |
| SkRRect rrect2(rrect); | |
| rrect2.inset(20, 20); | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| std::string str("Type "); | |
| str += SkRRect::kEmpty_Type == rrect2.type() ? "=" : "!"; | |
| str += "= SkRRect::kEmpty_Type"; | |
| canvas->drawString(str.c_str(), 20, 80, SkPaint()); | |
| canvas->drawRRect(rrect2, p); | |
| ## | |
| #SeeAlso Type getType | |
| #Method ## | |
| #Subtopic Type ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isEmpty() const | |
| #In Property | |
| #Line # returns true if width or height are zero ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 10, 5); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isEmpty() ? "empty" : "not empty", 64, 90, paint); | |
| rrect.inset(40, 0); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isEmpty() ? "empty" : "not empty", 64, 90, paint); | |
| ## | |
| #SeeAlso SkRect::isEmpty height width | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isRect() const | |
| #In Property | |
| #Line # returns true if not empty, and one radius at each corner is zero ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60}); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isRect() ? "rect" : "not rect", 64, 90, paint); | |
| SkVector radii[] = {{10, 10}, {0, 0}, {0, 0}, {0, 0}}; | |
| rrect.setRectRadii(rrect.getBounds(), radii); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isRect() ? "rect" : "not rect", 64, 90, paint); | |
| ## | |
| #SeeAlso isEmpty radii | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isOval() const | |
| #In Property | |
| #Line # returns true if not empty, axes radii are equal, radii fill bounds ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| #Description | |
| The first radii are scaled down proportionately until both x-axis and y-axis fit | |
| within the bounds. After scaling, x-axis radius is smaller than half the width; | |
| left Round_Rect is not an oval. The second radii are equal to half the | |
| dimensions; right Round_Rect is an oval. | |
| ## | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 40, 30); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isOval() ? "oval" : "not oval", 64, 90, paint); | |
| rrect.setRectXY(rrect.getBounds(), 35, 25); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isOval() ? "oval" : "not oval", 64, 90, paint); | |
| ## | |
| #SeeAlso isEmpty isSimple SkCanvas::drawOval | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isSimple() const | |
| #In Property | |
| #Line # returns true if not empty, Rect or Oval; and axes radii are equal ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkVector radii[] = {{40, 30}, {40, 30}, {40, 30}, {40, 30}}; | |
| SkRRect rrect; | |
| rrect.setRectRadii({30, 10, 100, 60}, radii); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isSimple() ? "simple" : "not simple", 64, 90, paint); | |
| radii[0].fX = 35; | |
| rrect.setRectRadii(rrect.getBounds(), radii); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isSimple() ? "simple" : "not simple", 64, 90, paint); | |
| ## | |
| #SeeAlso isEmpty isRect isOval isNinePatch | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isNinePatch() const | |
| #In Property | |
| #Line # returns true if not empty, Rect, Oval or simple; and radii are axis-aligned ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkVector radii[] = {{20, 30}, {40, 30}, {40, 30}, {20, 30}}; | |
| SkRRect rrect; | |
| rrect.setRectRadii({30, 10, 100, 60}, radii); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isNinePatch() ? "9 patch" : "not 9 patch", 64, 90, paint); | |
| radii[0].fX = 35; | |
| rrect.setRectRadii(rrect.getBounds(), radii); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isNinePatch() ? "9 patch" : "not 9 patch", 64, 90, paint); | |
| ## | |
| #SeeAlso isEmpty isRect isOval isSimple isComplex | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isComplex() const | |
| #In Property | |
| #Line # returns true if not empty, Rect, Oval, simple, or nine-patch ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(16); | |
| SkVector radii[] = {{25, 30}, {40, 30}, {40, 30}, {20, 30}}; | |
| SkRRect rrect; | |
| rrect.setRectRadii({30, 10, 100, 60}, radii); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isComplex() ? "complex" : "not complex", 64, 90, paint); | |
| radii[0].fX = 20; | |
| rrect.setRectRadii(rrect.getBounds(), radii); | |
| canvas->translate(128, 0); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawString(rrect.isComplex() ? "complex" : "not complex", 64, 90, paint); | |
| ## | |
| #SeeAlso isEmpty isRect isOval isSimple isNinePatch | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkScalar width() const | |
| #In Property | |
| #Line # returns span in x-axis ## | |
| #Populate | |
| #Example | |
| #Description | |
| SkRRect::MakeRect sorts its input, so width() is always zero or larger. | |
| ## | |
| SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 5 }); | |
| SkDebugf("unsorted width: %g\n", unsorted.width()); | |
| SkRRect large = SkRRect::MakeRect({ -FLT_MAX, 1, FLT_MAX, 2 }); | |
| SkDebugf("large width: %.0f\n", large.width()); | |
| #StdOut | |
| unsorted width: 5 | |
| large width: inf | |
| ## | |
| ## | |
| #SeeAlso SkRect::width height getBounds | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkScalar height() const | |
| #In Property | |
| #Line # returns span in y-axis ## | |
| #Populate | |
| #Example | |
| #Description | |
| SkRRect::MakeRect sorts its input, so height() is always zero or larger. | |
| ## | |
| SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 20 }); | |
| SkDebugf("unsorted height: %g\n", unsorted.height()); | |
| SkRRect large = SkRRect::MakeRect({ 1, -FLT_MAX, 2, FLT_MAX }); | |
| SkDebugf("large height: %.0f\n", large.height()); | |
| #StdOut | |
| unsorted height: 5 | |
| large height: inf | |
| ## | |
| ## | |
| #SeeAlso SkRect::height width getBounds | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkVector getSimpleRadii() const | |
| #In Property | |
| #Line # returns corner radii for simple types ## | |
| #Populate | |
| #Example | |
| #Height 100 | |
| auto drawDetails = [=](const SkRRect& rrect) { | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setTextSize(12); | |
| canvas->drawRRect(rrect, paint); | |
| SkVector corner = rrect.getSimpleRadii(); | |
| std::string label = "corner: " + std::to_string(corner.fX).substr(0, 3) + ", " + | |
| std::to_string(corner.fY).substr(0, 3); | |
| canvas->drawString(label.c_str(), 64, 90, paint); | |
| canvas->translate(128, 0); | |
| }; | |
| SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60}); | |
| drawDetails(rrect); | |
| rrect.setRectXY(rrect.getBounds(), 5, 8); | |
| drawDetails(rrect); | |
| ## | |
| #SeeAlso radii getBounds getType isSimple | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setEmpty() | |
| #In Set | |
| #Line # zeroes width, height, and corner radii ## | |
| #Populate | |
| #Example | |
| #Height 80 | |
| #Description | |
| Nothing blue is drawn because Round_Rect is set to empty. | |
| ## | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60}); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setEmpty(); | |
| paint.setColor(SK_ColorBLUE); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso MakeEmpty setRect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setRect(const SkRect& rect) | |
| #In Set | |
| #Line # sets Round_Rect bounds with zeroed corners ## | |
| #Populate | |
| #Example | |
| #Height 90 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60}); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setRect({60, 30, 120, 80}); | |
| paint.setColor(SK_ColorBLUE); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso MakeRect setRectXY | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method static SkRRect MakeEmpty() | |
| #In Constructors | |
| #Line # creates with zeroed bounds and corner radii ## | |
| #Populate | |
| #Example | |
| #Height 90 | |
| SkRRect rrect = SkRRect::MakeEmpty(); | |
| SkRRect rrect2(rrect); | |
| rrect2.inset(-20, -20); | |
| SkPaint p; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setStrokeWidth(10); | |
| std::string str("Type "); | |
| str += SkRRect::kEmpty_Type == rrect2.type() ? "=" : "!"; | |
| str += "= SkRRect::kEmpty_Type"; | |
| canvas->drawString(str.c_str(), 20, 80, SkPaint()); | |
| canvas->drawRRect(rrect2, p); | |
| ## | |
| #SeeAlso SkRRect() SkRect::MakeEmpty | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method static SkRRect MakeRect(const SkRect& r) | |
| #In Constructors | |
| #Line # copies bounds and zeroes corner radii ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60}); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setOval(rrect.getBounds()); | |
| paint.setColor(SK_ColorBLUE); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso setRect MakeOval MakeRectXY | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method static SkRRect MakeOval(const SkRect& oval) | |
| #In Constructors | |
| #Line # creates Oval to fit bounds ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeOval({30, 10, 100, 60}); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setRect(rrect.getBounds()); | |
| paint.setColor(SK_ColorBLUE); | |
| paint.setBlendMode(SkBlendMode::kDifference); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso setOval MakeRect MakeRectXY | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method static SkRRect MakeRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad) | |
| #In Constructors | |
| #Line # creates rounded rectangle ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setRect(rrect.getBounds()); | |
| paint.setColor(SK_ColorBLUE); | |
| paint.setBlendMode(SkBlendMode::kModulate); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso setRectXY | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setOval(const SkRect& oval) | |
| #In Set | |
| #Line # replaces with Oval to fit bounds ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setOval(rrect.getBounds()); | |
| paint.setColor(SK_ColorWHITE); | |
| paint.setBlendMode(SkBlendMode::kExclusion); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso MakeOval | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad) | |
| #In Set | |
| #Line # replaces with rounded rectangle ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20); | |
| canvas->drawRRect(rrect, paint); | |
| rrect.setRectXY(rrect.getBounds(), 5, 5); | |
| paint.setColor(SK_ColorWHITE); | |
| paint.setBlendMode(SkBlendMode::kExclusion); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso MakeRectXY SkPath::addRoundRect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setNinePatch(const SkRect& rect, SkScalar leftRad, SkScalar topRad, | |
| SkScalar rightRad, SkScalar bottomRad) | |
| #In Set | |
| #Line # replaces with rounded rectangle ## | |
| #Populate | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| SkRRect rrect; | |
| rrect.setNinePatch({30, 10, 100, 60}, 10, 20, 20, 10); | |
| canvas->drawRRect(rrect, paint); | |
| paint.setColor(SK_ColorWHITE); | |
| const SkRect r = rrect.getBounds(); | |
| canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY, | |
| r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint); | |
| canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY, | |
| r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint); | |
| canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop, | |
| r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint); | |
| canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop, | |
| r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint); | |
| ## | |
| #SeeAlso setRectRadii | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void setRectRadii(const SkRect& rect, const SkVector radii[4]) | |
| #In Set | |
| #Line # replaces with rounded rectangle ## | |
| #Populate | |
| #Example | |
| #Height 128 | |
| SkPaint paint; | |
| paint.setStrokeWidth(15); | |
| paint.setStrokeCap(SkPaint::kSquare_Cap); | |
| paint.setAntiAlias(true); | |
| float intervals[] = { 5, 21.75f }; | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0)); | |
| SkPath path; | |
| SkRRect rrect; | |
| SkVector corners[] = {{15, 17}, {17, 19}, {19, 15}, {15, 15}}; | |
| rrect.setRectRadii({20, 20, 100, 100}, corners); | |
| path.addRRect(rrect, SkPath::kCW_Direction); | |
| canvas->drawPath(path, paint); | |
| path.rewind(); | |
| path.addRRect(rrect, SkPath::kCCW_Direction, 1); | |
| canvas->translate(120, 0); | |
| canvas->drawPath(path, paint); | |
| ## | |
| #SeeAlso setNinePatch SkPath::addRoundRect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Enum Corner | |
| #Line # corner radii order ## | |
| #Code | |
| enum Corner { | |
| kUpperLeft_Corner, | |
| kUpperRight_Corner, | |
| kLowerRight_Corner, | |
| kLowerLeft_Corner, | |
| }; | |
| ## | |
| The radii are stored: top-left, top-right, bottom-right, bottom-left. | |
| #Const kUpperLeft_Corner 0 | |
| #Line # index of top-left corner radii ## | |
| ## | |
| #Const kUpperRight_Corner 1 | |
| #Line # index of top-right corner radii ## | |
| ## | |
| #Const kLowerRight_Corner 2 | |
| #Line # index of bottom-right corner radii ## | |
| ## | |
| #Const kLowerLeft_Corner 3 | |
| #Line # index of bottom-left corner radii ## | |
| ## | |
| #Example | |
| #Height 70 | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| SkRRect rrect; | |
| SkVector corners[] = {{25, 17}, {17, 19}, {19, 15}, {15, 15}}; | |
| rrect.setRectRadii({30, 10, 100, 60}, corners); | |
| canvas->drawRRect(rrect, paint); | |
| paint.setColor(SK_ColorWHITE); | |
| const SkRect r = rrect.getBounds(); | |
| canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY, | |
| r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint); | |
| canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY, | |
| r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint); | |
| canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop, | |
| r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint); | |
| canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop, | |
| r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint); | |
| ## | |
| #SeeAlso radii | |
| #Enum ## | |
| # ------------------------------------------------------------------------------ | |
| #Method const SkRect& rect() const | |
| #In Property | |
| #Line # returns bounds ## | |
| #Populate | |
| #Example | |
| for (SkScalar left : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) { | |
| SkRRect rrect1 = SkRRect::MakeRectXY({left, 20, 60, 220}, 50, 200); | |
| SkDebugf("left bounds: (%g) %g\n", left, rrect1.rect().fLeft); | |
| } | |
| #StdOut | |
| left bounds: (nan) 0 | |
| left bounds: (inf) 0 | |
| left bounds: (100) 60 | |
| left bounds: (50) 50 | |
| left bounds: (25) 25 | |
| ## | |
| ## | |
| #SeeAlso getBounds | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkVector radii(Corner corner) const | |
| #In Property | |
| #Line # returns x-axis and y-axis radii for one corner ## | |
| #Populate | |
| #Example | |
| #Description | |
| Finite values are scaled proportionately to fit; other values are set to zero. | |
| Scaled values cannot be larger than 25, half the bounding Round_Rect width. | |
| Small scaled values are halved to scale in proportion to the y-axis corner | |
| radius, which is twice the bounds height. | |
| ## | |
| for (SkScalar radiusX : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) { | |
| SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, radiusX, 200); | |
| SkDebugf("left corner: (%g) %g\n", radiusX, rrect1.radii(SkRRect::kUpperLeft_Corner).fX); | |
| } | |
| #StdOut | |
| left corner: (nan) 0 | |
| left corner: (inf) 0 | |
| left corner: (100) 25 | |
| left corner: (50) 25 | |
| left corner: (25) 12.5 | |
| ## | |
| ## | |
| #SeeAlso Corner | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method const SkRect& getBounds() const | |
| #In Property | |
| #Line # returns bounds ## | |
| #Populate | |
| #Example | |
| #Height 120 | |
| SkPaint paint; | |
| SkRRect rrect = SkRRect::MakeRectXY({20, 20, 220, 100}, 15, 15); | |
| canvas->drawRRect(rrect, paint); | |
| paint.setColor(SK_ColorWHITE); | |
| rrect = SkRRect::MakeOval(rrect.getBounds()); | |
| canvas->drawRRect(rrect, paint); | |
| ## | |
| #SeeAlso rect | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool operator==(const SkRRect& a, const SkRRect& b) | |
| #In Operators | |
| #Line # returns true if members are equal ## | |
| #Populate | |
| #Example | |
| SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 200); | |
| SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 25, 100); | |
| SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect()); | |
| canvas->drawRRect(rrect1, SkPaint()); | |
| std::string str = "rrect1 " + std::string(rrect1 == rrect2 ? "=" : "!") + "= rrect2"; | |
| canvas->drawString(str.c_str(), 10, 240, SkPaint()); | |
| canvas->translate(70, 0); | |
| canvas->drawRRect(rrect2, SkPaint()); | |
| canvas->translate(70, 0); | |
| canvas->drawRRect(rrect3, SkPaint()); | |
| str = "rrect2 " + std::string(rrect2 == rrect3 ? "=" : "!") + "= rrect3"; | |
| canvas->drawString(str.c_str(), -20, 240, SkPaint()); | |
| ## | |
| #SeeAlso operator!=(const SkRRect& a, const SkRRect& b) | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool operator!=(const SkRRect& a, const SkRRect& b) | |
| #In Operators | |
| #Line # returns true if members are unequal ## | |
| #Populate | |
| #Example | |
| SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 100); | |
| SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 50, 50); | |
| SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect()); | |
| canvas->drawRRect(rrect1, SkPaint()); | |
| std::string str = "rrect1 " + std::string(rrect1 == rrect2 ? "=" : "!") + "= rrect2"; | |
| canvas->drawString(str.c_str(), 10, 240, SkPaint()); | |
| canvas->translate(70, 0); | |
| canvas->drawRRect(rrect2, SkPaint()); | |
| canvas->translate(70, 0); | |
| canvas->drawRRect(rrect3, SkPaint()); | |
| str = "rrect2 " + std::string(rrect2 == rrect3 ? "=" : "!") + "= rrect3"; | |
| canvas->drawString(str.c_str(), -20, 240, SkPaint()); | |
| ## | |
| #SeeAlso operator==(const SkRRect& a, const SkRRect& b) | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void inset(SkScalar dx, SkScalar dy, SkRRect* dst) const | |
| #In Inset_Outset_Offset | |
| #Line # insets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect.inset(-3, 3, &rrect); | |
| } | |
| ## | |
| #SeeAlso outset offset makeOffset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void inset(SkScalar dx, SkScalar dy) | |
| #In Inset_Outset_Offset | |
| #Line # insets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({10, 20, 180, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect.inset(3, 3); | |
| } | |
| ## | |
| #SeeAlso outset offset makeOffset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void outset(SkScalar dx, SkScalar dy, SkRRect* dst) const | |
| #In Inset_Outset_Offset | |
| #Line # outsets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect.outset(-3, 3, &rrect); | |
| } | |
| ## | |
| #SeeAlso inset offset makeOffset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void outset(SkScalar dx, SkScalar dy) | |
| #In Inset_Outset_Offset | |
| #Line # outsets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect.outset(3, 3); | |
| } | |
| ## | |
| #SeeAlso inset offset makeOffset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void offset(SkScalar dx, SkScalar dy) | |
| #In Inset_Outset_Offset | |
| #Line # offsets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect.offset(3, 3); | |
| } | |
| ## | |
| #SeeAlso makeOffset inset outset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method SkRRect makeOffset(SkScalar dx, SkScalar dy) const | |
| #In Inset_Outset_Offset | |
| #Line # offsets bounds and radii ## | |
| #Populate | |
| #Example | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100); | |
| for (int index = 0; index < 25; ++index) { | |
| canvas->drawRRect(rrect, paint); | |
| rrect = rrect.makeOffset(-3, 3); | |
| } | |
| ## | |
| #SeeAlso offset inset outset | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool contains(const SkRect& rect) const | |
| #In Intersection | |
| #Line # returns true if Rect is inside ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkRect test = {10, 10, 110, 80}; | |
| SkRRect rrect = SkRRect::MakeRect(test); | |
| SkRRect oval = SkRRect::MakeOval(test); | |
| test.inset(10, 10); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| canvas->drawString(rrect.contains(test) ? "contains" : "does not contain", 55, 100, paint); | |
| canvas->drawString(oval.contains(test) ? "contains" : "does not contain", 185, 100, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawRect(test, paint); | |
| canvas->translate(120, 0); | |
| canvas->drawRRect(oval, paint); | |
| canvas->drawRect(test, paint); | |
| ## | |
| #SeeAlso SkRect::contains | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool isValid() const | |
| #In Utility | |
| #Line # returns if type() matches bounds and radii ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80}); | |
| SkRRect corrupt = rrect; | |
| *((float*) &corrupt) = 120; | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| canvas->drawString(rrect.isValid() ? "is valid" : "is corrupted", 55, 100, paint); | |
| canvas->drawString(corrupt.isValid() ? "is valid" : "is corrupted", 185, 100, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->translate(120, 0); | |
| canvas->drawRRect(corrupt, paint); | |
| ## | |
| #SeeAlso Type getType | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Const kSizeInMemory 48 | |
| #Line # storage space for Round_Rect ## | |
| Space required to write the contents of SkRRect into a buffer; always a multiple of four. | |
| #Const ## | |
| # ------------------------------------------------------------------------------ | |
| #Method size_t writeToMemory(void* buffer) const | |
| #In Utility | |
| #Line # writes Round_Rect to buffer ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80}); | |
| char storage[SkRRect::kSizeInMemory]; | |
| rrect.writeToMemory(storage); | |
| SkRRect copy; | |
| copy.readFromMemory(storage, sizeof(storage)); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| canvas->drawString("rrect", 55, 100, paint); | |
| canvas->drawString("copy", 185, 100, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->translate(120, 0); | |
| canvas->drawRRect(copy, paint); | |
| ## | |
| #SeeAlso readFromMemory | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method size_t readFromMemory(const void* buffer, size_t length) | |
| #In Utility | |
| #Line # reads Round_Rect from buffer ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkVector radii[] = {{5, 5}, {10, 10}, {15, 15}, {5, 5}}; | |
| SkRRect rrect; | |
| rrect.setRectRadii({10, 10, 110, 80}, radii); | |
| char storage[SkRRect::kSizeInMemory]; | |
| rrect.writeToMemory(storage); | |
| SkRRect copy; | |
| copy.readFromMemory(storage, sizeof(storage)); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| canvas->drawString("rrect", 55, 100, paint); | |
| canvas->drawString("copy", 185, 100, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->translate(120, 0); | |
| canvas->drawRRect(copy, paint); | |
| ## | |
| #SeeAlso writeToMemory | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method bool transform(const SkMatrix& matrix, SkRRect* dst) const | |
| #In Inset_Outset_Offset | |
| #Line # scales and offsets into copy ## | |
| #Populate | |
| #Example | |
| #Height 110 | |
| SkVector radii[] = {{5, 5}, {10, 10}, {15, 15}, {5, 5}}; | |
| SkRRect rrect; | |
| rrect.setRectRadii({10, 10, 110, 80}, radii); | |
| SkRRect transformed; | |
| SkMatrix matrix = SkMatrix::MakeRectToRect(rrect.rect(), {140, 30, 220, 80}, | |
| SkMatrix::kCenter_ScaleToFit); | |
| bool success = rrect.transform(matrix, &transformed); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| canvas->drawString("rrect", 55, 100, paint); | |
| canvas->drawString(success ? "transformed" : "transform failed", 185, 100, paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| canvas->drawRRect(rrect, paint); | |
| canvas->drawRRect(transformed, paint); | |
| ## | |
| #SeeAlso SkPath::transform | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void dump(bool asHex) const | |
| #In Utility | |
| #Line # sends text representation to standard output ## | |
| #Populate | |
| #Example | |
| SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3}); | |
| for (bool dumpAsHex : { false, true } ) { | |
| rrect.dump(dumpAsHex); | |
| } | |
| #StdOut | |
| SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f); | |
| const SkPoint corners[] = { | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| }; | |
| SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab), /* 0.666667 */ | |
| SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab) /* 0.666667 */); | |
| const SkPoint corners[] = { | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| }; | |
| ## | |
| ## | |
| #SeeAlso dumpHex SkRect::dump SkPath::dump SkPathMeasure::dump | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void dump() const | |
| #In Utility | |
| #Line # sends text representation using floats to standard output ## | |
| #Populate | |
| #Example | |
| SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3}); | |
| rrect.dump(); | |
| SkRect bounds = SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f); | |
| const SkPoint corners[] = { | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| }; | |
| SkRRect copy; | |
| copy.setRectRadii(bounds, corners); | |
| SkDebugf("rrect is " "%s" "equal to copy\n", rrect == copy ? "" : "not "); | |
| #StdOut | |
| SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f); | |
| const SkPoint corners[] = { | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| { 0, 0 }, | |
| }; | |
| rrect is not equal to copy | |
| ## | |
| ## | |
| #SeeAlso dumpHex SkRect::dump SkPath::dump SkPathMeasure::dump | |
| #Method ## | |
| # ------------------------------------------------------------------------------ | |
| #Method void dumpHex() const | |
| #In Utility | |
| #Line # sends text representation using hexadecimal to standard output ## | |
| #Populate | |
| #Example | |
| SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3}); | |
| rrect.dumpHex(); | |
| SkRect bounds = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab), /* 0.666667 */ | |
| SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab) /* 0.666667 */); | |
| const SkPoint corners[] = { | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| }; | |
| SkRRect copy; | |
| copy.setRectRadii(bounds, corners); | |
| SkDebugf("rrect is " "%s" "equal to copy\n", rrect == copy ? "" : "not "); | |
| #StdOut | |
| SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab), /* 0.666667 */ | |
| SkBits2Float(0x3f5b6db7), /* 0.857143 */ | |
| SkBits2Float(0x3f2aaaab) /* 0.666667 */); | |
| const SkPoint corners[] = { | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */ | |
| }; | |
| rrect is equal to copy | |
| ## | |
| ## | |
| #SeeAlso dump SkRect::dumpHex SkPath::dumpHex | |
| #Method ## | |
| #Class SkRRect ## | |
| #Topic RRect ## |