Index: src/core/SkMatrix.cpp |
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp |
index f60ce85a6cacaa5d9c095d249e0485d515e2531a..5711bd9aef2f169fba19af723be848dbc0cef584 100644 |
--- a/src/core/SkMatrix.cpp |
+++ b/src/core/SkMatrix.cpp |
@@ -5,13 +5,12 @@ |
* found in the LICENSE file. |
*/ |
-#include "SkMatrix.h" |
#include "SkFloatBits.h" |
+#include "SkMatrix.h" |
+#include "SkNx.h" |
+#include "SkPaint.h" |
#include "SkRSXform.h" |
#include "SkString.h" |
-#include "SkNx.h" |
-#include "SkOpts.h" |
- |
#include <stddef.h> |
static void normalize_perspective(SkScalar mat[9]) { |
@@ -917,11 +916,62 @@ void SkMatrix::Identity_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[ |
} |
void SkMatrix::Trans_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
- return SkOpts::matrix_translate(m,dst,src,count); |
+ SkASSERT(m.getType() <= SkMatrix::kTranslate_Mask); |
+ if (count > 0) { |
+ SkScalar tx = m.getTranslateX(); |
+ SkScalar ty = m.getTranslateY(); |
+ if (count & 1) { |
+ dst->fX = src->fX + tx; |
+ dst->fY = src->fY + ty; |
+ src += 1; |
+ dst += 1; |
+ } |
+ Sk4s trans4(tx, ty, tx, ty); |
+ count >>= 1; |
+ if (count & 1) { |
+ (Sk4s::Load(src) + trans4).store(dst); |
+ src += 2; |
+ dst += 2; |
+ } |
+ count >>= 1; |
+ for (int i = 0; i < count; ++i) { |
+ (Sk4s::Load(src+0) + trans4).store(dst+0); |
+ (Sk4s::Load(src+2) + trans4).store(dst+2); |
+ src += 4; |
+ dst += 4; |
+ } |
+ } |
} |
void SkMatrix::Scale_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
- return SkOpts::matrix_scale_translate(m,dst,src,count); |
+ SkASSERT(m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::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; |
+ src += 1; |
+ dst += 1; |
+ } |
+ Sk4s trans4(tx, ty, tx, ty); |
+ Sk4s scale4(sx, sy, sx, sy); |
+ count >>= 1; |
+ if (count & 1) { |
+ (Sk4s::Load(src) * scale4 + trans4).store(dst); |
+ src += 2; |
+ dst += 2; |
+ } |
+ count >>= 1; |
+ for (int i = 0; i < count; ++i) { |
+ (Sk4s::Load(src+0) * scale4 + trans4).store(dst+0); |
+ (Sk4s::Load(src+2) * scale4 + trans4).store(dst+2); |
+ src += 4; |
+ dst += 4; |
+ } |
+ } |
} |
void SkMatrix::Persp_pts(const SkMatrix& m, SkPoint dst[], |
@@ -953,7 +1003,32 @@ void SkMatrix::Persp_pts(const SkMatrix& m, SkPoint dst[], |
} |
void SkMatrix::Affine_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) { |
- return SkOpts::matrix_affine(m,dst,src,count); |
+ SkASSERT(m.getType() != SkMatrix::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); |
+ src += 1; |
+ dst += 1; |
+ } |
+ Sk4s trans4(tx, ty, tx, ty); |
+ Sk4s scale4(sx, sy, sx, sy); |
+ Sk4s skew4(kx, ky, kx, ky); // applied to swizzle of src4 |
+ count >>= 1; |
+ for (int i = 0; i < count; ++i) { |
+ Sk4s src4 = Sk4s::Load(src); |
+ Sk4s swz4 = SkNx_shuffle<1,0,3,2>(src4); // y0 x0, y1 x1 |
+ (src4 * scale4 + swz4 * skew4 + trans4).store(dst); |
+ src += 2; |
+ dst += 2; |
+ } |
+ } |
} |
const SkMatrix::MapPtsProc SkMatrix::gMapPtsProcs[] = { |