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

Commit 5bbfd517 authored by Valerie Hau's avatar Valerie Hau
Browse files

Add setColor, setColorAlpha, and setColorDataspace to ASurfaceControl

Bug:122326454
Test: atest CtsViewTestCases:android.view.cts.ASurfaceControlTests

Change-Id: If41f0a6b736315dbdb829cf3f8fefc654ede9bcf
parent e54b7b54
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -231,6 +231,7 @@ LIBANDROID {
    ASurfaceTransaction_setBuffer; # introduced=29
    ASurfaceTransaction_setBufferAlpha; # introduced=29
    ASurfaceTransaction_setBufferTransparency; # introduced=29
    ASurfaceTransaction_setColor; # introduced=29
    ASurfaceTransaction_setDamageRegion; # introduced=29
    ASurfaceTransaction_setDesiredPresentTime; # introduced=29
    ASurfaceTransaction_setGeometry; # introduced=29
+91 −0
Original line number Diff line number Diff line
@@ -44,6 +44,76 @@ using Transaction = SurfaceComposerClient::Transaction;
    LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
                        "invalid arg passed as " #name " argument");

static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
    sp<SurfaceComposerClient> client = surfaceControl->getClient();
    sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));

    Vector<ui::ColorMode> colorModes;
    status_t err = client->getDisplayColorModes(display, &colorModes);
    if (err) {
        ALOGE("unable to get wide color support");
        return false;
    }

    bool wideColorBoardConfig =
        getBool<ISurfaceFlingerConfigs,
                &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);

    for (android::ui::ColorMode colorMode : colorModes) {
        switch (colorMode) {
            case ui::ColorMode::DISPLAY_P3:
            case ui::ColorMode::ADOBE_RGB:
            case ui::ColorMode::DCI_P3:
                if (wideColorBoardConfig) {
                    return true;
                }
                break;
            default:
                break;
        }
    }
    return false;
}

static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
    sp<SurfaceComposerClient> client = surfaceControl->getClient();
    sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));

    HdrCapabilities hdrCapabilities;
    status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
    if (err) {
        ALOGE("unable to get hdr capabilities");
        return false;
    }

    return !hdrCapabilities.getSupportedHdrTypes().empty();
}

static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
    static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
    static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
    static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
    static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
    static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
    static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));

    switch (static_cast<android_dataspace_t>(dataSpace)) {
        case HAL_DATASPACE_UNKNOWN:
        case HAL_DATASPACE_V0_SRGB:
            return true;
        // These data space need wide gamut support.
        case HAL_DATASPACE_V0_SCRGB_LINEAR:
        case HAL_DATASPACE_V0_SCRGB:
        case HAL_DATASPACE_DISPLAY_P3:
            return getWideColorSupport(surfaceControl);
        // These data space need HDR support.
        case HAL_DATASPACE_BT2020_PQ:
            return getHdrSupport(surfaceControl);
        default:
            return false;
    }
}

Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
    return reinterpret_cast<Transaction*>(aSurfaceTransaction);
}
@@ -431,3 +501,24 @@ void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTr

    transaction->setHdrMetadata(surfaceControl, hdrMetadata);
}

void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
                                  ASurfaceControl* aSurfaceControl,
                                  float r, float g, float b, float alpha,
                                  ADataSpace dataspace) {
    CHECK_NOT_NULL(aSurfaceTransaction);
    CHECK_NOT_NULL(aSurfaceControl);

    sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
    LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace");
    Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);

    half3 color;
    color.r = r;
    color.g = g;
    color.b = b;

    transaction->setColor(surfaceControl, color)
                .setColorAlpha(surfaceControl, alpha)
                .setColorDataspace(surfaceControl, static_cast<ui::Dataspace>(dataspace));
}