| Index: src/codec/SkSwizzler.cpp
|
| diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp
|
| index 998fbeb851f6bb99c36190419ad59730311da1a7..321baf1dc5ea5b01fbaf91d3608413d96ee6a9b5 100644
|
| --- a/src/codec/SkSwizzler.cpp
|
| +++ b/src/codec/SkSwizzler.cpp
|
| @@ -116,6 +116,20 @@ static SkSwizzler::ResultAlpha swizzle_index_to_n32_skipZ(
|
| return COMPUTE_RESULT_ALPHA;
|
| }
|
|
|
| +static SkSwizzler::ResultAlpha swizzle_index_to_565(
|
| + void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width,
|
| + int bytesPerPixel, const SkPMColor ctable[]) {
|
| + // FIXME: Support dithering? Requires knowing y, which I think is a bigger
|
| + // change.
|
| + uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
|
| + for (int x = 0; x < width; x++) {
|
| + dst[x] = SkPixel32ToPixel16(ctable[*src]);
|
| + src += bytesPerPixel;
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| +
|
| #undef A32_MASK_IN_PLACE
|
|
|
| // kGray
|
| @@ -138,6 +152,18 @@ static SkSwizzler::ResultAlpha swizzle_gray_to_gray(
|
| return SkSwizzler::kOpaque_ResultAlpha;
|
| }
|
|
|
| +static SkSwizzler::ResultAlpha swizzle_gray_to_565(
|
| + void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width,
|
| + int bytesPerPixel, const SkPMColor ctable[]) {
|
| + // FIXME: Support dithering?
|
| + uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
|
| + for (int x = 0; x < width; x++) {
|
| + dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]);
|
| + src += bytesPerPixel;
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| // kBGRX
|
|
|
| static SkSwizzler::ResultAlpha swizzle_bgrx_to_n32(
|
| @@ -184,7 +210,7 @@ static SkSwizzler::ResultAlpha swizzle_bgra_to_n32_premul(
|
| return COMPUTE_RESULT_ALPHA;
|
| }
|
|
|
| -// n32
|
| +// kRGBX
|
| static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32(
|
| void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width,
|
| int bytesPerPixel, const SkPMColor ctable[]) {
|
| @@ -197,6 +223,20 @@ static SkSwizzler::ResultAlpha swizzle_rgbx_to_n32(
|
| return SkSwizzler::kOpaque_ResultAlpha;
|
| }
|
|
|
| +static SkSwizzler::ResultAlpha swizzle_rgbx_to_565(
|
| + void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width,
|
| + int bytesPerPixel, const SkPMColor ctable[]) {
|
| + // FIXME: Support dithering?
|
| + uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
|
| + for (int x = 0; x < width; x++) {
|
| + dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]);
|
| + src += bytesPerPixel;
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| +
|
| +// kRGBA
|
| static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul(
|
| void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int width,
|
| int bytesPerPixel, const SkPMColor ctable[]) {
|
| @@ -310,6 +350,9 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc,
|
| break;
|
| }
|
| break;
|
| + case kRGB_565_SkColorType:
|
| + proc = &swizzle_index_to_565;
|
| + break;
|
| case kIndex_8_SkColorType:
|
| proc = &swizzle_index_to_index;
|
| break;
|
| @@ -324,6 +367,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc,
|
| break;
|
| case kGray_8_SkColorType:
|
| proc = &swizzle_gray_to_gray;
|
| + break;
|
| + case kRGB_565_SkColorType:
|
| + proc = &swizzle_gray_to_565;
|
| + break;
|
| default:
|
| break;
|
| }
|
| @@ -362,6 +409,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc,
|
| case kN32_SkColorType:
|
| proc = &swizzle_rgbx_to_n32;
|
| break;
|
| + case kRGB_565_SkColorType:
|
| + proc = &swizzle_rgbx_to_565;
|
| default:
|
| break;
|
| }
|
|
|