| /* |
| * 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; |
| }; |
| |
| } |