GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: gx_multi_line_text_view_string_total_rows_compute.c Lines: 38 38 100.0 %
Date: 2026-03-06 19:21:09 Branches: 18 18 100.0 %

Line Branch Exec Source
1
/***************************************************************************
2
 * Copyright (c) 2024 Microsoft Corporation
3
 * Copyright (c) 2026-present Eclipse ThreadX contributors
4
 *
5
 * This program and the accompanying materials are made available under the
6
 * terms of the MIT License which is available at
7
 * https://opensource.org/licenses/MIT.
8
 *
9
 * SPDX-License-Identifier: MIT
10
 **************************************************************************/
11
12
13
/**************************************************************************/
14
/**************************************************************************/
15
/**                                                                       */
16
/** GUIX Component                                                        */
17
/**                                                                       */
18
/**   Multi Line Text View Management (Multi Line Text View)              */
19
/**                                                                       */
20
/**************************************************************************/
21
22
#define GX_SOURCE_CODE
23
24
25
/* Include necessary system files.  */
26
27
#include "gx_api.h"
28
#include "gx_widget.h"
29
#include "gx_system.h"
30
#include "gx_window.h"
31
#include "gx_multi_line_text_view.h"
32
#include "gx_utility.h"
33
34
/**************************************************************************/
35
/*                                                                        */
36
/*  FUNCTION                                               RELEASE        */
37
/*                                                                        */
38
/*    _gx_multi_line_text_view_string_total_rows_compute  PORTABLE C      */
39
/*                                                           6.1.10       */
40
/*  AUTHOR                                                                */
41
/*                                                                        */
42
/*    Kenneth Maxwell, Microsoft Corporation                              */
43
/*                                                                        */
44
/*  DESCRIPTION                                                           */
45
/*                                                                        */
46
/*    This function gets the total rows of the text view text.            */
47
/*                                                                        */
48
/*  INPUT                                                                 */
49
/*                                                                        */
50
/*    text_view                             Multi line text view          */
51
/*                                            control block               */
52
/*  OUTPUT                                                                */
53
/*                                                                        */
54
/*    None                                                                */
55
/*                                                                        */
56
/*  CALLS                                                                 */
57
/*                                                                        */
58
/*    _gx_widget_font_get                   Retrieve font                 */
59
/*    _gx_window_client_width_get           Get the client width          */
60
/*    _gx_multi_line_text_view_display_info_get                           */
61
/*                                          Obtain the information on     */
62
/*                                            a string                    */
63
/*    _gx_system_string_get                 Get string by resource id     */
64
/*    _gx_system_private_string_get         Get string pointer in         */
65
/*                                            dynamically copied string   */
66
/*                                            buffer                      */
67
/*                                                                        */
68
/*  CALLED BY                                                             */
69
/*                                                                        */
70
/*    _gx_multi_line_text_input_cursor_pos_calculate                      */
71
/*    _gx_multi_line_text_input_cursor_pos_update                         */
72
/*    _gx_multi_line_text_view_text_id_set                                */
73
/*    _gx_multi_line_text_view_text_set                                   */
74
/*                                                                        */
75
/**************************************************************************/
76
4238
UINT _gx_multi_line_text_view_string_total_rows_compute(GX_MULTI_LINE_TEXT_VIEW *text_view)
77
{
78
4238
UINT                    total_rows = 0;
79
GX_VALUE                client_width;
80
GX_MULTI_LINE_TEXT_INFO text_info;
81
4238
UINT                    index = 0;
82
4238
INT                     cache_index = -1;
83
GX_STRING               string;
84
4238
UINT                    first_cache_line = text_view -> gx_multi_line_text_view_first_cache_line;
85
GX_FONT                *font;
86
87
#if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
88
GX_BIDI_TEXT_INFO           bidi_text_info;
89
GX_BIDI_RESOLVED_TEXT_INFO *next;
90
GX_CANVAS                  *canvas;
91
GX_DISPLAY                 *display;
92
#endif
93
94
4238
    _gx_widget_font_get((GX_WIDGET *)text_view, text_view -> gx_multi_line_text_view_font_id, &font);
95
96
4238
    if (!font)
97
    {
98
25
        return GX_FAILURE;
99
    }
100
101
4213
    if (!text_view -> gx_multi_line_text_view_text.gx_string_length)
102
    {
103
171
        text_view -> gx_multi_line_text_view_first_cache_line = 0;
104
171
        text_view -> gx_multi_line_text_view_cache_size = 0;
105
171
        text_view -> gx_multi_line_text_view_text_total_rows = 0;
106
171
        text_view -> gx_multi_line_text_view_line_index[0] = '\0';
107
171
        text_view -> gx_multi_line_text_view_line_index_old = GX_FALSE;
108
171
        return GX_SUCCESS;
109
    }
110
111
4042
    _gx_window_client_width_get((GX_WINDOW *)text_view, &client_width);
112
113
4042
    client_width = (GX_VALUE)(client_width - (text_view -> gx_multi_line_text_view_whitespace << 1));
114
115
4042
    if (text_view -> gx_multi_line_text_view_text_id)
116
    {
117
248
        _gx_widget_string_get_ext((GX_WIDGET *)text_view, text_view -> gx_multi_line_text_view_text_id, &string);
118
    }
119
    else
120
    {
121
3794
        _gx_system_private_string_get(&text_view -> gx_multi_line_text_view_text, &string, text_view -> gx_widget_style);
122
    }
123
124
#if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
125
    if (_gx_system_bidi_text_enabled && (text_view -> gx_widget_type == GX_TYPE_MULTI_LINE_TEXT_VIEW))
126
    {
127
        if (!text_view -> gx_multi_line_text_view_bidi_resolved_text_info)
128
        {
129
            bidi_text_info.gx_bidi_text_info_display_width = (GX_VALUE)(client_width - 3);
130
            bidi_text_info.gx_bidi_text_info_font = font;
131
            bidi_text_info.gx_bidi_text_info_text = string;
132
            GX_UTILITY_TEXT_DIRECTION_GET(bidi_text_info.gx_bidi_text_info_direction, text_view, canvas, display);
133
134
            _gx_utility_bidi_paragraph_reorder_ext(&bidi_text_info, &text_view -> gx_multi_line_text_view_bidi_resolved_text_info);
135
        }
136
137
        next = text_view -> gx_multi_line_text_view_bidi_resolved_text_info;
138
139
        while (next)
140
        {
141
            total_rows += next -> gx_bidi_resolved_text_info_total_lines;
142
            next = next -> gx_bidi_resolved_text_info_next;
143
        }
144
    }
145
    else
146
    {
147
#endif
148
        /* Calculate the total rows of text view string. */
149
101320
        while (index < text_view -> gx_multi_line_text_view_text.gx_string_length)
150
        {
151
            /* Save line index. */
152
97278
            if ((total_rows >= first_cache_line) &&
153
74203
                (total_rows < first_cache_line + GX_MULTI_LINE_INDEX_CACHE_SIZE))
154
            {
155
69954
                cache_index = (GX_UBYTE)(total_rows - first_cache_line);
156
69954
                text_view -> gx_multi_line_text_view_line_index[cache_index] = index;
157
            }
158
159
            /* Calculate some information used to draw the text. */
160
97278
            _gx_multi_line_text_view_display_info_get(text_view, index, text_view -> gx_multi_line_text_view_text.gx_string_length, &text_info, (GX_VALUE)(client_width - 2));
161
162
97278
            total_rows++;
163
97278
            index += text_info.gx_text_display_number;
164
        }
165
166
4042
        if ((string.gx_string_ptr[index - 1] == GX_KEY_CARRIAGE_RETURN) ||
167
3610
            (string.gx_string_ptr[index - 1] == GX_KEY_LINE_FEED))
168
        {
169
            /* Save line index. */
170
589
            if (total_rows < first_cache_line + GX_MULTI_LINE_INDEX_CACHE_SIZE)
171
            {
172
412
                cache_index = (GX_UBYTE)(total_rows - first_cache_line);
173
412
                text_view -> gx_multi_line_text_view_line_index[cache_index] = index;
174
            }
175
176
589
            total_rows++;
177
        }
178
179
4042
        text_view -> gx_multi_line_text_view_cache_size = (GX_UBYTE)(cache_index + 1);
180
#if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
181
    }
182
#endif
183
184
4042
    text_view -> gx_multi_line_text_view_text_total_rows = total_rows;
185
4042
    text_view -> gx_multi_line_text_view_line_index_old = GX_FALSE;
186
187
4042
    return GX_SUCCESS;
188
}
189