Add homogeneous point mapping to Matrix
Adds mapping of homogeneous points (points with three scalar components,
where the last component is not 1). Includes fix for tests when
running on 32 bit debug builds
BUG=
R=bsalomon@google.com
Review URL: https://codereview.chromium.org/22816005
git-svn-id: http://skia.googlecode.com/svn/trunk/src@10755 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkMatrix.cpp b/core/SkMatrix.cpp
index 36e7353..e5d48f0 100644
--- a/core/SkMatrix.cpp
+++ b/core/SkMatrix.cpp
@@ -1218,7 +1218,7 @@
};
void SkMatrix::mapPoints(SkPoint dst[], const SkPoint src[], int count) const {
- SkASSERT((dst && src && count > 0) || count == 0);
+ SkASSERT((dst && src && count > 0) || 0 == count);
// no partial overlap
SkASSERT(src == dst || SkAbs32((int32_t)(src - dst)) >= count);
@@ -1227,6 +1227,42 @@
///////////////////////////////////////////////////////////////////////////////
+void SkMatrix::mapHomogeneousPoints(SkScalar dst[], const SkScalar src[], int count) const {
+ SkASSERT((dst && src && count > 0) || 0 == count);
+ // no partial overlap
+ SkASSERT(src == dst || SkAbs32((int32_t)(src - dst)) >= 3*count);
+
+ if (count > 0) {
+ if (this->isIdentity()) {
+ memcpy(dst, src, 3*count*sizeof(SkScalar));
+ return;
+ }
+ do {
+ SkScalar sx = src[0];
+ SkScalar sy = src[1];
+ SkScalar sw = src[2];
+ src += 3;
+
+ SkScalar x = SkScalarMul(sx, fMat[kMScaleX]) +
+ SkScalarMul(sy, fMat[kMSkewX]) +
+ SkScalarMul(sw, fMat[kMTransX]);
+ SkScalar y = SkScalarMul(sx, fMat[kMSkewY]) +
+ SkScalarMul(sy, fMat[kMScaleY]) +
+ SkScalarMul(sw, fMat[kMTransY]);
+ SkScalar w = SkScalarMul(sx, fMat[kMPersp0]) +
+ SkScalarMul(sy, fMat[kMPersp1]) +
+ SkScalarMul(sw, fMat[kMPersp2]);
+
+ dst[0] = x;
+ dst[1] = y;
+ dst[2] = w;
+ dst += 3;
+ } while (--count);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
void SkMatrix::mapVectors(SkPoint dst[], const SkPoint src[], int count) const {
if (this->hasPerspective()) {
SkPoint origin;