Index: src/core/SkMatrix.cpp |
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp |
index 956cf46b9fd3d02bdf167e997fdff22500b0f363..3f235d54aab19d72b806993c6ae8df9a452922f4 100644 |
--- a/src/core/SkMatrix.cpp |
+++ b/src/core/SkMatrix.cpp |
@@ -280,16 +280,7 @@ void SkMatrix::setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py) { |
if (1 == sx && 1 == sy) { |
this->reset(); |
} else { |
- fMat[kMScaleX] = sx; |
- fMat[kMScaleY] = sy; |
- fMat[kMTransX] = px - sx * px; |
- fMat[kMTransY] = py - sy * py; |
- fMat[kMPersp2] = 1; |
- |
- fMat[kMSkewX] = fMat[kMSkewY] = |
- fMat[kMPersp0] = fMat[kMPersp1] = 0; |
- |
- this->setTypeMask(kScale_Mask | kTranslate_Mask | kRectStaysRect_Mask); |
+ this->setScaleTranslate(sx, sy, px - sx * px, py - sy * py); |
} |
} |
@@ -390,8 +381,7 @@ bool SkMatrix::postIDiv(int divx, int divy) { |
//////////////////////////////////////////////////////////////////////////////////// |
-void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, |
- SkScalar px, SkScalar py) { |
+void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, SkScalar px, SkScalar py) { |
const SkScalar oneMinusCosV = 1 - cosV; |
fMat[kMScaleX] = cosV; |
@@ -517,9 +507,7 @@ void SkMatrix::postSkew(SkScalar sx, SkScalar sy) { |
/////////////////////////////////////////////////////////////////////////////// |
-bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, |
- ScaleToFit align) |
-{ |
+bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit align) { |
if (src.isEmpty()) { |
this->reset(); |
return false; |
@@ -527,6 +515,7 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, |
if (dst.isEmpty()) { |
sk_bzero(fMat, 8 * sizeof(SkScalar)); |
+ fMat[kMPersp2] = 1; |
this->setTypeMask(kScale_Mask | kRectStaysRect_Mask); |
} else { |
SkScalar tx, sx = dst.width() / src.width(); |
@@ -564,24 +553,8 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, |
} |
} |
- fMat[kMScaleX] = sx; |
- fMat[kMScaleY] = sy; |
- fMat[kMTransX] = tx; |
- fMat[kMTransY] = ty; |
- fMat[kMSkewX] = fMat[kMSkewY] = |
- fMat[kMPersp0] = fMat[kMPersp1] = 0; |
- |
- unsigned mask = kRectStaysRect_Mask; |
- if (sx != 1 || sy != 1) { |
- mask |= kScale_Mask; |
- } |
- if (tx || ty) { |
- mask |= kTranslate_Mask; |
- } |
- this->setTypeMask(mask); |
+ this->setScaleTranslate(sx, sy, tx, ty); |
} |
- // shared cleanup |
- fMat[kMPersp2] = 1; |
return true; |
} |
@@ -602,14 +575,23 @@ static void normalize_perspective(SkScalar mat[9]) { |
} |
} |
+static bool only_scale_and_translate(unsigned mask) { |
+ return 0 == (mask & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)); |
+} |
+ |
void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { |
- TypeMask aType = a.getPerspectiveTypeMaskOnly(); |
- TypeMask bType = b.getPerspectiveTypeMaskOnly(); |
+ TypeMask aType = a.getType(); |
+ TypeMask bType = b.getType(); |
if (a.isTriviallyIdentity()) { |
*this = b; |
} else if (b.isTriviallyIdentity()) { |
*this = a; |
+ } else if (only_scale_and_translate(aType | bType)) { |
+ this->setScaleTranslate(a.fMat[kMScaleX] * b.fMat[kMScaleX], |
+ a.fMat[kMScaleY] * b.fMat[kMScaleY], |
+ a.fMat[kMScaleX] * b.fMat[kMTransX] + a.fMat[kMTransX], |
+ a.fMat[kMScaleY] * b.fMat[kMTransY] + a.fMat[kMTransY]); |
} else { |
SkMatrix tmp; |
@@ -626,7 +608,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { |
normalize_perspective(tmp.fMat); |
tmp.setTypeMask(kUnknown_Mask); |
- } else { // not perspective |
+ } else { |
tmp.fMat[kMScaleX] = muladdmul(a.fMat[kMScaleX], |
b.fMat[kMScaleX], |
a.fMat[kMSkewX], |
@@ -640,9 +622,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { |
tmp.fMat[kMTransX] = muladdmul(a.fMat[kMScaleX], |
b.fMat[kMTransX], |
a.fMat[kMSkewX], |
- b.fMat[kMTransY]); |
- |
- tmp.fMat[kMTransX] += a.fMat[kMTransX]; |
+ b.fMat[kMTransY]) + a.fMat[kMTransX]; |
tmp.fMat[kMSkewY] = muladdmul(a.fMat[kMSkewY], |
b.fMat[kMScaleX], |
@@ -657,10 +637,10 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { |
tmp.fMat[kMTransY] = muladdmul(a.fMat[kMSkewY], |
b.fMat[kMTransX], |
a.fMat[kMScaleY], |
- b.fMat[kMTransY]); |
+ b.fMat[kMTransY]) + a.fMat[kMTransY]; |
- tmp.fMat[kMTransY] += a.fMat[kMTransY]; |
- tmp.fMat[kMPersp0] = tmp.fMat[kMPersp1] = 0; |
+ tmp.fMat[kMPersp0] = 0; |
+ tmp.fMat[kMPersp1] = 0; |
tmp.fMat[kMPersp2] = 1; |
//SkDebugf("Concat mat non-persp type: %d\n", tmp.getType()); |
//SkASSERT(!(tmp.getType() & kPerspective_Mask)); |