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

Commit 1bee7abe authored by Ady Abraham's avatar Ady Abraham
Browse files

composer: Color.aidl should use floats

Color is represented as a float [0.0 - 1.0] in the upper part of
the stack, so make composer3 interface consistent.

Bug: 207139550
Test: VTS
Change-Id: Ic14288b5c87ff5cccfc9a0756d2630b8715759f7
parent 4596369b
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -34,8 +34,8 @@
package android.hardware.graphics.composer3;
@VintfStability
parcelable Color {
  byte r;
  byte g;
  byte b;
  byte a;
  float r;
  float g;
  float b;
  float a;
}
+7 −4
Original line number Diff line number Diff line
@@ -16,10 +16,13 @@

package android.hardware.graphics.composer3;

/**
 * Color representation as a floating point number in the range [0.0 - 1.0]
 */
@VintfStability
parcelable Color {
    byte r;
    byte g;
    byte b;
    byte a;
    float r;
    float g;
    float b;
    float a;
}
+17 −22
Original line number Diff line number Diff line
@@ -922,35 +922,30 @@ class GraphicsBlendModeCompositionTest

        auto layer = mLayers[1];
        BlendMode blendMode = layer->getBlendMode();
        float alpha = mTopLayerColor.a / 255.0f * layer->getAlpha();
        float alpha = mTopLayerColor.a * layer->getAlpha();
        if (blendMode == BlendMode::NONE) {
            for (auto& expectedColor : expectedColors) {
                expectedColor.r = mTopLayerColor.r * static_cast<int8_t>(layer->getAlpha());
                expectedColor.g = mTopLayerColor.g * static_cast<int8_t>(layer->getAlpha());
                expectedColor.b = mTopLayerColor.b * static_cast<int8_t>(layer->getAlpha());
                expectedColor.a = static_cast<int8_t>(alpha * 255.0);
                expectedColor.r = mTopLayerColor.r * layer->getAlpha();
                expectedColor.g = mTopLayerColor.g * layer->getAlpha();
                expectedColor.b = mTopLayerColor.b * layer->getAlpha();
                expectedColor.a = alpha;
            }
        } else if (blendMode == BlendMode::PREMULTIPLIED) {
            for (auto& expectedColor : expectedColors) {
                expectedColor.r = static_cast<int8_t>(
                        mTopLayerColor.r * static_cast<int8_t>(layer->getAlpha()) +
                        mBackgroundColor.r * (1.0 - alpha));
                expectedColor.g = static_cast<int8_t>(mTopLayerColor.g * layer->getAlpha() +
                                                      mBackgroundColor.g * (1.0 - alpha));
                expectedColor.b = static_cast<int8_t>(mTopLayerColor.b * layer->getAlpha() +
                                                      mBackgroundColor.b * (1.0 - alpha));
                expectedColor.a = static_cast<int8_t>(alpha + mBackgroundColor.a * (1.0 - alpha));
                expectedColor.r =
                        mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
                expectedColor.g =
                        mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
                expectedColor.b =
                        mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
                expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
            }
        } else if (blendMode == BlendMode::COVERAGE) {
            for (auto& expectedColor : expectedColors) {
                expectedColor.r = static_cast<int8_t>(mTopLayerColor.r * alpha +
                                                      mBackgroundColor.r * (1.0 - alpha));
                expectedColor.g = static_cast<int8_t>(mTopLayerColor.g * alpha +
                                                      mBackgroundColor.g * (1.0 - alpha));
                expectedColor.b = static_cast<int8_t>(mTopLayerColor.b * alpha +
                                                      mBackgroundColor.b * (1.0 - alpha));
                expectedColor.a = static_cast<int8_t>(mTopLayerColor.a * alpha +
                                                      mBackgroundColor.a * (1.0 - alpha));
                expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
                expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
                expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
                expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
            }
        }
    }
@@ -1083,7 +1078,7 @@ class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
        GraphicsCompositionTest::SetUp();

        auto backgroundLayer = std::make_shared<TestColorLayer>(mComposerClient, mPrimaryDisplay);
        backgroundLayer->setColor({0, 0, 0, 0});
        backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
        backgroundLayer->setDisplayFrame({0, 0, mDisplayWidth, mDisplayHeight});
        backgroundLayer->setZOrder(0);

+2 −4
Original line number Diff line number Diff line
@@ -1720,13 +1720,11 @@ TEST_P(GraphicsComposerAidlCommandTest, SET_LAYER_COLOR) {
    int64_t layer;
    EXPECT_TRUE(mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount, &layer).isOk());

    mWriter.setLayerColor(mPrimaryDisplay, layer,
                          Color{static_cast<int8_t>(0xff), static_cast<int8_t>(0xff),
                                static_cast<int8_t>(0xff), static_cast<int8_t>(0xff)});
    mWriter.setLayerColor(mPrimaryDisplay, layer, Color{1.0f, 1.0f, 1.0f, 1.0f});
    execute();
    ASSERT_TRUE(mReader.takeErrors().empty());

    mWriter.setLayerColor(mPrimaryDisplay, layer, Color{0, 0, 0, 0});
    mWriter.setLayerColor(mPrimaryDisplay, layer, Color{0.0f, 0.0f, 0.0f, 0.0f});
    execute();
    ASSERT_TRUE(mReader.takeErrors().empty());
}
+10 −16
Original line number Diff line number Diff line
@@ -131,12 +131,12 @@ void ReadbackHelper::fillBuffer(uint32_t width, uint32_t height, uint32_t stride

            int offset = (row * static_cast<int32_t>(stride) + col) * bytesPerPixel;
            uint8_t* pixelColor = (uint8_t*)bufferData + offset;
            pixelColor[0] = static_cast<uint8_t>(srcColor.r);
            pixelColor[1] = static_cast<uint8_t>(srcColor.g);
            pixelColor[2] = static_cast<uint8_t>(srcColor.b);
            pixelColor[0] = static_cast<uint8_t>(std::round(255.0f * srcColor.r));
            pixelColor[1] = static_cast<uint8_t>(std::round(255.0f * srcColor.g));
            pixelColor[2] = static_cast<uint8_t>(std::round(255.0f * srcColor.b));

            if (bytesPerPixel == 4) {
                pixelColor[3] = static_cast<uint8_t>(srcColor.a);
                pixelColor[3] = static_cast<uint8_t>(std::round(255.0f * srcColor.a));
            }
        }
    }
@@ -184,13 +184,11 @@ void ReadbackHelper::compareColorBuffers(std::vector<Color>& expectedColors, voi
            auto pixel = row * static_cast<int32_t>(width) + col;
            int offset = (row * stride + col) * bytesPerPixel;
            uint8_t* pixelColor = (uint8_t*)bufferData + offset;
            const Color expectedColor = expectedColors[static_cast<size_t>(pixel)];

            ASSERT_EQ(static_cast<int8_t>(expectedColors[static_cast<size_t>(pixel)].r),
                      pixelColor[0]);
            ASSERT_EQ(static_cast<int8_t>(expectedColors[static_cast<size_t>(pixel)].g),
                      pixelColor[1]);
            ASSERT_EQ(static_cast<int8_t>(expectedColors[static_cast<size_t>(pixel)].b),
                      pixelColor[2]);
            ASSERT_EQ(std::round(255.0f * expectedColor.r), pixelColor[0]);
            ASSERT_EQ(std::round(255.0f * expectedColor.g), pixelColor[1]);
            ASSERT_EQ(std::round(255.0f * expectedColor.b), pixelColor[2]);
        }
    }
}
@@ -262,12 +260,8 @@ void TestColorLayer::write(ComposerClientWriter& writer) {
LayerSettings TestColorLayer::toRenderEngineLayerSettings() {
    LayerSettings layerSettings = TestLayer::toRenderEngineLayerSettings();

    layerSettings.source.solidColor =
            ::android::half3(static_cast<::android::half>(mColor.r) / 255.0,
                             static_cast<::android::half>(mColor.g) / 255.0,
                             static_cast<::android::half>(mColor.b) / 255.0);
    layerSettings.alpha =
            mAlpha * static_cast<float>((static_cast<::android::half>(mColor.a) / 255.0));
    layerSettings.source.solidColor = ::android::half3(mColor.r, mColor.g, mColor.b);
    layerSettings.alpha = mAlpha * mColor.a;
    return layerSettings;
}

Loading