/*
 * Copyright (c) 2024-2026 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "nativeFontNdk.h"
#include "common.h"

#define ARR_NUM_0 0
#define ARR_NUM_1 1
#define ARR_NUM_2 2
#define ARR_NUM_3 3
#define ARR_NUM_4 4
#define ALIGNMENT600 600
#define ALIGNMENT700 700
#define ALIGNMENT20 20
#define TEXTLINE30 30
#define TEXTLINE250 250
#define HEIGHT40 40
#define NUM_50 50
#define NUM_500 500.0
#define NUM_10 10
#define INT_NUM_2 2
#define INT_NUM_100 100
#define INT_NUM_200 200
#define INT_NUM_5 5
#define INT_NUM_400 400
#define INT_NUM_500 500
#define DOUBLE_NUM_2 2.0
#define DOUBLE_NUM_0 0.0
#define DOUBLE_NEGATIVE_NUM_1 (-1.0)
#define DOUBLE_NUM_05 0.5
#define DOUBLE_NUM_100 100.0
#define DOUBLE_NUM_800 800.0
#define DOUBLE_NUM_10 10.0
#define DOUBLE_NUM_15 15.0
#define DOUBLE_NUM_001 0.01

static OH_Drawing_TypographyStyle *typoStyle_ = nullptr;
static OH_Drawing_TextStyle *txtStyle_ = nullptr;
static OH_Drawing_FontCollection *fontCollection_ = nullptr;
static OH_Drawing_TypographyCreate *handler_ = nullptr;
static OH_Drawing_Typography *typography_ = nullptr;
static OH_Drawing_Bitmap *cBitmap_ = nullptr;
static OH_Drawing_Canvas *canvas_ = nullptr;
static OH_Drawing_TypographyCreate *handler2_ = nullptr;
static OH_Drawing_FontCollection *fontCollection2_ = nullptr;
static OH_Drawing_TextStyle *txtStyle2_ = nullptr;
static OH_Drawing_TypographyStyle *typoStyle2_ = nullptr;
std::string g_text;

static void PrepareCreateTextLine(const std::string &text)
{
    double maxWidth = NUM_500;
    uint32_t height = HEIGHT40;
    typoStyle_ = OH_Drawing_CreateTypographyStyle();
    txtStyle_ = OH_Drawing_CreateTextStyle();
    fontCollection_ = OH_Drawing_CreateFontCollection();
    handler_ = OH_Drawing_CreateTypographyHandler(typoStyle_, fontCollection_);
    OH_Drawing_SetTextStyleColor(txtStyle_, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00));
    double fontSize = TEXTLINE30;
    OH_Drawing_SetTextStyleFontSize(txtStyle_, fontSize);
    OH_Drawing_SetTextStyleFontWeight(txtStyle_, FONT_WEIGHT_400);
    bool halfLeading = true;
    OH_Drawing_SetTextStyleHalfLeading(txtStyle_, halfLeading);
    const char *fontFamilies[] = {"Roboto"};
    OH_Drawing_SetTextStyleFontFamilies(txtStyle_, 1, fontFamilies);
    OH_Drawing_TypographyHandlerPushTextStyle(handler_, txtStyle_);
    OH_Drawing_TypographyHandlerAddText(handler_, text.c_str());
    OH_Drawing_TypographyHandlerPopTextStyle(handler_);
    typography_ = OH_Drawing_CreateTypography(handler_);
    OH_Drawing_TypographyLayout(typography_, maxWidth);
    double position[2] = {DOUBLE_NUM_10, DOUBLE_NUM_15};
    cBitmap_ = OH_Drawing_BitmapCreate();
    OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
    uint32_t width = ALIGNMENT20;
    OH_Drawing_BitmapBuild(cBitmap_, width, height, &cFormat);
    canvas_ = OH_Drawing_CanvasCreate();
    OH_Drawing_CanvasBind(canvas_, cBitmap_);
    OH_Drawing_CanvasClear(canvas_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF));
    OH_Drawing_TypographyPaint(typography_, canvas_, position[0], position[1]);
}

static void TearDown()
{
    if (canvas_ != nullptr) {
        OH_Drawing_CanvasDestroy(canvas_);
        canvas_ = nullptr;
    }
    if (typography_ != nullptr) {
        OH_Drawing_DestroyTypography(typography_);
        typography_ = nullptr;
    }
    if (handler_ != nullptr) {
        OH_Drawing_DestroyTypographyHandler(handler_);
        handler_ = nullptr;
    }
    if (txtStyle_ != nullptr) {
        OH_Drawing_DestroyTextStyle(txtStyle_);
        txtStyle_ = nullptr;
    }
    if (typoStyle_ != nullptr) {
        OH_Drawing_DestroyTypographyStyle(typoStyle_);
        typoStyle_ = nullptr;
    }
    if (cBitmap_ != nullptr) {
        OH_Drawing_BitmapDestroy(cBitmap_);
        cBitmap_ = nullptr;
    }
    if (fontCollection_ != nullptr) {
        OH_Drawing_DestroyFontCollection(fontCollection_);
        fontCollection_ = nullptr;
    }
}

static void PrepareTypographyCreate(const char *text)
{
    fontCollection2_ = OH_Drawing_CreateFontCollection();
    typoStyle2_ = OH_Drawing_CreateTypographyStyle();
    handler2_ = OH_Drawing_CreateTypographyHandler(typoStyle2_, fontCollection2_);
    txtStyle2_ = OH_Drawing_CreateTextStyle();
    OH_Drawing_SetTextStyleColor(txtStyle2_, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00));
    double fontSize = TEXTLINE30;
    OH_Drawing_SetTextStyleFontSize(txtStyle2_, fontSize);
    OH_Drawing_SetTextStyleFontWeight(txtStyle2_, FONT_WEIGHT_400);
    OH_Drawing_SetTextStyleBaseLine(txtStyle2_, TEXT_BASELINE_ALPHABETIC);
    const char *fontFamilies[] = {"Roboto"};
    OH_Drawing_SetTextStyleFontFamilies(txtStyle2_, 1, fontFamilies);
    OH_Drawing_TypographyHandlerPushTextStyle(handler2_, txtStyle2_);
    if (text != nullptr) {
        OH_Drawing_TypographyHandlerAddText(handler2_, text);
    }
}

static void TypographyTearDown()
{
    if (handler2_ != nullptr) {
        OH_Drawing_DestroyTypographyHandler(handler2_);
        handler2_ = nullptr;
    }
    if (txtStyle2_ != nullptr) {
        OH_Drawing_DestroyTextStyle(txtStyle2_);
        txtStyle2_ = nullptr;
    }
    if (fontCollection2_ != nullptr) {
        OH_Drawing_DestroyFontCollection(fontCollection2_);
        fontCollection2_ = nullptr;
    }
    if (typoStyle2_ != nullptr) {
        OH_Drawing_DestroyTypographyStyle(typoStyle2_);
        typoStyle2_ = nullptr;
    }
}

napi_value OHDrawingMatchFontDescriptors001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontDescriptor *descArr = OH_Drawing_MatchFontDescriptors(nullptr, nullptr);
    if (descArr == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingMatchFontDescriptors002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontDescriptor *desc = OH_Drawing_CreateFontDescriptor();
    size_t num = 0;
    OH_Drawing_FontDescriptor *descArr = OH_Drawing_MatchFontDescriptors(desc, &num);
    if ((descArr != nullptr) && (num != 0)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontDescriptor(desc);
    OH_Drawing_DestroyFontDescriptors(descArr, num);
    return result;
}

napi_value OHDrawingMatchFontDescriptors003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontDescriptor *desc = OH_Drawing_CreateFontDescriptor();
    desc->weight = -1;
    size_t num = 0;
    OH_Drawing_FontDescriptor *descArr = OH_Drawing_MatchFontDescriptors(desc, &num);
    if ((descArr == nullptr) && (num == 0)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontDescriptor(desc);
    return result;
}

napi_value OHDrawingMatchFontDescriptors004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;

    OH_Drawing_FontDescriptor *desc = OH_Drawing_CreateFontDescriptor();
    char *fontFamily = strdup("HarmonyOS Sans");
    desc->fontFamily = fontFamily;
    size_t num = 0;
    OH_Drawing_FontDescriptor *descArr = OH_Drawing_MatchFontDescriptors(desc, &num);
    if ((descArr != nullptr) && (num >= 1) && (strcmp(descArr[0].fontFamily, fontFamily) == 0)) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    OH_Drawing_DestroyFontDescriptors(descArr, num);
    free(fontFamily);
    napi_set_element(env, result, ARR_NUM_0, result1);

    fontFamily = strdup("HarmonyOS Sans Condensed");
    desc->fontFamily = fontFamily;
    descArr = OH_Drawing_MatchFontDescriptors(desc, &num);
    if ((descArr != nullptr) && (num == 1) && (strcmp(descArr[0].fontFamily, fontFamily) == 0)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    OH_Drawing_DestroyFontDescriptors(descArr, num);
    OH_Drawing_DestroyFontDescriptor(desc);
    napi_set_element(env, result, ARR_NUM_1, result2);
    return result;
}

napi_value OHDrawingMatchFontDescriptors005(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontDescriptor *desc = OH_Drawing_CreateFontDescriptor();
    char *fontFamily = strdup("HarmonyOS Sans");
    desc->fontFamily = fontFamily;
    desc->weight = INT_NUM_400;
    size_t num = 0;
    OH_Drawing_FontDescriptor *descArr = OH_Drawing_MatchFontDescriptors(desc, &num);
    if ((descArr != nullptr) && (num >= 1) && (strcmp(descArr[0].fontFamily, fontFamily) == 0) &&
        (descArr[0].weight == INT_NUM_400)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontDescriptors(descArr, num);
    OH_Drawing_DestroyFontDescriptor(desc);
    return result;
}

napi_value OHDrawingGetFontDescriptorByFullName001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType(0b10000);
    OH_Drawing_FontDescriptor *descriptor = OH_Drawing_GetFontDescriptorByFullName(nullptr, fontType);
    if (descriptor == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetFontDescriptorByFullName002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    const uint8_t ttfFullname[] = {
        0x4F, 0x60,
        0x59, 0x7D,
        0x00, 0x6F,
        0x00, 0x70,
        0x00, 0x65,
        0x00, 0x6E,
        0x00, 0x68,
        0x00, 0x61,
        0x00, 0x72,
        0x00, 0x6D,
        0x00, 0x6F,
        0x00, 0x6E,
        0x00, 0x79
    };
    OH_Drawing_String drawingString;
    drawingString.strData = const_cast<uint8_t*>(ttfFullname);
    drawingString.strLen = sizeof(ttfFullname);
    OH_Drawing_FontDescriptor *descriptor =
        OH_Drawing_GetFontDescriptorByFullName(&drawingString, OH_Drawing_SystemFontType::ALL);
    if (descriptor == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetFontDescriptorByFullName003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_4, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    napi_value result4 = nullptr;

    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType::GENERIC;
    OH_Drawing_Array *fontList = OH_Drawing_GetSystemFontFullNamesByType(fontType);
    if (fontList != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t size = OH_Drawing_GetDrawingArraySize(fontList);
    if (size != 0) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    for (size_t i = 0; i < size; i++) {
        const OH_Drawing_String *fontFullName = OH_Drawing_GetSystemFontFullNameByIndex(fontList, i);
        if (fontFullName != nullptr) {
            napi_create_int32(env, SUCCESS, &result3);
        } else {
            napi_create_int32(env, FAIL, &result3);
        }
        napi_set_element(env, result, ARR_NUM_2, result3);

        OH_Drawing_FontDescriptor *descriptor = OH_Drawing_GetFontDescriptorByFullName(fontFullName, fontType);
        if (descriptor != nullptr) {
            napi_create_int32(env, SUCCESS, &result4);
        } else {
            napi_create_int32(env, FAIL, &result4);
        }
        napi_set_element(env, result, ARR_NUM_3, result4);
        OH_Drawing_DestroyFontDescriptor(descriptor);
    }
    OH_Drawing_DestroySystemFontFullNames(fontList);
    return result;
}

napi_value OHDrawingGetFontDescriptorByFullName004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_4, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    napi_value result4 = nullptr;

    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType(ALL | STYLISH);
    OH_Drawing_Array *fontList = OH_Drawing_GetSystemFontFullNamesByType(fontType);
    if (fontList != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t size = OH_Drawing_GetDrawingArraySize(fontList);
    if (size != 0) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    for (size_t i = 0; i < size; i++) {
        const OH_Drawing_String *fontFullName = OH_Drawing_GetSystemFontFullNameByIndex(fontList, i);
        if (fontFullName != nullptr) {
            napi_create_int32(env, SUCCESS, &result3);
        } else {
            napi_create_int32(env, FAIL, &result3);
        }
        napi_set_element(env, result, ARR_NUM_2, result3);

        OH_Drawing_FontDescriptor *descriptor = OH_Drawing_GetFontDescriptorByFullName(fontFullName, fontType);
        if (descriptor != nullptr) {
            napi_create_int32(env, SUCCESS, &result4);
        } else {
            napi_create_int32(env, FAIL, &result4);
        }
        napi_set_element(env, result, ARR_NUM_3, result4);
        OH_Drawing_DestroyFontDescriptor(descriptor);
    }
    OH_Drawing_DestroySystemFontFullNames(fontList);
    return result;
}

napi_value OHDrawingGetSystemFontFullNamesByType001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType(0b10000);
    OH_Drawing_Array *fontList = OH_Drawing_GetSystemFontFullNamesByType(fontType);
    if (fontList == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetSystemFontFullNamesByType002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_4, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    napi_value result4 = nullptr;

    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType::GENERIC;
    OH_Drawing_Array *fontList = OH_Drawing_GetSystemFontFullNamesByType(fontType);
    if (fontList != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    const OH_Drawing_String *fullName = OH_Drawing_GetSystemFontFullNameByIndex(fontList, INT_NUM_500);
    if (fullName == nullptr) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    OH_Drawing_DestroySystemFontFullNames(fontList);
    napi_set_element(env, result, ARR_NUM_1, result2);

    const OH_Drawing_String *fullName1 = OH_Drawing_GetSystemFontFullNameByIndex(nullptr, 0);
    if (fullName1 == nullptr) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);

    const OH_Drawing_String *fullName2 = OH_Drawing_GetSystemFontFullNameByIndex(nullptr, INT_NUM_500);
    if (fullName2 == nullptr) {
        napi_create_int32(env, SUCCESS, &result4);
    } else {
        napi_create_int32(env, FAIL, &result4);
    }
    napi_set_element(env, result, ARR_NUM_3, result4);
    OH_Drawing_DestroySystemFontFullNames(nullptr);
    return result;
}

napi_value OHDrawingGetSystemFontFullNamesByType003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    OH_Drawing_FontCollection *fc = OH_Drawing_CreateSharedFontCollection();
    const char *fontFamily = "NotoSansCJKjp-Regular-Alphabetic";
    const char *fontPath = "/system/fonts/NotoSansCJK-Regular.ttc";
    OH_Drawing_RegisterFont(fc, fontFamily, fontPath);

    OH_Drawing_Array *ttfs = OH_Drawing_GetSystemFontFullNamesByType(CUSTOMIZED);
    size_t num = OH_Drawing_GetDrawingArraySize(ttfs);
    if (num == 1) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    for (size_t i = 0; i < num; i++) {
        const OH_Drawing_String *fullName = OH_Drawing_GetSystemFontFullNameByIndex(ttfs, i);
        OH_Drawing_FontDescriptor *fd = OH_Drawing_GetFontDescriptorByFullName(fullName, CUSTOMIZED);
        NAPI_ASSERT_NO_MES(fd != nullptr);
        if (strcmp(fd->fullName, "Noto Sans CJK JP") == 0) {
            napi_create_int32(env, SUCCESS, &result2);
        } else {
            napi_create_int32(env, FAIL, &result2);
        }
        napi_set_element(env, result, ARR_NUM_1, result2);
    }
    OH_Drawing_ClearFontCaches(fc);
    OH_Drawing_DestroyFontCollection(fc);
    return result;
}

napi_value OHDrawingGetSystemFontFullNamesByType004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontCollection *fc = OH_Drawing_CreateSharedFontCollection();
    const char *fontFamily = "xxxxxxx";
    const char *fontPath = "/system/fonts/xxxxxxx.ttf";
    OH_Drawing_RegisterFont(fc, fontFamily, fontPath);

    OH_Drawing_Array *ttfs = OH_Drawing_GetSystemFontFullNamesByType(CUSTOMIZED);
    size_t num = OH_Drawing_GetDrawingArraySize(ttfs);
    if (num == 0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_ClearFontCaches(fc);
    OH_Drawing_DestroyFontCollection(fc);
    return result;
}

napi_value OHDrawingGetSystemFontFullNameByIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    const OH_Drawing_String *fullName = OH_Drawing_GetSystemFontFullNameByIndex(nullptr, 0 | 500);
    if (fullName == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroySystemFontFullNames(nullptr);
    return result;
}

napi_value OHDrawingCreateLineTypography001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TypographyCreate *handler_ = nullptr;
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler_);
    if (lineTypography == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingCreateLineTypography002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TypographyCreate *handler_ = nullptr;
    OH_Drawing_FontCollection *fontCollection_ = nullptr;
    OH_Drawing_TypographyStyle *typoStyle_ = nullptr;
    const char *text = "OpenHarmony\n";
    fontCollection_ = OH_Drawing_CreateFontCollection();
    typoStyle_ = OH_Drawing_CreateTypographyStyle();
    handler_ = OH_Drawing_CreateTypographyHandler(typoStyle_, fontCollection_);
    OH_Drawing_TypographyHandlerAddText(handler_, text);
    OH_Drawing_LineTypography *lineTypography1 = OH_Drawing_CreateLineTypography(handler_);
    if (lineTypography1 != nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontCollection(fontCollection_);
    OH_Drawing_DestroyTypographyStyle(typoStyle_);
    OH_Drawing_DestroyTypographyHandler(handler_);
    OH_Drawing_DestroyLineTypography(lineTypography1);
    return result;
}

napi_value OHDrawingCreateLineTypography003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;

    PrepareTypographyCreate("OpenHarmony\n");
    OH_Drawing_LineTypography *lineTypography1 = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography1 != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);
    OH_Drawing_DestroyLineTypography(lineTypography1);
    TypographyTearDown();

    OH_Drawing_LineTypography *nullLineTypograph = OH_Drawing_CreateLineTypography(nullptr);
    if (nullLineTypograph == nullptr) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    return result;
}

napi_value OHDrawingCreateLineTypography004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareTypographyCreate(nullptr);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingLineTypographyGetLineBreak001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TypographyCreate *handler_ = nullptr;
    OH_Drawing_FontCollection *fontCollection_ = nullptr;
    OH_Drawing_TypographyStyle *typoStyle_ = nullptr;
    const char *text = "OpenHarmony\n";
    fontCollection_ = OH_Drawing_CreateFontCollection();
    typoStyle_ = OH_Drawing_CreateTypographyStyle();
    handler_ = OH_Drawing_CreateTypographyHandler(typoStyle_, fontCollection_);
    OH_Drawing_TypographyHandlerAddText(handler_, text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler_);
    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = 0;
    auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == strlen(text)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontCollection(fontCollection_);
    OH_Drawing_DestroyTypographyStyle(typoStyle_);
    OH_Drawing_DestroyTypographyHandler(handler_);
    OH_Drawing_DestroyLineTypography(lineTypography);
    return result;
}

napi_value OHDrawingLineTypographyGetLineBreak002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    
    const char *text = "OpenHarmony\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = 0;
    auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == strlen(text)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyGetLineBreak003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    
    const char *text1 = "hello\n world";
    const char *text2 = "hello\n";
    PrepareTypographyCreate(text1);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = 0;
    auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == strlen(text2)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyGetLineBreak004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = strlen(text) - 1;
    auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == 1) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    maxWidth = 0;
    startIndex = 0;
    count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == 0) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyGetLineBreak005(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = strlen(text);
    auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == 0) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    maxWidth = DOUBLE_NUM_001;
    startIndex = 0;
    count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
    if (count == 1) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyCreateLine001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TypographyCreate *handler_ = nullptr;
    OH_Drawing_FontCollection *fontCollection_ = nullptr;
    OH_Drawing_TypographyStyle *typoStyle_ = nullptr;
    const char *text = "OpenHarmony\n";
    fontCollection_ = OH_Drawing_CreateFontCollection();
    typoStyle_ = OH_Drawing_CreateTypographyStyle();
    handler_ = OH_Drawing_CreateTypographyHandler(typoStyle_, fontCollection_);
    OH_Drawing_TypographyHandlerAddText(handler_, text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler_);
    size_t startIndex = 0;
    size_t count = strlen(text);
    auto line = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if (line != nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyFontCollection(fontCollection_);
    OH_Drawing_DestroyTypographyStyle(typoStyle_);
    OH_Drawing_DestroyTypographyHandler(handler_);
    OH_Drawing_DestroyLineTypography(lineTypography);
    OH_Drawing_DestroyTextLine(line);
    return result;
}

napi_value OHDrawingLineTypographyCreateLine002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t startIndex = 0;
    size_t count = strlen(text);
    auto line = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line != nullptr) && (OH_Drawing_TextLineGetGlyphCount(line) == 12L)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyTextLine(line);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyCreateLine003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    
    const char *text = "Hello\n world!";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t startIndex = 0;
    size_t count = strlen(text);
    auto line = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line != nullptr) && (OH_Drawing_TextLineGetGlyphCount(line) == 5L)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyTextLine(line);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyCreateLine004(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t startIndex = strlen(text) - 1;
    size_t count = 1;
    auto line1 = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line1 != nullptr) && (OH_Drawing_TextLineGetGlyphCount(line1) == 0L)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyTextLine(line1);

    startIndex = 0;
    count = 0;
    auto line2 = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line2 != nullptr) && (OH_Drawing_TextLineGetGlyphCount(line2) == 12L)) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_DestroyTextLine(line2);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyCreateLine005(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t startIndex = strlen(text);
    size_t count = 1;
    auto line1 = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line1 == nullptr) && (OH_Drawing_TextLineGetGlyphCount(line1) == 0L)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    OH_Drawing_DestroyTextLine(line1);

    startIndex = 0;
    count = strlen(text) + 1;
    auto line2 = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if ((line2 == nullptr) && (OH_Drawing_TextLineGetGlyphCount(line2) == 0L)) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_DestroyTextLine(line2);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingLineTypographyCreateLine006(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    
    std::string text = "Hello \t 中国 测 World \n !@#$%^&*~(){}[] 123 4567890 - = ,. < >、/Drawing testlp 试 ";
    text += "Drawing \n\n   \u231A \u513B \u00A9\uFE0F aaa clp11⌚😀😁🤣👨‍🔬👩‍👩‍👧‍👦👭مرحبا中国 测 World测试文本";
    PrepareTypographyCreate(text.c_str());
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    if (lineTypography != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    double maxWidth = DOUBLE_NUM_800;
    size_t startIndex = 0;
    int yPosition = 0;
    do {
        auto count = OH_Drawing_LineTypographyGetLineBreak(lineTypography, startIndex, maxWidth);
        if (count == 0) {
            break;
        }
        OH_Drawing_TextLine *line = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
        if (line != nullptr) {
            napi_create_int32(env, SUCCESS, &result2);
        } else {
            napi_create_int32(env, FAIL, &result2);
        }
        napi_set_element(env, result, ARR_NUM_1, result2);
        yPosition += TEXTLINE30;
        OH_Drawing_DestroyTextLine(line);
        startIndex += count;
    } while (true);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingFontGetBounds001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;

    OH_Drawing_Font *font = OH_Drawing_FontCreate();
    if (font != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    OH_Drawing_FontSetTextSize(font, NUM_50);
    const char *space = "   ";
    uint32_t count = OH_Drawing_FontCountText(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
    if (count == strlen(space)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    uint16_t glyphs[count];
    OH_Drawing_FontTextToGlyphs(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
        glyphs, count);
    OH_Drawing_Array *outRectarr = OH_Drawing_RectCreateArray(count - 1);
    if ((outRectarr != nullptr) &&
        (OH_Drawing_FontGetBounds(font, glyphs, count, outRectarr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetBounds(nullptr, glyphs, count, outRectarr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetBounds(font, nullptr, count, outRectarr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetBounds(font, glyphs, count, nullptr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_RectDestroyArray(outRectarr) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_FontDestroy(font);
    return result;
}

napi_value OHDrawingFontGetBounds002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;

    OH_Drawing_Font *font = OH_Drawing_FontCreate();
    OH_Drawing_FontSetTextSize(font, NUM_50);
    const char *str = "helloworld";
    uint32_t count = OH_Drawing_FontCountText(font, str, strlen(str), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
    uint16_t glyphs[count];
    OH_Drawing_FontTextToGlyphs(font, str, strlen(str), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
        glyphs, count);
    OH_Drawing_Array *outRectarr = OH_Drawing_RectCreateArray(count);
    size_t size = 0;
    if ((OH_Drawing_RectGetArraySize(outRectarr, &size) == OH_DRAWING_SUCCESS) &&
        (size == count) && (OH_Drawing_FontGetBounds(font, glyphs, count, outRectarr) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    for (int i = 0; i < count; i++) {
        OH_Drawing_Rect *iter = nullptr;
        if ((OH_Drawing_RectGetArrayElement(outRectarr, i, &iter) == OH_DRAWING_SUCCESS) &&
            (iter != nullptr) && (OH_Drawing_RectGetWidth(iter) > 0) &&
            (OH_Drawing_RectGetHeight(iter) > 0)) {
            napi_create_int32(env, SUCCESS, &result2);
        } else {
            napi_create_int32(env, FAIL, &result2);
        }
        napi_set_element(env, result, ARR_NUM_1, result2);
    }

    if (OH_Drawing_RectDestroyArray(outRectarr) == OH_DRAWING_SUCCESS) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_FontDestroy(font);
    return result;
}

napi_value OHDrawingFontGetBounds003(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_3, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;

    OH_Drawing_Font *font = OH_Drawing_FontCreate();
    OH_Drawing_FontSetTextSize(font, NUM_50);
    const char *space = "   ";
    uint32_t count = OH_Drawing_FontCountText(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
    uint16_t glyphs[count];
    OH_Drawing_FontTextToGlyphs(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
        glyphs, count);
    OH_Drawing_Array *outRectarr = OH_Drawing_RectCreateArray(count);
    size_t size = 0;
    if ((OH_Drawing_RectGetArraySize(outRectarr, &size) == OH_DRAWING_SUCCESS) &&
        (size == count) && (OH_Drawing_FontGetBounds(font, glyphs, count, outRectarr) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    for (int i = 0; i < count; i++) {
        OH_Drawing_Rect *iter = nullptr;
        if ((OH_Drawing_RectGetArrayElement(outRectarr, i, &iter) == OH_DRAWING_SUCCESS) &&
            (iter != nullptr) && (OH_Drawing_RectGetWidth(iter) == 0) &&
            (OH_Drawing_RectGetHeight(iter) == 0)) {
            napi_create_int32(env, SUCCESS, &result2);
        } else {
            napi_create_int32(env, FAIL, &result2);
        }
        napi_set_element(env, result, ARR_NUM_1, result2);
    }

    if (OH_Drawing_RectDestroyArray(outRectarr) == OH_DRAWING_SUCCESS) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);
    OH_Drawing_FontDestroy(font);
    return result;
}

napi_value OHDrawingRectDestroyArray001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_Font *font = OH_Drawing_FontCreate();
    OH_Drawing_FontSetTextSize(font, NUM_50);
    const char *space = "   ";
    uint32_t count = OH_Drawing_FontCountText(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
    uint16_t glyphs[count];
    OH_Drawing_FontTextToGlyphs(font, space, strlen(space), OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8,
        glyphs, count);
    OH_Drawing_Array *outRectarr = OH_Drawing_RectCreateArray(count - 1);
    if (OH_Drawing_RectDestroyArray(outRectarr) == OH_DRAWING_SUCCESS) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_FontDestroy(font);
    return result;
}

napi_value OHDrawingRectGetArraySize001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;

    OH_Drawing_Array *rectArray = OH_Drawing_RectCreateArray(NUM_50);
    if (rectArray != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t size = 0;
    if ((OH_Drawing_RectGetArraySize(nullptr, &size) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_RectGetArraySize(rectArray, nullptr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_RectDestroyArray(rectArray) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    return result;
}

napi_value OHDrawingRectGetArraySize002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_2, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;

    OH_Drawing_Array *rectArray = OH_Drawing_RectCreateArray(NUM_10);
    if (rectArray != nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    size_t size = 0;
    if ((OH_Drawing_RectGetArraySize(rectArray, &size) == OH_DRAWING_SUCCESS) && (size == NUM_10) &&
        (OH_Drawing_RectDestroyArray(rectArray) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);
    return result;
}

napi_value OHDrawingRectGetArrayElement001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    size_t size = NUM_50;
    OH_Drawing_Array *rectArray = OH_Drawing_RectCreateArray(size);
    OH_Drawing_Rect *rect = nullptr;
    if ((OH_Drawing_RectGetArrayElement(rectArray, size, &rect) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_RectGetArrayElement(rectArray, size - 1, nullptr) == OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_RectGetArrayElement(rectArray, size - 1, &rect) == OH_DRAWING_SUCCESS)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingCreateTextTab001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TextTab *textTab = OH_Drawing_CreateTextTab(TEXT_ALIGN_LEFT, DOUBLE_NUM_0);
    if (textTab != nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextTab(textTab);
    return result;
}

napi_value OHDrawingGetTextTabAlignment001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TextTab *textTab = OH_Drawing_CreateTextTab(TEXT_ALIGN_LEFT, DOUBLE_NUM_0);
    if (OH_Drawing_GetTextTabAlignment(textTab) == TEXT_ALIGN_LEFT) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextTab(textTab);
    return result;
}

napi_value OHDrawingGetTextTabLocation001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_TextTab *textTab = OH_Drawing_CreateTextTab(TEXT_ALIGN_LEFT, DOUBLE_NUM_0);
    if (OH_Drawing_GetTextTabLocation(textTab) == DOUBLE_NUM_0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextTab(textTab);
    return result;
}

napi_value OHDrawingFontGetTextPath001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_Font *font = OH_Drawing_FontCreate();
    const char *str = "Hello 中文";
    size_t length = std::char_traits<char>::length(str);
    float x = 12.0f;
    float y = 150.0f;
    OH_Drawing_Path *path = OH_Drawing_PathCreate();
    if ((OH_Drawing_FontGetTextPath(nullptr, str, sizeof(char) * length, TEXT_ENCODING_UTF8, x, y, path) ==
         OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetTextPath(font, nullptr, sizeof(char) * length, TEXT_ENCODING_UTF8, x, y, path) ==
         OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetTextPath(font, str, 0, TEXT_ENCODING_UTF8, x, y, path) ==
         OH_DRAWING_ERROR_INVALID_PARAMETER) &&
        (OH_Drawing_FontGetTextPath(font, str, sizeof(char) * length, TEXT_ENCODING_UTF8, x, y, nullptr) ==
         OH_DRAWING_ERROR_INVALID_PARAMETER)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_FontDestroy(font);
    return result;
}

napi_value OHDrawingGetDrawingArraySize001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_SystemFontType fontType = OH_Drawing_SystemFontType::GENERIC;
    OH_Drawing_Array *fontList = OH_Drawing_GetSystemFontFullNamesByType(fontType);
    size_t size = OH_Drawing_GetDrawingArraySize(fontList);
    if (size != 0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroySystemFontFullNames(fontList);
    return result;
}

napi_value OHDrawingTypographyGetTextLines001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("");
    OH_Drawing_Array *textLines = textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    if (size == 0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTypographyGetTextLines002(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n");
    OH_Drawing_Array *textLines = textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    if (size == INT_NUM_2) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingDestroyTextLine001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    const char *text = "OpenHarmoney\n";
    PrepareTypographyCreate(text);
    OH_Drawing_LineTypography *lineTypography = OH_Drawing_CreateLineTypography(handler2_);
    size_t startIndex = 0;
    size_t count = strlen(text);
    auto line = OH_Drawing_LineTypographyCreateLine(lineTypography, startIndex, count);
    if (OH_Drawing_TextLineGetGlyphCount(line) == 12L) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLine(line);
    OH_Drawing_DestroyLineTypography(lineTypography);
    TypographyTearDown();
    return result;
}

napi_value OHDrawingGetTextLineByIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, -1 | 10);
    if (textLine == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetTextRange001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
    size_t start = 0;
    OH_Drawing_TextLineGetTextRange(textLine, &start, nullptr);
    if (start == 0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetGlyphRuns001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
    OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
    if (runs == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingDestroyRuns001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size - 1; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
        size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
        if (runsSize == 0) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
        OH_Drawing_DestroyRuns(runs);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetRunByIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_Run *run = OH_Drawing_GetRunByIndex(nullptr, 0);
    if (run == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingTextLinePaint001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("Hello 测 World \n!@#$%^&*~(){}[] 123 4567890 - = ,. < >、/Drawing testlp 试 Drawing  ");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_TextLine *truncatedLine =
            OH_Drawing_TextLineCreateTruncatedLine(textLine, INT_NUM_100, ELLIPSIS_MODAL_HEAD, "...");
        OH_Drawing_TextLinePaint(truncatedLine, canvas_, TEXTLINE30, TEXTLINE250);
        double count = OH_Drawing_TextLineGetGlyphCount(truncatedLine);
        if (count > 0) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
        OH_Drawing_DestroyTextLine(truncatedLine);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineCreateTruncatedLine001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
    OH_Drawing_TextLine *truncatedLine = OH_Drawing_TextLineCreateTruncatedLine(textLine, INT_NUM_200, INT_NUM_5, "1");
    if (truncatedLine == nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetTypographicBounds001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    double ascent = DOUBLE_NUM_0;
    double descent = DOUBLE_NUM_0;
    double leading = DOUBLE_NUM_0;
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        double width = OH_Drawing_TextLineGetTypographicBounds(textLine, &ascent, &descent, &leading);
        if ((ascent < 0) && (descent > 0) && (leading == 0) && (width == 0)) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetImageBounds001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("Hello 测 World \n!@#$%^&*~(){}[] 123 4567890 - = ,. < >、/Drawing testlp 试 Drawing  ");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Rect *rect = OH_Drawing_TextLineGetImageBounds(textLine);
        if ((OH_Drawing_RectGetRight(rect) > OH_Drawing_RectGetLeft(rect)) &&
            (OH_Drawing_RectGetBottom(rect) > OH_Drawing_RectGetTop(rect)) &&
            (OH_Drawing_RectGetWidth(rect) < NUM_500) &&
            (OH_Drawing_RectGetHeight(rect) <= HEIGHT40)) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetTrailingSpaceWidth001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("Hello 测 World \n!@#$%^&*~(){}[] 123 4567890 - = ,. < >、/Drawing testlp 试 Drawing  ");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        double width = OH_Drawing_TextLineGetTrailingSpaceWidth(textLine);
        if (width > 1) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetStringIndexForPosition001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    OH_Drawing_TextLine *textLine = textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
    if ((OH_Drawing_TextLineGetStringIndexForPosition(textLine, nullptr) == 0) &&
        (OH_Drawing_TextLineGetStringIndexForPosition(nullptr, nullptr) == 0)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetOffsetForStringIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("\n\n");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        if ((OH_Drawing_TextLineGetOffsetForStringIndex(textLine, 0) == DOUBLE_NUM_0) &&
            (OH_Drawing_TextLineGetOffsetForStringIndex(textLine, INT_NUM_100) == DOUBLE_NUM_0)) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingTextLineGetAlignmentOffset001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    PrepareCreateTextLine("Hello 测 World \n!@#$%^&*~(){}[] 123 4567890 - = ,. < >、/Drawing testlp 试 Drawing  ");
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        if ((OH_Drawing_TextLineGetAlignmentOffset(textLine, DOUBLE_NUM_0, ALIGNMENT600) == DOUBLE_NUM_0) &&
            (OH_Drawing_TextLineGetAlignmentOffset(textLine, DOUBLE_NUM_05, ALIGNMENT700) > DOUBLE_NUM_100) &&
            (OH_Drawing_TextLineGetAlignmentOffset(textLine, DOUBLE_NEGATIVE_NUM_1, ALIGNMENT700) == DOUBLE_NUM_0) &&
            (OH_Drawing_TextLineGetAlignmentOffset(textLine, DOUBLE_NUM_2, ALIGNMENT20) == DOUBLE_NUM_0)) {
            napi_create_int32(env, SUCCESS, &result);
        } else {
            napi_create_int32(env, FAIL, &result);
        }
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetRunGlyphCount001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    uint32_t count = OH_Drawing_GetRunGlyphCount(nullptr);
    if (count == 0) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetRunStringRange001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    uint64_t location = 0;
    uint64_t length = 0;
    OH_Drawing_GetRunStringRange(nullptr, &location, &length);
    if ((location == 0) && (length == 0) && (OH_Drawing_GetRunStringIndices(nullptr, 0, 0) == nullptr) &&
        (OH_Drawing_GetRunGlyphs(nullptr, 0, 0) == nullptr) &&
        (OH_Drawing_GetRunPositions(nullptr, 0, 0) == nullptr) &&
        (OH_Drawing_GetRunImageBounds(nullptr) == nullptr)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetRunTypographicBounds001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_RunPaint(nullptr, nullptr, 0, 0);
    float ascent = DOUBLE_NUM_0;
    float descent = DOUBLE_NUM_0;
    float leading = DOUBLE_NUM_0;
    float width = OH_Drawing_GetRunTypographicBounds(nullptr, &ascent, &descent, &leading);
    if ((ascent == DOUBLE_NUM_0) && (descent == DOUBLE_NUM_0) && (leading == DOUBLE_NUM_0) && (width == DOUBLE_NUM_0)) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetRunStringIndicesByIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    g_text = "Hello 你好 World";
    PrepareCreateTextLine(g_text);
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
        size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
        for (size_t runIndex = 0; runIndex < runsSize; runIndex++) {
            OH_Drawing_Run *run = OH_Drawing_GetRunByIndex(runs, runIndex);
            uint32_t count = OH_Drawing_GetRunGlyphCount(run);
            uint64_t location = 0;
            uint64_t length = 0;
            OH_Drawing_GetRunStringRange(run, &location, &length);
            OH_Drawing_Array *stringIndicesArr = OH_Drawing_GetRunStringIndices(run, 0, count);
            size_t sizeArr = OH_Drawing_GetDrawingArraySize(stringIndicesArr);
            for (size_t stringIndex = 0; stringIndex < sizeArr; stringIndex++) {
                uint64_t indices = OH_Drawing_GetRunStringIndicesByIndex(stringIndicesArr, stringIndex);
                if (indices >= 0) {
                    napi_create_int32(env, SUCCESS, &result);
                } else {
                    napi_create_int32(env, FAIL, &result);
                }
            }
            OH_Drawing_DestroyRunStringIndices(stringIndicesArr);
        }
        OH_Drawing_DestroyRuns(runs);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetRunImageBounds001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    g_text = "Hello 你好 World";
    PrepareCreateTextLine(g_text);
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
        size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
        for (size_t runIndex = 0; runIndex < runsSize; runIndex++) {
            OH_Drawing_Run *run = OH_Drawing_GetRunByIndex(runs, runIndex);
            uint32_t count = OH_Drawing_GetRunGlyphCount(run);
            uint64_t location = 0;
            uint64_t length = 0;
            OH_Drawing_GetRunStringRange(run, &location, &length);
            OH_Drawing_Array *stringIndicesArr = OH_Drawing_GetRunStringIndices(run, 0, count);
            size_t sizeArr = OH_Drawing_GetDrawingArraySize(stringIndicesArr);
            for (size_t stringIndex = 0; stringIndex < sizeArr; stringIndex++) {
                uint64_t indices = OH_Drawing_GetRunStringIndicesByIndex(stringIndicesArr, stringIndex);
            }
            OH_Drawing_DestroyRunStringIndices(stringIndicesArr);
            OH_Drawing_Rect *bounds = OH_Drawing_GetRunImageBounds(run);
            if (bounds != nullptr) {
                napi_create_int32(env, SUCCESS, &result);
            } else {
                napi_create_int32(env, FAIL, &result);
            }
            OH_Drawing_DestroyRunImageBounds(bounds);
            OH_Drawing_RunPaint(canvas_, run, DOUBLE_NUM_0, DOUBLE_NUM_0);
        }
        OH_Drawing_DestroyRuns(runs);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetRunGlyphsByIndex001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    g_text = "Hello 你好 World";
    PrepareCreateTextLine(g_text);
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
        size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
        for (size_t runIndex = 0; runIndex < runsSize; runIndex++) {
            OH_Drawing_Run *run = OH_Drawing_GetRunByIndex(runs, runIndex);
            uint32_t count = OH_Drawing_GetRunGlyphCount(run);
            float ascent = DOUBLE_NUM_0;
            float descent = DOUBLE_NUM_0;
            float leading = DOUBLE_NUM_0;
            float width = OH_Drawing_GetRunTypographicBounds(run, &ascent, &descent, &leading);
            OH_Drawing_Array *glyphs = OH_Drawing_GetRunGlyphs(run, 0, count);
            size_t glyphSize = OH_Drawing_GetDrawingArraySize(glyphs);
            for (size_t glyphsIndex = 0; glyphsIndex < glyphSize; glyphsIndex++) {
                if (OH_Drawing_GetRunGlyphsByIndex(glyphs, glyphsIndex) > 0) {
                    napi_create_int32(env, SUCCESS, &result);
                } else {
                    napi_create_int32(env, FAIL, &result);
                }
            }
            OH_Drawing_DestroyRunGlyphs(glyphs);
        }
        OH_Drawing_DestroyRuns(runs);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetRunPositions001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    g_text = "Hello 你好 World";
    PrepareCreateTextLine(g_text);
    OH_Drawing_Array *textLines = OH_Drawing_TypographyGetTextLines(typography_);
    size_t size = OH_Drawing_GetDrawingArraySize(textLines);
    for (size_t index = 0; index < size; index++) {
        OH_Drawing_TextLine *textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
        OH_Drawing_Array *runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
        size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
        for (size_t runIndex = 0; runIndex < runsSize; runIndex++) {
            OH_Drawing_Run *run = OH_Drawing_GetRunByIndex(runs, runIndex);
            uint32_t count = OH_Drawing_GetRunGlyphCount(run);
            OH_Drawing_Array *positions = OH_Drawing_GetRunPositions(run, 0, count);
            size_t positionSize = OH_Drawing_GetDrawingArraySize(positions);
            for (size_t posIndex = 0; posIndex < positionSize; posIndex++) {
                OH_Drawing_Point *pos = OH_Drawing_GetRunPositionsByIndex(positions, posIndex);
                float x = DOUBLE_NUM_0;
                OH_Drawing_PointGetX(pos, &x);
                if (x >= DOUBLE_NUM_0) {
                    napi_create_int32(env, SUCCESS, &result);
                } else {
                    napi_create_int32(env, FAIL, &result);
                }
            }
            OH_Drawing_DestroyRunPositions(positions);
        }
        OH_Drawing_DestroyRuns(runs);
    }
    OH_Drawing_DestroyTextLines(textLines);
    TearDown();
    return result;
}

napi_value OHDrawingGetFontCollectionGlobalInstance001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    OH_Drawing_FontCollection *fontCollection = OH_Drawing_GetFontCollectionGlobalInstance();
    if (fontCollection != nullptr) {
        napi_create_int32(env, SUCCESS, &result);
    } else {
        napi_create_int32(env, FAIL, &result);
    }
    return result;
}

napi_value OHDrawingGetRun001(napi_env env, napi_callback_info info)
{
    napi_value result = nullptr;
    napi_create_array_with_length(env, ARR_NUM_4, &result);
    napi_value result1 = nullptr;
    napi_value result2 = nullptr;
    napi_value result3 = nullptr;
    napi_value result4 = nullptr;

    OH_Drawing_Font *font = OH_Drawing_GetRunFont(nullptr);
    if (font == nullptr) {
        napi_create_int32(env, SUCCESS, &result1);
    } else {
        napi_create_int32(env, FAIL, &result1);
    }
    napi_set_element(env, result, ARR_NUM_0, result1);

    OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(nullptr);
    if (direction == TEXT_DIRECTION_LTR) {
        napi_create_int32(env, SUCCESS, &result2);
    } else {
        napi_create_int32(env, FAIL, &result2);
    }
    napi_set_element(env, result, ARR_NUM_1, result2);

    OH_Drawing_Array *advances = OH_Drawing_GetRunGlyphAdvances(nullptr, 0, 0);
    if (advances == nullptr) {
        napi_create_int32(env, SUCCESS, &result3);
    } else {
        napi_create_int32(env, FAIL, &result3);
    }
    napi_set_element(env, result, ARR_NUM_2, result3);

    OH_Drawing_Point *advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
    if (advance == nullptr) {
        napi_create_int32(env, SUCCESS, &result4);
    } else {
        napi_create_int32(env, FAIL, &result4);
    }
    napi_set_element(env, result, ARR_NUM_3, result4);
    OH_Drawing_DestroyRunGlyphAdvances(advances);
    return result;
}