aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Cary Clark <caryclark@skia.org>2017-10-18 11:46:18 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-18 16:09:46 +0000
commite4442cb0b537720ab32106b3b5353dbb78f11b26 (patch)
treec96d6669865bc85ef278a178d501bd60d29cc2eb /src/core
parentb4379132d12cd11e52944331487b045f1f32989d (diff)
convert mapHomogeneousPoints to SkPoint3
SkMatrix::mapHomogeneousPoints takes an array of SkScalar, but expects essentially SkPoint3, so make it so. R: robertphillips@google.com, reed@google.com Bug: skia:6898 Change-Id: Ibaf8b05c08b7df16c67d6a77d914667ace9a70da Reviewed-on: https://skia-review.googlesource.com/58380 Commit-Queue: Cary Clark <caryclark@skia.org> Commit-Queue: Cary Clark <caryclark@google.com> Reviewed-by: Mike Reed <reed@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkGeometry.cpp31
-rw-r--r--src/core/SkMatrix.cpp21
2 files changed, 22 insertions, 30 deletions
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
index 0b3eedab17..6a5207b9ed 100644
--- a/src/core/SkGeometry.cpp
+++ b/src/core/SkGeometry.cpp
@@ -8,6 +8,7 @@
#include "SkGeometry.h"
#include "SkMatrix.h"
#include "SkNx.h"
+#include "SkPoint3.h"
static SkVector to_vector(const Sk2s& x) {
SkVector vector;
@@ -974,18 +975,6 @@ static bool conic_find_extrema(const SkScalar src[], SkScalar w, SkScalar* t) {
return false;
}
-struct SkP3D {
- SkScalar fX, fY, fZ;
-
- void set(SkScalar x, SkScalar y, SkScalar z) {
- fX = x; fY = y; fZ = z;
- }
-
- void projectDown(SkPoint* dst) const {
- dst->set(fX / fZ, fY / fZ);
- }
-};
-
// We only interpolate one dimension at a time (the first, at +0, +3, +6).
static void p3d_interp(const SkScalar src[7], SkScalar dst[7], SkScalar t) {
SkScalar ab = SkScalarInterp(src[0], src[3], t);
@@ -995,15 +984,19 @@ static void p3d_interp(const SkScalar src[7], SkScalar dst[7], SkScalar t) {
dst[6] = bc;
}
-static void ratquad_mapTo3D(const SkPoint src[3], SkScalar w, SkP3D dst[]) {
+static void ratquad_mapTo3D(const SkPoint src[3], SkScalar w, SkPoint3 dst[3]) {
dst[0].set(src[0].fX * 1, src[0].fY * 1, 1);
dst[1].set(src[1].fX * w, src[1].fY * w, w);
dst[2].set(src[2].fX * 1, src[2].fY * 1, 1);
}
+static SkPoint project_down(const SkPoint3& src) {
+ return {src.fX / src.fZ, src.fY / src.fZ};
+}
+
// return false if infinity or NaN is generated; caller must check
bool SkConic::chopAt(SkScalar t, SkConic dst[2]) const {
- SkP3D tmp[3], tmp2[3];
+ SkPoint3 tmp[3], tmp2[3];
ratquad_mapTo3D(fPts, fW, tmp);
@@ -1012,9 +1005,9 @@ bool SkConic::chopAt(SkScalar t, SkConic dst[2]) const {
p3d_interp(&tmp[0].fZ, &tmp2[0].fZ, t);
dst[0].fPts[0] = fPts[0];
- tmp2[0].projectDown(&dst[0].fPts[1]);
- tmp2[1].projectDown(&dst[0].fPts[2]); dst[1].fPts[0] = dst[0].fPts[2];
- tmp2[2].projectDown(&dst[1].fPts[1]);
+ dst[0].fPts[1] = project_down(tmp2[0]);
+ dst[0].fPts[2] = project_down(tmp2[1]); dst[1].fPts[0] = dst[0].fPts[2];
+ dst[1].fPts[1] = project_down(tmp2[2]);
dst[1].fPts[2] = fPts[2];
// to put in "standard form", where w0 and w2 are both 1, we compute the
@@ -1341,11 +1334,11 @@ SkScalar SkConic::TransformW(const SkPoint pts[], SkScalar w,
return w;
}
- SkP3D src[3], dst[3];
+ SkPoint3 src[3], dst[3];
ratquad_mapTo3D(pts, w, src);
- matrix.mapHomogeneousPoints(&dst[0].fX, &src[0].fX, 3);
+ matrix.mapHomogeneousPoints(dst, src, 3);
// w' = sqrt(w1*w1/w0*w2)
SkScalar w0 = dst[0].fZ;
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp
index 5b1be84588..89bde4b42c 100644
--- a/src/core/SkMatrix.cpp
+++ b/src/core/SkMatrix.cpp
@@ -9,6 +9,7 @@
#include "SkMatrix.h"
#include "SkNx.h"
#include "SkPaint.h"
+#include "SkPoint3.h"
#include "SkRSXform.h"
#include "SkString.h"
#include <stddef.h>
@@ -1036,30 +1037,28 @@ const SkMatrix::MapPtsProc SkMatrix::gMapPtsProcs[] = {
///////////////////////////////////////////////////////////////////////////////
-void SkMatrix::mapHomogeneousPoints(SkScalar dst[], const SkScalar src[], int count) const {
+void SkMatrix::mapHomogeneousPoints(SkPoint3 dst[], const SkPoint3 src[], int count) const {
SkASSERT((dst && src && count > 0) || 0 == count);
// no partial overlap
- SkASSERT(src == dst || &dst[3*count] <= &src[0] || &src[3*count] <= &dst[0]);
+ SkASSERT(src == dst || &dst[count] <= &src[0] || &src[count] <= &dst[0]);
if (count > 0) {
if (this->isIdentity()) {
- memcpy(dst, src, 3*count*sizeof(SkScalar));
+ memcpy(dst, src, count * sizeof(SkPoint3));
return;
}
do {
- SkScalar sx = src[0];
- SkScalar sy = src[1];
- SkScalar sw = src[2];
- src += 3;
+ SkScalar sx = src->fX;
+ SkScalar sy = src->fY;
+ SkScalar sw = src->fZ;
+ src++;
SkScalar x = sdot(sx, fMat[kMScaleX], sy, fMat[kMSkewX], sw, fMat[kMTransX]);
SkScalar y = sdot(sx, fMat[kMSkewY], sy, fMat[kMScaleY], sw, fMat[kMTransY]);
SkScalar w = sdot(sx, fMat[kMPersp0], sy, fMat[kMPersp1], sw, fMat[kMPersp2]);
- dst[0] = x;
- dst[1] = y;
- dst[2] = w;
- dst += 3;
+ dst->set(x, y, w);
+ dst++;
} while (--count);
}
}