• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_OFFSCREEN_CANVAS_BRIDGE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_OFFSCREEN_CANVAS_BRIDGE_H
18 
19 #include <cstdlib>
20 #include <map>
21 #include <string>
22 
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 "core/components/custom_paint/offscreen_canvas.h"
27 
28 namespace OHOS::Ace::Framework {
29 int32_t GetCurrentBridgeId(JSContext* ctx, JSValueConst value);
30 
31 class OffscreenCanvasBridge : public BaseCanvasBridge {
32     DECLARE_ACE_TYPE(OffscreenCanvasBridge, BaseCanvasBridge)
33 
34 public:
35     OffscreenCanvasBridge() = default;
36     OffscreenCanvasBridge(JSContext* ctx, const int32_t width, const int32_t height);
37     ~OffscreenCanvasBridge() override = default;
38 
39     int32_t bridgeId_;
40     RefPtr<OffscreenCanvas> offscreenCanvas_;
41 
42     JSValue GetBridge(JSContext* ctx);
43 
44     // method of OffscreenCanvas
45     static JSValue JsGetContext(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
46     static JSValue JsTransferToImageBitmap(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
47     static JSValue JsToDataURL(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
48 
49     // method of OffscreenCanvasContext
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 JsCreatePattern(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
53     static JSValue JsAddColorStop(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
54     static JSValue JsFillRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
55     static JSValue JsClearRect(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 JsFillText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
58     static JSValue JsStrokeText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
59     static JSValue JsMeasureText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
60     static JSValue JsRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
61     static JSValue JsFill(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
62     static JSValue JsClip(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
63     static JSValue JsCreateImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
64     static JSValue JsPutImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
65     static JSValue JsGetImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
66     static JSValue JsDrawImage(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
67     static JSValue JsSave(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
68     static JSValue JsRestore(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
69     static JSValue JsCreatePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
70     static JSValue JsIsPointInStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
71     static JSValue JsIsPointInPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
72     static JSValue JsResetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
73 
74     // priority of OffscreenCanvasContext
75     static JSValue JsFillStyleGetter(JSContext* ctx, JSValueConst value);
76     static JSValue JsFillStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
77     static JSValue JsStrokeStyleGetter(JSContext* ctx, JSValueConst value);
78     static JSValue JsStrokeStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
79     static JSValue JsLineCapGetter(JSContext* ctx, JSValueConst value);
80     static JSValue JsLineCapSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
81     static JSValue JsLineJoinGetter(JSContext* ctx, JSValueConst value);
82     static JSValue JsLineJoinSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
83     static JSValue JsMiterLimitGetter(JSContext* ctx, JSValueConst value);
84     static JSValue JsMiterLimitSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
85     static JSValue JsLineWidthGetter(JSContext* ctx, JSValueConst value);
86     static JSValue JsLineWidthSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
87     static JSValue JsTextAlignGetter(JSContext* ctx, JSValueConst value);
88     static JSValue JsTextAlignSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
89     static JSValue JsTextBaselineGetter(JSContext* ctx, JSValueConst value);
90     static JSValue JsTextBaselineSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
91     static JSValue JsFontGetter(JSContext* ctx, JSValueConst value);
92     static JSValue JsFontSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
93     static JSValue JsAlphaGetter(JSContext* ctx, JSValueConst value);
94     static JSValue JsAlphaSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
95     static JSValue JsCompositeOperationGetter(JSContext* ctx, JSValueConst value);
96     static JSValue JsCompositeOperationSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
97     static JSValue JsLineDashOffsetGetter(JSContext* ctx, JSValueConst value);
98     static JSValue JsLineDashOffsetSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
99     static JSValue JsShadowBlurGetter(JSContext* ctx, JSValueConst value);
100     static JSValue JsShadowBlurSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
101     static JSValue JsShadowColorGetter(JSContext* ctx, JSValueConst value);
102     static JSValue JsShadowColorSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
103     static JSValue JsShadowOffsetXGetter(JSContext* ctx, JSValueConst value);
104     static JSValue JsShadowOffsetXSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
105     static JSValue JsShadowOffsetYGetter(JSContext* ctx, JSValueConst value);
106     static JSValue JsShadowOffsetYSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
107     static JSValue JsSmoothingEnabledGetter(JSContext* ctx, JSValueConst value);
108     static JSValue JsSmoothingEnabledSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
109     static JSValue JsSmoothingQualityGetter(JSContext* ctx, JSValueConst value);
110     static JSValue JsSmoothingQualitySetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
111     static JSValue JsFilterParamGetter(JSContext* ctx, JSValueConst value);
112     static JSValue JsFilterParamSetter(JSContext* ctx, JSValueConst value, JSValueConst proto);
113     static JSValue JsBeginPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
114     static JSValue JsArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
115     static JSValue JsStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
116     static RefPtr<CanvasPath2D> GetPath2D(JSContext* ctx, JSValueConst value);
117     static std::unordered_map<int32_t, RefPtr<CanvasPath2D>> path2Ds_;
118     static JSValue JsArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
119     static JSValue JsMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
120     static JSValue JsClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
121     static JSValue JsRotate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
122     static JSValue JsScale(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
123     static JSValue JsLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
124     static JSValue JsBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
125     static JSValue JsQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
126     static JSValue JsEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
127     static JSValue JsSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
128     static JSValue JsTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
129     static JSValue JsTranslate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
130     static JSValue JsGetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
131     static JSValue JsSetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
132 
133     static JSValue JsPath2DAddPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
134     static JSValue JsPath2DSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
135     static JSValue JsPath2DMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
136     static JSValue JsPath2DLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
137     static JSValue JsPath2DArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
138     static JSValue JsPath2DArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
139     static JSValue JsPath2DQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
140     static JSValue JsPath2DBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
141     static JSValue JsPath2DEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
142     static JSValue JsPath2DRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
143     static JSValue JsPath2DClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
144     static RefPtr<CanvasPath2D> JsMakePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv);
145 private:
146     enum class FunctionCode {
147         FILL_RECT = 0,
148         STROKE_RECT,
149         CLEAR_RECT,
150         FILL_TEXT,
151         STROKE_TEXT,
152         FILL_STYLE_SETTER,
153         STROKE_STYLE_SETTER,
154     };
155     static Gradient GetGradient(JSContext* ctx, JSValueConst value);
156     static Pattern GetPattern(JSContext* ctx, JSValueConst value);
157     static void ParseDomImage(JSContext* ctx, JSValueConst value, double& width, double& height, std::string& src);
158     static void ParseImageData(
159         JSContext* ctx, JSValueConst* argv, int32_t argc, std::vector<std::string>& array, ImageData& imageData);
160     int32_t width_ = 0;
161     int32_t height_ = 0;
162     static int32_t path2dCount_;
163     static int32_t gradientCount_;
164     static int32_t patternCount_;
165     static int32_t globalBridgeId_;
166     static std::unordered_map<int32_t, Gradient> gradientColors_;
167     static std::unordered_map<int32_t, Pattern> pattern_;
168     static JSValue JsHandleStyleSetter(
169         JSContext* ctx, JSValueConst value, JSValueConst proto, FunctionCode functionCode);
170 };
171 } // namespace OHOS::Ace::Framework
172 
173 #endif  // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_OFFSCREEN_CANVAS_BRIDGE_H