Merge "Support Alpha8->RGBA bitmap copying"

This commit is contained in:
Matt Sarett
2017-03-23 22:05:02 +00:00
committed by Android (Google) Code Review

View File

@@ -621,7 +621,7 @@ static void ToColor_SA8(SkColor dst[], const void* src, int width, SkColorTable*
const uint8_t* s = (const uint8_t*)src;
do {
uint8_t c = *s++;
*dst++ = SkColorSetARGB(c, c, c, c);
*dst++ = SkColorSetARGB(c, 0, 0, 0);
} while (--width != 0);
}
@@ -727,6 +727,50 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
return createBitmap(env, nativeBitmap.release(), getPremulBitmapCreateFlags(isMutable));
}
static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src,
SkBitmap::Allocator* alloc) {
// Skia does not support copying from kAlpha8 to types that are not alpha only.
// We will handle this case here.
if (kAlpha_8_SkColorType == src.colorType() && kAlpha_8_SkColorType != dstCT) {
SkAutoPixmapUnlock srcUnlocker;
if (!src.requestLock(&srcUnlocker)) {
return false;
}
SkPixmap srcPixmap = srcUnlocker.pixmap();
SkImageInfo dstInfo = src.info().makeColorType(dstCT);
if (!dst->setInfo(dstInfo)) {
return false;
}
if (!dst->tryAllocPixels(alloc, nullptr)) {
return false;
}
switch (dstCT) {
case kRGBA_8888_SkColorType:
case kBGRA_8888_SkColorType: {
for (int y = 0; y < src.height(); y++) {
const uint8_t* srcRow = srcPixmap.addr8(0, y);
uint32_t* dstRow = dst->getAddr32(0, y);
ToColor_SA8(dstRow, srcRow, src.width(), nullptr);
}
return true;
}
case kRGB_565_SkColorType: {
for (int y = 0; y < src.height(); y++) {
uint16_t* dstRow = dst->getAddr16(0, y);
memset(dstRow, 0, sizeof(uint16_t) * src.width());
}
return true;
}
default:
return false;
}
}
return src.copyTo(dst, dstCT, alloc);
}
static jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle,
jint dstConfigHandle, jboolean isMutable) {
SkBitmap src;
@@ -743,7 +787,7 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle,
SkBitmap result;
HeapAllocator allocator;
if (!src.copyTo(&result, dstCT, &allocator)) {
if (!bitmapCopyTo(&result, dstCT, src, &allocator)) {
return NULL;
}
auto bitmap = allocator.getStorageObjAndReset();
@@ -754,7 +798,7 @@ static Bitmap* Bitmap_copyAshmemImpl(JNIEnv* env, SkBitmap& src, SkColorType& ds
SkBitmap result;
AshmemPixelAllocator allocator(env);
if (!src.copyTo(&result, dstCT, &allocator)) {
if (!bitmapCopyTo(&result, dstCT, src, &allocator)) {
return NULL;
}
auto bitmap = allocator.getStorageObjAndReset();