From 5acc476878bce8b72c0059e05cbbd5b43ffee5d5 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 7 Mar 2017 15:29:27 -0800 Subject: [PATCH] Write Bitmap's color space in parcel This change also resets the cached color space field in Bitmap.java when reconfigure() is called or when a bitmap is reused by the bitmap factory. Bug: 32072280 Test: CtsGraphicsTestCases.BitmapColorSpaceTest Change-Id: I232b729b7a29e65bfff21dc749570c3c80adf855 --- core/jni/android/graphics/Bitmap.cpp | 31 +++++++++++++--------- graphics/java/android/graphics/Bitmap.java | 2 ++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 2766689c23c47..e4493b1f489a2 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -924,7 +924,13 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { const bool isMutable = p->readInt32() != 0; const SkColorType colorType = (SkColorType)p->readInt32(); const SkAlphaType alphaType = (SkAlphaType)p->readInt32(); - const bool isSRGB = p->readInt32() != 0; + const uint32_t colorSpaceSize = p->readUint32(); + sk_sp colorSpace; + if (kRGBA_F16_SkColorType == colorType) { + colorSpace = SkColorSpace::MakeSRGBLinear(); + } else if (colorSpaceSize > 0) { + colorSpace = SkColorSpace::Deserialize(p->readInplace(colorSpaceSize), colorSpaceSize); + } const int width = p->readInt32(); const int height = p->readInt32(); const int rowBytes = p->readInt32(); @@ -941,14 +947,6 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { } std::unique_ptr bitmap(new SkBitmap); - - sk_sp colorSpace; - if (kRGBA_F16_SkColorType == colorType) { - colorSpace = SkColorSpace::MakeSRGBLinear(); - } else { - colorSpace = isSRGB ? SkColorSpace::MakeSRGB() : nullptr; - } - if (!bitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType, colorSpace), rowBytes)) { return NULL; @@ -1065,13 +1063,20 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, auto bitmapWrapper = reinterpret_cast(bitmapHandle); bitmapWrapper->getSkBitmap(&bitmap); - sk_sp sRGB = SkColorSpace::MakeSRGB(); - bool isSRGB = bitmap.colorSpace() == sRGB.get(); - p->writeInt32(isMutable); p->writeInt32(bitmap.colorType()); p->writeInt32(bitmap.alphaType()); - p->writeInt32(isSRGB); // TODO: We should write the color space (b/32072280) + SkColorSpace* colorSpace = bitmap.colorSpace(); + if (colorSpace != nullptr && bitmap.colorType() != kRGBA_F16_SkColorType) { + sk_sp data = colorSpace->serialize(); + size_t size = data->size(); + p->writeUint32(size); + if (size > 0) { + p->write(data->data(), size); + } + } else { + p->writeUint32(0); + } p->writeInt32(bitmap.width()); p->writeInt32(bitmap.height()); p->writeInt32(bitmap.rowBytes()); diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 9cd9d3d75749a..6bb8a2cac430a 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -147,6 +147,7 @@ public final class Bitmap implements Parcelable { mWidth = width; mHeight = height; mRequestPremultiplied = requestPremultiplied; + mColorSpace = null; } /** @@ -254,6 +255,7 @@ public final class Bitmap implements Parcelable { nativeReconfigure(mNativePtr, width, height, config.nativeInt, mRequestPremultiplied); mWidth = width; mHeight = height; + mColorSpace = null; } /**