• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "buffer_log.h"
22 #include "window.h"
23 #include "surface_type.h"
24 #include "sync_fence.h"
25 
26 #ifndef WEAK_ALIAS
27     #define WEAK_ALIAS(old, new) \
28         extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
29 #endif
30 
31 using namespace OHOS;
32 
CreateNativeWindowFromSurface(void * pSurface)33 OHNativeWindow* CreateNativeWindowFromSurface(void* pSurface)
34 {
35     if (pSurface == nullptr) {
36         BLOGE("parameter error, please check input parameter");
37         return nullptr;
38     }
39     OHNativeWindow* nativeWindow = new OHNativeWindow();
40     nativeWindow->surface =
41                 *reinterpret_cast<OHOS::sptr<OHOS::Surface> *>(pSurface);
42     BLOGE_CHECK_AND_RETURN_RET(nativeWindow->surface != nullptr, nullptr, "window surface is null");
43     nativeWindow->config.width = nativeWindow->surface->GetDefaultWidth();
44     nativeWindow->config.height = nativeWindow->surface->GetDefaultHeight();
45     nativeWindow->config.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
46     nativeWindow->config.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
47     nativeWindow->config.strideAlignment = 8;   // default stride is 8
48     nativeWindow->config.timeout = 3000;        // default timeout is 3000 ms
49     nativeWindow->config.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
50     nativeWindow->config.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
51 
52     NativeObjectReference(nativeWindow);
53     nativeWindow->surface->SetWptrNativeWindowToPSurface(nativeWindow);
54     return nativeWindow;
55 }
56 
DestoryNativeWindow(OHNativeWindow * window)57 void DestoryNativeWindow(OHNativeWindow *window)
58 {
59     if (window == nullptr) {
60         BLOGD("parameter error, please check input parameter");
61         return;
62     }
63     // unreference nativewindow object
64     NativeObjectUnreference(window);
65 }
66 
CreateNativeWindowBufferFromSurfaceBuffer(void * pSurfaceBuffer)67 OHNativeWindowBuffer* CreateNativeWindowBufferFromSurfaceBuffer(void* pSurfaceBuffer)
68 {
69     if (pSurfaceBuffer == nullptr) {
70         BLOGE("parameter error, please check input parameter");
71         return nullptr;
72     }
73     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
74     nwBuffer->sfbuffer = *reinterpret_cast<OHOS::sptr<OHOS::SurfaceBuffer> *>(pSurfaceBuffer);
75     NativeObjectReference(nwBuffer);
76     return nwBuffer;
77 }
78 
CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer * nativeBuffer)79 OHNativeWindowBuffer* CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer* nativeBuffer)
80 {
81     if (nativeBuffer == nullptr) {
82         BLOGE("parameter error, please check input parameter");
83         return nullptr;
84     }
85     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
86     OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer(reinterpret_cast<OHOS::SurfaceBuffer *>(nativeBuffer));
87     nwBuffer->sfbuffer = surfaceBuffer;
88 
89     NativeObjectReference(nwBuffer);
90     return nwBuffer;
91 }
92 
DestroyNativeWindowBuffer(OHNativeWindowBuffer * buffer)93 void DestroyNativeWindowBuffer(OHNativeWindowBuffer* buffer)
94 {
95     if (buffer == nullptr) {
96         BLOGE("parameter error, please check input parameter");
97         return;
98     }
99     NativeObjectUnreference(buffer);
100 }
101 
NativeWindowRequestBuffer(OHNativeWindow * window,OHNativeWindowBuffer ** buffer,int * fenceFd)102 int32_t NativeWindowRequestBuffer(OHNativeWindow *window,
103     OHNativeWindowBuffer **buffer, int *fenceFd)
104 {
105     if (window == nullptr || buffer == nullptr || fenceFd == nullptr) {
106         BLOGE("parameter error, please check input parameter");
107         return OHOS::GSERROR_INVALID_ARGUMENTS;
108     }
109     OHOS::sptr<OHOS::SurfaceBuffer> sfbuffer;
110     OHOS::sptr<OHOS::SyncFence> releaseFence = OHOS::SyncFence::INVALID_FENCE;
111     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_ERROR, "window surface is null");
112     int32_t ret = window->surface->RequestBuffer(sfbuffer, releaseFence, window->config);
113     if (ret != OHOS::GSError::GSERROR_OK || sfbuffer == nullptr) {
114         BLOGE("API failed, please check RequestBuffer function ret:%{public}d, Queue Id:%{public}" PRIu64,
115                 ret, window->surface->GetUniqueId());
116         return OHOS::GSERROR_NO_BUFFER;
117     }
118     uint32_t seqNum = sfbuffer->GetSeqNum();
119     if (window->bufferCache_.find(seqNum) == window->bufferCache_.end()) {
120         OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
121         nwBuffer->sfbuffer = sfbuffer;
122         nwBuffer->uiTimestamp = window->uiTimestamp;
123         *buffer = nwBuffer;
124         // Add to cache
125         NativeObjectReference(nwBuffer);
126         window->bufferCache_[seqNum] = nwBuffer;
127     } else {
128         *buffer = window->bufferCache_[seqNum];
129         (*buffer)->uiTimestamp = window->uiTimestamp;
130     }
131     *fenceFd = releaseFence->Dup();
132     return OHOS::GSERROR_OK;
133 }
134 
NativeWindowFlushBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer,int fenceFd,struct Region region)135 int32_t NativeWindowFlushBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer,
136     int fenceFd, struct Region region)
137 {
138     if (window == nullptr || buffer == nullptr || window->surface == nullptr) {
139         BLOGE("parameter error, please check input parameter");
140         return OHOS::GSERROR_INVALID_ARGUMENTS;
141     }
142 
143     OHOS::BufferFlushConfigWithDamages config;
144     if ((region.rectNumber != 0) && (region.rects != nullptr)) {
145         config.damages.reserve(region.rectNumber);
146         for (int32_t i = 0; i < region.rectNumber; i++) {
147             OHOS::Rect damage = {
148                 .x = region.rects[i].x,
149                 .y = region.rects[i].y,
150                 .w = static_cast<int32_t>(region.rects[i].w),
151                 .h = static_cast<int32_t>(region.rects[i].h),
152             };
153             config.damages.emplace_back(damage);
154         }
155         config.timestamp = buffer->uiTimestamp;
156     } else {
157         config.damages.reserve(1);
158         OHOS::Rect damage = {
159             .x = 0,
160             .y = 0,
161             .w = window->config.width,
162             .h = window->config.height,
163         };
164         config.damages.emplace_back(damage);
165         config.timestamp = buffer->uiTimestamp;
166     }
167     OHOS::sptr<OHOS::SyncFence> acquireFence = new OHOS::SyncFence(fenceFd);
168     window->surface->FlushBuffer(buffer->sfbuffer, acquireFence, config);
169 
170     for (auto &[seqNum, buf] : window->bufferCache_) {
171         if (buf == buffer) {
172             window->lastBufferSeqNum = seqNum;
173             break;
174         }
175     }
176 
177     return OHOS::GSERROR_OK;
178 }
179 
GetLastFlushedBuffer(OHNativeWindow * window,OHNativeWindowBuffer ** buffer,int * fenceFd,float matrix[16])180 int32_t GetLastFlushedBuffer(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])
181 {
182     if (window == nullptr || buffer == nullptr) {
183         BLOGE("parameter error, please check input parameter");
184         return OHOS::GSERROR_INVALID_ARGUMENTS;
185     }
186     OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
187     OHOS::sptr<OHOS::SyncFence> acquireFence = OHOS::SyncFence::INVALID_FENCE;
188     int32_t ret = window->surface->GetLastFlushedBuffer(nwBuffer->sfbuffer, acquireFence, matrix);
189     if (ret != OHOS::GSError::GSERROR_OK || nwBuffer->sfbuffer == nullptr) {
190         BLOGE("GetLastFlushedBuffer fail");
191         return ret;
192     }
193     *buffer = nwBuffer;
194     NativeObjectReference(nwBuffer);
195     *fenceFd = acquireFence->Dup();
196     return OHOS::GSERROR_OK;
197 }
198 
NativeWindowCancelBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer)199 int32_t NativeWindowCancelBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
200 {
201     if (window == nullptr || buffer == nullptr) {
202         BLOGD("parameter error, please check input parameter");
203         return OHOS::GSERROR_INVALID_ARGUMENTS;
204     }
205     BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_ERROR, "window surface is null");
206     window->surface->CancelBuffer(buffer->sfbuffer);
207     return OHOS::GSERROR_OK;
208 }
209 
HandleNativeWindowSetUsage(OHNativeWindow * window,va_list args)210 static void HandleNativeWindowSetUsage(OHNativeWindow *window, va_list args)
211 {
212     uint64_t usage = va_arg(args, uint64_t);
213     window->config.usage = usage;
214 }
215 
HandleNativeWindowSetBufferGeometry(OHNativeWindow * window,va_list args)216 static void HandleNativeWindowSetBufferGeometry(OHNativeWindow *window, va_list args)
217 {
218     int32_t width = va_arg(args, int32_t);
219     int32_t height = va_arg(args, int32_t);
220     window->config.height = height;
221     window->config.width = width;
222 }
223 
HandleNativeWindowSetFormat(OHNativeWindow * window,va_list args)224 static void HandleNativeWindowSetFormat(OHNativeWindow *window, va_list args)
225 {
226     int32_t format = va_arg(args, int32_t);
227     window->config.format = format;
228 }
229 
HandleNativeWindowSetStride(OHNativeWindow * window,va_list args)230 static void HandleNativeWindowSetStride(OHNativeWindow *window, va_list args)
231 {
232     int32_t stride = va_arg(args, int32_t);
233     window->config.strideAlignment = stride;
234 }
235 
HandleNativeWindowSetTimeout(OHNativeWindow * window,va_list args)236 static void HandleNativeWindowSetTimeout(OHNativeWindow *window, va_list args)
237 {
238     int32_t timeout = va_arg(args, int32_t);
239     window->config.timeout = timeout;
240 }
241 
HandleNativeWindowSetColorGamut(OHNativeWindow * window,va_list args)242 static void HandleNativeWindowSetColorGamut(OHNativeWindow *window, va_list args)
243 {
244     int32_t colorGamut = va_arg(args, int32_t);
245     window->config.colorGamut = static_cast<GraphicColorGamut>(colorGamut);
246 }
247 
HandleNativeWindowSetTransform(OHNativeWindow * window,va_list args)248 static void HandleNativeWindowSetTransform(OHNativeWindow *window, va_list args)
249 {
250     int32_t transform = va_arg(args, int32_t);
251     window->config.transform = static_cast<GraphicTransformType>(transform);
252 }
253 
HandleNativeWindowSetUiTimestamp(OHNativeWindow * window,va_list args)254 static void HandleNativeWindowSetUiTimestamp(OHNativeWindow *window, va_list args)
255 {
256     uint64_t uiTimestamp = va_arg(args, uint64_t);
257     window->uiTimestamp = static_cast<int64_t>(uiTimestamp);
258 }
259 
HandleNativeWindowGetUsage(OHNativeWindow * window,va_list args)260 static void HandleNativeWindowGetUsage(OHNativeWindow *window, va_list args)
261 {
262     uint64_t *value = va_arg(args, uint64_t*);
263     uint64_t usage = window->config.usage;
264     *value = usage;
265 }
266 
HandleNativeWindowGetBufferGeometry(OHNativeWindow * window,va_list args)267 static void HandleNativeWindowGetBufferGeometry(OHNativeWindow *window, va_list args)
268 {
269     int32_t *height = va_arg(args, int32_t*);
270     int32_t *width = va_arg(args, int32_t*);
271     *height = window->config.height;
272     *width = window->config.width;
273 }
274 
HandleNativeWindowGetFormat(OHNativeWindow * window,va_list args)275 static void HandleNativeWindowGetFormat(OHNativeWindow *window, va_list args)
276 {
277     int32_t *format = va_arg(args, int32_t*);
278     *format = window->config.format;
279 }
280 
HandleNativeWindowGetStride(OHNativeWindow * window,va_list args)281 static void HandleNativeWindowGetStride(OHNativeWindow *window, va_list args)
282 {
283     int32_t *stride = va_arg(args, int32_t*);
284     *stride = window->config.strideAlignment;
285 }
286 
HandleNativeWindowGetTimeout(OHNativeWindow * window,va_list args)287 static void HandleNativeWindowGetTimeout(OHNativeWindow *window, va_list args)
288 {
289     int32_t *timeout = va_arg(args, int32_t*);
290     *timeout = window->config.timeout;
291 }
292 
HandleNativeWindowGetColorGamut(OHNativeWindow * window,va_list args)293 static void HandleNativeWindowGetColorGamut(OHNativeWindow *window, va_list args)
294 {
295     int32_t *colorGamut = va_arg(args, int32_t*);
296     *colorGamut = static_cast<int32_t>(window->config.colorGamut);
297 }
298 
HandleNativeWindowGetTransform(OHNativeWindow * window,va_list args)299 static void HandleNativeWindowGetTransform(OHNativeWindow *window, va_list args)
300 {
301     int32_t *transform = va_arg(args, int32_t*);
302     *transform = static_cast<int32_t>(window->config.transform);
303 }
304 
305 static std::map<int, std::function<void(OHNativeWindow*, va_list)>> operationMap = {
306     {SET_USAGE, HandleNativeWindowSetUsage},
307     {SET_BUFFER_GEOMETRY, HandleNativeWindowSetBufferGeometry},
308     {SET_FORMAT, HandleNativeWindowSetFormat},
309     {SET_STRIDE, HandleNativeWindowSetStride},
310     {SET_TIMEOUT, HandleNativeWindowSetTimeout},
311     {SET_COLOR_GAMUT, HandleNativeWindowSetColorGamut},
312     {SET_TRANSFORM, HandleNativeWindowSetTransform},
313     {SET_UI_TIMESTAMP, HandleNativeWindowSetUiTimestamp},
314     {GET_USAGE, HandleNativeWindowGetUsage},
315     {GET_BUFFER_GEOMETRY, HandleNativeWindowGetBufferGeometry},
316     {GET_FORMAT, HandleNativeWindowGetFormat},
317     {GET_STRIDE, HandleNativeWindowGetStride},
318     {GET_TIMEOUT, HandleNativeWindowGetTimeout},
319     {GET_COLOR_GAMUT, HandleNativeWindowGetColorGamut},
320     {GET_TRANSFORM, HandleNativeWindowGetTransform},
321 };
322 
InternalHandleNativeWindowOpt(OHNativeWindow * window,int code,va_list args)323 static int32_t InternalHandleNativeWindowOpt(OHNativeWindow *window, int code, va_list args)
324 {
325     auto it = operationMap.find(code);
326     if (it != operationMap.end()) {
327         it->second(window, args);
328     }
329     return OHOS::GSERROR_OK;
330 }
331 
NativeWindowHandleOpt(OHNativeWindow * window,int code,...)332 int32_t NativeWindowHandleOpt(OHNativeWindow *window, int code, ...)
333 {
334     if (window == nullptr) {
335         BLOGD("parameter error, please check input parameter");
336         return OHOS::GSERROR_INVALID_ARGUMENTS;
337     }
338     va_list args;
339     va_start(args, code);
340     InternalHandleNativeWindowOpt(window, code, args);
341     va_end(args);
342     return OHOS::GSERROR_OK;
343 }
344 
GetBufferHandleFromNative(OHNativeWindowBuffer * buffer)345 BufferHandle *GetBufferHandleFromNative(OHNativeWindowBuffer *buffer)
346 {
347     if (buffer == nullptr || buffer->sfbuffer == nullptr) {
348         BLOGE("parameter error, please check input parameter");
349         return nullptr;
350     }
351     return buffer->sfbuffer->GetBufferHandle();
352 }
353 
GetNativeObjectMagic(void * obj)354 int32_t GetNativeObjectMagic(void *obj)
355 {
356     if (obj == nullptr) {
357         BLOGE("parameter error, please check input parameter");
358         return OHOS::GSERROR_INVALID_ARGUMENTS;
359     }
360     NativeWindowMagic* nativeWindowMagic = reinterpret_cast<NativeWindowMagic *>(obj);
361     return nativeWindowMagic->magic;
362 }
363 
NativeObjectReference(void * obj)364 int32_t NativeObjectReference(void *obj)
365 {
366     if (obj == nullptr) {
367         BLOGD("parameter error, please check input parameter");
368         return OHOS::GSERROR_INVALID_ARGUMENTS;
369     }
370     switch (GetNativeObjectMagic(obj)) {
371         case NATIVE_OBJECT_MAGIC_WINDOW:
372         case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
373             break;
374         default:
375             return OHOS::GSERROR_TYPE_ERROR;
376     }
377     OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
378     ref->IncStrongRef(ref);
379     return OHOS::GSERROR_OK;
380 }
381 
NativeObjectUnreference(void * obj)382 int32_t NativeObjectUnreference(void *obj)
383 {
384     if (obj == nullptr) {
385         BLOGD("parameter error, please check input parameter");
386         return OHOS::GSERROR_INVALID_ARGUMENTS;
387     }
388     switch (GetNativeObjectMagic(obj)) {
389         case NATIVE_OBJECT_MAGIC_WINDOW:
390         case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
391             break;
392         default:
393             return OHOS::GSERROR_TYPE_ERROR;
394     }
395     OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
396     ref->DecStrongRef(ref);
397     return OHOS::GSERROR_OK;
398 }
399 
NativeWindowSetScalingMode(OHNativeWindow * window,uint32_t sequence,OHScalingMode scalingMode)400 int32_t NativeWindowSetScalingMode(OHNativeWindow *window, uint32_t sequence, OHScalingMode scalingMode)
401 {
402     if (window == nullptr || window->surface == nullptr ||
403         scalingMode < OHScalingMode::OH_SCALING_MODE_FREEZE ||
404         scalingMode > OHScalingMode::OH_SCALING_MODE_NO_SCALE_CROP) {
405         BLOGE("parameter error, please check input parameter");
406         return OHOS::GSERROR_INVALID_ARGUMENTS;
407     }
408     return window->surface->SetScalingMode(sequence, static_cast<ScalingMode>(scalingMode));
409 }
410 
NativeWindowSetMetaData(OHNativeWindow * window,uint32_t sequence,int32_t size,const OHHDRMetaData * metaData)411 int32_t NativeWindowSetMetaData(OHNativeWindow *window, uint32_t sequence, int32_t size,
412                                 const OHHDRMetaData *metaData)
413 {
414     if (window == nullptr || window->surface == nullptr || size <= 0 || metaData == nullptr) {
415         BLOGE("parameter error, please check input parameter");
416         return OHOS::GSERROR_INVALID_ARGUMENTS;
417     }
418 
419     std::vector<GraphicHDRMetaData> data(reinterpret_cast<const GraphicHDRMetaData *>(metaData),
420                                          reinterpret_cast<const GraphicHDRMetaData *>(metaData) + size);
421     return window->surface->SetMetaData(sequence, data);
422 }
423 
NativeWindowSetMetaDataSet(OHNativeWindow * window,uint32_t sequence,OHHDRMetadataKey key,int32_t size,const uint8_t * metaData)424 int32_t NativeWindowSetMetaDataSet(OHNativeWindow *window, uint32_t sequence, OHHDRMetadataKey key,
425                                    int32_t size, const uint8_t *metaData)
426 {
427     if (window == nullptr || window->surface == nullptr ||
428         key < OHHDRMetadataKey::OH_METAKEY_RED_PRIMARY_X || key > OHHDRMetadataKey::OH_METAKEY_HDR_VIVID ||
429         size <= 0 || metaData == nullptr) {
430         BLOGE("parameter error, please check input parameter");
431         return OHOS::GSERROR_INVALID_ARGUMENTS;
432     }
433     std::vector<uint8_t> data(metaData, metaData + size);
434     return window->surface->SetMetaDataSet(sequence, static_cast<GraphicHDRMetadataKey>(key), data);
435 }
436 
NativeWindowSetTunnelHandle(OHNativeWindow * window,const OHExtDataHandle * handle)437 int32_t NativeWindowSetTunnelHandle(OHNativeWindow *window, const OHExtDataHandle *handle)
438 {
439     if (window == nullptr || window->surface == nullptr || handle == nullptr) {
440         BLOGE("parameter error, please check input parameter");
441         return OHOS::GSERROR_INVALID_ARGUMENTS;
442     }
443     return window->surface->SetTunnelHandle(reinterpret_cast<const OHOS::GraphicExtDataHandle*>(handle));
444 }
445 
NativeWindow()446 NativeWindow::NativeWindow() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW), surface(nullptr)
447 {
448 }
449 
~NativeWindow()450 NativeWindow::~NativeWindow()
451 {
452     for (auto &[seqNum, buffer] : bufferCache_) {
453         NativeObjectUnreference(buffer);
454     }
455     surface = nullptr;
456     bufferCache_.clear();
457 }
458 
~NativeWindowBuffer()459 NativeWindowBuffer::~NativeWindowBuffer()
460 {
461     sfbuffer = nullptr;
462 }
463 
NativeWindowBuffer()464 NativeWindowBuffer::NativeWindowBuffer() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW_BUFFER), sfbuffer(nullptr)
465 {
466 }
467 
468 WEAK_ALIAS(CreateNativeWindowFromSurface, OH_NativeWindow_CreateNativeWindow);
469 WEAK_ALIAS(DestoryNativeWindow, OH_NativeWindow_DestroyNativeWindow);
470 WEAK_ALIAS(CreateNativeWindowBufferFromSurfaceBuffer, OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer);
471 WEAK_ALIAS(CreateNativeWindowBufferFromNativeBuffer, OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer);
472 WEAK_ALIAS(DestroyNativeWindowBuffer, OH_NativeWindow_DestroyNativeWindowBuffer);
473 WEAK_ALIAS(NativeWindowRequestBuffer, OH_NativeWindow_NativeWindowRequestBuffer);
474 WEAK_ALIAS(NativeWindowFlushBuffer, OH_NativeWindow_NativeWindowFlushBuffer);
475 WEAK_ALIAS(GetLastFlushedBuffer, OH_NativeWindow_GetLastFlushedBuffer);
476 WEAK_ALIAS(NativeWindowCancelBuffer, OH_NativeWindow_NativeWindowAbortBuffer);
477 WEAK_ALIAS(NativeWindowHandleOpt, OH_NativeWindow_NativeWindowHandleOpt);
478 WEAK_ALIAS(GetBufferHandleFromNative, OH_NativeWindow_GetBufferHandleFromNative);
479 WEAK_ALIAS(NativeObjectReference, OH_NativeWindow_NativeObjectReference);
480 WEAK_ALIAS(NativeObjectUnreference, OH_NativeWindow_NativeObjectUnreference);
481 WEAK_ALIAS(GetNativeObjectMagic, OH_NativeWindow_GetNativeObjectMagic);
482 WEAK_ALIAS(NativeWindowSetScalingMode, OH_NativeWindow_NativeWindowSetScalingMode);
483 WEAK_ALIAS(NativeWindowSetMetaData, OH_NativeWindow_NativeWindowSetMetaData);
484 WEAK_ALIAS(NativeWindowSetMetaDataSet, OH_NativeWindow_NativeWindowSetMetaDataSet);
485 WEAK_ALIAS(NativeWindowSetTunnelHandle, OH_NativeWindow_NativeWindowSetTunnelHandle);
486