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_BOUNDS_GEOMETRY_H
17 #define RENDER_SERVICE_BASE_PROPERTY_RS_PROPERTY_DRAWABLE_BOUNDS_GEOMETRY_H
18 
19 #include <utility>
20 
21 #include "include/core/SkPaint.h"
22 
23 #include "property/rs_property_drawable.h"
24 
25 namespace OHOS::Rosen {
26 class RSSkiaFilter;
27 enum class FilterType;
28 
29 class RSBoundsGeometryDrawable : public RSPropertyDrawable {
30 public:
31     explicit RSBoundsGeometryDrawable() = default;
32     ~RSBoundsGeometryDrawable() override = default;
33     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
34 
35     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
36 };
37 
38 class RSClipBoundsDrawable : public RSPropertyDrawable {
39 public:
40     explicit RSClipBoundsDrawable() = default;
41     ~RSClipBoundsDrawable() override = default;
42     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
43 
44     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
45 };
46 
47 // ============================================================================
48 // PointLight
49 class RSPointLightDrawable : public RSPropertyDrawable {
50 public:
51     explicit RSPointLightDrawable() = default;
52     ~RSPointLightDrawable() override = default;
53     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
54 
55     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
56 };
57 
58 // ============================================================================
59 // Border
60 class RSBorderDrawable : public RSPropertyDrawable {
61 public:
RSBorderDrawable(Drawing::Brush && brush,Drawing::Pen && pen)62     explicit RSBorderDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen)
63         : RSPropertyDrawable(), brush_(std::move(brush)), pen_(std::move(pen))
64     {}
65     ~RSBorderDrawable() override = default;
66     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
67 
68 protected:
69     Drawing::Brush brush_;
70     Drawing::Pen pen_;
71 };
72 
73 class RSBorderDRRectDrawable : public RSBorderDrawable {
74 public:
75     explicit RSBorderDRRectDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen,
76         const RSProperties& properties, const bool& drawBorder);
77     ~RSBorderDRRectDrawable() override = default;
78     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
79     void OnBoundsChange(const RSProperties& properties);
80 
81 private:
82     bool drawBorder_;
83     Drawing::RoundRect inner_;
84     Drawing::RoundRect outer_;
85 };
86 
87 class RSBorderFourLineDrawable : public RSBorderDrawable {
88 public:
89     explicit RSBorderFourLineDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen,
90         const RSProperties& properties, const bool& drawBorder);
91     ~RSBorderFourLineDrawable() override = default;
92     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
93     void OnBoundsChange(const RSProperties& properties);
94 
95 private:
96     bool drawBorder_;
97     RectF rect_;
98 };
99 
100 class RSBorderPathDrawable : public RSBorderDrawable {
101 public:
102     explicit RSBorderPathDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen,
103         const RSProperties& properties, const bool& drawBorder);
104     ~RSBorderPathDrawable() override = default;
105     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
106     void OnBoundsChange(const RSProperties& properties);
107 
108 private:
109     bool drawBorder_;
110     Drawing::Path borderPath_;
111 };
112 
113 class RSBorderFourLineRoundCornerDrawable : public RSBorderDrawable {
114 public:
115     explicit RSBorderFourLineRoundCornerDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen,
116         const RSProperties& properties, const bool& drawBorder);
117     ~RSBorderFourLineRoundCornerDrawable() override = default;
118     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
119     void OnBoundsChange(const RSProperties& properties);
120 
121 private:
122     bool drawBorder_;
123     Drawing::RoundRect innerRrect_;
124     Drawing::RoundRect rrect_;
125 };
126 
127 // ============================================================================
128 // Outline
129 class RSOutlineDrawable : public RSBorderDrawable {
130 public:
RSOutlineDrawable(Drawing::Brush && brush,Drawing::Pen && pen)131     explicit RSOutlineDrawable(Drawing::Brush&& brush, Drawing::Pen&& pen)
132         : RSBorderDrawable(std::move(brush), std::move(pen))
133     {}
134     ~RSOutlineDrawable() override = default;
135     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
136 };
137 
138 // ============================================================================
139 // Mask
140 class RSMaskDrawable : public RSPropertyDrawable {
141 public:
142     explicit RSMaskDrawable(std::shared_ptr<RSMask> mask);
143     ~RSMaskDrawable() override = default;
144     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
145 
146 protected:
147     std::shared_ptr<RSMask> mask_;
148     Drawing::Brush maskFilterBrush_;
149     Drawing::Brush maskBrush_;
150 };
151 
152 class RSSvgDomMaskDrawable : public RSMaskDrawable {
153 public:
154     explicit RSSvgDomMaskDrawable(std::shared_ptr<RSMask> mask);
155     ~RSSvgDomMaskDrawable() override = default;
156     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
157 };
158 
159 class RSSvgPictureMaskDrawable : public RSMaskDrawable {
160 public:
161     explicit RSSvgPictureMaskDrawable(std::shared_ptr<RSMask> mask);
162     ~RSSvgPictureMaskDrawable() override = default;
163     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
164 };
165 
166 class RSGradientMaskDrawable : public RSMaskDrawable {
167 public:
168     explicit RSGradientMaskDrawable(std::shared_ptr<RSMask> mask);
169     ~RSGradientMaskDrawable() override = default;
170     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
171 };
172 
173 class RSPathMaskDrawable : public RSMaskDrawable {
174 public:
175     explicit RSPathMaskDrawable(std::shared_ptr<RSMask> mask);
176     ~RSPathMaskDrawable() override = default;
177     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
178 };
179 
180 class RSPixelMapMaskDrawable : public RSMaskDrawable {
181 public:
182     explicit RSPixelMapMaskDrawable(std::shared_ptr<RSMask> mask);
183     ~RSPixelMapMaskDrawable() override = default;
184     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
185 };
186 
187 // ============================================================================
188 // Shadow
189 class RSShadowBaseDrawable : public RSPropertyDrawable {
190 public:
191     explicit RSShadowBaseDrawable(const RSProperties& properties);
192     ~RSShadowBaseDrawable() override = default;
193     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
194 
195 protected:
196     void ClipShadowPath(const RSRenderContent& content, RSPaintFilterCanvas& canvas, Drawing::Path& path) const;
197     float offsetX_;
198     float offsetY_;
199     const Color color_;
200 };
201 
202 class RSShadowDrawable : public RSShadowBaseDrawable {
203 public:
204     explicit RSShadowDrawable(const RSProperties& properties);
205     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
206 
207 protected:
208     const float radius_;
209 };
210 
211 class RSColorfulShadowDrawable : public RSShadowBaseDrawable {
212 public:
213     explicit RSColorfulShadowDrawable(const RSProperties& properties);
214     ~RSColorfulShadowDrawable() override = default;
215     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
216 
217 protected:
218     Drawing::Brush blurBrush_;
219     std::weak_ptr<RSRenderNode> node_;
220 };
221 
222 class RSHardwareAccelerationShadowDrawable : public RSShadowBaseDrawable {
223 public:
224     explicit RSHardwareAccelerationShadowDrawable(const RSProperties& properties);
225     ~RSHardwareAccelerationShadowDrawable() override = default;
226     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
227 
228 protected:
229     const float shadowElevation_;
230 };
231 
232 // ============================================================================
233 // DynamicLightUp
234 class RSDynamicLightUpDrawable : public RSPropertyDrawable {
235 public:
236     explicit RSDynamicLightUpDrawable() = default;
237     ~RSDynamicLightUpDrawable() override = default;
238     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
239     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
240     bool Update(const RSRenderContent& content) override;
241 };
242 
243 // ============================================================================
244 // Binarization
245 class RSBinarizationDrawable : public RSPropertyDrawable {
246 public:
247     explicit RSBinarizationDrawable() = default;
248     ~RSBinarizationDrawable() override = default;
249     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
250     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
251 };
252 
253 // ============================================================================
254 // LightUpEffect
255 class RSLightUpEffectDrawable : public RSPropertyDrawable {
256 public:
257     explicit RSLightUpEffectDrawable() = default;
258     ~RSLightUpEffectDrawable() override = default;
259     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
260     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
261     bool Update(const RSRenderContent& content) override;
262 };
263 
264 // ============================================================================
265 // DynamicDim
266 class RSDynamicDimDrawable : public RSPropertyDrawable {
267 public:
268     explicit RSDynamicDimDrawable() = default;
269     ~RSDynamicDimDrawable() override = default;
270     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
271     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& context);
272     bool Update(const RSRenderContent& context) override;
273 };
274 
275 // ============================================================================
276 // BackgroundFilter
277 class RSBackgroundFilterDrawable : public RSPropertyDrawable {
278 public:
279     explicit RSBackgroundFilterDrawable() = default;
280     ~RSBackgroundFilterDrawable() override = default;
281     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
282     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
283     bool Update(const RSRenderContent& content) override;
284 };
285 
286 // CompositingFilter
287 class RSCompositingFilterDrawable : public RSPropertyDrawable {
288 public:
289     explicit RSCompositingFilterDrawable() = default;
290     ~RSCompositingFilterDrawable() override = default;
291     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
292     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
293     bool Update(const RSRenderContent& content) override;
294 };
295 
296 bool IsForegroundFilterValid(const RSRenderContent& content);
297 
298 class RSForegroundFilterDrawable : public RSPropertyDrawable {
299 public:
300     explicit RSForegroundFilterDrawable() = default;
301     ~RSForegroundFilterDrawable() override = default;
302     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
303     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
304     bool Update(const RSRenderContent& content) override;
305 };
306 
307 class RSForegroundFilterRestoreDrawable : public RSPropertyDrawable {
308 public:
309     explicit RSForegroundFilterRestoreDrawable() = default;
310     ~RSForegroundFilterRestoreDrawable() override = default;
311     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
312     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
313     bool Update(const RSRenderContent& content) override;
314 };
315 
316 // EffectDataGenerate
317 class RSEffectDataGenerateDrawable : public RSPropertyDrawable {
318 public:
319     explicit RSEffectDataGenerateDrawable() = default;
320     ~RSEffectDataGenerateDrawable() override = default;
321     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
322     bool Update(const RSRenderContent& content) override;
323 };
324 
325 // RSEffectDataApply
326 class RSEffectDataApplyDrawable : public RSPropertyDrawable {
327 public:
328     explicit RSEffectDataApplyDrawable() = default;
329     ~RSEffectDataApplyDrawable() override = default;
330     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
331     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
332     bool Update(const RSRenderContent& content) override;
333 };
334 
335 // ============================================================================
336 // ForegroundColor
337 class RSForegroundColorDrawable : public RSPropertyDrawable {
338 public:
RSForegroundColorDrawable(Drawing::Brush && brush)339     explicit RSForegroundColorDrawable(Drawing::Brush&& brush) : brush_(std::move(brush)) {}
340     ~RSForegroundColorDrawable() override = default;
341     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
342     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
343     bool Update(const RSRenderContent& content) override;
344 
345 private:
346     Drawing::Brush brush_;
347 };
348 
349 // ============================================================================
350 // Particle
351 class RSParticleDrawable : public RSPropertyDrawable {
352 public:
353     explicit RSParticleDrawable() = default;
354     ~RSParticleDrawable() override = default;
355     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
356     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
357     bool Update(const RSRenderContent& content) override;
358 };
359 
360 
361 // ============================================================================
362 // PixelStretch
363 class RSPixelStretchDrawable : public RSPropertyDrawable {
364 public:
365     explicit RSPixelStretchDrawable() = default;
366     ~RSPixelStretchDrawable() override = default;
367 
368     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
369     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
370     bool Update(const RSRenderContent& content) override;
371 };
372 
373 // ============================================================================
374 // Background
375 class RSBackgroundDrawable : public RSPropertyDrawable {
376 public:
377     explicit RSBackgroundDrawable() = default;
378     ~RSBackgroundDrawable() override = default;
379     static void setForceBgAntiAlias(bool antiAlias);
380     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
381 
382 protected:
383     Drawing::Brush brush_;
384 };
385 
386 class RSBackgroundColorDrawable : public RSBackgroundDrawable {
387 public:
RSBackgroundColorDrawable(Drawing::Color color)388     explicit RSBackgroundColorDrawable(Drawing::Color color) : RSBackgroundDrawable()
389     {
390         brush_.SetColor(color);
391     }
392     ~RSBackgroundColorDrawable() override = default;
393     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
394     bool Update(const RSRenderContent& content) override;
395 };
396 
397 class RSBackgroundShaderDrawable : public RSBackgroundDrawable {
398 public:
RSBackgroundShaderDrawable(std::shared_ptr<Drawing::ShaderEffect> filter)399     explicit RSBackgroundShaderDrawable(std::shared_ptr<Drawing::ShaderEffect> filter) : RSBackgroundDrawable()
400     {
401         brush_.SetShaderEffect(std::move(filter));
402     }
403     ~RSBackgroundShaderDrawable() override = default;
404     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
405     bool Update(const RSRenderContent& content) override;
406 };
407 
408 class RSBackgroundImageDrawable : public RSBackgroundDrawable {
409 public:
410     explicit RSBackgroundImageDrawable() = default;
411     ~RSBackgroundImageDrawable() override = default;
412     static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content);
413     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
414     bool Update(const RSRenderContent& content) override;
415 };
416 
417 // blend mode save and restore
418 std::unique_ptr<RSPropertyDrawable> BlendSaveDrawableGenerate(const RSRenderContent& context);
419 std::unique_ptr<RSPropertyDrawable> BlendRestoreDrawableGenerate(const RSRenderContent& context);
420 
421 class RSBlendSaveLayerDrawable : public RSPropertyDrawable {
422 public:
423     explicit RSBlendSaveLayerDrawable(int blendMode);
424     ~RSBlendSaveLayerDrawable() override = default;
425     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
426 
427 private:
428     Drawing::Brush blendBrush_;
429 };
430 
431 class RSBlendFastDrawable : public RSPropertyDrawable {
432 public:
RSBlendFastDrawable(int blendMode)433     explicit RSBlendFastDrawable(int blendMode) : blendMode_(blendMode) {}
434     ~RSBlendFastDrawable() override = default;
435     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
436 
437 private:
438     int blendMode_;
439 };
440 
441 class RSBlendSaveLayerRestoreDrawable : public RSPropertyDrawable {
442 public:
443     explicit RSBlendSaveLayerRestoreDrawable() = default;
444     ~RSBlendSaveLayerRestoreDrawable() override = default;
445     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
446 };
447 
448 class RSBlendFastRestoreDrawable : public RSPropertyDrawable {
449 public:
450     explicit RSBlendFastRestoreDrawable() = default;
451     ~RSBlendFastRestoreDrawable() override = default;
452     void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override;
453 };
454 } // namespace OHOS::Rosen
455 #endif // RENDER_SERVICE_BASE_PROPERTY_RS_PROPERTY_DRAWABLE_BOUNDS_GEOMETRY_H
456