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/core/components_ng/pattern/canvas_renderer/canvas_renderer_model.h" 31 32 namespace OHOS::Ace::Framework { 33 34 class JSCanvasRenderer : public Referenced { 35 public: 36 JSCanvasRenderer(); 37 ~JSCanvasRenderer() override = default; 38 39 enum class FunctionCode { 40 FILL_RECT = 0, 41 STROKE_RECT, 42 CLEAR_RECT, 43 FILL_TEXT, 44 STROKE_TEXT, 45 FILL_STYLE_SETTER, 46 STROKE_STYLE_SETTER, 47 }; 48 49 static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info); 50 void SetAntiAlias(); 51 52 void ParseImageData(const JSCallbackInfo& info, ImageData& imageData, std::vector<uint8_t>& array); 53 void ParseImageDataAsStr(const JSCallbackInfo& info, ImageData& imageData); 54 void JsCloseImageBitmap(const std::string& src); 55 56 void JsFillRect(const JSCallbackInfo& info); 57 void JsStrokeRect(const JSCallbackInfo& info); 58 void JsClearRect(const JSCallbackInfo& info); 59 void JsFillText(const JSCallbackInfo& info); 60 void JsStrokeText(const JSCallbackInfo& info); 61 void JsMeasureText(const JSCallbackInfo& info); 62 void JsMoveTo(const JSCallbackInfo& info); 63 void JsLineTo(const JSCallbackInfo& info); 64 void JsBezierCurveTo(const JSCallbackInfo& info); 65 void JsQuadraticCurveTo(const JSCallbackInfo& info); 66 void JsArcTo(const JSCallbackInfo& info); 67 void JsArc(const JSCallbackInfo& info); 68 void JsEllipse(const JSCallbackInfo& info); 69 void JsFill(const JSCallbackInfo& info); 70 void JsStroke(const JSCallbackInfo& info); 71 void JsClip(const JSCallbackInfo& info); 72 void JsRect(const JSCallbackInfo& info); 73 void JsBeginPath(const JSCallbackInfo& info); 74 void JsClosePath(const JSCallbackInfo& info); 75 void JsRestore(const JSCallbackInfo& info); 76 void JsSave(const JSCallbackInfo& info); 77 void JsRotate(const JSCallbackInfo& info); 78 void JsScale(const JSCallbackInfo& info); 79 void JsGetTransform(const JSCallbackInfo& info); 80 void JsSetTransform(const JSCallbackInfo& info); 81 void JsResetTransform(const JSCallbackInfo& info); 82 void JsTransform(const JSCallbackInfo& info); 83 void JsTranslate(const JSCallbackInfo& info); 84 void JsSetLineDash(const JSCallbackInfo& info); 85 void JsToDataUrl(const JSCallbackInfo& info); 86 void JsCreateLinearGradient(const JSCallbackInfo& info); 87 void JsCreateRadialGradient(const JSCallbackInfo& info); 88 void JsCreateConicGradient(const JSCallbackInfo& info); 89 void JsSaveLayer(const JSCallbackInfo& info); 90 void JsRestoreLayer(const JSCallbackInfo& info); 91 92 void JsGetFillStyle(const JSCallbackInfo& info); 93 void JsGetStrokeStyle(const JSCallbackInfo& info); 94 void JsGetLineCap(const JSCallbackInfo& info); 95 void JsGetLineDash(const JSCallbackInfo& info); 96 void JsGetLineJoin(const JSCallbackInfo& info); 97 void JsGetMiterLimit(const JSCallbackInfo& info); 98 void JsGetLineWidth(const JSCallbackInfo& info); 99 void JsGetTextAlign(const JSCallbackInfo& info); 100 void JsGetTextBaseline(const JSCallbackInfo& info); 101 void JsGetGlobalAlpha(const JSCallbackInfo& info); 102 void JsGetGlobalCompositeOperation(const JSCallbackInfo& info); 103 void JsGetLineDashOffset(const JSCallbackInfo& info); 104 void JsGetShadowBlur(const JSCallbackInfo& info); 105 void JsGetShadowColor(const JSCallbackInfo& info); 106 void JsGetShadowOffsetX(const JSCallbackInfo& info); 107 void JsGetShadowOffsetY(const JSCallbackInfo& info); 108 void JsGetImageSmoothingEnabled(const JSCallbackInfo& info); 109 void JsGetImageSmoothingQuality(const JSCallbackInfo& info); 110 void JsGetFont(const JSCallbackInfo& info); 111 void JsSetFont(const JSCallbackInfo& info); 112 void JsSetFillStyle(const JSCallbackInfo& info); 113 void JsSetStrokeStyle(const JSCallbackInfo& info); 114 void JsSetLineCap(const JSCallbackInfo& info); 115 void JsSetLineJoin(const JSCallbackInfo& info); 116 void JsSetMiterLimit(const JSCallbackInfo& info); 117 void JsSetLineWidth(const JSCallbackInfo& info); 118 void JsSetGlobalAlpha(const JSCallbackInfo& info); 119 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 120 void JsSetLineDashOffset(const JSCallbackInfo& info); 121 void JsSetShadowBlur(const JSCallbackInfo& info); 122 void JsSetShadowColor(const JSCallbackInfo& info); 123 void JsSetShadowOffsetX(const JSCallbackInfo& info); 124 void JsSetShadowOffsetY(const JSCallbackInfo& info); 125 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 126 void JsDrawImage(const JSCallbackInfo& info); 127 void JsCreatePattern(const JSCallbackInfo& info); 128 void JsCreateImageData(const JSCallbackInfo& info); 129 void JsPutImageData(const JSCallbackInfo& info); 130 void JsGetImageData(const JSCallbackInfo& info); 131 void JsGetJsonData(const JSCallbackInfo& info); 132 void JsSetTextAlign(const JSCallbackInfo& info); 133 void JsSetTextBaseline(const JSCallbackInfo& info); 134 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 135 void JsGetPixelMap(const JSCallbackInfo& info); 136 void JsSetPixelMap(const JSCallbackInfo& info); 137 void JsDrawBitmapMesh(const JSCallbackInfo& info); 138 void JsGetFilter(const JSCallbackInfo& info); 139 void JsSetFilter(const JSCallbackInfo& info); 140 void JsGetDirection(const JSCallbackInfo& info); 141 void JsSetDirection(const JSCallbackInfo& info); 142 SetCanvasPattern(const RefPtr<AceType> & canvas)143 void SetCanvasPattern(const RefPtr<AceType>& canvas) 144 { 145 canvasPattern_ = canvas; 146 isOffscreen_ = false; 147 if (isInitializeShadow_) { 148 return; 149 } 150 BaseInfo baseInfo; 151 baseInfo.canvasPattern = canvasPattern_; 152 baseInfo.offscreenPattern = offscreenPattern_; 153 baseInfo.isOffscreen = isOffscreen_; 154 CanvasRendererModel::GetInstance()->SetShadowColor(baseInfo, Color::TRANSPARENT); 155 isInitializeShadow_ = true; 156 } 157 SetOffscreenPattern(const RefPtr<AceType> & offscreenCanvas)158 void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas) 159 { 160 offscreenPattern_ = offscreenCanvas; 161 isOffscreen_ = true; 162 if (isOffscreenInitializeShadow_) { 163 return; 164 } 165 BaseInfo baseInfo; 166 baseInfo.canvasPattern = canvasPattern_; 167 baseInfo.offscreenPattern = offscreenPattern_; 168 baseInfo.isOffscreen = isOffscreen_; 169 CanvasRendererModel::GetInstance()->SetShadowColor(baseInfo, Color::TRANSPARENT); 170 isOffscreenInitializeShadow_ = true; 171 } 172 GetLineDash()173 std::vector<uint32_t> GetLineDash() const 174 { 175 return lineDash_; 176 } 177 SetLineDash(const std::vector<uint32_t> lineDash)178 void SetLineDash(const std::vector<uint32_t> lineDash) 179 { 180 lineDash_ = lineDash; 181 } 182 SetAnti(bool anti)183 void SetAnti(bool anti) 184 { 185 anti_ = anti; 186 } 187 GetAnti()188 bool GetAnti() 189 { 190 return anti_; 191 } 192 SetInstanceId(int32_t id)193 void SetInstanceId(int32_t id) 194 { 195 instanceId_ = id; 196 } 197 198 void SetTransform(unsigned int id, const TransformParam&); 199 200 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 201 202 protected: 203 void ParseFillGradient(const JSCallbackInfo& info); 204 void ParseFillPattern(const JSCallbackInfo& info); 205 void ParseStorkeGradient(const JSCallbackInfo& info); 206 void ParseStrokePattern(const JSCallbackInfo& info); 207 JSRenderImage* UnwrapNapiImage(const JSRef<JSObject> jsObject); 208 209 protected: 210 bool anti_ = false; 211 212 RefPtr<AceType> canvasPattern_; 213 RefPtr<AceType> offscreenPattern_; 214 215 private: 216 void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage); 217 int32_t instanceId_ = INSTANCE_ID_UNDEFINED; 218 PaintState paintState_; 219 TextStyle style_; 220 static std::unordered_map<int32_t, std::shared_ptr<Pattern>> pattern_; 221 static unsigned int patternCount_; 222 std::weak_ptr<Ace::Pattern> GetPatternNG(int32_t id); 223 Pattern GetPattern(unsigned int id); 224 std::vector<uint32_t> lineDash_; 225 ImageData imageData_; 226 bool isOffscreen_ = false; 227 std::shared_ptr<Pattern> GetPatternPtr(int32_t id); 228 bool isInitializeShadow_ = false; 229 bool isOffscreenInitializeShadow_ = false; 230 Dimension GetDimensionValue(const std::string& str); 231 }; 232 233 } // namespace OHOS::Ace::Framework 234 235 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 236