• 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 #include "js_rendering_context.h"
17 #include "bridge/declarative_frontend/engine/bindings.h"
18 #include "bridge/declarative_frontend/jsview/js_offscreen_rendering_context.h"
19 
20 namespace OHOS::Ace::Framework {
21 
JSRenderingContext()22 JSRenderingContext::JSRenderingContext()
23 {
24 }
25 
JSBind(BindingTarget globalObj)26 void JSRenderingContext::JSBind(BindingTarget globalObj)
27 {
28     JSClass<JSRenderingContext>::Declare("CanvasRenderingContext2D");
29 
30     JSClass<JSRenderingContext>::CustomMethod("toDataURL", &JSCanvasRenderer::JsToDataUrl);
31     JSClass<JSRenderingContext>::CustomProperty("width", &JSRenderingContext::JsGetWidth,
32                                                 &JSRenderingContext::JsSetWidth);
33     JSClass<JSRenderingContext>::CustomProperty("height", &JSRenderingContext::JsGetHeight,
34                                                 &JSRenderingContext::JsSetHeight);
35     JSClass<JSRenderingContext>::CustomMethod("createRadialGradient", &JSCanvasRenderer::JsCreateRadialGradient);
36     JSClass<JSRenderingContext>::CustomMethod("fillRect", &JSCanvasRenderer::JsFillRect);
37     JSClass<JSRenderingContext>::CustomMethod("strokeRect", &JSCanvasRenderer::JsStrokeRect);
38     JSClass<JSRenderingContext>::CustomMethod("clearRect", &JSCanvasRenderer::JsClearRect);
39     JSClass<JSRenderingContext>::CustomMethod("createLinearGradient", &JSCanvasRenderer::JsCreateLinearGradient);
40     JSClass<JSRenderingContext>::CustomMethod("fillText", &JSCanvasRenderer::JsFillText);
41     JSClass<JSRenderingContext>::CustomMethod("strokeText", &JSCanvasRenderer::JsStrokeText);
42     JSClass<JSRenderingContext>::CustomMethod("measureText", &JSCanvasRenderer::JsMeasureText);
43     JSClass<JSRenderingContext>::CustomMethod("moveTo", &JSCanvasRenderer::JsMoveTo);
44     JSClass<JSRenderingContext>::CustomMethod("lineTo", &JSCanvasRenderer::JsLineTo);
45     JSClass<JSRenderingContext>::CustomMethod("bezierCurveTo", &JSCanvasRenderer::JsBezierCurveTo);
46     JSClass<JSRenderingContext>::CustomMethod("quadraticCurveTo", &JSCanvasRenderer::JsQuadraticCurveTo);
47     JSClass<JSRenderingContext>::CustomMethod("arcTo", &JSCanvasRenderer::JsArcTo);
48     JSClass<JSRenderingContext>::CustomMethod("arc", &JSCanvasRenderer::JsArc);
49     JSClass<JSRenderingContext>::CustomMethod("ellipse", &JSCanvasRenderer::JsEllipse);
50     JSClass<JSRenderingContext>::CustomMethod("fill", &JSCanvasRenderer::JsFill);
51     JSClass<JSRenderingContext>::CustomMethod("stroke", &JSCanvasRenderer::JsStroke);
52     JSClass<JSRenderingContext>::CustomMethod("clip", &JSCanvasRenderer::JsClip);
53     JSClass<JSRenderingContext>::CustomMethod("rect", &JSCanvasRenderer::JsRect);
54     JSClass<JSRenderingContext>::CustomMethod("beginPath", &JSCanvasRenderer::JsBeginPath);
55     JSClass<JSRenderingContext>::CustomMethod("closePath", &JSCanvasRenderer::JsClosePath);
56     JSClass<JSRenderingContext>::CustomMethod("restore", &JSCanvasRenderer::JsRestore);
57     JSClass<JSRenderingContext>::CustomMethod("save", &JSCanvasRenderer::JsSave);
58     JSClass<JSRenderingContext>::CustomMethod("rotate", &JSCanvasRenderer::JsRotate);
59     JSClass<JSRenderingContext>::CustomMethod("scale", &JSCanvasRenderer::JsScale);
60     JSClass<JSRenderingContext>::CustomMethod("getTransform", &JSCanvasRenderer::JsGetTransform);
61     JSClass<JSRenderingContext>::CustomMethod("setTransform", &JSCanvasRenderer::JsSetTransform);
62     JSClass<JSRenderingContext>::CustomMethod("resetTransform", &JSCanvasRenderer::JsResetTransform);
63     JSClass<JSRenderingContext>::CustomMethod("transform", &JSCanvasRenderer::JsTransform);
64     JSClass<JSRenderingContext>::CustomMethod("translate", &JSCanvasRenderer::JsTranslate);
65     JSClass<JSRenderingContext>::CustomMethod("setLineDash", &JSCanvasRenderer::JsSetLineDash);
66     JSClass<JSRenderingContext>::CustomMethod("getLineDash", &JSCanvasRenderer::JsGetLineDash);
67     JSClass<JSRenderingContext>::CustomMethod("drawImage", &JSCanvasRenderer::JsDrawImage);
68     JSClass<JSRenderingContext>::CustomMethod("createPattern", &JSCanvasRenderer::JsCreatePattern);
69     JSClass<JSRenderingContext>::CustomMethod("createImageData", &JSCanvasRenderer::JsCreateImageData);
70     JSClass<JSRenderingContext>::CustomMethod("putImageData", &JSCanvasRenderer::JsPutImageData);
71     JSClass<JSRenderingContext>::CustomMethod("getImageData", &JSCanvasRenderer::JsGetImageData);
72     JSClass<JSRenderingContext>::CustomMethod("getJsonData", &JSCanvasRenderer::JsGetJsonData);
73     JSClass<JSRenderingContext>::CustomMethod("getPixelMap", &JSCanvasRenderer::JsGetPixelMap);
74     JSClass<JSRenderingContext>::CustomMethod("setPixelMap", &JSCanvasRenderer::JsSetPixelMap);
75     JSClass<JSRenderingContext>::CustomMethod("drawBitmapMesh", &JSCanvasRenderer::JsDrawBitmapMesh);
76     JSClass<JSRenderingContext>::CustomMethod("filter", &JSCanvasRenderer::JsFilter);
77     JSClass<JSRenderingContext>::CustomMethod("direction", &JSCanvasRenderer::JsDirection);
78 
79     JSClass<JSRenderingContext>::CustomProperty("fillStyle", &JSCanvasRenderer::JsGetFillStyle,
80                                                 &JSCanvasRenderer::JsSetFillStyle);
81     JSClass<JSRenderingContext>::CustomProperty("strokeStyle", &JSCanvasRenderer::JsGetStrokeStyle,
82                                                 &JSCanvasRenderer::JsSetStrokeStyle);
83     JSClass<JSRenderingContext>::CustomProperty("lineCap", &JSCanvasRenderer::JsGetLineCap,
84                                                 &JSCanvasRenderer::JsSetLineCap);
85     JSClass<JSRenderingContext>::CustomProperty("lineJoin", &JSCanvasRenderer::JsGetLineJoin,
86                                                 &JSCanvasRenderer::JsSetLineJoin);
87     JSClass<JSRenderingContext>::CustomProperty("miterLimit", &JSCanvasRenderer::JsGetMiterLimit,
88                                                 &JSCanvasRenderer::JsSetMiterLimit);
89     JSClass<JSRenderingContext>::CustomProperty("lineWidth", &JSCanvasRenderer::JsGetLineWidth,
90                                                 &JSCanvasRenderer::JsSetLineWidth);
91     JSClass<JSRenderingContext>::CustomProperty("font", &JSCanvasRenderer::JsGetFont,
92                                                 &JSCanvasRenderer::JsSetFont);
93     JSClass<JSRenderingContext>::CustomProperty("textAlign", &JSCanvasRenderer::JsGetTextAlign,
94                                                 &JSCanvasRenderer::JsSetTextAlign);
95     JSClass<JSRenderingContext>::CustomProperty("textBaseline", &JSCanvasRenderer::JsGetTextBaseline,
96                                                 &JSCanvasRenderer::JsSetTextBaseline);
97     JSClass<JSRenderingContext>::CustomProperty("globalAlpha", &JSCanvasRenderer::JsGetGlobalAlpha,
98                                                 &JSCanvasRenderer::JsSetGlobalAlpha);
99     JSClass<JSRenderingContext>::CustomProperty("globalCompositeOperation",
100                                                 &JSCanvasRenderer::JsGetGlobalCompositeOperation,
101                                                 &JSCanvasRenderer::JsSetGlobalCompositeOperation);
102     JSClass<JSRenderingContext>::CustomProperty("lineDashOffset", &JSCanvasRenderer::JsGetLineDashOffset,
103                                                 &JSCanvasRenderer::JsSetLineDashOffset);
104     JSClass<JSRenderingContext>::CustomProperty("shadowBlur", &JSCanvasRenderer::JsGetShadowBlur,
105                                                 &JSCanvasRenderer::JsSetShadowBlur);
106     JSClass<JSRenderingContext>::CustomProperty("shadowColor", &JSCanvasRenderer::JsGetShadowColor,
107                                                 &JSCanvasRenderer::JsSetShadowColor);
108     JSClass<JSRenderingContext>::CustomProperty("shadowOffsetX", &JSCanvasRenderer::JsGetShadowOffsetX,
109                                                 &JSCanvasRenderer::JsSetShadowOffsetX);
110     JSClass<JSRenderingContext>::CustomProperty("shadowOffsetY", &JSCanvasRenderer::JsGetShadowOffsetY,
111                                                 &JSCanvasRenderer::JsSetShadowOffsetY);
112     JSClass<JSRenderingContext>::CustomProperty("imageSmoothingEnabled", &JSCanvasRenderer::JsGetImageSmoothingEnabled,
113                                                 &JSCanvasRenderer::JsSetImageSmoothingEnabled);
114     JSClass<JSRenderingContext>::CustomProperty("imageSmoothingQuality", &JSCanvasRenderer::JsGetImageSmoothingQuality,
115                                                 &JSCanvasRenderer::JsSetImageSmoothingQuality);
116     JSClass<JSRenderingContext>::CustomMethod("transferFromImageBitmap",
117                                               &JSRenderingContext::JsTransferFromImageBitmap);
118 
119     JSClass<JSRenderingContext>::Bind(globalObj, JSRenderingContext::Constructor, JSRenderingContext::Destructor);
120 }
121 
Constructor(const JSCallbackInfo & args)122 void JSRenderingContext::Constructor(const JSCallbackInfo& args)
123 {
124     auto jsRenderContext = Referenced::MakeRefPtr<JSRenderingContext>();
125     jsRenderContext->IncRefCount();
126     args.SetReturnValue(Referenced::RawPtr(jsRenderContext));
127 
128     if (args.Length() != 0) {
129         if (args[0]->IsObject()) {
130             JSRenderingContextSettings* jsContextSetting
131                 = JSRef<JSObject>::Cast(args[0])->Unwrap<JSRenderingContextSettings>();
132             if (jsContextSetting == nullptr) {
133                 LOGE("jsContextSetting is null");
134                 return;
135             }
136             bool anti = jsContextSetting->GetAntialias();
137             jsRenderContext->SetAnti(anti);
138         }
139     }
140 }
141 
Destructor(JSRenderingContext * controller)142 void JSRenderingContext::Destructor(JSRenderingContext* controller)
143 {
144     if (controller != nullptr) {
145         controller->DecRefCount();
146     }
147 }
148 
JsGetWidth(const JSCallbackInfo & info)149 void JSRenderingContext::JsGetWidth(const JSCallbackInfo& info)
150 {
151     double width = 0.0;
152     if (Container::IsCurrentUseNewPipeline()) {
153         CHECK_NULL_VOID(customPaintPattern_);
154         width = customPaintPattern_->GetWidth();
155     } else {
156         CHECK_NULL_VOID(pool_);
157         width = pool_->GetWidth();
158     }
159     width = SystemProperties::Px2Vp(width);
160     auto returnValue = JSVal(ToJSValue(width));
161     auto returnPtr = JSRef<JSVal>::Make(returnValue);
162     info.SetReturnValue(returnPtr);
163 }
164 
JsSetWidth(const JSCallbackInfo & info)165 void JSRenderingContext::JsSetWidth(const JSCallbackInfo& info)
166 {
167     return;
168 }
169 
JsSetHeight(const JSCallbackInfo & info)170 void JSRenderingContext::JsSetHeight(const JSCallbackInfo& info)
171 {
172     return;
173 }
174 
JsGetHeight(const JSCallbackInfo & info)175 void JSRenderingContext::JsGetHeight(const JSCallbackInfo& info)
176 {
177     double height = 0.0;
178     if (Container::IsCurrentUseNewPipeline()) {
179         CHECK_NULL_VOID(customPaintPattern_);
180         height = customPaintPattern_->GetHeight();
181     } else {
182         CHECK_NULL_VOID(pool_);
183         height = pool_->GetHeight();
184     }
185     height = SystemProperties::Px2Vp(height);
186     auto returnValue = JSVal(ToJSValue(height));
187     auto returnPtr = JSRef<JSVal>::Make(returnValue);
188     info.SetReturnValue(returnPtr);
189 }
JsTransferFromImageBitmap(const JSCallbackInfo & info)190 void JSRenderingContext::JsTransferFromImageBitmap(const JSCallbackInfo& info)
191 {
192     if (info.Length() == 0) {
193         LOGE("The arg is wrong, it is supposed to have atleast 1 arguments");
194         return;
195     }
196     if (!info[0]->IsObject()) {
197         LOGE("The arg is not Object or String.");
198         return;
199     }
200     uint32_t id = 0;
201     JSRef<JSObject> obj = JSRef<JSObject>::Cast(info[0]);
202     JSRef<JSVal> widthId = obj->GetProperty("__id");
203     JSViewAbstract::ParseJsInteger(widthId, id);
204     if (Container::IsCurrentUseNewPipeline()) {
205         CHECK_NULL_VOID(customPaintPattern_);
206         auto offscreenCanvasPattern = JSOffscreenRenderingContext::GetOffscreenCanvasPattern(id);
207         customPaintPattern_->TransferFromImageBitmap(offscreenCanvasPattern);
208     } else {
209         CHECK_NULL_VOID(pool_);
210         RefPtr<OffscreenCanvas> offscreenCanvas = JSOffscreenRenderingContext::GetOffscreenCanvas(id);
211         pool_->TransferFromImageBitmap(offscreenCanvas);
212     }
213 }
214 
215 } // namespace OHOS::Ace::Framework
216