• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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