1 /* 2 * Copyright (c) 2021 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_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H 18 19 #include <map> 20 #include <string> 21 22 #include "core/components/custom_paint/canvas_render_context_base.h" 23 #include "frameworks/bridge/common/dom/dom_canvas.h" 24 #include "frameworks/bridge/js_frontend/engine/common/base_canvas_bridge.h" 25 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h" 26 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_engine.h" 27 28 namespace OHOS::Ace::Framework { 29 30 class CanvasBridge : public BaseCanvasBridge { 31 DECLARE_ACE_TYPE(CanvasBridge, BaseCanvasBridge) 32 33 public: 34 CanvasBridge() = default; 35 virtual ~CanvasBridge(); 36 37 void HandleJsContext(JSContext* ctx, NodeId id, const std::string& args, JsEngineInstance* engine); 38 void HandleToDataURL(JSContext* ctx, NodeId id, const std::string& args); 39 GetRenderContext()40 JSValue GetRenderContext() const 41 { 42 return renderContext_; 43 } 44 GetDataURL()45 JSValue GetDataURL() const 46 { 47 return dataURL_; 48 } 49 50 static JSValue JsCreateLinearGradient(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 51 static JSValue JsCreateRadialGradient(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 52 static JSValue JsAddColorStop(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 53 54 // rect bridge 55 static JSValue JsFillRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 56 static JSValue JsStrokeRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 57 static JSValue JsClearRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 58 59 // text bridge 60 static JSValue JsFillText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 61 static JSValue JsStrokeText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 62 static JSValue JsMeasureText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 63 64 // path bridge 65 static JSValue JsBeginPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 66 static JSValue JsClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 67 static JSValue JsMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 68 static JSValue JsLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 69 static JSValue JsBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 70 static JSValue JsQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 71 static JSValue JsArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 72 static JSValue JsArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 73 static JSValue JsEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 74 75 static JSValue JsRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 76 static JSValue JsFill(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 77 static JSValue JsStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 78 static JSValue JsClip(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 79 80 static JSValue JsSave(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 81 static JSValue JsRestore(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 82 83 static JSValue JsRotate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 84 static JSValue JsScale(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 85 static JSValue JsSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 86 static JSValue JsTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 87 static JSValue JsTranslate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 88 static JSValue JsGetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 89 static JSValue JsSetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 90 static JSValue JsDrawImage(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 91 static JSValue JsCreatePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 92 static JSValue JsCreatePattern(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 93 static JSValue JsCreateImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 94 static JSValue JsPutImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 95 static JSValue JsGetImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 96 static JSValue JsTransferFromImageBitmap(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 97 // support to read inner json data by lottie 98 static JSValue JsGetJsonData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 99 100 // getter and setter 101 static JSValue JsFillStyleGetter(JSContext* ctx, JSValueConst value); 102 static JSValue JsFillStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 103 static JSValue JsStrokeStyleGetter(JSContext* ctx, JSValueConst value); 104 static JSValue JsStrokeStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 105 static JSValue JsLineCapGetter(JSContext* ctx, JSValueConst value); 106 static JSValue JsLineCapSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 107 static JSValue JsLineJoinGetter(JSContext* ctx, JSValueConst value); 108 static JSValue JsLineJoinSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 109 static JSValue JsMiterLimitGetter(JSContext* ctx, JSValueConst value); 110 static JSValue JsMiterLimitSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 111 static JSValue JsLineWidthGetter(JSContext* ctx, JSValueConst value); 112 static JSValue JsLineWidthSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 113 static JSValue JsTextAlignGetter(JSContext* ctx, JSValueConst value); 114 static JSValue JsTextAlignSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 115 static JSValue JsTextBaselineGetter(JSContext* ctx, JSValueConst value); 116 static JSValue JsTextBaselineSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 117 static JSValue JsFontGetter(JSContext* ctx, JSValueConst value); 118 static JSValue JsFontSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 119 static JSValue JsAlphaGetter(JSContext* ctx, JSValueConst value); 120 static JSValue JsAlphaSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 121 static JSValue JsCompositeOperationGetter(JSContext* ctx, JSValueConst value); 122 static JSValue JsCompositeOperationSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 123 static JSValue JsLineDashOffsetGetter(JSContext* ctx, JSValueConst value); 124 static JSValue JsLineDashOffsetSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 125 static JSValue JsShadowBlurGetter(JSContext* ctx, JSValueConst value); 126 static JSValue JsShadowBlurSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 127 static JSValue JsShadowColorGetter(JSContext* ctx, JSValueConst value); 128 static JSValue JsShadowColorSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 129 static JSValue JsShadowOffsetXGetter(JSContext* ctx, JSValueConst value); 130 static JSValue JsShadowOffsetXSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 131 static JSValue JsShadowOffsetYGetter(JSContext* ctx, JSValueConst value); 132 static JSValue JsShadowOffsetYSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 133 static JSValue JsSmoothingEnabledGetter(JSContext* ctx, JSValueConst value); 134 static JSValue JsSmoothingEnabledSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 135 static JSValue JsSmoothingQualityGetter(JSContext* ctx, JSValueConst value); 136 static JSValue JsSmoothingQualitySetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 137 138 // support only read attribute for lottie 139 static JSValue JsWidthGetter(JSContext* ctx, JSValueConst value); 140 static JSValue JsHeightGetter(JSContext* ctx, JSValueConst value); 141 142 static JSValue JsPath2DAddPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 143 static JSValue JsPath2DSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 144 static JSValue JsPath2DMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 145 static JSValue JsPath2DLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 146 static JSValue JsPath2DArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 147 static JSValue JsPath2DArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 148 static JSValue JsPath2DQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 149 static JSValue JsPath2DBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 150 static JSValue JsPath2DEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 151 static JSValue JsPath2DRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 152 static JSValue JsPath2DClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 153 static RefPtr<CanvasPath2D> JsMakePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 154 155 private: 156 enum class FunctionCode { 157 FILL_RECT = 0, 158 STROKE_RECT, 159 CLEAR_RECT, 160 FILL_TEXT, 161 STROKE_TEXT, 162 FILL_STYLE_SETTER, 163 STROKE_STYLE_SETTER, 164 }; 165 static Gradient GetGradient(JSContext* ctx, JSValueConst value); 166 static Pattern GetPattern(JSContext* ctx, JSValueConst value); 167 static RefPtr<CanvasPath2D> GetPath2D(JSContext* ctx, JSValueConst value); 168 static void ParseDomImage(JSContext* ctx, JSValueConst value, double& width, double& height, std::string& src); 169 static void ParseImageData( 170 JSContext* ctx, JSValueConst* argv, int32_t argc, std::vector<std::string>& array, ImageData& imageData); 171 static JSValue JsHandleRect( 172 JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv, FunctionCode functionCode); 173 static JSValue JsHandleText( 174 JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv, FunctionCode functionCode); 175 static JSValue JsHandleStyleSetter( 176 JSContext* ctx, JSValueConst value, JSValueConst proto, FunctionCode functionCode); 177 static void JsSetAntiAlias(JSContext* ctx, NodeId id, const std::string& args); 178 void JSHandleWebglContext(JSContext* ctx, NodeId id, const std::string& args, JsEngineInstance* engine, 179 CanvasRenderContextBase*& canvasRenderContext); 180 181 JSValue renderContext_; 182 JSValue dataURL_; 183 184 #if !defined(PREVIEW) 185 CanvasRenderContextBase* webglRenderContext_ = nullptr; 186 CanvasRenderContextBase* webgl2RenderContext_ = nullptr; 187 #endif 188 189 static int32_t gradientCount_; 190 static int32_t patternCount_; 191 static int32_t path2dCount_; 192 static std::unordered_map<int32_t, Gradient> gradientColors_; 193 static std::unordered_map<int32_t, Pattern> pattern_; 194 static std::unordered_map<int32_t, RefPtr<CanvasPath2D>> path2Ds_; 195 }; 196 197 } // namespace OHOS::Ace::Framework 198 199 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_CANVAS_BRIDGE_H 200