• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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