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 "SkMaskSwizzler.h" | 10 #include "SkMaskSwizzler.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 uint8_t red = masks->getRed(p); | 56 uint8_t red = masks->getRed(p); |
57 uint8_t green = masks->getGreen(p); | 57 uint8_t green = masks->getGreen(p); |
58 uint8_t blue = masks->getBlue(p); | 58 uint8_t blue = masks->getBlue(p); |
59 uint8_t alpha = masks->getAlpha(p); | 59 uint8_t alpha = masks->getAlpha(p); |
60 UPDATE_RESULT_ALPHA(alpha); | 60 UPDATE_RESULT_ALPHA(alpha); |
61 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 61 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
62 } | 62 } |
63 return COMPUTE_RESULT_ALPHA; | 63 return COMPUTE_RESULT_ALPHA; |
64 } | 64 } |
65 | 65 |
66 static SkSwizzler::ResultAlpha swizzle_mask16_to_565( | |
67 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
68 | |
69 // Use the masks to decode to the destination | |
70 uint16_t* srcPtr = (uint16_t*) srcRow; | |
71 uint16_t* dstPtr = (uint16_t*) dstRow; | |
72 for (int i = 0; i < width; i++) { | |
73 uint16_t p = srcPtr[i]; | |
74 uint8_t red = masks->getRed(p); | |
75 uint8_t green = masks->getGreen(p); | |
76 uint8_t blue = masks->getBlue(p); | |
77 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | |
78 } | |
79 return SkSwizzler::kOpaque_ResultAlpha; | |
80 } | |
81 | |
82 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( | 66 static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( |
83 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 67 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
84 | 68 |
85 // Use the masks to decode to the destination | 69 // Use the masks to decode to the destination |
86 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 70 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
87 for (int i = 0; i < 3*width; i += 3) { | 71 for (int i = 0; i < 3*width; i += 3) { |
88 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | 72 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
89 uint8_t red = masks->getRed(p); | 73 uint8_t red = masks->getRed(p); |
90 uint8_t green = masks->getGreen(p); | 74 uint8_t green = masks->getGreen(p); |
91 uint8_t blue = masks->getBlue(p); | 75 uint8_t blue = masks->getBlue(p); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 uint8_t red = masks->getRed(p); | 107 uint8_t red = masks->getRed(p); |
124 uint8_t green = masks->getGreen(p); | 108 uint8_t green = masks->getGreen(p); |
125 uint8_t blue = masks->getBlue(p); | 109 uint8_t blue = masks->getBlue(p); |
126 uint8_t alpha = masks->getAlpha(p); | 110 uint8_t alpha = masks->getAlpha(p); |
127 UPDATE_RESULT_ALPHA(alpha); | 111 UPDATE_RESULT_ALPHA(alpha); |
128 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); | 112 dstPtr[i/3] = SkPreMultiplyARGB(alpha, red, green, blue); |
129 } | 113 } |
130 return COMPUTE_RESULT_ALPHA; | 114 return COMPUTE_RESULT_ALPHA; |
131 } | 115 } |
132 | 116 |
133 static SkSwizzler::ResultAlpha swizzle_mask24_to_565( | |
134 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
135 | |
136 // Use the masks to decode to the destination | |
137 uint16_t* dstPtr = (uint16_t*) dstRow; | |
138 for (int i = 0; i < 3*width; i += 3) { | |
139 uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; | |
140 uint8_t red = masks->getRed(p); | |
141 uint8_t green = masks->getGreen(p); | |
142 uint8_t blue = masks->getBlue(p); | |
143 dstPtr[i/3] = SkPack888ToRGB16(red, green, blue); | |
144 } | |
145 return SkSwizzler::kOpaque_ResultAlpha; | |
146 } | |
147 | |
148 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( | 117 static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( |
149 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | 118 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
150 | 119 |
151 // Use the masks to decode to the destination | 120 // Use the masks to decode to the destination |
152 uint32_t* srcPtr = (uint32_t*) srcRow; | 121 uint32_t* srcPtr = (uint32_t*) srcRow; |
153 SkPMColor* dstPtr = (SkPMColor*) dstRow; | 122 SkPMColor* dstPtr = (SkPMColor*) dstRow; |
154 for (int i = 0; i < width; i++) { | 123 for (int i = 0; i < width; i++) { |
155 uint32_t p = srcPtr[i]; | 124 uint32_t p = srcPtr[i]; |
156 uint8_t red = masks->getRed(p); | 125 uint8_t red = masks->getRed(p); |
157 uint8_t green = masks->getGreen(p); | 126 uint8_t green = masks->getGreen(p); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 uint8_t red = masks->getRed(p); | 161 uint8_t red = masks->getRed(p); |
193 uint8_t green = masks->getGreen(p); | 162 uint8_t green = masks->getGreen(p); |
194 uint8_t blue = masks->getBlue(p); | 163 uint8_t blue = masks->getBlue(p); |
195 uint8_t alpha = masks->getAlpha(p); | 164 uint8_t alpha = masks->getAlpha(p); |
196 UPDATE_RESULT_ALPHA(alpha); | 165 UPDATE_RESULT_ALPHA(alpha); |
197 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); | 166 dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
198 } | 167 } |
199 return COMPUTE_RESULT_ALPHA; | 168 return COMPUTE_RESULT_ALPHA; |
200 } | 169 } |
201 | 170 |
202 static SkSwizzler::ResultAlpha swizzle_mask32_to_565( | |
203 void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { | |
204 | |
205 // Use the masks to decode to the destination | |
206 uint32_t* srcPtr = (uint32_t*) srcRow; | |
207 uint16_t* dstPtr = (uint16_t*) dstRow; | |
208 for (int i = 0; i < width; i++) { | |
209 uint32_t p = srcPtr[i]; | |
210 uint8_t red = masks->getRed(p); | |
211 uint8_t green = masks->getGreen(p); | |
212 uint8_t blue = masks->getBlue(p); | |
213 dstPtr[i] = SkPack888ToRGB16(red, green, blue); | |
214 } | |
215 return SkSwizzler::kOpaque_ResultAlpha; | |
216 } | |
217 | |
218 /* | 171 /* |
219 * | 172 * |
220 * Create a new mask swizzler | 173 * Create a new mask swizzler |
221 * | 174 * |
222 */ | 175 */ |
223 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( | 176 SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
224 const SkImageInfo& info, void* dst, size_t dstRowBytes, SkMasks* masks, | 177 const SkImageInfo& info, void* dst, size_t dstRowBytes, SkMasks* masks, |
225 uint32_t bitsPerPixel) { | 178 uint32_t bitsPerPixel) { |
226 | 179 |
227 // Choose the appropriate row procedure | 180 // Choose the appropriate row procedure |
228 RowProc proc = NULL; | 181 RowProc proc = NULL; |
229 switch (bitsPerPixel) { | 182 switch (bitsPerPixel) { |
230 case 16: | 183 case 16: |
231 switch (info.colorType()) { | 184 switch (info.colorType()) { |
232 case kN32_SkColorType: | 185 case kN32_SkColorType: |
233 switch (info.alphaType()) { | 186 switch (info.alphaType()) { |
234 case kUnpremul_SkAlphaType: | 187 case kUnpremul_SkAlphaType: |
235 proc = &swizzle_mask16_to_n32_unpremul; | 188 proc = &swizzle_mask16_to_n32_unpremul; |
236 break; | 189 break; |
237 case kPremul_SkAlphaType: | 190 case kPremul_SkAlphaType: |
238 proc = &swizzle_mask16_to_n32_premul; | 191 proc = &swizzle_mask16_to_n32_premul; |
239 break; | 192 break; |
240 case kOpaque_SkAlphaType: | 193 case kOpaque_SkAlphaType: |
241 proc = &swizzle_mask16_to_n32_opaque; | 194 proc = &swizzle_mask16_to_n32_opaque; |
242 break; | 195 break; |
243 default: | 196 default: |
244 break; | 197 break; |
245 } | 198 } |
246 break; | 199 break; |
247 case kRGB_565_SkColorType: | |
248 switch (info.alphaType()) { | |
249 case kOpaque_SkAlphaType: | |
250 proc = &swizzle_mask16_to_565; | |
251 break; | |
252 default: | |
253 break; | |
254 } | |
255 break; | |
256 default: | 200 default: |
257 break; | 201 break; |
258 } | 202 } |
259 break; | 203 break; |
260 case 24: | 204 case 24: |
261 switch (info.colorType()) { | 205 switch (info.colorType()) { |
262 case kN32_SkColorType: | 206 case kN32_SkColorType: |
263 switch (info.alphaType()) { | 207 switch (info.alphaType()) { |
264 case kUnpremul_SkAlphaType: | 208 case kUnpremul_SkAlphaType: |
265 proc = &swizzle_mask24_to_n32_unpremul; | 209 proc = &swizzle_mask24_to_n32_unpremul; |
266 break; | 210 break; |
267 case kPremul_SkAlphaType: | 211 case kPremul_SkAlphaType: |
268 proc = &swizzle_mask24_to_n32_premul; | 212 proc = &swizzle_mask24_to_n32_premul; |
269 break; | 213 break; |
270 case kOpaque_SkAlphaType: | 214 case kOpaque_SkAlphaType: |
271 proc = &swizzle_mask24_to_n32_opaque; | 215 proc = &swizzle_mask24_to_n32_opaque; |
272 break; | 216 break; |
273 default: | 217 default: |
274 break; | 218 break; |
275 } | 219 } |
276 break; | 220 break; |
277 case kRGB_565_SkColorType: | |
278 switch (info.alphaType()) { | |
279 case kOpaque_SkAlphaType: | |
280 proc = &swizzle_mask24_to_565; | |
281 break; | |
282 default: | |
283 break; | |
284 } | |
285 break; | |
286 default: | 221 default: |
287 break; | 222 break; |
288 } | 223 } |
289 break; | 224 break; |
290 case 32: | 225 case 32: |
291 switch (info.colorType()) { | 226 switch (info.colorType()) { |
292 case kN32_SkColorType: | 227 case kN32_SkColorType: |
293 switch (info.alphaType()) { | 228 switch (info.alphaType()) { |
294 case kUnpremul_SkAlphaType: | 229 case kUnpremul_SkAlphaType: |
295 proc = &swizzle_mask32_to_n32_unpremul; | 230 proc = &swizzle_mask32_to_n32_unpremul; |
296 break; | 231 break; |
297 case kPremul_SkAlphaType: | 232 case kPremul_SkAlphaType: |
298 proc = &swizzle_mask32_to_n32_premul; | 233 proc = &swizzle_mask32_to_n32_premul; |
299 break; | 234 break; |
300 case kOpaque_SkAlphaType: | 235 case kOpaque_SkAlphaType: |
301 proc = &swizzle_mask32_to_n32_opaque; | 236 proc = &swizzle_mask32_to_n32_opaque; |
302 break; | 237 break; |
303 default: | 238 default: |
304 break; | 239 break; |
305 } | 240 } |
306 break; | 241 break; |
307 case kRGB_565_SkColorType: | |
308 switch (info.alphaType()) { | |
309 case kOpaque_SkAlphaType: | |
310 proc = &swizzle_mask32_to_565; | |
311 break; | |
312 default: | |
313 break; | |
314 } | |
315 break; | |
316 default: | 242 default: |
317 break; | 243 break; |
318 } | 244 } |
319 break; | 245 break; |
320 default: | 246 default: |
321 SkASSERT(false); | 247 SkASSERT(false); |
322 return NULL; | 248 return NULL; |
323 } | 249 } |
324 return SkNEW_ARGS(SkMaskSwizzler, (info, dst, dstRowBytes, masks, proc)); | 250 return SkNEW_ARGS(SkMaskSwizzler, (info, dst, dstRowBytes, masks, proc)); |
325 } | 251 } |
(...skipping 18 matching lines...) Expand all Loading... |
344 * | 270 * |
345 */ | 271 */ |
346 SkSwizzler::ResultAlpha SkMaskSwizzler::next(const uint8_t* SK_RESTRICT src, | 272 SkSwizzler::ResultAlpha SkMaskSwizzler::next(const uint8_t* SK_RESTRICT src, |
347 int y) { | 273 int y) { |
348 // Choose the row | 274 // Choose the row |
349 void* row = SkTAddOffset<void>(fDst, y*fDstRowBytes); | 275 void* row = SkTAddOffset<void>(fDst, y*fDstRowBytes); |
350 | 276 |
351 // Decode the row | 277 // Decode the row |
352 return fRowProc(row, src, fDstInfo.width(), fMasks); | 278 return fRowProc(row, src, fDstInfo.width(), fMasks); |
353 } | 279 } |
OLD | NEW |