aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrQuad.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2018-05-17 10:42:14 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-05-17 15:29:13 +0000
commita33b67c36bcdf70221c459a5fcfec48055f66505 (patch)
treee8608ec03cb34b14e31673aec600af84a0e81ec3 /src/gpu/GrQuad.cpp
parent6403b0e29055b8573eab20b5cb586c07785a2435 (diff)
Rewrite GrQuad to use separate arrays of x and y values to be Sk4f friendly.
Change-Id: Ie2ad197c5f17849fe6e034b60bc7ec18a00edb24 Reviewed-on: https://skia-review.googlesource.com/128842 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.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/gpu/GrQuad.cpp b/src/gpu/GrQuad.cpp
new file mode 100644
index 0000000000..724a827f21
--- /dev/null
+++ b/src/gpu/GrQuad.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrQuad.h"
+
+GrQuad::GrQuad(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);
+ } 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());
+ auto x = SkNx_fma(sx, rx, SkNx_fma(kx, ry, tx));
+ auto y = SkNx_fma(ky, rx, SkNx_fma(sy, ry, ty));
+ if (m.hasPerspective()) {
+ Sk4f w0(m.getPerspX());
+ Sk4f w1(m.getPerspY());
+ Sk4f w2(m.get(SkMatrix::kMPersp2));
+ auto iw = SkNx_fma(w0, rx, SkNx_fma(w1, ry, w2)).invert();
+ x *= iw;
+ y *= iw;
+ }
+ x.store(fX);
+ y.store(fY);
+ }
+}