blob: 8526c47cdbd12fc473b99ba397dfdf899f2710c7 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 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 */
reed93a12152015-03-16 10:08:34 -07007
reed@android.com0becfc5b2009-01-13 13:26:44 +00008#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
caryclark@google.com803eceb2012-06-06 12:09:34 +000010// declare functions externally to suppress warnings.
11void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
12 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080013 int count, SkPMColor* SK_RESTRICT colors);
caryclark@google.com803eceb2012-06-06 12:09:34 +000014void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s,
15 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080016 int count, SkPMColor* SK_RESTRICT colors);
caryclark@google.com803eceb2012-06-06 12:09:34 +000017void MAKENAME(_filter_DX)(const SkBitmapProcState& s,
18 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080019 int count, SkPMColor* SK_RESTRICT colors);
caryclark@google.com803eceb2012-06-06 12:09:34 +000020void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s,
21 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080022 int count, SkPMColor* SK_RESTRICT colors);
caryclark@google.com803eceb2012-06-06 12:09:34 +000023
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000024void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
25 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080026 int count, SkPMColor* SK_RESTRICT colors) {
halcanary96fcdcc2015-08-27 07:41:13 -070027 SkASSERT(count > 0 && colors != nullptr);
reed05a56472016-03-02 09:49:02 -080028 SkASSERT(kNone_SkFilterQuality == s.fFilterQuality);
reed@android.com8a1c16f2008-12-17 15:59:43 +000029 SkDEBUGCODE(CHECKSTATE(s);)
30
31#ifdef PREAMBLE
32 PREAMBLE(s);
33#endif
reedad7ae6c2015-06-04 14:12:25 -070034 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
35 size_t rb = s.fPixmap.rowBytes();
reed@android.com8a1c16f2008-12-17 15:59:43 +000036
37 uint32_t XY;
38 SRCTYPE src;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000039
scroggo@google.come5f48242013-02-25 21:47:41 +000040 for (int i = (count >> 1); i > 0; --i) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000041 XY = *xy++;
reedad7ae6c2015-06-04 14:12:25 -070042 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
43 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
reed@android.com8a1c16f2008-12-17 15:59:43 +000044 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
45 *colors++ = RETURNDST(src);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000046
reed@android.com8a1c16f2008-12-17 15:59:43 +000047 XY = *xy++;
reedad7ae6c2015-06-04 14:12:25 -070048 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
49 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
reed@android.com8a1c16f2008-12-17 15:59:43 +000050 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
51 *colors++ = RETURNDST(src);
52 }
53 if (count & 1) {
54 XY = *xy++;
reedad7ae6c2015-06-04 14:12:25 -070055 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() &&
56 (XY & 0xFFFF) < (unsigned)s.fPixmap.width());
reed@android.com8a1c16f2008-12-17 15:59:43 +000057 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
58 *colors++ = RETURNDST(src);
59 }
60
61#ifdef POSTAMBLE
62 POSTAMBLE(s);
63#endif
64}
65
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000066void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s,
67 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -080068 int count, SkPMColor* SK_RESTRICT colors) {
halcanary96fcdcc2015-08-27 07:41:13 -070069 SkASSERT(count > 0 && colors != nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
reed05a56472016-03-02 09:49:02 -080071 SkASSERT(kNone_SkFilterQuality == s.fFilterQuality);
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 SkDEBUGCODE(CHECKSTATE(s);)
73
74#ifdef PREAMBLE
75 PREAMBLE(s);
76#endif
reedad7ae6c2015-06-04 14:12:25 -070077 const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fPixmap.addr();
reed@android.com8a1c16f2008-12-17 15:59:43 +000078
reed@android.com0becfc5b2009-01-13 13:26:44 +000079 // buffer is y32, x16, x16, x16, x16, x16
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 // bump srcAddr to the proper row, since we're told Y never changes
reedad7ae6c2015-06-04 14:12:25 -070081 SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height());
reed@android.com8a1c16f2008-12-17 15:59:43 +000082 srcAddr = (const SRCTYPE*)((const char*)srcAddr +
reedad7ae6c2015-06-04 14:12:25 -070083 xy[0] * s.fPixmap.rowBytes());
reed@android.com152f7482009-08-07 19:14:34 +000084 xy += 1;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000085
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 SRCTYPE src;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000087
reedad7ae6c2015-06-04 14:12:25 -070088 if (1 == s.fPixmap.width()) {
reed@android.com0becfc5b2009-01-13 13:26:44 +000089 src = srcAddr[0];
reed4e5a7582016-01-05 05:10:33 -080090 SkPMColor dstValue = RETURNDST(src);
91 sk_memset32(colors, dstValue, count);
reed@android.com0becfc5b2009-01-13 13:26:44 +000092 } else {
93 int i;
reed@android.com0becfc5b2009-01-13 13:26:44 +000094 for (i = (count >> 2); i > 0; --i) {
reed@android.com152f7482009-08-07 19:14:34 +000095 uint32_t xx0 = *xy++;
96 uint32_t xx1 = *xy++;
97 SRCTYPE x0 = srcAddr[UNPACK_PRIMARY_SHORT(xx0)];
98 SRCTYPE x1 = srcAddr[UNPACK_SECONDARY_SHORT(xx0)];
99 SRCTYPE x2 = srcAddr[UNPACK_PRIMARY_SHORT(xx1)];
100 SRCTYPE x3 = srcAddr[UNPACK_SECONDARY_SHORT(xx1)];
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000101
reed@android.com152f7482009-08-07 19:14:34 +0000102 *colors++ = RETURNDST(x0);
103 *colors++ = RETURNDST(x1);
104 *colors++ = RETURNDST(x2);
105 *colors++ = RETURNDST(x3);
reed@android.com0becfc5b2009-01-13 13:26:44 +0000106 }
reed@android.com152f7482009-08-07 19:14:34 +0000107 const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy);
reed@android.com0becfc5b2009-01-13 13:26:44 +0000108 for (i = (count & 3); i > 0; --i) {
reedad7ae6c2015-06-04 14:12:25 -0700109 SkASSERT(*xx < (unsigned)s.fPixmap.width());
reed@android.com0becfc5b2009-01-13 13:26:44 +0000110 src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
111 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000113
reed@android.com8a1c16f2008-12-17 15:59:43 +0000114#ifdef POSTAMBLE
115 POSTAMBLE(s);
116#endif
117}
118
119///////////////////////////////////////////////////////////////////////////////
120
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000121void MAKENAME(_filter_DX)(const SkBitmapProcState& s,
122 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -0800123 int count, SkPMColor* SK_RESTRICT colors) {
halcanary96fcdcc2015-08-27 07:41:13 -0700124 SkASSERT(count > 0 && colors != nullptr);
reed05a56472016-03-02 09:49:02 -0800125 SkASSERT(s.fFilterQuality != kNone_SkFilterQuality);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000126 SkDEBUGCODE(CHECKSTATE(s);)
127
128#ifdef PREAMBLE
129 PREAMBLE(s);
130#endif
reedad7ae6c2015-06-04 14:12:25 -0700131 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
132 size_t rb = s.fPixmap.rowBytes();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000133 unsigned subY;
134 const SRCTYPE* SK_RESTRICT row0;
135 const SRCTYPE* SK_RESTRICT row1;
136
137 // setup row ptrs and update proc_table
138 {
139 uint32_t XY = *xy++;
140 unsigned y0 = XY >> 14;
141 row0 = (const SRCTYPE*)(srcAddr + (y0 >> 4) * rb);
142 row1 = (const SRCTYPE*)(srcAddr + (XY & 0x3FFF) * rb);
143 subY = y0 & 0xF;
144 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000145
reed@android.com8a1c16f2008-12-17 15:59:43 +0000146 do {
147 uint32_t XX = *xy++; // x0:14 | 4 | x1:14
148 unsigned x0 = XX >> 14;
149 unsigned x1 = XX & 0x3FFF;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000150 unsigned subX = x0 & 0xF;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151 x0 >>= 4;
152
reed@android.com152f7482009-08-07 19:14:34 +0000153 FILTER_PROC(subX, subY,
154 SRC_TO_FILTER(row0[x0]),
155 SRC_TO_FILTER(row0[x1]),
156 SRC_TO_FILTER(row1[x0]),
157 SRC_TO_FILTER(row1[x1]),
158 colors);
159 colors += 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160
161 } while (--count != 0);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000162
reed@android.com8a1c16f2008-12-17 15:59:43 +0000163#ifdef POSTAMBLE
164 POSTAMBLE(s);
165#endif
166}
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000167void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s,
168 const uint32_t* SK_RESTRICT xy,
reed4e5a7582016-01-05 05:10:33 -0800169 int count, SkPMColor* SK_RESTRICT colors) {
halcanary96fcdcc2015-08-27 07:41:13 -0700170 SkASSERT(count > 0 && colors != nullptr);
reed05a56472016-03-02 09:49:02 -0800171 SkASSERT(s.fFilterQuality != kNone_SkFilterQuality);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000172 SkDEBUGCODE(CHECKSTATE(s);)
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000173
reed@android.com8a1c16f2008-12-17 15:59:43 +0000174#ifdef PREAMBLE
175 PREAMBLE(s);
176#endif
reedad7ae6c2015-06-04 14:12:25 -0700177 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
178 size_t rb = s.fPixmap.rowBytes();
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000179
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180 do {
181 uint32_t data = *xy++;
182 unsigned y0 = data >> 14;
183 unsigned y1 = data & 0x3FFF;
184 unsigned subY = y0 & 0xF;
185 y0 >>= 4;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000186
reed@android.com8a1c16f2008-12-17 15:59:43 +0000187 data = *xy++;
188 unsigned x0 = data >> 14;
189 unsigned x1 = data & 0x3FFF;
190 unsigned subX = x0 & 0xF;
191 x0 >>= 4;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000192
reed@android.com8a1c16f2008-12-17 15:59:43 +0000193 const SRCTYPE* SK_RESTRICT row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
194 const SRCTYPE* SK_RESTRICT row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000195
reed@android.com152f7482009-08-07 19:14:34 +0000196 FILTER_PROC(subX, subY,
197 SRC_TO_FILTER(row0[x0]),
198 SRC_TO_FILTER(row0[x1]),
199 SRC_TO_FILTER(row1[x0]),
200 SRC_TO_FILTER(row1[x1]),
201 colors);
202 colors += 1;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000203 } while (--count != 0);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000204
reed@android.com8a1c16f2008-12-17 15:59:43 +0000205#ifdef POSTAMBLE
206 POSTAMBLE(s);
207#endif
208}
209
210#undef MAKENAME
reed@android.com8a1c16f2008-12-17 15:59:43 +0000211#undef SRCTYPE
212#undef CHECKSTATE
213#undef RETURNDST
214#undef SRC_TO_FILTER
215#undef FILTER_TO_DST
216
217#ifdef PREAMBLE
218 #undef PREAMBLE
219#endif
220#ifdef POSTAMBLE
221 #undef POSTAMBLE
222#endif
223
224#undef FILTER_PROC_TYPE
225#undef GET_FILTER_TABLE
226#undef GET_FILTER_ROW
227#undef GET_FILTER_ROW_PROC
228#undef GET_FILTER_PROC