blob: b3d3f618e0f0c21adf72fc06efe024796b97880e [file] [log] [blame]
mtklein4e8a09d2015-09-10 11:18:31 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkMatrix_opts_DEFINED
9#define SkMatrix_opts_DEFINED
10
11#include "SkMatrix.h"
12#include "SkNx.h"
13
14namespace SK_OPTS_NS {
15
16static void matrix_translate(const SkMatrix& m, SkPoint* dst, const SkPoint* src, int count) {
17 SkASSERT(m.getType() <= SkMatrix::kTranslate_Mask);
18 if (count > 0) {
19 SkScalar tx = m.getTranslateX();
20 SkScalar ty = m.getTranslateY();
21 if (count & 1) {
22 dst->fX = src->fX + tx;
23 dst->fY = src->fY + ty;
24 src += 1;
25 dst += 1;
26 }
27 Sk4s trans4(tx, ty, tx, ty);
28 count >>= 1;
29 if (count & 1) {
mtklein507ef6d2016-01-31 08:02:47 -080030 (Sk4s::Load(src) + trans4).store(dst);
mtklein4e8a09d2015-09-10 11:18:31 -070031 src += 2;
32 dst += 2;
33 }
34 count >>= 1;
35 for (int i = 0; i < count; ++i) {
mtklein507ef6d2016-01-31 08:02:47 -080036 (Sk4s::Load(src+0) + trans4).store(dst+0);
37 (Sk4s::Load(src+2) + trans4).store(dst+2);
mtklein4e8a09d2015-09-10 11:18:31 -070038 src += 4;
39 dst += 4;
40 }
41 }
42}
43
44static void matrix_scale_translate(const SkMatrix& m, SkPoint* dst, const SkPoint* src, int count) {
45 SkASSERT(m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask));
46 if (count > 0) {
47 SkScalar tx = m.getTranslateX();
48 SkScalar ty = m.getTranslateY();
49 SkScalar sx = m.getScaleX();
50 SkScalar sy = m.getScaleY();
51 if (count & 1) {
52 dst->fX = src->fX * sx + tx;
53 dst->fY = src->fY * sy + ty;
54 src += 1;
55 dst += 1;
56 }
57 Sk4s trans4(tx, ty, tx, ty);
58 Sk4s scale4(sx, sy, sx, sy);
59 count >>= 1;
60 if (count & 1) {
mtklein507ef6d2016-01-31 08:02:47 -080061 (Sk4s::Load(src) * scale4 + trans4).store(dst);
mtklein4e8a09d2015-09-10 11:18:31 -070062 src += 2;
63 dst += 2;
64 }
65 count >>= 1;
66 for (int i = 0; i < count; ++i) {
mtklein507ef6d2016-01-31 08:02:47 -080067 (Sk4s::Load(src+0) * scale4 + trans4).store(dst+0);
68 (Sk4s::Load(src+2) * scale4 + trans4).store(dst+2);
mtklein4e8a09d2015-09-10 11:18:31 -070069 src += 4;
70 dst += 4;
71 }
72 }
73}
74
75static void matrix_affine(const SkMatrix& m, SkPoint* dst, const SkPoint* src, int count) {
76 SkASSERT(m.getType() != SkMatrix::kPerspective_Mask);
77 if (count > 0) {
78 SkScalar tx = m.getTranslateX();
79 SkScalar ty = m.getTranslateY();
80 SkScalar sx = m.getScaleX();
81 SkScalar sy = m.getScaleY();
82 SkScalar kx = m.getSkewX();
83 SkScalar ky = m.getSkewY();
84 if (count & 1) {
85 dst->set(src->fX * sx + src->fY * kx + tx,
86 src->fX * ky + src->fY * sy + ty);
87 src += 1;
88 dst += 1;
89 }
90 Sk4s trans4(tx, ty, tx, ty);
91 Sk4s scale4(sx, sy, sx, sy);
mtklein83da2e22015-09-10 16:38:41 -070092 Sk4s skew4(kx, ky, kx, ky); // applied to swizzle of src4
mtklein4e8a09d2015-09-10 11:18:31 -070093 count >>= 1;
94 for (int i = 0; i < count; ++i) {
mtklein507ef6d2016-01-31 08:02:47 -080095 Sk4s src4 = Sk4s::Load(src);
96 Sk4s swz4 = SkNx_shuffle<1,0,3,2>(src4); // y0 x0, y1 x1
97 (src4 * scale4 + swz4 * skew4 + trans4).store(dst);
mtklein4e8a09d2015-09-10 11:18:31 -070098 src += 2;
99 dst += 2;
100 }
101 }
102}
103
104} // namespace SK_OPTS_NS
105
106#endif//SkMatrix_opts_DEFINED