• 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_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H
17 #define FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H
18 
19 #include "base/memory/referenced.h"
20 #include "frameworks/bridge/common/utils/utils.h"
21 #include "frameworks/bridge/declarative_frontend/engine/bindings_defines.h"
22 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_gradient.h"
23 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_image_data.h"
24 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_path.h"
25 #include "frameworks/bridge/declarative_frontend/jsview/js_container_base.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_matrix2d.h"
27 #include "frameworks/bridge/declarative_frontend/jsview/js_path2d.h"
28 #include "frameworks/bridge/declarative_frontend/jsview/js_render_image.h"
29 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
30 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h"
31 #include "frameworks/core/components/custom_paint/offscreen_canvas.h"
32 #include "frameworks/core/components_ng/pattern/custom_paint/custom_paint_pattern.h"
33 #include "frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_pattern.h"
34 
35 namespace OHOS::Ace::Framework {
36 
37 class JSCanvasRenderer : public Referenced {
38 public:
39     JSCanvasRenderer();
40     ~JSCanvasRenderer() override = default;
41 
42     enum class FunctionCode {
43         FILL_RECT = 0,
44         STROKE_RECT,
45         CLEAR_RECT,
46         FILL_TEXT,
47         STROKE_TEXT,
48         FILL_STYLE_SETTER,
49         STROKE_STYLE_SETTER,
50     };
51 
52     static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info);
53     void SetAntiAlias();
54 
55     void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint32_t>& array);
56 
57     void JsFillRect(const JSCallbackInfo& info);
58     void JsStrokeRect(const JSCallbackInfo& info);
59     void JsClearRect(const JSCallbackInfo& info);
60     void JsFillText(const JSCallbackInfo& info);
61     void JsStrokeText(const JSCallbackInfo& info);
62     void JsMeasureText(const JSCallbackInfo& info);
63     void JsMoveTo(const JSCallbackInfo& info);
64     void JsLineTo(const JSCallbackInfo& info);
65     void JsBezierCurveTo(const JSCallbackInfo& info);
66     void JsQuadraticCurveTo(const JSCallbackInfo& info);
67     void JsArcTo(const JSCallbackInfo& info);
68     void JsArc(const JSCallbackInfo& info);
69     void JsEllipse(const JSCallbackInfo& info);
70     void JsFill(const JSCallbackInfo& info);
71     void JsStroke(const JSCallbackInfo& info);
72     void JsClip(const JSCallbackInfo& info);
73     void JsRect(const JSCallbackInfo& info);
74     void JsBeginPath(const JSCallbackInfo& info);
75     void JsClosePath(const JSCallbackInfo& info);
76     void JsRestore(const JSCallbackInfo& info);
77     void JsSave(const JSCallbackInfo& info);
78     void JsRotate(const JSCallbackInfo& info);
79     void JsScale(const JSCallbackInfo& info);
80     void JsGetTransform(const JSCallbackInfo& info);
81     void JsSetTransform(const JSCallbackInfo& info);
82     void JsResetTransform(const JSCallbackInfo& info);
83     void JsTransform(const JSCallbackInfo& info);
84     void JsTranslate(const JSCallbackInfo& info);
85     void JsSetLineDash(const JSCallbackInfo& info);
86     void JsToDataUrl(const JSCallbackInfo& info);
87     void JsCreateLinearGradient(const JSCallbackInfo& info);
88     void JsCreateRadialGradient(const JSCallbackInfo& info);
89 
90     void JsGetFillStyle(const JSCallbackInfo& info);
91     void JsGetStrokeStyle(const JSCallbackInfo& info);
92     void JsGetLineCap(const JSCallbackInfo& info);
93     void JsGetLineDash(const JSCallbackInfo& info);
94     void JsGetLineJoin(const JSCallbackInfo& info);
95     void JsGetMiterLimit(const JSCallbackInfo& info);
96     void JsGetLineWidth(const JSCallbackInfo& info);
97     void JsGetTextAlign(const JSCallbackInfo& info);
98     void JsGetTextBaseline(const JSCallbackInfo& info);
99     void JsGetGlobalAlpha(const JSCallbackInfo& info);
100     void JsGetGlobalCompositeOperation(const JSCallbackInfo& info);
101     void JsGetLineDashOffset(const JSCallbackInfo& info);
102     void JsGetShadowBlur(const JSCallbackInfo& info);
103     void JsGetShadowColor(const JSCallbackInfo& info);
104     void JsGetShadowOffsetX(const JSCallbackInfo& info);
105     void JsGetShadowOffsetY(const JSCallbackInfo& info);
106     void JsGetImageSmoothingEnabled(const JSCallbackInfo& info);
107     void JsGetImageSmoothingQuality(const JSCallbackInfo& info);
108     void JsGetFont(const JSCallbackInfo& info);
109     void JsSetFont(const JSCallbackInfo& info);
110     void JsSetFillStyle(const JSCallbackInfo& info);
111     void JsSetStrokeStyle(const JSCallbackInfo& info);
112     void JsSetLineCap(const JSCallbackInfo& info);
113     void JsSetLineJoin(const JSCallbackInfo& info);
114     void JsSetMiterLimit(const JSCallbackInfo& info);
115     void JsSetLineWidth(const JSCallbackInfo& info);
116     void JsSetGlobalAlpha(const JSCallbackInfo& info);
117     void JsSetGlobalCompositeOperation(const JSCallbackInfo& info);
118     void JsSetLineDashOffset(const JSCallbackInfo& info);
119     void JsSetShadowBlur(const JSCallbackInfo& info);
120     void JsSetShadowColor(const JSCallbackInfo& info);
121     void JsSetShadowOffsetX(const JSCallbackInfo& info);
122     void JsSetShadowOffsetY(const JSCallbackInfo& info);
123     void JsSetImageSmoothingEnabled(const JSCallbackInfo& info);
124     void JsDrawImage(const JSCallbackInfo& info);
125     void JsCreatePattern(const JSCallbackInfo& info);
126     void JsCreateImageData(const JSCallbackInfo& info);
127     void JsPutImageData(const JSCallbackInfo& info);
128     void JsGetImageData(const JSCallbackInfo& info);
129     void JsGetJsonData(const JSCallbackInfo& info);
130     void JsSetTextAlign(const JSCallbackInfo& info);
131     void JsSetTextBaseline(const JSCallbackInfo& info);
132     void JsSetImageSmoothingQuality(const JSCallbackInfo& info);
133     void JsGetPixelMap(const JSCallbackInfo& info);
134     void JsSetPixelMap(const JSCallbackInfo& info);
135     void JsDrawBitmapMesh(const JSCallbackInfo& info);
136     void JsFilter(const JSCallbackInfo& info);
137     void JsDirection(const JSCallbackInfo& info);
138 
SetComponent(const RefPtr<CanvasTaskPool> & controller)139     void SetComponent(const RefPtr<CanvasTaskPool>& controller)
140     {
141         pool_ = controller;
142         isOffscreen_ = false;
143     }
144 
SetOffscreenCanvas(const RefPtr<OffscreenCanvas> & offscreenCanvas)145     void SetOffscreenCanvas(const RefPtr<OffscreenCanvas>& offscreenCanvas)
146     {
147         offscreenCanvas_ = offscreenCanvas;
148         isOffscreen_ = true;
149     }
150 
SetCustomPaintPattern(const RefPtr<NG::CustomPaintPattern> & pattern)151     void SetCustomPaintPattern(const RefPtr<NG::CustomPaintPattern>& pattern)
152     {
153         customPaintPattern_ = pattern;
154         isOffscreen_ = false;
155     }
156 
SetOffscreenCanvasPattern(const RefPtr<NG::OffscreenCanvasPattern> & pattern)157     void SetOffscreenCanvasPattern(const RefPtr<NG::OffscreenCanvasPattern>& pattern)
158     {
159         offscreenCanvasPattern_ = pattern;
160         isOffscreen_ = true;
161     }
162 
GetLineDash()163     std::vector<uint32_t> GetLineDash() const
164     {
165         return lineDash_;
166     }
167 
SetLineDash(const std::vector<uint32_t> lineDash)168     void SetLineDash(const std::vector<uint32_t> lineDash)
169     {
170         lineDash_ = lineDash;
171     }
172 
SetAnti(bool anti)173     void SetAnti(bool anti)
174     {
175         anti_ = anti;
176     }
177 
GetAnti()178     bool GetAnti()
179     {
180         return anti_;
181     }
182 
183     ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer);
184 
185 protected:
186     RefPtr<CanvasTaskPool> pool_;
187     RefPtr<OffscreenCanvas> offscreenCanvas_;
188     bool anti_ = false;
189     RefPtr<NG::CustomPaintPattern> customPaintPattern_;
190     RefPtr<NG::OffscreenCanvasPattern> offscreenCanvasPattern_;
191 
192 private:
193     void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage);
194     std::unique_ptr<ImageData> GetImageDataFromCanvas(
195         const double& left, const double& top, const double& width, const double& height);
196     PaintState paintState_;
197     TextStyle style_;
198     static std::unordered_map<int32_t, Pattern> pattern_;
199     static int32_t patternCount_;
200     Pattern GetPattern(int32_t id);
201     std::vector<uint32_t> lineDash_;
202     ImageData imageData_;
203     bool isOffscreen_ = false;
204 };
205 
206 } // namespace OHOS::Ace::Framework
207 
208 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H
209