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

Commit 40f4cb5d authored by Brian Osman's avatar Brian Osman Committed by Android (Google) Code Review
Browse files

Merge "Switch to skcms-based factories and getters in SkColorSpace"

parents 53ee650b be8fac26
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -81,8 +81,7 @@ static sk_sp<SkColorSpace> dataSpaceToColorSpace(ui::Dataspace d)
        case ui::Dataspace::V0_SRGB:
            return SkColorSpace::MakeSRGB();
        case ui::Dataspace::DISPLAY_P3:
            return SkColorSpace::MakeRGB(
                    SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kDCIP3_D65_Gamut);
            return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
        default:
            return nullptr;
    }
+23 −25
Original line number Diff line number Diff line
@@ -8,7 +8,6 @@
#include "SkImageInfo.h"
#include "SkColor.h"
#include "SkColorSpace.h"
#include "SkMatrix44.h"
#include "GraphicsJNI.h"
#include "SkStream.h"

@@ -356,8 +355,8 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors,
    if (xyzD50 == nullptr || transferParameters == nullptr) {
        colorSpace = SkColorSpace::MakeSRGB();
    } else {
        SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
        SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
        skcms_TransferFunction p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
        skcms_Matrix3x3 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
        colorSpace = SkColorSpace::MakeRGB(p, xyzMatrix);
    }

@@ -549,8 +548,7 @@ static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle,
    if (skbitmap.colorType() == kRGBA_F16_SkColorType) {
        // Convert to P3 before encoding. This matches SkAndroidCodec::computeOutputColorSpace
        // for wide gamuts.
        auto cs = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
                                        SkColorSpace::kDCIP3_D65_Gamut);
        auto cs = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
        auto info = skbitmap.info().makeColorType(kRGBA_8888_SkColorType)
                                   .makeColorSpace(std::move(cs));
        SkBitmap p3;
@@ -910,32 +908,32 @@ static jboolean Bitmap_getColorSpace(JNIEnv* env, jobject, jlong bitmapHandle,
    SkColorSpace* colorSpace = bitmapHolder->info().colorSpace();
    if (colorSpace == nullptr) return JNI_FALSE;

    SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor);
    skcms_Matrix3x3 xyzMatrix;
    if (!colorSpace->toXYZD50(&xyzMatrix)) return JNI_FALSE;

    jfloat* xyz = env->GetFloatArrayElements(xyzArray, NULL);
    xyz[0] = xyzMatrix.getFloat(0, 0);
    xyz[1] = xyzMatrix.getFloat(1, 0);
    xyz[2] = xyzMatrix.getFloat(2, 0);
    xyz[3] = xyzMatrix.getFloat(0, 1);
    xyz[4] = xyzMatrix.getFloat(1, 1);
    xyz[5] = xyzMatrix.getFloat(2, 1);
    xyz[6] = xyzMatrix.getFloat(0, 2);
    xyz[7] = xyzMatrix.getFloat(1, 2);
    xyz[8] = xyzMatrix.getFloat(2, 2);
    xyz[0] = xyzMatrix.vals[0][0];
    xyz[1] = xyzMatrix.vals[1][0];
    xyz[2] = xyzMatrix.vals[2][0];
    xyz[3] = xyzMatrix.vals[0][1];
    xyz[4] = xyzMatrix.vals[1][1];
    xyz[5] = xyzMatrix.vals[2][1];
    xyz[6] = xyzMatrix.vals[0][2];
    xyz[7] = xyzMatrix.vals[1][2];
    xyz[8] = xyzMatrix.vals[2][2];
    env->ReleaseFloatArrayElements(xyzArray, xyz, 0);

    SkColorSpaceTransferFn transferParams;
    skcms_TransferFunction transferParams;
    if (!colorSpace->isNumericalTransferFn(&transferParams)) return JNI_FALSE;

    jfloat* params = env->GetFloatArrayElements(paramsArray, NULL);
    params[0] = transferParams.fA;
    params[1] = transferParams.fB;
    params[2] = transferParams.fC;
    params[3] = transferParams.fD;
    params[4] = transferParams.fE;
    params[5] = transferParams.fF;
    params[6] = transferParams.fG;
    params[0] = transferParams.a;
    params[1] = transferParams.b;
    params[2] = transferParams.c;
    params[3] = transferParams.d;
    params[4] = transferParams.e;
    params[5] = transferParams.f;
    params[6] = transferParams.g;
    env->ReleaseFloatArrayElements(paramsArray, params, 0);

    return JNI_TRUE;
@@ -1121,8 +1119,8 @@ static jobject Bitmap_createHardwareBitmap(JNIEnv* env, jobject, jobject graphic

static jobject Bitmap_wrapHardwareBufferBitmap(JNIEnv* env, jobject, jobject hardwareBuffer,
                                               jfloatArray xyzD50, jobject transferParameters) {
    SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
    SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
    skcms_TransferFunction p = GraphicsJNI::getNativeTransferParameters(env, transferParameters);
    skcms_Matrix3x3 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50);
    sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(p, xyzMatrix);
    AHardwareBuffer* hwBuf = android_hardware_HardwareBuffer_getNativeHardwareBuffer(env,
        hardwareBuffer);
+36 −36
Original line number Diff line number Diff line
@@ -424,30 +424,30 @@ jobject GraphicsJNI::createRegion(JNIEnv* env, SkRegion* region)

///////////////////////////////////////////////////////////////////////////////

SkColorSpaceTransferFn GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) {
    SkColorSpaceTransferFn p;
    p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
    p.fB = (float) env->GetDoubleField(transferParams, gTransferParams_bFieldID);
    p.fC = (float) env->GetDoubleField(transferParams, gTransferParams_cFieldID);
    p.fD = (float) env->GetDoubleField(transferParams, gTransferParams_dFieldID);
    p.fE = (float) env->GetDoubleField(transferParams, gTransferParams_eFieldID);
    p.fF = (float) env->GetDoubleField(transferParams, gTransferParams_fFieldID);
    p.fG = (float) env->GetDoubleField(transferParams, gTransferParams_gFieldID);
skcms_TransferFunction GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) {
    skcms_TransferFunction p;
    p.a = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID);
    p.b = (float) env->GetDoubleField(transferParams, gTransferParams_bFieldID);
    p.c = (float) env->GetDoubleField(transferParams, gTransferParams_cFieldID);
    p.d = (float) env->GetDoubleField(transferParams, gTransferParams_dFieldID);
    p.e = (float) env->GetDoubleField(transferParams, gTransferParams_eFieldID);
    p.f = (float) env->GetDoubleField(transferParams, gTransferParams_fFieldID);
    p.g = (float) env->GetDoubleField(transferParams, gTransferParams_gFieldID);
    return p;
}

SkMatrix44 GraphicsJNI::getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50) {
    SkMatrix44 xyzMatrix(SkMatrix44::kIdentity_Constructor);
skcms_Matrix3x3 GraphicsJNI::getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50) {
    skcms_Matrix3x3 xyzMatrix;
    jfloat* array = env->GetFloatArrayElements(xyzD50, NULL);
    xyzMatrix.setFloat(0, 0, array[0]);
    xyzMatrix.setFloat(1, 0, array[1]);
    xyzMatrix.setFloat(2, 0, array[2]);
    xyzMatrix.setFloat(0, 1, array[3]);
    xyzMatrix.setFloat(1, 1, array[4]);
    xyzMatrix.setFloat(2, 1, array[5]);
    xyzMatrix.setFloat(0, 2, array[6]);
    xyzMatrix.setFloat(1, 2, array[7]);
    xyzMatrix.setFloat(2, 2, array[8]);
    xyzMatrix.vals[0][0] = array[0];
    xyzMatrix.vals[1][0] = array[1];
    xyzMatrix.vals[2][0] = array[2];
    xyzMatrix.vals[0][1] = array[3];
    xyzMatrix.vals[1][1] = array[4];
    xyzMatrix.vals[2][1] = array[5];
    xyzMatrix.vals[0][2] = array[6];
    xyzMatrix.vals[1][2] = array[7];
    xyzMatrix.vals[2][2] = array[8];
    env->ReleaseFloatArrayElements(xyzD50, array, 0);
    return xyzMatrix;
}
@@ -472,8 +472,8 @@ sk_sp<SkColorSpace> GraphicsJNI::getNativeColorSpace(JNIEnv* env, jobject colorS
    jfloatArray xyzD50 = (jfloatArray) env->CallObjectMethod(colorSpaceD50,
            gColorSpaceRGB_getTransformMethodID);

    SkMatrix44 xyzMatrix = getNativeXYZMatrix(env, xyzD50);
    SkColorSpaceTransferFn transferFunction = getNativeTransferParameters(env, transferParams);
    skcms_Matrix3x3 xyzMatrix = getNativeXYZMatrix(env, xyzD50);
    skcms_TransferFunction transferFunction = getNativeTransferParameters(env, transferParams);

    return SkColorSpace::MakeRGB(transferFunction, xyzMatrix);
}
@@ -499,30 +499,30 @@ jobject GraphicsJNI::getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColor
        } else if (decodeColorSpace.get() != nullptr) {
            // Try to match against known RGB color spaces using the CIE XYZ D50
            // conversion matrix and numerical transfer function parameters
            SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor);
            skcms_Matrix3x3 xyzMatrix;
            LOG_ALWAYS_FATAL_IF(!decodeColorSpace->toXYZD50(&xyzMatrix));

            SkColorSpaceTransferFn transferParams;
            skcms_TransferFunction transferParams;
            // We can only handle numerical transfer functions at the moment
            LOG_ALWAYS_FATAL_IF(!decodeColorSpace->isNumericalTransferFn(&transferParams));

            jobject params = env->NewObject(gTransferParameters_class,
                    gTransferParameters_constructorMethodID,
                    transferParams.fA, transferParams.fB, transferParams.fC,
                    transferParams.fD, transferParams.fE, transferParams.fF,
                    transferParams.fG);
                    transferParams.a, transferParams.b, transferParams.c,
                    transferParams.d, transferParams.e, transferParams.f,
                    transferParams.g);

            jfloatArray xyzArray = env->NewFloatArray(9);
            jfloat xyz[9] = {
                    xyzMatrix.getFloat(0, 0),
                    xyzMatrix.getFloat(1, 0),
                    xyzMatrix.getFloat(2, 0),
                    xyzMatrix.getFloat(0, 1),
                    xyzMatrix.getFloat(1, 1),
                    xyzMatrix.getFloat(2, 1),
                    xyzMatrix.getFloat(0, 2),
                    xyzMatrix.getFloat(1, 2),
                    xyzMatrix.getFloat(2, 2)
                    xyzMatrix.vals[0][0],
                    xyzMatrix.vals[1][0],
                    xyzMatrix.vals[2][0],
                    xyzMatrix.vals[0][1],
                    xyzMatrix.vals[1][1],
                    xyzMatrix.vals[2][1],
                    xyzMatrix.vals[0][2],
                    xyzMatrix.vals[1][2],
                    xyzMatrix.vals[2][2]
            };
            env->SetFloatArrayRegion(xyzArray, 0, 9, xyz);

+2 −3
Original line number Diff line number Diff line
@@ -10,7 +10,6 @@
#include "SkPoint.h"
#include "SkRect.h"
#include "SkColorSpace.h"
#include "SkMatrix44.h"
#include <jni.h>
#include <hwui/Canvas.h>
#include <hwui/Bitmap.h>
@@ -101,8 +100,8 @@ public:
            int srcStride, int x, int y, int width, int height,
            SkBitmap* dstBitmap);

    static SkColorSpaceTransferFn getNativeTransferParameters(JNIEnv* env, jobject transferParams);
    static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
    static skcms_TransferFunction getNativeTransferParameters(JNIEnv* env, jobject transferParams);
    static skcms_Matrix3x3 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50);
    static sk_sp<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace);

    static jobject getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColorSpace,
+1 −2
Original line number Diff line number Diff line
@@ -79,8 +79,7 @@ static void queryWideColorGamutPreference(SkColorSpace::Gamut* colorGamut,
    switch (wcgDataspace) {
        case ui::Dataspace::DISPLAY_P3:
            *colorGamut = SkColorSpace::Gamut::kDCIP3_D65_Gamut;
            *colorSpace = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
                                                SkColorSpace::Gamut::kDCIP3_D65_Gamut);
            *colorSpace = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDCIP3);
            break;
        case ui::Dataspace::V0_SCRGB:
            *colorGamut = SkColorSpace::Gamut::kSRGB_Gamut;
Loading