diff options
| author | 2020-12-11 08:35:00 -0800 | |
|---|---|---|
| committer | 2020-12-14 10:32:37 -0800 | |
| commit | f9a15d971646ad7c134b37f9893b1a03c2d3aafc (patch) | |
| tree | 437d21e7c5764a3195848135a33a0d0a8711198a | |
| parent | 91a8a22a02318a192290c508b63d08de114405b7 (diff) | |
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
| -rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.cpp | 13 | ||||
| -rw-r--r-- | libs/renderengine/tests/RenderEngineTest.cpp | 50 |
2 files changed, 58 insertions, 5 deletions
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index 4e9c5afce0..28d7adc6f5 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -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); } diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index e8257424a0..712e5e2dd3 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -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 |