diff options
author | Cary Clark <caryclark@skia.org> | 2017-10-18 11:46:18 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-18 16:09:46 +0000 |
commit | e4442cb0b537720ab32106b3b5353dbb78f11b26 (patch) | |
tree | c96d6669865bc85ef278a178d501bd60d29cc2eb /src/core/SkGeometry.cpp | |
parent | b4379132d12cd11e52944331487b045f1f32989d (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/SkGeometry.cpp')
-rw-r--r-- | src/core/SkGeometry.cpp | 31 |
1 files changed, 12 insertions, 19 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; |