| Index: src/core/SkConfig8888.cpp
|
| diff --git a/src/core/SkConfig8888.cpp b/src/core/SkConfig8888.cpp
|
| index 85e208f2875b987edc253a925f75b7d46ea5f81d..d28941c27cf79120d3cd2a041ca577988c7bd82c 100644
|
| --- a/src/core/SkConfig8888.cpp
|
| +++ b/src/core/SkConfig8888.cpp
|
| @@ -137,6 +137,47 @@ static void rect_memcpy(void* dst, size_t dstRB, const void* src, size_t srcRB,
|
| }
|
| }
|
|
|
| +static void copy_g8_to_32(void* dst, size_t dstRB, const void* src, size_t srcRB, int w, int h) {
|
| + uint32_t* dst32 = (uint32_t*)dst;
|
| + const uint8_t* src8 = (const uint8_t*)src;
|
| +
|
| + for (int y = 0; y < h; ++y) {
|
| + for (int x = 0; x < w; ++x) {
|
| + dst32[x] = SkPackARGB32(0xFF, src8[x], src8[x], src8[x]);
|
| + }
|
| + dst32 = (uint32_t*)((char*)dst32 + dstRB);
|
| + src8 += srcRB;
|
| + }
|
| +}
|
| +
|
| +static void copy_32_to_g8(void* dst, size_t dstRB, const void* src, size_t srcRB,
|
| + const SkImageInfo& srcInfo) {
|
| + uint8_t* dst8 = (uint8_t*)dst;
|
| + const uint32_t* src32 = (const uint32_t*)src;
|
| +
|
| + const int w = srcInfo.width();
|
| + const int h = srcInfo.height();
|
| + const bool isBGRA = (kBGRA_8888_SkColorType == srcInfo.colorType());
|
| +
|
| + for (int y = 0; y < h; ++y) {
|
| + if (isBGRA) {
|
| + // BGRA
|
| + for (int x = 0; x < w; ++x) {
|
| + uint32_t s = src32[x];
|
| + dst8[x] = SkComputeLuminance((s >> 16) & 0xFF, (s >> 8) & 0xFF, s & 0xFF);
|
| + }
|
| + } else {
|
| + // RGBA
|
| + for (int x = 0; x < w; ++x) {
|
| + uint32_t s = src32[x];
|
| + dst8[x] = SkComputeLuminance(s & 0xFF, (s >> 8) & 0xFF, (s >> 16) & 0xFF);
|
| + }
|
| + }
|
| + src32 = (const uint32_t*)((const char*)src32 + srcRB);
|
| + dst8 += dstRB;
|
| + }
|
| +}
|
| +
|
| bool SkPixelInfo::CopyPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRB,
|
| const SkImageInfo& srcInfo, const void* srcPixels, size_t srcRB,
|
| SkColorTable* ctable) {
|
| @@ -170,6 +211,7 @@ bool SkPixelInfo::CopyPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t
|
| switch (srcInfo.colorType()) {
|
| case kRGB_565_SkColorType:
|
| case kAlpha_8_SkColorType:
|
| + case kGray_8_SkColorType:
|
| break;
|
| case kIndex_8_SkColorType:
|
| case kARGB_4444_SkColorType:
|
| @@ -189,6 +231,15 @@ bool SkPixelInfo::CopyPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t
|
| * are supported.
|
| */
|
|
|
| + if (kGray_8_SkColorType == srcInfo.colorType() && 4 == dstInfo.bytesPerPixel()) {
|
| + copy_g8_to_32(dstPixels, dstRB, srcPixels, srcRB, width, height);
|
| + return true;
|
| + }
|
| + if (kGray_8_SkColorType == dstInfo.colorType() && 4 == srcInfo.bytesPerPixel()) {
|
| + copy_32_to_g8(dstPixels, dstRB, srcPixels, srcRB, srcInfo);
|
| + return true;
|
| + }
|
| +
|
| // Can no longer draw directly into 4444, but we can manually whack it for a few combinations
|
| if (kARGB_4444_SkColorType == dstInfo.colorType() &&
|
| (kN32_SkColorType == srcInfo.colorType() || kIndex_8_SkColorType == srcInfo.colorType())) {
|
|
|