Chromium Code Reviews| Index: src/core/SkRRect.cpp |
| diff --git a/src/core/SkRRect.cpp b/src/core/SkRRect.cpp |
| index 915ed75327f590c567ec18a5e9e0d92f64b76ee4..03f173eafe60164c4539d08882d9f00be8603161 100644 |
| --- a/src/core/SkRRect.cpp |
| +++ b/src/core/SkRRect.cpp |
| @@ -43,6 +43,55 @@ void SkRRect::setRectXY(const SkRect& rect, SkScalar xRad, SkScalar yRad) { |
| SkDEBUGCODE(this->validate();) |
| } |
| +void SkRRect::setNinePatch(const SkRect& rect, SkScalar leftRad, SkScalar topRad, |
| + SkScalar rightRad, SkScalar bottomRad) { |
| + if (rect.isEmpty()) { |
| + this->setEmpty(); |
| + return; |
| + } |
| + |
| + leftRad = SkMaxScalar(leftRad, 0); |
| + topRad = SkMaxScalar(topRad, 0); |
| + rightRad = SkMaxScalar(rightRad, 0); |
| + bottomRad = SkMaxScalar(bottomRad, 0); |
| + |
|
robertphillips
2014/03/14 16:22:59
I think we need to scale the x & y radii separatel
bsalomon
2014/03/14 16:30:20
We don't in the other setters (which I just stole
robertphillips
2014/03/14 16:52:07
Sigh - that is correct (http://www.w3.org/TR/2010/
|
| + SkScalar scale = SK_Scalar1; |
| + if (leftRad + rightRad > rect.width()) { |
| + scale = SkScalarDiv(rect.width(), leftRad + rightRad); |
| + } |
| + if (topRad + bottomRad > rect.height()) { |
| + scale = SkMinScalar(scale, SkScalarDiv(rect.width(), leftRad + rightRad)); |
| + } |
| + |
| + if (scale < SK_Scalar1) { |
| + leftRad = SkScalarMul(leftRad, scale); |
| + topRad = SkScalarMul(topRad, scale); |
| + rightRad = SkScalarMul(rightRad, scale); |
| + bottomRad = SkScalarMul(bottomRad, scale); |
| + } |
| + |
| + if (leftRad == rightRad && topRad == bottomRad) { |
| + if (leftRad >= SkScalarHalf(rect.width()) && topRad >= SkScalarHalf(rect.height())) { |
| + fType = kOval_Type; |
|
robertphillips
2014/03/14 16:22:59
don't we also need "&& 0 == topRad"?
bsalomon
2014/03/14 16:30:20
I don't think so... if the top radius is 0 then so
robertphillips
2014/03/14 16:52:07
You're right - probably both a comment and jamming
|
| + } else if (0 == leftRad) { |
| + fType = kRect_Type; |
| + } else { |
| + fType = kSimple_Type; |
| + } |
| + } else { |
| + fType = kNinePatch_Type; |
| + } |
| + |
| + fRect = rect; |
| + fRadii[kUpperLeft_Corner].set(leftRad, topRad); |
| + fRadii[kUpperRight_Corner].set(rightRad, topRad); |
| + fRadii[kLowerRight_Corner].set(rightRad, bottomRad); |
| + fRadii[kLowerLeft_Corner].set(leftRad, bottomRad); |
| + |
| + SkDEBUGCODE(this->validate();) |
| +} |
| + |
| + |
| void SkRRect::setRectRadii(const SkRect& rect, const SkVector radii[4]) { |
| if (rect.isEmpty()) { |
| this->setEmpty(); |
| @@ -238,7 +287,14 @@ void SkRRect::computeType() const { |
| return; |
| } |
| - fType = kComplex_Type; |
| + if (fRadii[kUpperLeft_Corner].fX == fRadii[kLowerLeft_Corner].fX && |
| + fRadii[kUpperLeft_Corner].fY == fRadii[kUpperRight_Corner].fY && |
| + fRadii[kUpperRight_Corner].fX == fRadii[kLowerRight_Corner].fX && |
| + fRadii[kLowerLeft_Corner].fY == fRadii[kLowerRight_Corner].fY) { |
| + fType = kNinePatch_Type; |
| + } else { |
| + fType = kComplex_Type; |
| + } |
| } |
| static bool matrix_only_scale_and_translate(const SkMatrix& matrix) { |
| @@ -391,6 +447,10 @@ void SkRRect::validate() const { |
| allCornersSquare = false; |
| } |
| } |
|
robertphillips
2014/03/14 16:22:59
maybe a radii_make_nine_patch predicate to share c
bsalomon
2014/03/14 16:30:20
I'm not sure what you mean.
robertphillips
2014/03/14 16:52:07
Add a helper function?
bsalomon
2014/03/14 17:15:31
gotcha! will do. I thought you meant incorporating
|
| + bool patchesOfNine = fRadii[kUpperLeft_Corner].fX == fRadii[kLowerLeft_Corner].fX && |
| + fRadii[kUpperLeft_Corner].fY == fRadii[kUpperRight_Corner].fY && |
| + fRadii[kUpperRight_Corner].fX == fRadii[kLowerRight_Corner].fX && |
| + fRadii[kLowerLeft_Corner].fY == fRadii[kLowerRight_Corner].fY; |
| switch (fType) { |
| case kEmpty_Type: |
| @@ -417,9 +477,15 @@ void SkRRect::validate() const { |
| SkASSERT(!fRect.isEmpty()); |
| SkASSERT(!allRadiiZero && allRadiiSame && !allCornersSquare); |
| break; |
| + case kNinePatch_Type: |
| + SkASSERT(!fRect.isEmpty()); |
| + SkASSERT(!allRadiiZero && !allRadiiSame && !allCornersSquare); |
| + SkASSERT(patchesOfNine); |
| + break; |
| case kComplex_Type: |
| SkASSERT(!fRect.isEmpty()); |
| SkASSERT(!allRadiiZero && !allRadiiSame && !allCornersSquare); |
| + SkASSERT(!patchesOfNine); |
| break; |
| case kUnknown_Type: |
| // no limits on this |