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" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 static SkSwizzler::ResultAlpha swizzle_index_to_565( |
| 120 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
| 121 int bytesPerPixel, const SkPMColor ctable[]) { |
| 122 // FIXME: Support dithering? Requires knowing y, which I think is a bigger |
| 123 // change. |
| 124 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 125 for (int x = 0; x < width; x++) { |
| 126 dst[x] = SkPixel32ToPixel16(ctable[*src]); |
| 127 src += bytesPerPixel; |
| 128 } |
| 129 return SkSwizzler::kOpaque_ResultAlpha; |
| 130 } |
| 131 |
| 132 |
119 #undef A32_MASK_IN_PLACE | 133 #undef A32_MASK_IN_PLACE |
120 | 134 |
121 // kGray | 135 // kGray |
122 | 136 |
123 static SkSwizzler::ResultAlpha swizzle_gray_to_n32( | 137 static SkSwizzler::ResultAlpha swizzle_gray_to_n32( |
124 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 138 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
125 int bytesPerPixel, const SkPMColor ctable[]) { | 139 int bytesPerPixel, const SkPMColor ctable[]) { |
126 | 140 |
127 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 141 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
128 for (int x = 0; x < width; x++) { | 142 for (int x = 0; x < width; x++) { |
129 dst[x] = SkPackARGB32NoCheck(0xFF, src[x], src[x], src[x]); | 143 dst[x] = SkPackARGB32NoCheck(0xFF, src[x], src[x], src[x]); |
130 } | 144 } |
131 return SkSwizzler::kOpaque_ResultAlpha; | 145 return SkSwizzler::kOpaque_ResultAlpha; |
132 } | 146 } |
133 | 147 |
134 static SkSwizzler::ResultAlpha swizzle_gray_to_gray( | 148 static SkSwizzler::ResultAlpha swizzle_gray_to_gray( |
135 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 149 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
136 int bytesPerPixel, const SkPMColor ctable[]) { | 150 int bytesPerPixel, const SkPMColor ctable[]) { |
137 memcpy(dstRow, src, width); | 151 memcpy(dstRow, src, width); |
138 return SkSwizzler::kOpaque_ResultAlpha; | 152 return SkSwizzler::kOpaque_ResultAlpha; |
139 } | 153 } |
140 | 154 |
| 155 static SkSwizzler::ResultAlpha swizzle_gray_to_565( |
| 156 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
| 157 int bytesPerPixel, const SkPMColor ctable[]) { |
| 158 // FIXME: Support dithering? |
| 159 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 160 for (int x = 0; x < width; x++) { |
| 161 dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]); |
| 162 src += bytesPerPixel; |
| 163 } |
| 164 return SkSwizzler::kOpaque_ResultAlpha; |
| 165 } |
| 166 |
141 // kBGRX | 167 // kBGRX |
142 | 168 |
143 static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32( | 169 static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32( |
144 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 170 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
145 int bytesPerPixel, const SkPMColor ctable[]) { | 171 int bytesPerPixel, const SkPMColor ctable[]) { |
146 | 172 |
147 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 173 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
148 for (int x = 0; x < width; x++) { | 174 for (int x = 0; x < width; x++) { |
149 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); | 175 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); |
150 src += bytesPerPixel; | 176 src += bytesPerPixel; |
(...skipping 26 matching lines...) Expand all Loading... |
177 INIT_RESULT_ALPHA; | 203 INIT_RESULT_ALPHA; |
178 for (int x = 0; x < width; x++) { | 204 for (int x = 0; x < width; x++) { |
179 uint8_t alpha = src[3]; | 205 uint8_t alpha = src[3]; |
180 UPDATE_RESULT_ALPHA(alpha); | 206 UPDATE_RESULT_ALPHA(alpha); |
181 dst[x] = SkPreMultiplyARGB(alpha, src[2], src[1], src[0]); | 207 dst[x] = SkPreMultiplyARGB(alpha, src[2], src[1], src[0]); |
182 src += bytesPerPixel; | 208 src += bytesPerPixel; |
183 } | 209 } |
184 return COMPUTE_RESULT_ALPHA; | 210 return COMPUTE_RESULT_ALPHA; |
185 } | 211 } |
186 | 212 |
187 // n32 | 213 // kRGBX |
188 static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32( | 214 static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32( |
189 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 215 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
190 int bytesPerPixel, const SkPMColor ctable[]) { | 216 int bytesPerPixel, const SkPMColor ctable[]) { |
191 | 217 |
192 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 218 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
193 for (int x = 0; x < width; x++) { | 219 for (int x = 0; x < width; x++) { |
194 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); | 220 dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); |
195 src += bytesPerPixel; | 221 src += bytesPerPixel; |
196 } | 222 } |
197 return SkSwizzler::kOpaque_ResultAlpha; | 223 return SkSwizzler::kOpaque_ResultAlpha; |
198 } | 224 } |
199 | 225 |
| 226 static SkSwizzler::ResultAlpha swizzle_rgbx_to_565( |
| 227 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
| 228 int bytesPerPixel, const SkPMColor ctable[]) { |
| 229 // FIXME: Support dithering? |
| 230 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 231 for (int x = 0; x < width; x++) { |
| 232 dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); |
| 233 src += bytesPerPixel; |
| 234 } |
| 235 return SkSwizzler::kOpaque_ResultAlpha; |
| 236 } |
| 237 |
| 238 |
| 239 // kRGBA |
200 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( | 240 static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( |
201 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, | 241 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width, |
202 int bytesPerPixel, const SkPMColor ctable[]) { | 242 int bytesPerPixel, const SkPMColor ctable[]) { |
203 | 243 |
204 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 244 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
205 INIT_RESULT_ALPHA; | 245 INIT_RESULT_ALPHA; |
206 for (int x = 0; x < width; x++) { | 246 for (int x = 0; x < width; x++) { |
207 unsigned alpha = src[3]; | 247 unsigned alpha = src[3]; |
208 UPDATE_RESULT_ALPHA(alpha); | 248 UPDATE_RESULT_ALPHA(alpha); |
209 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); | 249 dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 case kN32_SkColorType: | 343 case kN32_SkColorType: |
304 // We assume the color premultiplied ctable (or not) as desi
red. | 344 // We assume the color premultiplied ctable (or not) as desi
red. |
305 if (SkCodec::kYes_ZeroInitialized == zeroInit) { | 345 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
306 proc = &swizzle_index_to_n32_skipZ; | 346 proc = &swizzle_index_to_n32_skipZ; |
307 break; | 347 break; |
308 } else { | 348 } else { |
309 proc = &swizzle_index_to_n32; | 349 proc = &swizzle_index_to_n32; |
310 break; | 350 break; |
311 } | 351 } |
312 break; | 352 break; |
| 353 case kRGB_565_SkColorType: |
| 354 proc = &swizzle_index_to_565; |
| 355 break; |
313 case kIndex_8_SkColorType: | 356 case kIndex_8_SkColorType: |
314 proc = &swizzle_index_to_index; | 357 proc = &swizzle_index_to_index; |
315 break; | 358 break; |
316 default: | 359 default: |
317 break; | 360 break; |
318 } | 361 } |
319 break; | 362 break; |
320 case kGray: | 363 case kGray: |
321 switch (info.colorType()) { | 364 switch (info.colorType()) { |
322 case kN32_SkColorType: | 365 case kN32_SkColorType: |
323 proc = &swizzle_gray_to_n32; | 366 proc = &swizzle_gray_to_n32; |
324 break; | 367 break; |
325 case kGray_8_SkColorType: | 368 case kGray_8_SkColorType: |
326 proc = &swizzle_gray_to_gray; | 369 proc = &swizzle_gray_to_gray; |
| 370 break; |
| 371 case kRGB_565_SkColorType: |
| 372 proc = &swizzle_gray_to_565; |
| 373 break; |
327 default: | 374 default: |
328 break; | 375 break; |
329 } | 376 } |
330 break; | 377 break; |
331 case kBGR: | 378 case kBGR: |
332 case kBGRX: | 379 case kBGRX: |
333 switch (info.colorType()) { | 380 switch (info.colorType()) { |
334 case kN32_SkColorType: | 381 case kN32_SkColorType: |
335 proc = &swizzle_bgrx_to_n32; | 382 proc = &swizzle_bgrx_to_n32; |
336 break; | 383 break; |
(...skipping 18 matching lines...) Expand all Loading... |
355 default: | 402 default: |
356 break; | 403 break; |
357 } | 404 } |
358 break; | 405 break; |
359 case kRGBX: | 406 case kRGBX: |
360 // TODO: Support other swizzles. | 407 // TODO: Support other swizzles. |
361 switch (info.colorType()) { | 408 switch (info.colorType()) { |
362 case kN32_SkColorType: | 409 case kN32_SkColorType: |
363 proc = &swizzle_rgbx_to_n32; | 410 proc = &swizzle_rgbx_to_n32; |
364 break; | 411 break; |
| 412 case kRGB_565_SkColorType: |
| 413 proc = &swizzle_rgbx_to_565; |
365 default: | 414 default: |
366 break; | 415 break; |
367 } | 416 } |
368 break; | 417 break; |
369 case kRGBA: | 418 case kRGBA: |
370 switch (info.colorType()) { | 419 switch (info.colorType()) { |
371 case kN32_SkColorType: | 420 case kN32_SkColorType: |
372 if (info.alphaType() == kUnpremul_SkAlphaType) { | 421 if (info.alphaType() == kUnpremul_SkAlphaType) { |
373 // Respect zeroInit? | 422 // Respect zeroInit? |
374 proc = &swizzle_rgba_to_n32_unpremul; | 423 proc = &swizzle_rgba_to_n32_unpremul; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 // bits of SK_ColorBLACK are identical to the 565 representation | 527 // bits of SK_ColorBLACK are identical to the 565 representation |
479 // for black. | 528 // for black. |
480 memset(dstStartRow, (uint16_t) colorOrIndex, bytesToFill); | 529 memset(dstStartRow, (uint16_t) colorOrIndex, bytesToFill); |
481 break; | 530 break; |
482 default: | 531 default: |
483 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); | 532 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); |
484 SkASSERT(false); | 533 SkASSERT(false); |
485 break; | 534 break; |
486 } | 535 } |
487 } | 536 } |
OLD | NEW |