From b10023191893d22c85a082c62130a7cf1ae334a1 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Thu, 2 Aug 2018 10:15:09 -0400 Subject: [PATCH] Default all new bitmaps to sRGB colorspace unless explicitly requested. This fixes breakages in the WideColorGamutTests that resulted from a change in Skia. Skia now treats all non-tagged sources as sRGB instead of sometimes assuming sRGB_linear. Test: atest CtsUiRenderingTestCases Bug: 111836790 Change-Id: If7b1c00ad889446658f98e9ad644869e2eeabcdb --- core/jni/android/graphics/Bitmap.cpp | 22 +++++++++--------- core/jni/android/graphics/BitmapFactory.cpp | 2 +- core/jni/android/graphics/GraphicBuffer.cpp | 3 +-- core/jni/android/graphics/Graphics.cpp | 25 --------------------- core/jni/android/graphics/GraphicsJNI.h | 5 ----- core/jni/android_view_Surface.cpp | 3 +-- core/jni/android_view_TextureView.cpp | 3 +-- 7 files changed, 15 insertions(+), 48 deletions(-) diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index e5aea9730b51f..02076bde07f97 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -437,6 +437,10 @@ static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { return NULL; } +static bool IsColorSpaceSRGB(SkColorSpace* colorSpace) { + return colorSpace == nullptr || colorSpace->isSRGB(); +} + bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int srcStride, int x, int y, int width, int height, const SkBitmap& dstBitmap) { void* dst = dstBitmap.getPixels(); @@ -453,8 +457,7 @@ bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int dst = dstBitmap.getAddr(x, y); SkColorSpace* colorSpace = dstBitmap.colorSpace(); - if (dstBitmap.colorType() == kRGBA_F16_SkColorType || - GraphicsJNI::isColorSpaceSRGB(colorSpace)) { + if (dstBitmap.colorType() == kRGBA_F16_SkColorType || IsColorSpaceSRGB(colorSpace)) { // now copy/convert each scanline for (int y = 0; y < height; y++) { proc(dst, src, width, x, y); @@ -673,8 +676,8 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, SkBitmap bitmap; sk_sp colorSpace; - if (colorType != kN32_SkColorType || xyzD50 == nullptr || transferParameters == nullptr) { - colorSpace = GraphicsJNI::colorSpaceForType(colorType); + if (xyzD50 == nullptr || transferParameters == nullptr) { + colorSpace = SkColorSpace::MakeSRGB(); } else { SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters); SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50); @@ -1268,7 +1271,7 @@ static jboolean Bitmap_isSRGB(JNIEnv* env, jobject, jlong bitmapHandle) { if (!bitmapHolder.valid()) return JNI_TRUE; SkColorSpace* colorSpace = bitmapHolder->info().colorSpace(); - return GraphicsJNI::isColorSpaceSRGB(colorSpace); + return IsColorSpaceSRGB(colorSpace); } static jboolean Bitmap_isSRGBLinear(JNIEnv* env, jobject, jlong bitmapHandle) { @@ -1340,8 +1343,7 @@ static jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle, proc(dst, src, 1); SkColorSpace* colorSpace = bitmap.colorSpace(); - if (bitmap.colorType() != kRGBA_F16_SkColorType && - !GraphicsJNI::isColorSpaceSRGB(colorSpace)) { + if (bitmap.colorType() != kRGBA_F16_SkColorType && !IsColorSpaceSRGB(colorSpace)) { auto sRGB = SkColorSpace::MakeSRGB(); auto xform = SkColorSpaceXform::New(colorSpace, sRGB.get()); xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &dst[0], @@ -1371,8 +1373,7 @@ static void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle, SkColor* d = (SkColor*)dst + offset; SkColorSpace* colorSpace = bitmap.colorSpace(); - if (bitmap.colorType() == kRGBA_F16_SkColorType || - GraphicsJNI::isColorSpaceSRGB(colorSpace)) { + if (bitmap.colorType() == kRGBA_F16_SkColorType || IsColorSpaceSRGB(colorSpace)) { while (--height >= 0) { proc(d, src, width); d += stride; @@ -1414,8 +1415,7 @@ static void Bitmap_setPixel(JNIEnv* env, jobject, jlong bitmapHandle, } SkColorSpace* colorSpace = bitmap.colorSpace(); - if (bitmap.colorType() != kRGBA_F16_SkColorType && - !GraphicsJNI::isColorSpaceSRGB(colorSpace)) { + if (bitmap.colorType() != kRGBA_F16_SkColorType && !IsColorSpaceSRGB(colorSpace)) { auto sRGB = SkColorSpace::MakeSRGB(); auto xform = SkColorSpaceXform::New(sRGB.get(), colorSpace); xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &color, diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 685fcaf152119..9ae05f4c1e089 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -360,7 +360,7 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr stream, // use the default. SkImageInfo bitmapInfo = decodeInfo; if (decodeInfo.colorSpace() && decodeInfo.colorSpace()->isSRGB()) { - bitmapInfo = bitmapInfo.makeColorSpace(GraphicsJNI::colorSpaceForType(decodeColorType)); + bitmapInfo = bitmapInfo.makeColorSpace(decodeInfo.refColorSpace()); } if (decodeColorType == kGray_8_SkColorType) { diff --git a/core/jni/android/graphics/GraphicBuffer.cpp b/core/jni/android/graphics/GraphicBuffer.cpp index ae6fd38da319b..344e22c2ed691 100644 --- a/core/jni/android/graphics/GraphicBuffer.cpp +++ b/core/jni/android/graphics/GraphicBuffer.cpp @@ -196,8 +196,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject, SkBitmap bitmap; bitmap.setInfo(SkImageInfo::Make(buffer->getWidth(), buffer->getHeight(), convertPixelFormat(buffer->getPixelFormat()), - kPremul_SkAlphaType, - GraphicsJNI::defaultColorSpace()), + kPremul_SkAlphaType), bytesCount); if (buffer->getWidth() > 0 && buffer->getHeight() > 0) { diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 5d65aee5db2a2..26af15e79e2dc 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -454,31 +454,6 @@ android::Bitmap* GraphicsJNI::mapAshmemBitmap(JNIEnv* env, SkBitmap* bitmap, return wrapper; } -sk_sp GraphicsJNI::defaultColorSpace() { -#ifdef ANDROID_ENABLE_LINEAR_BLENDING - return SkColorSpace::MakeSRGB(); -#else - return nullptr; -#endif -} - -sk_sp GraphicsJNI::linearColorSpace() { - return SkColorSpace::MakeSRGBLinear(); -} - -sk_sp GraphicsJNI::colorSpaceForType(SkColorType type) { - switch (type) { - case kRGBA_F16_SkColorType: - return linearColorSpace(); - default: - return defaultColorSpace(); - } -} - -bool GraphicsJNI::isColorSpaceSRGB(SkColorSpace* colorSpace) { - return colorSpace == nullptr || colorSpace->isSRGB(); -} - SkColorSpaceTransferFn GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) { SkColorSpaceTransferFn p; p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID); diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 7825f1d7708b8..9d85cc25b6b01 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -104,11 +104,6 @@ public: int srcStride, int x, int y, int width, int height, const SkBitmap& dstBitmap); - static sk_sp defaultColorSpace(); - static sk_sp linearColorSpace(); - static sk_sp colorSpaceForType(SkColorType type); - static bool isColorSpaceSRGB(SkColorSpace* colorSpace); - static SkColorSpaceTransferFn getNativeTransferParameters(JNIEnv* env, jobject transferParams); static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50); static sk_sp getNativeColorSpace(JNIEnv* env, jobject colorSpace); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index f70cf07b9535f..f512ce418a933 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -332,8 +332,7 @@ static jlong nativeLockCanvas(JNIEnv* env, jclass clazz, SkImageInfo info = SkImageInfo::Make(outBuffer.width, outBuffer.height, convertPixelFormat(outBuffer.format), outBuffer.format == PIXEL_FORMAT_RGBX_8888 - ? kOpaque_SkAlphaType : kPremul_SkAlphaType, - GraphicsJNI::defaultColorSpace()); + ? kOpaque_SkAlphaType : kPremul_SkAlphaType); SkBitmap bitmap; ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format); diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp index 2921b3789e40e..15319adf134a9 100644 --- a/core/jni/android_view_TextureView.cpp +++ b/core/jni/android_view_TextureView.cpp @@ -94,8 +94,7 @@ static inline SkImageInfo convertPixelFormat(const ANativeWindow_Buffer& buffer) default: break; } - return SkImageInfo::Make(buffer.width, buffer.height, colorType, alphaType, - GraphicsJNI::defaultColorSpace()); + return SkImageInfo::Make(buffer.width, buffer.height, colorType, alphaType); } /**