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_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 33 namespace OHOS::Ace::Framework { 34 35 class JSCanvasRenderer : public Referenced { 36 public: 37 JSCanvasRenderer(); 38 ~JSCanvasRenderer() override = default; 39 40 enum class FunctionCode { 41 FILL_RECT = 0, 42 STROKE_RECT, 43 CLEAR_RECT, 44 FILL_TEXT, 45 STROKE_TEXT, 46 FILL_STYLE_SETTER, 47 STROKE_STYLE_SETTER, 48 }; 49 50 static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info); 51 void SetAntiAlias(); 52 53 void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint32_t>& array); 54 55 void JsFillRect(const JSCallbackInfo& info); 56 void JsStrokeRect(const JSCallbackInfo& info); 57 void JsClearRect(const JSCallbackInfo& info); 58 void JsFillText(const JSCallbackInfo& info); 59 void JsStrokeText(const JSCallbackInfo& info); 60 void JsMeasureText(const JSCallbackInfo& info); 61 void JsMoveTo(const JSCallbackInfo& info); 62 void JsLineTo(const JSCallbackInfo& info); 63 void JsBezierCurveTo(const JSCallbackInfo& info); 64 void JsQuadraticCurveTo(const JSCallbackInfo& info); 65 void JsArcTo(const JSCallbackInfo& info); 66 void JsArc(const JSCallbackInfo& info); 67 void JsEllipse(const JSCallbackInfo& info); 68 void JsFill(const JSCallbackInfo& info); 69 void JsStroke(const JSCallbackInfo& info); 70 void JsClip(const JSCallbackInfo& info); 71 void JsRect(const JSCallbackInfo& info); 72 void JsBeginPath(const JSCallbackInfo& info); 73 void JsClosePath(const JSCallbackInfo& info); 74 void JsRestore(const JSCallbackInfo& info); 75 void JsSave(const JSCallbackInfo& info); 76 void JsRotate(const JSCallbackInfo& info); 77 void JsScale(const JSCallbackInfo& info); 78 void JsSetTransform(const JSCallbackInfo& info); 79 void JsTransform(const JSCallbackInfo& info); 80 void JsTranslate(const JSCallbackInfo& info); 81 void JsSetLineDash(const JSCallbackInfo& info); 82 void JsToDataUrl(const JSCallbackInfo& info); 83 void JsCreateLinearGradient(const JSCallbackInfo& info); 84 void JsCreateRadialGradient(const JSCallbackInfo& info); 85 86 void JsGetFillStyle(const JSCallbackInfo& info); 87 void JsGetStrokeStyle(const JSCallbackInfo& info); 88 void JsGetLineCap(const JSCallbackInfo& info); 89 void JsGetLineJoin(const JSCallbackInfo& info); 90 void JsGetMiterLimit(const JSCallbackInfo& info); 91 void JsGetLineWidth(const JSCallbackInfo& info); 92 void JsGetTextAlign(const JSCallbackInfo& info); 93 void JsGetTextBaseline(const JSCallbackInfo& info); 94 void JsGetGlobalAlpha(const JSCallbackInfo& info); 95 void JsGetGlobalCompositeOperation(const JSCallbackInfo& info); 96 void JsGetLineDashOffset(const JSCallbackInfo& info); 97 void JsGetShadowBlur(const JSCallbackInfo& info); 98 void JsGetShadowColor(const JSCallbackInfo& info); 99 void JsGetShadowOffsetX(const JSCallbackInfo& info); 100 void JsGetShadowOffsetY(const JSCallbackInfo& info); 101 void JsGetImageSmoothingEnabled(const JSCallbackInfo& info); 102 void JsGetImageSmoothingQuality(const JSCallbackInfo& info); 103 void JsGetFont(const JSCallbackInfo& info); 104 void JsSetFont(const JSCallbackInfo& info); 105 void JsSetFillStyle(const JSCallbackInfo& info); 106 void JsSetStrokeStyle(const JSCallbackInfo& info); 107 void JsSetLineCap(const JSCallbackInfo& info); 108 void JsSetLineJoin(const JSCallbackInfo& info); 109 void JsSetMiterLimit(const JSCallbackInfo& info); 110 void JsSetLineWidth(const JSCallbackInfo& info); 111 void JsSetGlobalAlpha(const JSCallbackInfo& info); 112 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 113 void JsSetLineDashOffset(const JSCallbackInfo& info); 114 void JsSetShadowBlur(const JSCallbackInfo& info); 115 void JsSetShadowColor(const JSCallbackInfo& info); 116 void JsSetShadowOffsetX(const JSCallbackInfo& info); 117 void JsSetShadowOffsetY(const JSCallbackInfo& info); 118 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 119 void JsDrawImage(const JSCallbackInfo& info); 120 void JsCreatePattern(const JSCallbackInfo& info); 121 void JsCreateImageData(const JSCallbackInfo& info); 122 void JsPutImageData(const JSCallbackInfo& info); 123 void JsGetImageData(const JSCallbackInfo& info); 124 void JsGetJsonData(const JSCallbackInfo& info); 125 void JsSetTextAlign(const JSCallbackInfo& info); 126 void JsSetTextBaseline(const JSCallbackInfo& info); 127 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 128 void JsGetPixelMap(const JSCallbackInfo& info); 129 SetComponent(const RefPtr<CanvasTaskPool> & controller)130 void SetComponent(const RefPtr<CanvasTaskPool>& controller) 131 { 132 pool_ = controller; 133 isOffscreen_ = false; 134 } 135 SetOffscreenCanvas(const RefPtr<OffscreenCanvas> & offscreenCanvas)136 void SetOffscreenCanvas(const RefPtr<OffscreenCanvas>& offscreenCanvas) 137 { 138 offscreenCanvas_ = offscreenCanvas; 139 isOffscreen_ = true; 140 } 141 GetLineDash()142 std::vector<uint32_t> GetLineDash() const 143 { 144 return lineDash_; 145 } 146 SetLineDash(const std::vector<uint32_t> lineDash)147 void SetLineDash(const std::vector<uint32_t> lineDash) 148 { 149 lineDash_ = lineDash; 150 } 151 SetAnti(bool anti)152 void SetAnti(bool anti) 153 { 154 anti_ = anti; 155 } 156 GetAnti()157 bool GetAnti() 158 { 159 return anti_; 160 } 161 162 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 163 164 protected: 165 RefPtr<CanvasTaskPool> pool_; 166 RefPtr<OffscreenCanvas> offscreenCanvas_; 167 bool anti_ = false; 168 169 private: 170 PaintState paintState_; 171 TextStyle style_; 172 static std::unordered_map<int32_t, Pattern> pattern_; 173 static int32_t patternCount_; 174 Pattern GetPattern(int32_t id); 175 std::vector<uint32_t> lineDash_; 176 ImageData imageData_; 177 bool isOffscreen_ = false; 178 }; 179 180 } // namespace OHOS::Ace::Framework 181 182 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 183