• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 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 "bridge/common/utils/utils.h"
21 #include "bridge/declarative_frontend/engine/bindings_defines.h"
22 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_gradient.h"
23 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_image_data.h"
24 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_path.h"
25 #include "bridge/declarative_frontend/jsview/canvas/js_matrix2d.h"
26 #include "bridge/declarative_frontend/jsview/canvas/js_path2d.h"
27 #include "bridge/declarative_frontend/jsview/canvas/js_rendering_context_base.h"
28 #include "bridge/declarative_frontend/jsview/canvas/js_render_image.h"
29 #include "bridge/declarative_frontend/jsview/js_container_base.h"
30 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
31 #include "core/components_ng/pattern/canvas/rendering_context_2d_model.h"
32 
33 namespace OHOS::Ace::Framework {
34 
35 class JSCanvasRenderer : public JSRenderingContextBase {
36     DECLARE_ACE_TYPE(JSCanvasRenderer, JSRenderingContextBase);
37 public:
38     JSCanvasRenderer();
39     ~JSCanvasRenderer() override;
40 
41     enum class FunctionCode {
42         FILL_RECT = 0,
43         STROKE_RECT,
44         CLEAR_RECT,
45         FILL_TEXT,
46         STROKE_TEXT,
47         FILL_STYLE_SETTER,
48         STROKE_STYLE_SETTER,
49     };
50 
51     static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info);
52     void SetAntiAlias() override;
53     void SetDensity() override;
54 
55     void ParseImageData(const JSCallbackInfo& info, ImageData& imageData);
56     void JsCloseImageBitmap(const std::string& src);
57 
58     void JsFillRect(const JSCallbackInfo& info);
59     void JsStrokeRect(const JSCallbackInfo& info);
60     void JsClearRect(const JSCallbackInfo& info);
61     void JsFillText(const JSCallbackInfo& info);
62     void JsStrokeText(const JSCallbackInfo& info);
63     void JsMeasureText(const JSCallbackInfo& info);
64     void JsMoveTo(const JSCallbackInfo& info);
65     void JsLineTo(const JSCallbackInfo& info);
66     void JsBezierCurveTo(const JSCallbackInfo& info);
67     void JsQuadraticCurveTo(const JSCallbackInfo& info);
68     void JsArcTo(const JSCallbackInfo& info);
69     void JsArc(const JSCallbackInfo& info);
70     void JsEllipse(const JSCallbackInfo& info);
71     void JsFill(const JSCallbackInfo& info);
72     void JsStroke(const JSCallbackInfo& info);
73     void JsClip(const JSCallbackInfo& info);
74     void JsRect(const JSCallbackInfo& info);
75     void JsRoundRect(const JSCallbackInfo& info);
76     void JsBeginPath(const JSCallbackInfo& info);
77     void JsClosePath(const JSCallbackInfo& info);
78     void JsRestore(const JSCallbackInfo& info);
79     void JsSave(const JSCallbackInfo& info);
80     void JsRotate(const JSCallbackInfo& info);
81     void JsScale(const JSCallbackInfo& info);
82     void JsGetTransform(const JSCallbackInfo& info);
83     void JsSetTransform(const JSCallbackInfo& info);
84     void JsResetTransform(const JSCallbackInfo& info);
85     void JsTransform(const JSCallbackInfo& info);
86     void JsTranslate(const JSCallbackInfo& info);
87     void JsSetLineDash(const JSCallbackInfo& info);
88     void JsGetLineDash(const JSCallbackInfo& info);
89     void JsToDataUrl(const JSCallbackInfo& info);
90     void JsCreateLinearGradient(const JSCallbackInfo& info);
91     void JsCreateRadialGradient(const JSCallbackInfo& info);
92     void JsCreateConicGradient(const JSCallbackInfo& info);
93     void JsSaveLayer(const JSCallbackInfo& info);
94     void JsRestoreLayer(const JSCallbackInfo& info);
95     void JsSetFont(const JSCallbackInfo& info);
96     void JsSetFillStyle(const JSCallbackInfo& info);
97     void JsSetStrokeStyle(const JSCallbackInfo& info);
98     void JsSetLineCap(const JSCallbackInfo& info);
99     void JsSetLineJoin(const JSCallbackInfo& info);
100     void JsSetMiterLimit(const JSCallbackInfo& info);
101     void JsSetLineWidth(const JSCallbackInfo& info);
102     void JsSetGlobalAlpha(const JSCallbackInfo& info);
103     void JsSetGlobalCompositeOperation(const JSCallbackInfo& info);
104     void JsSetLineDashOffset(const JSCallbackInfo& info);
105     void JsSetShadowBlur(const JSCallbackInfo& info);
106     void JsSetShadowColor(const JSCallbackInfo& info);
107     void JsSetShadowOffsetX(const JSCallbackInfo& info);
108     void JsSetShadowOffsetY(const JSCallbackInfo& info);
109     void JsSetImageSmoothingEnabled(const JSCallbackInfo& info);
110     void JsDrawImage(const JSCallbackInfo& info);
111     void JsCreatePattern(const JSCallbackInfo& info);
112     void JsCreateImageData(const JSCallbackInfo& info);
113     void JsPutImageData(const JSCallbackInfo& info);
114     void JsGetImageData(const JSCallbackInfo& info);
115     void JsGetJsonData(const JSCallbackInfo& info);
116     void JsSetTextAlign(const JSCallbackInfo& info);
117     void JsSetTextBaseline(const JSCallbackInfo& info);
118     void JsSetImageSmoothingQuality(const JSCallbackInfo& info);
119     void JsGetPixelMap(const JSCallbackInfo& info);
120     void JsSetPixelMap(const JSCallbackInfo& info);
121     void JsDrawBitmapMesh(const JSCallbackInfo& info);
122     void JsSetFilter(const JSCallbackInfo& info);
123     void JsSetDirection(const JSCallbackInfo& info);
124     void JsReset(const JSCallbackInfo& info);
125     void JsSetLetterSpacing(const JSCallbackInfo& info);
126 
JSGetEmpty(const JSCallbackInfo & info)127     void JSGetEmpty(const JSCallbackInfo& info)
128     {
129         return;
130     }
131 
SetCanvasPattern(const RefPtr<AceType> & canvas)132     void SetCanvasPattern(const RefPtr<AceType>& canvas) override
133     {
134         renderingContext2DModel_->SetPattern(canvas);
135         if (isInitializeShadow_) {
136             return;
137         }
138         isInitializeShadow_ = true;
139         renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT);
140     }
141 
SetOffscreenPattern(const RefPtr<AceType> & offscreenCanvas)142     void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas)
143     {
144         offscreenPattern_ = offscreenCanvas;
145         renderingContext2DModel_->SetPattern(offscreenCanvas);
146         if (isOffscreenInitializeShadow_) {
147             return;
148         }
149         isOffscreenInitializeShadow_ = true;
150         renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT);
151     }
152 
SetAnti(bool anti)153     void SetAnti(bool anti)
154     {
155         anti_ = anti;
156     }
157 
GetAnti()158     bool GetAnti()
159     {
160         return anti_;
161     }
162 
SetUnit(CanvasUnit unit)163     void SetUnit(CanvasUnit unit)
164     {
165         unit_ = unit;
166     }
167 
GetUnit()168     CanvasUnit GetUnit()
169     {
170         return unit_;
171     }
172 
173     inline double GetDensity(bool useSystemDensity = false)
174     {
175         if (useSystemDensity) {
176             return !NearZero(density_) ? density_ : 1.0;
177         } else {
178             return ((GetUnit() == CanvasUnit::DEFAULT) && !NearZero(density_)) ? density_ : 1.0;
179         }
180     }
181 
SetInstanceId(int32_t id)182     void SetInstanceId(int32_t id) override
183     {
184         instanceId_ = id;
185     }
186 
187     void SetTransform(unsigned int id, const TransformParam&);
188 
189     void ResetPaintState();
190     ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer);
191 
192 protected:
193     void ParseFillGradient(const JSCallbackInfo& info);
194     void ParseFillPattern(const JSCallbackInfo& info);
195     void ParseStorkeGradient(const JSCallbackInfo& info);
196     void ParseStrokePattern(const JSCallbackInfo& info);
197     JSRenderImage* UnwrapNapiImage(const JSRef<JSObject> jsObject);
198 
199 protected:
200     bool isJudgeSpecialValue_ = false;
201     RefPtr<RenderingContext2DModel> renderingContext2DModel_;
202     bool anti_ = false;
203 
204     RefPtr<AceType> offscreenPattern_;
205 
206     int32_t instanceId_ = INSTANCE_ID_UNDEFINED;
207 
208     int32_t apiVersion_ = 0;
209 
210 private:
211     void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage);
212     JSRef<JSObject> createGradientObj(const std::shared_ptr<Gradient>& gradient);
213     void DrawSvgImage(const JSCallbackInfo& info, JSRenderImage* jsImage);
214     void DrawImage(const JSCallbackInfo& info, JSRenderImage* jsImage);
215     void DrawPixelMap(const JSCallbackInfo& info);
216 
217     PaintState paintState_;
218     std::vector<PaintState> savePaintState_;
219     bool isInitializeShadow_ = false;
220     bool isOffscreenInitializeShadow_ = false;
221     Dimension GetDimensionValue(const std::string& str);
222     bool IsCustomFont(const std::string& fontName);
223     bool IsValidLetterSpacing(const std::string& letterSpacing);
224     CanvasUnit unit_ = CanvasUnit::DEFAULT;
225     double density_ = 1.0;
226     int32_t densityCallbackId_ = 0;
227 };
228 
229 } // namespace OHOS::Ace::Framework
230 
231 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H
232