diff options
author | Brian Salomon <bsalomon@google.com> | 2018-05-21 12:54:39 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-21 18:21:08 +0000 |
commit | be3c1d22c7d3e18cee9f1697827392e16b436df2 (patch) | |
tree | 072c9c2e3a29a383b63d083f2483625a32b36401 /src/gpu/GrQuad.cpp | |
parent | 477094250cd55a38d4d796ab6c50eb57bdba65e1 (diff) |
Add perspective support to GrTextureOp.
Bug: skia:
Change-Id: Idea4ffae37dc2c2f339af60a2b74ded476091758
Reviewed-on: https://skia-review.googlesource.com/127600
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/GrQuad.cpp')
-rw-r--r-- | src/gpu/GrQuad.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/gpu/GrQuad.cpp b/src/gpu/GrQuad.cpp index 724a827f21..93bd761970 100644 --- a/src/gpu/GrQuad.cpp +++ b/src/gpu/GrQuad.cpp @@ -43,3 +43,43 @@ GrQuad::GrQuad(const SkRect& rect, const SkMatrix& m) { y.store(fY); } } + +GrPerspQuad::GrPerspQuad(const SkRect& rect, const SkMatrix& m) { + SkMatrix::TypeMask tm = m.getType(); + if (tm <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) { + auto r = Sk4f::Load(&rect); + const Sk4f t(m.getTranslateX(), m.getTranslateY(), m.getTranslateX(), m.getTranslateY()); + if (tm <= SkMatrix::kTranslate_Mask) { + r += t; + } else { + const Sk4f s(m.getScaleX(), m.getScaleY(), m.getScaleX(), m.getScaleY()); + r = r * s + t; + } + SkNx_shuffle<0, 0, 2, 2>(r).store(fX); + SkNx_shuffle<1, 3, 1, 3>(r).store(fY); + fW[0] = fW[1] = fW[2] = fW[3] = 1.f; + fIW[0] = fIW[1] = fIW[2] = fIW[3] = 1.f; + } else { + Sk4f rx(rect.fLeft, rect.fLeft, rect.fRight, rect.fRight); + Sk4f ry(rect.fTop, rect.fBottom, rect.fTop, rect.fBottom); + Sk4f sx(m.getScaleX()); + Sk4f kx(m.getSkewX()); + Sk4f tx(m.getTranslateX()); + Sk4f ky(m.getSkewY()); + Sk4f sy(m.getScaleY()); + Sk4f ty(m.getTranslateY()); + SkNx_fma(sx, rx, SkNx_fma(kx, ry, tx)).store(fX); + SkNx_fma(ky, rx, SkNx_fma(sy, ry, ty)).store(fY); + if (m.hasPerspective()) { + Sk4f w0(m.getPerspX()); + Sk4f w1(m.getPerspY()); + Sk4f w2(m.get(SkMatrix::kMPersp2)); + auto w = SkNx_fma(w0, rx, SkNx_fma(w1, ry, w2)); + w.store(fW); + w.invert().store(fIW); + } else { + fW[0] = fW[1] = fW[2] = fW[3] = 1.f; + fIW[0] = fIW[1] = fIW[2] = fIW[3] = 1.f; + } + } +} |