Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1002319 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

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
parent 8eedb5ad
Loading
Loading
Loading
Loading
+11 −11
Original line number Original line Diff line number Diff line
@@ -437,6 +437,10 @@ static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) {
    return NULL;
    return NULL;
}
}


static bool IsColorSpaceSRGB(SkColorSpace* colorSpace) {
    return colorSpace == nullptr || colorSpace->isSRGB();
}

bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int srcStride,
bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int srcStride,
        int x, int y, int width, int height, const SkBitmap& dstBitmap) {
        int x, int y, int width, int height, const SkBitmap& dstBitmap) {
    void* dst = dstBitmap.getPixels();
    void* dst = dstBitmap.getPixels();
@@ -453,8 +457,7 @@ bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int
    dst = dstBitmap.getAddr(x, y);
    dst = dstBitmap.getAddr(x, y);


    SkColorSpace* colorSpace = dstBitmap.colorSpace();
    SkColorSpace* colorSpace = dstBitmap.colorSpace();
    if (dstBitmap.colorType() == kRGBA_F16_SkColorType ||
    if (dstBitmap.colorType() == kRGBA_F16_SkColorType || IsColorSpaceSRGB(colorSpace)) {
            GraphicsJNI::isColorSpaceSRGB(colorSpace)) {
        // now copy/convert each scanline
        // now copy/convert each scanline
        for (int y = 0; y < height; y++) {
        for (int y = 0; y < height; y++) {
            proc(dst, src, width, x, y);
            proc(dst, src, width, x, y);
@@ -673,8 +676,8 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
    SkBitmap bitmap;
    SkBitmap bitmap;
    sk_sp<SkColorSpace> colorSpace;
    sk_sp<SkColorSpace> colorSpace;


    if (colorType != kN32_SkColorType || xyzD50 == nullptr || transferParameters == nullptr) {
    if (xyzD50 == nullptr || transferParameters == nullptr) {
        colorSpace = GraphicsJNI::colorSpaceForType(colorType);
        colorSpace = SkColorSpace::MakeSRGB();
    } else {
    } else {
        SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
        SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
        SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
        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;
    if (!bitmapHolder.valid()) return JNI_TRUE;


    SkColorSpace* colorSpace = bitmapHolder->info().colorSpace();
    SkColorSpace* colorSpace = bitmapHolder->info().colorSpace();
    return GraphicsJNI::isColorSpaceSRGB(colorSpace);
    return IsColorSpaceSRGB(colorSpace);
}
}


static jboolean Bitmap_isSRGBLinear(JNIEnv* env, jobject, jlong bitmapHandle) {
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);
    proc(dst, src, 1);


    SkColorSpace* colorSpace = bitmap.colorSpace();
    SkColorSpace* colorSpace = bitmap.colorSpace();
    if (bitmap.colorType() != kRGBA_F16_SkColorType &&
    if (bitmap.colorType() != kRGBA_F16_SkColorType &&  !IsColorSpaceSRGB(colorSpace)) {
            !GraphicsJNI::isColorSpaceSRGB(colorSpace)) {
        auto sRGB = SkColorSpace::MakeSRGB();
        auto sRGB = SkColorSpace::MakeSRGB();
        auto xform = SkColorSpaceXform::New(colorSpace, sRGB.get());
        auto xform = SkColorSpaceXform::New(colorSpace, sRGB.get());
        xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &dst[0],
        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;
    SkColor* d = (SkColor*)dst + offset;


    SkColorSpace* colorSpace = bitmap.colorSpace();
    SkColorSpace* colorSpace = bitmap.colorSpace();
    if (bitmap.colorType() == kRGBA_F16_SkColorType ||
    if (bitmap.colorType() == kRGBA_F16_SkColorType || IsColorSpaceSRGB(colorSpace)) {
            GraphicsJNI::isColorSpaceSRGB(colorSpace)) {
        while (--height >= 0) {
        while (--height >= 0) {
            proc(d, src, width);
            proc(d, src, width);
            d += stride;
            d += stride;
@@ -1414,8 +1415,7 @@ static void Bitmap_setPixel(JNIEnv* env, jobject, jlong bitmapHandle,
    }
    }


    SkColorSpace* colorSpace = bitmap.colorSpace();
    SkColorSpace* colorSpace = bitmap.colorSpace();
    if (bitmap.colorType() != kRGBA_F16_SkColorType &&
    if (bitmap.colorType() != kRGBA_F16_SkColorType && !IsColorSpaceSRGB(colorSpace)) {
            !GraphicsJNI::isColorSpaceSRGB(colorSpace)) {
        auto sRGB = SkColorSpace::MakeSRGB();
        auto sRGB = SkColorSpace::MakeSRGB();
        auto xform = SkColorSpaceXform::New(sRGB.get(), colorSpace);
        auto xform = SkColorSpaceXform::New(sRGB.get(), colorSpace);
        xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &color,
        xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, &color,
+1 −1
Original line number Original line Diff line number Diff line
@@ -360,7 +360,7 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr<SkStreamRewindable> stream,
    // use the default.
    // use the default.
    SkImageInfo bitmapInfo = decodeInfo;
    SkImageInfo bitmapInfo = decodeInfo;
    if (decodeInfo.colorSpace() && decodeInfo.colorSpace()->isSRGB()) {
    if (decodeInfo.colorSpace() && decodeInfo.colorSpace()->isSRGB()) {
        bitmapInfo = bitmapInfo.makeColorSpace(GraphicsJNI::colorSpaceForType(decodeColorType));
        bitmapInfo = bitmapInfo.makeColorSpace(decodeInfo.refColorSpace());
    }
    }


    if (decodeColorType == kGray_8_SkColorType) {
    if (decodeColorType == kGray_8_SkColorType) {
+1 −2
Original line number Original line Diff line number Diff line
@@ -196,8 +196,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject,
    SkBitmap bitmap;
    SkBitmap bitmap;
    bitmap.setInfo(SkImageInfo::Make(buffer->getWidth(), buffer->getHeight(),
    bitmap.setInfo(SkImageInfo::Make(buffer->getWidth(), buffer->getHeight(),
                                     convertPixelFormat(buffer->getPixelFormat()),
                                     convertPixelFormat(buffer->getPixelFormat()),
                                     kPremul_SkAlphaType,
                                     kPremul_SkAlphaType),
                                     GraphicsJNI::defaultColorSpace()),
                   bytesCount);
                   bytesCount);


    if (buffer->getWidth() > 0 && buffer->getHeight() > 0) {
    if (buffer->getWidth() > 0 && buffer->getHeight() > 0) {
+0 −25
Original line number Original line Diff line number Diff line
@@ -454,31 +454,6 @@ android::Bitmap* GraphicsJNI::mapAshmemBitmap(JNIEnv* env, SkBitmap* bitmap,
    return wrapper;
    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 GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) {
    SkColorSpaceTransferFn p;
    SkColorSpaceTransferFn p;
    p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
    p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
+0 −5
Original line number Original line Diff line number Diff line
@@ -104,11 +104,6 @@ public:
            int srcStride, int x, int y, int width, int height,
            int srcStride, int x, int y, int width, int height,
            const SkBitmap& dstBitmap);
            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 SkColorSpaceTransferFn getNativeTransferParameters(JNIEnv* env, jobject transferParams);
    static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
    static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
    static sk_sp<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace);
    static sk_sp<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace);
Loading