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 void CreatePixelMapUsingAllocatorComplete(napi_env env, napi_status status, void *data); 101 static napi_value ThrowExceptionError(napi_env env, 102 const std::string &tag, const std::uint32_t &code, const std::string &info); 103 104 // methods 105 static napi_value ReadPixelsToBuffer(napi_env env, napi_callback_info info); 106 static napi_value ReadPixelsToBufferSync(napi_env env, napi_callback_info info); 107 static napi_value ReadPixels(napi_env env, napi_callback_info info); 108 static napi_value ReadPixelsSync(napi_env env, napi_callback_info info); 109 static napi_value WritePixels(napi_env env, napi_callback_info info); 110 static napi_value WritePixelsSync(napi_env env, napi_callback_info info); 111 static napi_value WriteBufferToPixels(napi_env env, napi_callback_info info); 112 static napi_value WriteBufferToPixelsSync(napi_env env, napi_callback_info info); 113 static napi_value GetImageInfo(napi_env env, napi_callback_info info); 114 static napi_value GetImageInfoSync(napi_env env, napi_callback_info info); 115 static napi_value GetBytesNumberPerRow(napi_env env, napi_callback_info info); 116 static napi_value GetPixelBytesNumber(napi_env env, napi_callback_info info); 117 static napi_value getPixelBytesCount(napi_env env, napi_callback_info info); 118 static napi_value IsSupportAlpha(napi_env env, napi_callback_info info); 119 static napi_value SetAlphaAble(napi_env env, napi_callback_info info); 120 static napi_value CreatePixelMapUsingAllocator(napi_env env, napi_callback_info info); 121 static napi_value CreatePixelMapUsingAllocatorSync(napi_env env, napi_callback_info info); 122 static napi_value CreateAlphaPixelmap(napi_env env, napi_callback_info info); 123 static napi_value CreateAlphaPixelmapSync(napi_env env, napi_callback_info info); 124 static napi_value GetDensity(napi_env env, napi_callback_info info); 125 static napi_value SetDensity(napi_env env, napi_callback_info info); 126 static napi_value Release(napi_env env, napi_callback_info info); 127 static napi_value SetAlpha(napi_env env, napi_callback_info info); 128 static napi_value SetAlphaSync(napi_env env, napi_callback_info info); 129 130 static napi_value Scale(napi_env env, napi_callback_info info); 131 static napi_value ScaleSync(napi_env env, napi_callback_info info); 132 static napi_value CreateScaledPixelMap(napi_env env, napi_callback_info info); 133 static napi_value CreateScaledPixelMapSync(napi_env env, napi_callback_info info); 134 static napi_value Translate(napi_env env, napi_callback_info info); 135 static napi_value TranslateSync(napi_env env, napi_callback_info info); 136 static napi_value Rotate(napi_env env, napi_callback_info info); 137 static napi_value RotateSync(napi_env env, napi_callback_info info); 138 static napi_value Flip(napi_env env, napi_callback_info info); 139 static napi_value FlipSync(napi_env env, napi_callback_info info); 140 static napi_value Crop(napi_env env, napi_callback_info info); 141 static napi_value CropSync(napi_env env, napi_callback_info info); 142 static napi_value ToSdr(napi_env env, napi_callback_info info); 143 144 static napi_value GetColorSpace(napi_env env, napi_callback_info info); 145 static napi_value SetColorSpace(napi_env env, napi_callback_info info); 146 static napi_value Marshalling(napi_env env, napi_callback_info info); 147 static napi_value ApplyColorSpace(napi_env env, napi_callback_info info); 148 static ImageType ParserImageType(napi_env env, napi_value argv); 149 static napi_value ConvertPixelMapFormat(napi_env env, napi_callback_info info); 150 static napi_value SetTransferDetached(napi_env env, napi_callback_info info); 151 static napi_value GetMetadata(napi_env env, napi_callback_info info); 152 static napi_value SetMetadata(napi_env env, napi_callback_info info); 153 static napi_value SetMetadataSync(napi_env env, napi_callback_info info); 154 static napi_value SetMemoryNameSync(napi_env env, napi_callback_info info); 155 static napi_value CloneSync(napi_env env, napi_callback_info info); 156 static napi_value Clone(napi_env env, napi_callback_info info); 157 static void ExtraAddNapiFunction(std::vector<napi_property_descriptor> &props); 158 static std::vector<napi_property_descriptor> RegisterNapi(); 159 160 void release(); 161 static thread_local napi_ref sConstructor_; 162 napi_env env_ = nullptr; 163 std::shared_ptr<PixelMap> nativePixelMap_; 164 int32_t lockCount = 0; 165 bool isRelease = false; 166 bool isPixelNapiEditable = true; 167 uint32_t uniqueId_ = 0; 168 bool transferDetach_ = false; 169 static napi_ref AntiAliasingLevel_; 170 static napi_ref HdrMetadataKey_; 171 static napi_ref HdrMetadataType_; 172 }; 173 174 class PixelMapContainer { 175 public: GetInstance()176 static PixelMapContainer& GetInstance() 177 { 178 static PixelMapContainer source; 179 return source; 180 } 181 182 std::shared_ptr<PixelMap>& operator[](const uint64_t &key) 183 { 184 std::shared_lock<std::shared_mutex> lock(mutex_); 185 return map_[key]; 186 } 187 IsEmpty()188 bool IsEmpty() 189 { 190 return map_.empty(); 191 } 192 Insert(const uint64_t & key,const std::shared_ptr<PixelMap> & value)193 bool Insert(const uint64_t &key, const std::shared_ptr<PixelMap> &value) 194 { 195 std::unique_lock<std::shared_mutex> lock(mutex_); 196 if (!IsEmpty() && (map_.find(key) != map_.end())) map_.erase(key); 197 auto ret = map_.insert(std::pair<uint64_t, std::shared_ptr<PixelMap>>(key, value)); 198 return ret.second; 199 } 200 Find(const uint64_t & key)201 bool Find(const uint64_t &key) 202 { 203 std::shared_lock<std::shared_mutex> lock(mutex_); 204 auto it = map_.find(key); 205 return it != map_.end() ? true : false; 206 } 207 Erase(const uint64_t & key)208 void Erase(const uint64_t &key) 209 { 210 std::unique_lock<std::shared_mutex> lock(mutex_); 211 if (map_.find(key) != map_.end()) { 212 map_.erase(key); 213 } 214 return; 215 } 216 Clear()217 void Clear() 218 { 219 std::unique_lock<std::shared_mutex> lock(mutex_); 220 map_.clear(); 221 return; 222 } 223 224 private: 225 PixelMapContainer() = default; 226 PixelMapContainer(const PixelMapContainer&) = delete; 227 PixelMapContainer(const PixelMapContainer&&) = delete; 228 PixelMapContainer &operator=(const PixelMapContainer&) = delete; 229 std::shared_mutex mutex_; 230 std::map<uint64_t, std::shared_ptr<PixelMap>> map_; 231 }; 232 } // namespace Media 233 } // namespace OHOS 234 #endif // INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H 235