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

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

Issue 1277213002: Support more swizzles to 565 in SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Update new 565 swizzling functions for scaling Created 5 years, 4 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/SkMaskSwizzler.cpp ('k') | src/codec/SkWebpCodec.cpp » ('j') | 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 "SkScaledCodec.h" 10 #include "SkScaledCodec.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 for (int x = 1; x < dstWidth; x++) { 107 for (int x = 1; x < dstWidth; x++) {
108 int bitOffset = bitIndex + deltaSrc; 108 int bitOffset = bitIndex + deltaSrc;
109 bitIndex = bitOffset % 8; 109 bitIndex = bitOffset % 8;
110 currByte = *(src += bitOffset / 8); 110 currByte = *(src += bitOffset / 8);
111 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBL ACK; 111 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? SK_ColorWHITE : SK_ColorBL ACK;
112 } 112 }
113 113
114 return SkSwizzler::kOpaque_ResultAlpha; 114 return SkSwizzler::kOpaque_ResultAlpha;
115 } 115 }
116 116
117 #define RGB565_BLACK 0
118 #define RGB565_WHITE 0xFFFF
119
120 static SkSwizzler::ResultAlpha swizzle_bit_to_565(
121 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
122 int deltaSrc, int offset, const SkPMColor* /*ctable*/) {
123 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow;
124
125 // increment src by byte offset and bitIndex by bit offset
126 src += offset / 8;
127 int bitIndex = offset % 8;
128 uint8_t currByte = *src;
129
130 dst[0] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLACK;
scroggo_chromium 2015/08/14 15:17:23 I think this function looks just like swizzle_bit_
msarett 2015/08/14 15:21:06 Looks good.
131
132 for (int x = 1; x < dstWidth; x++) {
133 int bitOffset = bitIndex + deltaSrc;
134 bitIndex = bitOffset % 8;
135 currByte = *(src += bitOffset / 8);
136 dst[x] = ((currByte >> (7 - bitIndex)) & 1) ? RGB565_WHITE : RGB565_BLAC K;
137 }
138
139 return SkSwizzler::kOpaque_ResultAlpha;
140 }
141
142 #undef RGB565_BLACK
143 #undef RGB565_WHITE
144
117 // kIndex1, kIndex2, kIndex4 145 // kIndex1, kIndex2, kIndex4
118 146
119 static SkSwizzler::ResultAlpha swizzle_small_index_to_index( 147 static SkSwizzler::ResultAlpha swizzle_small_index_to_index(
120 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 148 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
121 int bitsPerPixel, int offset, const SkPMColor ctable[]) { 149 int bitsPerPixel, int offset, const SkPMColor ctable[]) {
122 150
123 src += offset; 151 src += offset;
124 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow; 152 uint8_t* SK_RESTRICT dst = (uint8_t*) dstRow;
125 INIT_RESULT_ALPHA; 153 INIT_RESULT_ALPHA;
126 const uint32_t pixelsPerByte = 8 / bitsPerPixel; 154 const uint32_t pixelsPerByte = 8 / bitsPerPixel;
127 const size_t rowBytes = compute_row_bytes_ppb(dstWidth, pixelsPerByte); 155 const size_t rowBytes = compute_row_bytes_ppb(dstWidth, pixelsPerByte);
128 const uint8_t mask = (1 << bitsPerPixel) - 1; 156 const uint8_t mask = (1 << bitsPerPixel) - 1;
129 int x = 0; 157 int x = 0;
130 for (uint32_t byte = 0; byte < rowBytes; byte++) { 158 for (uint32_t byte = 0; byte < rowBytes; byte++) {
131 uint8_t pixelData = src[byte]; 159 uint8_t pixelData = src[byte];
132 for (uint32_t p = 0; p < pixelsPerByte && x < dstWidth; p++) { 160 for (uint32_t p = 0; p < pixelsPerByte && x < dstWidth; p++) {
133 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask; 161 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask;
134 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT); 162 UPDATE_RESULT_ALPHA(ctable[index] >> SK_A32_SHIFT);
135 dst[x] = index; 163 dst[x] = index;
136 pixelData <<= bitsPerPixel; 164 pixelData <<= bitsPerPixel;
137 x++; 165 x++;
138 } 166 }
139 } 167 }
140 return COMPUTE_RESULT_ALPHA; 168 return COMPUTE_RESULT_ALPHA;
141 } 169 }
142 170
171 static SkSwizzler::ResultAlpha swizzle_small_index_to_565(
172 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
173 int bitsPerPixel, int offset, const SkPMColor ctable[]) {
174
175 src += offset;
176 uint16_t* SK_RESTRICT dst = (uint16_t*) dstRow;
177 const uint32_t pixelsPerByte = 8 / bitsPerPixel;
178 const size_t rowBytes = compute_row_bytes_ppb(dstWidth, pixelsPerByte);
179 const uint8_t mask = (1 << bitsPerPixel) - 1;
180 int x = 0;
181 for (uint32_t byte = 0; byte < rowBytes; byte++) {
182 uint8_t pixelData = src[byte];
183 for (uint32_t p = 0; p < pixelsPerByte && x < dstWidth; p++) {
184 uint8_t index = (pixelData >> (8 - bitsPerPixel)) & mask;
185 uint16_t c = SkPixel32ToPixel16(ctable[index]);
186 dst[x] = c;
187 pixelData <<= bitsPerPixel;
188 x++;
189 }
190 }
191 return SkSwizzler::kOpaque_ResultAlpha;
192 }
193
143 static SkSwizzler::ResultAlpha swizzle_small_index_to_n32( 194 static SkSwizzler::ResultAlpha swizzle_small_index_to_n32(
144 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,
145 int bitsPerPixel, int offset, const SkPMColor ctable[]) { 196 int bitsPerPixel, int offset, const SkPMColor ctable[]) {
146 197
147 src += offset; 198 src += offset;
148 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow; 199 SkPMColor* SK_RESTRICT dst = (SkPMColor*) dstRow;
149 INIT_RESULT_ALPHA; 200 INIT_RESULT_ALPHA;
150 const uint32_t pixelsPerByte = 8 / bitsPerPixel; 201 const uint32_t pixelsPerByte = 8 / bitsPerPixel;
151 const size_t rowBytes = compute_row_bytes_ppb(dstWidth, pixelsPerByte); 202 const size_t rowBytes = compute_row_bytes_ppb(dstWidth, pixelsPerByte);
152 const uint8_t mask = (1 << bitsPerPixel) - 1; 203 const uint8_t mask = (1 << bitsPerPixel) - 1;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 350
300 src += offset; 351 src += offset;
301 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 352 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
302 for (int x = 0; x < dstWidth; x++) { 353 for (int x = 0; x < dstWidth; x++) {
303 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); 354 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]);
304 src += deltaSrc; 355 src += deltaSrc;
305 } 356 }
306 return SkSwizzler::kOpaque_ResultAlpha; 357 return SkSwizzler::kOpaque_ResultAlpha;
307 } 358 }
308 359
360 static SkSwizzler::ResultAlpha swizzle_bgrx_to_565(
361 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
362 int deltaSrc, int offset, const SkPMColor ctable[]) {
363 // FIXME: Support dithering?
364 src += offset;
365 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
366 for (int x = 0; x < dstWidth; x++) {
367 dst[x] = SkPack888ToRGB16(src[2], src[1], src[0]);
368 src += deltaSrc;
369 }
370 return SkSwizzler::kOpaque_ResultAlpha;
371 }
372
309 // kBGRA 373 // kBGRA
310 374
311 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_unpremul( 375 static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_unpremul(
312 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 376 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
313 int deltaSrc, int offset, const SkPMColor ctable[]) { 377 int deltaSrc, int offset, const SkPMColor ctable[]) {
314 378
315 src += offset; 379 src += offset;
316 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 380 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
317 INIT_RESULT_ALPHA; 381 INIT_RESULT_ALPHA;
318 for (int x = 0; x < dstWidth; x++) { 382 for (int x = 0; x < dstWidth; x++) {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 527
464 switch (sc) { 528 switch (sc) {
465 case kBit: 529 case kBit:
466 switch (dstInfo.colorType()) { 530 switch (dstInfo.colorType()) {
467 case kN32_SkColorType: 531 case kN32_SkColorType:
468 proc = &swizzle_bit_to_n32; 532 proc = &swizzle_bit_to_n32;
469 break; 533 break;
470 case kIndex_8_SkColorType: 534 case kIndex_8_SkColorType:
471 proc = &swizzle_bit_to_index; 535 proc = &swizzle_bit_to_index;
472 break; 536 break;
537 case kRGB_565_SkColorType:
538 proc = &swizzle_bit_to_565;
539 break;
473 case kGray_8_SkColorType: 540 case kGray_8_SkColorType:
474 proc = &swizzle_bit_to_grayscale; 541 proc = &swizzle_bit_to_grayscale;
475 break; 542 break;
476 default: 543 default:
477 break; 544 break;
478 } 545 }
479 break; 546 break;
480 case kIndex1: 547 case kIndex1:
481 case kIndex2: 548 case kIndex2:
482 case kIndex4: 549 case kIndex4:
483 switch (dstInfo.colorType()) { 550 switch (dstInfo.colorType()) {
484 case kN32_SkColorType: 551 case kN32_SkColorType:
485 proc = &swizzle_small_index_to_n32; 552 proc = &swizzle_small_index_to_n32;
486 break; 553 break;
554 case kRGB_565_SkColorType:
555 proc = &swizzle_small_index_to_565;
556 break;
487 case kIndex_8_SkColorType: 557 case kIndex_8_SkColorType:
488 proc = &swizzle_small_index_to_index; 558 proc = &swizzle_small_index_to_index;
489 break; 559 break;
490 default: 560 default:
491 break; 561 break;
492 } 562 }
493 break; 563 break;
494 case kIndex: 564 case kIndex:
495 switch (dstInfo.colorType()) { 565 switch (dstInfo.colorType()) {
496 case kN32_SkColorType: 566 case kN32_SkColorType:
(...skipping 30 matching lines...) Expand all
527 default: 597 default:
528 break; 598 break;
529 } 599 }
530 break; 600 break;
531 case kBGR: 601 case kBGR:
532 case kBGRX: 602 case kBGRX:
533 switch (dstInfo.colorType()) { 603 switch (dstInfo.colorType()) {
534 case kN32_SkColorType: 604 case kN32_SkColorType:
535 proc = &swizzle_bgrx_to_n32; 605 proc = &swizzle_bgrx_to_n32;
536 break; 606 break;
607 case kRGB_565_SkColorType:
608 proc = &swizzle_bgrx_to_565;
609 break;
537 default: 610 default:
538 break; 611 break;
539 } 612 }
540 break; 613 break;
541 case kBGRA: 614 case kBGRA:
542 switch (dstInfo.colorType()) { 615 switch (dstInfo.colorType()) {
543 case kN32_SkColorType: 616 case kN32_SkColorType:
544 switch (dstInfo.alphaType()) { 617 switch (dstInfo.alphaType()) {
545 case kUnpremul_SkAlphaType: 618 case kUnpremul_SkAlphaType:
546 proc = &swizzle_bgra_to_n32_unpremul; 619 proc = &swizzle_bgra_to_n32_unpremul;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 // bits of SK_ColorBLACK are identical to the 565 representation 770 // bits of SK_ColorBLACK are identical to the 565 representation
698 // for black. 771 // for black.
699 memset(dstStartRow, (uint16_t) colorOrIndex, bytesToFill); 772 memset(dstStartRow, (uint16_t) colorOrIndex, bytesToFill);
700 break; 773 break;
701 default: 774 default:
702 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing nothing.\n"); 775 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing nothing.\n");
703 SkASSERT(false); 776 SkASSERT(false);
704 break; 777 break;
705 } 778 }
706 } 779 }
OLDNEW
« no previous file with comments | « src/codec/SkMaskSwizzler.cpp ('k') | src/codec/SkWebpCodec.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698