Loading libs/renderengine/skia/SkiaGLRenderEngine.cpp +8 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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); } Loading libs/renderengine/tests/RenderEngineTest.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
libs/renderengine/skia/SkiaGLRenderEngine.cpp +8 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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); } Loading
libs/renderengine/tests/RenderEngineTest.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -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 Loading