Index: src/core/SkMatrix.cpp |
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp |
index f770e0d5e5d24c57b975f3c49d5709312615f522..77036bc454c9430132bf71b1d686a14fdc6d03fe 100644 |
--- a/src/core/SkMatrix.cpp |
+++ b/src/core/SkMatrix.cpp |
@@ -11,6 +11,29 @@ |
#include <stddef.h> |
+static void normalize_perspective(SkScalar mat[9]) { |
+ // If it was interesting to never store the last element, we could divide all 8 other |
+ // elements here by the 9th, making it 1.0... |
+ // |
+ // When SkScalar was SkFixed, we would sometimes rescale the entire matrix to keep its |
+ // component values from getting too large. This is not a concern when using floats/doubles, |
+ // so we do nothing now. |
+ |
+ // Disable this for now, but it could be enabled. |
+#if 0 |
+ if (0 == mat[SkMatrix::kMPersp0] && 0 == mat[SkMatrix::kMPersp1]) { |
+ SkScalar p2 = mat[SkMatrix::kMPersp2]; |
+ if (p2 != 0 && p2 != 1) { |
+ double inv = 1.0 / p2; |
+ for (int i = 0; i < 6; ++i) { |
+ mat[i] = SkDoubleToScalar(mat[i] * inv); |
+ } |
+ mat[SkMatrix::kMPersp2] = 1; |
+ } |
+ } |
+#endif |
+} |
+ |
// In a few places, we performed the following |
// a * b + c * d + e |
// as |
@@ -40,10 +63,28 @@ void SkMatrix::reset() { |
fMat[kMSkewX] = fMat[kMSkewY] = |
fMat[kMTransX] = fMat[kMTransY] = |
fMat[kMPersp0] = fMat[kMPersp1] = 0; |
- |
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask); |
} |
+void SkMatrix::set9(const SkScalar buffer[]) { |
+ memcpy(fMat, buffer, 9 * sizeof(SkScalar)); |
+ normalize_perspective(fMat); |
+ this->setTypeMask(kUnknown_Mask); |
+} |
+ |
+void SkMatrix::setAffine(const SkScalar buffer[]) { |
+ fMat[kMScaleX] = buffer[kAScaleX]; |
+ fMat[kMSkewX] = buffer[kASkewX]; |
+ fMat[kMTransX] = buffer[kATransX]; |
+ fMat[kMSkewY] = buffer[kASkewY]; |
+ fMat[kMScaleY] = buffer[kAScaleY]; |
+ fMat[kMTransY] = buffer[kATransY]; |
+ fMat[kMPersp0] = 0; |
+ fMat[kMPersp1] = 0; |
+ fMat[kMPersp2] = 1; |
+ this->setTypeMask(kUnknown_Mask); |
+} |
+ |
// this guy aligns with the masks, so we can compute a mask from a varaible 0/1 |
enum { |
kTranslate_Shift, |
@@ -568,15 +609,6 @@ static inline float rowcol3(const float row[], const float col[]) { |
return row[0] * col[0] + row[1] * col[3] + row[2] * col[6]; |
} |
-static void normalize_perspective(SkScalar mat[9]) { |
- // If it was interesting to never store the last element, we could divide all 8 other |
- // elements here by the 9th, making it 1.0... |
- // |
- // When SkScalar was SkFixed, we would sometimes rescale the entire matrix to keep its |
- // component values from getting too large. This is not a concern when using floats/doubles, |
- // so we do nothing now. |
-} |
- |
static bool only_scale_and_translate(unsigned mask) { |
return 0 == (mask & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)); |
} |