• 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/core/components_ng/pattern/canvas_renderer/canvas_renderer_model.h"
31 
32 namespace OHOS::Ace::Framework {
33 
34 class JSCanvasRenderer : public Referenced {
35 public:
36     JSCanvasRenderer();
37     ~JSCanvasRenderer() override = default;
38 
39     enum class FunctionCode {
40         FILL_RECT = 0,
41         STROKE_RECT,
42         CLEAR_RECT,
43         FILL_TEXT,
44         STROKE_TEXT,
45         FILL_STYLE_SETTER,
46         STROKE_STYLE_SETTER,
47     };
48 
49     static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info);
50     void SetAntiAlias();
51 
52     void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint8_t>& array);
53     void ParseImageDataAsStr(const JSCallbackInfo& info, ImageData& imageData);
54     void JsCloseImageBitmap(const std::string& src);
55 
56     void JsFillRect(const JSCallbackInfo& info);
57     void JsStrokeRect(const JSCallbackInfo& info);
58     void JsClearRect(const JSCallbackInfo& info);
59     void JsFillText(const JSCallbackInfo& info);
60     void JsStrokeText(const JSCallbackInfo& info);
61     void JsMeasureText(const JSCallbackInfo& info);
62     void JsMoveTo(const JSCallbackInfo& info);
63     void JsLineTo(const JSCallbackInfo& info);
64     void JsBezierCurveTo(const JSCallbackInfo& info);
65     void JsQuadraticCurveTo(const JSCallbackInfo& info);
66     void JsArcTo(const JSCallbackInfo& info);
67     void JsArc(const JSCallbackInfo& info);
68     void JsEllipse(const JSCallbackInfo& info);
69     void JsFill(const JSCallbackInfo& info);
70     void JsStroke(const JSCallbackInfo& info);
71     void JsClip(const JSCallbackInfo& info);
72     void JsRect(const JSCallbackInfo& info);
73     void JsBeginPath(const JSCallbackInfo& info);
74     void JsClosePath(const JSCallbackInfo& info);
75     void JsRestore(const JSCallbackInfo& info);
76     void JsSave(const JSCallbackInfo& info);
77     void JsRotate(const JSCallbackInfo& info);
78     void JsScale(const JSCallbackInfo& info);
79     void JsGetTransform(const JSCallbackInfo& info);
80     void JsSetTransform(const JSCallbackInfo& info);
81     void JsResetTransform(const JSCallbackInfo& info);
82     void JsTransform(const JSCallbackInfo& info);
83     void JsTranslate(const JSCallbackInfo& info);
84     void JsSetLineDash(const JSCallbackInfo& info);
85     void JsToDataUrl(const JSCallbackInfo& info);
86     void JsCreateLinearGradient(const JSCallbackInfo& info);
87     void JsCreateRadialGradient(const JSCallbackInfo& info);
88     void JsCreateConicGradient(const JSCallbackInfo& info);
89     void JsSaveLayer(const JSCallbackInfo& info);
90     void JsRestoreLayer(const JSCallbackInfo& info);
91 
92     void JsGetFillStyle(const JSCallbackInfo& info);
93     void JsGetStrokeStyle(const JSCallbackInfo& info);
94     void JsGetLineCap(const JSCallbackInfo& info);
95     void JsGetLineDash(const JSCallbackInfo& info);
96     void JsGetLineJoin(const JSCallbackInfo& info);
97     void JsGetMiterLimit(const JSCallbackInfo& info);
98     void JsGetLineWidth(const JSCallbackInfo& info);
99     void JsGetTextAlign(const JSCallbackInfo& info);
100     void JsGetTextBaseline(const JSCallbackInfo& info);
101     void JsGetGlobalAlpha(const JSCallbackInfo& info);
102     void JsGetGlobalCompositeOperation(const JSCallbackInfo& info);
103     void JsGetLineDashOffset(const JSCallbackInfo& info);
104     void JsGetShadowBlur(const JSCallbackInfo& info);
105     void JsGetShadowColor(const JSCallbackInfo& info);
106     void JsGetShadowOffsetX(const JSCallbackInfo& info);
107     void JsGetShadowOffsetY(const JSCallbackInfo& info);
108     void JsGetImageSmoothingEnabled(const JSCallbackInfo& info);
109     void JsGetImageSmoothingQuality(const JSCallbackInfo& info);
110     void JsGetFont(const JSCallbackInfo& info);
111     void JsSetFont(const JSCallbackInfo& info);
112     void JsSetFillStyle(const JSCallbackInfo& info);
113     void JsSetStrokeStyle(const JSCallbackInfo& info);
114     void JsSetLineCap(const JSCallbackInfo& info);
115     void JsSetLineJoin(const JSCallbackInfo& info);
116     void JsSetMiterLimit(const JSCallbackInfo& info);
117     void JsSetLineWidth(const JSCallbackInfo& info);
118     void JsSetGlobalAlpha(const JSCallbackInfo& info);
119     void JsSetGlobalCompositeOperation(const JSCallbackInfo& info);
120     void JsSetLineDashOffset(const JSCallbackInfo& info);
121     void JsSetShadowBlur(const JSCallbackInfo& info);
122     void JsSetShadowColor(const JSCallbackInfo& info);
123     void JsSetShadowOffsetX(const JSCallbackInfo& info);
124     void JsSetShadowOffsetY(const JSCallbackInfo& info);
125     void JsSetImageSmoothingEnabled(const JSCallbackInfo& info);
126     void JsDrawImage(const JSCallbackInfo& info);
127     void JsCreatePattern(const JSCallbackInfo& info);
128     void JsCreateImageData(const JSCallbackInfo& info);
129     void JsPutImageData(const JSCallbackInfo& info);
130     void JsGetImageData(const JSCallbackInfo& info);
131     void JsGetJsonData(const JSCallbackInfo& info);
132     void JsSetTextAlign(const JSCallbackInfo& info);
133     void JsSetTextBaseline(const JSCallbackInfo& info);
134     void JsSetImageSmoothingQuality(const JSCallbackInfo& info);
135     void JsGetPixelMap(const JSCallbackInfo& info);
136     void JsSetPixelMap(const JSCallbackInfo& info);
137     void JsDrawBitmapMesh(const JSCallbackInfo& info);
138     void JsGetFilter(const JSCallbackInfo& info);
139     void JsSetFilter(const JSCallbackInfo& info);
140     void JsGetDirection(const JSCallbackInfo& info);
141     void JsSetDirection(const JSCallbackInfo& info);
142 
SetCanvasPattern(const RefPtr<AceType> & canvas)143     void SetCanvasPattern(const RefPtr<AceType>& canvas)
144     {
145         canvasPattern_ = canvas;
146         isOffscreen_ = false;
147         if (isInitializeShadow_) {
148             return;
149         }
150         BaseInfo baseInfo;
151         baseInfo.canvasPattern = canvasPattern_;
152         baseInfo.offscreenPattern = offscreenPattern_;
153         baseInfo.isOffscreen = isOffscreen_;
154         CanvasRendererModel::GetInstance()->SetShadowColor(baseInfo, Color::TRANSPARENT);
155         isInitializeShadow_ = true;
156     }
157 
SetOffscreenPattern(const RefPtr<AceType> & offscreenCanvas)158     void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas)
159     {
160         offscreenPattern_ = offscreenCanvas;
161         isOffscreen_ = true;
162         if (isOffscreenInitializeShadow_) {
163             return;
164         }
165         BaseInfo baseInfo;
166         baseInfo.canvasPattern = canvasPattern_;
167         baseInfo.offscreenPattern = offscreenPattern_;
168         baseInfo.isOffscreen = isOffscreen_;
169         CanvasRendererModel::GetInstance()->SetShadowColor(baseInfo, Color::TRANSPARENT);
170         isOffscreenInitializeShadow_ = true;
171     }
172 
GetLineDash()173     std::vector<uint32_t> GetLineDash() const
174     {
175         return lineDash_;
176     }
177 
SetLineDash(const std::vector<uint32_t> lineDash)178     void SetLineDash(const std::vector<uint32_t> lineDash)
179     {
180         lineDash_ = lineDash;
181     }
182 
SetAnti(bool anti)183     void SetAnti(bool anti)
184     {
185         anti_ = anti;
186     }
187 
GetAnti()188     bool GetAnti()
189     {
190         return anti_;
191     }
192 
SetInstanceId(int32_t id)193     void SetInstanceId(int32_t id)
194     {
195         instanceId_ = id;
196     }
197 
198     void SetTransform(unsigned int id, const TransformParam&);
199 
200     ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer);
201 
202 protected:
203     void ParseFillGradient(const JSCallbackInfo& info);
204     void ParseFillPattern(const JSCallbackInfo& info);
205     void ParseStorkeGradient(const JSCallbackInfo& info);
206     void ParseStrokePattern(const JSCallbackInfo& info);
207     JSRenderImage* UnwrapNapiImage(const JSRef<JSObject> jsObject);
208 
209 protected:
210     bool anti_ = false;
211 
212     RefPtr<AceType> canvasPattern_;
213     RefPtr<AceType> offscreenPattern_;
214 
215 private:
216     void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage);
217     int32_t instanceId_ = INSTANCE_ID_UNDEFINED;
218     PaintState paintState_;
219     TextStyle style_;
220     static std::unordered_map<int32_t, std::shared_ptr<Pattern>> pattern_;
221     static unsigned int patternCount_;
222     std::weak_ptr<Ace::Pattern> GetPatternNG(int32_t id);
223     Pattern GetPattern(unsigned int id);
224     std::vector<uint32_t> lineDash_;
225     ImageData imageData_;
226     bool isOffscreen_ = false;
227     std::shared_ptr<Pattern> GetPatternPtr(int32_t id);
228     bool isInitializeShadow_ = false;
229     bool isOffscreenInitializeShadow_ = false;
230     Dimension GetDimensionValue(const std::string& str);
231 };
232 
233 } // namespace OHOS::Ace::Framework
234 
235 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H
236