1 /* 2 * Copyright (c) 2022-2023 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_OFFSCREEN_CANVAS_H 17 #define FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_OFFSCREEN_CANVAS_H 18 19 #include "bridge/declarative_frontend/jsview/canvas/js_offscreen_rendering_context.h" 20 #include "core/common/ace_engine.h" 21 #include "core/components/common/properties/paint_state.h" 22 #include "core/components_ng/pattern/canvas/offscreen_canvas_pattern.h" 23 24 namespace OHOS::Ace::Framework { 25 26 class JSOffscreenCanvas : public AceType, public JSInteractableView, public JSViewAbstract { 27 DECLARE_ACE_TYPE(JSOffscreenCanvas, AceType); 28 public: 29 JSOffscreenCanvas() = default; 30 ~JSOffscreenCanvas() override = default; 31 32 static void JSBind(BindingTarget globalObj, void* nativeEngine); 33 static napi_value Constructor(napi_env env, napi_callback_info info); 34 static napi_value InitOffscreenCanvas(napi_env env); 35 static napi_value JsTransferToImageBitmap(napi_env env, napi_callback_info info); 36 static napi_value JsGetContext(napi_env env, napi_callback_info info); 37 static napi_value JsGetWidth(napi_env env, napi_callback_info info); 38 static napi_value JsGetHeight(napi_env env, napi_callback_info info); 39 static napi_value JsSetHeight(napi_env env, napi_callback_info info); 40 static napi_value JsSetWidth(napi_env env, napi_callback_info info); 41 JsCreateRadialGradient(const JSCallbackInfo & info)42 void JsCreateRadialGradient(const JSCallbackInfo& info) {} JsFillRect(const JSCallbackInfo & info)43 void JsFillRect(const JSCallbackInfo& info) {} JsStrokeRect(const JSCallbackInfo & info)44 void JsStrokeRect(const JSCallbackInfo& info) {} JsClearRect(const JSCallbackInfo & info)45 void JsClearRect(const JSCallbackInfo& info) {} JsCreateLinearGradient(const JSCallbackInfo & info)46 void JsCreateLinearGradient(const JSCallbackInfo& info) {} JsFillText(const JSCallbackInfo & info)47 void JsFillText(const JSCallbackInfo& info) {} JsStrokeText(const JSCallbackInfo & info)48 void JsStrokeText(const JSCallbackInfo& info) {} JsMeasureText(const JSCallbackInfo & info)49 void JsMeasureText(const JSCallbackInfo& info) {} JsMoveTo(const JSCallbackInfo & info)50 void JsMoveTo(const JSCallbackInfo& info) {} JsLineTo(const JSCallbackInfo & info)51 void JsLineTo(const JSCallbackInfo& info) {} JsBezierCurveTo(const JSCallbackInfo & info)52 void JsBezierCurveTo(const JSCallbackInfo& info) {} JsQuadraticCurveTo(const JSCallbackInfo & info)53 void JsQuadraticCurveTo(const JSCallbackInfo& info) {} JsArcTo(const JSCallbackInfo & info)54 void JsArcTo(const JSCallbackInfo& info) {} JsArc(const JSCallbackInfo & info)55 void JsArc(const JSCallbackInfo& info) {} JsEllipse(const JSCallbackInfo & info)56 void JsEllipse(const JSCallbackInfo& info) {} JsFill(const JSCallbackInfo & info)57 void JsFill(const JSCallbackInfo& info) {} JsStroke(const JSCallbackInfo & info)58 void JsStroke(const JSCallbackInfo& info) {} JsClip(const JSCallbackInfo & info)59 void JsClip(const JSCallbackInfo& info) {} JsRect(const JSCallbackInfo & info)60 void JsRect(const JSCallbackInfo& info) {} JsBeginPath(const JSCallbackInfo & info)61 void JsBeginPath(const JSCallbackInfo& info) {} JsClosePath(const JSCallbackInfo & info)62 void JsClosePath(const JSCallbackInfo& info) {} JsRestore(const JSCallbackInfo & info)63 void JsRestore(const JSCallbackInfo& info) {} JsSave(const JSCallbackInfo & info)64 void JsSave(const JSCallbackInfo& info) {} JsRotate(const JSCallbackInfo & info)65 void JsRotate(const JSCallbackInfo& info) {} JsScale(const JSCallbackInfo & info)66 void JsScale(const JSCallbackInfo& info) {} JsGetTransform(const JSCallbackInfo & info)67 void JsGetTransform(const JSCallbackInfo& info) {} JsSetTransform(const JSCallbackInfo & info)68 void JsSetTransform(const JSCallbackInfo& info) {} JsResetTransform(const JSCallbackInfo & info)69 void JsResetTransform(const JSCallbackInfo& info) {} JsTransform(const JSCallbackInfo & info)70 void JsTransform(const JSCallbackInfo& info) {} JsTranslate(const JSCallbackInfo & info)71 void JsTranslate(const JSCallbackInfo& info) {} JsSetLineDash(const JSCallbackInfo & info)72 void JsSetLineDash(const JSCallbackInfo& info) {} JsGetLineDash(const JSCallbackInfo & info)73 void JsGetLineDash(const JSCallbackInfo& info) {} JsDrawImage(const JSCallbackInfo & info)74 void JsDrawImage(const JSCallbackInfo& info) {} JsCreatePattern(const JSCallbackInfo & info)75 void JsCreatePattern(const JSCallbackInfo& info) {} JsCreateImageData(const JSCallbackInfo & info)76 void JsCreateImageData(const JSCallbackInfo& info) {} JsPutImageData(const JSCallbackInfo & info)77 void JsPutImageData(const JSCallbackInfo& info) {} JsGetImageData(const JSCallbackInfo & info)78 void JsGetImageData(const JSCallbackInfo& info) {} JsGetJsonData(const JSCallbackInfo & info)79 void JsGetJsonData(const JSCallbackInfo& info) {} JsGetPixelMap(const JSCallbackInfo & info)80 void JsGetPixelMap(const JSCallbackInfo& info) {} JsSetPixelMap(const JSCallbackInfo & info)81 void JsSetPixelMap(const JSCallbackInfo& info) {} JsCreateConicGradient(const JSCallbackInfo & info)82 void JsCreateConicGradient(const JSCallbackInfo& info) {} JsSetFilter(const JSCallbackInfo & info)83 void JsSetFilter(const JSCallbackInfo& info) {} JsGetFilter(const JSCallbackInfo & info)84 void JsGetFilter(const JSCallbackInfo& info) {} JsSetDirection(const JSCallbackInfo & info)85 void JsSetDirection(const JSCallbackInfo& info) {} JsGetDirection(const JSCallbackInfo & info)86 void JsGetDirection(const JSCallbackInfo& info) {} JsSetFillStyle(const JSCallbackInfo & info)87 void JsSetFillStyle(const JSCallbackInfo& info) {} JsGetFillStyle(const JSCallbackInfo & info)88 void JsGetFillStyle(const JSCallbackInfo& info) {} JsSetStrokeStyle(const JSCallbackInfo & info)89 void JsSetStrokeStyle(const JSCallbackInfo& info) {} JsGetStrokeStyle(const JSCallbackInfo & info)90 void JsGetStrokeStyle(const JSCallbackInfo& info) {} JsSetLineCap(const JSCallbackInfo & info)91 void JsSetLineCap(const JSCallbackInfo& info) {} JsGetLineCap(const JSCallbackInfo & info)92 void JsGetLineCap(const JSCallbackInfo& info) {} JsSetLineJoin(const JSCallbackInfo & info)93 void JsSetLineJoin(const JSCallbackInfo& info) {} JsGetLineJoin(const JSCallbackInfo & info)94 void JsGetLineJoin(const JSCallbackInfo& info) {} JsSetMiterLimit(const JSCallbackInfo & info)95 void JsSetMiterLimit(const JSCallbackInfo& info) {} JsGetMiterLimit(const JSCallbackInfo & info)96 void JsGetMiterLimit(const JSCallbackInfo& info) {} JsSetLineWidth(const JSCallbackInfo & info)97 void JsSetLineWidth(const JSCallbackInfo& info) {} JsGetLineWidth(const JSCallbackInfo & info)98 void JsGetLineWidth(const JSCallbackInfo& info) {} JsSetFont(const JSCallbackInfo & info)99 void JsSetFont(const JSCallbackInfo& info) {} JsGetFont(const JSCallbackInfo & info)100 void JsGetFont(const JSCallbackInfo& info) {} JsSetTextAlign(const JSCallbackInfo & info)101 void JsSetTextAlign(const JSCallbackInfo& info) {} JsGetTextAlign(const JSCallbackInfo & info)102 void JsGetTextAlign(const JSCallbackInfo& info) {} JsSetTextBaseline(const JSCallbackInfo & info)103 void JsSetTextBaseline(const JSCallbackInfo& info) {} JsGetTextBaseline(const JSCallbackInfo & info)104 void JsGetTextBaseline(const JSCallbackInfo& info) {} JsSetGlobalAlpha(const JSCallbackInfo & info)105 void JsSetGlobalAlpha(const JSCallbackInfo& info) {} JsGetGlobalAlpha(const JSCallbackInfo & info)106 void JsGetGlobalAlpha(const JSCallbackInfo& info) {} JsSetGlobalCompositeOperation(const JSCallbackInfo & info)107 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info) {} JsGetGlobalCompositeOperation(const JSCallbackInfo & info)108 void JsGetGlobalCompositeOperation(const JSCallbackInfo& info) {} JsSetLineDashOffset(const JSCallbackInfo & info)109 void JsSetLineDashOffset(const JSCallbackInfo& info) {} JsGetLineDashOffset(const JSCallbackInfo & info)110 void JsGetLineDashOffset(const JSCallbackInfo& info) {} JsSetShadowBlur(const JSCallbackInfo & info)111 void JsSetShadowBlur(const JSCallbackInfo& info) {} JsGetShadowBlur(const JSCallbackInfo & info)112 void JsGetShadowBlur(const JSCallbackInfo& info) {} JsSetShadowColor(const JSCallbackInfo & info)113 void JsSetShadowColor(const JSCallbackInfo& info) {} JsGetShadowColor(const JSCallbackInfo & info)114 void JsGetShadowColor(const JSCallbackInfo& info) {} JsSetShadowOffsetX(const JSCallbackInfo & info)115 void JsSetShadowOffsetX(const JSCallbackInfo& info) {} JsGetShadowOffsetX(const JSCallbackInfo & info)116 void JsGetShadowOffsetX(const JSCallbackInfo& info) {} JsSetShadowOffsetY(const JSCallbackInfo & info)117 void JsSetShadowOffsetY(const JSCallbackInfo& info) {} JsGetShadowOffsetY(const JSCallbackInfo & info)118 void JsGetShadowOffsetY(const JSCallbackInfo& info) {} JsSetImageSmoothingEnabled(const JSCallbackInfo & info)119 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info) {} JsGetImageSmoothingEnabled(const JSCallbackInfo & info)120 void JsGetImageSmoothingEnabled(const JSCallbackInfo& info) {} JsSetImageSmoothingQuality(const JSCallbackInfo & info)121 void JsSetImageSmoothingQuality(const JSCallbackInfo& info) {} JsGetImageSmoothingQuality(const JSCallbackInfo & info)122 void JsGetImageSmoothingQuality(const JSCallbackInfo& info) {} JSTransferFromImageBitmap(const JSCallbackInfo & info)123 void JSTransferFromImageBitmap(const JSCallbackInfo& info) {} JsSaveLayer(const JSCallbackInfo & info)124 void JsSaveLayer(const JSCallbackInfo& info) {} JsRestoreLayer(const JSCallbackInfo & info)125 void JsRestoreLayer(const JSCallbackInfo& info) {} 126 SetWidth(double width)127 void SetWidth(double width) 128 { 129 width_ = width; 130 } 131 GetWidth()132 double GetWidth() const 133 { 134 return width_; 135 } 136 SetHeight(double height)137 void SetHeight(double height) 138 { 139 height_ = height; 140 } 141 GetHeight()142 double GetHeight() const 143 { 144 return height_; 145 } 146 SetDetachStatus(bool isDetached)147 void SetDetachStatus(bool isDetached) 148 { 149 isDetached_ = isDetached; 150 } 151 IsDetached()152 bool IsDetached() const 153 { 154 return isDetached_; 155 } 156 SetUnit(CanvasUnit unit)157 void SetUnit(CanvasUnit unit) 158 { 159 unit_ = unit; 160 } 161 GetUnit()162 CanvasUnit GetUnit() 163 { 164 return unit_; 165 } 166 GetDensity()167 double GetDensity() 168 { 169 double density = PipelineBase::GetCurrentDensity(); 170 return ((GetUnit() == CanvasUnit::DEFAULT) && !NearZero(density)) ? density : 1.0; 171 } 172 IsGetContext()173 bool IsGetContext() const 174 { 175 return isGetContext_; 176 } 177 SetOffscreenPattern(const RefPtr<NG::OffscreenCanvasPattern> & offscreenPattern)178 void SetOffscreenPattern(const RefPtr<NG::OffscreenCanvasPattern>& offscreenPattern) 179 { 180 offscreenCanvasPattern_ = offscreenPattern; 181 } 182 183 enum class ContextType { 184 CONTEXT_2D = 0, 185 }; 186 187 ACE_DISALLOW_COPY_AND_MOVE(JSOffscreenCanvas); 188 private: 189 napi_value CreateContext2d(napi_env env, double width, double height, const EcmaVM* vm); 190 napi_value onTransferToImageBitmap(napi_env env); 191 napi_value onGetContext(napi_env env, napi_callback_info info); 192 void SetAntiAlias(napi_value argv); 193 napi_value OnGetWidth(napi_env env); 194 napi_value OnGetHeight(napi_env env); 195 napi_value OnSetWidth(napi_env env, napi_callback_info info); 196 napi_value OnSetHeight(napi_env env, napi_callback_info info); 197 198 RefPtr<NG::OffscreenCanvasPattern> offscreenCanvasPattern_; 199 RefPtr<JSOffscreenRenderingContext> offscreenCanvasContext_; 200 RefPtr<JSRenderingContextSettings> offscreenCanvasSettings_; 201 double width_ = 0.0f; 202 double height_ = 0.0f; 203 ContextType contextType_; 204 CanvasUnit unit_ = CanvasUnit::DEFAULT; 205 bool isGetContext_ = false; 206 bool isDetached_ = false; 207 }; 208 209 } // namespace OHOS::Ace::Framework 210 211 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_OFFSCREEN_CANVAS_H 212