19762338dSopenharmony_ci/*
29762338dSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49762338dSopenharmony_ci * you may not use this file except in compliance with the License.
59762338dSopenharmony_ci * You may obtain a copy of the License at
69762338dSopenharmony_ci *
79762338dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89762338dSopenharmony_ci *
99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129762338dSopenharmony_ci * See the License for the specific language governing permissions and
139762338dSopenharmony_ci * limitations under the License.
149762338dSopenharmony_ci */
159762338dSopenharmony_ci
169762338dSopenharmony_ci#include "loadbmp_test.h"
179762338dSopenharmony_ci#include <stdio.h>
189762338dSopenharmony_ci#include <stdint.h>
199762338dSopenharmony_ci#include <stdlib.h>
209762338dSopenharmony_ci#include <string.h>
219762338dSopenharmony_ci#include <limits.h>
229762338dSopenharmony_ci#include <sys/types.h>
239762338dSopenharmony_ci#include <unistd.h>
249762338dSopenharmony_ci#include "securec.h"
259762338dSopenharmony_ci#include "hdf_log.h"
269762338dSopenharmony_ci#include "display_type.h"
279762338dSopenharmony_ci
289762338dSopenharmony_ci#define EOK 0
299762338dSopenharmony_ci
309762338dSopenharmony_ciOsdCompInfo g_osdCompInfo[OSD_COLOR_FMT_BUTT] = {
319762338dSopenharmony_ci    {0, 4, 4, 4},   /* RGB444 */
329762338dSopenharmony_ci    {4, 4, 4, 4},   /* ARGB4444 */
339762338dSopenharmony_ci    {0, 5, 5, 5},   /* RGB555 */
349762338dSopenharmony_ci    {0, 5, 6, 5},   /* RGB565 */
359762338dSopenharmony_ci    {1, 5, 5, 5},   /* ARGB1555 */
369762338dSopenharmony_ci    {0, 0, 0, 0},   /* RESERVED */
379762338dSopenharmony_ci    {0, 8, 8, 8},   /* RGB888 */
389762338dSopenharmony_ci    {8, 8, 8, 8}    /* ARGB8888 */
399762338dSopenharmony_ci};
409762338dSopenharmony_ci
419762338dSopenharmony_cistatic uint16_t OsdMakeColorU16(uint8_t r, uint8_t g, uint8_t b, OsdCompInfo compinfo)
429762338dSopenharmony_ci{
439762338dSopenharmony_ci    uint8_t r1;
449762338dSopenharmony_ci    uint8_t g1;
459762338dSopenharmony_ci    uint8_t b1;
469762338dSopenharmony_ci    uint16_t pixel = 0;
479762338dSopenharmony_ci    uint32_t tmp = 15; // 16bit color
489762338dSopenharmony_ci
499762338dSopenharmony_ci    r1 = g1 = b1 = 0;
509762338dSopenharmony_ci    r1 = r >> (EIGHT_BITS_PER_PIXEL - compinfo.rLen);
519762338dSopenharmony_ci    g1 = g >> (EIGHT_BITS_PER_PIXEL - compinfo.gLen);
529762338dSopenharmony_ci    b1 = b >> (EIGHT_BITS_PER_PIXEL - compinfo.bLen);
539762338dSopenharmony_ci    while (compinfo.aLen != 0) {
549762338dSopenharmony_ci        pixel |= (1 << tmp);
559762338dSopenharmony_ci        tmp--;
569762338dSopenharmony_ci        compinfo.aLen--;
579762338dSopenharmony_ci    }
589762338dSopenharmony_ci
599762338dSopenharmony_ci    pixel |= (r1 | (g1 << compinfo.bLen) | (b1 << (compinfo.bLen + compinfo.gLen)));
609762338dSopenharmony_ci    return pixel;
619762338dSopenharmony_ci}
629762338dSopenharmony_ci
639762338dSopenharmony_ciint32_t GetBmpInfo(const int8_t *fileName, OsdBitMapFileHeader *bmpFileHeader, OsdBitMapInfo *bmpInfo)
649762338dSopenharmony_ci{
659762338dSopenharmony_ci    FILE *file = NULL;
669762338dSopenharmony_ci    uint16_t bfType = 0;
679762338dSopenharmony_ci    char realPath[PATH_MAX] = {0};
689762338dSopenharmony_ci
699762338dSopenharmony_ci    if (realpath((char*)fileName, realPath) == NULL) {
709762338dSopenharmony_ci        printf("%s: file %s does not exist\n", __func__, fileName);
719762338dSopenharmony_ci        return DISPLAY_FAILURE;
729762338dSopenharmony_ci    }
739762338dSopenharmony_ci    if ((file = fopen((const char*)realPath, "rb")) == NULL) {
749762338dSopenharmony_ci        HDF_LOGE("%s: Open file failure: %s", __func__, fileName);
759762338dSopenharmony_ci        return DISPLAY_FAILURE;
769762338dSopenharmony_ci    }
779762338dSopenharmony_ci
789762338dSopenharmony_ci    (void)fread(&bfType, 1, sizeof(bfType), file);
799762338dSopenharmony_ci    if (bfType != BITMAP_FILE) {
809762338dSopenharmony_ci        HDF_LOGE("%s: not bitmap file", __func__);
819762338dSopenharmony_ci        fclose(file);
829762338dSopenharmony_ci        return DISPLAY_FAILURE;
839762338dSopenharmony_ci    }
849762338dSopenharmony_ci
859762338dSopenharmony_ci    (void)fread(bmpFileHeader, 1, sizeof(OsdBitMapFileHeader), file);
869762338dSopenharmony_ci    (void)fread(bmpInfo, 1, sizeof(OsdBitMapInfo), file);
879762338dSopenharmony_ci    fclose(file);
889762338dSopenharmony_ci
899762338dSopenharmony_ci    return DISPLAY_SUCCESS;
909762338dSopenharmony_ci}
919762338dSopenharmony_ci
929762338dSopenharmony_cistatic int32_t CheckBmpInfo(const OsdBitMapInfo *bmpInfo)
939762338dSopenharmony_ci{
949762338dSopenharmony_ci    uint16_t bpp;
959762338dSopenharmony_ci
969762338dSopenharmony_ci    bpp = bmpInfo->header.bitCnt / EIGHT_BITS_PER_PIXEL;
979762338dSopenharmony_ci    if (bpp < INVALID_BITS) {
989762338dSopenharmony_ci        /* only support 1555.8888  888 bitmap */
999762338dSopenharmony_ci        HDF_LOGE("%s: bitmap format not supported", __func__);
1009762338dSopenharmony_ci        return DISPLAY_FAILURE;
1019762338dSopenharmony_ci    }
1029762338dSopenharmony_ci
1039762338dSopenharmony_ci    if (bmpInfo->header.compress != 0) {
1049762338dSopenharmony_ci        HDF_LOGE("%s: not support compressed bitmap file", __func__);
1059762338dSopenharmony_ci        return DISPLAY_FAILURE;
1069762338dSopenharmony_ci    }
1079762338dSopenharmony_ci    if (bmpInfo->header.height == 0) {
1089762338dSopenharmony_ci        HDF_LOGE("%s: bmpInfo.header.height is 0", __func__);
1099762338dSopenharmony_ci        return DISPLAY_FAILURE;
1109762338dSopenharmony_ci    }
1119762338dSopenharmony_ci    return DISPLAY_SUCCESS;
1129762338dSopenharmony_ci}
1139762338dSopenharmony_ci
1149762338dSopenharmony_cistatic int32_t LoadPicToBuffer(const int8_t *fileName, OsdLogo *videoLogo, OsdColorFmt enFmt,
1159762338dSopenharmony_ci                               uint8_t **outBuf, uint32_t *stride)
1169762338dSopenharmony_ci{
1179762338dSopenharmony_ci    FILE *file = NULL;
1189762338dSopenharmony_ci    OsdBitMapFileHeader bmpFileHeader;
1199762338dSopenharmony_ci    OsdBitMapInfo       bmpInfo;
1209762338dSopenharmony_ci    uint32_t h;
1219762338dSopenharmony_ci    uint64_t byteNum;
1229762338dSopenharmony_ci    char realPath[PATH_MAX] = {0};
1239762338dSopenharmony_ci
1249762338dSopenharmony_ci    if (GetBmpInfo(fileName, &bmpFileHeader, &bmpInfo) < 0) {
1259762338dSopenharmony_ci        return DISPLAY_FAILURE;
1269762338dSopenharmony_ci    }
1279762338dSopenharmony_ci    if (CheckBmpInfo(&bmpInfo) != DISPLAY_SUCCESS) {
1289762338dSopenharmony_ci        /* only support 1555.8888  888 bitmap */
1299762338dSopenharmony_ci        HDF_LOGE("%s: bitmap format not supported", __func__);
1309762338dSopenharmony_ci        return DISPLAY_FAILURE;
1319762338dSopenharmony_ci    }
1329762338dSopenharmony_ci    videoLogo->bpp = bmpInfo.header.bitCnt / EIGHT_BITS_PER_PIXEL;
1339762338dSopenharmony_ci    if (realpath((char*)fileName, realPath) == NULL) {
1349762338dSopenharmony_ci        printf("%s: file %s does not exist\n", __func__, fileName);
1359762338dSopenharmony_ci        return DISPLAY_FAILURE;
1369762338dSopenharmony_ci    }
1379762338dSopenharmony_ci    if ((file = fopen((const char*)realPath, "rb")) == NULL) {
1389762338dSopenharmony_ci        HDF_LOGE("%s: Open file failure: %s", __func__, fileName);
1399762338dSopenharmony_ci        return DISPLAY_FAILURE;
1409762338dSopenharmony_ci    }
1419762338dSopenharmony_ci    videoLogo->width = bmpInfo.header.width;
1429762338dSopenharmony_ci    videoLogo->height = ((bmpInfo.header.height > 0) ? bmpInfo.header.height :
1439762338dSopenharmony_ci                        (-bmpInfo.header.height));
1449762338dSopenharmony_ci    *stride = videoLogo->width * videoLogo->bpp;
1459762338dSopenharmony_ci    h = videoLogo->height;
1469762338dSopenharmony_ci    if ((*stride % FOUR_BITS_PER_PIXEL) != 0) {
1479762338dSopenharmony_ci        *stride = (*stride & 0xfffc) + FOUR_BITS_PER_PIXEL;
1489762338dSopenharmony_ci    }
1499762338dSopenharmony_ci    /* RGB8888 or RGB1555 */
1509762338dSopenharmony_ci    *outBuf = (uint8_t*)malloc(videoLogo->height * (*stride));
1519762338dSopenharmony_ci    if (*outBuf == NULL) {
1529762338dSopenharmony_ci        HDF_LOGE("%s: not enough memory to malloc", __func__);
1539762338dSopenharmony_ci        fclose(file);
1549762338dSopenharmony_ci        return DISPLAY_FAILURE;
1559762338dSopenharmony_ci    }
1569762338dSopenharmony_ci    fseek(file, bmpFileHeader.offBits, 0);
1579762338dSopenharmony_ci    byteNum = h * (*stride);
1589762338dSopenharmony_ci    if (byteNum > UINT32_MAX) {
1599762338dSopenharmony_ci        HDF_LOGE("%s: buffer size is beyond param's limit", __func__);
1609762338dSopenharmony_ci        fclose(file);
1619762338dSopenharmony_ci        free(*outBuf);
1629762338dSopenharmony_ci        *outBuf = NULL;
1639762338dSopenharmony_ci        return DISPLAY_FAILURE;
1649762338dSopenharmony_ci    }
1659762338dSopenharmony_ci    if (fread((*outBuf), 1, byteNum, file) != byteNum) {
1669762338dSopenharmony_ci        HDF_LOGE("%s: fread %u*%u error", __func__, h, *stride);
1679762338dSopenharmony_ci        fclose(file);
1689762338dSopenharmony_ci        free(*outBuf);
1699762338dSopenharmony_ci        *outBuf = NULL;
1709762338dSopenharmony_ci        return DISPLAY_FAILURE;
1719762338dSopenharmony_ci    }
1729762338dSopenharmony_ci    if (enFmt >= OSD_COLOR_FMT_RGB888) {
1739762338dSopenharmony_ci        videoLogo->stride = videoLogo->width * FOUR_BITS_PER_PIXEL;
1749762338dSopenharmony_ci    } else {
1759762338dSopenharmony_ci        videoLogo->stride = videoLogo->width * TWO_BITS_PER_PIXEL;
1769762338dSopenharmony_ci    }
1779762338dSopenharmony_ci    fclose(file);
1789762338dSopenharmony_ci    return DISPLAY_SUCCESS;
1799762338dSopenharmony_ci}
1809762338dSopenharmony_ci
1819762338dSopenharmony_cistatic void LoadRgbData(OsdLogo *videoLogo, OsdColorFmt enFmt, uint32_t stride, uint8_t *origBuf)
1829762338dSopenharmony_ci{
1839762338dSopenharmony_ci    uint16_t i;
1849762338dSopenharmony_ci    uint16_t j;
1859762338dSopenharmony_ci    uint8_t *start = NULL;
1869762338dSopenharmony_ci    uint16_t *dst = NULL;
1879762338dSopenharmony_ci    uint32_t h;
1889762338dSopenharmony_ci    OsdColor c;
1899762338dSopenharmony_ci
1909762338dSopenharmony_ci    h = videoLogo->height;
1919762338dSopenharmony_ci    for (i = 0; i < videoLogo->height; i++) {
1929762338dSopenharmony_ci        for (j = 0; j < videoLogo->width; j++) {
1939762338dSopenharmony_ci            /* start color convert */
1949762338dSopenharmony_ci            start = origBuf + ((h - 1) - i) * stride + j * videoLogo->bpp;
1959762338dSopenharmony_ci            dst = (uint16_t*)(videoLogo->picBuffer + i * videoLogo->stride + j * TWO_OFFSET);
1969762338dSopenharmony_ci            c.r = *(start);
1979762338dSopenharmony_ci            c.g = *(start + ONE_OFFSET);
1989762338dSopenharmony_ci            c.b = *(start + TWO_OFFSET);
1999762338dSopenharmony_ci            *dst = OsdMakeColorU16(c.r, c.g, c.b, g_osdCompInfo[enFmt]);
2009762338dSopenharmony_ci        }
2019762338dSopenharmony_ci    }
2029762338dSopenharmony_ci}
2039762338dSopenharmony_ci
2049762338dSopenharmony_cistatic int32_t LoadData(OsdLogo *videoLogo, OsdColorFmt enFmt, uint32_t stride, uint8_t *origBuf)
2059762338dSopenharmony_ci{
2069762338dSopenharmony_ci    int32_t ret;
2079762338dSopenharmony_ci    uint16_t i;
2089762338dSopenharmony_ci    uint16_t j;
2099762338dSopenharmony_ci    uint32_t h;
2109762338dSopenharmony_ci
2119762338dSopenharmony_ci    (void)enFmt;
2129762338dSopenharmony_ci    h = videoLogo->height;
2139762338dSopenharmony_ci    for (i = 0; i < videoLogo->height; i++) {
2149762338dSopenharmony_ci        for (j = 0; j < videoLogo->width; j++) {
2159762338dSopenharmony_ci            ret = memcpy_s((videoLogo->picBuffer + i * videoLogo->stride + j * FOUR_BITS_PER_PIXEL), videoLogo->len,
2169762338dSopenharmony_ci                (origBuf + ((h - 1) - i) * stride + j * videoLogo->bpp), videoLogo->bpp);
2179762338dSopenharmony_ci            if (ret != EOK) {
2189762338dSopenharmony_ci                HDF_LOGE("%s: file: %s, line: %d, memcpy_s failure", __func__, __FILE__, __LINE__);
2199762338dSopenharmony_ci                return DISPLAY_FAILURE;
2209762338dSopenharmony_ci            }
2219762338dSopenharmony_ci            *(videoLogo->picBuffer + i * videoLogo->stride + j * FOUR_BITS_PER_PIXEL + THREE_BITS_PER_PIXEL) = 0xff;
2229762338dSopenharmony_ci        }
2239762338dSopenharmony_ci    }
2249762338dSopenharmony_ci    return DISPLAY_SUCCESS;
2259762338dSopenharmony_ci}
2269762338dSopenharmony_ci
2279762338dSopenharmony_cistatic int32_t Copy3BitsByFmt(OsdLogo *videoLogo, OsdColorFmt enFmt, uint32_t stride, uint8_t *origBuf)
2289762338dSopenharmony_ci{
2299762338dSopenharmony_ci    int32_t ret = DISPLAY_SUCCESS;
2309762338dSopenharmony_ci
2319762338dSopenharmony_ci    switch (enFmt) {
2329762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB444:
2339762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB555:
2349762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB565:
2359762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB1555:
2369762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB4444:
2379762338dSopenharmony_ci            /* start color convert */
2389762338dSopenharmony_ci            LoadRgbData(videoLogo, enFmt, stride, origBuf);
2399762338dSopenharmony_ci            break;
2409762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB888:
2419762338dSopenharmony_ci        case OSD_COLOR_FMT_RGB8888:
2429762338dSopenharmony_ci            ret = LoadData(videoLogo, enFmt, stride, origBuf);
2439762338dSopenharmony_ci            break;
2449762338dSopenharmony_ci        default:
2459762338dSopenharmony_ci            HDF_LOGE("%s: file: %s, line: %d, no such format", __func__, __FILE__, __LINE__);
2469762338dSopenharmony_ci            return DISPLAY_FAILURE;
2479762338dSopenharmony_ci    }
2489762338dSopenharmony_ci    return ret;
2499762338dSopenharmony_ci}
2509762338dSopenharmony_ci
2519762338dSopenharmony_cistatic int32_t Copy2BitsAnd4Bits(OsdLogo *videoLogo, uint32_t stride, uint8_t *origBuf)
2529762338dSopenharmony_ci{
2539762338dSopenharmony_ci    int32_t ret;
2549762338dSopenharmony_ci    uint16_t i;
2559762338dSopenharmony_ci    uint16_t j;
2569762338dSopenharmony_ci    uint8_t *pRGBBuf;
2579762338dSopenharmony_ci
2589762338dSopenharmony_ci    pRGBBuf = videoLogo->picBuffer;
2599762338dSopenharmony_ci    for (i = 0; i < videoLogo->height; i++) {
2609762338dSopenharmony_ci        for (j = 0; j < videoLogo->width; j++) {
2619762338dSopenharmony_ci            ret = memcpy_s((pRGBBuf + i * videoLogo->stride + j * videoLogo->bpp), videoLogo->len,
2629762338dSopenharmony_ci                (origBuf + ((videoLogo->height - 1) - i) * stride + j * videoLogo->bpp), videoLogo->bpp);
2639762338dSopenharmony_ci            if (ret != EOK) {
2649762338dSopenharmony_ci                HDF_LOGE("%s: file: %s, line: %d, memcpy_s failure", __func__, __FILE__, __LINE__);
2659762338dSopenharmony_ci                return DISPLAY_FAILURE;
2669762338dSopenharmony_ci            }
2679762338dSopenharmony_ci        }
2689762338dSopenharmony_ci    }
2699762338dSopenharmony_ci    return DISPLAY_SUCCESS;
2709762338dSopenharmony_ci}
2719762338dSopenharmony_ci
2729762338dSopenharmony_cistatic int32_t LoadBMPEx(const int8_t *fileName, OsdLogo *videoLogo, OsdColorFmt enFmt)
2739762338dSopenharmony_ci{
2749762338dSopenharmony_ci    int32_t ret;
2759762338dSopenharmony_ci    uint32_t stride;
2769762338dSopenharmony_ci    uint8_t *origBmpBuf = NULL;
2779762338dSopenharmony_ci
2789762338dSopenharmony_ci    ret = LoadPicToBuffer(fileName, videoLogo, enFmt, &origBmpBuf, &stride);
2799762338dSopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
2809762338dSopenharmony_ci        HDF_LOGE("%s: LoadPicToBuffer failure", __func__);
2819762338dSopenharmony_ci        return DISPLAY_FAILURE;
2829762338dSopenharmony_ci    }
2839762338dSopenharmony_ci    if (videoLogo->bpp == THREE_BITS_PER_PIXEL) {
2849762338dSopenharmony_ci        ret = Copy3BitsByFmt(videoLogo, enFmt, stride, origBmpBuf);
2859762338dSopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
2869762338dSopenharmony_ci            HDF_LOGE("%s: Copy3BitsByFmt failure", __func__);
2879762338dSopenharmony_ci        }
2889762338dSopenharmony_ci    } else if ((videoLogo->bpp == TWO_BITS_PER_PIXEL) || (videoLogo->bpp == FOUR_BITS_PER_PIXEL)) {
2899762338dSopenharmony_ci        ret = Copy2BitsAnd4Bits(videoLogo, stride, origBmpBuf);
2909762338dSopenharmony_ci        if (ret != DISPLAY_SUCCESS) {
2919762338dSopenharmony_ci            HDF_LOGE("%s: Copy2BitsAnd4Bits failure", __func__);
2929762338dSopenharmony_ci            free(origBmpBuf);
2939762338dSopenharmony_ci            return ret;
2949762338dSopenharmony_ci        }
2959762338dSopenharmony_ci    }
2969762338dSopenharmony_ci    free(origBmpBuf);
2979762338dSopenharmony_ci    return DISPLAY_SUCCESS;
2989762338dSopenharmony_ci}
2999762338dSopenharmony_ci
3009762338dSopenharmony_cistatic int32_t LoadImageEx(const int8_t *fileName, OsdLogo *videoLogo, OsdColorFmt enFmt)
3019762338dSopenharmony_ci{
3029762338dSopenharmony_ci    char *ext = strrchr((const char *)fileName, '.');
3039762338dSopenharmony_ci
3049762338dSopenharmony_ci    if (ext == NULL) {
3059762338dSopenharmony_ci        HDF_LOGE("%s: LoadImageEx error", __func__);
3069762338dSopenharmony_ci        return DISPLAY_FAILURE;
3079762338dSopenharmony_ci    }
3089762338dSopenharmony_ci
3099762338dSopenharmony_ci    ext = ext + 1;
3109762338dSopenharmony_ci    if (strcmp(ext, "bmp") == 0) {
3119762338dSopenharmony_ci        if (LoadBMPEx(fileName, videoLogo, enFmt) != 0) {
3129762338dSopenharmony_ci            HDF_LOGE("%s: LoadBMPEx error", __func__);
3139762338dSopenharmony_ci            return DISPLAY_FAILURE;
3149762338dSopenharmony_ci        }
3159762338dSopenharmony_ci    } else {
3169762338dSopenharmony_ci        HDF_LOGE("%s: not supported image file", __func__);
3179762338dSopenharmony_ci        return DISPLAY_FAILURE;
3189762338dSopenharmony_ci    }
3199762338dSopenharmony_ci
3209762338dSopenharmony_ci    return DISPLAY_SUCCESS;
3219762338dSopenharmony_ci}
3229762338dSopenharmony_ci
3239762338dSopenharmony_ciint32_t CreateSurfaceByBitMap(const int8_t *fileName, OsdSurface *pstSurface, uint8_t *virAddr, uint32_t len)
3249762338dSopenharmony_ci{
3259762338dSopenharmony_ci    OsdLogo stLogo;
3269762338dSopenharmony_ci
3279762338dSopenharmony_ci    if (fileName == NULL) {
3289762338dSopenharmony_ci        HDF_LOGE("%s: fileName is null", __func__);
3299762338dSopenharmony_ci        return DISPLAY_FAILURE;
3309762338dSopenharmony_ci    }
3319762338dSopenharmony_ci    if (pstSurface == NULL) {
3329762338dSopenharmony_ci        HDF_LOGE("%s: pstSurface is null", __func__);
3339762338dSopenharmony_ci        return DISPLAY_FAILURE;
3349762338dSopenharmony_ci    }
3359762338dSopenharmony_ci    if (virAddr == NULL) {
3369762338dSopenharmony_ci        HDF_LOGE("%s: virAddr is null", __func__);
3379762338dSopenharmony_ci        return DISPLAY_FAILURE;
3389762338dSopenharmony_ci    }
3399762338dSopenharmony_ci    (void)memset_s(&stLogo, sizeof(OsdLogo), 0, sizeof(OsdLogo));
3409762338dSopenharmony_ci    stLogo.picBuffer = virAddr;
3419762338dSopenharmony_ci    stLogo.len = len;
3429762338dSopenharmony_ci    if (LoadImageEx(fileName, &stLogo, pstSurface->colorFmt) < 0) {
3439762338dSopenharmony_ci        HDF_LOGE("%s: load bmp error", __func__);
3449762338dSopenharmony_ci        return DISPLAY_FAILURE;
3459762338dSopenharmony_ci    }
3469762338dSopenharmony_ci    pstSurface->height = stLogo.height;
3479762338dSopenharmony_ci    pstSurface->width = stLogo.width;
3489762338dSopenharmony_ci    pstSurface->stride = stLogo.stride;
3499762338dSopenharmony_ci    return DISPLAY_SUCCESS;
3509762338dSopenharmony_ci}
351