Index: src/core/SkMatrix.cpp |
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp |
index 81b8960855c355599aa82e53a551e496d61798b4..a43e00f3af562630723e9456a90af12c25750a6c 100644 |
--- a/src/core/SkMatrix.cpp |
+++ b/src/core/SkMatrix.cpp |
@@ -1022,22 +1022,12 @@ void SkMatrix::mapPoints(SkPoint dst[], const SkPoint src[], int count) const { |
#include "Sk4x.h" |
-void SkMatrix::mapPts(SkPoint dst[], const SkPoint src[], int count) const { |
- if (count <= 0) { |
- return; |
- } |
+void SkMatrix::Trans_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
+ SkASSERT(m.getType() <= kTranslate_Mask); |
- unsigned mask = this->getType() & 0xF; |
- |
- if (SkMatrix::kIdentity_Mask == mask) { |
- if (src != dst) { |
- memcpy(dst, src, count * sizeof(SkPoint)); |
- } |
- return; |
- } |
- if (SkMatrix::kTranslate_Mask == mask) { |
- SkScalar tx = this->getTranslateX(); |
- SkScalar ty = this->getTranslateY(); |
+ if (count > 0) { |
+ SkScalar tx = m.getTranslateX(); |
+ SkScalar ty = m.getTranslateY(); |
if (count & 1) { |
dst->fX = src->fX + tx; |
dst->fY = src->fY + ty; |
@@ -1046,18 +1036,29 @@ void SkMatrix::mapPts(SkPoint dst[], const SkPoint src[], int count) const { |
} |
Sk4f trans4(tx, ty, tx, ty); |
count >>= 1; |
- for (int i = 0; i < count; ++i) { |
+ if (count & 1) { |
(Sk4f::Load(&src->fX) + trans4).store(&dst->fX); |
src += 2; |
dst += 2; |
} |
- return; |
+ count >>= 1; |
+ for (int i = 0; i < count; ++i) { |
+ (Sk4f::Load(&src[0].fX) + trans4).store(&dst[0].fX); |
+ (Sk4f::Load(&src[2].fX) + trans4).store(&dst[2].fX); |
+ src += 4; |
+ dst += 4; |
+ } |
} |
- if (mask <= SkMatrix::kScale_Mask + SkMatrix::kTranslate_Mask) { |
- SkScalar tx = this->getTranslateX(); |
- SkScalar ty = this->getTranslateY(); |
- SkScalar sx = this->getScaleX(); |
- SkScalar sy = this->getScaleY(); |
+} |
+ |
+void SkMatrix::Scale_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
+ SkASSERT(m.getType() <= (kScale_Mask | kTranslate_Mask)); |
+ |
+ if (count > 0) { |
+ SkScalar tx = m.getTranslateX(); |
+ SkScalar ty = m.getTranslateY(); |
+ SkScalar sx = m.getScaleX(); |
+ SkScalar sy = m.getScaleY(); |
if (count & 1) { |
dst->fX = src->fX * sx + tx; |
dst->fY = src->fY * sy + ty; |
@@ -1067,20 +1068,31 @@ void SkMatrix::mapPts(SkPoint dst[], const SkPoint src[], int count) const { |
Sk4f trans4(tx, ty, tx, ty); |
Sk4f scale4(sx, sy, sx, sy); |
count >>= 1; |
- for (int i = 0; i < count; ++i) { |
+ if (count & 1) { |
(Sk4f::Load(&src->fX) * scale4 + trans4).store(&dst->fX); |
src += 2; |
dst += 2; |
} |
- return; |
+ count >>= 1; |
+ for (int i = 0; i < count; ++i) { |
+ (Sk4f::Load(&src[0].fX) * scale4 + trans4).store(&dst[0].fX); |
+ (Sk4f::Load(&src[2].fX) * scale4 + trans4).store(&dst[2].fX); |
+ src += 4; |
+ dst += 4; |
+ } |
} |
- if (mask < SkMatrix::kPerspective_Mask) { // affine |
- SkScalar tx = this->getTranslateX(); |
- SkScalar ty = this->getTranslateY(); |
- SkScalar sx = this->getScaleX(); |
- SkScalar sy = this->getScaleY(); |
- SkScalar kx = this->getSkewX(); |
- SkScalar ky = this->getSkewY(); |
+} |
+ |
+void SkMatrix::Affine_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
+ SkASSERT(m.getType() != kPerspective_Mask); |
+ |
+ if (count > 0) { |
+ SkScalar tx = m.getTranslateX(); |
+ SkScalar ty = m.getTranslateY(); |
+ SkScalar sx = m.getScaleX(); |
+ SkScalar sy = m.getScaleY(); |
+ SkScalar kx = m.getSkewX(); |
+ SkScalar ky = m.getSkewY(); |
if (count & 1) { |
dst->set(src->fX * sx + src->fY * kx + tx, |
src->fX * ky + src->fY * sy + ty); |
@@ -1098,12 +1110,21 @@ void SkMatrix::mapPts(SkPoint dst[], const SkPoint src[], int count) const { |
src += 2; |
dst += 2; |
} |
- return; |
} |
- // fall through for perspective |
- this->mapPoints(dst, src, count); |
} |
+const SkMatrix::MapPtsProc SkMatrix::gMapVPtsProcs[] = { |
+ SkMatrix::Identity_pts, SkMatrix::Trans_vpts, |
+ SkMatrix::Scale_vpts, SkMatrix::Scale_vpts, |
+ SkMatrix::Affine_vpts, SkMatrix::Affine_vpts, |
+ SkMatrix::Affine_vpts, SkMatrix::Affine_vpts, |
+ // repeat the persp proc 8 times |
+ SkMatrix::Persp_pts, SkMatrix::Persp_pts, |
+ SkMatrix::Persp_pts, SkMatrix::Persp_pts, |
+ SkMatrix::Persp_pts, SkMatrix::Persp_pts, |
+ SkMatrix::Persp_pts, SkMatrix::Persp_pts |
+}; |
+ |
/////////////////////////////////////////////////////////////////////////////// |
void SkMatrix::mapHomogeneousPoints(SkScalar dst[], const SkScalar src[], int count) const { |