diff options
author | Brian Salomon <bsalomon@google.com> | 2018-05-17 10:42:14 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-17 15:29:13 +0000 |
commit | a33b67c36bcdf70221c459a5fcfec48055f66505 (patch) | |
tree | e8608ec03cb34b14e31673aec600af84a0e81ec3 /src/gpu/GrQuad.cpp | |
parent | 6403b0e29055b8573eab20b5cb586c07785a2435 (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.cpp | 45 |
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); + } +} |