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 ~RSShadowDrawable() override = default; 206 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 207 208 protected: 209 const float radius_; 210 }; 211 212 class RSColorfulShadowDrawable : public RSShadowBaseDrawable { 213 public: 214 explicit RSColorfulShadowDrawable(const RSProperties& properties); 215 ~RSColorfulShadowDrawable() override = default; 216 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 217 218 protected: 219 Drawing::Brush blurBrush_; 220 std::weak_ptr<RSRenderNode> node_; 221 }; 222 223 class RSHardwareAccelerationShadowDrawable : public RSShadowBaseDrawable { 224 public: 225 explicit RSHardwareAccelerationShadowDrawable(const RSProperties& properties); 226 ~RSHardwareAccelerationShadowDrawable() override = default; 227 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 228 229 protected: 230 const float shadowElevation_; 231 }; 232 233 // ============================================================================ 234 // DynamicLightUp 235 class RSDynamicLightUpDrawable : public RSPropertyDrawable { 236 public: 237 explicit RSDynamicLightUpDrawable() = default; 238 ~RSDynamicLightUpDrawable() override = default; 239 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 240 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 241 bool Update(const RSRenderContent& content) override; 242 }; 243 244 // ============================================================================ 245 // Binarization 246 class RSBinarizationDrawable : public RSPropertyDrawable { 247 public: 248 explicit RSBinarizationDrawable() = default; 249 ~RSBinarizationDrawable() override = default; 250 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 251 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 252 }; 253 254 // ============================================================================ 255 // LightUpEffect 256 class RSLightUpEffectDrawable : public RSPropertyDrawable { 257 public: 258 explicit RSLightUpEffectDrawable() = default; 259 ~RSLightUpEffectDrawable() override = default; 260 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 261 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 262 bool Update(const RSRenderContent& content) override; 263 }; 264 265 // ============================================================================ 266 // DynamicDim 267 class RSDynamicDimDrawable : public RSPropertyDrawable { 268 public: 269 explicit RSDynamicDimDrawable() = default; 270 ~RSDynamicDimDrawable() override = default; 271 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 272 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& context); 273 bool Update(const RSRenderContent& context) override; 274 }; 275 276 // ============================================================================ 277 // BackgroundFilter 278 class RSBackgroundFilterDrawable : public RSPropertyDrawable { 279 public: 280 explicit RSBackgroundFilterDrawable() = default; 281 ~RSBackgroundFilterDrawable() override = default; 282 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 283 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 284 bool Update(const RSRenderContent& content) override; 285 }; 286 287 // CompositingFilter 288 class RSCompositingFilterDrawable : public RSPropertyDrawable { 289 public: 290 explicit RSCompositingFilterDrawable() = default; 291 ~RSCompositingFilterDrawable() override = default; 292 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 293 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 294 bool Update(const RSRenderContent& content) override; 295 }; 296 297 bool IsForegroundFilterValid(const RSRenderContent& content); 298 299 class RSForegroundFilterDrawable : public RSPropertyDrawable { 300 public: 301 explicit RSForegroundFilterDrawable() = default; 302 ~RSForegroundFilterDrawable() override = default; 303 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 304 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 305 bool Update(const RSRenderContent& content) override; 306 }; 307 308 class RSForegroundFilterRestoreDrawable : public RSPropertyDrawable { 309 public: 310 explicit RSForegroundFilterRestoreDrawable() = default; 311 ~RSForegroundFilterRestoreDrawable() override = default; 312 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 313 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 314 bool Update(const RSRenderContent& content) override; 315 }; 316 317 // EffectDataGenerate 318 class RSEffectDataGenerateDrawable : public RSPropertyDrawable { 319 public: 320 explicit RSEffectDataGenerateDrawable() = default; 321 ~RSEffectDataGenerateDrawable() override = default; 322 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 323 bool Update(const RSRenderContent& content) override; 324 }; 325 326 // RSEffectDataApply 327 class RSEffectDataApplyDrawable : public RSPropertyDrawable { 328 public: 329 explicit RSEffectDataApplyDrawable() = default; 330 ~RSEffectDataApplyDrawable() override = default; 331 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 332 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 333 bool Update(const RSRenderContent& content) override; 334 }; 335 336 // ============================================================================ 337 // ForegroundColor 338 class RSForegroundColorDrawable : public RSPropertyDrawable { 339 public: RSForegroundColorDrawable(Drawing::Brush && brush)340 explicit RSForegroundColorDrawable(Drawing::Brush&& brush) : brush_(std::move(brush)) {} 341 ~RSForegroundColorDrawable() override = default; 342 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 343 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 344 bool Update(const RSRenderContent& content) override; 345 346 private: 347 Drawing::Brush brush_; 348 }; 349 350 // ============================================================================ 351 // Particle 352 class RSParticleDrawable : public RSPropertyDrawable { 353 public: 354 explicit RSParticleDrawable() = default; 355 ~RSParticleDrawable() override = default; 356 static RSPropertyDrawable::DrawablePtr Generate(const RSRenderContent& content); 357 void Draw(const RSRenderContent& content, RSPaintFilterCanvas& canvas) const override; 358 bool Update(const RSRenderContent& content) override; 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