1 /*
2  * Copyright (c) 2021-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 #include "native_window.h"
17 
18 #include <cstdint>
19 #include <map>
20 #include <cinttypes>
21 #include <securec.h>
22 #include "buffer_log.h"
23 #include "window.h"
24 #include "surface_type.h"
25 #include "surface_utils.h"
26 #include "sync_fence.h"
27 #include "ipc_inner_object.h"
28 #include "external_window.h"
29 #include "hebc_white_list.h"
30 #include "metadata_helper.h"
31 
32 #ifndef WEAK_ALIAS
33     #define WEAK_ALIAS(old, new) \
34         extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
35 #endif
36 
37 using namespace OHOS;
38 using namespace HDI::Display::Graphic::Common::V1_0;
39 static std::unordered_map<OH_NativeBuffer_ColorSpace, CM_ColorSpaceType> NATIVE_COLORSPACE_TO_HDI_MAP = {
40     {OH_COLORSPACE_NONE, CM_COLORSPACE_NONE},
41     {OH_COLORSPACE_BT601_EBU_FULL, CM_BT601_EBU_FULL},
42     {OH_COLORSPACE_BT601_SMPTE_C_FULL, CM_BT601_SMPTE_C_FULL},
43     {OH_COLORSPACE_BT709_FULL, CM_BT709_FULL},
44     {OH_COLORSPACE_BT2020_HLG_FULL, CM_BT2020_HLG_FULL},
45     {OH_COLORSPACE_BT2020_PQ_FULL, CM_BT2020_PQ_FULL},
46     {OH_COLORSPACE_BT601_EBU_LIMIT, CM_BT601_EBU_LIMIT},
47     {OH_COLORSPACE_BT601_SMPTE_C_LIMIT, CM_BT601_SMPTE_C_LIMIT},
48     {OH_COLORSPACE_BT709_LIMIT, CM_BT709_LIMIT},
49     {OH_COLORSPACE_BT2020_HLG_LIMIT, CM_BT2020_HLG_LIMIT},
50     {OH_COLORSPACE_BT2020_PQ_LIMIT, CM_BT2020_PQ_LIMIT},
51     {OH_COLORSPACE_SRGB_FULL, CM_SRGB_FULL},
52     {OH_COLORSPACE_P3_FULL, CM_P3_FULL},
53     {OH_COLORSPACE_P3_HLG_FULL, CM_P3_HLG_FULL},
54     {OH_COLORSPACE_P3_PQ_FULL, CM_P3_PQ_FULL},
55     {OH_COLORSPACE_ADOBERGB_FULL, CM_ADOBERGB_FULL},
56     {OH_COLORSPACE_SRGB_LIMIT, CM_SRGB_LIMIT},
57     {OH_COLORSPACE_P3_LIMIT, CM_P3_LIMIT},
58     {OH_COLORSPACE_P3_HLG_LIMIT, CM_P3_HLG_LIMIT},
59     {OH_COLORSPACE_P3_PQ_LIMIT, CM_P3_PQ_LIMIT},
60     {OH_COLORSPACE_ADOBERGB_LIMIT, CM_ADOBERGB_LIMIT},
61     {OH_COLORSPACE_LINEAR_SRGB, CM_LINEAR_SRGB},
62     {OH_COLORSPACE_LINEAR_BT709, CM_LINEAR_BT709},
63     {OH_COLORSPACE_LINEAR_P3, CM_LINEAR_P3},
64     {OH_COLORSPACE_LINEAR_BT2020, CM_LINEAR_BT2020},
65     {OH_COLORSPACE_DISPLAY_SRGB, CM_DISPLAY_SRGB},
66     {OH_COLORSPACE_DISPLAY_P3_SRGB, CM_DISPLAY_P3_SRGB},
67     {OH_COLORSPACE_DISPLAY_P3_HLG, CM_DISPLAY_P3_HLG},
68     {OH_COLORSPACE_DISPLAY_P3_PQ, CM_DISPLAY_P3_PQ},
69     {OH_COLORSPACE_DISPLAY_BT2020_SRGB, CM_DISPLAY_BT2020_SRGB},
70     {OH_COLORSPACE_DISPLAY_BT2020_HLG, CM_DISPLAY_BT2020_HLG},
71     {OH_COLORSPACE_DISPLAY_BT2020_PQ, CM_DISPLAY_BT2020_PQ}
72 };
73 
74 static std::unordered_map<OH_NativeBuffer_MetadataType, CM_HDR_Metadata_Type> NATIVE_METADATATYPE_TO_HDI_MAP = {
75     {OH_VIDEO_HDR_HLG, CM_VIDEO_HLG},
76     {OH_VIDEO_HDR_HDR10, CM_VIDEO_HDR10},
77     {OH_VIDEO_HDR_VIVID, CM_VIDEO_HDR_VIVID},
78 };
79 
80 namespace {
81     constexpr int32_t INVALID_PARAM = -1;
82     constexpr int32_t META_DATA_MAX_SIZE = 3000;
83 }
84 
CreateNativeWindowFromSurface(void* pSurface)85 OHNativeWindow* CreateNativeWindowFromSurface(void* pSurface)
86 {
87     if (pSurface == nullptr) {
88         return nullptr;
89     }
90 
91     OHNativeWindow* nativeWindow = new OHNativeWindow();
92     nativeWindow->surface =
93                 *reinterpret_cast<OHOS::sptr<OHOS::Surface> *>(pSurface);
94     if (nativeWindow->surface == nullptr) {
95         BLOGE("window surface is null");
96         delete nativeWindow;
97         return nullptr;
98     }
99     OHOS::BufferRequestConfig windowConfig;
100     windowConfig.width = nativeWindow->surface->GetDefaultWidth();
101     windowConfig.height = nativeWindow->surface->GetDefaultHeight();
102     windowConfig.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
103     windowConfig.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
104     windowConfig.strideAlignment = 8;   // default stride is 8
105     windowConfig.timeout = 3000;        // default timeout is 3000 ms
106     windowConfig.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
107     windowConfig.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
108 
109     // if the application is in the hebc list, remove BUFFER_USAGE_CPU_READ flag
110     if (nativeWindow->surface->IsInHebcList()) {
111         windowConfig.usage &= ~BUFFER_USAGE_CPU_READ;
112     }
113     nativeWindow->surface->SetWindowConfig(windowConfig);
114 
115     NativeObjectReference(nativeWindow);
116     auto utils = SurfaceUtils::GetInstance();
117     utils->AddNativeWindow(nativeWindow->surface->GetUniqueId(), nativeWindow);
118     nativeWindow->surface->SetWptrNativeWindowToPSurface(nativeWindow);
119     return nativeWindow;
120 }
121 
DestoryNativeWindow(OHNativeWindow *window)122 void DestoryNativeWindow(OHNativeWindow *window)
123 {
124     if (window == nullptr) {
125         return;
126     }
127     // unreference nativewindow object
128     NativeObjectUnreference(window);
129 }
130 
CreateNativeWindowBufferFromSurfaceBuffer(void* pSurfaceBuffer)131 OHNativeWindowBuffer* CreateNativeWindowBufferFromSurfaceBuffer(void* pSurfaceBuffer)
132 {
133     if (pSurfaceBuffer == nullptr) {
134         return nullptr;
135     }
136     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
137     nwBuffer->sfbuffer = *reinterpret_cast<OHOS::sptr<OHOS::SurfaceBuffer> *>(pSurfaceBuffer);
138     NativeObjectReference(nwBuffer);
139     return nwBuffer;
140 }
141 
CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer* nativeBuffer)142 OHNativeWindowBuffer* CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer* nativeBuffer)
143 {
144     if (nativeBuffer == nullptr) {
145         return nullptr;
146     }
147     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
148     OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer(reinterpret_cast<OHOS::SurfaceBuffer *>(nativeBuffer));
149     nwBuffer->sfbuffer = surfaceBuffer;
150 
151     NativeObjectReference(nwBuffer);
152     return nwBuffer;
153 }
154 
DestroyNativeWindowBuffer(OHNativeWindowBuffer* buffer)155 void DestroyNativeWindowBuffer(OHNativeWindowBuffer* buffer)
156 {
157     if (buffer == nullptr) {
158         return;
159     }
160     NativeObjectUnreference(buffer);
161 }
162 
NativeWindowRequestBuffer(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd)163 int32_t NativeWindowRequestBuffer(OHNativeWindow *window,
164     OHNativeWindowBuffer **buffer, int *fenceFd)
165 {
166     if (window == nullptr || buffer == nullptr || fenceFd == nullptr) {
167         return OHOS::SURFACE_ERROR_INVALID_PARAM;
168     }
169     OHOS::sptr<OHOS::SurfaceBuffer> sfbuffer;
170     OHOS::sptr<OHOS::SyncFence> releaseFence = OHOS::SyncFence::InvalidFence();
171     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_ERROR, "window surface is null");
172     int32_t ret;
173     int32_t requestWidth = window->surface->GetRequestWidth();
174     int32_t requestHeight = window->surface->GetRequestHeight();
175     OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
176     if (requestWidth != 0 && requestHeight != 0) {
177         OHOS::BufferRequestConfig config = windowConfig;
178         config.width = requestWidth;
179         config.height = requestHeight;
180         ret = window->surface->RequestBuffer(sfbuffer, releaseFence, config);
181     } else {
182         ret = window->surface->RequestBuffer(sfbuffer, releaseFence, windowConfig);
183     }
184     if (ret != OHOS::GSError::SURFACE_ERROR_OK || sfbuffer == nullptr) {
185         BLOGE("RequestBuffer ret:%{public}d, uniqueId: %{public}" PRIu64 ".",
186                 ret, window->surface->GetUniqueId());
187         return ret;
188     }
189     uint32_t seqNum = sfbuffer->GetSeqNum();
190     auto iter = window->bufferCache_.find(seqNum);
191     if (iter == window->bufferCache_.end()) {
192         OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
193         nwBuffer->sfbuffer = sfbuffer;
194         nwBuffer->uiTimestamp = window->uiTimestamp;
195         *buffer = nwBuffer;
196         // Add to cache
197         NativeObjectReference(nwBuffer);
198         window->bufferCache_[seqNum] = nwBuffer;
199     } else {
200         *buffer = iter->second;
201         (*buffer)->uiTimestamp = window->uiTimestamp;
202     }
203     *fenceFd = releaseFence->Dup();
204     return OHOS::SURFACE_ERROR_OK;
205 }
206 
NativeWindowFlushBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer, int fenceFd, struct Region region)207 int32_t NativeWindowFlushBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer,
208     int fenceFd, struct Region region)
209 {
210     if (window == nullptr || buffer == nullptr || window->surface == nullptr) {
211         return OHOS::SURFACE_ERROR_INVALID_PARAM;
212     }
213 
214     OHOS::BufferFlushConfigWithDamages config;
215     if ((region.rectNumber != 0) && (region.rects != nullptr)) {
216         config.damages.reserve(region.rectNumber);
217         for (int32_t i = 0; i < region.rectNumber; i++) {
218             OHOS::Rect damage = {
219                 .x = region.rects[i].x,
220                 .y = region.rects[i].y,
221                 .w = static_cast<int32_t>(region.rects[i].w),
222                 .h = static_cast<int32_t>(region.rects[i].h),
223             };
224             config.damages.emplace_back(damage);
225         }
226         config.timestamp = buffer->uiTimestamp;
227     } else {
228         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
229         config.damages.reserve(1);
230         OHOS::Rect damage = {
231             .x = 0,
232             .y = 0,
233             .w = windowConfig.width,
234             .h = windowConfig.height,
235         };
236         config.damages.emplace_back(damage);
237         config.timestamp = buffer->uiTimestamp;
238     }
239     config.desiredPresentTimestamp = window->desiredPresentTimestamp;
240     OHOS::sptr<OHOS::SyncFence> acquireFence = new OHOS::SyncFence(fenceFd);
241     int32_t ret = window->surface->FlushBuffer(buffer->sfbuffer, acquireFence, config);
242     if (ret != OHOS::GSError::SURFACE_ERROR_OK) {
243         BLOGE("FlushBuffer failed, ret:%{public}d, uniqueId: %{public}" PRIu64 ".",
244             ret, window->surface->GetUniqueId());
245         return ret;
246     }
247 
248     auto it = std::find_if(window->bufferCache_.begin(), window->bufferCache_.end(),
249         [buffer](const std::pair<uint32_t, NativeWindowBuffer*>& element) {
250             return element.second == buffer;
251         });
252     if (it != window->bufferCache_.end()) {
253         window->lastBufferSeqNum = it->first;
254     }
255 
256     return OHOS::SURFACE_ERROR_OK;
257 }
258 
GetLastFlushedBuffer(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])259 int32_t GetLastFlushedBuffer(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])
260 {
261     if (window == nullptr || buffer == nullptr || fenceFd == nullptr || window->surface == nullptr) {
262         return OHOS::SURFACE_ERROR_INVALID_PARAM;
263     }
264     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
265     OHOS::sptr<OHOS::SyncFence> acquireFence = OHOS::SyncFence::InvalidFence();
266     int32_t ret = window->surface->GetLastFlushedBuffer(nwBuffer->sfbuffer, acquireFence, matrix, false);
267     if (ret != OHOS::GSError::SURFACE_ERROR_OK || nwBuffer->sfbuffer == nullptr) {
268         BLOGE("GetLastFlushedBuffer fail, uniqueId: %{public}" PRIu64 ".", window->surface->GetUniqueId());
269         delete nwBuffer;
270         nwBuffer = nullptr;
271         return ret;
272     }
273     *buffer = nwBuffer;
274     NativeObjectReference(nwBuffer);
275     *fenceFd = acquireFence->Dup();
276     return OHOS::SURFACE_ERROR_OK;
277 }
278 
NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)279 int32_t NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
280 {
281     if (window == nullptr || buffer == nullptr) {
282         return OHOS::SURFACE_ERROR_INVALID_PARAM;
283     }
284     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
285     return window->surface->AttachBufferToQueue(buffer->sfbuffer);
286 }
287 
NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)288 int32_t NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
289 {
290     if (window == nullptr || buffer == nullptr) {
291         return OHOS::SURFACE_ERROR_INVALID_PARAM;
292     }
293     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
294     return window->surface->DetachBufferFromQueue(buffer->sfbuffer);
295 }
296 
NativeWindowCancelBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)297 int32_t NativeWindowCancelBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
298 {
299     if (window == nullptr || buffer == nullptr) {
300         return OHOS::SURFACE_ERROR_INVALID_PARAM;
301     }
302     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
303     return window->surface->CancelBuffer(buffer->sfbuffer);
304 }
305 
HandleNativeWindowSetUsage(OHNativeWindow *window, va_list args)306 static void HandleNativeWindowSetUsage(OHNativeWindow *window, va_list args)
307 {
308     uint64_t usage = va_arg(args, uint64_t);
309     window->surface->SetWindowConfigUsage(usage);
310 }
311 
HandleNativeWindowSetBufferGeometry(OHNativeWindow *window, va_list args)312 static void HandleNativeWindowSetBufferGeometry(OHNativeWindow *window, va_list args)
313 {
314     int32_t width = va_arg(args, int32_t);
315     int32_t height = va_arg(args, int32_t);
316     window->surface->SetWindowConfigWidthAndHeight(width, height);
317 }
318 
HandleNativeWindowSetFormat(OHNativeWindow *window, va_list args)319 static void HandleNativeWindowSetFormat(OHNativeWindow *window, va_list args)
320 {
321     int32_t format = va_arg(args, int32_t);
322     window->surface->SetWindowConfigFormat(format);
323 }
324 
HandleNativeWindowSetStride(OHNativeWindow *window, va_list args)325 static void HandleNativeWindowSetStride(OHNativeWindow *window, va_list args)
326 {
327     int32_t stride = va_arg(args, int32_t);
328     window->surface->SetWindowConfigStride(stride);
329 }
330 
HandleNativeWindowSetTimeout(OHNativeWindow *window, va_list args)331 static void HandleNativeWindowSetTimeout(OHNativeWindow *window, va_list args)
332 {
333     int32_t timeout = va_arg(args, int32_t);
334     window->surface->SetWindowConfigTimeout(timeout);
335 }
336 
HandleNativeWindowSetColorGamut(OHNativeWindow *window, va_list args)337 static void HandleNativeWindowSetColorGamut(OHNativeWindow *window, va_list args)
338 {
339     int32_t colorGamut = va_arg(args, int32_t);
340     window->surface->SetWindowConfigColorGamut(static_cast<GraphicColorGamut>(colorGamut));
341 }
342 
HandleNativeWindowSetTransform(OHNativeWindow *window, va_list args)343 static void HandleNativeWindowSetTransform(OHNativeWindow *window, va_list args)
344 {
345     int32_t transform = va_arg(args, int32_t);
346     window->surface->SetTransform(static_cast<GraphicTransformType>(transform));
347     window->surface->SetWindowConfigTransform(static_cast<GraphicTransformType>(transform));
348 }
349 
HandleNativeWindowSetUiTimestamp(OHNativeWindow *window, va_list args)350 static void HandleNativeWindowSetUiTimestamp(OHNativeWindow *window, va_list args)
351 {
352     uint64_t uiTimestamp = va_arg(args, uint64_t);
353     window->uiTimestamp = static_cast<int64_t>(uiTimestamp);
354 }
355 
HandleNativeWindowSetDesiredPresentTimestamp(OHNativeWindow *window, va_list args)356 static void HandleNativeWindowSetDesiredPresentTimestamp(OHNativeWindow *window, va_list args)
357 {
358     int64_t desiredPresentTimestamp = va_arg(args, int64_t);
359     window->desiredPresentTimestamp = desiredPresentTimestamp;
360 }
361 
HandleNativeWindowSetSurfaceSourceType(OHNativeWindow *window, va_list args)362 static void HandleNativeWindowSetSurfaceSourceType(OHNativeWindow *window, va_list args)
363 {
364     OHSurfaceSource sourceType = va_arg(args, OHSurfaceSource);
365     window->surface->SetSurfaceSourceType(sourceType);
366 }
367 
HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)368 static void HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
369 {
370     char* appFrameworkType = va_arg(args, char*);
371     if (appFrameworkType != nullptr) {
372         std::string typeStr(appFrameworkType);
373         window->surface->SetSurfaceAppFrameworkType(typeStr);
374     }
375 }
376 
HandleNativeWindowGetUsage(OHNativeWindow *window, va_list args)377 static void HandleNativeWindowGetUsage(OHNativeWindow *window, va_list args)
378 {
379     uint64_t *value = va_arg(args, uint64_t*);
380     if (value != nullptr) {
381         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
382         *value = static_cast<uint64_t>(windowConfig.usage);
383     }
384 }
385 
HandleNativeWindowGetBufferGeometry(OHNativeWindow *window, va_list args)386 static void HandleNativeWindowGetBufferGeometry(OHNativeWindow *window, va_list args)
387 {
388     int32_t *height = va_arg(args, int32_t*);
389     int32_t *width = va_arg(args, int32_t*);
390     if (height != nullptr && width != nullptr) {
391         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
392         *height = windowConfig.height;
393         *width = windowConfig.width;
394     }
395 }
396 
HandleNativeWindowGetFormat(OHNativeWindow *window, va_list args)397 static void HandleNativeWindowGetFormat(OHNativeWindow *window, va_list args)
398 {
399     int32_t *format = va_arg(args, int32_t*);
400     if (format != nullptr) {
401         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
402         *format = windowConfig.format;
403     }
404 }
405 
HandleNativeWindowGetStride(OHNativeWindow *window, va_list args)406 static void HandleNativeWindowGetStride(OHNativeWindow *window, va_list args)
407 {
408     int32_t *stride = va_arg(args, int32_t*);
409     if (stride != nullptr) {
410         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
411         *stride = windowConfig.strideAlignment;
412     }
413 }
414 
HandleNativeWindowGetTimeout(OHNativeWindow *window, va_list args)415 static void HandleNativeWindowGetTimeout(OHNativeWindow *window, va_list args)
416 {
417     int32_t *timeout = va_arg(args, int32_t*);
418     if (timeout != nullptr) {
419         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
420         *timeout = windowConfig.timeout;
421     }
422 }
423 
HandleNativeWindowGetColorGamut(OHNativeWindow *window, va_list args)424 static void HandleNativeWindowGetColorGamut(OHNativeWindow *window, va_list args)
425 {
426     int32_t *colorGamut = va_arg(args, int32_t*);
427     if (colorGamut != nullptr) {
428         OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
429         *colorGamut = static_cast<int32_t>(windowConfig.colorGamut);
430     }
431 }
432 
HandleNativeWindowGetTransform(OHNativeWindow *window, va_list args)433 static void HandleNativeWindowGetTransform(OHNativeWindow *window, va_list args)
434 {
435     int32_t *transform = va_arg(args, int32_t*);
436     if (transform != nullptr) {
437         *transform = static_cast<int32_t>(window->surface->GetTransform());
438     }
439 }
440 
HandleNativeWindowGetBufferQueueSize(OHNativeWindow *window, va_list args)441 static void HandleNativeWindowGetBufferQueueSize(OHNativeWindow *window, va_list args)
442 {
443     int32_t *bufferQueueSize = va_arg(args, int32_t*);
444     if (bufferQueueSize != nullptr) {
445         *bufferQueueSize = static_cast<int32_t>(window->surface->GetQueueSize());
446     }
447 }
448 
HandleNativeWindowGetSurfaceSourceType(OHNativeWindow *window, va_list args)449 static void HandleNativeWindowGetSurfaceSourceType(OHNativeWindow *window, va_list args)
450 {
451     OHSurfaceSource *sourceType = va_arg(args, OHSurfaceSource*);
452     if (sourceType != nullptr) {
453         *sourceType = window->surface->GetSurfaceSourceType();
454     }
455 }
456 
HandleNativeWindowGetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)457 static void HandleNativeWindowGetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
458 {
459     const char **appFrameworkType = va_arg(args, const char**);
460     if (appFrameworkType != nullptr) {
461         std::string typeStr = window->surface->GetSurfaceAppFrameworkType();
462         *appFrameworkType = typeStr.c_str();
463     }
464 }
465 
HandleNativeWindowSetHdrWhitePointBrightness(OHNativeWindow *window, va_list args)466 static void HandleNativeWindowSetHdrWhitePointBrightness(OHNativeWindow *window, va_list args)
467 {
468     float hdrWhitePointBrightness = static_cast<float>(va_arg(args, double));
469     window->surface->SetHdrWhitePointBrightness(hdrWhitePointBrightness);
470 }
471 
HandleNativeWindowSetSdrWhitePointBrightness(OHNativeWindow *window, va_list args)472 static void HandleNativeWindowSetSdrWhitePointBrightness(OHNativeWindow *window, va_list args)
473 {
474     float sdrWhitePointBrightness = static_cast<float>(va_arg(args, double));
475     window->surface->SetSdrWhitePointBrightness(sdrWhitePointBrightness);
476 }
477 
478 static std::map<int, std::function<void(OHNativeWindow*, va_list)>> operationMap = {
479     {SET_USAGE, HandleNativeWindowSetUsage},
480     {SET_BUFFER_GEOMETRY, HandleNativeWindowSetBufferGeometry},
481     {SET_FORMAT, HandleNativeWindowSetFormat},
482     {SET_STRIDE, HandleNativeWindowSetStride},
483     {SET_TIMEOUT, HandleNativeWindowSetTimeout},
484     {SET_COLOR_GAMUT, HandleNativeWindowSetColorGamut},
485     {SET_TRANSFORM, HandleNativeWindowSetTransform},
486     {SET_UI_TIMESTAMP, HandleNativeWindowSetUiTimestamp},
487     {SET_SOURCE_TYPE, HandleNativeWindowSetSurfaceSourceType},
488     {SET_APP_FRAMEWORK_TYPE, HandleNativeWindowSetSurfaceAppFrameworkType},
489     {GET_USAGE, HandleNativeWindowGetUsage},
490     {GET_BUFFER_GEOMETRY, HandleNativeWindowGetBufferGeometry},
491     {GET_FORMAT, HandleNativeWindowGetFormat},
492     {GET_STRIDE, HandleNativeWindowGetStride},
493     {GET_TIMEOUT, HandleNativeWindowGetTimeout},
494     {GET_COLOR_GAMUT, HandleNativeWindowGetColorGamut},
495     {GET_TRANSFORM, HandleNativeWindowGetTransform},
496     {GET_BUFFERQUEUE_SIZE, HandleNativeWindowGetBufferQueueSize},
497     {GET_SOURCE_TYPE, HandleNativeWindowGetSurfaceSourceType},
498     {GET_APP_FRAMEWORK_TYPE, HandleNativeWindowGetSurfaceAppFrameworkType},
499     {SET_HDR_WHITE_POINT_BRIGHTNESS, HandleNativeWindowSetHdrWhitePointBrightness},
500     {SET_SDR_WHITE_POINT_BRIGHTNESS, HandleNativeWindowSetSdrWhitePointBrightness},
501     {SET_DESIRED_PRESENT_TIMESTAMP, HandleNativeWindowSetDesiredPresentTimestamp},
502 };
503 
InternalHandleNativeWindowOpt(OHNativeWindow *window, int code, va_list args)504 static int32_t InternalHandleNativeWindowOpt(OHNativeWindow *window, int code, va_list args)
505 {
506     auto it = operationMap.find(code);
507     if (it != operationMap.end()) {
508         it->second(window, args);
509     }
510     return OHOS::GSERROR_OK;
511 }
512 
NativeWindowHandleOpt(OHNativeWindow *window, int code, ...)513 int32_t NativeWindowHandleOpt(OHNativeWindow *window, int code, ...)
514 {
515     if (window == nullptr || window->surface == nullptr) {
516         return OHOS::SURFACE_ERROR_INVALID_PARAM;
517     }
518     va_list args;
519     va_start(args, code);
520     InternalHandleNativeWindowOpt(window, code, args);
521     va_end(args);
522     return OHOS::GSERROR_OK;
523 }
524 
GetBufferHandleFromNative(OHNativeWindowBuffer *buffer)525 BufferHandle *GetBufferHandleFromNative(OHNativeWindowBuffer *buffer)
526 {
527     if (buffer == nullptr || buffer->sfbuffer == nullptr) {
528         return nullptr;
529     }
530 
531     return buffer->sfbuffer->GetBufferHandle();
532 }
533 
GetNativeObjectMagic(void *obj)534 int32_t GetNativeObjectMagic(void *obj)
535 {
536     if (obj == nullptr) {
537         return INVALID_PARAM;
538     }
539     NativeWindowMagic* nativeWindowMagic = reinterpret_cast<NativeWindowMagic *>(obj);
540     return nativeWindowMagic->magic;
541 }
542 
NativeObjectReference(void *obj)543 int32_t NativeObjectReference(void *obj)
544 {
545     if (obj == nullptr) {
546         return OHOS::SURFACE_ERROR_INVALID_PARAM;
547     }
548     switch (GetNativeObjectMagic(obj)) {
549         case NATIVE_OBJECT_MAGIC_WINDOW:
550         case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
551             break;
552         default:
553             BLOGE("magic illegal: %{public}d", GetNativeObjectMagic(obj));
554             return OHOS::SURFACE_ERROR_INVALID_PARAM;
555     }
556     OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
557     ref->IncStrongRef(ref);
558     return OHOS::GSERROR_OK;
559 }
560 
NativeObjectUnreference(void *obj)561 int32_t NativeObjectUnreference(void *obj)
562 {
563     if (obj == nullptr) {
564         return OHOS::SURFACE_ERROR_INVALID_PARAM;
565     }
566     switch (GetNativeObjectMagic(obj)) {
567         case NATIVE_OBJECT_MAGIC_WINDOW:
568         case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
569             break;
570         default:
571             BLOGE("magic illegal: %{public}d", GetNativeObjectMagic(obj));
572             return OHOS::SURFACE_ERROR_INVALID_PARAM;
573     }
574     OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
575     ref->DecStrongRef(ref);
576     return OHOS::GSERROR_OK;
577 }
578 
NativeWindowSetScalingMode(OHNativeWindow *window, uint32_t sequence, OHScalingMode scalingMode)579 int32_t NativeWindowSetScalingMode(OHNativeWindow *window, uint32_t sequence, OHScalingMode scalingMode)
580 {
581     if (window == nullptr || window->surface == nullptr ||
582         scalingMode < OHScalingMode::OH_SCALING_MODE_FREEZE ||
583         scalingMode > OHScalingMode::OH_SCALING_MODE_NO_SCALE_CROP) {
584         return OHOS::SURFACE_ERROR_INVALID_PARAM;
585     }
586     return window->surface->SetScalingMode(sequence, static_cast<ScalingMode>(scalingMode));
587 }
588 
NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)589 int32_t NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)
590 {
591     if (window == nullptr || window->surface == nullptr ||
592         scalingMode < OHScalingModeV2::OH_SCALING_MODE_FREEZE_V2 ||
593         scalingMode > OHScalingModeV2::OH_SCALING_MODE_SCALE_FIT_V2) {
594         return OHOS::GSERROR_INVALID_ARGUMENTS;
595     }
596     return window->surface->SetScalingMode(static_cast<ScalingMode>(scalingMode));
597 }
598 
NativeWindowSetMetaData(OHNativeWindow *window, uint32_t sequence, int32_t size, const OHHDRMetaData *metaData)599 int32_t NativeWindowSetMetaData(OHNativeWindow *window, uint32_t sequence, int32_t size,
600                                 const OHHDRMetaData *metaData)
601 {
602     if (window == nullptr || window->surface == nullptr ||
603         size <= 0 ||size > META_DATA_MAX_SIZE || metaData == nullptr) {
604         return OHOS::SURFACE_ERROR_INVALID_PARAM;
605     }
606 
607     std::vector<GraphicHDRMetaData> data(reinterpret_cast<const GraphicHDRMetaData *>(metaData),
608                                          reinterpret_cast<const GraphicHDRMetaData *>(metaData) + size);
609     return window->surface->SetMetaData(sequence, data);
610 }
611 
NativeWindowSetMetaDataSet(OHNativeWindow *window, uint32_t sequence, OHHDRMetadataKey key, int32_t size, const uint8_t *metaData)612 int32_t NativeWindowSetMetaDataSet(OHNativeWindow *window, uint32_t sequence, OHHDRMetadataKey key,
613                                    int32_t size, const uint8_t *metaData)
614 {
615     if (window == nullptr || window->surface == nullptr ||
616         key < OHHDRMetadataKey::OH_METAKEY_RED_PRIMARY_X || key > OHHDRMetadataKey::OH_METAKEY_HDR_VIVID ||
617         size <= 0 || size > META_DATA_MAX_SIZE || metaData == nullptr) {
618         return OHOS::SURFACE_ERROR_INVALID_PARAM;
619     }
620     std::vector<uint8_t> data(metaData, metaData + size);
621     return window->surface->SetMetaDataSet(sequence, static_cast<GraphicHDRMetadataKey>(key), data);
622 }
623 
NativeWindowSetTunnelHandle(OHNativeWindow *window, const OHExtDataHandle *handle)624 int32_t NativeWindowSetTunnelHandle(OHNativeWindow *window, const OHExtDataHandle *handle)
625 {
626     if (window == nullptr || window->surface == nullptr || handle == nullptr) {
627         return OHOS::SURFACE_ERROR_INVALID_PARAM;
628     }
629     return window->surface->SetTunnelHandle(reinterpret_cast<const OHOS::GraphicExtDataHandle*>(handle));
630 }
631 
GetSurfaceId(OHNativeWindow *window, uint64_t *surfaceId)632 int32_t GetSurfaceId(OHNativeWindow *window, uint64_t *surfaceId)
633 {
634     if (window == nullptr || window->surface == nullptr || surfaceId == nullptr) {
635         return OHOS::SURFACE_ERROR_INVALID_PARAM;
636     }
637 
638     *surfaceId = window->surface->GetUniqueId();
639     return OHOS::GSERROR_OK;
640 }
641 
CreateNativeWindowFromSurfaceId(uint64_t surfaceId, OHNativeWindow **window)642 int32_t CreateNativeWindowFromSurfaceId(uint64_t surfaceId, OHNativeWindow **window)
643 {
644     if (window == nullptr) {
645         return OHOS::SURFACE_ERROR_INVALID_PARAM;
646     }
647 
648     auto utils = SurfaceUtils::GetInstance();
649     *window = reinterpret_cast<OHNativeWindow*>(utils->GetNativeWindow(surfaceId));
650     if (*window != nullptr) {
651         NativeObjectReference(*window);
652         BLOGD("get nativeWindow from cache, uniqueId: %{public}" PRIu64 ".", surfaceId);
653         return OHOS::GSERROR_OK;
654     }
655 
656     OHNativeWindow *nativeWindow = new OHNativeWindow();
657     nativeWindow->surface = utils->GetSurface(surfaceId);
658     if (nativeWindow->surface == nullptr) {
659         BLOGE("window surface is null, surfaceId: %{public}" PRIu64 ".", surfaceId);
660         delete nativeWindow;
661         return OHOS::SURFACE_ERROR_INVALID_PARAM;
662     }
663 
664     NativeObjectReference(nativeWindow);
665     utils->AddNativeWindow(nativeWindow->surface->GetUniqueId(), nativeWindow);
666     nativeWindow->surface->SetWptrNativeWindowToPSurface(nativeWindow);
667     *window = nativeWindow;
668     return OHOS::GSERROR_OK;
669 }
670 
NativeWindowGetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType *transform)671 int32_t NativeWindowGetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType *transform)
672 {
673     if (window == nullptr || window->surface == nullptr || transform == nullptr) {
674         return OHOS::SURFACE_ERROR_INVALID_PARAM;
675     }
676     *transform = static_cast<OH_NativeBuffer_TransformType>(window->surface->GetTransformHint());
677     return OHOS::GSERROR_OK;
678 }
679 
NativeWindowSetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType transform)680 int32_t NativeWindowSetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType transform)
681 {
682     if (window == nullptr || window->surface == nullptr) {
683         return OHOS::SURFACE_ERROR_INVALID_PARAM;
684     }
685     return window->surface->SetTransformHint(static_cast<OHOS::GraphicTransformType>(transform));
686 }
687 
NativeWindowGetDefaultWidthAndHeight(OHNativeWindow *window, int32_t *width, int32_t *height)688 int32_t NativeWindowGetDefaultWidthAndHeight(OHNativeWindow *window, int32_t *width, int32_t *height)
689 {
690     if (window == nullptr || window->surface == nullptr || width == nullptr || height == nullptr) {
691         return OHOS::SURFACE_ERROR_INVALID_PARAM;
692     }
693     OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
694     if (windowConfig.width != 0 && windowConfig.height != 0) {
695         *width = windowConfig.width;
696         *height = windowConfig.height;
697     } else {
698         *width = window->surface->GetDefaultWidth();
699         *height = window->surface->GetDefaultHeight();
700     }
701     return OHOS::GSERROR_OK;
702 }
703 
NativeWindowSetRequestWidthAndHeight(OHNativeWindow *window, int32_t width, int32_t height)704 int32_t NativeWindowSetRequestWidthAndHeight(OHNativeWindow *window, int32_t width, int32_t height)
705 {
706     if (window == nullptr || window->surface == nullptr) {
707         return OHOS::SURFACE_ERROR_INVALID_PARAM;
708     }
709     window->surface->SetRequestWidthAndHeight(width, height);
710     return OHOS::GSERROR_OK;
711 }
712 
NativeWindowSetBufferHold(OHNativeWindow *window)713 void NativeWindowSetBufferHold(OHNativeWindow *window)
714 {
715     if (window == nullptr || window->surface == nullptr) {
716         return;
717     }
718     window->surface->SetBufferHold(true);
719 }
720 
NativeWindowWriteToParcel(OHNativeWindow *window, OHIPCParcel *parcel)721 int32_t NativeWindowWriteToParcel(OHNativeWindow *window, OHIPCParcel *parcel)
722 {
723     if (window == nullptr) {
724         return OHOS::SURFACE_ERROR_INVALID_PARAM;
725     }
726     if (parcel == nullptr || parcel->msgParcel == nullptr) {
727         return OHOS::SURFACE_ERROR_INVALID_PARAM;
728     }
729     sptr<OHOS::Surface> windowSurface = window->surface;
730     if (windowSurface == nullptr) {
731         BLOGE("windowSurface is nullptr");
732         return OHOS::SURFACE_ERROR_INVALID_PARAM;
733     }
734     auto producer = windowSurface->GetProducer();
735     if (producer == nullptr) {
736         return OHOS::SURFACE_ERROR_INVALID_PARAM;
737     }
738     if (!(parcel->msgParcel)->WriteRemoteObject(producer->AsObject())) {
739         return OHOS::SURFACE_ERROR_INVALID_PARAM;
740     }
741     return OHOS::GSERROR_OK;
742 }
743 
NativeWindowReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)744 int32_t NativeWindowReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)
745 {
746     if (parcel == nullptr || parcel->msgParcel == nullptr || window == nullptr) {
747         return OHOS::SURFACE_ERROR_INVALID_PARAM;
748     }
749     sptr<OHOS::IRemoteObject> surfaceObject = (parcel->msgParcel)->ReadRemoteObject();
750     if (surfaceObject == nullptr) {
751         BLOGE("surfaceObject is nullptr");
752         return OHOS::SURFACE_ERROR_INVALID_PARAM;
753     }
754     sptr<OHOS::IBufferProducer> bp = iface_cast<IBufferProducer>(surfaceObject);
755     sptr <OHOS::Surface> windowSurface = OHOS::Surface::CreateSurfaceAsProducer(bp);
756     if (windowSurface == nullptr) {
757         BLOGE("windowSurface is nullptr");
758         return OHOS::SURFACE_ERROR_INVALID_PARAM;
759     }
760     auto utils = SurfaceUtils::GetInstance();
761     *window = reinterpret_cast<OHNativeWindow*>(utils->GetNativeWindow(windowSurface->GetUniqueId()));
762     if (*window == nullptr) {
763         *window = CreateNativeWindowFromSurface(&windowSurface);
764     }
765     return OHOS::GSERROR_OK;
766 }
767 
GetLastFlushedBufferV2(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])768 int32_t GetLastFlushedBufferV2(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])
769 {
770     if (window == nullptr || buffer == nullptr || fenceFd == nullptr || window->surface == nullptr) {
771         return OHOS::SURFACE_ERROR_INVALID_PARAM;
772     }
773     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
774     OHOS::sptr<OHOS::SyncFence> acquireFence = OHOS::SyncFence::InvalidFence();
775     int32_t ret = window->surface->GetLastFlushedBuffer(nwBuffer->sfbuffer, acquireFence, matrix, true);
776     if (ret != OHOS::GSError::SURFACE_ERROR_OK || nwBuffer->sfbuffer == nullptr) {
777         BLOGE("GetLastFlushedBuffer fail, ret: %{public}d, uniqueId: %{public}" PRIu64 ".",
778             ret, window->surface->GetUniqueId());
779         delete nwBuffer;
780         nwBuffer = nullptr;
781         return ret;
782     }
783     *buffer = nwBuffer;
784     NativeObjectReference(nwBuffer);
785     *fenceFd = acquireFence->Dup();
786     return OHOS::SURFACE_ERROR_OK;
787 }
788 
NativeWindowDisconnect(OHNativeWindow *window)789 int32_t NativeWindowDisconnect(OHNativeWindow *window)
790 {
791     if (window == nullptr || window->surface == nullptr) {
792         return OHOS::SURFACE_ERROR_INVALID_PARAM;
793     }
794     return window->surface->Disconnect();
795 }
796 
OH_NativeWindow_SetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace colorSpace)797 int32_t OH_NativeWindow_SetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace colorSpace)
798 {
799     auto iter = NATIVE_COLORSPACE_TO_HDI_MAP.find(colorSpace);
800     if (window == nullptr || iter == NATIVE_COLORSPACE_TO_HDI_MAP.end()) {
801         return OHOS::SURFACE_ERROR_INVALID_PARAM;
802     }
803     std::string param = std::to_string(iter->second);
804     GSError ret = GSERROR_OK;
805     if (window->surface != nullptr && param != window->surface->GetUserData("ATTRKEY_COLORSPACE_INFO")) {
806         ret = window->surface->SetUserData("ATTRKEY_COLORSPACE_INFO", param);
807     }
808     if (ret != OHOS::SURFACE_ERROR_OK) {
809         BLOGE("SetColorSpaceType failed!, ret: %{public}d", ret);
810         return OHOS::SURFACE_ERROR_UNKOWN;
811     }
812     return OHOS::SURFACE_ERROR_OK;
813 }
814 
OH_NativeWindow_GetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace *colorSpace)815 int32_t OH_NativeWindow_GetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace *colorSpace)
816 {
817     if (window == nullptr || colorSpace == nullptr) {
818         return OHOS::SURFACE_ERROR_INVALID_PARAM;
819     }
820     CM_ColorSpaceType colorSpaceType = CM_COLORSPACE_NONE;
821     if (window->surface != nullptr) {
822         std::string value = window->surface->GetUserData("ATTRKEY_COLORSPACE_INFO");
823         if (value.empty()) {
824             BLOGE("no colorspace!");
825             return OHOS::SURFACE_ERROR_UNKOWN;
826         }
827         colorSpaceType = static_cast<CM_ColorSpaceType>(atoi(value.c_str()));
828         auto it = std::find_if(NATIVE_COLORSPACE_TO_HDI_MAP.begin(), NATIVE_COLORSPACE_TO_HDI_MAP.end(),
829             [colorSpaceType](const std::pair<OH_NativeBuffer_ColorSpace, CM_ColorSpaceType>& element) {
830                 return element.second == colorSpaceType;
831             });
832         if (it != NATIVE_COLORSPACE_TO_HDI_MAP.end()) {
833             *colorSpace = it->first;
834             return OHOS::SURFACE_ERROR_OK;
835         }
836     }
837     BLOGE("the colorSpace does not support it.");
838     return OHOS::SURFACE_ERROR_UNKOWN;
839 }
840 
OH_NativeWindow_SetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey, int32_t size, uint8_t *metadata)841 int32_t OH_NativeWindow_SetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey,
842     int32_t size, uint8_t *metadata)
843 {
844     if (window == nullptr || metadata == nullptr || size <= 0 || size > META_DATA_MAX_SIZE ||
845         window->surface == nullptr) {
846         return OHOS::SURFACE_ERROR_INVALID_PARAM;
847     }
848     GSError ret = GSERROR_OK;
849     std::vector<uint8_t> mD(metadata, metadata + size);
850     std::string param;
851     if (metadataKey == OH_HDR_DYNAMIC_METADATA) {
852         param.assign(mD.begin(), mD.end());
853         if (param != window->surface->GetUserData("OH_HDR_DYNAMIC_METADATA")) {
854             ret = window->surface->SetUserData("OH_HDR_DYNAMIC_METADATA", param);
855         }
856     } else if (metadataKey == OH_HDR_STATIC_METADATA) {
857         param.assign(mD.begin(), mD.end());
858         if (param != window->surface->GetUserData("OH_HDR_STATIC_METADATA")) {
859             ret = window->surface->SetUserData("OH_HDR_STATIC_METADATA", param);
860         }
861     } else if (metadataKey == OH_HDR_METADATA_TYPE) {
862         OH_NativeBuffer_MetadataType hdrMetadataType = static_cast<OH_NativeBuffer_MetadataType>(*metadata);
863         param = std::to_string(NATIVE_METADATATYPE_TO_HDI_MAP[hdrMetadataType]);
864         if (param != window->surface->GetUserData("OH_HDR_METADATA_TYPE")) {
865             ret = window->surface->SetUserData("OH_HDR_METADATA_TYPE", param);
866         }
867     } else {
868         BLOGE("the metadataKey does not support it.");
869         return OHOS::SURFACE_ERROR_NOT_SUPPORT;
870     }
871     if (GSErrorStr(ret) == "<500 api call failed>with low error <Not supported>") {
872         return OHOS::SURFACE_ERROR_NOT_SUPPORT;
873     } else if (ret != OHOS::SURFACE_ERROR_OK) {
874         BLOGE("SetHDRMetadata failed!, ret: %{public}d", ret);
875         return OHOS::SURFACE_ERROR_UNKOWN;
876     }
877     return OHOS::SURFACE_ERROR_OK;
878 }
879 
OH_NativeWindow_GetMatedataValueType(OHNativeWindow *window, int32_t *size, uint8_t **metadata)880 static GSError OH_NativeWindow_GetMatedataValueType(OHNativeWindow *window, int32_t *size, uint8_t **metadata)
881 {
882     std::string value = window->surface->GetUserData("OH_HDR_METADATA_TYPE");
883     CM_HDR_Metadata_Type hdrMetadataType = CM_METADATA_NONE;
884     hdrMetadataType = static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str()));
885     auto it = std::find_if(NATIVE_METADATATYPE_TO_HDI_MAP.begin(), NATIVE_METADATATYPE_TO_HDI_MAP.end(),
886     [hdrMetadataType](const std::pair<OH_NativeBuffer_MetadataType, CM_HDR_Metadata_Type>& element) {
887         return element.second == hdrMetadataType;
888     });
889     if (it != NATIVE_METADATATYPE_TO_HDI_MAP.end()) {
890         *size = sizeof(OH_NativeBuffer_MetadataType);
891         *metadata = new uint8_t[*size];
892         errno_t err = memcpy_s(*metadata, *size, &(it->first), *size);
893         if (err != 0) {
894             delete[] *metadata;
895             *metadata = nullptr;
896             BLOGE("memcpy_s failed! , ret: %{public}d", err);
897             return OHOS::SURFACE_ERROR_UNKOWN;
898         }
899         return OHOS::SURFACE_ERROR_OK;
900     }
901     BLOGE("the hdrMetadataType does not support it.");
902     return OHOS::SURFACE_ERROR_NOT_SUPPORT;
903 }
904 
OH_NativeWindow_GetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey, int32_t *size, uint8_t **metadata)905 int32_t OH_NativeWindow_GetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey,
906     int32_t *size, uint8_t **metadata)
907 {
908     if (window == nullptr || metadata == nullptr || size == nullptr || window->surface == nullptr) {
909         return OHOS::SURFACE_ERROR_INVALID_PARAM;
910     }
911     GSError ret = GSERROR_OK;
912     std::vector<uint8_t> mD;
913     if (metadataKey == OH_HDR_DYNAMIC_METADATA) {
914         std::string value = window->surface->GetUserData("OH_HDR_DYNAMIC_METADATA");
915         mD.resize(value.size());
916         mD.assign(value.begin(), value.end());
917     } else if (metadataKey == OH_HDR_STATIC_METADATA) {
918         std::string value = window->surface->GetUserData("OH_HDR_STATIC_METADATA");
919         mD.resize(value.size());
920         mD.assign(value.begin(), value.end());
921     } else if (metadataKey == OH_HDR_METADATA_TYPE) {
922         ret = OH_NativeWindow_GetMatedataValueType(window, size, metadata);
923         return ret;
924     } else {
925         BLOGE("the metadataKey does not support it.");
926         return OHOS::SURFACE_ERROR_UNKOWN;
927     }
928     if (GSErrorStr(ret) == "<500 api call failed>with low error <Not supported>") {
929         return OHOS::SURFACE_ERROR_NOT_SUPPORT;
930     } else if (ret != OHOS::SURFACE_ERROR_OK) {
931         BLOGE("SetHDRSMetadata failed! , ret: %{public}d", ret);
932         return OHOS::SURFACE_ERROR_UNKOWN;
933     }
934     *size = mD.size();
935     *metadata = new uint8_t[mD.size()];
936     if (!mD.empty()) {
937         errno_t err = memcpy_s(*metadata, mD.size(), &mD[0], mD.size());
938         if (err != 0) {
939             delete[] *metadata;
940             *metadata = nullptr;
941             BLOGE("memcpy_s failed! , ret: %{public}d", err);
942             return OHOS::SURFACE_ERROR_UNKOWN;
943         }
944     } else {
945         delete[] *metadata;
946         *metadata = nullptr;
947         BLOGE("new metadata failed!");
948         return OHOS::SURFACE_ERROR_UNKOWN;
949     }
950     return OHOS::SURFACE_ERROR_OK;
951 }
952 
NativeWindow()953 NativeWindow::NativeWindow() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW), surface(nullptr)
954 {
955 }
956 
~NativeWindow()957 NativeWindow::~NativeWindow()
958 {
959     if (surface != nullptr) {
960         auto utils = SurfaceUtils::GetInstance();
961         utils->RemoveNativeWindow(surface->GetUniqueId());
962     }
963 
964     for (auto &[seqNum, buffer] : bufferCache_) {
965         NativeObjectUnreference(buffer);
966     }
967     surface = nullptr;
968     bufferCache_.clear();
969 }
970 
~NativeWindowBuffer()971 NativeWindowBuffer::~NativeWindowBuffer()
972 {
973     sfbuffer = nullptr;
974 }
975 
NativeWindowBuffer()976 NativeWindowBuffer::NativeWindowBuffer() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW_BUFFER), sfbuffer(nullptr)
977 {
978 }
979 
980 WEAK_ALIAS(CreateNativeWindowFromSurface, OH_NativeWindow_CreateNativeWindow);
981 WEAK_ALIAS(DestoryNativeWindow, OH_NativeWindow_DestroyNativeWindow);
982 WEAK_ALIAS(CreateNativeWindowBufferFromSurfaceBuffer, OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer);
983 WEAK_ALIAS(CreateNativeWindowBufferFromNativeBuffer, OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer);
984 WEAK_ALIAS(DestroyNativeWindowBuffer, OH_NativeWindow_DestroyNativeWindowBuffer);
985 WEAK_ALIAS(NativeWindowRequestBuffer, OH_NativeWindow_NativeWindowRequestBuffer);
986 WEAK_ALIAS(NativeWindowFlushBuffer, OH_NativeWindow_NativeWindowFlushBuffer);
987 WEAK_ALIAS(GetLastFlushedBuffer, OH_NativeWindow_GetLastFlushedBuffer);
988 WEAK_ALIAS(NativeWindowAttachBuffer, OH_NativeWindow_NativeWindowAttachBuffer);
989 WEAK_ALIAS(NativeWindowDetachBuffer, OH_NativeWindow_NativeWindowDetachBuffer);
990 WEAK_ALIAS(NativeWindowCancelBuffer, OH_NativeWindow_NativeWindowAbortBuffer);
991 WEAK_ALIAS(NativeWindowHandleOpt, OH_NativeWindow_NativeWindowHandleOpt);
992 WEAK_ALIAS(GetBufferHandleFromNative, OH_NativeWindow_GetBufferHandleFromNative);
993 WEAK_ALIAS(NativeObjectReference, OH_NativeWindow_NativeObjectReference);
994 WEAK_ALIAS(NativeObjectUnreference, OH_NativeWindow_NativeObjectUnreference);
995 WEAK_ALIAS(GetNativeObjectMagic, OH_NativeWindow_GetNativeObjectMagic);
996 WEAK_ALIAS(NativeWindowSetScalingMode, OH_NativeWindow_NativeWindowSetScalingMode);
997 WEAK_ALIAS(NativeWindowSetScalingModeV2, OH_NativeWindow_NativeWindowSetScalingModeV2);
998 WEAK_ALIAS(NativeWindowSetMetaData, OH_NativeWindow_NativeWindowSetMetaData);
999 WEAK_ALIAS(NativeWindowSetMetaDataSet, OH_NativeWindow_NativeWindowSetMetaDataSet);
1000 WEAK_ALIAS(NativeWindowSetTunnelHandle, OH_NativeWindow_NativeWindowSetTunnelHandle);
1001 WEAK_ALIAS(GetSurfaceId, OH_NativeWindow_GetSurfaceId);
1002 WEAK_ALIAS(CreateNativeWindowFromSurfaceId, OH_NativeWindow_CreateNativeWindowFromSurfaceId);
1003 WEAK_ALIAS(NativeWindowSetBufferHold, OH_NativeWindow_SetBufferHold);
1004 WEAK_ALIAS(NativeWindowWriteToParcel, OH_NativeWindow_WriteToParcel);
1005 WEAK_ALIAS(NativeWindowReadFromParcel, OH_NativeWindow_ReadFromParcel);
1006 WEAK_ALIAS(GetLastFlushedBufferV2, OH_NativeWindow_GetLastFlushedBufferV2);
1007