1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef RENDER_SERVICE_BASE_PROPERTY_RS_PROPERTY_DRAWABLE_UTILITIES_H
17 #define RENDER_SERVICE_BASE_PROPERTY_RS_PROPERTY_DRAWABLE_UTILITIES_H
18 
19 #include "pipeline/rs_paint_filter_canvas.h"
20 #include "property/rs_property_drawable.h"
21 
22 namespace OHOS::Rosen {
23 // ============================================================================
24 // alias (reference or soft link) of another drawable
25 class RSAliasDrawable : public RSPropertyDrawable {
26 public:
27     explicit RSAliasDrawable(RSPropertyDrawableSlot slot);
28     ~RSAliasDrawable() override = default;
29     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
30 
31 private:
32     RSPropertyDrawableSlot slot_;
33 };
34 
35 // ============================================================================
36 // Save and Restore
37 class RSSaveDrawable : public RSPropertyDrawable {
38 public:
39     explicit RSSaveDrawable(std::shared_ptr<uint32_t> content);
40     ~RSSaveDrawable() override = default;
41     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
42 
43 private:
44     std::shared_ptr<uint32_t> content_;
45 };
46 
47 class RSRestoreDrawable : public RSPropertyDrawable {
48 public:
49     explicit RSRestoreDrawable(std::shared_ptr<uint32_t> content);
50     ~RSRestoreDrawable() override = default;
51     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
52 
53 private:
54     std::shared_ptr<uint32_t> content_;
55 };
56 
57 class RSCustomSaveDrawable : public RSPropertyDrawable {
58 public:
59     explicit RSCustomSaveDrawable(
60         std::shared_ptr<RSPaintFilterCanvas::SaveStatus> content, RSPaintFilterCanvas::SaveType type);
61     ~RSCustomSaveDrawable() override = default;
62     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
63 
64 private:
65     std::shared_ptr<RSPaintFilterCanvas::SaveStatus> content_;
66     RSPaintFilterCanvas::SaveType type_;
67 };
68 
69 class RSCustomRestoreDrawable : public RSPropertyDrawable {
70 public:
71     explicit RSCustomRestoreDrawable(std::shared_ptr<RSPaintFilterCanvas::SaveStatus> content);
72     ~RSCustomRestoreDrawable() override = default;
73     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
74 
75 private:
76     std::shared_ptr<RSPaintFilterCanvas::SaveStatus> content_;
77 };
78 
79 // ============================================================================
80 // Alpha
81 class RSAlphaDrawable : public RSPropertyDrawable {
82 public:
83     explicit RSAlphaDrawable(float alpha);
84     ~RSAlphaDrawable() override = default;
85     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
86 
87     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
88 
89 protected:
90     float alpha_;
91 };
92 
93 class RSAlphaOffscreenDrawable : public RSAlphaDrawable {
94 public:
95     explicit RSAlphaOffscreenDrawable(float alpha);
96 
97     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
98 };
99 
100 // ============================================================================
101 // Adapter for RSRenderModifier
102 class RSModifierDrawable : public RSPropertyDrawable {
103 public:
104     explicit RSModifierDrawable(RSModifierType type);
105     ~RSModifierDrawable() override = default;
106 
107     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
108 
109 private:
110     RSModifierType type_;
111 };
112 };     // namespace OHOS::Rosen
113 #endif // RENDER_SERVICE_BASE_PROPERTY_RS_PROPERTY_DRAWABLE_UTILITIES_H
114