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

Commit 2dc632ae authored by Nader Jawad's avatar Nader Jawad
Browse files

Holepunch layers for SurfaceView

Update RenderNodeDrawable to hole punch areas into
layers created for SurfaceView

Bug: 184297961
Test: Added CTS test to SurfaceViewTests
Change-Id: I1f03a4fe34c5a8b7411ebe728ea3d4195fcd1fac
parent 4563f9df
Loading
Loading
Loading
Loading
+9 −4
Original line number Original line Diff line number Diff line
@@ -33,7 +33,6 @@ import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Region;
import android.graphics.RenderNode;
import android.graphics.RenderNode;
@@ -670,10 +669,16 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
            if (mClipSurfaceToBounds && mClipBounds != null) {
            if (mClipSurfaceToBounds && mClipBounds != null) {
                mTmpRect.intersect(mClipBounds);
                mTmpRect.intersect(mClipBounds);
            }
            }
            canvas.drawRoundRect(mTmpRect.left, mTmpRect.top, mTmpRect.right, mTmpRect.bottom,
            canvas.punchHole(
                    mCornerRadius, mCornerRadius, mRoundedViewportPaint);
                    mTmpRect.left,
                    mTmpRect.top,
                    mTmpRect.right,
                    mTmpRect.bottom,
                    mCornerRadius,
                    mCornerRadius
            );
        } else {
        } else {
            canvas.drawColor(0, PorterDuff.Mode.CLEAR);
            canvas.punchHole(0f, 0f, getWidth(), getHeight(), 0f, 0f);
        }
        }
    }
    }


+10 −0
Original line number Original line Diff line number Diff line
@@ -670,6 +670,13 @@ public abstract class BaseCanvas {
                indices, indexOffset, indexCount, paint.getNativeInstance());
                indices, indexOffset, indexCount, paint.getNativeInstance());
    }
    }


    /**
     * @hide
     */
    public void punchHole(float left, float top, float right, float bottom, float rx, float ry) {
        nPunchHole(mNativeCanvasWrapper, left, top, right, bottom, rx, ry);
    }

    /**
    /**
     * @hide
     * @hide
     */
     */
@@ -815,4 +822,7 @@ public abstract class BaseCanvas {


    private static native void nDrawTextOnPath(long nativeCanvas, String text, long nativePath,
    private static native void nDrawTextOnPath(long nativeCanvas, String text, long nativePath,
            float hOffset, float vOffset, int flags, long nativePaint);
            float hOffset, float vOffset, int flags, long nativePaint);

    private static native void nPunchHole(long renderer, float left, float top, float right,
            float bottom, float rx, float ry);
}
}
+12 −0
Original line number Original line Diff line number Diff line
@@ -610,6 +610,14 @@ public class BaseRecordingCanvas extends Canvas {
                indices, indexOffset, indexCount, paint.getNativeInstance());
                indices, indexOffset, indexCount, paint.getNativeInstance());
    }
    }


    /**
     * @hide
     */
    @Override
    public void punchHole(float left, float top, float right, float bottom, float rx, float ry) {
        nPunchHole(mNativeCanvasWrapper, left, top, right, bottom, rx, ry);
    }

    @FastNative
    @FastNative
    private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float left,
    private static native void nDrawBitmap(long nativeCanvas, long bitmapHandle, float left,
            float top, long nativePaintOrZero, int canvasDensity, int screenDensity,
            float top, long nativePaintOrZero, int canvasDensity, int screenDensity,
@@ -735,4 +743,8 @@ public class BaseRecordingCanvas extends Canvas {
    @FastNative
    @FastNative
    private static native void nDrawTextOnPath(long nativeCanvas, String text, long nativePath,
    private static native void nDrawTextOnPath(long nativeCanvas, String text, long nativePath,
            float hOffset, float vOffset, int flags, long nativePaint);
            float hOffset, float vOffset, int flags, long nativePaint);

    @FastNative
    private static native void nPunchHole(long renderer, float left, float top, float right,
            float bottom, float rx, float ry);
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -464,10 +464,12 @@ cc_defaults {
        "canvas/CanvasOpBuffer.cpp",
        "canvas/CanvasOpBuffer.cpp",
        "canvas/CanvasOpRasterizer.cpp",
        "canvas/CanvasOpRasterizer.cpp",
        "effects/StretchEffect.cpp",
        "effects/StretchEffect.cpp",
        "pipeline/skia/HolePunch.cpp",
        "pipeline/skia/SkiaDisplayList.cpp",
        "pipeline/skia/SkiaDisplayList.cpp",
        "pipeline/skia/SkiaRecordingCanvas.cpp",
        "pipeline/skia/SkiaRecordingCanvas.cpp",
        "pipeline/skia/RenderNodeDrawable.cpp",
        "pipeline/skia/RenderNodeDrawable.cpp",
        "pipeline/skia/ReorderBarrierDrawables.cpp",
        "pipeline/skia/ReorderBarrierDrawables.cpp",
        "pipeline/skia/TransformCanvas.cpp",
        "renderthread/Frame.cpp",
        "renderthread/Frame.cpp",
        "renderthread/RenderTask.cpp",
        "renderthread/RenderTask.cpp",
        "renderthread/TimeLord.cpp",
        "renderthread/TimeLord.cpp",
+4 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,10 @@ public:
        return mImpl && !(mImpl->isEmpty());
        return mImpl && !(mImpl->isEmpty());
    }
    }


    [[nodiscard]] bool hasHolePunches() const {
        return mImpl && mImpl->hasHolePunches();
    }

    [[nodiscard]] bool containsProjectionReceiver() const {
    [[nodiscard]] bool containsProjectionReceiver() const {
        return mImpl && mImpl->containsProjectionReceiver();
        return mImpl && mImpl->containsProjectionReceiver();
    }
    }
Loading