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 OHOS_ROSEN_JS_CANVAS_H
17 #define OHOS_ROSEN_JS_CANVAS_H
18 
19 #include <native_engine/native_engine.h>
20 #include <native_engine/native_value.h>
21 #ifdef ROSEN_OHOS
22 #include "pixel_map.h"
23 #endif
24 
25 namespace OHOS::Rosen {
26 namespace Drawing {
27 
28 #ifndef DRAWING_API
29 #ifdef _WIN32
30 #define DRAWING_EXPORT __attribute__((dllexport))
31 #define DRAWING_IMPORT __attribute__((dllimport))
32 #else
33 #define DRAWING_EXPORT __attribute__((visibility("default")))
34 #define DRAWING_IMPORT __attribute__((visibility("default")))
35 #endif
36 #ifdef MODULE_DRAWING
37 #define DRAWING_API DRAWING_EXPORT
38 #else
39 #define DRAWING_API DRAWING_IMPORT
40 #endif
41 #endif
42 
43 class Canvas;
44 class JsCanvas final {
45 public:
46     explicit JsCanvas(Canvas* canvas, bool owned = false) : m_canvas(canvas), owned_(owned) {};
47     ~JsCanvas();
48 
49     static napi_value Init(napi_env env, napi_value exportObj);
50     static napi_value Constructor(napi_env env, napi_callback_info info);
51     static void Destructor(napi_env env, void *nativeObject, void *finalize);
52 
53     DRAWING_API static napi_value CreateJsCanvas(napi_env env, Canvas* canvas);
54 
55     static napi_value AttachBrush(napi_env env, napi_callback_info info);
56     static napi_value AttachPen(napi_env env, napi_callback_info info);
57     static napi_value Clear(napi_env env, napi_callback_info info);
58     static napi_value ClipPath(napi_env env, napi_callback_info info);
59     static napi_value ClipRegion(napi_env env, napi_callback_info info);
60     static napi_value ClipRect(napi_env env, napi_callback_info info);
61     static napi_value ConcatMatrix(napi_env env, napi_callback_info info);
62     static napi_value DrawArc(napi_env env, napi_callback_info info);
63     static napi_value ClipRoundRect(napi_env env, napi_callback_info info);
64     static napi_value DrawCircle(napi_env env, napi_callback_info info);
65     static napi_value DrawColor(napi_env env, napi_callback_info info);
66     static napi_value DrawImage(napi_env env, napi_callback_info info);
67     static napi_value DrawImageRect(napi_env env, napi_callback_info info);
68     static napi_value DrawImageRectWithSrc(napi_env env, napi_callback_info info);
69     static napi_value DrawLine(napi_env env, napi_callback_info info);
70     static napi_value DrawRect(napi_env env, napi_callback_info info);
71     static napi_value DrawOval(napi_env env, napi_callback_info info);
72     static napi_value DrawPoint(napi_env env, napi_callback_info info);
73     static napi_value DrawPoints(napi_env env, napi_callback_info info);
74     static napi_value DrawPath(napi_env env, napi_callback_info info);
75     static napi_value DrawPixelMapMesh(napi_env env, napi_callback_info info);
76     static napi_value DrawShadow(napi_env env, napi_callback_info info);
77     static napi_value DrawRegion(napi_env env, napi_callback_info info);
78     static napi_value DrawSingleCharacter(napi_env env, napi_callback_info info);
79     static napi_value DrawText(napi_env env, napi_callback_info info);
80     static napi_value DrawBackground(napi_env env, napi_callback_info info);
81     static napi_value DrawRoundRect(napi_env env, napi_callback_info info);
82     static napi_value GetTotalMatrix(napi_env env, napi_callback_info info);
83     static napi_value DrawNestedRoundRect(napi_env env, napi_callback_info info);
84     static napi_value DetachBrush(napi_env env, napi_callback_info info);
85     static napi_value DetachPen(napi_env env, napi_callback_info info);
86     static napi_value GetSaveCount(napi_env env, napi_callback_info info);
87     static napi_value GetWidth(napi_env env, napi_callback_info info);
88     static napi_value GetHeight(napi_env env, napi_callback_info info);
89     static napi_value IsClipEmpty(napi_env env, napi_callback_info info);
90     static napi_value Rotate(napi_env env, napi_callback_info info);
91     static napi_value RestoreToCount(napi_env env, napi_callback_info info);
92     static napi_value Restore(napi_env env, napi_callback_info info);
93     static napi_value Skew(napi_env env, napi_callback_info info);
94     static napi_value Save(napi_env env, napi_callback_info info);
95     static napi_value SaveLayer(napi_env env, napi_callback_info info);
96     static napi_value Scale(napi_env env, napi_callback_info info);
97     static napi_value SetMatrix(napi_env env, napi_callback_info info);
98     static napi_value ResetMatrix(napi_env env, napi_callback_info info);
99     static napi_value Translate(napi_env env, napi_callback_info info);
100     static napi_value GetLocalClipBounds(napi_env env, napi_callback_info info);
101 
102     Canvas* GetCanvas();
103     DRAWING_API void ResetCanvas();
104     DRAWING_API void ClipCanvas(float width, float height);
105     DRAWING_API void SaveCanvas();
106     DRAWING_API void RestoreCanvas();
107 
108 private:
109     napi_value OnClear(napi_env env, napi_callback_info info);
110     napi_value OnClipPath(napi_env env, napi_callback_info info);
111     napi_value OnClipRegion(napi_env env, napi_callback_info info);
112     napi_value OnClipRect(napi_env env, napi_callback_info info);
113     napi_value OnConcatMatrix(napi_env env, napi_callback_info info);
114     napi_value OnDrawArc(napi_env env, napi_callback_info info);
115     napi_value OnClipRoundRect(napi_env env, napi_callback_info info);
116     napi_value OnDrawCircle(napi_env env, napi_callback_info info);
117     napi_value OnDrawColor(napi_env env, napi_callback_info info);
118     napi_value OnDrawImage(napi_env env, napi_callback_info info);
119     napi_value OnDrawImageRect(napi_env env, napi_callback_info info);
120     napi_value OnDrawImageRectWithSrc(napi_env env, napi_callback_info info);
121     napi_value OnDrawLine(napi_env env, napi_callback_info info);
122     napi_value OnDrawRect(napi_env env, napi_callback_info info);
123     napi_value OnDrawOval(napi_env env, napi_callback_info info);
124     napi_value OnDrawPoint(napi_env env, napi_callback_info info);
125     napi_value OnDrawPoints(napi_env env, napi_callback_info info);
126     napi_value OnDrawPath(napi_env env, napi_callback_info info);
127     napi_value OnDrawPixelMapMesh(napi_env env, napi_callback_info info);
128     napi_value OnDrawShadow(napi_env env, napi_callback_info info);
129     napi_value OnDrawRegion(napi_env env, napi_callback_info info);
130     napi_value OnDrawSingleCharacter(napi_env env, napi_callback_info info);
131     napi_value OnDrawText(napi_env env, napi_callback_info info);
132     napi_value OnGetSaveCount(napi_env env, napi_callback_info info);
133     napi_value OnGetWidth(napi_env env, napi_callback_info info);
134     napi_value OnGetHeight(napi_env env, napi_callback_info info);
135     napi_value OnIsClipEmpty(napi_env env, napi_callback_info info);
136     napi_value OnRotate(napi_env env, napi_callback_info info);
137     napi_value OnRestoreToCount(napi_env env, napi_callback_info info);
138     napi_value OnRestore(napi_env env, napi_callback_info info);
139     napi_value OnSkew(napi_env env, napi_callback_info info);
140     napi_value OnSave(napi_env env, napi_callback_info info);
141     napi_value OnSaveLayer(napi_env env, napi_callback_info info);
142     napi_value OnScale(napi_env env, napi_callback_info info);
143     napi_value OnSetMatrix(napi_env env, napi_callback_info info);
144     napi_value OnResetMatrix(napi_env env, napi_callback_info info);
145     napi_value OnTranslate(napi_env env, napi_callback_info info);
146     napi_value OnDrawBackground(napi_env env, napi_callback_info info);
147     napi_value OnDrawRoundRect(napi_env env, napi_callback_info info);
148     napi_value OnDrawNestedRoundRect(napi_env env, napi_callback_info info);
149     napi_value OnGetLocalClipBounds(napi_env env, napi_callback_info info);
150     napi_value OnGetTotalMatrix(napi_env env, napi_callback_info info);
151 
152     static bool CreateConstructor(napi_env env);
153     static thread_local napi_ref constructor_;
154     Canvas* m_canvas = nullptr;
155     bool owned_ = false;
156 #ifdef ROSEN_OHOS
157     std::shared_ptr<Media::PixelMap> mPixelMap_ = nullptr;
158 #endif
159 };
160 } // namespace Drawing
161 } // namespace OHOS::Rosen
162 #endif // OHOS_ROSEN_JS_CANVAS_H