summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ana Krulec <akrulec@google.com> 2020-12-11 08:35:00 -0800
committer Ana Krulec <akrulec@google.com> 2020-12-14 10:32:37 -0800
commitf9a15d971646ad7c134b37f9893b1a03c2d3aafc (patch)
tree437d21e7c5764a3195848135a33a0d0a8711198a
parent91a8a22a02318a192290c508b63d08de114405b7 (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.cpp13
-rw-r--r--libs/renderengine/tests/RenderEngineTest.cpp50
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