OLD | NEW |
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 #include "SkUtils.h" | 12 #include "SkUtils.h" |
13 | 13 |
14 SkSwizzler::ResultAlpha SkSwizzler::GetResult(uint8_t zeroAlpha, | 14 SkSwizzler::ResultAlpha SkSwizzler::GetResult(uint8_t zeroAlpha, |
15 uint8_t maxAlpha) { | 15 uint8_t maxAlpha) { |
16 // In the transparent case, this returns 0x0000 | 16 // In the transparent case, this returns 0x0000 |
17 // In the opaque case, this returns 0xFFFF | 17 // In the opaque case, this returns 0xFFFF |
18 // If the row is neither transparent nor opaque, returns something else | 18 // If the row is neither transparent nor opaque, returns something else |
19 return (((uint16_t) maxAlpha) << 8) | zeroAlpha; | 19 return (((uint16_t) maxAlpha) << 8) | zeroAlpha; |
20 } | 20 } |
21 | 21 |
22 // kIndex1, kIndex2, kIndex4 | 22 // kIndex1, kIndex2, kIndex4 |
23 | 23 |
24 static SkSwizzler::ResultAlpha swizzle_small_index_to_index( | 24 static SkSwizzler::ResultAlpha swizzle_small_index_to_index( |
25 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 25 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
26 int bitsPerPixel, int y, const SkPMColor ctable[]) { | 26 int bitsPerPixel, const SkPMColor ctable[]) { |
27 | 27 |
28 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; | 28 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; |
29 INIT_RESULT_ALPHA; | 29 INIT_RESULT_ALPHA; |
30 const uint32_t pixelsPerByte = 8 / bitsPerPixel; | 30 const uint32_t pixelsPerByte = 8 / bitsPerPixel; |
31 const size_t rowBytes = compute_row_bytes_ppb(width, pixelsPerByte); | 31 const size_t rowBytes = compute_row_bytes_ppb(width, pixelsPerByte); |
32 const uint8_t mask = (1 << bitsPerPixel) - 1; | 32 const uint8_t mask = (1 << bitsPerPixel) - 1; |
33 int x = 0; | 33 int x = 0; |
34 for (uint32_t byte = 0; byte < rowBytes; byte++) { | 34 for (uint32_t byte = 0; byte < rowBytes; byte++) { |
35 uint8_t pixelData = src[byte]; | 35 uint8_t pixelData = src[byte]; |
36 for (uint32_t p = 0; p < pixelsPerByte && x < width; p++) { | 36 for (uint32_t p = 0; p < pixelsPerByte && x < width; p++) { |
37 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask; | 37 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask; |
38 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT); | 38 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT); |
39 dst[x] = index; | 39 dst[x] = index; |
40 pixelData <<= bitsPerPixel; | 40 pixelData <<= bitsPerPixel; |
41 x++; | 41 x++; |
42 } | 42 } |
43 } | 43 } |
44 return COMPUTE_RESULT_ALPHA; | 44 return COMPUTE_RESULT_ALPHA; |
45 } | 45 } |
46 | 46 |
47 static SkSwizzler::ResultAlpha swizzle_small_index_to_n32( | 47 static SkSwizzler::ResultAlpha swizzle_small_index_to_n32( |
48 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 48 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
49 int bitsPerPixel, int y, const SkPMColor ctable[]) { | 49 int bitsPerPixel, const SkPMColor ctable[]) { |
50 | 50 |
51 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow; | 51 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow; |
52 INIT_RESULT_ALPHA; | 52 INIT_RESULT_ALPHA; |
53 const uint32_t pixelsPerByte = 8 / bitsPerPixel; | 53 const uint32_t pixelsPerByte = 8 / bitsPerPixel; |
54 const size_t rowBytes = compute_row_bytes_ppb(width, pixelsPerByte); | 54 const size_t rowBytes = compute_row_bytes_ppb(width, pixelsPerByte); |
55 const uint8_t mask = (1 << bitsPerPixel) - 1; | 55 const uint8_t mask = (1 << bitsPerPixel) - 1; |
56 int x = 0; | 56 int x = 0; |
57 for (uint32_t byte = 0; byte < rowBytes; byte++) { | 57 for (uint32_t byte = 0; byte < rowBytes; byte++) { |
58 uint8_t pixelData = src[byte]; | 58 uint8_t pixelData = src[byte]; |
59 for (uint32_t p = 0; p < pixelsPerByte && x < width; p++) { | 59 for (uint32_t p = 0; p < pixelsPerByte && x < width; p++) { |
60 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask; | 60 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask; |
61 SkPMColor c = ctable[index]; | 61 SkPMColor c = ctable[index]; |
62 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); | 62 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); |
63 dst[x] = c; | 63 dst[x] = c; |
64 pixelData <<= bitsPerPixel; | 64 pixelData <<= bitsPerPixel; |
65 x++; | 65 x++; |
66 } | 66 } |
67 } | 67 } |
68 return COMPUTE_RESULT_ALPHA; | 68 return COMPUTE_RESULT_ALPHA; |
69 } | 69 } |
70 | 70 |
71 // kIndex | 71 // kIndex |
72 | 72 |
73 static SkSwizzler::ResultAlpha swizzle_index_to_index( | 73 static SkSwizzler::ResultAlpha swizzle_index_to_index( |
74 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 74 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
75 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 75 int bytesPerPixel, const SkPMColor ctable[]) { |
76 | 76 |
77 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; | 77 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; |
78 memcpy(dst, src, width); | 78 memcpy(dst, src, width); |
79 // TODO (msarett): Should we skip the loop here and guess that the row is op
aque/not opaque? | 79 // TODO (msarett): Should we skip the loop here and guess that the row is op
aque/not opaque? |
80 // SkScaledBitmap sampler just guesses that it is opaque. T
his is dangerous | 80 // SkScaledBitmap sampler just guesses that it is opaque. T
his is dangerous |
81 // and probably wrong since gif and bmp (rarely) may have al
pha. | 81 // and probably wrong since gif and bmp (rarely) may have al
pha. |
82 INIT_RESULT_ALPHA; | 82 INIT_RESULT_ALPHA; |
83 for (int x = 0; x < width; x++) { | 83 for (int x = 0; x < width; x++) { |
84 UPDATE_RESULT_ALPHA(ctable[src[x]] >> SK_A32_SHIFT); | 84 UPDATE_RESULT_ALPHA(ctable[src[x]] >> SK_A32_SHIFT); |
85 } | 85 } |
86 return COMPUTE_RESULT_ALPHA; | 86 return COMPUTE_RESULT_ALPHA; |
87 } | 87 } |
88 | 88 |
89 static SkSwizzler::ResultAlpha swizzle_index_to_n32( | 89 static SkSwizzler::ResultAlpha swizzle_index_to_n32( |
90 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 90 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
91 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 91 int bytesPerPixel, const SkPMColor ctable[]) { |
92 | 92 |
93 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 93 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
94 INIT_RESULT_ALPHA; | 94 INIT_RESULT_ALPHA; |
95 for (int x = 0; x < width; x++) { | 95 for (int x = 0; x < width; x++) { |
96 SkPMColor c = ctable[src[x]]; | 96 SkPMColor c = ctable[src[x]]; |
97 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); | 97 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); |
98 dst[x] = c; | 98 dst[x] = c; |
99 } | 99 } |
100 return COMPUTE_RESULT_ALPHA; | 100 return COMPUTE_RESULT_ALPHA; |
101 } | 101 } |
102 | 102 |
103 static SkSwizzler::ResultAlpha swizzle_index_to_n32_skipZ( | 103 static SkSwizzler::ResultAlpha swizzle_index_to_n32_skipZ( |
104 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 104 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
105 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 105 int bytesPerPixel, const SkPMColor ctable[]) { |
106 | 106 |
107 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 107 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
108 INIT_RESULT_ALPHA; | 108 INIT_RESULT_ALPHA; |
109 for (int x = 0; x < width; x++) { | 109 for (int x = 0; x < width; x++) { |
110 SkPMColor c = ctable[src[x]]; | 110 SkPMColor c = ctable[src[x]]; |
111 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); | 111 UPDATE_RESULT_ALPHA(c >> SK_A32_SHIFT); |
112 if (c != 0) { | 112 if (c != 0) { |
113 dst[x] = c; | 113 dst[x] = c; |
114 } | 114 } |
115 } | 115 } |
116 return COMPUTE_RESULT_ALPHA; | 116 return COMPUTE_RESULT_ALPHA; |
117 } | 117 } |
118 | 118 |
119 #undef A32_MASK_IN_PLACE | 119 #undef A32_MASK_IN_PLACE |
120 | 120 |
121 // kGray | 121 // kGray |
122 | 122 |
123 static SkSwizzler::ResultAlpha swizzle_gray_to_n32( | 123 static SkSwizzler::ResultAlpha swizzle_gray_to_n32( |
124 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 124 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
125 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 125 int bytesPerPixel, const SkPMColor ctable[]) { |
126 | 126 |
127 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 127 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
128 for (int x = 0; x < width; x++) { | 128 for (int x = 0; x < width; x++) { |
129 dst[x] = SkPackARGB32NoCheck(0xFF, src[x], src[x], src[x]); | 129 dst[x] = SkPackARGB32NoCheck(0xFF, src[x], src[x], src[x]); |
130 } | 130 } |
131 return SkSwizzler::kOpaque_ResultAlpha; | 131 return SkSwizzler::kOpaque_ResultAlpha; |
132 } | 132 } |
133 | 133 |
134 static SkSwizzler::ResultAlpha swizzle_gray_to_gray( | 134 static SkSwizzler::ResultAlpha swizzle_gray_to_gray( |
135 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 135 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
136 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 136 int bytesPerPixel, const SkPMColor ctable[]) { |
137 memcpy(dstRow, src, width); | 137 memcpy(dstRow, src, width); |
138 return SkSwizzler::kOpaque_ResultAlpha; | 138 return SkSwizzler::kOpaque_ResultAlpha; |
139 } | 139 } |
140 | 140 |
141 // kBGRX | 141 // kBGRX |
142 | 142 |
143 static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32( | 143 static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32( |
144 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 144 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
145 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 145 int bytesPerPixel, const SkPMColor ctable[]) { |
146 | 146 |
147 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 147 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
148 for (int x = 0; x < width; x++) { | 148 for (int x = 0; x < width; x++) { |
149 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); | 149 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); |
150 src += bytesPerPixel; | 150 src += bytesPerPixel; |
151 } | 151 } |
152 return SkSwizzler::kOpaque_ResultAlpha; | 152 return SkSwizzler::kOpaque_ResultAlpha; |
153 } | 153 } |
154 | 154 |
155 // kBGRA | 155 // kBGRA |
156 | 156 |
157 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_unpremul( | 157 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_unpremul( |
158 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 158 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
159 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 159 int bytesPerPixel, const SkPMColor ctable[]) { |
160 | 160 |
161 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 161 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
162 INIT_RESULT_ALPHA; | 162 INIT_RESULT_ALPHA; |
163 for (int x = 0; x < width; x++) { | 163 for (int x = 0; x < width; x++) { |
164 uint8_t alpha = src[3]; | 164 uint8_t alpha = src[3]; |
165 UPDATE_RESULT_ALPHA(alpha); | 165 UPDATE_RESULT_ALPHA(alpha); |
166 dst[x] = SkPackARGB32NoCheck(alpha, src[2], src[1], src[0]); | 166 dst[x] = SkPackARGB32NoCheck(alpha, src[2], src[1], src[0]); |
167 src += bytesPerPixel; | 167 src += bytesPerPixel; |
168 } | 168 } |
169 return COMPUTE_RESULT_ALPHA; | 169 return COMPUTE_RESULT_ALPHA; |
170 } | 170 } |
171 | 171 |
172 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_premul( | 172 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_premul( |
173 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 173 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
174 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 174 int bytesPerPixel, const SkPMColor ctable[]) { |
175 | 175 |
176 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 176 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
177 INIT_RESULT_ALPHA; | 177 INIT_RESULT_ALPHA; |
178 for (int x = 0; x < width; x++) { | 178 for (int x = 0; x < width; x++) { |
179 uint8_t alpha = src[3]; | 179 uint8_t alpha = src[3]; |
180 UPDATE_RESULT_ALPHA(alpha); | 180 UPDATE_RESULT_ALPHA(alpha); |
181 dst[x] = SkPreMultiplyARGB(alpha, src[2], src[1], src[0]); | 181 dst[x] = SkPreMultiplyARGB(alpha, src[2], src[1], src[0]); |
182 src += bytesPerPixel; | 182 src += bytesPerPixel; |
183 } | 183 } |
184 return COMPUTE_RESULT_ALPHA; | 184 return COMPUTE_RESULT_ALPHA; |
185 } | 185 } |
186 | 186 |
187 // n32 | 187 // n32 |
188 static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32( | 188 static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32( |
189 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 189 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
190 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 190 int bytesPerPixel, const SkPMColor ctable[]) { |
191 | 191 |
192 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 192 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
193 for (int x = 0; x < width; x++) { | 193 for (int x = 0; x < width; x++) { |
194 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); | 194 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); |
195 src += bytesPerPixel; | 195 src += bytesPerPixel; |
196 } | 196 } |
197 return SkSwizzler::kOpaque_ResultAlpha; | 197 return SkSwizzler::kOpaque_ResultAlpha; |
198 } | 198 } |
199 | 199 |
200 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( | 200 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( |
201 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 201 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
202 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 202 int bytesPerPixel, const SkPMColor ctable[]) { |
203 | 203 |
204 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 204 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
205 INIT_RESULT_ALPHA; | 205 INIT_RESULT_ALPHA; |
206 for (int x = 0; x < width; x++) { | 206 for (int x = 0; x < width; x++) { |
207 unsigned alpha = src[3]; | 207 unsigned alpha = src[3]; |
208 UPDATE_RESULT_ALPHA(alpha); | 208 UPDATE_RESULT_ALPHA(alpha); |
209 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); | 209 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); |
210 src += bytesPerPixel; | 210 src += bytesPerPixel; |
211 } | 211 } |
212 return COMPUTE_RESULT_ALPHA; | 212 return COMPUTE_RESULT_ALPHA; |
213 } | 213 } |
214 | 214 |
215 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_unpremul( | 215 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_unpremul( |
216 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 216 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
217 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 217 int bytesPerPixel, const SkPMColor ctable[]) { |
218 | 218 |
219 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); | 219 uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); |
220 INIT_RESULT_ALPHA; | 220 INIT_RESULT_ALPHA; |
221 for (int x = 0; x < width; x++) { | 221 for (int x = 0; x < width; x++) { |
222 unsigned alpha = src[3]; | 222 unsigned alpha = src[3]; |
223 UPDATE_RESULT_ALPHA(alpha); | 223 UPDATE_RESULT_ALPHA(alpha); |
224 dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]); | 224 dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]); |
225 src += bytesPerPixel; | 225 src += bytesPerPixel; |
226 } | 226 } |
227 return COMPUTE_RESULT_ALPHA; | 227 return COMPUTE_RESULT_ALPHA; |
228 } | 228 } |
229 | 229 |
230 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul_skipZ( | 230 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul_skipZ( |
231 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 231 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
232 int bytesPerPixel, int y, const SkPMColor ctable[]) { | 232 int bytesPerPixel, const SkPMColor ctable[]) { |
233 | 233 |
234 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 234 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
235 INIT_RESULT_ALPHA; | 235 INIT_RESULT_ALPHA; |
236 for (int x = 0; x < width; x++) { | 236 for (int x = 0; x < width; x++) { |
237 unsigned alpha = src[3]; | 237 unsigned alpha = src[3]; |
238 UPDATE_RESULT_ALPHA(alpha); | 238 UPDATE_RESULT_ALPHA(alpha); |
239 if (0 != alpha) { | 239 if (0 != alpha) { |
240 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); | 240 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); |
241 } | 241 } |
242 src += bytesPerPixel; | 242 src += bytesPerPixel; |
(...skipping 23 matching lines...) Expand all Loading... |
266 } | 266 } |
267 src += deltaSrc; | 267 src += deltaSrc; |
268 alphaMask &= alpha; | 268 alphaMask &= alpha; |
269 } | 269 } |
270 return alphaMask != 0xFF; | 270 return alphaMask != 0xFF; |
271 } | 271 } |
272 */ | 272 */ |
273 | 273 |
274 SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, | 274 SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
275 const SkPMColor* ctable, | 275 const SkPMColor* ctable, |
276 const SkImageInfo& info, void* dst, | 276 const SkImageInfo& info, |
277 size_t dstRowBytes, | |
278 SkCodec::ZeroInitialized zeroInit) { | 277 SkCodec::ZeroInitialized zeroInit) { |
279 if (info.colorType() == kUnknown_SkColorType || kUnknown == sc) { | 278 if (info.colorType() == kUnknown_SkColorType || kUnknown == sc) { |
280 return NULL; | 279 return NULL; |
281 } | 280 } |
282 if (info.minRowBytes() > dstRowBytes) { | |
283 return NULL; | |
284 } | |
285 if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) | 281 if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) |
286 && NULL == ctable) { | 282 && NULL == ctable) { |
287 return NULL; | 283 return NULL; |
288 } | 284 } |
289 RowProc proc = NULL; | 285 RowProc proc = NULL; |
290 switch (sc) { | 286 switch (sc) { |
291 case kIndex1: | 287 case kIndex1: |
292 case kIndex2: | 288 case kIndex2: |
293 case kIndex4: | 289 case kIndex4: |
294 switch (info.colorType()) { | 290 switch (info.colorType()) { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 default: | 396 default: |
401 break; | 397 break; |
402 } | 398 } |
403 if (NULL == proc) { | 399 if (NULL == proc) { |
404 return NULL; | 400 return NULL; |
405 } | 401 } |
406 | 402 |
407 // Store deltaSrc in bytes if it is an even multiple, otherwise use bits | 403 // Store deltaSrc in bytes if it is an even multiple, otherwise use bits |
408 int deltaSrc = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : | 404 int deltaSrc = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : |
409 BitsPerPixel(sc); | 405 BitsPerPixel(sc); |
410 return SkNEW_ARGS(SkSwizzler, (proc, ctable, deltaSrc, info, dst, | 406 return SkNEW_ARGS(SkSwizzler, (proc, ctable, deltaSrc, info)); |
411 dstRowBytes)); | |
412 } | 407 } |
413 | 408 |
414 SkSwizzler::SkSwizzler(RowProc proc, const SkPMColor* ctable, | 409 SkSwizzler::SkSwizzler(RowProc proc, const SkPMColor* ctable, |
415 int deltaSrc, const SkImageInfo& info, void* dst, | 410 int deltaSrc, const SkImageInfo& info) |
416 size_t rowBytes) | |
417 : fRowProc(proc) | 411 : fRowProc(proc) |
418 , fColorTable(ctable) | 412 , fColorTable(ctable) |
419 , fDeltaSrc(deltaSrc) | 413 , fDeltaSrc(deltaSrc) |
420 , fDstInfo(info) | 414 , fDstInfo(info) |
421 , fDstRow(dst) | 415 {} |
422 , fDstRowBytes(rowBytes) | |
423 , fCurrY(0) | |
424 { | |
425 SkDEBUGCODE(fNextMode = kUninitialized_NextMode); | |
426 } | |
427 | 416 |
428 SkSwizzler::ResultAlpha SkSwizzler::next(const uint8_t* SK_RESTRICT src) { | 417 SkSwizzler::ResultAlpha SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRIC
T src) { |
429 SkASSERT(0 <= fCurrY && fCurrY < fDstInfo.height()); | 418 SkASSERT(NULL != dst && NULL != src); |
430 SkASSERT(fDstRow != NULL); | 419 return fRowProc(dst, src, fDstInfo.width(), fDeltaSrc, fColorTable); |
431 SkASSERT(kDesignateRow_NextMode != fNextMode); | |
432 SkDEBUGCODE(fNextMode = kConsecutive_NextMode); | |
433 | |
434 // Decode a row | |
435 const ResultAlpha result = fRowProc(fDstRow, src, fDstInfo.width(), | |
436 fDeltaSrc, fCurrY, fColorTable); | |
437 | |
438 // Move to the next row and return the result | |
439 fCurrY++; | |
440 fDstRow = SkTAddOffset<void>(fDstRow, fDstRowBytes); | |
441 return result; | |
442 } | |
443 | |
444 SkSwizzler::ResultAlpha SkSwizzler::next(const uint8_t* SK_RESTRICT src, | |
445 int y) { | |
446 SkASSERT(0 <= y && y < fDstInfo.height()); | |
447 SkASSERT(kConsecutive_NextMode != fNextMode); | |
448 SkDEBUGCODE(fNextMode = kDesignateRow_NextMode); | |
449 | |
450 // Choose the row | |
451 void* row = SkTAddOffset<void>(fDstRow, y*fDstRowBytes); | |
452 | |
453 // Decode the row | |
454 return fRowProc(row, src, fDstInfo.width(), fDeltaSrc, fCurrY, | |
455 fColorTable); | |
456 } | 420 } |
457 | 421 |
458 void SkSwizzler::Fill(void* dstStartRow, const SkImageInfo& dstInfo, size_t dstR
owBytes, | 422 void SkSwizzler::Fill(void* dstStartRow, const SkImageInfo& dstInfo, size_t dstR
owBytes, |
459 uint32_t numRows, uint32_t colorOrIndex, const SkPMColor* colorTable) { | 423 uint32_t numRows, uint32_t colorOrIndex, const SkPMColor* colorTable) { |
460 SkASSERT(dstStartRow != NULL); | 424 SkASSERT(dstStartRow != NULL); |
461 SkASSERT(numRows <= (uint32_t) dstInfo.height()); | 425 SkASSERT(numRows <= (uint32_t) dstInfo.height()); |
462 | 426 |
463 // Calculate bytes to fill. We use getSafeSize since the last row may not b
e padded. | 427 // Calculate bytes to fill. We use getSafeSize since the last row may not b
e padded. |
464 const size_t bytesToFill = dstInfo.makeWH(dstInfo.width(), numRows).getSafeS
ize(dstRowBytes); | 428 const size_t bytesToFill = dstInfo.makeWH(dstInfo.width(), numRows).getSafeS
ize(dstRowBytes); |
465 | 429 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 // bits of SK_ColorBLACK are identical to the grayscale representati
on | 469 // bits of SK_ColorBLACK are identical to the grayscale representati
on |
506 // for black. | 470 // for black. |
507 memset(dstStartRow, (uint8_t) colorOrIndex, bytesToFill); | 471 memset(dstStartRow, (uint8_t) colorOrIndex, bytesToFill); |
508 break; | 472 break; |
509 default: | 473 default: |
510 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); | 474 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); |
511 SkASSERT(false); | 475 SkASSERT(false); |
512 break; | 476 break; |
513 } | 477 } |
514 } | 478 } |
OLD | NEW |