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

Commit ed54efa6 authored by Valerie Hau's avatar Valerie Hau
Browse files

Add Color Layer to ASurfaceControl

Bug:122326454
Test: atest CtsViewTestCases:android.view.cts.ASurfaceControlTests
Change-Id: Ib05ad70d838c79aa6f2e309217b93906c950b6fa
parent 57d7b5f3
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -240,6 +240,17 @@ void ASurfaceTransaction_setBuffer(ASurfaceTransaction* transaction,
                                   ASurfaceControl* surface_control, AHardwareBuffer* buffer,
                                   int acquire_fence_fd = -1) __INTRODUCED_IN(29);

/**
 * Updates the color for |surface_control|.  This will make the background color for the
 * ASurfaceControl visible in transparent regions of the surface.  Colors |r|, |g|,
 * and |b| must be within the range that is valid for |dataspace|.  |dataspace| and |alpha|
 * will be the dataspace and alpha set for the background color layer.
 */
void ASurfaceTransaction_setColor(ASurfaceTransaction* transaction,
                                  ASurfaceControl* surface_control, float r, float g, float b,
                                  float alpha, ADataSpace dataspace)
                                  __INTRODUCED_IN(29);

/**
 * |source| the sub-rect within the buffer's content to be rendered inside the surface's area
 * The surface's source rect is clipped by the bounds of its current buffer. The source rect's width
+14 −0
Original line number Diff line number Diff line
@@ -97,6 +97,9 @@ status_t layer_state_t::write(Parcel& output) const
    output.writeStrongBinder(cachedBuffer.token);
    output.writeInt32(cachedBuffer.bufferId);

    output.writeFloat(colorAlpha);
    output.writeUint32(static_cast<uint32_t>(colorDataspace));

    return NO_ERROR;
}

@@ -170,6 +173,9 @@ status_t layer_state_t::read(const Parcel& input)
    cachedBuffer.token = input.readStrongBinder();
    cachedBuffer.bufferId = input.readInt32();

    colorAlpha = input.readFloat();
    colorDataspace = static_cast<ui::Dataspace>(input.readUint32());

    return NO_ERROR;
}

@@ -382,6 +388,14 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eCachedBufferChanged;
        cachedBuffer = other.cachedBuffer;
    }
    if (other.what & eColorAlphaChanged) {
        what |= eColorAlphaChanged;
        colorAlpha = other.colorAlpha;
    }
    if (other.what & eColorDataspaceChanged) {
        what |= eColorDataspaceChanged;
        colorDataspace = other.colorDataspace;
    }
    if ((other.what & what) != other.what) {
        ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
              "other.what=0x%" PRIu64 " what=0x%" PRIu64,
+30 −0
Original line number Diff line number Diff line
@@ -643,6 +643,36 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorAlpha(
        const sp<SurfaceControl>& sc, float alpha) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
        return *this;
    }

    s->what |= layer_state_t::eColorAlphaChanged;
    s->colorAlpha = alpha;

    registerSurfaceControlForCallback(sc);
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorDataspace(
        const sp<SurfaceControl>& sc, ui::Dataspace dataspace) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
        return *this;
    }

    s->what |= layer_state_t::eColorDataspaceChanged;
    s->colorDataspace = dataspace;

    registerSurfaceControlForCallback(sc);
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransform(
        const sp<SurfaceControl>& sc, uint32_t transform) {
    layer_state_t* s = getLayerState(sc);
+8 −1
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ struct layer_state_t {
        eCornerRadiusChanged = 0x80000000,
        eFrameChanged = 0x1'00000000,
        eCachedBufferChanged = 0x2'00000000,
        eColorAlphaChanged = 0x3'00000000,
        eColorDataspaceChanged = 0x4'00000000,
    };

    layer_state_t()
@@ -110,7 +112,9 @@ struct layer_state_t {
            dataspace(ui::Dataspace::UNKNOWN),
            surfaceDamageRegion(),
            api(-1),
            colorTransform(mat4()) {
            colorTransform(mat4()),
            colorAlpha(0),
            colorDataspace(ui::Dataspace::UNKNOWN) {
        matrix.dsdx = matrix.dtdy = 1.0f;
        matrix.dsdy = matrix.dtdx = 0.0f;
        hdrMetadata.validTypes = 0;
@@ -180,6 +184,9 @@ struct layer_state_t {
#endif

    cached_buffer_t cachedBuffer;

    float colorAlpha;
    ui::Dataspace colorDataspace;
};

struct ComposerState {
+6 −0
Original line number Diff line number Diff line
@@ -324,6 +324,12 @@ public:

        Transaction& setColor(const sp<SurfaceControl>& sc, const half3& color);

        // Sets the alpha of the background color layer if it exists.
        Transaction& setColorAlpha(const sp<SurfaceControl>& sc, float alpha);

        // Sets the dataspace of the background color layer if it exists.
        Transaction& setColorDataspace(const sp<SurfaceControl>& sc, ui::Dataspace dataspace);

        Transaction& setTransform(const sp<SurfaceControl>& sc, uint32_t transform);
        Transaction& setTransformToDisplayInverse(const sp<SurfaceControl>& sc,
                                                  bool transformToDisplayInverse);
Loading