Merge "Default all new bitmaps to sRGB colorspace unless explicitly requested."
This commit is contained in:
committed by
Android (Google) Code Review
commit
b1406c004f
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user