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_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 17 #define FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 18 19 #include "base/memory/referenced.h" 20 #include "frameworks/bridge/common/utils/utils.h" 21 #include "frameworks/bridge/declarative_frontend/engine/bindings_defines.h" 22 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_gradient.h" 23 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_image_data.h" 24 #include "frameworks/bridge/declarative_frontend/jsview/js_canvas_path.h" 25 #include "frameworks/bridge/declarative_frontend/jsview/js_container_base.h" 26 #include "frameworks/bridge/declarative_frontend/jsview/js_matrix2d.h" 27 #include "frameworks/bridge/declarative_frontend/jsview/js_path2d.h" 28 #include "frameworks/bridge/declarative_frontend/jsview/js_render_image.h" 29 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h" 30 #include "frameworks/bridge/js_frontend/engine/quickjs/qjs_utils.h" 31 #include "frameworks/core/components/custom_paint/offscreen_canvas.h" 32 #include "frameworks/core/components_ng/pattern/custom_paint/custom_paint_pattern.h" 33 #include "frameworks/core/components_ng/pattern/custom_paint/offscreen_canvas_pattern.h" 34 35 namespace OHOS::Ace::Framework { 36 37 class JSCanvasRenderer : public Referenced { 38 public: 39 JSCanvasRenderer(); 40 ~JSCanvasRenderer() override = default; 41 42 enum class FunctionCode { 43 FILL_RECT = 0, 44 STROKE_RECT, 45 CLEAR_RECT, 46 FILL_TEXT, 47 STROKE_TEXT, 48 FILL_STYLE_SETTER, 49 STROKE_STYLE_SETTER, 50 }; 51 52 static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info); 53 void SetAntiAlias(); 54 55 void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint32_t>& array); 56 57 void JsFillRect(const JSCallbackInfo& info); 58 void JsStrokeRect(const JSCallbackInfo& info); 59 void JsClearRect(const JSCallbackInfo& info); 60 void JsFillText(const JSCallbackInfo& info); 61 void JsStrokeText(const JSCallbackInfo& info); 62 void JsMeasureText(const JSCallbackInfo& info); 63 void JsMoveTo(const JSCallbackInfo& info); 64 void JsLineTo(const JSCallbackInfo& info); 65 void JsBezierCurveTo(const JSCallbackInfo& info); 66 void JsQuadraticCurveTo(const JSCallbackInfo& info); 67 void JsArcTo(const JSCallbackInfo& info); 68 void JsArc(const JSCallbackInfo& info); 69 void JsEllipse(const JSCallbackInfo& info); 70 void JsFill(const JSCallbackInfo& info); 71 void JsStroke(const JSCallbackInfo& info); 72 void JsClip(const JSCallbackInfo& info); 73 void JsRect(const JSCallbackInfo& info); 74 void JsBeginPath(const JSCallbackInfo& info); 75 void JsClosePath(const JSCallbackInfo& info); 76 void JsRestore(const JSCallbackInfo& info); 77 void JsSave(const JSCallbackInfo& info); 78 void JsRotate(const JSCallbackInfo& info); 79 void JsScale(const JSCallbackInfo& info); 80 void JsGetTransform(const JSCallbackInfo& info); 81 void JsSetTransform(const JSCallbackInfo& info); 82 void JsResetTransform(const JSCallbackInfo& info); 83 void JsTransform(const JSCallbackInfo& info); 84 void JsTranslate(const JSCallbackInfo& info); 85 void JsSetLineDash(const JSCallbackInfo& info); 86 void JsToDataUrl(const JSCallbackInfo& info); 87 void JsCreateLinearGradient(const JSCallbackInfo& info); 88 void JsCreateRadialGradient(const JSCallbackInfo& info); 89 90 void JsGetFillStyle(const JSCallbackInfo& info); 91 void JsGetStrokeStyle(const JSCallbackInfo& info); 92 void JsGetLineCap(const JSCallbackInfo& info); 93 void JsGetLineDash(const JSCallbackInfo& info); 94 void JsGetLineJoin(const JSCallbackInfo& info); 95 void JsGetMiterLimit(const JSCallbackInfo& info); 96 void JsGetLineWidth(const JSCallbackInfo& info); 97 void JsGetTextAlign(const JSCallbackInfo& info); 98 void JsGetTextBaseline(const JSCallbackInfo& info); 99 void JsGetGlobalAlpha(const JSCallbackInfo& info); 100 void JsGetGlobalCompositeOperation(const JSCallbackInfo& info); 101 void JsGetLineDashOffset(const JSCallbackInfo& info); 102 void JsGetShadowBlur(const JSCallbackInfo& info); 103 void JsGetShadowColor(const JSCallbackInfo& info); 104 void JsGetShadowOffsetX(const JSCallbackInfo& info); 105 void JsGetShadowOffsetY(const JSCallbackInfo& info); 106 void JsGetImageSmoothingEnabled(const JSCallbackInfo& info); 107 void JsGetImageSmoothingQuality(const JSCallbackInfo& info); 108 void JsGetFont(const JSCallbackInfo& info); 109 void JsSetFont(const JSCallbackInfo& info); 110 void JsSetFillStyle(const JSCallbackInfo& info); 111 void JsSetStrokeStyle(const JSCallbackInfo& info); 112 void JsSetLineCap(const JSCallbackInfo& info); 113 void JsSetLineJoin(const JSCallbackInfo& info); 114 void JsSetMiterLimit(const JSCallbackInfo& info); 115 void JsSetLineWidth(const JSCallbackInfo& info); 116 void JsSetGlobalAlpha(const JSCallbackInfo& info); 117 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 118 void JsSetLineDashOffset(const JSCallbackInfo& info); 119 void JsSetShadowBlur(const JSCallbackInfo& info); 120 void JsSetShadowColor(const JSCallbackInfo& info); 121 void JsSetShadowOffsetX(const JSCallbackInfo& info); 122 void JsSetShadowOffsetY(const JSCallbackInfo& info); 123 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 124 void JsDrawImage(const JSCallbackInfo& info); 125 void JsCreatePattern(const JSCallbackInfo& info); 126 void JsCreateImageData(const JSCallbackInfo& info); 127 void JsPutImageData(const JSCallbackInfo& info); 128 void JsGetImageData(const JSCallbackInfo& info); 129 void JsGetJsonData(const JSCallbackInfo& info); 130 void JsSetTextAlign(const JSCallbackInfo& info); 131 void JsSetTextBaseline(const JSCallbackInfo& info); 132 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 133 void JsGetPixelMap(const JSCallbackInfo& info); 134 void JsSetPixelMap(const JSCallbackInfo& info); 135 void JsDrawBitmapMesh(const JSCallbackInfo& info); 136 void JsFilter(const JSCallbackInfo& info); 137 void JsDirection(const JSCallbackInfo& info); 138 SetComponent(const RefPtr<CanvasTaskPool> & controller)139 void SetComponent(const RefPtr<CanvasTaskPool>& controller) 140 { 141 pool_ = controller; 142 isOffscreen_ = false; 143 } 144 SetOffscreenCanvas(const RefPtr<OffscreenCanvas> & offscreenCanvas)145 void SetOffscreenCanvas(const RefPtr<OffscreenCanvas>& offscreenCanvas) 146 { 147 offscreenCanvas_ = offscreenCanvas; 148 isOffscreen_ = true; 149 } 150 SetCustomPaintPattern(const RefPtr<NG::CustomPaintPattern> & pattern)151 void SetCustomPaintPattern(const RefPtr<NG::CustomPaintPattern>& pattern) 152 { 153 customPaintPattern_ = pattern; 154 isOffscreen_ = false; 155 } 156 SetOffscreenCanvasPattern(const RefPtr<NG::OffscreenCanvasPattern> & pattern)157 void SetOffscreenCanvasPattern(const RefPtr<NG::OffscreenCanvasPattern>& pattern) 158 { 159 offscreenCanvasPattern_ = pattern; 160 isOffscreen_ = true; 161 } 162 GetLineDash()163 std::vector<uint32_t> GetLineDash() const 164 { 165 return lineDash_; 166 } 167 SetLineDash(const std::vector<uint32_t> lineDash)168 void SetLineDash(const std::vector<uint32_t> lineDash) 169 { 170 lineDash_ = lineDash; 171 } 172 SetAnti(bool anti)173 void SetAnti(bool anti) 174 { 175 anti_ = anti; 176 } 177 GetAnti()178 bool GetAnti() 179 { 180 return anti_; 181 } 182 183 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 184 185 protected: 186 RefPtr<CanvasTaskPool> pool_; 187 RefPtr<OffscreenCanvas> offscreenCanvas_; 188 bool anti_ = false; 189 RefPtr<NG::CustomPaintPattern> customPaintPattern_; 190 RefPtr<NG::OffscreenCanvasPattern> offscreenCanvasPattern_; 191 192 private: 193 void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage); 194 std::unique_ptr<ImageData> GetImageDataFromCanvas( 195 const double& left, const double& top, const double& width, const double& height); 196 PaintState paintState_; 197 TextStyle style_; 198 static std::unordered_map<int32_t, Pattern> pattern_; 199 static int32_t patternCount_; 200 Pattern GetPattern(int32_t id); 201 std::vector<uint32_t> lineDash_; 202 ImageData imageData_; 203 bool isOffscreen_ = false; 204 }; 205 206 } // namespace OHOS::Ace::Framework 207 208 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 209