Add rounded corner support to SkiaRE
Test: manual
Test: LayerTypeAndRenderTypeTransactionTest
Fixes: 148669903
Bug: 143468037
Change-Id: Ief5e44d5dc9414fea3d91897c610beb04e018e0f
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
index 7cfe207..70e997d 100644
--- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
@@ -394,6 +394,10 @@
display.clip.bottom));
canvas->drawColor(0, SkBlendMode::kSrc);
for (const auto& layer : layers) {
+ SkPaint paint;
+ const auto& bounds = layer->geometry.boundaries;
+ const auto dest = SkRect::MakeLTRB(bounds.left, bounds.top, bounds.right, bounds.bottom);
+
if (layer->source.buffer.buffer) {
ATRACE_NAME("DrawImage");
const auto& item = layer->source.buffer;
@@ -408,15 +412,27 @@
: kUnpremul_SkAlphaType);
mImageCache.insert({item.buffer->getId(), image});
}
- const auto& bounds = layer->geometry.boundaries;
- SkRect dest = SkRect::MakeLTRB(bounds.left, bounds.top, bounds.right, bounds.bottom);
- canvas->drawImageRect(image, dest, nullptr);
+
+ SkMatrix matrix;
+ if (layer->geometry.roundedCornersRadius > 0) {
+ const auto roundedRect = getRoundedRect(layer);
+ matrix.setTranslate(roundedRect.getBounds().left() - dest.left(),
+ roundedRect.getBounds().top() - dest.top());
+ } else {
+ matrix.setIdentity();
+ }
+ paint.setShader(image->makeShader(matrix));
} else {
ATRACE_NAME("DrawColor");
- SkPaint paint;
const auto color = layer->source.solidColor;
paint.setColor(SkColor4f{.fR = color.r, .fG = color.g, .fB = color.b, layer->alpha});
}
+
+ if (layer->geometry.roundedCornersRadius > 0) {
+ canvas->drawRRect(getRoundedRect(layer), paint);
+ } else {
+ canvas->drawRect(dest, paint);
+ }
}
{
ATRACE_NAME("flush surface");
@@ -448,6 +464,13 @@
return NO_ERROR;
}
+inline SkRRect SkiaGLRenderEngine::getRoundedRect(const LayerSettings* layer) {
+ const auto& crop = layer->geometry.roundedCornersCrop;
+ const auto rect = SkRect::MakeLTRB(crop.left, crop.top, crop.right, crop.bottom);
+ const auto cornerRadius = layer->geometry.roundedCornersRadius;
+ return SkRRect::MakeRectXY(rect, cornerRadius, cornerRadius);
+}
+
size_t SkiaGLRenderEngine::getMaxTextureSize() const {
return mGrContext->maxTextureSize();
}