1 /* 2 * Copyright (c) 2021-2024 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 "bridge/common/utils/utils.h" 21 #include "bridge/declarative_frontend/engine/bindings_defines.h" 22 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_gradient.h" 23 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_image_data.h" 24 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_path.h" 25 #include "bridge/declarative_frontend/jsview/canvas/js_matrix2d.h" 26 #include "bridge/declarative_frontend/jsview/canvas/js_path2d.h" 27 #include "bridge/declarative_frontend/jsview/canvas/js_rendering_context_base.h" 28 #include "bridge/declarative_frontend/jsview/canvas/js_render_image.h" 29 #include "bridge/declarative_frontend/jsview/js_container_base.h" 30 #include "bridge/declarative_frontend/jsview/js_view_abstract.h" 31 #include "core/components_ng/pattern/canvas/rendering_context_2d_model.h" 32 33 namespace OHOS::Ace::Framework { 34 35 class JSCanvasRenderer : public JSRenderingContextBase { 36 DECLARE_ACE_TYPE(JSCanvasRenderer, JSRenderingContextBase) 37 public: 38 JSCanvasRenderer(); 39 ~JSCanvasRenderer() override; 40 41 enum class FunctionCode { 42 FILL_RECT = 0, 43 STROKE_RECT, 44 CLEAR_RECT, 45 FILL_TEXT, 46 STROKE_TEXT, 47 FILL_STYLE_SETTER, 48 STROKE_STYLE_SETTER, 49 }; 50 51 static RefPtr<CanvasPath2D> JsMakePath2D(const JSCallbackInfo& info); 52 void SetAntiAlias() override; 53 void SetDensity() override; 54 55 void ParseImageData(const JSCallbackInfo& info, ImageData& imageData); 56 void JsCloseImageBitmap(const std::string& src); 57 58 void JsFillRect(const JSCallbackInfo& info); 59 void JsStrokeRect(const JSCallbackInfo& info); 60 void JsClearRect(const JSCallbackInfo& info); 61 void JsFillText(const JSCallbackInfo& info); 62 void JsStrokeText(const JSCallbackInfo& info); 63 void JsMeasureText(const JSCallbackInfo& info); 64 void JsMoveTo(const JSCallbackInfo& info); 65 void JsLineTo(const JSCallbackInfo& info); 66 void JsBezierCurveTo(const JSCallbackInfo& info); 67 void JsQuadraticCurveTo(const JSCallbackInfo& info); 68 void JsArcTo(const JSCallbackInfo& info); 69 void JsArc(const JSCallbackInfo& info); 70 void JsEllipse(const JSCallbackInfo& info); 71 void JsFill(const JSCallbackInfo& info); 72 void JsStroke(const JSCallbackInfo& info); 73 void JsClip(const JSCallbackInfo& info); 74 void JsRect(const JSCallbackInfo& info); 75 void JsBeginPath(const JSCallbackInfo& info); 76 void JsClosePath(const JSCallbackInfo& info); 77 void JsRestore(const JSCallbackInfo& info); 78 void JsSave(const JSCallbackInfo& info); 79 void JsRotate(const JSCallbackInfo& info); 80 void JsScale(const JSCallbackInfo& info); 81 void JsGetTransform(const JSCallbackInfo& info); 82 void JsSetTransform(const JSCallbackInfo& info); 83 void JsResetTransform(const JSCallbackInfo& info); 84 void JsTransform(const JSCallbackInfo& info); 85 void JsTranslate(const JSCallbackInfo& info); 86 void JsSetLineDash(const JSCallbackInfo& info); 87 void JsGetLineDash(const JSCallbackInfo& info); 88 void JsToDataUrl(const JSCallbackInfo& info); 89 void JsCreateLinearGradient(const JSCallbackInfo& info); 90 void JsCreateRadialGradient(const JSCallbackInfo& info); 91 void JsCreateConicGradient(const JSCallbackInfo& info); 92 void JsSaveLayer(const JSCallbackInfo& info); 93 void JsRestoreLayer(const JSCallbackInfo& info); 94 void JsSetFont(const JSCallbackInfo& info); 95 void JsSetFillStyle(const JSCallbackInfo& info); 96 void JsSetStrokeStyle(const JSCallbackInfo& info); 97 void JsSetLineCap(const JSCallbackInfo& info); 98 void JsSetLineJoin(const JSCallbackInfo& info); 99 void JsSetMiterLimit(const JSCallbackInfo& info); 100 void JsSetLineWidth(const JSCallbackInfo& info); 101 void JsSetGlobalAlpha(const JSCallbackInfo& info); 102 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 103 void JsSetLineDashOffset(const JSCallbackInfo& info); 104 void JsSetShadowBlur(const JSCallbackInfo& info); 105 void JsSetShadowColor(const JSCallbackInfo& info); 106 void JsSetShadowOffsetX(const JSCallbackInfo& info); 107 void JsSetShadowOffsetY(const JSCallbackInfo& info); 108 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 109 void JsDrawImage(const JSCallbackInfo& info); 110 void JsCreatePattern(const JSCallbackInfo& info); 111 void JsCreateImageData(const JSCallbackInfo& info); 112 void JsPutImageData(const JSCallbackInfo& info); 113 void JsGetImageData(const JSCallbackInfo& info); 114 void JsGetJsonData(const JSCallbackInfo& info); 115 void JsSetTextAlign(const JSCallbackInfo& info); 116 void JsSetTextBaseline(const JSCallbackInfo& info); 117 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 118 void JsGetPixelMap(const JSCallbackInfo& info); 119 void JsSetPixelMap(const JSCallbackInfo& info); 120 void JsDrawBitmapMesh(const JSCallbackInfo& info); 121 void JsSetFilter(const JSCallbackInfo& info); 122 void JsSetDirection(const JSCallbackInfo& info); 123 void JsReset(const JSCallbackInfo& info); 124 JSGetEmpty(const JSCallbackInfo & info)125 void JSGetEmpty(const JSCallbackInfo& info) 126 { 127 return; 128 } 129 SetCanvasPattern(const RefPtr<AceType> & canvas)130 void SetCanvasPattern(const RefPtr<AceType>& canvas) override 131 { 132 renderingContext2DModel_->SetPattern(canvas); 133 if (isInitializeShadow_) { 134 return; 135 } 136 isInitializeShadow_ = true; 137 renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT); 138 } 139 SetOffscreenPattern(const RefPtr<AceType> & offscreenCanvas)140 void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas) 141 { 142 offscreenPattern_ = offscreenCanvas; 143 renderingContext2DModel_->SetPattern(offscreenCanvas); 144 if (isOffscreenInitializeShadow_) { 145 return; 146 } 147 isOffscreenInitializeShadow_ = true; 148 renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT); 149 } 150 SetAnti(bool anti)151 void SetAnti(bool anti) 152 { 153 anti_ = anti; 154 } 155 GetAnti()156 bool GetAnti() 157 { 158 return anti_; 159 } 160 SetUnit(CanvasUnit unit)161 void SetUnit(CanvasUnit unit) 162 { 163 unit_ = unit; 164 } 165 GetUnit()166 CanvasUnit GetUnit() 167 { 168 return unit_; 169 } 170 171 inline double GetDensity(bool useSystemDensity = false) 172 { 173 if (useSystemDensity) { 174 return !NearZero(density_) ? density_ : 1.0; 175 } else { 176 return ((GetUnit() == CanvasUnit::DEFAULT) && !NearZero(density_)) ? density_ : 1.0; 177 } 178 } 179 SetInstanceId(int32_t id)180 void SetInstanceId(int32_t id) override 181 { 182 instanceId_ = id; 183 } 184 185 void SetTransform(unsigned int id, const TransformParam&); 186 187 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 188 189 protected: 190 void ParseFillGradient(const JSCallbackInfo& info); 191 void ParseFillPattern(const JSCallbackInfo& info); 192 void ParseStorkeGradient(const JSCallbackInfo& info); 193 void ParseStrokePattern(const JSCallbackInfo& info); 194 JSRenderImage* UnwrapNapiImage(const EcmaVM* vm, const JSRef<JSObject> jsObject); 195 196 protected: 197 RefPtr<RenderingContext2DModel> renderingContext2DModel_; 198 bool anti_ = false; 199 200 RefPtr<AceType> offscreenPattern_; 201 202 int32_t instanceId_ = INSTANCE_ID_UNDEFINED; 203 204 private: 205 void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage); 206 JSRef<JSObject> createGradientObj(const std::shared_ptr<Gradient>& gradient); 207 void DrawSvgImage(const JSCallbackInfo& info, JSRenderImage* jsImage); 208 void DrawImage(const JSCallbackInfo& info, JSRenderImage* jsImage); 209 void DrawPixelMap(const JSCallbackInfo& info); 210 211 PaintState paintState_; 212 std::vector<PaintState> savePaintState_; 213 static std::unordered_map<int32_t, std::shared_ptr<Pattern>> pattern_; 214 static unsigned int patternCount_; 215 std::weak_ptr<Ace::Pattern> GetPatternNG(int32_t id); 216 Pattern GetPattern(unsigned int id); 217 std::shared_ptr<Pattern> GetPatternPtr(int32_t id); 218 bool isInitializeShadow_ = false; 219 bool isOffscreenInitializeShadow_ = false; 220 Dimension GetDimensionValue(const std::string& str); 221 CanvasUnit unit_ = CanvasUnit::DEFAULT; 222 double density_ = 1.0; 223 int32_t densityCallbackId_ = 0; 224 }; 225 226 } // namespace OHOS::Ace::Framework 227 228 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 229