Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Unified Diff: src/core/SkMatrix.cpp

Issue 1045493002: use Sk4f for matrix math (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/core/SkMatrix.h ('k') | tests/MatrixTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkMatrix.cpp
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp
index a43e00f3af562630723e9456a90af12c25750a6c..0f56b724f5fac42536a6c98f60dc4e89610b6700 100644
--- a/src/core/SkMatrix.cpp
+++ b/src/core/SkMatrix.cpp
@@ -8,6 +8,7 @@
#include "SkMatrix.h"
#include "SkFloatBits.h"
#include "SkString.h"
+#include "Sk4x.h"
#include <stddef.h>
@@ -867,61 +868,72 @@ bool SkMatrix::invertNonIdentity(SkMatrix* inv) const {
///////////////////////////////////////////////////////////////////////////////
-void SkMatrix::Identity_pts(const SkMatrix& m, SkPoint dst[],
- const SkPoint src[], int count) {
+void SkMatrix::Identity_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) {
SkASSERT(m.getType() == 0);
- if (dst != src && count > 0)
+ if (dst != src && count > 0) {
memcpy(dst, src, count * sizeof(SkPoint));
-}
-
-void SkMatrix::Trans_pts(const SkMatrix& m, SkPoint dst[],
- const SkPoint src[], int count) {
- SkASSERT(m.getType() == kTranslate_Mask);
-
- if (count > 0) {
- SkScalar tx = m.fMat[kMTransX];
- SkScalar ty = m.fMat[kMTransY];
- do {
- dst->fY = src->fY + ty;
- dst->fX = src->fX + tx;
- src += 1;
- dst += 1;
- } while (--count);
}
}
-void SkMatrix::Scale_pts(const SkMatrix& m, SkPoint dst[],
- const SkPoint src[], int count) {
- SkASSERT(m.getType() == kScale_Mask);
-
+void SkMatrix::Trans_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) {
+ SkASSERT(m.getType() <= kTranslate_Mask);
+
if (count > 0) {
- SkScalar mx = m.fMat[kMScaleX];
- SkScalar my = m.fMat[kMScaleY];
- do {
- dst->fY = src->fY * my;
- dst->fX = src->fX * mx;
+ 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;
- } while (--count);
+ }
+ Sk4f trans4(tx, ty, tx, ty);
+ count >>= 1;
+ if (count & 1) {
+ (Sk4f::Load(&src->fX) + trans4).store(&dst->fX);
+ src += 2;
+ dst += 2;
+ }
+ 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;
+ }
}
}
-void SkMatrix::ScaleTrans_pts(const SkMatrix& m, SkPoint dst[],
- const SkPoint src[], int count) {
- SkASSERT(m.getType() == (kScale_Mask | kTranslate_Mask));
-
+void SkMatrix::Scale_pts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) {
+ SkASSERT(m.getType() <= (kScale_Mask | kTranslate_Mask));
+
if (count > 0) {
- SkScalar mx = m.fMat[kMScaleX];
- SkScalar my = m.fMat[kMScaleY];
- SkScalar tx = m.fMat[kMTransX];
- SkScalar ty = m.fMat[kMTransY];
- do {
- dst->fY = src->fY * my + ty;
- dst->fX = src->fX * mx + tx;
+ 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;
- } while (--count);
+ }
+ Sk4f trans4(tx, ty, tx, ty);
+ Sk4f scale4(sx, sy, sx, sy);
+ count >>= 1;
+ if (count & 1) {
+ (Sk4f::Load(&src->fX) * scale4 + trans4).store(&dst->fX);
+ src += 2;
+ dst += 2;
+ }
+ 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;
+ }
}
}
@@ -1000,89 +1012,6 @@ void SkMatrix::Persp_pts(const SkMatrix& m, SkPoint dst[],
}
}
-const SkMatrix::MapPtsProc SkMatrix::gMapPtsProcs[] = {
- SkMatrix::Identity_pts, SkMatrix::Trans_pts,
- SkMatrix::Scale_pts, SkMatrix::ScaleTrans_pts,
- SkMatrix::Rot_pts, SkMatrix::RotTrans_pts,
- SkMatrix::Rot_pts, SkMatrix::RotTrans_pts,
- // 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::mapPoints(SkPoint dst[], const SkPoint src[], int count) const {
- SkASSERT((dst && src && count > 0) || 0 == count);
- // no partial overlap
- SkASSERT(src == dst || &dst[count] <= &src[0] || &src[count] <= &dst[0]);
-
- this->getMapPtsProc()(*this, dst, src, count);
-}
-
-#include "Sk4x.h"
-
-void SkMatrix::Trans_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) {
- SkASSERT(m.getType() <= 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;
- }
- Sk4f trans4(tx, ty, tx, ty);
- count >>= 1;
- if (count & 1) {
- (Sk4f::Load(&src->fX) + trans4).store(&dst->fX);
- src += 2;
- dst += 2;
- }
- 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;
- }
- }
-}
-
-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;
- src += 1;
- dst += 1;
- }
- Sk4f trans4(tx, ty, tx, ty);
- Sk4f scale4(sx, sy, sx, sy);
- count >>= 1;
- if (count & 1) {
- (Sk4f::Load(&src->fX) * scale4 + trans4).store(&dst->fX);
- src += 2;
- dst += 2;
- }
- 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;
- }
- }
-}
-
void SkMatrix::Affine_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[], int count) {
SkASSERT(m.getType() != kPerspective_Mask);
@@ -1113,11 +1042,16 @@ void SkMatrix::Affine_vpts(const SkMatrix& m, SkPoint dst[], const SkPoint src[]
}
}
-const SkMatrix::MapPtsProc SkMatrix::gMapVPtsProcs[] = {
- SkMatrix::Identity_pts, SkMatrix::Trans_vpts,
- SkMatrix::Scale_vpts, SkMatrix::Scale_vpts,
+const SkMatrix::MapPtsProc SkMatrix::gMapPtsProcs[] = {
+ SkMatrix::Identity_pts, SkMatrix::Trans_pts,
+ SkMatrix::Scale_pts, SkMatrix::Scale_pts,
+#ifdef SK_SUPPORT_LEGACY_SCALAR_MAPPOINTS
+ SkMatrix::Rot_pts, SkMatrix::RotTrans_pts,
+ SkMatrix::Rot_pts, SkMatrix::RotTrans_pts,
+#else
SkMatrix::Affine_vpts, SkMatrix::Affine_vpts,
SkMatrix::Affine_vpts, SkMatrix::Affine_vpts,
+#endif
// repeat the persp proc 8 times
SkMatrix::Persp_pts, SkMatrix::Persp_pts,
SkMatrix::Persp_pts, SkMatrix::Persp_pts,
« no previous file with comments | « include/core/SkMatrix.h ('k') | tests/MatrixTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698