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

Commit df301aaa authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Initial framework needed to draw circle with RuntimeShader.

This also adds the ability for RenderThread to animate a few
predefined shader uniforms.

Bug: 177051137
Test: demo in ag/13296877
Change-Id: I6e58e671ad1242a07ecb1cf4cdb48031f85c2088
parent fa2a82b0
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -203,6 +203,26 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
                radius.getNativeContainer(), paint.getNativeContainer());
    }

    /**
     * Draws a ripple
     *
     * @param cx
     * @param cy
     * @param radius
     * @param paint
     * @param progress
     * @param shader
     *
     * @hide
     */
    public void drawRipple(CanvasProperty<Float> cx, CanvasProperty<Float> cy,
            CanvasProperty<Float> radius, CanvasProperty<Paint> paint,
            CanvasProperty<Float> progress, RuntimeShader shader) {
        nDrawRipple(mNativeCanvasWrapper, cx.getNativeContainer(), cy.getNativeContainer(),
                radius.getNativeContainer(), paint.getNativeContainer(),
                progress.getNativeContainer(), shader.getNativeShaderFactory());
    }

    /**
     * Draws a round rect
     *
@@ -260,6 +280,9 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
    private static native void nDrawCircle(long renderer, long propCx,
            long propCy, long propRadius, long propPaint);
    @CriticalNative
    private static native void nDrawRipple(long renderer, long propCx, long propCy, long propRadius,
            long propPaint, long propProgress, long runtimeEffect);
    @CriticalNative
    private static native void nDrawRoundRect(long renderer, long propLeft, long propTop,
            long propRight, long propBottom, long propRx, long propRy, long propPaint);
    @CriticalNative
+4 −0
Original line number Diff line number Diff line
@@ -115,6 +115,10 @@ public class RuntimeShader extends Shader {
                nativeShaders, colorSpace().getNativeInstance(), mIsOpaque);
    }

    public long getNativeShaderFactory() {
        return mNativeInstanceRuntimeShaderFactory;
    }

    private static native long nativeCreate(long shaderFactory, long matrix, byte[] inputs,
            long[] shaderInputs, long colorSpaceHandle, boolean isOpaque);

+12 −0
Original line number Diff line number Diff line
@@ -814,6 +814,18 @@ void SkiaCanvas::drawCircle(uirenderer::CanvasPropertyPrimitive* x,
    mCanvas->drawDrawable(drawable.get());
}

void SkiaCanvas::drawRipple(uirenderer::CanvasPropertyPrimitive* x,
                            uirenderer::CanvasPropertyPrimitive* y,
                            uirenderer::CanvasPropertyPrimitive* radius,
                            uirenderer::CanvasPropertyPaint* paint,
                            uirenderer::CanvasPropertyPrimitive* progress,
                            sk_sp<SkRuntimeEffect> runtimeEffect) {
    sk_sp<uirenderer::skiapipeline::AnimatedRipple> drawable(
            new uirenderer::skiapipeline::AnimatedRipple(x, y, radius, paint, progress,
                                                         runtimeEffect));
    mCanvas->drawDrawable(drawable.get());
}

void SkiaCanvas::drawPicture(const SkPicture& picture) {
    // TODO: Change to mCanvas->drawPicture()? SkCanvas::drawPicture seems to be
    // where the logic is for playback vs. ref picture. Using picture.playback here
+6 −0
Original line number Diff line number Diff line
@@ -147,6 +147,12 @@ public:
                            uirenderer::CanvasPropertyPrimitive* y,
                            uirenderer::CanvasPropertyPrimitive* radius,
                            uirenderer::CanvasPropertyPaint* paint) override;
    virtual void drawRipple(uirenderer::CanvasPropertyPrimitive* x,
                            uirenderer::CanvasPropertyPrimitive* y,
                            uirenderer::CanvasPropertyPrimitive* radius,
                            uirenderer::CanvasPropertyPaint* paint,
                            uirenderer::CanvasPropertyPrimitive* progress,
                            sk_sp<SkRuntimeEffect> runtimeEffect) override;

    virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
    virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ enum class CanvasOpType : int8_t {
    DrawRoundRectProperty,
    DrawDoubleRoundRect,
    DrawCircleProperty,
    DrawRippleProperty,
    DrawCircle,
    DrawOval,
    DrawArc,
Loading