• 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 
18 #include "bridge/common/utils/engine_helper.h"
19 #include "bridge/declarative_frontend/engine/bindings.h"
20 #include "bridge/declarative_frontend/jsview/js_offscreen_rendering_context.h"
21 #include "frameworks/bridge/declarative_frontend/jsview/models/rendering_context_model_impl.h"
22 #include "frameworks/core/components_ng/pattern/rendering_context/rendering_context_model_ng.h"
23 
24 namespace OHOS::Ace {
25 std::unique_ptr<RenderingContextModel> RenderingContextModel::instance_ = nullptr;
26 std::mutex RenderingContextModel::mutex_;
GetInstance()27 RenderingContextModel* RenderingContextModel::GetInstance()
28 {
29     if (!instance_) {
30         std::lock_guard<std::mutex> lock(mutex_);
31         if (!instance_) {
32 #ifdef NG_BUILD
33             instance_.reset(new NG::RenderingContextModelNG());
34 #else
35             if (Container::IsCurrentUseNewPipeline()) {
36                 instance_.reset(new NG::RenderingContextModelNG());
37             } else {
38                 instance_.reset(new Framework::RenderingContextModelImpl());
39             }
40 #endif
41         }
42     }
43     return instance_.get();
44 }
45 } // namespace OHOS::Ace
46 
47 namespace OHOS::Ace::Framework {
48 
JSRenderingContext()49 JSRenderingContext::JSRenderingContext() {}
50 
JSBind(BindingTarget globalObj)51 void JSRenderingContext::JSBind(BindingTarget globalObj)
52 {
53     JSClass<JSRenderingContext>::Declare("CanvasRenderingContext2D");
54 
55     JSClass<JSRenderingContext>::CustomMethod("toDataURL", &JSCanvasRenderer::JsToDataUrl);
56     JSClass<JSRenderingContext>::CustomProperty(
57         "width", &JSRenderingContext::JsGetWidth, &JSRenderingContext::JsSetWidth);
58     JSClass<JSRenderingContext>::CustomProperty(
59         "height", &JSRenderingContext::JsGetHeight, &JSRenderingContext::JsSetHeight);
60     JSClass<JSRenderingContext>::CustomMethod("createRadialGradient", &JSCanvasRenderer::JsCreateRadialGradient);
61     JSClass<JSRenderingContext>::CustomMethod("fillRect", &JSCanvasRenderer::JsFillRect);
62     JSClass<JSRenderingContext>::CustomMethod("strokeRect", &JSCanvasRenderer::JsStrokeRect);
63     JSClass<JSRenderingContext>::CustomMethod("clearRect", &JSCanvasRenderer::JsClearRect);
64     JSClass<JSRenderingContext>::CustomMethod("createLinearGradient", &JSCanvasRenderer::JsCreateLinearGradient);
65     JSClass<JSRenderingContext>::CustomMethod("fillText", &JSCanvasRenderer::JsFillText);
66     JSClass<JSRenderingContext>::CustomMethod("strokeText", &JSCanvasRenderer::JsStrokeText);
67     JSClass<JSRenderingContext>::CustomMethod("measureText", &JSCanvasRenderer::JsMeasureText);
68     JSClass<JSRenderingContext>::CustomMethod("moveTo", &JSCanvasRenderer::JsMoveTo);
69     JSClass<JSRenderingContext>::CustomMethod("lineTo", &JSCanvasRenderer::JsLineTo);
70     JSClass<JSRenderingContext>::CustomMethod("bezierCurveTo", &JSCanvasRenderer::JsBezierCurveTo);
71     JSClass<JSRenderingContext>::CustomMethod("quadraticCurveTo", &JSCanvasRenderer::JsQuadraticCurveTo);
72     JSClass<JSRenderingContext>::CustomMethod("arcTo", &JSCanvasRenderer::JsArcTo);
73     JSClass<JSRenderingContext>::CustomMethod("arc", &JSCanvasRenderer::JsArc);
74     JSClass<JSRenderingContext>::CustomMethod("ellipse", &JSCanvasRenderer::JsEllipse);
75     JSClass<JSRenderingContext>::CustomMethod("fill", &JSCanvasRenderer::JsFill);
76     JSClass<JSRenderingContext>::CustomMethod("stroke", &JSCanvasRenderer::JsStroke);
77     JSClass<JSRenderingContext>::CustomMethod("clip", &JSCanvasRenderer::JsClip);
78     JSClass<JSRenderingContext>::CustomMethod("rect", &JSCanvasRenderer::JsRect);
79     JSClass<JSRenderingContext>::CustomMethod("beginPath", &JSCanvasRenderer::JsBeginPath);
80     JSClass<JSRenderingContext>::CustomMethod("closePath", &JSCanvasRenderer::JsClosePath);
81     JSClass<JSRenderingContext>::CustomMethod("restore", &JSCanvasRenderer::JsRestore);
82     JSClass<JSRenderingContext>::CustomMethod("save", &JSCanvasRenderer::JsSave);
83     JSClass<JSRenderingContext>::CustomMethod("rotate", &JSCanvasRenderer::JsRotate);
84     JSClass<JSRenderingContext>::CustomMethod("scale", &JSCanvasRenderer::JsScale);
85     JSClass<JSRenderingContext>::CustomMethod("getTransform", &JSCanvasRenderer::JsGetTransform);
86     JSClass<JSRenderingContext>::CustomMethod("setTransform", &JSCanvasRenderer::JsSetTransform);
87     JSClass<JSRenderingContext>::CustomMethod("resetTransform", &JSCanvasRenderer::JsResetTransform);
88     JSClass<JSRenderingContext>::CustomMethod("transform", &JSCanvasRenderer::JsTransform);
89     JSClass<JSRenderingContext>::CustomMethod("translate", &JSCanvasRenderer::JsTranslate);
90     JSClass<JSRenderingContext>::CustomMethod("setLineDash", &JSCanvasRenderer::JsSetLineDash);
91     JSClass<JSRenderingContext>::CustomMethod("getLineDash", &JSCanvasRenderer::JsGetLineDash);
92     JSClass<JSRenderingContext>::CustomMethod("drawImage", &JSCanvasRenderer::JsDrawImage);
93     JSClass<JSRenderingContext>::CustomMethod("createPattern", &JSCanvasRenderer::JsCreatePattern);
94     JSClass<JSRenderingContext>::CustomMethod("createImageData", &JSCanvasRenderer::JsCreateImageData);
95     JSClass<JSRenderingContext>::CustomMethod("putImageData", &JSCanvasRenderer::JsPutImageData);
96     JSClass<JSRenderingContext>::CustomMethod("getImageData", &JSCanvasRenderer::JsGetImageData);
97     JSClass<JSRenderingContext>::CustomMethod("getJsonData", &JSCanvasRenderer::JsGetJsonData);
98     JSClass<JSRenderingContext>::CustomMethod("getPixelMap", &JSCanvasRenderer::JsGetPixelMap);
99     JSClass<JSRenderingContext>::CustomMethod("setPixelMap", &JSCanvasRenderer::JsSetPixelMap);
100     JSClass<JSRenderingContext>::CustomMethod("drawBitmapMesh", &JSCanvasRenderer::JsDrawBitmapMesh);
101     JSClass<JSRenderingContext>::CustomProperty(
102         "filter", &JSCanvasRenderer::JsGetFilter, &JSCanvasRenderer::JsSetFilter);
103     JSClass<JSRenderingContext>::CustomProperty(
104         "direction", &JSCanvasRenderer::JsGetDirection, &JSCanvasRenderer::JsSetDirection);
105 
106     JSClass<JSRenderingContext>::CustomProperty(
107         "fillStyle", &JSCanvasRenderer::JsGetFillStyle, &JSCanvasRenderer::JsSetFillStyle);
108     JSClass<JSRenderingContext>::CustomProperty(
109         "strokeStyle", &JSCanvasRenderer::JsGetStrokeStyle, &JSCanvasRenderer::JsSetStrokeStyle);
110     JSClass<JSRenderingContext>::CustomProperty(
111         "lineCap", &JSCanvasRenderer::JsGetLineCap, &JSCanvasRenderer::JsSetLineCap);
112     JSClass<JSRenderingContext>::CustomProperty(
113         "lineJoin", &JSCanvasRenderer::JsGetLineJoin, &JSCanvasRenderer::JsSetLineJoin);
114     JSClass<JSRenderingContext>::CustomProperty(
115         "miterLimit", &JSCanvasRenderer::JsGetMiterLimit, &JSCanvasRenderer::JsSetMiterLimit);
116     JSClass<JSRenderingContext>::CustomProperty(
117         "lineWidth", &JSCanvasRenderer::JsGetLineWidth, &JSCanvasRenderer::JsSetLineWidth);
118     JSClass<JSRenderingContext>::CustomProperty("font", &JSCanvasRenderer::JsGetFont, &JSCanvasRenderer::JsSetFont);
119     JSClass<JSRenderingContext>::CustomProperty(
120         "textAlign", &JSCanvasRenderer::JsGetTextAlign, &JSCanvasRenderer::JsSetTextAlign);
121     JSClass<JSRenderingContext>::CustomProperty(
122         "textBaseline", &JSCanvasRenderer::JsGetTextBaseline, &JSCanvasRenderer::JsSetTextBaseline);
123     JSClass<JSRenderingContext>::CustomProperty(
124         "globalAlpha", &JSCanvasRenderer::JsGetGlobalAlpha, &JSCanvasRenderer::JsSetGlobalAlpha);
125     JSClass<JSRenderingContext>::CustomProperty("globalCompositeOperation",
126         &JSCanvasRenderer::JsGetGlobalCompositeOperation, &JSCanvasRenderer::JsSetGlobalCompositeOperation);
127     JSClass<JSRenderingContext>::CustomProperty(
128         "lineDashOffset", &JSCanvasRenderer::JsGetLineDashOffset, &JSCanvasRenderer::JsSetLineDashOffset);
129     JSClass<JSRenderingContext>::CustomProperty(
130         "shadowBlur", &JSCanvasRenderer::JsGetShadowBlur, &JSCanvasRenderer::JsSetShadowBlur);
131     JSClass<JSRenderingContext>::CustomProperty(
132         "shadowColor", &JSCanvasRenderer::JsGetShadowColor, &JSCanvasRenderer::JsSetShadowColor);
133     JSClass<JSRenderingContext>::CustomProperty(
134         "shadowOffsetX", &JSCanvasRenderer::JsGetShadowOffsetX, &JSCanvasRenderer::JsSetShadowOffsetX);
135     JSClass<JSRenderingContext>::CustomProperty(
136         "shadowOffsetY", &JSCanvasRenderer::JsGetShadowOffsetY, &JSCanvasRenderer::JsSetShadowOffsetY);
137     JSClass<JSRenderingContext>::CustomProperty("imageSmoothingEnabled", &JSCanvasRenderer::JsGetImageSmoothingEnabled,
138         &JSCanvasRenderer::JsSetImageSmoothingEnabled);
139     JSClass<JSRenderingContext>::CustomProperty("imageSmoothingQuality", &JSCanvasRenderer::JsGetImageSmoothingQuality,
140         &JSCanvasRenderer::JsSetImageSmoothingQuality);
141     JSClass<JSRenderingContext>::CustomMethod(
142         "transferFromImageBitmap", &JSRenderingContext::JsTransferFromImageBitmap);
143 
144     JSClass<JSRenderingContext>::CustomMethod("createConicGradient", &JSCanvasRenderer::JsCreateConicGradient);
145     JSClass<JSRenderingContext>::CustomMethod("saveLayer", &JSCanvasRenderer::JsSaveLayer);
146     JSClass<JSRenderingContext>::CustomMethod("restoreLayer", &JSCanvasRenderer::JsRestoreLayer);
147     JSClass<JSRenderingContext>::Bind(globalObj, JSRenderingContext::Constructor, JSRenderingContext::Destructor);
148 }
149 
Constructor(const JSCallbackInfo & args)150 void JSRenderingContext::Constructor(const JSCallbackInfo& args)
151 {
152     auto jsRenderContext = Referenced::MakeRefPtr<JSRenderingContext>();
153     jsRenderContext->IncRefCount();
154     args.SetReturnValue(Referenced::RawPtr(jsRenderContext));
155 
156     if (args.Length() != 0) {
157         if (args[0]->IsObject()) {
158             JSRenderingContextSettings* jsContextSetting =
159                 JSRef<JSObject>::Cast(args[0])->Unwrap<JSRenderingContextSettings>();
160             if (jsContextSetting == nullptr) {
161                 return;
162             }
163             bool anti = jsContextSetting->GetAntialias();
164             jsRenderContext->SetAnti(anti);
165         }
166     }
167 }
168 
Destructor(JSRenderingContext * controller)169 void JSRenderingContext::Destructor(JSRenderingContext* controller)
170 {
171     if (controller != nullptr) {
172         controller->DecRefCount();
173     }
174 }
175 
JsGetWidth(const JSCallbackInfo & info)176 void JSRenderingContext::JsGetWidth(const JSCallbackInfo& info)
177 {
178     double width = 0.0;
179     RenderingContextModel::GetInstance()->GetWidth(canvasPattern_, width);
180 
181     width = PipelineBase::Px2VpWithCurrentDensity(width);
182     auto returnValue = JSVal(ToJSValue(width));
183     auto returnPtr = JSRef<JSVal>::Make(returnValue);
184     info.SetReturnValue(returnPtr);
185 }
186 
JsSetWidth(const JSCallbackInfo & info)187 void JSRenderingContext::JsSetWidth(const JSCallbackInfo& info)
188 {
189     return;
190 }
191 
JsSetHeight(const JSCallbackInfo & info)192 void JSRenderingContext::JsSetHeight(const JSCallbackInfo& info)
193 {
194     return;
195 }
196 
JsGetHeight(const JSCallbackInfo & info)197 void JSRenderingContext::JsGetHeight(const JSCallbackInfo& info)
198 {
199     double height = 0.0;
200     RenderingContextModel::GetInstance()->GetHeight(canvasPattern_, height);
201 
202     height = PipelineBase::Px2VpWithCurrentDensity(height);
203     auto returnValue = JSVal(ToJSValue(height));
204     auto returnPtr = JSRef<JSVal>::Make(returnValue);
205     info.SetReturnValue(returnPtr);
206 }
207 
JsTransferFromImageBitmap(const JSCallbackInfo & info)208 void JSRenderingContext::JsTransferFromImageBitmap(const JSCallbackInfo& info)
209 {
210     if (info.Length() == 0) {
211         return;
212     }
213     if (!info[0]->IsObject()) {
214         return;
215     }
216     auto engine = EngineHelper::GetCurrentEngine();
217     if (engine != nullptr) {
218         NativeEngine* nativeEngine = engine->GetNativeEngine();
219         napi_env env = reinterpret_cast<napi_env>(nativeEngine);
220         panda::Local<JsiValue> value = info[0].Get().GetLocalHandle();
221         JSValueWrapper valueWrapper = value;
222         napi_value napiValue = nativeEngine->ValueToNapiValue(valueWrapper);
223 
224         uint32_t id = 0;
225         napi_value widthId = nullptr;
226         napi_get_named_property(env, napiValue, "__id", &widthId);
227         napi_get_value_uint32(env, widthId, &id);
228         RefPtr<AceType> offscreenPattern = JSOffscreenRenderingContext::GetOffscreenPattern(id);
229         RenderingContextModel::GetInstance()->SetTransferFromImageBitmap(
230             canvasPattern_, offscreenPattern);
231     }
232 }
233 } // namespace OHOS::Ace::Framework
234