• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "drawing_bitmap.h"
17 #include "drawing_font_collection.h"
18 #include "drawing_point.h"
19 #include "drawing_rect.h"
20 #include "drawing_text_line.h"
21 #include "drawing_text_run.h"
22 #include "drawing_types.h"
23 #include "drawing_text_typography.h"
24 #include "gtest/gtest.h"
25 #include "string"
26 
27 #ifdef RS_ENABLE_VK
28 #include "platform/ohos/backend/rs_vulkan_context.h"
29 #endif
30 
31 using namespace testing;
32 using namespace testing::ext;
33 
34 namespace OHOS {
35 namespace {
36 constexpr static float FLOAT_DATA_EPSILON = 1e-6f;
37 }
38 
39 class NdkRunTest : public testing::Test {
40 public:
SetUpTestCase()41     static void SetUpTestCase()
42     {
43 #ifdef RS_ENABLE_VK
44         Rosen::RsVulkanContext::SetRecyclable(false);
45 #endif
46     }
TearDownTestCase()47     static void TearDownTestCase() {}
SetUp()48     void SetUp() override {};
49     void TearDown() override;
50     void PrepareCreateTextLine();
51     void PrepareCreateTextLineForGlyphDrawing();
52 
53     OH_Drawing_TypographyStyle* typeStyle_ = nullptr;
54     OH_Drawing_TextStyle* txtStyle_ = nullptr;
55     OH_Drawing_FontCollection* fontCollection_ = nullptr;
56     OH_Drawing_TypographyCreate* handler_ = nullptr;
57     OH_Drawing_Typography* typography_ = nullptr;
58     OH_Drawing_Bitmap* cBitmap_ = nullptr;
59     OH_Drawing_Canvas* canvas_ = nullptr;
60     OH_Drawing_Array* runs_ = nullptr;
61     OH_Drawing_Array* textLines_ = nullptr;
62     std::string text_;
63 };
64 
PrepareCreateTextLine()65 void NdkRunTest::PrepareCreateTextLine()
66 {
67     double maxWidth = 500.0;
68     uint32_t height = 40;
69     typeStyle_ = OH_Drawing_CreateTypographyStyle();
70     EXPECT_TRUE(typeStyle_ != nullptr);
71     txtStyle_ = OH_Drawing_CreateTextStyle();
72     EXPECT_TRUE(txtStyle_ != nullptr);
73     fontCollection_ = OH_Drawing_CreateFontCollection();
74     EXPECT_TRUE(fontCollection_ != nullptr);
75     handler_ = OH_Drawing_CreateTypographyHandler(typeStyle_, fontCollection_);
76     EXPECT_TRUE(handler_ != nullptr);
77     OH_Drawing_SetTextStyleColor(txtStyle_, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00));
78     double fontSize = 30;
79     OH_Drawing_SetTextStyleFontSize(txtStyle_, fontSize);
80     OH_Drawing_SetTextStyleFontWeight(txtStyle_, FONT_WEIGHT_400);
81     bool halfLeading = true;
82     OH_Drawing_SetTextStyleHalfLeading(txtStyle_, halfLeading);
83     const char* fontFamilies[] = { "Roboto" };
84     OH_Drawing_SetTextStyleFontFamilies(txtStyle_, 1, fontFamilies);
85     OH_Drawing_TypographyHandlerPushTextStyle(handler_, txtStyle_);
86     OH_Drawing_TypographyHandlerAddText(handler_, text_.c_str());
87     OH_Drawing_TypographyHandlerPopTextStyle(handler_);
88     typography_ = OH_Drawing_CreateTypography(handler_);
89     EXPECT_TRUE(typography_ != nullptr);
90     OH_Drawing_TypographyLayout(typography_, maxWidth);
91     double position[2] = { 10.0, 15.0 };
92     OH_Drawing_Bitmap* cBitmap_ = OH_Drawing_BitmapCreate();
93     EXPECT_TRUE(cBitmap_ != nullptr);
94     OH_Drawing_BitmapFormat cFormat { COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE };
95     uint32_t width = 20;
96     OH_Drawing_BitmapBuild(cBitmap_, width, height, &cFormat);
97     canvas_ = OH_Drawing_CanvasCreate();
98     EXPECT_TRUE(canvas_ != nullptr);
99     OH_Drawing_CanvasBind(canvas_, cBitmap_);
100     OH_Drawing_CanvasClear(canvas_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF));
101     OH_Drawing_TypographyPaint(typography_, canvas_, position[0], position[1]);
102 }
103 
PrepareCreateTextLineForGlyphDrawing()104 void NdkRunTest::PrepareCreateTextLineForGlyphDrawing()
105 {
106     double maxWidth = 1200.0;
107     typeStyle_ = OH_Drawing_CreateTypographyStyle();
108     EXPECT_NE(typeStyle_, nullptr);
109     txtStyle_ = OH_Drawing_CreateTextStyle();
110     EXPECT_NE(txtStyle_, nullptr);
111     fontCollection_ = OH_Drawing_CreateFontCollection();
112     EXPECT_NE(fontCollection_, nullptr);
113     handler_ = OH_Drawing_CreateTypographyHandler(typeStyle_, fontCollection_);
114     EXPECT_NE(handler_, nullptr);
115     double fontSize = 100;
116     OH_Drawing_SetTextStyleFontSize(txtStyle_, fontSize);
117     OH_Drawing_TypographyHandlerPushTextStyle(handler_, txtStyle_);
118     OH_Drawing_TypographyHandlerAddText(handler_, text_.c_str());
119     typography_ = OH_Drawing_CreateTypography(handler_);
120     EXPECT_NE(typography_, nullptr);
121     OH_Drawing_TypographyLayout(typography_, maxWidth);
122     textLines_ = OH_Drawing_TypographyGetTextLines(typography_);
123     EXPECT_NE(textLines_, nullptr);
124     size_t size = OH_Drawing_GetDrawingArraySize(textLines_);
125     EXPECT_TRUE(size != 0);
126     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines_, 0);
127     EXPECT_NE(textLine, nullptr);
128     runs_ = OH_Drawing_TextLineGetGlyphRuns(textLine);
129     EXPECT_NE(runs_, nullptr);
130     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs_);
131     EXPECT_TRUE(runsSize != 0);
132 }
133 
TearDown()134 void NdkRunTest::TearDown()
135 {
136     OH_Drawing_CanvasDestroy(canvas_);
137     canvas_ = nullptr;
138     OH_Drawing_BitmapDestroy(cBitmap_);
139     cBitmap_ = nullptr;
140     OH_Drawing_DestroyTypography(typography_);
141     typography_ = nullptr;
142     OH_Drawing_DestroyTypographyHandler(handler_);
143     handler_ = nullptr;
144     OH_Drawing_DestroyFontCollection(fontCollection_);
145     fontCollection_ = nullptr;
146     OH_Drawing_DestroyTextStyle(txtStyle_);
147     txtStyle_ = nullptr;
148     OH_Drawing_DestroyTypographyStyle(typeStyle_);
149     typeStyle_ = nullptr;
150     text_ = "";
151     if (textLines_ != nullptr) {
152         OH_Drawing_DestroyTextLines(textLines_);
153         textLines_ = nullptr;
154     }
155     if (runs_ != nullptr) {
156         OH_Drawing_DestroyRuns(runs_);
157         runs_ = nullptr;
158     }
159 }
160 
161 /*
162  * @tc.name: RunTest001
163  * @tc.desc: Test for get run by index.
164  * @tc.type: FUNC
165  */
166 HWTEST_F(NdkRunTest, RunTest001, TestSize.Level0)
167 {
168     text_ = "Hello 你好 World";
169     PrepareCreateTextLine();
170     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
171     EXPECT_TRUE(textLines != nullptr);
172     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
173     ASSERT_GT(size, 0);
174     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
175 
176     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
177     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
178     ASSERT_GT(runsSize, 0);
179 
180     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(nullptr, 0);
181     EXPECT_EQ(run, nullptr);
182     run = OH_Drawing_GetRunByIndex(runs, -1);
183     EXPECT_EQ(run, nullptr);
184     run = OH_Drawing_GetRunByIndex(runs, runsSize);
185     EXPECT_EQ(run, nullptr);
186     run = OH_Drawing_GetRunByIndex(runs, 0);
187     uint32_t count = OH_Drawing_GetRunGlyphCount(run);
188     EXPECT_EQ(count, 6);
189 
190     // branchCoverage
191     auto nullCount = OH_Drawing_GetDrawingArraySize(nullptr);
192     EXPECT_EQ(nullCount, 0);
193     OH_Drawing_DestroyRuns(nullptr);
194 
195     OH_Drawing_DestroyRuns(runs);
196     OH_Drawing_DestroyTextLines(textLines);
197 }
198 
199 /*
200  * @tc.name: RunTest002
201  * @tc.desc: Test for get run glyph count.
202  * @tc.type: FUNC
203  */
204 HWTEST_F(NdkRunTest, RunTest002, TestSize.Level0)
205 {
206     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
207     PrepareCreateTextLine();
208     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
209     EXPECT_TRUE(textLines != nullptr);
210     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
211     ASSERT_GT(size, 0);
212     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
213 
214     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
215     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
216     ASSERT_GT(runsSize, 0);
217     std::vector<int32_t> countArr = {6, 2, 1, 5, 5, 5};
218     for (int i = 0; i < runsSize; i++) {
219         OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, i);
220         uint32_t count = OH_Drawing_GetRunGlyphCount(run);
221         EXPECT_EQ(count, countArr[i]);
222     }
223 
224     // branchCoverage
225     OH_Drawing_GetRunGlyphCount(nullptr);
226 
227     OH_Drawing_DestroyRuns(runs);
228     OH_Drawing_DestroyTextLines(textLines);
229 }
230 
231 /*
232  * @tc.name: RunTest003
233  * @tc.desc: Test for get glyph index in paragraph.
234  * @tc.type: FUNC
235  */
236 HWTEST_F(NdkRunTest, RunTest003, TestSize.Level0)
237 {
238     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
239     PrepareCreateTextLine();
240     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
241     EXPECT_TRUE(textLines != nullptr);
242     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
243     ASSERT_GT(size, 0);
244     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
245 
246     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
247     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
248     ASSERT_GT(runsSize, 0);
249     OH_Drawing_Run* run1 = OH_Drawing_GetRunByIndex(runs, 1);
250     uint32_t count = OH_Drawing_GetRunGlyphCount(run1);
251     auto glyphIndexArr = OH_Drawing_GetRunStringIndices(run1, 0, count);
252     auto glyphIndexArrSize = OH_Drawing_GetDrawingArraySize(glyphIndexArr);
253     std::vector<int32_t> indexndexArr = {6, 7};
254     for (int j = 0; j < glyphIndexArrSize; j++) {
255         auto glyphIndex = OH_Drawing_GetRunStringIndicesByIndex(glyphIndexArr, j);
256         EXPECT_EQ(glyphIndex, indexndexArr[j]);
257     }
258     // branchCoverage
259     OH_Drawing_GetRunStringIndices(nullptr, -1, -1);
260     OH_Drawing_GetRunStringIndicesByIndex(glyphIndexArr, glyphIndexArrSize);
261     OH_Drawing_DestroyRunStringIndices(glyphIndexArr);
262     OH_Drawing_GetRunGlyphCount(nullptr);
263 
264 
265     OH_Drawing_DestroyRuns(runs);
266     OH_Drawing_DestroyTextLines(textLines);
267 }
268 
269 /*
270  * @tc.name: RunTest004
271  * @tc.desc: Test for get run string range.
272  * @tc.type: FUNC
273  */
274 HWTEST_F(NdkRunTest, RunTest004, TestSize.Level0)
275 {
276     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
277     PrepareCreateTextLine();
278     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
279     EXPECT_TRUE(textLines != nullptr);
280     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
281     ASSERT_GT(size, 0);
282     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
283 
284     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
285     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
286     ASSERT_GT(runsSize, 0);
287 
288     std::vector<int32_t> locationArr = {0, 6, 8, 9, 14, 19};
289     std::vector<int32_t> lengthArr = {6, 2, 1, 5, 5, 5};
290     for (int i = 0; i < runsSize; i++) {
291         OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, i);
292         uint64_t location = 0;
293         uint64_t length = 0;
294         OH_Drawing_GetRunStringRange(run, &location, &length);
295         EXPECT_EQ(location, locationArr[i]);
296         EXPECT_EQ(length, lengthArr[i]);
297         // branchCoverage
298         OH_Drawing_GetRunStringRange(run, nullptr, nullptr);
299     }
300 
301     OH_Drawing_DestroyRuns(runs);
302     OH_Drawing_DestroyTextLines(textLines);
303 }
304 
305 /*
306  * @tc.name: RunTest005
307  * @tc.desc: Test for get run typographic bounds.
308  * @tc.type: FUNC
309  */
310 HWTEST_F(NdkRunTest, RunTest005, TestSize.Level0)
311 {
312     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
313     PrepareCreateTextLine();
314     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
315     EXPECT_TRUE(textLines != nullptr);
316     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
317     ASSERT_GT(size, 0);
318     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
319 
320     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
321     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
322     ASSERT_GT(runsSize, 0);
323 
324     std::vector<float> widthArr = {78.929932, 59.999939, 8.099991, 81.509903, 187.187500, 64.349945};
325     std::vector<float> ascentArr = {-27.840000, -27.840000, -27.840000, -27.840000, -27.798166, -35.369999};
326     std::vector<float> descentArr = {7.320000, 7.320000, 7.320000, 7.320000, 7.431193, 9.690001};
327     for (int i = 0; i < runsSize; i++) {
328         OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, i);
329         float ascent = 0.0;
330         float descent = 0.0;
331         float leading = 0.0;
332         float width = OH_Drawing_GetRunTypographicBounds(run, &ascent, &descent, &leading);
333         EXPECT_EQ(leading, 0);
334         EXPECT_NEAR(ascent, ascentArr[i], FLOAT_DATA_EPSILON);
335         EXPECT_NEAR(descent, descentArr[i], FLOAT_DATA_EPSILON);
336         EXPECT_NEAR(width, widthArr[i], FLOAT_DATA_EPSILON);
337         // branchCoverage
338         OH_Drawing_GetRunTypographicBounds(run, nullptr, nullptr, nullptr);
339         OH_Drawing_GetRunTypographicBounds(nullptr, &ascent, &descent, &leading);
340     }
341 
342     OH_Drawing_DestroyRuns(runs);
343     OH_Drawing_DestroyTextLines(textLines);
344 }
345 
346 /*
347  * @tc.name: RunTest006
348  * @tc.desc: Test for get run image bounds.
349  * @tc.type: FUNC
350  */
351 HWTEST_F(NdkRunTest, RunTest006, TestSize.Level0)
352 {
353     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
354     PrepareCreateTextLine();
355     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
356     EXPECT_TRUE(textLines != nullptr);
357     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
358     ASSERT_GT(size, 0);
359     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
360 
361     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
362     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
363     ASSERT_GT(runsSize, 0);
364 
365     std::vector<float> leftArr = {2.0, 78.929932, 147.029861, 147.029861, 228.539764, 417.727264};
366     std::vector<float> topArr = {1.0, 3.0, 0.0, 1.0, 8.0, 3.0};
367     std::vector<float> bottomArr = {25.0, 32.0, 0.0, 25.0, 44.0, 33.0};
368     std::vector<float> rightArr = {70.099960, 137.929901, 147.029861, 226.329788, 416.289764, 484.857208};
369     for (int i = 0; i < runsSize; i++) {
370         OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, i);
371         OH_Drawing_Rect* bounds = OH_Drawing_GetRunImageBounds(run);
372 
373         EXPECT_NEAR(OH_Drawing_RectGetLeft(bounds), leftArr[i], FLOAT_DATA_EPSILON);
374         EXPECT_NEAR(OH_Drawing_RectGetTop(bounds), topArr[i], FLOAT_DATA_EPSILON);
375         EXPECT_NEAR(OH_Drawing_RectGetBottom(bounds), bottomArr[i], FLOAT_DATA_EPSILON);
376         EXPECT_NEAR(OH_Drawing_RectGetRight(bounds), rightArr[i], FLOAT_DATA_EPSILON);
377         OH_Drawing_DestroyRunImageBounds(bounds);
378     }
379     // branchCoverage
380     OH_Drawing_GetRunImageBounds(nullptr);
381 
382     OH_Drawing_DestroyRuns(runs);
383     OH_Drawing_DestroyTextLines(textLines);
384 }
385 
386 /*
387  * @tc.name: RunTest007
388  * @tc.desc: Test for get run glyphs.
389  * @tc.type: FUNC
390  */
391 HWTEST_F(NdkRunTest, RunTest007, TestSize.Level0)
392 {
393     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
394     PrepareCreateTextLine();
395     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
396     EXPECT_TRUE(textLines != nullptr);
397     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
398     ASSERT_GT(size, 0);
399     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
400 
401     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
402     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
403     ASSERT_GT(runsSize, 0);
404 
405     std::vector<int32_t> glyphSizeArr = {6, 2, 1, 5, 5, 5};
406     std::vector<int32_t> glyphArr = {7824, 10413};
407     for (int i = 0; i < runsSize; i++) {
408         OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, i);
409         uint32_t count = OH_Drawing_GetRunGlyphCount(run);
410         OH_Drawing_Array* glyphs = OH_Drawing_GetRunGlyphs(run, 0, count);
411         size_t glyphSize = OH_Drawing_GetDrawingArraySize(glyphs);
412         EXPECT_EQ(glyphSize, glyphSizeArr[i]);
413         if (i == 1) {
414             for (int j = 0; j < glyphSize; j++) {
415                 EXPECT_EQ(OH_Drawing_GetRunGlyphsByIndex(glyphs, j), glyphArr[j]);
416             }
417         }
418         // branchCoverage
419         OH_Drawing_GetRunGlyphsByIndex(glyphs, glyphSize);
420 
421         OH_Drawing_DestroyRunGlyphs(glyphs);
422     }
423     // branchCoverage
424     OH_Drawing_GetRunGlyphs(nullptr, -1, -1);
425 
426     OH_Drawing_DestroyRuns(runs);
427     OH_Drawing_DestroyTextLines(textLines);
428 }
429 
430 /*
431  * @tc.name: RunTest008
432  * @tc.desc: Test for get run positions.
433  * @tc.type: FUNC
434  */
435  HWTEST_F(NdkRunTest, RunTest008, TestSize.Level0)
436  {
437     text_ = "Hello 你好 World⌚����‍����‍��‍��‍����مرحبا中国 测文本\n 123";
438     PrepareCreateTextLine();
439     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
440     EXPECT_TRUE(textLines != nullptr);
441     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
442     ASSERT_GT(size, 0);
443     OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, 0);
444 
445     OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
446     size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
447     ASSERT_GT(runsSize, 0);
448 
449     std::vector<int32_t> positionSizeArr = {6, 2, 1, 5, 5, 5};
450     std::vector<float> posXArr = {0, 29.999969};
451     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, 1);
452     uint32_t count = OH_Drawing_GetRunGlyphCount(run);
453     OH_Drawing_Array* positions = OH_Drawing_GetRunPositions(run, 0, count);
454     EXPECT_TRUE(positions != nullptr);
455     size_t positionSize = OH_Drawing_GetDrawingArraySize(positions);
456     for (size_t posIndex = 0; posIndex < positionSize; posIndex++) {
457         OH_Drawing_Point* pos = OH_Drawing_GetRunPositionsByIndex(positions, posIndex);
458         EXPECT_TRUE(pos != nullptr);
459         float x = 0.0;
460         OH_Drawing_PointGetX(pos, &x);
461         EXPECT_NEAR(x, posXArr[posIndex], FLOAT_DATA_EPSILON);
462     }
463     EXPECT_EQ(positionSize, 2);
464 
465     // branchCoverage
466     OH_Drawing_GetRunPositionsByIndex(positions, positionSize);
467     OH_Drawing_DestroyRunPositions(positions);
468     OH_Drawing_GetRunPositions(nullptr, -1, -1);
469 
470     OH_Drawing_DestroyRuns(runs);
471     OH_Drawing_DestroyTextLines(textLines);
472 }
473 
474 /*
475  * @tc.name: RunTest009
476  * @tc.desc: Test for special value input parameters testing.
477  * @tc.type: FUNC
478  */
479 HWTEST_F(NdkRunTest, RunTest009, TestSize.Level0)
480 {
481     text_ = "Hello\t中国 World \n !@#%^&*){}[] 123456789 -= ,."
482         "< >、/ Draclp11⌚��������‍����‍��‍��‍����مرحبا中国 测文本\n 123";
483     PrepareCreateTextLine();
484     OH_Drawing_Array* textLines = OH_Drawing_TypographyGetTextLines(typography_);
485     EXPECT_TRUE(textLines != nullptr);
486     size_t size = OH_Drawing_GetDrawingArraySize(textLines);
487     for (size_t index = 0; index < size; index++) {
488         OH_Drawing_TextLine* textLine = OH_Drawing_GetTextLineByIndex(textLines, index);
489         EXPECT_TRUE(textLine != nullptr);
490         OH_Drawing_Array* runs = OH_Drawing_TextLineGetGlyphRuns(textLine);
491         EXPECT_TRUE(runs != nullptr);
492         size_t runsSize = OH_Drawing_GetDrawingArraySize(runs);
493         for (size_t runIndex = 0; runIndex < runsSize; runIndex++) {
494             OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs, runIndex);
495             EXPECT_TRUE(run != nullptr);
496             // Get the actual size of the run
497             uint32_t count = OH_Drawing_GetRunGlyphCount(run);
498             EXPECT_TRUE(count > 0);
499             // If both start and end are 0, all data of the current run
500             OH_Drawing_Array* positions = OH_Drawing_GetRunPositions(run, 0, 0);
501             EXPECT_TRUE(positions != nullptr);
502             size_t positionSize = OH_Drawing_GetDrawingArraySize(positions);
503             EXPECT_EQ(positionSize, count);
504             OH_Drawing_DestroyRunPositions(positions);
505 
506             // If both start and end are 0, all data of the current run
507             OH_Drawing_Array* glyphs = OH_Drawing_GetRunGlyphs(run, 0, 0);
508             EXPECT_TRUE(glyphs != nullptr);
509             size_t glyphSize = OH_Drawing_GetDrawingArraySize(glyphs);
510             EXPECT_EQ(glyphSize, count);
511             OH_Drawing_DestroyRunGlyphs(glyphs);
512 
513             // If both start and end are 0, all data of the current run
514             OH_Drawing_Array* indices = OH_Drawing_GetRunStringIndices(run, 0, 0);
515             EXPECT_TRUE(indices != nullptr);
516             size_t indiceSize = OH_Drawing_GetDrawingArraySize(indices);
517             EXPECT_EQ(indiceSize, count);
518             OH_Drawing_DestroyRunStringIndices(indices);
519         }
520         OH_Drawing_DestroyRuns(runs);
521     }
522     OH_Drawing_DestroyTextLines(textLines);
523 }
524 
525 /*
526  * @tc.name: RunTest010
527  * @tc.desc: Test for the run of nullptr pointer testing.
528  * @tc.type: FUNC
529  */
530 HWTEST_F(NdkRunTest, RunTest010, TestSize.Level0)
531 {
532     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(nullptr, 0);
533     EXPECT_TRUE(run == nullptr);
534     uint32_t count = OH_Drawing_GetRunGlyphCount(nullptr);
535     EXPECT_EQ(count, 0);
536     uint64_t location = 0;
537     uint64_t length = 0;
538     OH_Drawing_GetRunStringRange(nullptr, &location, &length);
539     EXPECT_EQ(location, 0);
540     EXPECT_EQ(length, 0);
541     EXPECT_TRUE(OH_Drawing_GetRunStringIndices(nullptr, 0, 0) == nullptr);
542     EXPECT_TRUE(OH_Drawing_GetRunGlyphs(nullptr, 0, 0) == nullptr);
543     EXPECT_TRUE(OH_Drawing_GetRunPositions(nullptr, 0, 0) == nullptr);
544     EXPECT_TRUE(OH_Drawing_GetRunImageBounds(nullptr) == nullptr);
545     OH_Drawing_RunPaint(nullptr, nullptr, 0, 0);
546     float ascent = 0.0;
547     float descent = 0.0;
548     float leading = 0.0;
549     float width = OH_Drawing_GetRunTypographicBounds(nullptr, &ascent, &descent, &leading);
550     EXPECT_EQ(ascent, 0.0);
551     EXPECT_EQ(descent, 0.0);
552     EXPECT_EQ(leading, 0.0);
553     EXPECT_EQ(width, 0.0);
554 }
555 
556 
557 /*
558  * @tc.name: GlyDrawingTest001
559  * @tc.desc: Test for the glyph drawing of nullptr testing.
560  * @tc.type: FUNC
561  */
562 HWTEST_F(NdkRunTest, GlyDrawingTest001, TestSize.Level0)
563 {
564     OH_Drawing_Font* font = OH_Drawing_GetRunFont(nullptr);
565     EXPECT_TRUE(font == nullptr);
566 
567     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(nullptr);
568     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
569 
570     OH_Drawing_Array* advances = OH_Drawing_GetRunGlyphAdvances(nullptr, 0, 0);
571     EXPECT_TRUE(advances == nullptr);
572 
573     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
574     EXPECT_TRUE(advance == nullptr);
575 
576     OH_Drawing_DestroyRunGlyphAdvances(advances);
577 }
578 
579 /*
580  * @tc.name: GlyDrawingTest002
581  * @tc.desc: Test for the glyph drawing of the English text.
582  * @tc.type: FUNC
583  */
584 HWTEST_F(NdkRunTest, GlyDrawingTest002, TestSize.Level0)
585 {
586     text_ = "Hello你好";
587     PrepareCreateTextLineForGlyphDrawing();
588     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
589     EXPECT_NE(run, nullptr);
590 
591     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
592     EXPECT_NE(font, nullptr);
593     OH_Drawing_Font_Metrics fontMetrics;
594     OH_Drawing_FontGetMetrics(font, &fontMetrics);
595     EXPECT_EQ(fontMetrics.flags, 31);
596     EXPECT_NEAR(fontMetrics.top, -105.599998, FLOAT_DATA_EPSILON);
597     EXPECT_NEAR(fontMetrics.ascent, -92.799995, FLOAT_DATA_EPSILON);
598     EXPECT_NEAR(fontMetrics.descent, 24.399999, FLOAT_DATA_EPSILON);
599     EXPECT_NEAR(fontMetrics.bottom,  27.100000, FLOAT_DATA_EPSILON);
600     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
601     EXPECT_NEAR(fontMetrics.avgCharWidth, 50.0, FLOAT_DATA_EPSILON);
602     EXPECT_NEAR(fontMetrics.maxCharWidth, 248.600006, FLOAT_DATA_EPSILON);
603 
604     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
605     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
606 
607     OH_Drawing_Array* advances = OH_Drawing_GetRunGlyphAdvances(run, 0, 0);
608     EXPECT_NE(advances, nullptr);
609     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advances);
610     EXPECT_TRUE(advancesSize != 0);
611 
612     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
613     EXPECT_NE(advance, nullptr);
614     float x = 0.0;
615     OH_Drawing_PointGetX(advance, &x);
616     EXPECT_NEAR(x, 74.499923, FLOAT_DATA_EPSILON);
617     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 1);
618     EXPECT_NE(advance, nullptr);
619     OH_Drawing_PointGetX(advance, &x);
620     EXPECT_NEAR(x, 54.699951, FLOAT_DATA_EPSILON);
621     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 10);
622     EXPECT_TRUE(advance == nullptr);
623 
624     OH_Drawing_DestroyRunGlyphAdvances(advances);
625     OH_Drawing_FontDestroy(font);
626 }
627 
628 /*
629  * @tc.name: GlyDrawingTest003
630  * @tc.desc: Test for the glyph drawing of the emoji text.
631  * @tc.type: FUNC
632  */
633 HWTEST_F(NdkRunTest, GlyDrawingTest003, TestSize.Level0)
634 {
635     text_ = "⌚��������‍����‍��‍��‍����";
636     PrepareCreateTextLineForGlyphDrawing();
637     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
638     EXPECT_NE(run, nullptr);
639 
640     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
641     EXPECT_NE(font, nullptr);
642     OH_Drawing_Font_Metrics fontMetrics;
643     OH_Drawing_FontGetMetrics(font, &fontMetrics);
644     EXPECT_EQ(fontMetrics.flags, 31);
645     EXPECT_NEAR(fontMetrics.top, -92.660552, FLOAT_DATA_EPSILON);
646     EXPECT_NEAR(fontMetrics.ascent, -92.660552, FLOAT_DATA_EPSILON);
647     EXPECT_NEAR(fontMetrics.descent, 24.770643, FLOAT_DATA_EPSILON);
648     EXPECT_NEAR(fontMetrics.bottom,  24.770643, FLOAT_DATA_EPSILON);
649     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
650     EXPECT_NEAR(fontMetrics.avgCharWidth, 124.511718, FLOAT_DATA_EPSILON);
651     EXPECT_NEAR(fontMetrics.maxCharWidth, 124.7706451, FLOAT_DATA_EPSILON);
652 
653     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
654     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
655 
656     OH_Drawing_Array* advancesNullTest1 = OH_Drawing_GetRunGlyphAdvances(run, -10, -20);
657     EXPECT_TRUE(advancesNullTest1 == nullptr);
658     OH_Drawing_DestroyRunGlyphAdvances(advancesNullTest1);
659 
660     OH_Drawing_Array* advancesNullTest2 = OH_Drawing_GetRunGlyphAdvances(run, 100, 20);
661     EXPECT_TRUE(advancesNullTest2 == nullptr);
662     OH_Drawing_DestroyRunGlyphAdvances(advancesNullTest2);
663 
664     OH_Drawing_Array* advances = OH_Drawing_GetRunGlyphAdvances(run, 1, 2);
665     EXPECT_NE(advances, nullptr);
666     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advances);
667     EXPECT_EQ(advancesSize, 2);
668 
669     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
670     EXPECT_NE(advance, nullptr);
671     float x = 0.0;
672     OH_Drawing_PointGetX(advance, &x);
673     EXPECT_NEAR(x, 124.765625, FLOAT_DATA_EPSILON);
674 
675     OH_Drawing_DestroyRunGlyphAdvances(advances);
676     OH_Drawing_FontDestroy(font);
677 }
678 
679 /*
680  * @tc.name: GlyDrawingTest004
681  * @tc.desc: Test for the glyph drawing of the RTL text.
682  * @tc.type: FUNC
683  */
684 HWTEST_F(NdkRunTest, GlyDrawingTest004, TestSize.Level0)
685 {
686     text_ = "مرحبا";
687     PrepareCreateTextLineForGlyphDrawing();
688     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
689     EXPECT_NE(run, nullptr);
690 
691     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
692     EXPECT_NE(font, nullptr);
693     OH_Drawing_Font_Metrics fontMetrics;
694     OH_Drawing_FontGetMetrics(font, &fontMetrics);
695     EXPECT_EQ(fontMetrics.flags, 31);
696     EXPECT_NEAR(fontMetrics.top, -139.800003, FLOAT_DATA_EPSILON);
697     EXPECT_NEAR(fontMetrics.ascent, -117.900001, FLOAT_DATA_EPSILON);
698     EXPECT_NEAR(fontMetrics.descent, 32.300003, FLOAT_DATA_EPSILON);
699     EXPECT_NEAR(fontMetrics.bottom, 39.299999, FLOAT_DATA_EPSILON);
700     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
701     EXPECT_NEAR(fontMetrics.avgCharWidth, 70.300003, FLOAT_DATA_EPSILON);
702     EXPECT_NEAR(fontMetrics.maxCharWidth, 160.900009, FLOAT_DATA_EPSILON);
703 
704     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
705     EXPECT_EQ(direction, TEXT_DIRECTION_RTL);
706 
707     OH_Drawing_Array* advances = OH_Drawing_GetRunGlyphAdvances(run, 1, 2);
708     EXPECT_NE(advances, nullptr);
709     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advances);
710     EXPECT_EQ(advancesSize, 2);
711 
712     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
713     EXPECT_NE(advance, nullptr);
714     float x = 0.0;
715     OH_Drawing_PointGetX(advance, &x);
716     EXPECT_NEAR(x, 32.999969, FLOAT_DATA_EPSILON);
717     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 1);
718     EXPECT_NE(advance, nullptr);
719     OH_Drawing_PointGetX(advance, &x);
720     EXPECT_NEAR(x, 64.599945, FLOAT_DATA_EPSILON);
721 
722     OH_Drawing_DestroyRunGlyphAdvances(advances);
723     OH_Drawing_FontDestroy(font);
724 }
725 
726 /*
727  * @tc.name: GlyDrawingTest005
728  * @tc.desc: Test for the glyph drawing of the Arabic and Latin ligature text.
729  * @tc.type: FUNC
730  */
731 HWTEST_F(NdkRunTest, GlyDrawingTest005, TestSize.Level0)
732 {
733     text_ = "\u0644\u0627Hello你好连字测试\u0066\u0069";
734     PrepareCreateTextLineForGlyphDrawing();
735     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
736     EXPECT_NE(run, nullptr);
737 
738     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
739     EXPECT_NE(font, nullptr);
740     OH_Drawing_Font_Metrics fontMetrics;
741     OH_Drawing_FontGetMetrics(font, &fontMetrics);
742     EXPECT_EQ(fontMetrics.flags, 31);
743     EXPECT_NEAR(fontMetrics.top, -139.800003, FLOAT_DATA_EPSILON);
744     EXPECT_NEAR(fontMetrics.ascent, -117.900001, FLOAT_DATA_EPSILON);
745     EXPECT_NEAR(fontMetrics.descent, 32.300003, FLOAT_DATA_EPSILON);
746     EXPECT_NEAR(fontMetrics.bottom, 39.299999, FLOAT_DATA_EPSILON);
747     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
748     EXPECT_NEAR(fontMetrics.avgCharWidth, 70.300003, FLOAT_DATA_EPSILON);
749     EXPECT_NEAR(fontMetrics.maxCharWidth, 160.900009, FLOAT_DATA_EPSILON);
750 
751     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
752     EXPECT_EQ(direction, TEXT_DIRECTION_RTL);
753 
754     OH_Drawing_Array* advancesTest1 = OH_Drawing_GetRunGlyphAdvances(run, 0, 1);
755     EXPECT_NE(advancesTest1, nullptr);
756     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest1);
757     EXPECT_EQ(advancesSize, 1);
758 
759     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest1, 0);
760     EXPECT_NE(advance, nullptr);
761     float x = 0.0;
762     OH_Drawing_PointGetX(advance, &x);
763     EXPECT_NEAR(x, 48.999954, FLOAT_DATA_EPSILON);
764     OH_Drawing_DestroyRunGlyphAdvances(advancesTest1);
765 
766     run = OH_Drawing_GetRunByIndex(runs_, 3);
767     OH_Drawing_Array* advancesTest2 = OH_Drawing_GetRunGlyphAdvances(run, 0, 2);
768     EXPECT_NE(advancesTest2, nullptr);
769     advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest2);
770     EXPECT_EQ(advancesSize, 1);
771 
772     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest2, 0);
773     EXPECT_NE(advance, nullptr);
774     OH_Drawing_PointGetX(advance, &x);
775     EXPECT_NEAR(x, 57.399948, FLOAT_DATA_EPSILON);
776 
777     OH_Drawing_DestroyRunGlyphAdvances(advancesTest2);
778     OH_Drawing_FontDestroy(font);
779 }
780 
781 /*
782  * @tc.name: GlyDrawingTest006
783  * @tc.desc: Test for the glyph drawing of the Sanskrit combination text.
784  * @tc.type: FUNC
785  */
786 HWTEST_F(NdkRunTest, GlyDrawingTest006, TestSize.Level0)
787 {
788     text_ = "क्Hello你好天成文测试का";
789     PrepareCreateTextLineForGlyphDrawing();
790     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
791     EXPECT_NE(run, nullptr);
792 
793     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
794     EXPECT_NE(font, nullptr);
795     OH_Drawing_Font_Metrics fontMetrics;
796     OH_Drawing_FontGetMetrics(font, &fontMetrics);
797     EXPECT_EQ(fontMetrics.flags, 31);
798     EXPECT_NEAR(fontMetrics.top, -134.699997, FLOAT_DATA_EPSILON);
799     EXPECT_NEAR(fontMetrics.ascent, -89.600006, FLOAT_DATA_EPSILON);
800     EXPECT_NEAR(fontMetrics.descent, 40.799999, FLOAT_DATA_EPSILON);
801     EXPECT_NEAR(fontMetrics.bottom, 39.399998, FLOAT_DATA_EPSILON);
802     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
803     EXPECT_NEAR(fontMetrics.avgCharWidth, 55.500000, FLOAT_DATA_EPSILON);
804     EXPECT_NEAR(fontMetrics.maxCharWidth, 201.300003, FLOAT_DATA_EPSILON);
805 
806     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
807     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
808 
809     OH_Drawing_Array* advancesTest1 = OH_Drawing_GetRunGlyphAdvances(run, 0, 2);
810     EXPECT_NE(advancesTest1, nullptr);
811     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest1);
812     EXPECT_EQ(advancesSize, 2);
813 
814     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest1, 0);
815     EXPECT_NE(advance, nullptr);
816     float x = 0.0;
817     OH_Drawing_PointGetX(advance, &x);
818     EXPECT_NEAR(x, 76.199921, FLOAT_DATA_EPSILON);
819 
820     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest1, 1);
821     EXPECT_NE(advance, nullptr);
822     OH_Drawing_PointGetX(advance, &x);
823     EXPECT_NEAR(x, 0.000000, FLOAT_DATA_EPSILON);
824 
825     run = OH_Drawing_GetRunByIndex(runs_, 3);
826     OH_Drawing_Array* advancesTest2 = OH_Drawing_GetRunGlyphAdvances(run, 0, 2);
827     EXPECT_NE(advancesTest2, nullptr);
828     advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest2);
829     EXPECT_EQ(advancesSize, 2);
830 
831     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest2, 0);
832     EXPECT_NE(advance, nullptr);
833     OH_Drawing_PointGetX(advance, &x);
834     EXPECT_NEAR(x, 76.199921, FLOAT_DATA_EPSILON);
835 
836     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest2, 1);
837     EXPECT_NE(advance, nullptr);
838     OH_Drawing_PointGetX(advance, &x);
839     EXPECT_NEAR(x, 25.899979, FLOAT_DATA_EPSILON);
840 
841     OH_Drawing_DestroyRunGlyphAdvances(advancesTest2);
842     OH_Drawing_FontDestroy(font);
843 }
844 
845 /*
846  * @tc.name: GlyDrawingTest007
847  * @tc.desc: Test for the glyph drawing of the Sanskrit combination text.
848  * @tc.type: FUNC
849  */
850 HWTEST_F(NdkRunTest, GlyDrawingTest007, TestSize.Level0)
851 {
852     text_ = "གྷHello你好藏文测试སྒྲ";
853     PrepareCreateTextLineForGlyphDrawing();
854     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
855     EXPECT_NE(run, nullptr);
856     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
857     EXPECT_NE(font, nullptr);
858     OH_Drawing_Font_Metrics fontMetrics;
859     OH_Drawing_FontGetMetrics(font, &fontMetrics);
860     EXPECT_EQ(fontMetrics.flags, 31);
861     EXPECT_NEAR(fontMetrics.top, -110.679001, FLOAT_DATA_EPSILON);
862     EXPECT_NEAR(fontMetrics.ascent, -115.813995, FLOAT_DATA_EPSILON);
863     EXPECT_NEAR(fontMetrics.descent, 106.570999, FLOAT_DATA_EPSILON);
864     EXPECT_NEAR(fontMetrics.bottom, 78.605003, FLOAT_DATA_EPSILON);
865     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
866     EXPECT_NEAR(fontMetrics.avgCharWidth, 49.848999, FLOAT_DATA_EPSILON);
867     EXPECT_NEAR(fontMetrics.maxCharWidth, 206.347992, FLOAT_DATA_EPSILON);
868 
869     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
870     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
871 
872     OH_Drawing_Array* advancesTest1 = OH_Drawing_GetRunGlyphAdvances(run, 0, 1);
873     EXPECT_NE(advancesTest1, nullptr);
874     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest1);
875     EXPECT_EQ(advancesSize, 1);
876 
877     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest1, 0);
878     EXPECT_NE(advance, nullptr);
879     float x = 0.0;
880     OH_Drawing_PointGetX(advance, &x);
881     EXPECT_NEAR(x, 56.405991, FLOAT_DATA_EPSILON);
882     OH_Drawing_DestroyRunGlyphAdvances(advancesTest1);
883 
884     run = OH_Drawing_GetRunByIndex(runs_, 3);
885     OH_Drawing_Array* advancesTest2 = OH_Drawing_GetRunGlyphAdvances(run, 0, 1);
886     EXPECT_NE(advancesTest2, nullptr);
887     advancesSize = OH_Drawing_GetDrawingArraySize(advancesTest2);
888     EXPECT_EQ(advancesSize, 1);
889     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advancesTest2, 0);
890     EXPECT_NE(advance, nullptr);
891     OH_Drawing_PointGetX(advance, &x);
892     EXPECT_NEAR(x, 53.324997, FLOAT_DATA_EPSILON);
893 
894     OH_Drawing_DestroyRunGlyphAdvances(advancesTest2);
895     OH_Drawing_FontDestroy(font);
896 }
897 
898 /*
899  * @tc.name: GlyDrawingTest008
900  * @tc.desc: Test for the glyph drawing of the Thai text.
901  * @tc.type: FUNC
902  */
903 HWTEST_F(NdkRunTest, GlyDrawingTest008, TestSize.Level0)
904 {
905     text_ = "\u0E01\u0E33\u0E41\u0E01Hello你好泰文测试";
906     PrepareCreateTextLineForGlyphDrawing();
907     OH_Drawing_Run* run = OH_Drawing_GetRunByIndex(runs_, 0);
908     EXPECT_NE(run, nullptr);
909 
910     OH_Drawing_Font* font = OH_Drawing_GetRunFont(run);
911     EXPECT_NE(font, nullptr);
912     OH_Drawing_Font_Metrics fontMetrics;
913     OH_Drawing_FontGetMetrics(font, &fontMetrics);
914     EXPECT_EQ(fontMetrics.flags, 31);
915     EXPECT_NEAR(fontMetrics.top, -100.899994, FLOAT_DATA_EPSILON);
916     EXPECT_NEAR(fontMetrics.ascent, -106.099998, FLOAT_DATA_EPSILON);
917     EXPECT_NEAR(fontMetrics.descent, 45.000000, FLOAT_DATA_EPSILON);
918     EXPECT_NEAR(fontMetrics.bottom, 43.299999, FLOAT_DATA_EPSILON);
919     EXPECT_NEAR(fontMetrics.leading, 0.0, FLOAT_DATA_EPSILON);
920     EXPECT_NEAR(fontMetrics.avgCharWidth, 55.800003, FLOAT_DATA_EPSILON);
921     EXPECT_NEAR(fontMetrics.maxCharWidth, 165.100006, FLOAT_DATA_EPSILON);
922 
923     OH_Drawing_TextDirection direction = OH_Drawing_GetRunTextDirection(run);
924     EXPECT_EQ(direction, TEXT_DIRECTION_LTR);
925 
926     OH_Drawing_Array* advances = OH_Drawing_GetRunGlyphAdvances(run, 0, 5);
927     EXPECT_NE(advances, nullptr);
928     size_t advancesSize = OH_Drawing_GetDrawingArraySize(advances);
929     EXPECT_EQ(advancesSize, 5);
930 
931     OH_Drawing_Point* advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 0);
932     EXPECT_NE(advance, nullptr);
933     float x = 0.0;
934     OH_Drawing_PointGetX(advance, &x);
935     EXPECT_NEAR(x, 59.999939, FLOAT_DATA_EPSILON);
936 
937     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 1);
938     EXPECT_NE(advance, nullptr);
939     OH_Drawing_PointGetX(advance, &x);
940     EXPECT_NEAR(x, 0.000000, FLOAT_DATA_EPSILON);
941 
942     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 2);
943     EXPECT_NE(advance, nullptr);
944     OH_Drawing_PointGetX(advance, &x);
945     EXPECT_NEAR(x, 40.599960, FLOAT_DATA_EPSILON);
946         advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 3);
947     EXPECT_NE(advance, nullptr);
948     OH_Drawing_PointGetX(advance, &x);
949     EXPECT_NEAR(x, 56.799942, FLOAT_DATA_EPSILON);
950 
951     advance = OH_Drawing_GetRunGlyphAdvanceByIndex(advances, 4);
952     EXPECT_NE(advance, nullptr);
953     OH_Drawing_PointGetX(advance, &x);
954     EXPECT_NEAR(x, 59.999939, FLOAT_DATA_EPSILON);
955 
956     OH_Drawing_DestroyRunGlyphAdvances(advances);
957     OH_Drawing_FontDestroy(font);
958 }
959 }  // namespace OHOS