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 FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_RENDER_IMAGE_H 17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_RENDER_IMAGE_H 18 19 #include "base/geometry/ng/size_t.h" 20 #include "base/memory/referenced.h" 21 #include "bridge/declarative_frontend/engine/bindings_defines.h" 22 #include "core/components_ng/image_provider/svg_dom_base.h" 23 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h" 24 #include "frameworks/core/components_ng/image_provider/image_loading_context.h" 25 26 namespace OHOS::Ace::Framework { 27 28 void BindNativeFunction(napi_env env, napi_value object, const char* name, napi_callback func); 29 void* GetNapiCallbackInfoAndThis(napi_env env, napi_callback_info info); 30 31 class JSRenderImage : public Referenced { 32 public: 33 JSRenderImage(); 34 ~JSRenderImage() override = default; 35 36 static void JSBind(BindingTarget globalObj, void* nativeEngine = nullptr); 37 static void Finalizer(napi_env env, void* data, void* hint); 38 39 static napi_value InitImageBitmap(napi_env env); 40 static napi_value Constructor(napi_env env, napi_callback_info info); 41 static napi_value JsClose(napi_env env, napi_callback_info info); 42 static napi_value JsSetWidth(napi_env env, napi_callback_info info); 43 static napi_value JsSetHeight(napi_env env, napi_callback_info info); 44 static napi_value JsGetWidth(napi_env env, napi_callback_info info); 45 static napi_value JsGetHeight(napi_env env, napi_callback_info info); 46 static bool CreateJSRenderImage(napi_env env, RefPtr<PixelMap> pixelMap, napi_value& renderImage); 47 48 double GetWidth(); 49 void SetWidth(double width); 50 double GetHeight(); 51 void SetHeight(double height); 52 std::string GetSrc(); 53 void SetCloseCallback(std::function<void()>&& callback); GetPixelMap()54 RefPtr<PixelMap> GetPixelMap() const 55 { 56 return pixelMap_; 57 } 58 GetImageData()59 std::shared_ptr<Ace::ImageData> GetImageData() const 60 { 61 return imageData_; 62 } 63 SetImageData(const std::shared_ptr<Ace::ImageData> & imageData)64 void SetImageData(const std::shared_ptr<Ace::ImageData>& imageData) 65 { 66 imageData_ = imageData; 67 } 68 GetSvgDom()69 RefPtr<NG::SvgDomBase> GetSvgDom() 70 { 71 return svgDom_; 72 } 73 SetInstanceId(int32_t instanceId)74 void SetInstanceId(int32_t instanceId) 75 { 76 instanceId_ = instanceId; 77 } 78 GetInstanceId()79 int32_t GetInstanceId() 80 { 81 return instanceId_; 82 } 83 IsSvg()84 bool IsSvg() 85 { 86 return sourceInfo_.IsSvg(); 87 } 88 GetImageFit()89 ImageFit GetImageFit() 90 { 91 return imageFit_; 92 } 93 GetImageSize()94 NG::SizeF GetImageSize() 95 { 96 return imageSize_; 97 } 98 SetUnit(CanvasUnit unit)99 void SetUnit(CanvasUnit unit) 100 { 101 unit_ = unit; 102 } 103 GetUnit()104 CanvasUnit GetUnit() 105 { 106 return unit_; 107 } 108 GetDensity()109 double GetDensity() 110 { 111 double density = PipelineBase::GetCurrentDensity(); 112 return ((GetUnit() == CanvasUnit::DEFAULT) && !NearZero(density)) ? density : 1.0; 113 } 114 GetBindingSize()115 size_t GetBindingSize() const 116 { 117 return bindingSize_; 118 } 119 120 ACE_DISALLOW_COPY_AND_MOVE(JSRenderImage); 121 private: 122 napi_value OnClose(); 123 napi_value OnGetWidth(napi_env env); 124 napi_value OnGetHeight(napi_env env); 125 napi_value OnSetWidth(); 126 napi_value OnSetHeight(); 127 128 void LoadImage(const std::string& src); 129 void LoadImage(const RefPtr<PixelMap>& pixmap); 130 void LoadImage(const ImageSourceInfo& src); 131 void OnImageDataReady(); 132 void OnImageLoadFail(const std::string& errorMsg); 133 void OnImageLoadSuccess(); 134 static bool NotFormSupport(const std::string& textString); 135 static std::string GetSrcString(napi_env env, napi_value value, size_t textLen); 136 #ifdef PIXEL_MAP_SUPPORTED 137 static RefPtr<PixelMap> GetPixelMap(napi_env env, napi_value value); 138 #endif 139 140 RefPtr<NG::CanvasImage> image_; 141 RefPtr<NG::ImageObject> imageObj_; 142 RefPtr<NG::ImageLoadingContext> loadingCtx_; 143 RefPtr<PixelMap> pixelMap_; 144 std::shared_ptr<Ace::ImageData> imageData_; 145 RefPtr<NG::SvgDomBase> svgDom_; 146 ImageSourceInfo sourceInfo_; 147 ImageFit imageFit_ = ImageFit::NONE; 148 NG::SizeF imageSize_; 149 150 std::string src_; 151 std::list<std::function<void()>> closeCallbacks_; 152 double width_ = 0; 153 double height_ = 0; 154 int32_t instanceId_ = 0; 155 CanvasUnit unit_ = CanvasUnit::DEFAULT; 156 size_t bindingSize_ = 0; 157 }; 158 159 } // namespace OHOS::Ace::Framework 160 161 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_RENDER_IMAGE_H 162