1 /*
2  * Copyright (C) 2024 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 #include "heif_image.h"
17 
18 const int ROTATE_90_DEGRESS = 90;
19 const int ROTATE_270_DEGRESS = 270;
20 static const std::string HEVC_ALPHA_AUX_TYPE = "urn:mpeg:hevc:2015:auxid:1";
21 
22 namespace OHOS {
23 namespace ImagePlugin {
HeifImage(heif_item_id itemId)24 HeifImage::HeifImage(heif_item_id itemId) : itemId_(itemId) {}
25 
~HeifImage()26 HeifImage::~HeifImage()
27 {
28     m_thumbnails.clear();
29     allMetadata_.clear();
30     auxImages_.clear();
31     nclxColorProfile_.reset();
32     rawColorProfile_.reset();
33 }
34 
GetItemId() const35 heif_item_id HeifImage::GetItemId() const
36 {
37     return itemId_;
38 }
39 
IsPrimaryImage() const40 bool HeifImage::IsPrimaryImage() const
41 {
42     return isPrimaryImage_;
43 }
44 
SetPrimaryImage(bool flag)45 void HeifImage::SetPrimaryImage(bool flag)
46 {
47     isPrimaryImage_ = flag;
48 }
49 
GetOriginalWidth() const50 uint32_t HeifImage::GetOriginalWidth() const
51 {
52     return originalWidth_;
53 }
54 
GetOriginalHeight() const55 uint32_t HeifImage::GetOriginalHeight() const
56 {
57     return originalHeight_;
58 }
59 
SetOriginalSize(uint32_t width,uint32_t height)60 void HeifImage::SetOriginalSize(uint32_t width, uint32_t height)
61 {
62     originalWidth_ = width;
63     originalHeight_ = height;
64 }
65 
GetRotateDegrees() const66 int HeifImage::GetRotateDegrees() const
67 {
68     return rotateDegrees_;
69 }
70 
SetRotateDegrees(int degrees)71 void HeifImage::SetRotateDegrees(int degrees)
72 {
73     rotateDegrees_ = degrees;
74 }
75 
GetMirrorDirection() const76 HeifTransformMirrorDirection HeifImage::GetMirrorDirection() const
77 {
78     return mirrorDirection_;
79 }
80 
SetMirrorDirection(HeifTransformMirrorDirection direction)81 void HeifImage::SetMirrorDirection(HeifTransformMirrorDirection direction)
82 {
83     mirrorDirection_ = direction;
84 }
85 
IsResolutionReverse() const86 bool HeifImage::IsResolutionReverse() const
87 {
88     return rotateDegrees_ == ROTATE_90_DEGRESS || rotateDegrees_ == ROTATE_270_DEGRESS;
89 }
90 
GetWidth() const91 uint32_t HeifImage::GetWidth() const
92 {
93     return IsResolutionReverse() ? originalHeight_ : originalWidth_;
94 }
95 
GetHeight() const96 uint32_t HeifImage::GetHeight() const
97 {
98     return IsResolutionReverse() ? originalWidth_ : originalHeight_;
99 }
100 
GetLumaBitNum() const101 int HeifImage::GetLumaBitNum() const
102 {
103     return lumaBitNum_;
104 }
105 
SetLumaBitNum(int bitNum)106 void HeifImage::SetLumaBitNum(int bitNum)
107 {
108     lumaBitNum_ = bitNum;
109 }
110 
GetChromaBitNum() const111 int HeifImage::GetChromaBitNum() const
112 {
113     return chromaBitNum_;
114 }
115 
SetChromaBitNum(int bitNum)116 void HeifImage::SetChromaBitNum(int bitNum)
117 {
118     chromaBitNum_ = bitNum;
119 }
120 
GetColorRangeFlag() const121 int HeifImage::GetColorRangeFlag() const
122 {
123     return colorRangeFlag_;
124 }
125 
126 
SetColorRangeFlag(int flag)127 void HeifImage::SetColorRangeFlag(int flag)
128 {
129     colorRangeFlag_ = flag;
130 }
131 
GetDefaultColorFormat() const132 HeifColorFormat HeifImage::GetDefaultColorFormat() const
133 {
134     return defaultColorFormat_;
135 }
136 
SetDefaultColorFormat(HeifColorFormat format)137 void HeifImage::SetDefaultColorFormat(HeifColorFormat format)
138 {
139     defaultColorFormat_ = format;
140 }
141 
GetDefaultPixelFormat() const142 HeifPixelFormat HeifImage::GetDefaultPixelFormat() const
143 {
144     return defaultPixelFormat_;
145 }
146 
SetDefaultPixelFormat(HeifPixelFormat format)147 void HeifImage::SetDefaultPixelFormat(HeifPixelFormat format)
148 {
149     defaultPixelFormat_ = format;
150 }
151 
SetThumbnailImage(heif_item_id id)152 void HeifImage::SetThumbnailImage(heif_item_id id)
153 {
154     thumbnailMasterItemId_ = id;
155 }
156 
AddThumbnailImage(const std::shared_ptr<HeifImage> & img)157 void HeifImage::AddThumbnailImage(const std::shared_ptr<HeifImage> &img)
158 {
159     m_thumbnails.push_back(img);
160 }
161 
IsThumbnailImage() const162 bool HeifImage::IsThumbnailImage() const
163 {
164     return thumbnailMasterItemId_ != 0;
165 }
166 
GetThumbnailImages() const167 const std::vector<std::shared_ptr<HeifImage>> &HeifImage::GetThumbnailImages() const
168 {
169     return m_thumbnails;
170 }
171 
IsAuxImage() const172 bool HeifImage::IsAuxImage() const
173 {
174     return auxMasterItemId_ != 0;
175 }
176 
GetAuxImageType() const177 const std::string &HeifImage::GetAuxImageType() const
178 {
179     return auxType_;
180 }
181 
GetAuxImages() const182 std::vector<std::shared_ptr<HeifImage>> HeifImage::GetAuxImages() const
183 {
184     return auxImages_;
185 }
186 
GetAlphaImage() const187 std::shared_ptr<HeifImage> HeifImage::GetAlphaImage() const
188 {
189     for (std::shared_ptr<HeifImage> auxImage: auxImages_) {
190         if (auxImage != nullptr && auxImage->IsAuxImage() && auxImage->GetAuxImageType() == HEVC_ALPHA_AUX_TYPE) {
191             return auxImage;
192         }
193     }
194     return nullptr;
195 }
196 
SetAuxImage(heif_item_id id,const std::string & aux_type)197 void HeifImage::SetAuxImage(heif_item_id id, const std::string &aux_type)
198 {
199     auxMasterItemId_ = id;
200     auxType_ = aux_type;
201 }
202 
AddAuxImage(std::shared_ptr<HeifImage> img)203 void HeifImage::AddAuxImage(std::shared_ptr<HeifImage> img)
204 {
205     auxImages_.push_back(std::move(img));
206 }
207 
GetAllMetadata() const208 const std::vector<std::shared_ptr<HeifMetadata>> &HeifImage::GetAllMetadata() const
209 {
210     return allMetadata_;
211 }
212 
AddMetadata(std::shared_ptr<HeifMetadata> metadata)213 void HeifImage::AddMetadata(std::shared_ptr<HeifMetadata> metadata)
214 {
215     allMetadata_.push_back(std::move(metadata));
216 }
217 
GetNclxColorProfile() const218 const std::shared_ptr<const HeifNclxColorProfile> &HeifImage::GetNclxColorProfile() const
219 {
220     return nclxColorProfile_;
221 }
222 
GetRawColorProfile() const223 const std::shared_ptr<const HeifRawColorProfile> &HeifImage::GetRawColorProfile() const
224 {
225     return rawColorProfile_;
226 }
227 
SetColorProfile(const std::shared_ptr<const HeifColorProfile> & profile)228 void HeifImage::SetColorProfile(const std::shared_ptr<const HeifColorProfile> &profile)
229 {
230     auto icc = std::dynamic_pointer_cast<const HeifRawColorProfile>(profile);
231     if (icc) {
232         rawColorProfile_ = std::move(icc);
233     }
234 
235     auto nclx = std::dynamic_pointer_cast<const HeifNclxColorProfile>(profile);
236     if (nclx) {
237         nclxColorProfile_ = std::move(nclx);
238     }
239 }
240 
SetGainmapMasterImage(heif_item_id id)241 void HeifImage::SetGainmapMasterImage(heif_item_id id)
242 {
243     gainmapMasterItemid_ = id;
244 }
245 
AddGainmapImage(std::shared_ptr<HeifImage> & img)246 void HeifImage::AddGainmapImage(std::shared_ptr<HeifImage>& img)
247 {
248     gainmapImage_ = img;
249 }
250 
GetGainmapImage() const251 std::shared_ptr<HeifImage> HeifImage::GetGainmapImage() const
252 {
253     return gainmapImage_;
254 }
255 
SetTmapBoxId(heif_item_id id)256 void HeifImage::SetTmapBoxId(heif_item_id id)
257 {
258     tmapId_ = id;
259 }
260 
SetStaticMetadata(std::vector<uint8_t> & displayInfo,std::vector<uint8_t> & lightInfo)261 void HeifImage::SetStaticMetadata(std::vector<uint8_t>& displayInfo, std::vector<uint8_t>& lightInfo)
262 {
263     displayInfo_ = displayInfo;
264     lightInfo_ = lightInfo;
265 }
266 
SetUWAInfo(std::vector<uint8_t> & uwaInfo)267 void HeifImage::SetUWAInfo(std::vector<uint8_t>& uwaInfo)
268 {
269     uwaInfo_ = uwaInfo;
270 }
271 
SetISOMetadata(std::vector<uint8_t> & isoMetadata)272 void HeifImage::SetISOMetadata(std::vector<uint8_t>& isoMetadata)
273 {
274     isoMetadata_ = isoMetadata;
275 }
276 
SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)277 void HeifImage::SetFragmentMetadata(HeifFragmentMetadata fragmentMetadata)
278 {
279     fragmentMetadata_ = fragmentMetadata;
280 }
281 
GetDisplayInfo()282 std::vector<uint8_t> HeifImage::GetDisplayInfo()
283 {
284     return displayInfo_;
285 }
286 
GetLightInfo()287 std::vector<uint8_t> HeifImage::GetLightInfo()
288 {
289     return lightInfo_;
290 }
291 
GetUWAInfo()292 std::vector<uint8_t> HeifImage::GetUWAInfo()
293 {
294     return uwaInfo_;
295 }
296 
GetISOMetadata()297 std::vector<uint8_t> HeifImage::GetISOMetadata()
298 {
299     return isoMetadata_;
300 }
301 
GetFragmentMetadata()302 HeifFragmentMetadata HeifImage::GetFragmentMetadata()
303 {
304     return fragmentMetadata_;
305 }
306 
307 } // namespace ImagePlugin
308 } // namespace OHOS
309