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

Commit f9a15d97 authored by Ana Krulec's avatar Ana Krulec
Browse files

Fixing cosmetic kinks

- Adding back rounded corners crop to Skia RE
- Add a translation to the texture transform for the SkImage so
  that the correct layer contents are drawn in the correct part of
  the screen.

Bug: 175141036
Test: Open Chrome. Slowly slide into recents. The address bar does
      not show defects anymore. Also observe the bottom of the crop,
      it doesn't split anymore. Camera resizing looks good, too.
Test: Open Camera. Check that there are no defects in the camera
      view.
Test: Open Dialog Activity test app. Notice that the dialog is now
      present during the start up of the app.
Change-Id: I4410fd7759c2ad9f2809af5485348d67fd269556
parent 91a8a22a
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -587,6 +587,10 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
            if (!texMatrix.invert(&matrix)) {
                matrix = texMatrix;
            }
            // The shader does not respect the translation, so we add it to the texture
            // transform for the SkImage. This will make sure that the correct layer contents
            // are drawn in the correct part of the screen.
            matrix.postTranslate(layer->geometry.boundaries.left, layer->geometry.boundaries.top);

            sk_sp<SkShader> shader;

@@ -649,12 +653,11 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
            drawShadow(canvas, rect, layer->geometry.roundedCornersRadius, layer->shadow);
        }

        // Push the clipRRect onto the clip stack. Draw the image. Pop the clip.
        if (layer->geometry.roundedCornersRadius > 0) {
            canvas->drawRRect(getRoundedRect(layer), paint);
        } else {
            canvas->drawRect(dest, paint);
            canvas->clipRRect(getRoundedRect(layer), true);
        }

        canvas->drawRect(dest, paint);
        canvas->restore();
    }
    canvas->restore();
@@ -698,7 +701,7 @@ inline SkRect SkiaGLRenderEngine::getSkRect(const Rect& rect) {
}

inline SkRRect SkiaGLRenderEngine::getRoundedRect(const LayerSettings* layer) {
    const auto rect = getSkRect(layer->geometry.boundaries);
    const auto rect = getSkRect(layer->geometry.roundedCornersCrop);
    const auto cornerRadius = layer->geometry.roundedCornersRadius;
    return SkRRect::MakeRectXY(rect, cornerRadius, cornerRadius);
}
+50 −0
Original line number Diff line number Diff line
@@ -1735,6 +1735,56 @@ TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory
    EXPECT_TRUE(mRE->isTextureNameKnownForTesting(texName));
}

TEST_P(RenderEngineTest, testRoundedCornersCrop) {
    const auto& renderEngineFactory = GetParam();
    mRE = renderEngineFactory->createRenderEngine();

    renderengine::DisplaySettings settings;
    settings.physicalDisplay = fullscreenRect();
    settings.clip = fullscreenRect();
    settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;

    std::vector<const renderengine::LayerSettings*> layers;

    renderengine::LayerSettings redLayer;
    redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
    redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
    redLayer.geometry.roundedCornersRadius = 5.0f;
    redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
    // Red background.
    redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
    redLayer.alpha = 1.0f;

    layers.push_back(&redLayer);

    // Green layer with 1/3 size.
    renderengine::LayerSettings greenLayer;
    greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
    greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
    greenLayer.geometry.roundedCornersRadius = 5.0f;
    // Bottom right corner is not going to be rounded.
    greenLayer.geometry.roundedCornersCrop =
            Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
                 DEFAULT_DISPLAY_HEIGHT)
                    .toFloatRect();
    greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
    greenLayer.alpha = 1.0f;

    layers.push_back(&greenLayer);

    invokeDraw(settings, layers, mBuffer);

    // Corners should be ignored...
    // Screen size: width is 128, height is 256.
    expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
    expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
    // Bottom right corner is kept out of the clipping, and it's green.
    expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
                           DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
                      0, 255, 0, 255);
}

} // namespace android

// TODO(b/129481165): remove the #pragma below and fix conversion issues