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

Side by Side Diff: src/codec/SkSwizzler.cpp

Issue 1557403002: Delete reallyHasAlpha() from SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebase Created 4 years, 11 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/codec/SkSwizzler.h ('k') | no next file » | 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 #include "SkCodecPriv.h" 8 #include "SkCodecPriv.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkSwizzler.h" 10 #include "SkSwizzler.h"
11 #include "SkTemplates.h" 11 #include "SkTemplates.h"
12 12
13 SkSwizzler::ResultAlpha SkSwizzler::GetResult(uint8_t zeroAlpha,
14 uint8_t maxAlpha) {
15 // In the transparent case, this returns 0x0000
16 // In the opaque case, this returns 0xFFFF
17 // If the row is neither transparent nor opaque, returns something else
18 return (((uint16_t) maxAlpha) << 8) | zeroAlpha;
19 }
20
21 // samples the row. Does not do anything else but sampling 13 // samples the row. Does not do anything else but sampling
22 static SkSwizzler::ResultAlpha sample565(void* SK_RESTRICT dstRow, const uint8_t * SK_RESTRICT src, 14 static void sample565(void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src,
23 int width, int bpp, int deltaSrc, int offset, const SkPMColor ctable[]){ 15 int width, int bpp, int deltaSrc, int offset, const SkPMColor ctable[]){
24 16
25 src += offset; 17 src += offset;
26 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow; 18 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow;
27 for (int x = 0; x < width; x++) { 19 for (int x = 0; x < width; x++) {
28 dst[x] = src[1] << 8 | src[0]; 20 dst[x] = src[1] << 8 | src[0];
29 src += deltaSrc; 21 src += deltaSrc;
30 } 22 }
31 // 565 is always opaque
32 return SkSwizzler::kOpaque_ResultAlpha;
33 } 23 }
34 24
35 // TODO (msarett): Investigate SIMD optimizations for swizzle routines. 25 // TODO (msarett): Investigate SIMD optimizations for swizzle routines.
36 26
37 // kBit 27 // kBit
38 // These routines exclusively choose between white and black 28 // These routines exclusively choose between white and black
39 29
40 #define GRAYSCALE_BLACK 0 30 #define GRAYSCALE_BLACK 0
41 #define GRAYSCALE_WHITE 0xFF 31 #define GRAYSCALE_WHITE 0xFF
42 32
43 33
44 // same as swizzle_bit_to_index and swizzle_bit_to_n32 except for value assigned to dst[x] 34 // same as swizzle_bit_to_index and swizzle_bit_to_n32 except for value assigned to dst[x]
45 static SkSwizzler::ResultAlpha swizzle_bit_to_grayscale( 35 static void swizzle_bit_to_grayscale(
46 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 36 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
47 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) { 37 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) {
48 38
49 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; 39 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow;
50 40
51 // increment src by byte offset and bitIndex by bit offset 41 // increment src by byte offset and bitIndex by bit offset
52 src += offset / 8; 42 src += offset / 8;
53 int bitIndex = offset % 8; 43 int bitIndex = offset % 8;
54 uint8_t currByte = *src; 44 uint8_t currByte = *src;
55 45
56 dst[0] = ((currByte >> (7-bitIndex)) & 1) ? GRAYSCALE_WHITE : GRAYSCALE_BLAC K; 46 dst[0] = ((currByte >> (7-bitIndex)) & 1) ? GRAYSCALE_WHITE : GRAYSCALE_BLAC K;
57 47
58 for (int x = 1; x < dstWidth; x++) { 48 for (int x = 1; x < dstWidth; x++) {
59 int bitOffset = bitIndex + deltaSrc; 49 int bitOffset = bitIndex + deltaSrc;
60 bitIndex = bitOffset % 8; 50 bitIndex = bitOffset % 8;
61 currByte = *(src += bitOffset / 8); 51 currByte = *(src += bitOffset / 8);
62 dst[x] = ((currByte >> (7-bitIndex)) & 1) ? GRAYSCALE_WHITE : GRAYSCALE_ BLACK; 52 dst[x] = ((currByte >> (7-bitIndex)) & 1) ? GRAYSCALE_WHITE : GRAYSCALE_ BLACK;
63 } 53 }
64
65 return SkSwizzler::kOpaque_ResultAlpha;
66 } 54 }
67 55
68 #undef GRAYSCALE_BLACK 56 #undef GRAYSCALE_BLACK
69 #undef GRAYSCALE_WHITE 57 #undef GRAYSCALE_WHITE
70 58
71 // same as swizzle_bit_to_grayscale and swizzle_bit_to_n32 except for value assi gned to dst[x] 59 // same as swizzle_bit_to_grayscale and swizzle_bit_to_n32 except for value assi gned to dst[x]
72 static SkSwizzler::ResultAlpha swizzle_bit_to_index( 60 static void swizzle_bit_to_index(
73 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 61 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
74 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) { 62 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) {
75 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; 63 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow;
76 64
77 // increment src by byte offset and bitIndex by bit offset 65 // increment src by byte offset and bitIndex by bit offset
78 src += offset / 8; 66 src += offset / 8;
79 int bitIndex = offset % 8; 67 int bitIndex = offset % 8;
80 uint8_t currByte = *src; 68 uint8_t currByte = *src;
81 69
82 dst[0] = ((currByte >> (7-bitIndex)) & 1); 70 dst[0] = ((currByte >> (7-bitIndex)) & 1);
83 71
84 for (int x = 1; x < dstWidth; x++) { 72 for (int x = 1; x < dstWidth; x++) {
85 int bitOffset = bitIndex + deltaSrc; 73 int bitOffset = bitIndex + deltaSrc;
86 bitIndex = bitOffset % 8; 74 bitIndex = bitOffset % 8;
87 currByte = *(src += bitOffset / 8); 75 currByte = *(src += bitOffset / 8);
88 dst[x] = ((currByte >> (7-bitIndex)) & 1); 76 dst[x] = ((currByte >> (7-bitIndex)) & 1);
89 } 77 }
90
91 return SkSwizzler::kOpaque_ResultAlpha;
92 } 78 }
93 79
94 // same as swizzle_bit_to_grayscale and swizzle_bit_to_index except for value as signed to dst[x] 80 // same as swizzle_bit_to_grayscale and swizzle_bit_to_index except for value as signed to dst[x]
95 static SkSwizzler::ResultAlpha swizzle_bit_to_n32( 81 static void swizzle_bit_to_n32(
96 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 82 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
97 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) { 83 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) {
98 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow; 84 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow;
99 85
100 // increment src by byte offset and bitIndex by bit offset 86 // increment src by byte offset and bitIndex by bit offset
101 src += offset / 8; 87 src += offset / 8;
102 int bitIndex = offset % 8; 88 int bitIndex = offset % 8;
103 uint8_t currByte = *src; 89 uint8_t currByte = *src;
104 90
105 dst[0] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBLACK; 91 dst[0] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBLACK;
106 92
107 for (int x = 1; x < dstWidth; x++) { 93 for (int x = 1; x < dstWidth; x++) {
108 int bitOffset = bitIndex + deltaSrc; 94 int bitOffset = bitIndex + deltaSrc;
109 bitIndex = bitOffset % 8; 95 bitIndex = bitOffset % 8;
110 currByte = *(src += bitOffset / 8); 96 currByte = *(src += bitOffset / 8);
111 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBL ACK; 97 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBL ACK;
112 } 98 }
113
114 return SkSwizzler::kOpaque_ResultAlpha;
115 } 99 }
116 100
117 #define RGB565_BLACK 0 101 #define RGB565_BLACK 0
118 #define RGB565_WHITE 0xFFFF 102 #define RGB565_WHITE 0xFFFF
119 103
120 static SkSwizzler::ResultAlpha swizzle_bit_to_565( 104 static void swizzle_bit_to_565(
121 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 105 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
122 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) { 106 int bpp, int deltaSrc, int offset, const SkPMColor* /*ctable*/) {
123 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow; 107 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow;
124 108
125 // increment src by byte offset and bitIndex by bit offset 109 // increment src by byte offset and bitIndex by bit offset
126 src += offset / 8; 110 src += offset / 8;
127 int bitIndex = offset % 8; 111 int bitIndex = offset % 8;
128 uint8_t currByte = *src; 112 uint8_t currByte = *src;
129 113
130 dst[0] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLACK; 114 dst[0] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLACK;
131 115
132 for (int x = 1; x < dstWidth; x++) { 116 for (int x = 1; x < dstWidth; x++) {
133 int bitOffset = bitIndex + deltaSrc; 117 int bitOffset = bitIndex + deltaSrc;
134 bitIndex = bitOffset % 8; 118 bitIndex = bitOffset % 8;
135 currByte = *(src += bitOffset / 8); 119 currByte = *(src += bitOffset / 8);
136 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLAC K; 120 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLAC K;
137 } 121 }
138
139 return SkSwizzler::kOpaque_ResultAlpha;
140 } 122 }
141 123
142 #undef RGB565_BLACK 124 #undef RGB565_BLACK
143 #undef RGB565_WHITE 125 #undef RGB565_WHITE
144 126
145 // kIndex1, kIndex2, kIndex4 127 // kIndex1, kIndex2, kIndex4
146 128
147 static SkSwizzler::ResultAlpha swizzle_small_index_to_index( 129 static void swizzle_small_index_to_index(
148 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 130 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
149 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 131 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
150 132
151 uint8_t* dst = (uint8_t*) dstRow; 133 uint8_t* dst = (uint8_t*) dstRow;
152 INIT_RESULT_ALPHA;
153 src += offset / 8; 134 src += offset / 8;
154 int bitIndex = offset % 8; 135 int bitIndex = offset % 8;
155 uint8_t currByte = *src; 136 uint8_t currByte = *src;
156 const uint8_t mask = (1 << bpp) - 1; 137 const uint8_t mask = (1 << bpp) - 1;
157 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask; 138 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask;
158 dst[0] = index; 139 dst[0] = index;
159 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT);
160 140
161 for (int x = 1; x < dstWidth; x++) { 141 for (int x = 1; x < dstWidth; x++) {
162 int bitOffset = bitIndex + deltaSrc; 142 int bitOffset = bitIndex + deltaSrc;
163 bitIndex = bitOffset % 8; 143 bitIndex = bitOffset % 8;
164 currByte = *(src += bitOffset / 8); 144 currByte = *(src += bitOffset / 8);
165 index = (currByte >> (8 - bpp - bitIndex)) & mask; 145 index = (currByte >> (8 - bpp - bitIndex)) & mask;
166 dst[x] = index; 146 dst[x] = index;
167 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT);
168 } 147 }
169 return COMPUTE_RESULT_ALPHA;
170 } 148 }
171 149
172 static SkSwizzler::ResultAlpha swizzle_small_index_to_565( 150 static void swizzle_small_index_to_565(
173 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 151 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
174 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 152 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
175 153
176 uint16_t* dst = (uint16_t*) dstRow; 154 uint16_t* dst = (uint16_t*) dstRow;
177 src += offset / 8; 155 src += offset / 8;
178 int bitIndex = offset % 8; 156 int bitIndex = offset % 8;
179 uint8_t currByte = *src; 157 uint8_t currByte = *src;
180 const uint8_t mask = (1 << bpp) - 1; 158 const uint8_t mask = (1 << bpp) - 1;
181 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask; 159 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask;
182 dst[0] = SkPixel32ToPixel16(ctable[index]); 160 dst[0] = SkPixel32ToPixel16(ctable[index]);
183 161
184 for (int x = 1; x < dstWidth; x++) { 162 for (int x = 1; x < dstWidth; x++) {
185 int bitOffset = bitIndex + deltaSrc; 163 int bitOffset = bitIndex + deltaSrc;
186 bitIndex = bitOffset % 8; 164 bitIndex = bitOffset % 8;
187 currByte = *(src += bitOffset / 8); 165 currByte = *(src += bitOffset / 8);
188 index = (currByte >> (8 - bpp - bitIndex)) & mask; 166 index = (currByte >> (8 - bpp - bitIndex)) & mask;
189 dst[x] = SkPixel32ToPixel16(ctable[index]); 167 dst[x] = SkPixel32ToPixel16(ctable[index]);
190 } 168 }
191 return SkAlphaType::kOpaque_SkAlphaType;
192 } 169 }
193 170
194 static SkSwizzler::ResultAlpha swizzle_small_index_to_n32( 171 static void swizzle_small_index_to_n32(
195 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 172 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
196 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 173 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
197 174
198 SkPMColor* dst = (SkPMColor*) dstRow; 175 SkPMColor* dst = (SkPMColor*) dstRow;
199 INIT_RESULT_ALPHA;
200 src += offset / 8; 176 src += offset / 8;
201 int bitIndex = offset % 8; 177 int bitIndex = offset % 8;
202 uint8_t currByte = *src; 178 uint8_t currByte = *src;
203 const uint8_t mask = (1 << bpp) - 1; 179 const uint8_t mask = (1 << bpp) - 1;
204 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask; 180 uint8_t index = (currByte >> (8 - bpp - bitIndex)) & mask;
205 dst[0] = ctable[index]; 181 dst[0] = ctable[index];
206 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT);
207 182
208 for (int x = 1; x < dstWidth; x++) { 183 for (int x = 1; x < dstWidth; x++) {
209 int bitOffset = bitIndex + deltaSrc; 184 int bitOffset = bitIndex + deltaSrc;
210 bitIndex = bitOffset % 8; 185 bitIndex = bitOffset % 8;
211 currByte = *(src += bitOffset / 8); 186 currByte = *(src += bitOffset / 8);
212 index = (currByte >> (8 - bpp - bitIndex)) & mask; 187 index = (currByte >> (8 - bpp - bitIndex)) & mask;
213 dst[x] = ctable[index]; 188 dst[x] = ctable[index];
214 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT);
215 } 189 }
216 return COMPUTE_RESULT_ALPHA;
217 } 190 }
218 191
219 // kIndex 192 // kIndex
220 193
221 static SkSwizzler::ResultAlpha swizzle_index_to_index( 194 static void swizzle_index_to_index(
222 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 195 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
223 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 196 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
224 197
225 src += offset; 198 src += offset;
226 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; 199 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow;
227 INIT_RESULT_ALPHA;
228 // TODO (msarett): Should we skip the loop here and guess that the row is op aque/not opaque?
229 // SkScaledBitmap sampler just guesses that it is opaque. T his is dangerous
230 // and probably wrong since gif and bmp (rarely) may have al pha.
231 if (1 == deltaSrc) { 200 if (1 == deltaSrc) {
232 memcpy(dst, src, dstWidth); 201 memcpy(dst, src, dstWidth);
233 for (int x = 0; x < dstWidth; x++) {
234 UPDATE_RESULT_ALPHA(ctable[src[x]] >> SK_A32_SHIFT);
235 }
236 } else { 202 } else {
237 for (int x = 0; x < dstWidth; x++) { 203 for (int x = 0; x < dstWidth; x++) {
238 dst[x] = *src; 204 dst[x] = *src;
239 UPDATE_RESULT_ALPHA(ctable[*src] >> SK_A32_SHIFT);
240 src += deltaSrc; 205 src += deltaSrc;
241 } 206 }
242 } 207 }
243 return COMPUTE_RESULT_ALPHA;
244 } 208 }
245 209
246 static SkSwizzler::ResultAlpha swizzle_index_to_n32( 210 static void swizzle_index_to_n32(
247 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 211 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
248 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 212 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
249 213
250 src += offset; 214 src += offset;
251 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 215 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
252 INIT_RESULT_ALPHA;
253 for (int x = 0; x < dstWidth; x++) { 216 for (int x = 0; x < dstWidth; x++) {
254 SkPMColor c = ctable[*src]; 217 SkPMColor c = ctable[*src];
255 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT);
256 dst[x] = c; 218 dst[x] = c;
257 src += deltaSrc; 219 src += deltaSrc;
258 } 220 }
259 return COMPUTE_RESULT_ALPHA;
260 } 221 }
261 222
262 static SkSwizzler::ResultAlpha swizzle_index_to_n32_skipZ( 223 static void swizzle_index_to_n32_skipZ(
263 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 224 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
264 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 225 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
265 226
266 src += offset; 227 src += offset;
267 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 228 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
268 INIT_RESULT_ALPHA;
269 for (int x = 0; x < dstWidth; x++) { 229 for (int x = 0; x < dstWidth; x++) {
270 SkPMColor c = ctable[*src]; 230 SkPMColor c = ctable[*src];
271 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT);
272 if (c != 0) { 231 if (c != 0) {
273 dst[x] = c; 232 dst[x] = c;
274 } 233 }
275 src += deltaSrc; 234 src += deltaSrc;
276 } 235 }
277 return COMPUTE_RESULT_ALPHA;
278 } 236 }
279 237
280 static SkSwizzler::ResultAlpha swizzle_index_to_565( 238 static void swizzle_index_to_565(
281 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 239 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
282 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { 240 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) {
283 // FIXME: Support dithering? Requires knowing y, which I think is a bigger
284 // change.
285 src += offset; 241 src += offset;
286 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; 242 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
287 for (int x = 0; x < dstWidth; x++) { 243 for (int x = 0; x < dstWidth; x++) {
288 dst[x] = SkPixel32ToPixel16(ctable[*src]); 244 dst[x] = SkPixel32ToPixel16(ctable[*src]);
289 src += deltaSrc; 245 src += deltaSrc;
290 } 246 }
291 return SkSwizzler::kOpaque_ResultAlpha;
292 } 247 }
293 248
294
295 #undef A32_MASK_IN_PLACE
296
297 // kGray 249 // kGray
298 250
299 static SkSwizzler::ResultAlpha swizzle_gray_to_n32( 251 static void swizzle_gray_to_n32(
300 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 252 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
301 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 253 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
302 254
303 src += offset; 255 src += offset;
304 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 256 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
305 for (int x = 0; x < dstWidth; x++) { 257 for (int x = 0; x < dstWidth; x++) {
306 dst[x] = SkPackARGB32NoCheck(0xFF, *src, *src, *src); 258 dst[x] = SkPackARGB32NoCheck(0xFF, *src, *src, *src);
307 src += deltaSrc; 259 src += deltaSrc;
308 } 260 }
309 return SkSwizzler::kOpaque_ResultAlpha;
310 } 261 }
311 262
312 static SkSwizzler::ResultAlpha swizzle_gray_to_gray( 263 static void swizzle_gray_to_gray(
313 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 264 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
314 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 265 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
315 266
316 src += offset; 267 src += offset;
317 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; 268 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow;
318 if (1 == deltaSrc) { 269 if (1 == deltaSrc) {
319 memcpy(dstRow, src, dstWidth); 270 memcpy(dstRow, src, dstWidth);
320 } else { 271 } else {
321 for (int x = 0; x < dstWidth; x++) { 272 for (int x = 0; x < dstWidth; x++) {
322 dst[x] = src[0]; 273 dst[x] = src[0];
323 src += deltaSrc; 274 src += deltaSrc;
324 } 275 }
325 } 276 }
326 return SkSwizzler::kOpaque_ResultAlpha;
327 } 277 }
328 278
329 static SkSwizzler::ResultAlpha swizzle_gray_to_565( 279 static void swizzle_gray_to_565(
330 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 280 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
331 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { 281 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) {
332 // FIXME: Support dithering? 282
333 src += offset; 283 src += offset;
334 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; 284 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
335 for (int x = 0; x < dstWidth; x++) { 285 for (int x = 0; x < dstWidth; x++) {
336 dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]); 286 dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]);
337 src += deltaSrc; 287 src += deltaSrc;
338 } 288 }
339 return SkSwizzler::kOpaque_ResultAlpha;
340 } 289 }
341 290
342 // kBGRX 291 // kBGRX
343 292
344 static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32( 293 static void swizzle_bgrx_to_n32(
345 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 294 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
346 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 295 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
347 296
348 src += offset; 297 src += offset;
349 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 298 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
350 for (int x = 0; x < dstWidth; x++) { 299 for (int x = 0; x < dstWidth; x++) {
351 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); 300 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]);
352 src += deltaSrc; 301 src += deltaSrc;
353 } 302 }
354 return SkSwizzler::kOpaque_ResultAlpha;
355 } 303 }
356 304
357 static SkSwizzler::ResultAlpha swizzle_bgrx_to_565( 305 static void swizzle_bgrx_to_565(
358 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 306 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
359 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 307 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
360 // FIXME: Support dithering? 308
361 src += offset; 309 src += offset;
362 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; 310 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
363 for (int x = 0; x < dstWidth; x++) { 311 for (int x = 0; x < dstWidth; x++) {
364 dst[x] = SkPack888ToRGB16(src[2], src[1], src[0]); 312 dst[x] = SkPack888ToRGB16(src[2], src[1], src[0]);
365 src += deltaSrc; 313 src += deltaSrc;
366 } 314 }
367 return SkSwizzler::kOpaque_ResultAlpha;
368 } 315 }
369 316
370 // kBGRA 317 // kBGRA
371 318
372 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_unpremul( 319 static void swizzle_bgra_to_n32_unpremul(
373 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 320 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
374 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 321 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
375 322
376 src += offset; 323 src += offset;
377 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 324 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
378 INIT_RESULT_ALPHA;
379 for (int x = 0; x < dstWidth; x++) { 325 for (int x = 0; x < dstWidth; x++) {
380 uint8_t alpha = src[3]; 326 uint8_t alpha = src[3];
381 UPDATE_RESULT_ALPHA(alpha);
382 dst[x] = SkPackARGB32NoCheck(alpha, src[2], src[1], src[0]); 327 dst[x] = SkPackARGB32NoCheck(alpha, src[2], src[1], src[0]);
383 src += deltaSrc; 328 src += deltaSrc;
384 } 329 }
385 return COMPUTE_RESULT_ALPHA;
386 } 330 }
387 331
388 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_premul( 332 static void swizzle_bgra_to_n32_premul(
389 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 333 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
390 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 334 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
391 335
392 src += offset; 336 src += offset;
393 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 337 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
394 INIT_RESULT_ALPHA;
395 for (int x = 0; x < dstWidth; x++) { 338 for (int x = 0; x < dstWidth; x++) {
396 uint8_t alpha = src[3]; 339 uint8_t alpha = src[3];
397 UPDATE_RESULT_ALPHA(alpha);
398 dst[x] = SkPremultiplyARGBInline(alpha, src[2], src[1], src[0]); 340 dst[x] = SkPremultiplyARGBInline(alpha, src[2], src[1], src[0]);
399 src += deltaSrc; 341 src += deltaSrc;
400 } 342 }
401 return COMPUTE_RESULT_ALPHA;
402 } 343 }
403 344
404 // kRGBX 345 // kRGBX
405 static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32( 346 static void swizzle_rgbx_to_n32(
406 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 347 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
407 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 348 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
408 349
409 src += offset; 350 src += offset;
410 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 351 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
411 for (int x = 0; x < dstWidth; x++) { 352 for (int x = 0; x < dstWidth; x++) {
412 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); 353 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]);
413 src += deltaSrc; 354 src += deltaSrc;
414 } 355 }
415 return SkSwizzler::kOpaque_ResultAlpha;
416 } 356 }
417 357
418 static SkSwizzler::ResultAlpha swizzle_rgbx_to_565( 358 static void swizzle_rgbx_to_565(
419 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 359 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
420 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { 360 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) {
421 // FIXME: Support dithering? 361
422 src += offset; 362 src += offset;
423 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; 363 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
424 for (int x = 0; x < dstWidth; x++) { 364 for (int x = 0; x < dstWidth; x++) {
425 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); 365 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]);
426 src += deltaSrc; 366 src += deltaSrc;
427 } 367 }
428 return SkSwizzler::kOpaque_ResultAlpha;
429 } 368 }
430 369
431 370
432 // kRGBA 371 // kRGBA
433 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( 372 static void swizzle_rgba_to_n32_premul(
434 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 373 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
435 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 374 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
436 375
437 src += offset; 376 src += offset;
438 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 377 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
439 INIT_RESULT_ALPHA;
440 for (int x = 0; x < dstWidth; x++) { 378 for (int x = 0; x < dstWidth; x++) {
441 unsigned alpha = src[3]; 379 unsigned alpha = src[3];
442 UPDATE_RESULT_ALPHA(alpha);
443 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]); 380 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]);
444 src += deltaSrc; 381 src += deltaSrc;
445 } 382 }
446 return COMPUTE_RESULT_ALPHA;
447 } 383 }
448 384
449 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_unpremul( 385 static void swizzle_rgba_to_n32_unpremul(
450 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 386 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
451 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 387 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
452 388
453 src += offset; 389 src += offset;
454 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); 390 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow);
455 INIT_RESULT_ALPHA;
456 for (int x = 0; x < dstWidth; x++) { 391 for (int x = 0; x < dstWidth; x++) {
457 unsigned alpha = src[3]; 392 unsigned alpha = src[3];
458 UPDATE_RESULT_ALPHA(alpha);
459 dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]); 393 dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]);
460 src += deltaSrc; 394 src += deltaSrc;
461 } 395 }
462 return COMPUTE_RESULT_ALPHA;
463 } 396 }
464 397
465 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul_skipZ( 398 static void swizzle_rgba_to_n32_premul_skipZ(
466 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 399 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
467 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 400 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
468 401
469 src += offset; 402 src += offset;
470 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 403 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
471 INIT_RESULT_ALPHA;
472 for (int x = 0; x < dstWidth; x++) { 404 for (int x = 0; x < dstWidth; x++) {
473 unsigned alpha = src[3]; 405 unsigned alpha = src[3];
474 UPDATE_RESULT_ALPHA(alpha);
475 if (0 != alpha) { 406 if (0 != alpha) {
476 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]); 407 dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]);
477 } 408 }
478 src += deltaSrc; 409 src += deltaSrc;
479 } 410 }
480 return COMPUTE_RESULT_ALPHA;
481 } 411 }
482 412
483 // kCMYK 413 // kCMYK
484 // 414 //
485 // CMYK is stored as four bytes per pixel. 415 // CMYK is stored as four bytes per pixel.
486 // 416 //
487 // We will implement a crude conversion from CMYK -> RGB using formulas 417 // We will implement a crude conversion from CMYK -> RGB using formulas
488 // from easyrgb.com. 418 // from easyrgb.com.
489 // 419 //
490 // CMYK -> CMY 420 // CMYK -> CMY
(...skipping 27 matching lines...) Expand all
518 // B = Y * K * 255 448 // B = Y * K * 255
519 // 449 //
520 // As a final note, we have treated the CMYK values as if they were on 450 // As a final note, we have treated the CMYK values as if they were on
521 // a scale from 0-1, when in fact they are 8-bit ints scaling from 0-255. 451 // a scale from 0-1, when in fact they are 8-bit ints scaling from 0-255.
522 // We must divide each CMYK component by 255 to obtain the true conversion 452 // We must divide each CMYK component by 255 to obtain the true conversion
523 // we should perform. 453 // we should perform.
524 // CMYK -> RGB 454 // CMYK -> RGB
525 // R = C * K / 255 455 // R = C * K / 255
526 // G = M * K / 255 456 // G = M * K / 255
527 // B = Y * K / 255 457 // B = Y * K / 255
528 static SkSwizzler::ResultAlpha swizzle_cmyk_to_n32( 458 static void swizzle_cmyk_to_n32(
529 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 459 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
530 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 460 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
531 461
532 src += offset; 462 src += offset;
533 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 463 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
534 for (int x = 0; x < dstWidth; x++) { 464 for (int x = 0; x < dstWidth; x++) {
535 const uint8_t r = SkMulDiv255Round(src[0], src[3]); 465 const uint8_t r = SkMulDiv255Round(src[0], src[3]);
536 const uint8_t g = SkMulDiv255Round(src[1], src[3]); 466 const uint8_t g = SkMulDiv255Round(src[1], src[3]);
537 const uint8_t b = SkMulDiv255Round(src[2], src[3]); 467 const uint8_t b = SkMulDiv255Round(src[2], src[3]);
538 468
539 dst[x] = SkPackARGB32NoCheck(0xFF, r, g, b); 469 dst[x] = SkPackARGB32NoCheck(0xFF, r, g, b);
540 src += deltaSrc; 470 src += deltaSrc;
541 } 471 }
542
543 // CMYK is always opaque
544 return SkSwizzler::kOpaque_ResultAlpha;
545 } 472 }
546 473
547 static SkSwizzler::ResultAlpha swizzle_cmyk_to_565( 474 static void swizzle_cmyk_to_565(
548 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 475 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
549 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 476 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
550 477
551 src += offset; 478 src += offset;
552 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; 479 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
553 for (int x = 0; x < dstWidth; x++) { 480 for (int x = 0; x < dstWidth; x++) {
554 const uint8_t r = SkMulDiv255Round(src[0], src[3]); 481 const uint8_t r = SkMulDiv255Round(src[0], src[3]);
555 const uint8_t g = SkMulDiv255Round(src[1], src[3]); 482 const uint8_t g = SkMulDiv255Round(src[1], src[3]);
556 const uint8_t b = SkMulDiv255Round(src[2], src[3]); 483 const uint8_t b = SkMulDiv255Round(src[2], src[3]);
557 484
558 dst[x] = SkPack888ToRGB16(r, g, b); 485 dst[x] = SkPack888ToRGB16(r, g, b);
559 src += deltaSrc; 486 src += deltaSrc;
560 } 487 }
561
562 // CMYK is always opaque
563 return SkSwizzler::kOpaque_ResultAlpha;
564 } 488 }
565 489
566 /** 490 /**
567 FIXME: This was my idea to cheat in order to continue taking advantage of sk ipping zeroes. 491 FIXME: This was my idea to cheat in order to continue taking advantage of sk ipping zeroes.
568 This would be fine for drawing normally, but not for drawing with transfer m odes. Being 492 This would be fine for drawing normally, but not for drawing with transfer m odes. Being
569 honest means we can draw correctly with transfer modes, with the cost of not being able 493 honest means we can draw correctly with transfer modes, with the cost of not being able
570 to take advantage of Android's free unwritten pages. Something to keep in mi nd when we 494 to take advantage of Android's free unwritten pages. Something to keep in mi nd when we
571 decide whether to switch to unpremul default. 495 decide whether to switch to unpremul default.
572 static bool swizzle_rgba_to_n32_unpremul_skipZ(void* SK_RESTRICT dstRow, 496 static bool swizzle_rgba_to_n32_unpremul_skipZ(void* SK_RESTRICT dstRow,
573 const uint8_t* SK_RESTRICT src, 497 const uint8_t* SK_RESTRICT src,
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // way to report failure? 745 // way to report failure?
822 fSampleX = sampleX; 746 fSampleX = sampleX;
823 fSrcOffsetUnits = (get_start_coord(sampleX) + fSrcOffset) * fSrcBPP; 747 fSrcOffsetUnits = (get_start_coord(sampleX) + fSrcOffset) * fSrcBPP;
824 fDstOffsetBytes = (fDstOffset / sampleX) * fDstBPP; 748 fDstOffsetBytes = (fDstOffset / sampleX) * fDstBPP;
825 fSwizzleWidth = get_scaled_dimension(fSrcWidth, sampleX); 749 fSwizzleWidth = get_scaled_dimension(fSrcWidth, sampleX);
826 fAllocatedWidth = get_scaled_dimension(fDstWidth, sampleX); 750 fAllocatedWidth = get_scaled_dimension(fDstWidth, sampleX);
827 751
828 return fAllocatedWidth; 752 return fAllocatedWidth;
829 } 753 }
830 754
831 SkSwizzler::ResultAlpha SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRIC T src) { 755 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) {
832 SkASSERT(nullptr != dst && nullptr != src); 756 SkASSERT(nullptr != dst && nullptr != src);
833 return fRowProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth , fSrcBPP, 757 fRowProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fSrcB PP,
834 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); 758 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable);
835 } 759 }
OLDNEW
« no previous file with comments | « src/codec/SkSwizzler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698