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

Commit 700629d8 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Support more dataspaces in DataSpaceToColorSpace

Bug: 135133301
Test: ?

Create an SkColorSpace for HAL_DATASPACE_TRANSFER_ST2084 and
HAL_DATASPACE_TRANSFER_SMPTE_170M. This allows converting
ADATASPACE_BT709, ADATASPACE_BT2020, and ADATASPACE_BT709 into
SkColorSpaces. In addition, treat HAL_DATASPACE_DCI_P3 (aka
HAL_DATASPACE_DCI_P3) specially, because its gamut does not match
SkNamedGamut::kSRGB.

This will allow Ia8ba4c17b517a05b664c6e317e235836473fd7f6 to use
DataSpaceToColorSpace, rather than its own, slightly different version.

Change-Id: I24fffd79c2bf251c28c2d0b8c3d2889dbffa772d
parent 4c0487a1
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -108,10 +108,26 @@ SkColorType PixelFormatToColorType(android::PixelFormat format) {
    }
}

// FIXME: Share with the version in android_bitmap.cpp?
// Skia's SkNamedGamut::kDCIP3 is based on a white point of D65. This gamut
// matches the white point used by ColorSpace.Named.DCIP3.
static constexpr skcms_Matrix3x3 kDCIP3 = {{
        {0.486143, 0.323835, 0.154234},
        {0.226676, 0.710327, 0.0629966},
        {0.000800549, 0.0432385, 0.78275},
}};

sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
    if (dataspace == HAL_DATASPACE_UNKNOWN) {
        return SkColorSpace::MakeSRGB();
    }
    if (dataspace == HAL_DATASPACE_DCI_P3) {
        // This cannot be handled by the switch statements below because it
        // needs to use the locally-defined kDCIP3 gamut, rather than the one in
        // Skia (SkNamedGamut), which is used for other data spaces with
        // HAL_DATASPACE_STANDARD_DCI_P3 (e.g. HAL_DATASPACE_DISPLAY_P3).
        return SkColorSpace::MakeRGB({2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, kDCIP3);
    }

    skcms_Matrix3x3 gamut;
    switch (dataspace & HAL_DATASPACE_STANDARD_MASK) {
@@ -152,10 +168,12 @@ sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) {
            return SkColorSpace::MakeRGB({2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
        case HAL_DATASPACE_TRANSFER_GAMMA2_8:
            return SkColorSpace::MakeRGB({2.8f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
        case HAL_DATASPACE_TRANSFER_ST2084:
            return SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, gamut);
        case HAL_DATASPACE_TRANSFER_SMPTE_170M:
            return SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, gamut);
        case HAL_DATASPACE_TRANSFER_UNSPECIFIED:
            return nullptr;
        case HAL_DATASPACE_TRANSFER_SMPTE_170M:
        case HAL_DATASPACE_TRANSFER_ST2084:
        case HAL_DATASPACE_TRANSFER_HLG:
        default:
            ALOGV("Unsupported Gamma: %d", dataspace);