aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrQuad.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2018-05-21 12:54:39 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-05-21 18:21:08 +0000
commitbe3c1d22c7d3e18cee9f1697827392e16b436df2 (patch)
tree072c9c2e3a29a383b63d083f2483625a32b36401 /src/gpu/GrQuad.cpp
parent477094250cd55a38d4d796ab6c50eb57bdba65e1 (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.cpp40
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;
+ }
+ }
+}