• 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 
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