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 25 namespace OHOS { 26 namespace Media { 27 class PixelMapNapi { 28 public: 29 PixelMapNapi(); 30 ~PixelMapNapi(); 31 32 static napi_value Init(napi_env env, napi_value exports); 33 34 static napi_value CreatePixelMap(napi_env env, std::shared_ptr<PixelMap> pixelmap); 35 static std::shared_ptr<PixelMap> GetPixelMap(napi_env env, napi_value pixelmap); 36 std::shared_ptr<PixelMap>* GetPixelMap(); GetPixelNapiInner()37 std::shared_ptr<PixelMap> GetPixelNapiInner() 38 { 39 return nativePixelMap_; 40 } setPixelNapiEditable(bool isEditable)41 void setPixelNapiEditable(bool isEditable) 42 { 43 isPixelNapiEditable = isEditable; 44 } GetPixelNapiEditable()45 bool GetPixelNapiEditable() 46 { 47 return isPixelNapiEditable; 48 } GetUniqueId()49 uint32_t GetUniqueId() 50 { 51 return uniqueId_; 52 } 53 bool IsLockPixelMap(); 54 bool LockPixelMap(); 55 void UnlockPixelMap(); GetConstructor()56 static napi_ref GetConstructor() 57 { 58 return sConstructor_; 59 } 60 private: 61 static napi_value Constructor(napi_env env, napi_callback_info info); 62 static void Destructor(napi_env env, void *nativeObject, void *finalize); 63 64 // readonly property 65 static napi_value GetIsEditable(napi_env env, napi_callback_info info); 66 static napi_value GetIsStrideAlignment(napi_env env, napi_callback_info info); 67 68 // static mothod 69 static napi_value CreatePixelMap(napi_env env, napi_callback_info info); 70 static void CreatePixelMapComplete(napi_env env, napi_status status, void *data); 71 static napi_value Unmarshalling(napi_env env, napi_callback_info info); 72 static void UnmarshallingComplete(napi_env env, napi_status status, void *data); 73 static napi_value CreatePixelMapFromParcel(napi_env env, napi_callback_info info); 74 static napi_value CreatePixelMapFromSurface(napi_env env, napi_callback_info info); 75 static void CreatePixelMapFromSurfaceComplete(napi_env env, napi_status status, void *data); 76 static napi_value ThrowExceptionError(napi_env env, 77 const std::string &tag, const std::uint32_t &code, const std::string &info); 78 79 // methods 80 static napi_value ReadPixelsToBuffer(napi_env env, napi_callback_info info); 81 static napi_value ReadPixels(napi_env env, napi_callback_info info); 82 static napi_value WritePixels(napi_env env, napi_callback_info info); 83 static napi_value WriteBufferToPixels(napi_env env, napi_callback_info info); 84 static napi_value GetImageInfo(napi_env env, napi_callback_info info); 85 static napi_value GetBytesNumberPerRow(napi_env env, napi_callback_info info); 86 static napi_value GetPixelBytesNumber(napi_env env, napi_callback_info info); 87 static napi_value getPixelBytesCount(napi_env env, napi_callback_info info); 88 static napi_value IsSupportAlpha(napi_env env, napi_callback_info info); 89 static napi_value SetAlphaAble(napi_env env, napi_callback_info info); 90 static napi_value CreateAlphaPixelmap(napi_env env, napi_callback_info info); 91 static napi_value GetDensity(napi_env env, napi_callback_info info); 92 static napi_value SetDensity(napi_env env, napi_callback_info info); 93 static napi_value Release(napi_env env, napi_callback_info info); 94 static napi_value SetAlpha(napi_env env, napi_callback_info info); 95 96 static napi_value Scale(napi_env env, napi_callback_info info); 97 static napi_value Translate(napi_env env, napi_callback_info info); 98 static napi_value Rotate(napi_env env, napi_callback_info info); 99 static napi_value Flip(napi_env env, napi_callback_info info); 100 static napi_value Crop(napi_env env, napi_callback_info info); 101 102 static napi_value GetColorSpace(napi_env env, napi_callback_info info); 103 static napi_value SetColorSpace(napi_env env, napi_callback_info info); 104 static napi_value Marshalling(napi_env env, napi_callback_info info); 105 static napi_value ApplyColorSpace(napi_env env, napi_callback_info info); 106 107 void release(); 108 static thread_local napi_ref sConstructor_; 109 napi_env env_ = nullptr; 110 std::shared_ptr<PixelMap> nativePixelMap_; 111 int32_t lockCount = 0; 112 bool isRelease = false; 113 bool isPixelNapiEditable = true; 114 uint32_t uniqueId_ = 0; 115 }; 116 117 class PixelMapContainer { 118 public: GetInstance()119 static PixelMapContainer& GetInstance() 120 { 121 static PixelMapContainer source; 122 return source; 123 } 124 125 std::shared_ptr<PixelMap>& operator[](const uint32_t &key) 126 { 127 return map_[key]; 128 } 129 IsEmpty()130 bool IsEmpty() 131 { 132 return map_.empty(); 133 } 134 Insert(const uint32_t & key,const std::shared_ptr<PixelMap> & value)135 bool Insert(const uint32_t &key, const std::shared_ptr<PixelMap> &value) 136 { 137 std::lock_guard<std::mutex> lock(mutex_); 138 if (!IsEmpty() && (map_.find(key) != map_.end())) map_.erase(key); 139 auto ret = map_.insert(std::pair<uint32_t, std::shared_ptr<PixelMap>>(key, value)); 140 return ret.second; 141 } 142 Find(const uint32_t & key)143 bool Find(const uint32_t &key) 144 { 145 std::lock_guard<std::mutex> lock(mutex_); 146 auto it = map_.find(key); 147 return it != map_.end() ? true : false; 148 } 149 Erase(const uint32_t & key)150 void Erase(const uint32_t &key) 151 { 152 std::lock_guard<std::mutex> lock(mutex_); 153 if (map_.find(key) != map_.end()) { 154 map_.erase(key); 155 } 156 return; 157 } 158 Clear()159 void Clear() 160 { 161 std::lock_guard<std::mutex> lock(mutex_); 162 map_.clear(); 163 return; 164 } 165 166 private: 167 PixelMapContainer() = default; 168 PixelMapContainer(const PixelMapContainer&) = delete; 169 PixelMapContainer(const PixelMapContainer&&) = delete; 170 PixelMapContainer &operator=(const PixelMapContainer&) = delete; 171 std::mutex mutex_; 172 std::map<uint32_t, std::shared_ptr<PixelMap>> map_; 173 }; 174 } // namespace Media 175 } // namespace OHOS 176 #endif // INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H 177