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