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

Commit 5a6f3e99 authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Add rounded corner support to SkiaRE"

parents 9c5aaf72 21f348ec
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);