Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: src/opts/SkMatrix_opts.h

Issue 1650653002: SkNx Load/store: take any pointer. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: simplify call sites Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/opts/SkColorCubeFilter_opts.h ('k') | src/opts/SkNx_avx.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkMatrix_opts_DEFINED 8 #ifndef SkMatrix_opts_DEFINED
9 #define SkMatrix_opts_DEFINED 9 #define SkMatrix_opts_DEFINED
10 10
11 #include "SkMatrix.h" 11 #include "SkMatrix.h"
12 #include "SkNx.h" 12 #include "SkNx.h"
13 13
14 namespace SK_OPTS_NS { 14 namespace SK_OPTS_NS {
15 15
16 static void matrix_translate(const SkMatrix& m, SkPoint* dst, const SkPoint* src , int count) { 16 static void matrix_translate(const SkMatrix& m, SkPoint* dst, const SkPoint* src , int count) {
17 SkASSERT(m.getType() <= SkMatrix::kTranslate_Mask); 17 SkASSERT(m.getType() <= SkMatrix::kTranslate_Mask);
18 if (count > 0) { 18 if (count > 0) {
19 SkScalar tx = m.getTranslateX(); 19 SkScalar tx = m.getTranslateX();
20 SkScalar ty = m.getTranslateY(); 20 SkScalar ty = m.getTranslateY();
21 if (count & 1) { 21 if (count & 1) {
22 dst->fX = src->fX + tx; 22 dst->fX = src->fX + tx;
23 dst->fY = src->fY + ty; 23 dst->fY = src->fY + ty;
24 src += 1; 24 src += 1;
25 dst += 1; 25 dst += 1;
26 } 26 }
27 Sk4s trans4(tx, ty, tx, ty); 27 Sk4s trans4(tx, ty, tx, ty);
28 count >>= 1; 28 count >>= 1;
29 if (count & 1) { 29 if (count & 1) {
30 (Sk4s::Load(&src->fX) + trans4).store(&dst->fX); 30 (Sk4s::Load(src) + trans4).store(dst);
31 src += 2; 31 src += 2;
32 dst += 2; 32 dst += 2;
33 } 33 }
34 count >>= 1; 34 count >>= 1;
35 for (int i = 0; i < count; ++i) { 35 for (int i = 0; i < count; ++i) {
36 (Sk4s::Load(&src[0].fX) + trans4).store(&dst[0].fX); 36 (Sk4s::Load(src+0) + trans4).store(dst+0);
37 (Sk4s::Load(&src[2].fX) + trans4).store(&dst[2].fX); 37 (Sk4s::Load(src+2) + trans4).store(dst+2);
38 src += 4; 38 src += 4;
39 dst += 4; 39 dst += 4;
40 } 40 }
41 } 41 }
42 } 42 }
43 43
44 static void matrix_scale_translate(const SkMatrix& m, SkPoint* dst, const SkPoin t* src, int count) { 44 static void matrix_scale_translate(const SkMatrix& m, SkPoint* dst, const SkPoin t* src, int count) {
45 SkASSERT(m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) ; 45 SkASSERT(m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) ;
46 if (count > 0) { 46 if (count > 0) {
47 SkScalar tx = m.getTranslateX(); 47 SkScalar tx = m.getTranslateX();
48 SkScalar ty = m.getTranslateY(); 48 SkScalar ty = m.getTranslateY();
49 SkScalar sx = m.getScaleX(); 49 SkScalar sx = m.getScaleX();
50 SkScalar sy = m.getScaleY(); 50 SkScalar sy = m.getScaleY();
51 if (count & 1) { 51 if (count & 1) {
52 dst->fX = src->fX * sx + tx; 52 dst->fX = src->fX * sx + tx;
53 dst->fY = src->fY * sy + ty; 53 dst->fY = src->fY * sy + ty;
54 src += 1; 54 src += 1;
55 dst += 1; 55 dst += 1;
56 } 56 }
57 Sk4s trans4(tx, ty, tx, ty); 57 Sk4s trans4(tx, ty, tx, ty);
58 Sk4s scale4(sx, sy, sx, sy); 58 Sk4s scale4(sx, sy, sx, sy);
59 count >>= 1; 59 count >>= 1;
60 if (count & 1) { 60 if (count & 1) {
61 (Sk4s::Load(&src->fX) * scale4 + trans4).store(&dst->fX); 61 (Sk4s::Load(src) * scale4 + trans4).store(dst);
62 src += 2; 62 src += 2;
63 dst += 2; 63 dst += 2;
64 } 64 }
65 count >>= 1; 65 count >>= 1;
66 for (int i = 0; i < count; ++i) { 66 for (int i = 0; i < count; ++i) {
67 (Sk4s::Load(&src[0].fX) * scale4 + trans4).store(&dst[0].fX); 67 (Sk4s::Load(src+0) * scale4 + trans4).store(dst+0);
68 (Sk4s::Load(&src[2].fX) * scale4 + trans4).store(&dst[2].fX); 68 (Sk4s::Load(src+2) * scale4 + trans4).store(dst+2);
69 src += 4; 69 src += 4;
70 dst += 4; 70 dst += 4;
71 } 71 }
72 } 72 }
73 } 73 }
74 74
75 static void matrix_affine(const SkMatrix& m, SkPoint* dst, const SkPoint* src, i nt count) { 75 static void matrix_affine(const SkMatrix& m, SkPoint* dst, const SkPoint* src, i nt count) {
76 SkASSERT(m.getType() != SkMatrix::kPerspective_Mask); 76 SkASSERT(m.getType() != SkMatrix::kPerspective_Mask);
77 if (count > 0) { 77 if (count > 0) {
78 SkScalar tx = m.getTranslateX(); 78 SkScalar tx = m.getTranslateX();
79 SkScalar ty = m.getTranslateY(); 79 SkScalar ty = m.getTranslateY();
80 SkScalar sx = m.getScaleX(); 80 SkScalar sx = m.getScaleX();
81 SkScalar sy = m.getScaleY(); 81 SkScalar sy = m.getScaleY();
82 SkScalar kx = m.getSkewX(); 82 SkScalar kx = m.getSkewX();
83 SkScalar ky = m.getSkewY(); 83 SkScalar ky = m.getSkewY();
84 if (count & 1) { 84 if (count & 1) {
85 dst->set(src->fX * sx + src->fY * kx + tx, 85 dst->set(src->fX * sx + src->fY * kx + tx,
86 src->fX * ky + src->fY * sy + ty); 86 src->fX * ky + src->fY * sy + ty);
87 src += 1; 87 src += 1;
88 dst += 1; 88 dst += 1;
89 } 89 }
90 Sk4s trans4(tx, ty, tx, ty); 90 Sk4s trans4(tx, ty, tx, ty);
91 Sk4s scale4(sx, sy, sx, sy); 91 Sk4s scale4(sx, sy, sx, sy);
92 Sk4s skew4(kx, ky, kx, ky); // applied to swizzle of src4 92 Sk4s skew4(kx, ky, kx, ky); // applied to swizzle of src4
93 count >>= 1; 93 count >>= 1;
94 for (int i = 0; i < count; ++i) { 94 for (int i = 0; i < count; ++i) {
95 Sk4s src4 = Sk4s::Load(&src->fX); 95 Sk4s src4 = Sk4s::Load(src);
96 Sk4s swz4(src[0].fY, src[0].fX, src[1].fY, src[1].fX); // need ABCD -> BADC 96 Sk4s swz4 = SkNx_shuffle<1,0,3,2>(src4); // y0 x0, y1 x1
97 (src4 * scale4 + swz4 * skew4 + trans4).store(&dst->fX); 97 (src4 * scale4 + swz4 * skew4 + trans4).store(dst);
98 src += 2; 98 src += 2;
99 dst += 2; 99 dst += 2;
100 } 100 }
101 } 101 }
102 } 102 }
103 103
104 } // namespace SK_OPTS_NS 104 } // namespace SK_OPTS_NS
105 105
106 #endif//SkMatrix_opts_DEFINED 106 #endif//SkMatrix_opts_DEFINED
OLDNEW
« no previous file with comments | « src/opts/SkColorCubeFilter_opts.h ('k') | src/opts/SkNx_avx.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698