Merge "Default all new bitmaps to sRGB colorspace unless explicitly requested."

This commit is contained in:
TreeHugger Robot
2018-08-07 18:56:43 +00:00
committed by Android (Google) Code Review
7 changed files with 15 additions and 48 deletions

View File

@@ -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<SkColorSpace> 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,

View File

@@ -360,7 +360,7 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr<SkStreamRewindable> 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) {

View File

@@ -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) {

View File

@@ -454,31 +454,6 @@ android::Bitmap* GraphicsJNI::mapAshmemBitmap(JNIEnv* env, SkBitmap* bitmap,
return wrapper;
}
sk_sp<SkColorSpace> GraphicsJNI::defaultColorSpace() {
#ifdef ANDROID_ENABLE_LINEAR_BLENDING
return SkColorSpace::MakeSRGB();
#else
return nullptr;
#endif
}
sk_sp<SkColorSpace> GraphicsJNI::linearColorSpace() {
return SkColorSpace::MakeSRGBLinear();
}
sk_sp<SkColorSpace> 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);

View File

@@ -104,11 +104,6 @@ public:
int srcStride, int x, int y, int width, int height,
const SkBitmap& dstBitmap);
static sk_sp<SkColorSpace> defaultColorSpace();
static sk_sp<SkColorSpace> linearColorSpace();
static sk_sp<SkColorSpace> 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<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace);

View File

@@ -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);

View File

@@ -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);
}
/**