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 #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_OFFSCREEN_CANVAS_BRIDGE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_OFFSCREEN_CANVAS_BRIDGE_H 18 19 #include <cstdlib> 20 #include <map> 21 #include <string> 22 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 "core/components/custom_paint/offscreen_canvas.h" 27 28 namespace OHOS::Ace::Framework { 29 int32_t GetCurrentBridgeId(JSContext* ctx, JSValueConst value); 30 31 class OffscreenCanvasBridge : public BaseCanvasBridge { 32 DECLARE_ACE_TYPE(OffscreenCanvasBridge, BaseCanvasBridge) 33 34 public: 35 OffscreenCanvasBridge() = default; 36 OffscreenCanvasBridge(JSContext* ctx, const int32_t width, const int32_t height); 37 ~OffscreenCanvasBridge() override = default; 38 39 int32_t bridgeId_; 40 RefPtr<OffscreenCanvas> offscreenCanvas_; 41 42 JSValue GetBridge(JSContext* ctx); 43 44 // method of OffscreenCanvas 45 static JSValue JsGetContext(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 46 static JSValue JsTransferToImageBitmap(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 47 static JSValue JsToDataURL(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 48 49 // method of OffscreenCanvasContext 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 JsCreatePattern(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 53 static JSValue JsAddColorStop(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 54 static JSValue JsFillRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 55 static JSValue JsClearRect(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 JsFillText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 58 static JSValue JsStrokeText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 59 static JSValue JsMeasureText(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 60 static JSValue JsRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 61 static JSValue JsFill(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 62 static JSValue JsClip(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 63 static JSValue JsCreateImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 64 static JSValue JsPutImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 65 static JSValue JsGetImageData(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 66 static JSValue JsDrawImage(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 67 static JSValue JsSave(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 68 static JSValue JsRestore(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 69 static JSValue JsCreatePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 70 static JSValue JsIsPointInStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 71 static JSValue JsIsPointInPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 72 static JSValue JsResetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 73 74 // priority of OffscreenCanvasContext 75 static JSValue JsFillStyleGetter(JSContext* ctx, JSValueConst value); 76 static JSValue JsFillStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 77 static JSValue JsStrokeStyleGetter(JSContext* ctx, JSValueConst value); 78 static JSValue JsStrokeStyleSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 79 static JSValue JsLineCapGetter(JSContext* ctx, JSValueConst value); 80 static JSValue JsLineCapSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 81 static JSValue JsLineJoinGetter(JSContext* ctx, JSValueConst value); 82 static JSValue JsLineJoinSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 83 static JSValue JsMiterLimitGetter(JSContext* ctx, JSValueConst value); 84 static JSValue JsMiterLimitSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 85 static JSValue JsLineWidthGetter(JSContext* ctx, JSValueConst value); 86 static JSValue JsLineWidthSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 87 static JSValue JsTextAlignGetter(JSContext* ctx, JSValueConst value); 88 static JSValue JsTextAlignSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 89 static JSValue JsTextBaselineGetter(JSContext* ctx, JSValueConst value); 90 static JSValue JsTextBaselineSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 91 static JSValue JsFontGetter(JSContext* ctx, JSValueConst value); 92 static JSValue JsFontSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 93 static JSValue JsAlphaGetter(JSContext* ctx, JSValueConst value); 94 static JSValue JsAlphaSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 95 static JSValue JsCompositeOperationGetter(JSContext* ctx, JSValueConst value); 96 static JSValue JsCompositeOperationSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 97 static JSValue JsLineDashOffsetGetter(JSContext* ctx, JSValueConst value); 98 static JSValue JsLineDashOffsetSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 99 static JSValue JsShadowBlurGetter(JSContext* ctx, JSValueConst value); 100 static JSValue JsShadowBlurSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 101 static JSValue JsShadowColorGetter(JSContext* ctx, JSValueConst value); 102 static JSValue JsShadowColorSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 103 static JSValue JsShadowOffsetXGetter(JSContext* ctx, JSValueConst value); 104 static JSValue JsShadowOffsetXSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 105 static JSValue JsShadowOffsetYGetter(JSContext* ctx, JSValueConst value); 106 static JSValue JsShadowOffsetYSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 107 static JSValue JsSmoothingEnabledGetter(JSContext* ctx, JSValueConst value); 108 static JSValue JsSmoothingEnabledSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 109 static JSValue JsSmoothingQualityGetter(JSContext* ctx, JSValueConst value); 110 static JSValue JsSmoothingQualitySetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 111 static JSValue JsFilterParamGetter(JSContext* ctx, JSValueConst value); 112 static JSValue JsFilterParamSetter(JSContext* ctx, JSValueConst value, JSValueConst proto); 113 static JSValue JsBeginPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 114 static JSValue JsArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 115 static JSValue JsStroke(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 116 static RefPtr<CanvasPath2D> GetPath2D(JSContext* ctx, JSValueConst value); 117 static std::unordered_map<int32_t, RefPtr<CanvasPath2D>> path2Ds_; 118 static JSValue JsArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 119 static JSValue JsMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 120 static JSValue JsClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 121 static JSValue JsRotate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 122 static JSValue JsScale(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 123 static JSValue JsLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 124 static JSValue JsBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 125 static JSValue JsQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 126 static JSValue JsEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 127 static JSValue JsSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 128 static JSValue JsTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 129 static JSValue JsTranslate(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 130 static JSValue JsGetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 131 static JSValue JsSetLineDash(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 132 133 static JSValue JsPath2DAddPath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 134 static JSValue JsPath2DSetTransform(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 135 static JSValue JsPath2DMoveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 136 static JSValue JsPath2DLineTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 137 static JSValue JsPath2DArc(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 138 static JSValue JsPath2DArcTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 139 static JSValue JsPath2DQuadraticCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 140 static JSValue JsPath2DBezierCurveTo(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 141 static JSValue JsPath2DEllipse(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 142 static JSValue JsPath2DRect(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 143 static JSValue JsPath2DClosePath(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 144 static RefPtr<CanvasPath2D> JsMakePath2D(JSContext* ctx, JSValueConst value, int32_t argc, JSValueConst* argv); 145 private: 146 enum class FunctionCode { 147 FILL_RECT = 0, 148 STROKE_RECT, 149 CLEAR_RECT, 150 FILL_TEXT, 151 STROKE_TEXT, 152 FILL_STYLE_SETTER, 153 STROKE_STYLE_SETTER, 154 }; 155 static Gradient GetGradient(JSContext* ctx, JSValueConst value); 156 static Pattern GetPattern(JSContext* ctx, JSValueConst value); 157 static void ParseDomImage(JSContext* ctx, JSValueConst value, double& width, double& height, std::string& src); 158 static void ParseImageData( 159 JSContext* ctx, JSValueConst* argv, int32_t argc, std::vector<std::string>& array, ImageData& imageData); 160 int32_t width_ = 0; 161 int32_t height_ = 0; 162 static int32_t path2dCount_; 163 static int32_t gradientCount_; 164 static int32_t patternCount_; 165 static int32_t globalBridgeId_; 166 static std::unordered_map<int32_t, Gradient> gradientColors_; 167 static std::unordered_map<int32_t, Pattern> pattern_; 168 static JSValue JsHandleStyleSetter( 169 JSContext* ctx, JSValueConst value, JSValueConst proto, FunctionCode functionCode); 170 }; 171 } // namespace OHOS::Ace::Framework 172 173 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_JS_FRONTEND_ENGINE_QUICKJS_OFFSCREEN_CANVAS_BRIDGE_H