1 /* 2 * Copyright (c) 2024 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 GRAPHICS_EFFECT_GE_RENDER_H 17 #define GRAPHICS_EFFECT_GE_RENDER_H 18 19 #include <memory> 20 21 #include "ge_filter_composer.h" 22 #include "ge_hps_effect_filter.h" 23 #include "ge_shader.h" 24 #include "ge_shader_filter.h" 25 #include "ge_visual_effect.h" 26 #include "ge_visual_effect_container.h" 27 28 #include "draw/brush.h" 29 #include "draw/canvas.h" 30 #include "draw/pen.h" 31 #include "effect/color_filter.h" 32 #include "effect/runtime_effect.h" 33 #include "effect/runtime_shader_builder.h" 34 #include "image/image.h" 35 36 namespace OHOS { 37 namespace GraphicsEffectEngine { 38 39 using namespace Rosen; 40 41 class GE_EXPORT GERender { 42 public: 43 enum class EffectMode { 44 GE, 45 HPS, 46 }; 47 48 using IndexRange = HpsEffectFilter::IndexRange; 49 struct IndexRangeInfo { 50 EffectMode mode; 51 IndexRange range; 52 IndexRangeInfoIndexRangeInfo53 IndexRangeInfo(EffectMode em, const IndexRange& r) : mode(em), range(r) {} 54 }; 55 56 GERender(); 57 ~GERender(); 58 void DrawShaderEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer, 59 const Drawing::Rect& bounds); 60 61 void DrawImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer, 62 const std::shared_ptr<Drawing::Image>& image, const Drawing::Rect& src, const Drawing::Rect& dst, 63 const Drawing::SamplingOptions& sampling); 64 65 std::shared_ptr<Drawing::Image> ApplyImageEffect(Drawing::Canvas& canvas, 66 Drawing::GEVisualEffectContainer& veContainer, const std::shared_ptr<Drawing::Image>& image, 67 const Drawing::Rect& src, const Drawing::Rect& dst, const Drawing::SamplingOptions& sampling); 68 69 bool HpsSupportEffect(Drawing::GEVisualEffectContainer& veContainer, 70 std::shared_ptr<HpsEffectFilter>& hpsEffectFilter); 71 72 struct HpsGEImageEffectContext { 73 std::shared_ptr<Drawing::Image> image; 74 Drawing::Rect src; 75 Drawing::Rect dst; 76 Drawing::SamplingOptions sampling; 77 bool compatibleWithHpsSkipBlur; 78 float alpha; 79 std::shared_ptr<Drawing::ColorFilter> colorFilter; 80 uint32_t maskColor; 81 float saturationForHPS; 82 float brightnessForHPS; 83 }; 84 85 bool ApplyHpsImageEffect(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer, 86 const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage); 87 88 bool ApplyHpsGEImageEffect( 89 Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer, 90 const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage, 91 Drawing::Brush& brush 92 ); 93 94 private: 95 friend class OHOS::Rosen::GEFilterComposer; 96 97 std::vector<IndexRangeInfo> CategorizeRanges( 98 const std::vector<IndexRange>& hpsIndexRanges, const int32_t veContainerSize); 99 100 bool ComposeGEEffects(std::vector<std::shared_ptr<Drawing::GEVisualEffect>>& visualEffects, 101 std::vector<std::shared_ptr<GEShaderFilter>>& geShaderFiltersOut); 102 103 bool ApplyGEEffects(Drawing::Canvas& canvas, 104 std::vector<std::shared_ptr<Drawing::GEVisualEffect>>& visualEffects, 105 const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage); 106 107 void DrawToCanvas(Drawing::Canvas& canvas, const HpsGEImageEffectContext& context, 108 std::shared_ptr<Drawing::Image>& outImage, Drawing::Brush& brush); 109 110 std::shared_ptr<GEShader> GenerateShaderEffect(const std::shared_ptr<Drawing::GEVisualEffectImpl>& ve); 111 112 std::shared_ptr<GEShaderFilter> GenerateShaderFilter(const std::shared_ptr<Drawing::GEVisualEffect>& ve); 113 std::vector<std::shared_ptr<GEShaderFilter>> GenerateShaderFilters(Drawing::GEVisualEffectContainer& veContainer); 114 115 std::shared_ptr<GEShaderFilter> GenerateExtShaderFilter(const std::shared_ptr<Drawing::GEVisualEffectImpl>&); 116 bool ExcuteRangeEmpty(Drawing::Canvas& canvas, Drawing::GEVisualEffectContainer& veContainer, 117 const HpsGEImageEffectContext& context, std::shared_ptr<Drawing::Image>& outImage, Drawing::Brush& brush); 118 }; 119 120 } // namespace GraphicsEffectEngine 121 } // namespace OHOS 122 123 #endif // GRAPHICS_EFFECT_GE_RENDER_H 124