• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H
18 
19 #include <map>
20 #include <string>
21 
22 #include "core/components/custom_paint/canvas_render_context_base.h"
23 #include "frameworks/bridge/common/dom/dom_canvas.h"
24 #include "frameworks/bridge/js_frontend/engine/common/base_canvas_bridge.h"
25 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h"
26 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_engine.h"
27 
28 namespace OHOS::Ace::Framework {
29 
30 class CanvasBridge : public BaseCanvasBridge {
31     DECLARE_ACE_TYPE(CanvasBridge, BaseCanvasBridge)
32 
33 public:
34     CanvasBridge() = default;
35     virtual ~CanvasBridge();
36 
37     void HandleJsContext(JSContext* ctx, NodeId id, const std::string& args, JsEngineInstance* engine);
38     void HandleToDataURL(JSContext* ctx, NodeId id, const std::string& args);
39 
GetRenderContext()40     JSValue GetRenderContext() const
41     {
42         return renderContext_;
43     }
44 
GetDataURL()45     JSValue GetDataURL() const
46     {
47         return dataURL_;
48     }
49 
50     static JSValue JsCreateLinearGradient(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
51     static JSValue JsCreateRadialGradient(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
52     static JSValue JsAddColorStop(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
53 
54     // rect bridge
55     static JSValue JsFillRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
56     static JSValue JsStrokeRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
57     static JSValue JsClearRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
58 
59     // text bridge
60     static JSValue JsFillText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
61     static JSValue JsStrokeText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
62     static JSValue JsMeasureText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
63 
64     // path bridge
65     static JSValue JsBeginPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
66     static JSValue JsClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
67     static JSValue JsMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
68     static JSValue JsLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
69     static JSValue JsBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
70     static JSValue JsQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
71     static JSValue JsArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
72     static JSValue JsArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
73     static JSValue JsEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
74 
75     static JSValue JsRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
76     static JSValue JsFill(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
77     static JSValue JsStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
78     static JSValue JsClip(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
79 
80     static JSValue JsSave(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
81     static JSValue JsRestore(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
82 
83     static JSValue JsRotate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
84     static JSValue JsScale(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
85     static JSValue JsSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
86     static JSValue JsTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
87     static JSValue JsTranslate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
88     static JSValue JsGetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
89     static JSValue JsSetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
90     static JSValue JsDrawImage(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
91     static JSValue JsCreatePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
92     static JSValue JsCreatePattern(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
93     static JSValue JsCreateImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
94     static JSValue JsPutImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
95     static JSValue JsGetImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
96     static JSValue JsTransferFromImageBitmap(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
97     // support to read inner json data by lottie
98     static JSValue JsGetJsonData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
99 
100     // getter and setter
101     static JSValue JsFillStyleGetter(JSContext* ctx, JSValueConst value);
102     static JSValue JsFillStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
103     static JSValue JsStrokeStyleGetter(JSContext* ctx, JSValueConst value);
104     static JSValue JsStrokeStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
105     static JSValue JsLineCapGetter(JSContext* ctx, JSValueConst value);
106     static JSValue JsLineCapSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
107     static JSValue JsLineJoinGetter(JSContext* ctx, JSValueConst value);
108     static JSValue JsLineJoinSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
109     static JSValue JsMiterLimitGetter(JSContext* ctx, JSValueConst value);
110     static JSValue JsMiterLimitSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
111     static JSValue JsLineWidthGetter(JSContext* ctx, JSValueConst value);
112     static JSValue JsLineWidthSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
113     static JSValue JsTextAlignGetter(JSContext* ctx, JSValueConst value);
114     static JSValue JsTextAlignSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
115     static JSValue JsTextBaselineGetter(JSContext* ctx, JSValueConst value);
116     static JSValue JsTextBaselineSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
117     static JSValue JsFontGetter(JSContext* ctx, JSValueConst value);
118     static JSValue JsFontSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
119     static JSValue JsAlphaGetter(JSContext* ctx, JSValueConst value);
120     static JSValue JsAlphaSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
121     static JSValue JsCompositeOperationGetter(JSContext* ctx, JSValueConst value);
122     static JSValue JsCompositeOperationSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
123     static JSValue JsLineDashOffsetGetter(JSContext* ctx, JSValueConst value);
124     static JSValue JsLineDashOffsetSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
125     static JSValue JsShadowBlurGetter(JSContext* ctx, JSValueConst value);
126     static JSValue JsShadowBlurSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
127     static JSValue JsShadowColorGetter(JSContext* ctx, JSValueConst value);
128     static JSValue JsShadowColorSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
129     static JSValue JsShadowOffsetXGetter(JSContext* ctx, JSValueConst value);
130     static JSValue JsShadowOffsetXSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
131     static JSValue JsShadowOffsetYGetter(JSContext* ctx, JSValueConst value);
132     static JSValue JsShadowOffsetYSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
133     static JSValue JsSmoothingEnabledGetter(JSContext* ctx, JSValueConst value);
134     static JSValue JsSmoothingEnabledSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
135     static JSValue JsSmoothingQualityGetter(JSContext* ctx, JSValueConst value);
136     static JSValue JsSmoothingQualitySetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
137 
138     // support only read attribute for lottie
139     static JSValue JsWidthGetter(JSContext* ctx, JSValueConst value);
140     static JSValue JsHeightGetter(JSContext* ctx, JSValueConst value);
141 
142     static JSValue JsPath2DAddPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
143     static JSValue JsPath2DSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
144     static JSValue JsPath2DMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
145     static JSValue JsPath2DLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
146     static JSValue JsPath2DArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
147     static JSValue JsPath2DArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
148     static JSValue JsPath2DQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
149     static JSValue JsPath2DBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
150     static JSValue JsPath2DEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
151     static JSValue JsPath2DRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
152     static JSValue JsPath2DClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
153     static RefPtr<CanvasPath2D> JsMakePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
154 
155 private:
156     enum class FunctionCode {
157         FILL_RECT = 0,
158         STROKE_RECT,
159         CLEAR_RECT,
160         FILL_TEXT,
161         STROKE_TEXT,
162         FILL_STYLE_SETTER,
163         STROKE_STYLE_SETTER,
164     };
165     static Gradient GetGradient(JSContext* ctx, JSValueConst value);
166     static Pattern GetPattern(JSContext* ctx, JSValueConst value);
167     static RefPtr<CanvasPath2D> GetPath2D(JSContext* ctx, JSValueConst value);
168     static void ParseDomImage(JSContext* ctx, JSValueConst value, double& width, double& height, std::string& src);
169     static void ParseImageData(
170         JSContext* ctx, JSValueConst* argv, int32_t argc, std::vector<std::string>& array, ImageData& imageData);
171     static JSValue JsHandleRect(
172         JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv, FunctionCode functionCode);
173     static JSValue JsHandleText(
174         JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv, FunctionCode functionCode);
175     static JSValue JsHandleStyleSetter(
176             JSContext* ctx, JSValueConst value, JSValueConst proto, FunctionCode functionCode);
177     static void JsSetAntiAlias(JSContext* ctx, NodeId id, const std::string& args);
178     void JSHandleWebglContext(JSContext* ctx, NodeId id, const std::string& args, JsEngineInstance* engine,
179         CanvasRenderContextBase*& canvasRenderContext);
180 
181     JSValue renderContext_;
182     JSValue dataURL_;
183 
184 #if !defined(PREVIEW)
185     CanvasRenderContextBase* webglRenderContext_ = nullptr;
186     CanvasRenderContextBase* webgl2RenderContext_ = nullptr;
187 #endif
188 
189     static int32_t gradientCount_;
190     static int32_t patternCount_;
191     static int32_t path2dCount_;
192     static std::unordered_map<int32_t, Gradient> gradientColors_;
193     static std::unordered_map<int32_t, Pattern> pattern_;
194     static std::unordered_map<int32_t, RefPtr<CanvasPath2D>> path2Ds_;
195 };
196 
197 } // namespace OHOS::Ace::Framework
198 
199 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H
200