1f857971dSopenharmony_ci/*
2f857971dSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3f857971dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f857971dSopenharmony_ci * you may not use this file except in compliance with the License.
5f857971dSopenharmony_ci * You may obtain a copy of the License at
6f857971dSopenharmony_ci *
7f857971dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f857971dSopenharmony_ci *
9f857971dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f857971dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f857971dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f857971dSopenharmony_ci * See the License for the specific language governing permissions and
13f857971dSopenharmony_ci * limitations under the License.
14f857971dSopenharmony_ci */
15f857971dSopenharmony_ci
16f857971dSopenharmony_ci#ifndef DRAG_DRAWING_H
17f857971dSopenharmony_ci#define DRAG_DRAWING_H
18f857971dSopenharmony_ci
19f857971dSopenharmony_ci#include <vector>
20f857971dSopenharmony_ci
21f857971dSopenharmony_ci#include "display_manager.h"
22f857971dSopenharmony_ci#include "event_handler.h"
23f857971dSopenharmony_ci#include "event_runner.h"
24f857971dSopenharmony_ci#include "json_parser.h"
25f857971dSopenharmony_ci#include "libxml/tree.h"
26f857971dSopenharmony_ci#include "libxml/parser.h"
27f857971dSopenharmony_ci#include "modifier/rs_extended_modifier.h"
28f857971dSopenharmony_ci#include "modifier/rs_modifier.h"
29f857971dSopenharmony_ci#include "vsync_receiver.h"
30f857971dSopenharmony_ci
31f857971dSopenharmony_ci#include "drag_data.h"
32f857971dSopenharmony_ci#include "drag_smooth_processor.h"
33f857971dSopenharmony_ci#include "drag_vsync_station.h"
34f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
35f857971dSopenharmony_ci#include "i_context.h"
36f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
37f857971dSopenharmony_ci#include "i_drag_animation.h"
38f857971dSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ARKUI_X
39f857971dSopenharmony_ci#include "pointer_style.h"
40f857971dSopenharmony_ci#include "virtual_rs_window.h"
41f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
42f857971dSopenharmony_ci
43f857971dSopenharmony_cinamespace OHOS {
44f857971dSopenharmony_cinamespace Msdp {
45f857971dSopenharmony_cinamespace DeviceStatus {
46f857971dSopenharmony_cistruct DrawingInfo;
47f857971dSopenharmony_ciclass DragDrawing;
48f857971dSopenharmony_ciusing DragStartExtFunc = void (*)(DragData &dragData);
49f857971dSopenharmony_ciusing DragNotifyExtFunc = void (*)(DragEventInfo &dragEventInfo);
50f857971dSopenharmony_ciclass DrawSVGModifier : public Rosen::RSContentStyleModifier {
51f857971dSopenharmony_cipublic:
52f857971dSopenharmony_ci    explicit DrawSVGModifier(std::shared_ptr<Media::PixelMap> stylePixelMap) : stylePixelMap_(stylePixelMap) {}
53f857971dSopenharmony_ci    ~DrawSVGModifier() = default;
54f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext& context) const override;
55f857971dSopenharmony_ci
56f857971dSopenharmony_ciprivate:
57f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> stylePixelMap_ { nullptr };
58f857971dSopenharmony_ci};
59f857971dSopenharmony_ci
60f857971dSopenharmony_ciclass DrawPixelMapModifier : public Rosen::RSContentStyleModifier {
61f857971dSopenharmony_cipublic:
62f857971dSopenharmony_ci    DrawPixelMapModifier() = default;
63f857971dSopenharmony_ci    ~DrawPixelMapModifier() = default;
64f857971dSopenharmony_ci    void SetDragShadow(std::shared_ptr<Rosen::RSCanvasNode> pixelMapNode) const;
65f857971dSopenharmony_ci    void SetTextDragShadow(std::shared_ptr<Rosen::RSCanvasNode> pixelMapNode) const;
66f857971dSopenharmony_ci    Rosen::SHADOW_COLOR_STRATEGY ConvertShadowColorStrategy(int32_t shadowColorStrategy) const;
67f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
68f857971dSopenharmony_ci};
69f857971dSopenharmony_ci
70f857971dSopenharmony_ciclass DrawMouseIconModifier : public Rosen::RSContentStyleModifier {
71f857971dSopenharmony_cipublic:
72f857971dSopenharmony_ci    explicit DrawMouseIconModifier(MMI::PointerStyle pointerStyle) : pointerStyle_(pointerStyle) {}
73f857971dSopenharmony_ci    ~DrawMouseIconModifier() = default;
74f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
75f857971dSopenharmony_ci
76f857971dSopenharmony_ciprivate:
77f857971dSopenharmony_ci    void OnDraw(std::shared_ptr<Media::PixelMap> pixelMap) const;
78f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> DrawFromSVG() const;
79f857971dSopenharmony_ci
80f857971dSopenharmony_ciprivate:
81f857971dSopenharmony_ci    MMI::PointerStyle pointerStyle_;
82f857971dSopenharmony_ci};
83f857971dSopenharmony_ci
84f857971dSopenharmony_ciclass DrawDynamicEffectModifier : public Rosen::RSContentStyleModifier {
85f857971dSopenharmony_cipublic:
86f857971dSopenharmony_ci    DrawDynamicEffectModifier() = default;
87f857971dSopenharmony_ci    ~DrawDynamicEffectModifier() = default;
88f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
89f857971dSopenharmony_ci    void SetAlpha(float alpha);
90f857971dSopenharmony_ci    void SetScale(float scale);
91f857971dSopenharmony_ci
92f857971dSopenharmony_ciprivate:
93f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> alpha_ { nullptr };
94f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr };
95f857971dSopenharmony_ci};
96f857971dSopenharmony_ci
97f857971dSopenharmony_ciclass DrawDragStopModifier : public Rosen::RSContentStyleModifier {
98f857971dSopenharmony_cipublic:
99f857971dSopenharmony_ci    DrawDragStopModifier() = default;
100f857971dSopenharmony_ci    ~DrawDragStopModifier() = default;
101f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
102f857971dSopenharmony_ci    void SetAlpha(float alpha);
103f857971dSopenharmony_ci    void SetScale(float scale);
104f857971dSopenharmony_ci    void SetStyleScale(float scale);
105f857971dSopenharmony_ci    void SetStyleAlpha(float alpha);
106f857971dSopenharmony_ci
107f857971dSopenharmony_ciprivate:
108f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> alpha_ { nullptr };
109f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr };
110f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> styleScale_ { nullptr };
111f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> styleAlpha_ { nullptr };
112f857971dSopenharmony_ci};
113f857971dSopenharmony_ci
114f857971dSopenharmony_ciclass DrawStyleChangeModifier : public Rosen::RSContentStyleModifier {
115f857971dSopenharmony_cipublic:
116f857971dSopenharmony_ci    DrawStyleChangeModifier() = default;
117f857971dSopenharmony_ci    explicit DrawStyleChangeModifier(std::shared_ptr<Media::PixelMap> stylePixelMap) : stylePixelMap_(stylePixelMap) {}
118f857971dSopenharmony_ci    ~DrawStyleChangeModifier() = default;
119f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
120f857971dSopenharmony_ci    void SetScale(float scale);
121f857971dSopenharmony_ci
122f857971dSopenharmony_ciprivate:
123f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> stylePixelMap_ { nullptr };
124f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr };
125f857971dSopenharmony_ci};
126f857971dSopenharmony_ci
127f857971dSopenharmony_ciclass DrawStyleScaleModifier : public Rosen::RSContentStyleModifier {
128f857971dSopenharmony_cipublic:
129f857971dSopenharmony_ci    DrawStyleScaleModifier() = default;
130f857971dSopenharmony_ci    ~DrawStyleScaleModifier() = default;
131f857971dSopenharmony_ci    void Draw(Rosen::RSDrawingContext &context) const override;
132f857971dSopenharmony_ci    void SetScale(float scale);
133f857971dSopenharmony_ci
134f857971dSopenharmony_ciprivate:
135f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSAnimatableProperty<float>> scale_ { nullptr };
136f857971dSopenharmony_ci};
137f857971dSopenharmony_ci
138f857971dSopenharmony_cistruct FilterInfo {
139f857971dSopenharmony_ci    std::string dragType;
140f857971dSopenharmony_ci    bool shadowEnable { false };
141f857971dSopenharmony_ci    bool shadowIsFilled { false };
142f857971dSopenharmony_ci    bool shadowMask { false };
143f857971dSopenharmony_ci    int32_t shadowColorStrategy { 0 };
144f857971dSopenharmony_ci    float shadowCorner { 0.0F };
145f857971dSopenharmony_ci    float dipScale { 0.0f };
146f857971dSopenharmony_ci    float scale { 1.0f };
147f857971dSopenharmony_ci    float cornerRadius1 { 0.0f };
148f857971dSopenharmony_ci    float cornerRadius2 { 0.0f };
149f857971dSopenharmony_ci    float cornerRadius3 { 0.0f };
150f857971dSopenharmony_ci    float cornerRadius4 { 0.0f };
151f857971dSopenharmony_ci    float opacity { 0.95f };
152f857971dSopenharmony_ci    float offsetX { 0.0f };
153f857971dSopenharmony_ci    float offsetY { 0.0f };
154f857971dSopenharmony_ci    uint32_t argb { 0 };
155f857971dSopenharmony_ci    std::string path;
156f857971dSopenharmony_ci    float elevation { 0.0f };
157f857971dSopenharmony_ci    bool isHardwareAcceleration { false };
158f857971dSopenharmony_ci    Rosen::Vector2f coef;
159f857971dSopenharmony_ci    float blurRadius { -1.0f };
160f857971dSopenharmony_ci    float blurStaturation { -1.0f };
161f857971dSopenharmony_ci    float blurBrightness { -1.0f };
162f857971dSopenharmony_ci    uint32_t blurColor { 0 };
163f857971dSopenharmony_ci    int32_t blurStyle { -1 };
164f857971dSopenharmony_ci    float dragNodeGrayscale { 0.0f };
165f857971dSopenharmony_ci};
166f857971dSopenharmony_ci
167f857971dSopenharmony_cistruct ExtraInfo {
168f857971dSopenharmony_ci    std::string componentType;
169f857971dSopenharmony_ci    int32_t blurStyle { -1 };
170f857971dSopenharmony_ci    float cornerRadius { 0.0f };
171f857971dSopenharmony_ci    bool allowDistributed { true };
172f857971dSopenharmony_ci    Rosen::Vector2f coef;
173f857971dSopenharmony_ci};
174f857971dSopenharmony_ci
175f857971dSopenharmony_cienum class ScreenSizeType {
176f857971dSopenharmony_ci    // Undefined screen width
177f857971dSopenharmony_ci    UNDEFINED = 0,
178f857971dSopenharmony_ci    // Screen width size is XS, grids is 2
179f857971dSopenharmony_ci    XS,
180f857971dSopenharmony_ci    // Screen width size is SM, grids is 4
181f857971dSopenharmony_ci    SM,
182f857971dSopenharmony_ci    // Screen width size is MD, grids is 8
183f857971dSopenharmony_ci    MD,
184f857971dSopenharmony_ci    // Screen width size is LG, grids is 12
185f857971dSopenharmony_ci    LG,
186f857971dSopenharmony_ci    // Screen width size is XL, maxi number of grids
187f857971dSopenharmony_ci    XL,
188f857971dSopenharmony_ci};
189f857971dSopenharmony_ci
190f857971dSopenharmony_cistruct DrawingInfo {
191f857971dSopenharmony_ci    std::atomic_bool isRunning { false };
192f857971dSopenharmony_ci    std::atomic_bool isPreviousDefaultStyle { false };
193f857971dSopenharmony_ci    std::atomic_bool isCurrentDefaultStyle { false };
194f857971dSopenharmony_ci    bool isInitUiDirector { true };
195f857971dSopenharmony_ci    bool isExistScalingValue { false };
196f857971dSopenharmony_ci    std::atomic_bool needDestroyDragWindow { false };
197f857971dSopenharmony_ci    int32_t sourceType { -1 };
198f857971dSopenharmony_ci    int32_t currentDragNum { -1 };
199f857971dSopenharmony_ci    DragCursorStyle currentStyle { DragCursorStyle::DEFAULT };
200f857971dSopenharmony_ci    int32_t displayId { -1 };
201f857971dSopenharmony_ci    int32_t pixelMapX { -1 };
202f857971dSopenharmony_ci    int32_t pixelMapY { -1 };
203f857971dSopenharmony_ci    int32_t displayX { -1 };
204f857971dSopenharmony_ci    int32_t displayY { -1 };
205f857971dSopenharmony_ci    float x { -1.0f };
206f857971dSopenharmony_ci    float y { -1.0f };
207f857971dSopenharmony_ci    float currentPositionX { -1.0f };
208f857971dSopenharmony_ci    float currentPositionY { -1.0f };
209f857971dSopenharmony_ci    int32_t mouseWidth { 0 };
210f857971dSopenharmony_ci    int32_t mouseHeight { 0 };
211f857971dSopenharmony_ci    int32_t rootNodeWidth { -1 };
212f857971dSopenharmony_ci    int32_t rootNodeHeight { -1 };
213f857971dSopenharmony_ci    std::atomic<int64_t> startNum { -1 };
214f857971dSopenharmony_ci    int32_t timerId { -1 };
215f857971dSopenharmony_ci    float scalingValue { 0.0 };
216f857971dSopenharmony_ci    std::vector<std::shared_ptr<Rosen::RSCanvasNode>> nodes;
217f857971dSopenharmony_ci    std::vector<std::shared_ptr<Rosen::RSCanvasNode>> multiSelectedNodes;
218f857971dSopenharmony_ci    std::vector<std::shared_ptr<Media::PixelMap>> multiSelectedPixelMaps;
219f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSNode> rootNode { nullptr };
220f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSNode> parentNode { nullptr };
221f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSSurfaceNode> surfaceNode { nullptr };
222f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMap { nullptr };
223f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> stylePixelMap { nullptr };
224f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
225f857971dSopenharmony_ci    IContext* context { nullptr };
226f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
227f857971dSopenharmony_ci    ExtraInfo extraInfo;
228f857971dSopenharmony_ci    FilterInfo filterInfo;
229f857971dSopenharmony_ci};
230f857971dSopenharmony_ci
231f857971dSopenharmony_cistruct DragWindowRotationInfo {
232f857971dSopenharmony_ci    float rotation { 0.0f };
233f857971dSopenharmony_ci    float pivotX { 0.0f };
234f857971dSopenharmony_ci    float pivotY { 0.0f };
235f857971dSopenharmony_ci};
236f857971dSopenharmony_ci
237f857971dSopenharmony_ciclass DragDrawing : public IDragAnimation {
238f857971dSopenharmony_cipublic:
239f857971dSopenharmony_ci    DragDrawing() = default;
240f857971dSopenharmony_ci    DISALLOW_COPY_AND_MOVE(DragDrawing);
241f857971dSopenharmony_ci    ~DragDrawing();
242f857971dSopenharmony_ci
243f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
244f857971dSopenharmony_ci    int32_t Init(const DragData &dragData, IContext* context);
245f857971dSopenharmony_ci#else
246f857971dSopenharmony_ci    int32_t Init(const DragData &dragData);
247f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
248f857971dSopenharmony_ci    void NotifyDragInfo(const std::string &sourceName, const std::string &targetName);
249f857971dSopenharmony_ci    void Draw(int32_t displayId, int32_t displayX, int32_t displayY, bool isNeedAdjustDisplayXY = true,
250f857971dSopenharmony_ci        bool isMultiSelectedAnimation = true);
251f857971dSopenharmony_ci    int32_t UpdateDragStyle(DragCursorStyle style);
252f857971dSopenharmony_ci    int32_t UpdateShadowPic(const ShadowInfo &shadowInfo);
253f857971dSopenharmony_ci    int32_t UpdatePreviewStyle(const PreviewStyle &previewStyle);
254f857971dSopenharmony_ci    int32_t UpdatePreviewStyleWithAnimation(const PreviewStyle &previewStyle, const PreviewAnimation &animation);
255f857971dSopenharmony_ci    int32_t StartVsync();
256f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
257f857971dSopenharmony_ci    void OnDragSuccess(IContext* context);
258f857971dSopenharmony_ci    void OnDragFail(IContext* context);
259f857971dSopenharmony_ci#else
260f857971dSopenharmony_ci    void OnDragSuccess();
261f857971dSopenharmony_ci    void OnDragFail();
262f857971dSopenharmony_ci    void SetDragWindow(std::shared_ptr<OHOS::Rosen::Window> window);
263f857971dSopenharmony_ci    void AddDragDestroy(std::function<void()> cb);
264f857971dSopenharmony_ci    void SetSVGFilePath(const std::string &filePath);
265f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
266f857971dSopenharmony_ci    void OnDragMove(int32_t displayId, int32_t displayX, int32_t displayY, int64_t actionTime);
267f857971dSopenharmony_ci    void EraseMouseIcon();
268f857971dSopenharmony_ci    void DestroyDragWindow();
269f857971dSopenharmony_ci    void UpdateDrawingState();
270f857971dSopenharmony_ci    void UpdateDragWindowState(bool visible);
271f857971dSopenharmony_ci    void OnStartDrag(const DragAnimationData &dragAnimationData, std::shared_ptr<Rosen::RSCanvasNode> shadowNode,
272f857971dSopenharmony_ci        std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode) override;
273f857971dSopenharmony_ci    void OnDragStyle(std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode,
274f857971dSopenharmony_ci        std::shared_ptr<Media::PixelMap> stylePixelMap) override;
275f857971dSopenharmony_ci    void OnStopDragSuccess(std::shared_ptr<Rosen::RSCanvasNode> shadowNode,
276f857971dSopenharmony_ci        std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode) override;
277f857971dSopenharmony_ci    void OnStopDragFail(std::shared_ptr<Rosen::RSSurfaceNode> surfaceNode,
278f857971dSopenharmony_ci        std::shared_ptr<Rosen::RSNode> rootNode) override;
279f857971dSopenharmony_ci    void OnStopAnimation() override;
280f857971dSopenharmony_ci    int32_t EnterTextEditorArea(bool enable);
281f857971dSopenharmony_ci    bool GetAllowDragState();
282f857971dSopenharmony_ci    void SetScreenId(uint64_t screenId);
283f857971dSopenharmony_ci    int32_t RotateDragWindowAsync(Rosen::Rotation rotation);
284f857971dSopenharmony_ci    int32_t RotateDragWindowSync(const std::shared_ptr<Rosen::RSTransaction>& rsTransaction = nullptr);
285f857971dSopenharmony_ci    void SetRotation(Rosen::Rotation rotation);
286f857971dSopenharmony_ci    float CalculateWidthScale();
287f857971dSopenharmony_ci    float GetMaxWidthScale(int32_t width);
288f857971dSopenharmony_ci    int32_t AddSelectedPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap);
289f857971dSopenharmony_ci    void UpdateDragWindowDisplay(int32_t displayId);
290f857971dSopenharmony_ci    void ScreenRotate(Rosen::Rotation rotation, Rosen::Rotation lastRotation);
291f857971dSopenharmony_ci
292f857971dSopenharmony_ciprivate:
293f857971dSopenharmony_ci    int32_t CheckDragData(const DragData &dragData);
294f857971dSopenharmony_ci    int32_t InitLayer();
295f857971dSopenharmony_ci    void InitCanvas(int32_t width, int32_t height);
296f857971dSopenharmony_ci    void CreateWindow();
297f857971dSopenharmony_ci    int32_t DrawShadow(std::shared_ptr<Rosen::RSCanvasNode> shadowNode);
298f857971dSopenharmony_ci    int32_t DrawMouseIcon();
299f857971dSopenharmony_ci    int32_t DrawStyle(std::shared_ptr<Rosen::RSCanvasNode> dragStyleNode,
300f857971dSopenharmony_ci        std::shared_ptr<Media::PixelMap> stylePixelMap);
301f857971dSopenharmony_ci    int32_t RunAnimation(std::function<int32_t()> cb);
302f857971dSopenharmony_ci    int32_t InitVSync(float endAlpha, float endScale);
303f857971dSopenharmony_ci    void OnVsync();
304f857971dSopenharmony_ci    void InitDrawingInfo(const DragData &dragData);
305f857971dSopenharmony_ci    int32_t InitDragAnimationData(DragAnimationData &dragAnimationData);
306f857971dSopenharmony_ci    void RemoveModifier();
307f857971dSopenharmony_ci    int32_t UpdateSvgNodeInfo(xmlNodePtr curNode, int32_t extendSvgWidth);
308f857971dSopenharmony_ci    xmlNodePtr GetRectNode(xmlNodePtr curNode);
309f857971dSopenharmony_ci    xmlNodePtr UpdateRectNode(int32_t extendSvgWidth, xmlNodePtr curNode);
310f857971dSopenharmony_ci    void UpdateTspanNode(xmlNodePtr curNode);
311f857971dSopenharmony_ci    int32_t ParseAndAdjustSvgInfo(xmlNodePtr curNode);
312f857971dSopenharmony_ci    std::shared_ptr<Media::PixelMap> DecodeSvgToPixelMap(const std::string &filePath);
313f857971dSopenharmony_ci    int32_t GetFilePath(std::string &filePath);
314f857971dSopenharmony_ci    bool NeedAdjustSvgInfo();
315f857971dSopenharmony_ci    void SetDecodeOptions(Media::DecodeOptions &decodeOpts);
316f857971dSopenharmony_ci    bool ParserFilterInfo(const std::string &filterInfoStr, FilterInfo &filterInfo);
317f857971dSopenharmony_ci    void ParserCornerRadiusInfo(const cJSON *cornerRadiusInfoStr, FilterInfo &filterInfo);
318f857971dSopenharmony_ci    void ParserBlurInfo(const cJSON *BlurInfoInfoStr, FilterInfo &filterInfo);
319f857971dSopenharmony_ci    void SetCustomDragBlur(const FilterInfo &filterInfo, std::shared_ptr<Rosen::RSCanvasNode> filterNode);
320f857971dSopenharmony_ci    void SetComponentDragBlur(const FilterInfo &filterInfo, const ExtraInfo &extraInfo,
321f857971dSopenharmony_ci        std::shared_ptr<Rosen::RSCanvasNode> filterNode);
322f857971dSopenharmony_ci    void ParserDragShadowInfo(cJSON* filterInfoParser, FilterInfo &filterInfo);
323f857971dSopenharmony_ci    void ParserTextDragShadowInfo(cJSON* filterInfoParser, FilterInfo &filterInfo);
324f857971dSopenharmony_ci    void PrintDragShadowInfo();
325f857971dSopenharmony_ci    void ProcessFilter();
326f857971dSopenharmony_ci    bool ParserExtraInfo(const std::string &extraInfoStr, ExtraInfo &extraInfo);
327f857971dSopenharmony_ci    static float RadiusVp2Sigma(float radiusVp, float dipScale);
328f857971dSopenharmony_ci    void DoDrawMouse(int32_t mousePositionX, int32_t mousePositionY);
329f857971dSopenharmony_ci    void UpdateMousePosition(float mousePositionX, float mousePositionY);
330f857971dSopenharmony_ci    int32_t UpdateDefaultDragStyle(DragCursorStyle style);
331f857971dSopenharmony_ci    int32_t UpdateValidDragStyle(DragCursorStyle style);
332f857971dSopenharmony_ci    int32_t SetNodesLocation(int32_t positionX, int32_t positionY);
333f857971dSopenharmony_ci    int32_t CreateEventRunner(int32_t positionX, int32_t positionY);
334f857971dSopenharmony_ci    int32_t ModifyPreviewStyle(std::shared_ptr<Rosen::RSCanvasNode> node, const PreviewStyle &previewStyle);
335f857971dSopenharmony_ci    int32_t ModifyMultiPreviewStyle(const std::vector<PreviewStyle> &previewStyles);
336f857971dSopenharmony_ci    void MultiSelectedAnimation(int32_t positionX, int32_t positionY, int32_t adjustSize,
337f857971dSopenharmony_ci        bool isMultiSelectedAnimation);
338f857971dSopenharmony_ci    void DoMultiSelectedAnimation(float positionX, float positionY, float adjustSize,
339f857971dSopenharmony_ci        bool isMultiSelectedAnimation = true);
340f857971dSopenharmony_ci    void InitMultiSelectedNodes();
341f857971dSopenharmony_ci    void ClearMultiSelectedData();
342f857971dSopenharmony_ci    bool ParserRadius(float &radius);
343f857971dSopenharmony_ci    void OnStopAnimationSuccess();
344f857971dSopenharmony_ci    void OnStopAnimationFail();
345f857971dSopenharmony_ci    void OnDragStyleAnimation();
346f857971dSopenharmony_ci    void ChangeStyleAnimation();
347f857971dSopenharmony_ci    void CheckStyleNodeModifier(std::shared_ptr<Rosen::RSCanvasNode> styleNode);
348f857971dSopenharmony_ci    void RemoveStyleNodeModifier(std::shared_ptr<Rosen::RSCanvasNode> styleNode);
349f857971dSopenharmony_ci    void StartStyleAnimation(float startScale, float endScale, int32_t duration);
350f857971dSopenharmony_ci    void UpdateAnimationProtocol(Rosen::RSAnimationTimingProtocol protocol);
351f857971dSopenharmony_ci    void RotateDisplayXY(int32_t &displayX, int32_t &displayY);
352f857971dSopenharmony_ci    void RotatePixelMapXY();
353f857971dSopenharmony_ci    void ResetAnimationParameter();
354f857971dSopenharmony_ci    void ResetAnimationFlag(bool isForce = false);
355f857971dSopenharmony_ci    void DoEndAnimation();
356f857971dSopenharmony_ci    void ResetParameter();
357f857971dSopenharmony_ci    int32_t DoRotateDragWindow(float rotation,
358f857971dSopenharmony_ci        const std::shared_ptr<Rosen::RSTransaction>& rsTransaction, bool isAnimated);
359f857971dSopenharmony_ci    int32_t DoRotateDragWindowAnimation(float rotation, float pivotX, float pivotY,
360f857971dSopenharmony_ci        const std::shared_ptr<Rosen::RSTransaction>& rsTransaction);
361f857971dSopenharmony_ci    int32_t RotateDragWindow(Rosen::Rotation rotation,
362f857971dSopenharmony_ci        const std::shared_ptr<Rosen::RSTransaction>& rsTransaction = nullptr, bool isAnimated = false);
363f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
364f857971dSopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> GetSuperHubHandler();
365f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
366f857971dSopenharmony_ci    void RotateCanvasNode(float pivotX, float pivotY, float rotation);
367f857971dSopenharmony_ci#ifndef OHOS_BUILD_ENABLE_ARKUI_X
368f857971dSopenharmony_ci    void ResetSuperHubHandler();
369f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
370f857971dSopenharmony_ci    void FlushDragPosition(uint64_t nanoTimestamp);
371f857971dSopenharmony_ci    void RotatePosition(float &displayX, float &displayY);
372f857971dSopenharmony_ci    void UpdateDragPosition(int32_t displayId, float displayX, float displayY);
373f857971dSopenharmony_ci    float AdjustDoubleValue(double doubleValue);
374f857971dSopenharmony_ci    int32_t UpdatePixelMapsAngleAndAlpha();
375f857971dSopenharmony_ci    int32_t UpdatePixeMapDrawingOrder();
376f857971dSopenharmony_ci    void LoadDragDropLib();
377f857971dSopenharmony_ci    template <typename T>
378f857971dSopenharmony_ci    void AdjustRotateDisplayXY(T &displayX, T &displayY);
379f857971dSopenharmony_ci    void DrawRotateDisplayXY(float positionX, float positionY);
380f857971dSopenharmony_ci    void ScreenRotateAdjustDisplayXY(
381f857971dSopenharmony_ci        Rosen::Rotation rotation, Rosen::Rotation lastRotation, float &displayX, float &displayY);
382f857971dSopenharmony_ci
383f857971dSopenharmony_ciprivate:
384f857971dSopenharmony_ci    int64_t interruptNum_ { -1 };
385f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSCanvasNode> canvasNode_ { nullptr };
386f857971dSopenharmony_ci    std::shared_ptr<DrawSVGModifier> drawSVGModifier_ { nullptr };
387f857971dSopenharmony_ci    std::shared_ptr<DrawPixelMapModifier> drawPixelMapModifier_ { nullptr };
388f857971dSopenharmony_ci    std::shared_ptr<DrawMouseIconModifier> drawMouseIconModifier_ { nullptr };
389f857971dSopenharmony_ci    std::shared_ptr<DrawDynamicEffectModifier> drawDynamicEffectModifier_ { nullptr };
390f857971dSopenharmony_ci    std::shared_ptr<DrawDragStopModifier> drawDragStopModifier_ { nullptr };
391f857971dSopenharmony_ci    std::shared_ptr<DrawStyleChangeModifier> drawStyleChangeModifier_ { nullptr };
392f857971dSopenharmony_ci    std::shared_ptr<DrawStyleScaleModifier> drawStyleScaleModifier_ { nullptr };
393f857971dSopenharmony_ci    std::shared_ptr<Rosen::RSUIDirector> rsUiDirector_ { nullptr };
394f857971dSopenharmony_ci    std::shared_ptr<Rosen::VSyncReceiver> receiver_ { nullptr };
395f857971dSopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> handler_ { nullptr };
396f857971dSopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> superHubHandler_ { nullptr };
397f857971dSopenharmony_ci    std::atomic_bool hasRunningStopAnimation_ { false };
398f857971dSopenharmony_ci    std::atomic_bool hasRunningScaleAnimation_ { false };
399f857971dSopenharmony_ci    std::atomic_bool needBreakStyleScaleAnimation_ { false };
400f857971dSopenharmony_ci    std::atomic_bool hasRunningAnimation_ { false };
401f857971dSopenharmony_ci    void* dragExtHandler_ { nullptr };
402f857971dSopenharmony_ci    bool needRotatePixelMapXY_ { false };
403f857971dSopenharmony_ci    uint64_t screenId_ { 0 };
404f857971dSopenharmony_ci    Rosen::Rotation rotation_ { Rosen::Rotation::ROTATION_0 };
405f857971dSopenharmony_ci    ScreenSizeType currentScreenSize_ = ScreenSizeType::UNDEFINED;
406f857971dSopenharmony_ci    MMI::PointerStyle pointerStyle_;
407f857971dSopenharmony_ci    DragVSyncStation vSyncStation_;
408f857971dSopenharmony_ci    DragSmoothProcessor dragSmoothProcessor_;
409f857971dSopenharmony_ci    std::shared_ptr<DragFrameCallback> frameCallback_ { nullptr };
410f857971dSopenharmony_ci    std::atomic_bool isRunningRotateAnimation_ { false };
411f857971dSopenharmony_ci    DragWindowRotationInfo DragWindowRotateInfo_;
412f857971dSopenharmony_ci    int32_t timerId_ { -1 };
413f857971dSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ARKUI_X
414f857971dSopenharmony_ci    std::shared_ptr<OHOS::Rosen::Window> window_ { nullptr };
415f857971dSopenharmony_ci    std::function<void()> callback_ { nullptr };
416f857971dSopenharmony_ci    std::string svgFilePath_;
417f857971dSopenharmony_ci    int64_t actionTime_ { 0 };
418f857971dSopenharmony_ci#else
419f857971dSopenharmony_ci    IContext* context_ { nullptr} ;
420f857971dSopenharmony_ci#endif // OHOS_BUILD_ENABLE_ARKUI_X
421f857971dSopenharmony_ci};
422f857971dSopenharmony_ci} // namespace DeviceStatus
423f857971dSopenharmony_ci} // namespace Msdp
424f857971dSopenharmony_ci} // namespace OHOS
425f857971dSopenharmony_ci#endif // DRAG_DRAWING_H