| Index: src/codec/SkMaskSwizzler.cpp
|
| diff --git a/src/codec/SkMaskSwizzler.cpp b/src/codec/SkMaskSwizzler.cpp
|
| index d0bb646740a10a2a484a324524a85f2e1d9daee9..31fd2cf81e0d9caaf11bece4ce3fd9bb7eacb01e 100644
|
| --- a/src/codec/SkMaskSwizzler.cpp
|
| +++ b/src/codec/SkMaskSwizzler.cpp
|
| @@ -63,6 +63,24 @@ static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_premul(
|
| return COMPUTE_RESULT_ALPHA;
|
| }
|
|
|
| +// TODO (msarett): We have promoted a two byte per pixel image to 8888, only to
|
| +// convert it back to 565. Instead, we should swizzle to 565 directly.
|
| +static SkSwizzler::ResultAlpha swizzle_mask16_to_565(
|
| + void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) {
|
| +
|
| + // Use the masks to decode to the destination
|
| + uint16_t* srcPtr = (uint16_t*) srcRow;
|
| + uint16_t* dstPtr = (uint16_t*) dstRow;
|
| + for (int i = 0; i < width; i++) {
|
| + uint16_t p = srcPtr[i];
|
| + uint8_t red = masks->getRed(p);
|
| + uint8_t green = masks->getGreen(p);
|
| + uint8_t blue = masks->getBlue(p);
|
| + dstPtr[i] = SkPack888ToRGB16(red, green, blue);
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque(
|
| void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) {
|
|
|
| @@ -114,6 +132,21 @@ static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_premul(
|
| return COMPUTE_RESULT_ALPHA;
|
| }
|
|
|
| +static SkSwizzler::ResultAlpha swizzle_mask24_to_565(
|
| + void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) {
|
| +
|
| + // Use the masks to decode to the destination
|
| + uint16_t* dstPtr = (uint16_t*) dstRow;
|
| + for (int i = 0; i < 3*width; i += 3) {
|
| + uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16;
|
| + uint8_t red = masks->getRed(p);
|
| + uint8_t green = masks->getGreen(p);
|
| + uint8_t blue = masks->getBlue(p);
|
| + dstPtr[i/3] = SkPack888ToRGB16(red, green, blue);
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque(
|
| void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) {
|
|
|
| @@ -168,6 +201,21 @@ static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_premul(
|
| return COMPUTE_RESULT_ALPHA;
|
| }
|
|
|
| +static SkSwizzler::ResultAlpha swizzle_mask32_to_565(
|
| + void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) {
|
| + // Use the masks to decode to the destination
|
| + uint32_t* srcPtr = (uint32_t*) srcRow;
|
| + uint16_t* dstPtr = (uint16_t*) dstRow;
|
| + for (int i = 0; i < width; i++) {
|
| + uint32_t p = srcPtr[i];
|
| + uint8_t red = masks->getRed(p);
|
| + uint8_t green = masks->getGreen(p);
|
| + uint8_t blue = masks->getBlue(p);
|
| + dstPtr[i] = SkPack888ToRGB16(red, green, blue);
|
| + }
|
| + return SkSwizzler::kOpaque_ResultAlpha;
|
| +}
|
| +
|
| /*
|
| *
|
| * Create a new mask swizzler
|
| @@ -196,6 +244,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(
|
| break;
|
| }
|
| break;
|
| + case kRGB_565_SkColorType:
|
| + switch (info.alphaType()) {
|
| + case kOpaque_SkAlphaType:
|
| + proc = &swizzle_mask16_to_565;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| default:
|
| break;
|
| }
|
| @@ -217,6 +274,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(
|
| break;
|
| }
|
| break;
|
| + case kRGB_565_SkColorType:
|
| + switch (info.alphaType()) {
|
| + case kOpaque_SkAlphaType:
|
| + proc = &swizzle_mask24_to_565;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| default:
|
| break;
|
| }
|
| @@ -238,6 +304,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(
|
| break;
|
| }
|
| break;
|
| + case kRGB_565_SkColorType:
|
| + switch (info.alphaType()) {
|
| + case kOpaque_SkAlphaType:
|
| + proc = &swizzle_mask32_to_565;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| default:
|
| break;
|
| }
|
|
|