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 31 namespace OHOS::Ace::Framework { 32 33 class JSCanvasRenderer : public Referenced { 34 public: 35 JSCanvasRenderer(); 36 ~JSCanvasRenderer() override = default; 37 38 enum class FunctionCode { 39 FILL_RECT = 0, 40 STROKE_RECT, 41 CLEAR_RECT, 42 FILL_TEXT, 43 STROKE_TEXT, 44 FILL_STYLE_SETTER, 45 STROKE_STYLE_SETTER, 46 }; 47 48 static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info); 49 void SetAntiAlias(); 50 51 void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint8_t>& array); 52 void ParseImageDataAsStr(const JSCallbackInfo& info, ImageData& imageData); 53 void JsCloseImageBitmap(const std::string& src); 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 JsGetTransform(const JSCallbackInfo& info); 79 void JsSetTransform(const JSCallbackInfo& info); 80 void JsResetTransform(const JSCallbackInfo& info); 81 void JsTransform(const JSCallbackInfo& info); 82 void JsTranslate(const JSCallbackInfo& info); 83 void JsSetLineDash(const JSCallbackInfo& info); 84 void JsToDataUrl(const JSCallbackInfo& info); 85 void JsCreateLinearGradient(const JSCallbackInfo& info); 86 void JsCreateRadialGradient(const JSCallbackInfo& info); 87 void JsCreateConicGradient(const JSCallbackInfo& info); 88 89 void JsGetFillStyle(const JSCallbackInfo& info); 90 void JsGetStrokeStyle(const JSCallbackInfo& info); 91 void JsGetLineCap(const JSCallbackInfo& info); 92 void JsGetLineDash(const JSCallbackInfo& info); 93 void JsGetLineJoin(const JSCallbackInfo& info); 94 void JsGetMiterLimit(const JSCallbackInfo& info); 95 void JsGetLineWidth(const JSCallbackInfo& info); 96 void JsGetTextAlign(const JSCallbackInfo& info); 97 void JsGetTextBaseline(const JSCallbackInfo& info); 98 void JsGetGlobalAlpha(const JSCallbackInfo& info); 99 void JsGetGlobalCompositeOperation(const JSCallbackInfo& info); 100 void JsGetLineDashOffset(const JSCallbackInfo& info); 101 void JsGetShadowBlur(const JSCallbackInfo& info); 102 void JsGetShadowColor(const JSCallbackInfo& info); 103 void JsGetShadowOffsetX(const JSCallbackInfo& info); 104 void JsGetShadowOffsetY(const JSCallbackInfo& info); 105 void JsGetImageSmoothingEnabled(const JSCallbackInfo& info); 106 void JsGetImageSmoothingQuality(const JSCallbackInfo& info); 107 void JsGetFont(const JSCallbackInfo& info); 108 void JsSetFont(const JSCallbackInfo& info); 109 void JsSetFillStyle(const JSCallbackInfo& info); 110 void JsSetStrokeStyle(const JSCallbackInfo& info); 111 void JsSetLineCap(const JSCallbackInfo& info); 112 void JsSetLineJoin(const JSCallbackInfo& info); 113 void JsSetMiterLimit(const JSCallbackInfo& info); 114 void JsSetLineWidth(const JSCallbackInfo& info); 115 void JsSetGlobalAlpha(const JSCallbackInfo& info); 116 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 117 void JsSetLineDashOffset(const JSCallbackInfo& info); 118 void JsSetShadowBlur(const JSCallbackInfo& info); 119 void JsSetShadowColor(const JSCallbackInfo& info); 120 void JsSetShadowOffsetX(const JSCallbackInfo& info); 121 void JsSetShadowOffsetY(const JSCallbackInfo& info); 122 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 123 void JsDrawImage(const JSCallbackInfo& info); 124 void JsCreatePattern(const JSCallbackInfo& info); 125 void JsCreateImageData(const JSCallbackInfo& info); 126 void JsPutImageData(const JSCallbackInfo& info); 127 void JsGetImageData(const JSCallbackInfo& info); 128 void JsGetJsonData(const JSCallbackInfo& info); 129 void JsSetTextAlign(const JSCallbackInfo& info); 130 void JsSetTextBaseline(const JSCallbackInfo& info); 131 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 132 void JsGetPixelMap(const JSCallbackInfo& info); 133 void JsSetPixelMap(const JSCallbackInfo& info); 134 void JsDrawBitmapMesh(const JSCallbackInfo& info); 135 void JsGetFilter(const JSCallbackInfo& info); 136 void JsSetFilter(const JSCallbackInfo& info); 137 void JsGetDirection(const JSCallbackInfo& info); 138 void JsSetDirection(const JSCallbackInfo& info); 139 140 void SetCanvasPattern(const RefPtr<AceType>& canvas); 141 142 void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas); 143 GetLineDash()144 std::vector<uint32_t> GetLineDash() const 145 { 146 return lineDash_; 147 } 148 SetLineDash(const std::vector<uint32_t> lineDash)149 void SetLineDash(const std::vector<uint32_t> lineDash) 150 { 151 lineDash_ = lineDash; 152 } 153 SetAnti(bool anti)154 void SetAnti(bool anti) 155 { 156 anti_ = anti; 157 } 158 GetAnti()159 bool GetAnti() 160 { 161 return anti_; 162 } 163 164 void SetTransform(unsigned int id, const TransformParam&); 165 166 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 167 168 protected: 169 void ParseFillGradient(const JSCallbackInfo& info); 170 void ParseFillPattern(const JSCallbackInfo& info); 171 void ParseStorkeGradient(const JSCallbackInfo& info); 172 void ParseStrokePattern(const JSCallbackInfo& info); 173 174 protected: 175 bool anti_ = false; 176 177 RefPtr<AceType> canvasPattern_; 178 RefPtr<AceType> offscreenPattern_; 179 180 private: 181 void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage); 182 PaintState paintState_; 183 TextStyle style_; 184 static std::unordered_map<int32_t, std::shared_ptr<Pattern>> pattern_; 185 static unsigned int patternCount_; 186 std::weak_ptr<Ace::Pattern> GetPatternNG(int32_t id); 187 Pattern GetPattern(unsigned int id); 188 std::vector<uint32_t> lineDash_; 189 ImageData imageData_; 190 bool isOffscreen_ = false; 191 std::shared_ptr<Pattern> GetPatternPtr(int32_t id); 192 }; 193 194 } // namespace OHOS::Ace::Framework 195 196 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 197