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 |