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

Commit 21f348ec authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Add rounded corner support to SkiaRE

Test: manual
Test: LayerTypeAndRenderTypeTransactionTest
Fixes: 148669903
Bug: 143468037
Change-Id: Ief5e44d5dc9414fea3d91897c610beb04e018e0f
parent dc346e8c
Loading
Loading
Loading
Loading
+27 −4
Original line number Diff line number Diff line
@@ -394,6 +394,10 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
                                      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 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
                                                                 : 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 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
    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();
}
+1 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ private:
                                       Protection protection);
    static EGLSurface createPlaceholderEglPbufferSurface(EGLDisplay display, EGLConfig config,
                                                         int hwcFormat, Protection protection);
    inline SkRRect getRoundedRect(const LayerSettings* layer);

    base::unique_fd flush();
    bool waitFence(base::unique_fd fenceFd);