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 JsRoundRect(const JSCallbackInfo& info); 76 void JsBeginPath(const JSCallbackInfo& info); 77 void JsClosePath(const JSCallbackInfo& info); 78 void JsRestore(const JSCallbackInfo& info); 79 void JsSave(const JSCallbackInfo& info); 80 void JsRotate(const JSCallbackInfo& info); 81 void JsScale(const JSCallbackInfo& info); 82 void JsGetTransform(const JSCallbackInfo& info); 83 void JsSetTransform(const JSCallbackInfo& info); 84 void JsResetTransform(const JSCallbackInfo& info); 85 void JsTransform(const JSCallbackInfo& info); 86 void JsTranslate(const JSCallbackInfo& info); 87 void JsSetLineDash(const JSCallbackInfo& info); 88 void JsGetLineDash(const JSCallbackInfo& info); 89 void JsToDataUrl(const JSCallbackInfo& info); 90 void JsCreateLinearGradient(const JSCallbackInfo& info); 91 void JsCreateRadialGradient(const JSCallbackInfo& info); 92 void JsCreateConicGradient(const JSCallbackInfo& info); 93 void JsSaveLayer(const JSCallbackInfo& info); 94 void JsRestoreLayer(const JSCallbackInfo& info); 95 void JsSetFont(const JSCallbackInfo& info); 96 void JsSetFillStyle(const JSCallbackInfo& info); 97 void JsSetStrokeStyle(const JSCallbackInfo& info); 98 void JsSetLineCap(const JSCallbackInfo& info); 99 void JsSetLineJoin(const JSCallbackInfo& info); 100 void JsSetMiterLimit(const JSCallbackInfo& info); 101 void JsSetLineWidth(const JSCallbackInfo& info); 102 void JsSetGlobalAlpha(const JSCallbackInfo& info); 103 void JsSetGlobalCompositeOperation(const JSCallbackInfo& info); 104 void JsSetLineDashOffset(const JSCallbackInfo& info); 105 void JsSetShadowBlur(const JSCallbackInfo& info); 106 void JsSetShadowColor(const JSCallbackInfo& info); 107 void JsSetShadowOffsetX(const JSCallbackInfo& info); 108 void JsSetShadowOffsetY(const JSCallbackInfo& info); 109 void JsSetImageSmoothingEnabled(const JSCallbackInfo& info); 110 void JsDrawImage(const JSCallbackInfo& info); 111 void JsCreatePattern(const JSCallbackInfo& info); 112 void JsCreateImageData(const JSCallbackInfo& info); 113 void JsPutImageData(const JSCallbackInfo& info); 114 void JsGetImageData(const JSCallbackInfo& info); 115 void JsGetJsonData(const JSCallbackInfo& info); 116 void JsSetTextAlign(const JSCallbackInfo& info); 117 void JsSetTextBaseline(const JSCallbackInfo& info); 118 void JsSetImageSmoothingQuality(const JSCallbackInfo& info); 119 void JsGetPixelMap(const JSCallbackInfo& info); 120 void JsSetPixelMap(const JSCallbackInfo& info); 121 void JsDrawBitmapMesh(const JSCallbackInfo& info); 122 void JsSetFilter(const JSCallbackInfo& info); 123 void JsSetDirection(const JSCallbackInfo& info); 124 void JsReset(const JSCallbackInfo& info); 125 void JsSetLetterSpacing(const JSCallbackInfo& info); 126 JSGetEmpty(const JSCallbackInfo & info)127 void JSGetEmpty(const JSCallbackInfo& info) 128 { 129 return; 130 } 131 SetCanvasPattern(const RefPtr<AceType> & canvas)132 void SetCanvasPattern(const RefPtr<AceType>& canvas) override 133 { 134 renderingContext2DModel_->SetPattern(canvas); 135 if (isInitializeShadow_) { 136 return; 137 } 138 isInitializeShadow_ = true; 139 renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT); 140 } 141 SetOffscreenPattern(const RefPtr<AceType> & offscreenCanvas)142 void SetOffscreenPattern(const RefPtr<AceType>& offscreenCanvas) 143 { 144 offscreenPattern_ = offscreenCanvas; 145 renderingContext2DModel_->SetPattern(offscreenCanvas); 146 if (isOffscreenInitializeShadow_) { 147 return; 148 } 149 isOffscreenInitializeShadow_ = true; 150 renderingContext2DModel_->SetShadowColor(Color::TRANSPARENT); 151 } 152 SetAnti(bool anti)153 void SetAnti(bool anti) 154 { 155 anti_ = anti; 156 } 157 GetAnti()158 bool GetAnti() 159 { 160 return anti_; 161 } 162 SetUnit(CanvasUnit unit)163 void SetUnit(CanvasUnit unit) 164 { 165 unit_ = unit; 166 } 167 GetUnit()168 CanvasUnit GetUnit() 169 { 170 return unit_; 171 } 172 173 inline double GetDensity(bool useSystemDensity = false) 174 { 175 if (useSystemDensity) { 176 return !NearZero(density_) ? density_ : 1.0; 177 } else { 178 return ((GetUnit() == CanvasUnit::DEFAULT) && !NearZero(density_)) ? density_ : 1.0; 179 } 180 } 181 SetInstanceId(int32_t id)182 void SetInstanceId(int32_t id) override 183 { 184 instanceId_ = id; 185 } 186 187 void SetTransform(unsigned int id, const TransformParam&); 188 189 void ResetPaintState(); 190 ACE_DISALLOW_COPY_AND_MOVE(JSCanvasRenderer); 191 192 protected: 193 void ParseFillGradient(const JSCallbackInfo& info); 194 void ParseFillPattern(const JSCallbackInfo& info); 195 void ParseStorkeGradient(const JSCallbackInfo& info); 196 void ParseStrokePattern(const JSCallbackInfo& info); 197 JSRenderImage* UnwrapNapiImage(const JSRef<JSObject> jsObject); 198 199 protected: 200 bool isJudgeSpecialValue_ = false; 201 RefPtr<RenderingContext2DModel> renderingContext2DModel_; 202 bool anti_ = false; 203 204 RefPtr<AceType> offscreenPattern_; 205 206 int32_t instanceId_ = INSTANCE_ID_UNDEFINED; 207 208 int32_t apiVersion_ = 0; 209 210 private: 211 void ExtractInfoToImage(CanvasImage& image, const JSCallbackInfo& info, bool isImage); 212 JSRef<JSObject> createGradientObj(const std::shared_ptr<Gradient>& gradient); 213 void DrawSvgImage(const JSCallbackInfo& info, JSRenderImage* jsImage); 214 void DrawImage(const JSCallbackInfo& info, JSRenderImage* jsImage); 215 void DrawPixelMap(const JSCallbackInfo& info); 216 217 PaintState paintState_; 218 std::vector<PaintState> savePaintState_; 219 bool isInitializeShadow_ = false; 220 bool isOffscreenInitializeShadow_ = false; 221 Dimension GetDimensionValue(const std::string& str); 222 bool IsCustomFont(const std::string& fontName); 223 bool IsValidLetterSpacing(const std::string& letterSpacing); 224 CanvasUnit unit_ = CanvasUnit::DEFAULT; 225 double density_ = 1.0; 226 int32_t densityCallbackId_ = 0; 227 }; 228 229 } // namespace OHOS::Ace::Framework 230 231 #endif // FOUNDATION_ACE_FRAMEWORK_JAVASCRIPT_BRIDGE_JS_VIEW_JS_CANVAS_RENDERER_H 232