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 DRAG_DRAWING_H 17 #define DRAG_DRAWING_H 18 19 #include <vector> 20 21 #include "display_manager.h" 22 #include "event_handler.h" 23 #include "event_runner.h" 24 #include "libxml/tree.h" 25 #include "libxml/parser.h" 26 #include "modifier/rs_extended_modifier.h" 27 #include "modifier/rs_modifier.h" 28 29 #include "vsync_receiver.h" 30 #include "drag_data.h" 31 #include "i_drag_animation.h" 32 33 namespace OHOS { 34 namespace Msdp { 35 namespace DeviceStatus { 36 struct DrawingInfo; 37 class DragDrawing; 38 using DragExtFunc = void (*)(DragDrawing *drawingObj, DrawingInfo *drawingInfo); 39 class DrawSVGModifier : public Rosen::RSContentStyleModifier { 40 public: DrawSVGModifier(std::shared_ptr<Media::PixelMap> stylePixelMap)41 explicit DrawSVGModifier(std::shared_ptr<Media::PixelMap> stylePixelMap) : stylePixelMap_(stylePixelMap) {} 42 ~DrawSVGModifier() = default; 43 void Draw(Rosen::RSDrawingContext& context) const override; 44 45 private: 46 std::shared_ptr<Media::PixelMap> stylePixelMap_ { nullptr }; 47 }; 48 49 class DrawPixelMapModifier : public Rosen::RSContentStyleModifier { 50 public: 51 DrawPixelMapModifier() = default; 52 ~DrawPixelMapModifier() = default; 53 void Draw(Rosen::RSDrawingContext &context) const override; 54 }; 55 56 class DrawMouseIconModifier : public Rosen::RSContentStyleModifier { 57 public: 58 DrawMouseIconModifier() = default; 59 ~DrawMouseIconModifier() = default; 60 void Draw(Rosen::RSDrawingContext &context) const override; 61 62 private: 63 void OnDraw(std::shared_ptr<Media::PixelMap> pixelMap, int32_t pointerStyleId) const; 64 }; 65 66 class DrawDynamicEffectModifier : public Rosen::RSContentStyleModifier { 67 public: 68 DrawDynamicEffectModifier() = default; 69 ~DrawDynamicEffectModifier() = default; 70 void Draw(Rosen::RSDrawingContext &context) const override; 71 void SetAlpha(float alpha); 72 void SetScale(float scale); 73 74 private: 75 std::shared_ptr<Rosen::RSAnimatableProperty<float>> alpha_ { nullptr }; 76 std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr }; 77 }; 78 79 class DrawDragStopModifier : public Rosen::RSContentStyleModifier { 80 public: 81 DrawDragStopModifier() = default; 82 ~DrawDragStopModifier() = default; 83 void Draw(Rosen::RSDrawingContext &context) const override; 84 void SetAlpha(float alpha); 85 void SetScale(float scale); 86 void SetStyleScale(float scale); 87 void SetStyleAlpha(float alpha); 88 89 private: 90 std::shared_ptr<Rosen::RSAnimatableProperty<float>> alpha_ { nullptr }; 91 std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr }; 92 std::shared_ptr<Rosen::RSAnimatableProperty<float>> styleScale_ { nullptr }; 93 std::shared_ptr<Rosen::RSAnimatableProperty<float>> styleAlpha_ { nullptr }; 94 }; 95 96 class DrawStyleChangeModifier : public Rosen::RSContentStyleModifier { 97 public: 98 DrawStyleChangeModifier() = default; DrawStyleChangeModifier(std::shared_ptr<Media::PixelMap> stylePixelMap)99 explicit DrawStyleChangeModifier(std::shared_ptr<Media::PixelMap> stylePixelMap) : stylePixelMap_(stylePixelMap) {} 100 ~DrawStyleChangeModifier() = default; 101 void Draw(Rosen::RSDrawingContext &context) const override; 102 void SetScale(float scale); 103 104 private: 105 std::shared_ptr<Media::PixelMap> stylePixelMap_ { nullptr }; 106 std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr }; 107 }; 108 109 class DrawStyleScaleModifier : public Rosen::RSContentStyleModifier { 110 public: 111 DrawStyleScaleModifier() = default; 112 ~DrawStyleScaleModifier() = default; 113 void Draw(Rosen::RSDrawingContext &context) const override; 114 void SetScale(float scale); 115 116 private: 117 std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr }; 118 }; 119 120 struct DrawingInfo { 121 std::atomic_bool isRunning { false }; 122 std::atomic_bool isPreviousDefaultStyle { false }; 123 std::atomic_bool isCurrentDefaultStyle { false }; 124 bool isInitUiDirector { true }; 125 bool isExistScalingValue { false }; 126 int32_t sourceType { -1 }; 127 int32_t currentDragNum { -1 }; 128 DragCursorStyle currentStyle { DragCursorStyle::DEFAULT }; 129 int32_t displayId { -1 }; 130 int32_t pixelMapX { -1 }; 131 int32_t pixelMapY { -1 }; 132 int32_t lastPixelMapX { -1 }; 133 int32_t lastPixelMapY { -1 }; 134 int32_t displayX { -1 }; 135 int32_t displayY { -1 }; 136 int32_t mouseWidth { 0 }; 137 int32_t mouseHeight { 0 }; 138 int32_t rootNodeWidth { -1 }; 139 int32_t rootNodeHeight { -1 }; 140 float scalingValue { 0.0 }; 141 std::vector<std::shared_ptr<Rosen::RSCanvasNode>> nodes; 142 std::vector<std::shared_ptr<Rosen::RSCanvasNode>> multiSelectedNodes; 143 std::vector<std::shared_ptr<Media::PixelMap>> multiSelectedPixelMaps; 144 std::shared_ptr<Rosen::RSNode> rootNode { nullptr }; 145 std::shared_ptr<Rosen::RSNode> parentNode { nullptr }; 146 std::shared_ptr<Rosen::RSSurfaceNode> surfaceNode { nullptr }; 147 std::shared_ptr<Media::PixelMap> pixelMap { nullptr }; 148 std::shared_ptr<Media::PixelMap> stylePixelMap { nullptr }; 149 std::string extraInfo; 150 std::string filterInfo; 151 }; 152 153 struct FilterInfo { 154 std::string componentType; 155 int32_t blurStyle { -1 }; 156 float cornerRadius { 0.0F }; 157 float dipScale { 0.0F }; 158 }; 159 160 class DragDrawing : public IDragAnimation { 161 public: 162 DragDrawing() = default; 163 DISALLOW_COPY_AND_MOVE(DragDrawing); 164 ~DragDrawing() = default; 165 166 int32_t Init(const DragData &dragData); 167 void Draw(int32_t displayId, int32_t displayX, int32_t displayY, bool isNeedAdjustDisplayXY = true); 168 int32_t UpdateDragStyle(DragCursorStyle style); 169 int32_t UpdateShadowPic(const ShadowInfo &shadowInfo); 170 int32_t UpdatePreviewStyle(const PreviewStyle &previewStyle); 171 int32_t UpdatePreviewStyleWithAnimation(const PreviewStyle &previewStyle, const PreviewAnimation &animation); 172 int32_t StartVsync(); 173 void OnDragSuccess(); 174 void OnDragFail(); 175 void EraseMouseIcon(); 176 void DestroyDragWindow(); 177 void UpdateDrawingState(); 178 void UpdateDragWindowState(bool visible); 179 void OnStartDrag(const DragAnimationData &dragAnimationData, std::shared_ptr<Rosen::RSCanvasNode> shadowNode, 180 std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode) override; 181 void OnDragStyle(std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode, 182 std::shared_ptr<Media::PixelMap> stylePixelMap) override; 183 void OnStopDragSuccess(std::shared_ptr<Rosen::RSCanvasNode> shadowNode, 184 std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode) override; 185 void OnStopDragFail(std::shared_ptr<Rosen::RSSurfaceNode> surfaceNode, 186 std::shared_ptr<Rosen::RSNode> rootNode) override; 187 void OnStopAnimation() override; 188 int32_t EnterTextEditorArea(bool enable); 189 bool GetAllowDragState(); 190 void SetScreenId(uint64_t screenId); 191 int32_t RotateDragWindow(Rosen::Rotation rotation); 192 void SetRotation(Rosen::Rotation rotation); 193 194 private: 195 int32_t CheckDragData(const DragData &dragData); 196 int32_t InitLayer(); 197 void InitCanvas(int32_t width, int32_t height); 198 void CreateWindow(); 199 int32_t DrawShadow(std::shared_ptr<Rosen::RSCanvasNode> shadowNode); 200 int32_t DrawMouseIcon(); 201 int32_t DrawStyle(std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode, 202 std::shared_ptr<Media::PixelMap> stylePixelMap); 203 int32_t RunAnimation(std::function<int32_t()> cb); 204 int32_t InitVSync(float endAlpha, float endScale); 205 void OnVsync(); 206 void InitDrawingInfo(const DragData &dragData); 207 int32_t InitDragAnimationData(DragAnimationData &dragAnimationData); 208 void RemoveModifier(); 209 int32_t UpdateSvgNodeInfo(xmlNodePtr curNode, int32_t extendSvgWidth); 210 xmlNodePtr GetRectNode(xmlNodePtr curNode); 211 xmlNodePtr UpdateRectNode(int32_t extendSvgWidth, xmlNodePtr curNode); 212 void UpdateTspanNode(xmlNodePtr curNode); 213 int32_t ParseAndAdjustSvgInfo(xmlNodePtr curNode); 214 std::shared_ptr<Media::PixelMap> DecodeSvgToPixelMap(const std::string &filePath); 215 int32_t GetFilePath(std::string &filePath); 216 bool NeedAdjustSvgInfo(); 217 void SetDecodeOptions(Media::DecodeOptions &decodeOpts); 218 bool ParserFilterInfo(FilterInfo &filterInfo); 219 void ProcessFilter(); 220 static float RadiusVp2Sigma(float radiusVp, float dipScale); 221 void DoDrawMouse(); 222 int32_t UpdateDefaultDragStyle(DragCursorStyle style); 223 int32_t UpdateValidDragStyle(DragCursorStyle style); 224 int32_t SetNodesLocation(int32_t positionX, int32_t positionY); 225 int32_t CreateEventRunner(int32_t positionX, int32_t positionY); 226 int32_t ModifyPreviewStyle(std::shared_ptr<Rosen::RSCanvasNode> node, const PreviewStyle &previewStyle); 227 int32_t ModifyMultiPreviewStyle(const std::vector<PreviewStyle> &previewStyles); 228 void MultiSelectedAnimation(int32_t positionX, int32_t positionY, int32_t adjustSize); 229 void InitMultiSelectedNodes(); 230 void ClearMultiSelectedData(); 231 bool ParserRadius(float &radius); 232 void OnStartStyleAnimation(); 233 void OnStopAnimationSuccess(); 234 void OnStopAnimationFail(); 235 void OnDragStyleAnimation(); 236 void ChangeStyleAnimation(); 237 void CheckStyleNodeModifier(std::shared_ptr<Rosen::RSCanvasNode> styleNode); 238 void RemoveStyleNodeModifier(std::shared_ptr<Rosen::RSCanvasNode> styleNode); 239 void StartStyleAnimation(float startScale, float endScale, int32_t duration); 240 void UpdateAnimationProtocol(Rosen::RSAnimationTimingProtocol protocol); 241 void RotateDisplayXY(int32_t &displayX, int32_t &displayY); 242 void RotatePixelMapXY(int32_t &pixelMapX, int32_t &pixelMapY); 243 void ResetParameter(); 244 int32_t DoRotateDragWindow(float rotation); 245 246 private: 247 int64_t startNum_ { -1 }; 248 int64_t interruptNum_ { -1 }; 249 std::shared_ptr<Rosen::RSCanvasNode> canvasNode_ { nullptr }; 250 std::shared_ptr<DrawSVGModifier> drawSVGModifier_ { nullptr }; 251 std::shared_ptr<DrawPixelMapModifier> drawPixelMapModifier_ { nullptr }; 252 std::shared_ptr<DrawMouseIconModifier> drawMouseIconModifier_ { nullptr }; 253 std::shared_ptr<DrawDynamicEffectModifier> drawDynamicEffectModifier_ { nullptr }; 254 std::shared_ptr<DrawDragStopModifier> drawDragStopModifier_ { nullptr }; 255 std::shared_ptr<DrawStyleChangeModifier> drawStyleChangeModifier_ { nullptr }; 256 std::shared_ptr<DrawStyleScaleModifier> drawStyleScaleModifier_ { nullptr }; 257 std::shared_ptr<Rosen::RSUIDirector> rsUiDirector_ { nullptr }; 258 std::shared_ptr<Rosen::VSyncReceiver> receiver_ { nullptr }; 259 std::shared_ptr<AppExecFwk::EventHandler> handler_ { nullptr }; 260 std::atomic_bool hasRunningStopAnimation_ { false }; 261 std::atomic_bool hasRunningScaleAnimation_ { false }; 262 std::atomic_bool needBreakStyleScaleAnimation_ { false }; 263 std::atomic_bool hasRunningAnimation_ { false }; 264 void* dragExtHandle_ { nullptr }; 265 bool needDestroyDragWindow_ { false }; 266 bool needRotatePixelMapXY_ { false }; 267 uint64_t screenId_ { 0 }; 268 Rosen::Rotation rotation_ { Rosen::Rotation::ROTATION_0 }; 269 }; 270 } // namespace DeviceStatus 271 } // namespace Msdp 272 } // namespace OHOS 273 #endif // DRAG_DRAWING_H