1 /* 2 * Copyright (C) 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 INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H 17 #define INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H 18 19 #include "pixel_map.h" 20 #include "image_type.h" 21 #include "image_source.h" 22 #include "napi/native_api.h" 23 #include "napi/native_node_api.h" 24 #include <shared_mutex> 25 26 namespace OHOS { 27 namespace Media { 28 enum class ImageType { 29 TYPE_UNKNOWN = 0, 30 TYPE_PIXEL_MAP = 1 31 }; 32 class PixelMapNapi { 33 public: 34 PixelMapNapi(); 35 ~PixelMapNapi(); 36 37 static napi_value Init(napi_env env, napi_value exports); 38 39 static napi_value CreatePixelMap(napi_env env, std::shared_ptr<PixelMap> pixelmap); 40 static std::shared_ptr<PixelMap> GetPixelMap(napi_env env, napi_value pixelmap); 41 static std::shared_ptr<std::vector<std::shared_ptr<PixelMap>>> GetPixelMaps(napi_env env, napi_value pixelmaps); 42 std::shared_ptr<PixelMap>* GetPixelMap(); GetPixelNapiInner()43 std::shared_ptr<PixelMap> GetPixelNapiInner() 44 { 45 return nativePixelMap_; 46 } ReleasePixelNapiInner()47 void ReleasePixelNapiInner() 48 { 49 setPixelNapiEditable(false); 50 nativePixelMap_ = nullptr; 51 } setPixelNapiEditable(bool isEditable)52 void setPixelNapiEditable(bool isEditable) 53 { 54 isPixelNapiEditable = isEditable; 55 } GetPixelNapiEditable()56 bool GetPixelNapiEditable() 57 { 58 return isPixelNapiEditable; 59 } GetUniqueId()60 uint32_t GetUniqueId() 61 { 62 return uniqueId_; 63 } 64 bool IsLockPixelMap(); 65 bool LockPixelMap(); 66 void UnlockPixelMap(); GetConstructor()67 static napi_ref GetConstructor() 68 { 69 return sConstructor_; 70 } SetTransferDetach(bool detach)71 void SetTransferDetach(bool detach) 72 { 73 transferDetach_ = detach; 74 } GetTransferDetach()75 bool GetTransferDetach() 76 { 77 return transferDetach_; 78 } 79 private: 80 static napi_value Constructor(napi_env env, napi_callback_info info); 81 static void Destructor(napi_env env, void *nativeObject, void *finalize); 82 83 // readonly property 84 static napi_value GetIsEditable(napi_env env, napi_callback_info info); 85 static napi_value GetIsStrideAlignment(napi_env env, napi_callback_info info); 86 87 /* stattic method */ 88 static napi_value CreatePixelMap(napi_env env, napi_callback_info info); 89 static napi_value CreatePremultipliedPixelMap(napi_env env, napi_callback_info info); 90 static napi_value CreateUnpremultipliedPixelMap(napi_env env, napi_callback_info info); 91 /* stattic method */ 92 static napi_value CreatePixelMapSync(napi_env env, napi_callback_info info); 93 static void CreatePixelMapComplete(napi_env env, napi_status status, void *data); 94 static napi_value Unmarshalling(napi_env env, napi_callback_info info); 95 static void UnmarshallingComplete(napi_env env, napi_status status, void *data); 96 static napi_value CreatePixelMapFromParcel(napi_env env, napi_callback_info info); 97 static napi_value CreatePixelMapFromSurface(napi_env env, napi_callback_info info); 98 static napi_value CreatePixelMapFromSurfaceSync(napi_env env, napi_callback_info info); 99 static void CreatePixelMapFromSurfaceComplete(napi_env env, napi_status status, void *data); 100 static napi_value ThrowExceptionError(napi_env env, 101 const std::string &tag, const std::uint32_t &code, const std::string &info); 102 103 // methods 104 static napi_value ReadPixelsToBuffer(napi_env env, napi_callback_info info); 105 static napi_value ReadPixelsToBufferSync(napi_env env, napi_callback_info info); 106 static napi_value ReadPixels(napi_env env, napi_callback_info info); 107 static napi_value ReadPixelsSync(napi_env env, napi_callback_info info); 108 static napi_value WritePixels(napi_env env, napi_callback_info info); 109 static napi_value WritePixelsSync(napi_env env, napi_callback_info info); 110 static napi_value WriteBufferToPixels(napi_env env, napi_callback_info info); 111 static napi_value WriteBufferToPixelsSync(napi_env env, napi_callback_info info); 112 static napi_value GetImageInfo(napi_env env, napi_callback_info info); 113 static napi_value GetImageInfoSync(napi_env env, napi_callback_info info); 114 static napi_value GetBytesNumberPerRow(napi_env env, napi_callback_info info); 115 static napi_value GetPixelBytesNumber(napi_env env, napi_callback_info info); 116 static napi_value getPixelBytesCount(napi_env env, napi_callback_info info); 117 static napi_value IsSupportAlpha(napi_env env, napi_callback_info info); 118 static napi_value SetAlphaAble(napi_env env, napi_callback_info info); 119 static napi_value CreateAlphaPixelmap(napi_env env, napi_callback_info info); 120 static napi_value CreateAlphaPixelmapSync(napi_env env, napi_callback_info info); 121 static napi_value GetDensity(napi_env env, napi_callback_info info); 122 static napi_value SetDensity(napi_env env, napi_callback_info info); 123 static napi_value Release(napi_env env, napi_callback_info info); 124 static napi_value SetAlpha(napi_env env, napi_callback_info info); 125 static napi_value SetAlphaSync(napi_env env, napi_callback_info info); 126 127 static napi_value Scale(napi_env env, napi_callback_info info); 128 static napi_value ScaleSync(napi_env env, napi_callback_info info); 129 static napi_value Translate(napi_env env, napi_callback_info info); 130 static napi_value TranslateSync(napi_env env, napi_callback_info info); 131 static napi_value Rotate(napi_env env, napi_callback_info info); 132 static napi_value RotateSync(napi_env env, napi_callback_info info); 133 static napi_value Flip(napi_env env, napi_callback_info info); 134 static napi_value FlipSync(napi_env env, napi_callback_info info); 135 static napi_value Crop(napi_env env, napi_callback_info info); 136 static napi_value CropSync(napi_env env, napi_callback_info info); 137 static napi_value ToSdr(napi_env env, napi_callback_info info); 138 139 static napi_value GetColorSpace(napi_env env, napi_callback_info info); 140 static napi_value SetColorSpace(napi_env env, napi_callback_info info); 141 static napi_value Marshalling(napi_env env, napi_callback_info info); 142 static napi_value ApplyColorSpace(napi_env env, napi_callback_info info); 143 static ImageType ParserImageType(napi_env env, napi_value argv); 144 static napi_value ConvertPixelMapFormat(napi_env env, napi_callback_info info); 145 static napi_value SetTransferDetached(napi_env env, napi_callback_info info); 146 static napi_value GetMetadata(napi_env env, napi_callback_info info); 147 static napi_value SetMetadata(napi_env env, napi_callback_info info); 148 static napi_value SetMetadataSync(napi_env env, napi_callback_info info); 149 static napi_value SetMemoryNameSync(napi_env env, napi_callback_info info); 150 static std::vector<napi_property_descriptor> RegisterNapi(); 151 152 void release(); 153 static thread_local napi_ref sConstructor_; 154 napi_env env_ = nullptr; 155 std::shared_ptr<PixelMap> nativePixelMap_; 156 int32_t lockCount = 0; 157 bool isRelease = false; 158 bool isPixelNapiEditable = true; 159 uint32_t uniqueId_ = 0; 160 bool transferDetach_ = false; 161 static napi_ref AntiAliasingLevel_; 162 static napi_ref HdrMetadataKey_; 163 static napi_ref HdrMetadataType_; 164 }; 165 166 class PixelMapContainer { 167 public: GetInstance()168 static PixelMapContainer& GetInstance() 169 { 170 static PixelMapContainer source; 171 return source; 172 } 173 174 std::shared_ptr<PixelMap>& operator[](const uint32_t &key) 175 { 176 std::shared_lock<std::shared_mutex> lock(mutex_); 177 return map_[key]; 178 } 179 IsEmpty()180 bool IsEmpty() 181 { 182 return map_.empty(); 183 } 184 Insert(const uint32_t & key,const std::shared_ptr<PixelMap> & value)185 bool Insert(const uint32_t &key, const std::shared_ptr<PixelMap> &value) 186 { 187 std::unique_lock<std::shared_mutex> lock(mutex_); 188 if (!IsEmpty() && (map_.find(key) != map_.end())) map_.erase(key); 189 auto ret = map_.insert(std::pair<uint32_t, std::shared_ptr<PixelMap>>(key, value)); 190 return ret.second; 191 } 192 Find(const uint32_t & key)193 bool Find(const uint32_t &key) 194 { 195 std::shared_lock<std::shared_mutex> lock(mutex_); 196 auto it = map_.find(key); 197 return it != map_.end() ? true : false; 198 } 199 Erase(const uint32_t & key)200 void Erase(const uint32_t &key) 201 { 202 std::unique_lock<std::shared_mutex> lock(mutex_); 203 if (map_.find(key) != map_.end()) { 204 map_.erase(key); 205 } 206 return; 207 } 208 Clear()209 void Clear() 210 { 211 std::unique_lock<std::shared_mutex> lock(mutex_); 212 map_.clear(); 213 return; 214 } 215 216 private: 217 PixelMapContainer() = default; 218 PixelMapContainer(const PixelMapContainer&) = delete; 219 PixelMapContainer(const PixelMapContainer&&) = delete; 220 PixelMapContainer &operator=(const PixelMapContainer&) = delete; 221 std::shared_mutex mutex_; 222 std::map<uint32_t, std::shared_ptr<PixelMap>> map_; 223 }; 224 } // namespace Media 225 } // namespace OHOS 226 #endif // INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H 227