Update hole punch logic in HWUI
--Updated HWUI holepunch logic for SurfaceView to
also apply the stretch to the hole punch
--Updated RenderNode callbacks to also include
an offset from the ancestor RenderNode that also
has a stretch configured on it
--Added new test activity to verify hole punch
logic
Bug: 179047472
Test: manual
Change-Id: Ibbaf8248a31839ba9dc352ecb9fef54e1276918e
diff --git a/libs/hwui/pipeline/skia/StretchMask.h b/libs/hwui/pipeline/skia/StretchMask.h
new file mode 100644
index 0000000..dc698b8
--- /dev/null
+++ b/libs/hwui/pipeline/skia/StretchMask.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "GrRecordingContext.h"
+#include <effects/StretchEffect.h>
+#include <SkSurface.h>
+#include "SkiaDisplayList.h"
+
+namespace android::uirenderer {
+
+/**
+ * Helper class used to create/cache an SkSurface instance
+ * to create a mask that is used to draw a stretched hole punch
+ */
+class StretchMask {
+ public:
+ /**
+ * Release the current surface used for the stretch mask
+ */
+ void clear() {
+ mMaskSurface = nullptr;
+ }
+
+ /**
+ * Reset the dirty flag to re-create the stretch mask on the next draw
+ * pass
+ */
+ void markDirty() {
+ mIsDirty = true;
+ }
+
+ /**
+ * Draws the stretch mask into the given target canvas
+ * @param context GrRecordingContext used to create the surface if necessary
+ * @param stretch StretchEffect to apply to the mask
+ * @param bounds Target bounds to draw into the given canvas
+ * @param displayList List of drawing commands to render into the stretch mask
+ * @param canvas Target canvas to draw the mask into
+ */
+ void draw(GrRecordingContext* context,
+ const StretchEffect& stretch, const SkRect& bounds,
+ skiapipeline::SkiaDisplayList* displayList, SkCanvas* canvas);
+private:
+ sk_sp<SkSurface> mMaskSurface;
+ bool mIsDirty = true;
+};
+
+}