1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** GUIX Component                                                        */
16 /**                                                                       */
17 /**   Utility (Utility)                                                   */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 /**************************************************************************/
24 /*                                                                        */
25 /*  COMPONENT DEFINITION                                   RELEASE        */
26 /*                                                                        */
27 /*    gx_utility.h                                        PORTABLE C      */
28 /*                                                           6.1.10       */
29 /*  AUTHOR                                                                */
30 /*                                                                        */
31 /*    Kenneth Maxwell, Microsoft Corporation                              */
32 /*                                                                        */
33 /*  DESCRIPTION                                                           */
34 /*                                                                        */
35 /*    This file defines the GUIX utility component,                       */
36 /*    including all data types and external references.  It is assumed    */
37 /*    that gx_api.h and gx_port.h have already been included.             */
38 /*                                                                        */
39 /*  RELEASE HISTORY                                                       */
40 /*                                                                        */
41 /*    DATE              NAME                      DESCRIPTION             */
42 /*                                                                        */
43 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
44 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
45 /*                                            added new prototype,        */
46 /*                                            resulting in version 6.1    */
47 /*  12-31-2020     Kenneth Maxwell          Modified comment(s), added    */
48 /*                                            bidi test reordering APIs,  */
49 /*                                            resulting in version 6.1.3  */
50 /*  06-02-2021     Kenneth Maxwell          Modified comment(s),          */
51 /*                                            rename RENESAS_DAVE2D       */
52 /*                                            support conditional,        */
53 /*                                            resulting in version 6.1.7  */
54 /*  01-31-2022     Ting Zhu                 Modified comment(s),          */
55 /*                                            added new bidi text         */
56 /*                                            reordering API,             */
57 /*                                            resulting in version 6.1.10 */
58 /*                                                                        */
59 /**************************************************************************/
60 
61 #ifndef GX_UTILITY_H
62 #define GX_UTILITY_H
63 
64 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
65 /* Define bidi character types. */
66 #define GX_BIDI_CHARACTER_TYPE_L     0x01 /* Left to Right */
67 #define GX_BIDI_CHARACTER_TYPE_R     0x02 /* Right to Left */
68 #define GX_BIDI_CHARACTER_TYPE_AL    0x03 /* Right to Left Arabic */
69 #define GX_BIDI_CHARACTER_TYPE_EN    0x04 /* European Number */
70 #define GX_BIDI_CHARACTER_TYPE_ES    0x05 /* European Number Separator */
71 #define GX_BIDI_CHARACTER_TYPE_ET    0x06 /* European Number Terminator */
72 #define GX_BIDI_CHARACTER_TYPE_AN    0x07 /* Arabic Number */
73 #define GX_BIDI_CHARACTER_TYPE_CS    0x08 /* Common Number Separator */
74 #define GX_BIDI_CHARACTER_TYPE_NSM   0x09 /* Nonspacing Mark */
75 #define GX_BIDI_CHARACTER_TYPE_BN    0x0A /* Boundary Neutral */
76 #define GX_BIDI_CHARACTER_TYPE_B     0x0B /* Paragraph Separator */
77 #define GX_BIDI_CHARACTER_TYPE_S     0x0C /* Segment Separator */
78 #define GX_BIDI_CHARACTER_TYPE_WS    0x0D /* Whitespace */
79 #define GX_BIDI_CHARACTER_TYPE_ON    0x0E /* Other Neutrals */
80 #define GX_BIDI_CHARACTER_TYPE_LRE   0x0F
81 #define GX_BIDI_CHARACTER_TYPE_LRO   0x10
82 #define GX_BIDI_CHARACTER_TYPE_RLE   0x11
83 #define GX_BIDI_CHARACTER_TYPE_RLO   0x12
84 #define GX_BIDI_CHARACTER_TYPE_PDF   0x13
85 #define GX_BIDI_CHARACTER_TYPE_LRI   0x14
86 #define GX_BIDI_CHARACTER_TYPE_RLI   0x15
87 #define GX_BIDI_CHARACTER_TYPE_FSI   0x16
88 #define GX_BIDI_CHARACTER_TYPE_PDI   0x17
89 
90 #define GX_BIDI_CATEGORY_STRONG      0x01
91 #define GX_BIDI_CATEGORY_WEAK        0x02
92 #define GX_BIDI_CATEGORY_NEUTRAL     0x03
93 
94 #define GX_BIDI_DIRECTION_FORMAT_LRE 0x202A /* Left to Right Embedding */
95 #define GX_BIDI_DIRECTION_FORMAT_LRO 0x202D /* Left to Right Override */
96 #define GX_BIDI_DIRECTION_FORMAT_RLE 0x202B /* Right to Left Embedding */
97 #define GX_BIDI_DIRECTION_FORMAT_RLO 0x202E /* Right to Left Override */
98 #define GX_BIDI_DIRECTION_FORMAT_PDF 0x202C /* Pop Directional Format */
99 #define GX_BIDI_DIRECTION_FORMAT_LRI 0x2066 /* Left to Right Isolate */
100 #define GX_BIDI_DIRECTION_FORMAT_RLI 0x2067 /* Right to Left Isolate */
101 #define GX_BIDI_DIRECTION_FORMAT_FSI 0x2068 /* First Strong Isolate */
102 #define GX_BIDI_DIRECTION_FORMAT_PDI 0x2069 /* Pop Directional Isolate */
103 
104 
105 #define GX_BIDI_OVERRIDE_STATUS_N    0x01 /* No override is currently active */
106 #define GX_BIDI_OVERRIDE_STATUS_R    0x02 /* Characters are to be reset to R */
107 #define GX_BIDI_OVERRIDE_STATUS_L    0x03 /* Characters are to be reset to L */
108 
109 #define GX_BIDI_MAX_EXPLICIT_DEPTH   125
110 #define GX_BIDI_MAX_BRACKET_DEPTH    63
111 
112 /* Define explicit entry structure. */
113 typedef struct GX_BIDI_EXPLICIT_ENTRY_STRUCT
114 {
115     GX_UBYTE gx_bidi_explicit_level;
116     GX_BOOL  gx_bidi_explicit_override_status;
117     GX_BOOL  gx_bidi_explicit_isolate_status;
118 } GX_BIDI_EXPLICIT_ENTRY;
119 
120 /* Define level run information structure. */
121 typedef struct GX_BIDI_LEVEL_RUN_STRUCT
122 {
123     INT                              gx_bidi_level_run_start_index;
124     INT                              gx_bidi_level_run_end_index;
125     GX_UBYTE                         gx_bidi_level_run_level;
126     struct GX_BIDI_LEVEL_RUN_STRUCT *gx_bidi_level_run_next;
127 } GX_BIDI_LEVEL_RUN;
128 
129 /* Define isolate run sequence information structure. */
130 typedef struct GX_BIDI_ISOLATE_RUN_STRUCT
131 {
132     INT                               *gx_bidi_isolate_run_index_list;
133     INT                                gx_bidi_isolate_run_index_count;
134     GX_UBYTE                           gx_bidi_isolate_run_sos;
135     GX_UBYTE                           gx_bidi_isolate_run_eos;
136     struct GX_BIDI_ISOLATE_RUN_STRUCT *gx_bidi_isolate_run_next;
137 } GX_BIDI_ISOLATE_RUN;
138 
139 /* Define unicode information structure. */
140 typedef struct GX_BIDI_UNIT_STRUCT
141 {
142     ULONG    gx_bidi_unit_code;
143     GX_UBYTE gx_bidi_unit_level;
144     GX_UBYTE gx_bidi_unit_type;
145     GX_UBYTE gx_bidi_unit_org_type;
146 } GX_BIDI_UNIT;
147 
148 /* Define a truture to keep parameters for a bunch of functions. */
149 typedef struct GX_BIDI_CONTEXT_STRUCT
150 {
151     GX_BIDI_TEXT_INFO   *gx_bidi_context_input_info;
152     UINT                 gx_bidi_context_processced_size;
153     UINT                 gx_bidi_context_total_lines;
154     GX_BIDI_UNIT        *gx_bidi_context_unit_list;
155     INT                  gx_bidi_context_unit_count;
156     INT                 *gx_bidi_context_line_index_cache;
157     GX_BIDI_LEVEL_RUN   *gx_bidi_context_level_runs;
158     GX_BIDI_ISOLATE_RUN *gx_bidi_context_isolate_runs;
159     GX_UBYTE            *gx_bidi_context_buffer;
160     UINT                 gx_bidi_context_buffer_size;
161     UINT                 gx_bidi_context_buffer_index;
162     UINT                 gx_bidi_context_bracket_pair_size;
163     GX_UBYTE             gx_bidi_context_base_level;
164     ULONG                gx_bidi_context_reordered_utf8_size;
165 } GX_BIDI_CONTEXT;
166 
167 /* Define bidirectional character infomation structure. */
168 typedef struct GX_BIDI_CHARACTER_INFO_STRUCT
169 {
170     ULONG    gx_bidi_character_info_range_start;
171     ULONG    gx_bidi_character_info_range_end;
172     GX_UBYTE gx_bidi_character_info_type;
173 } GX_BIDI_CHARACTER_INFO;
174 
175 typedef struct GX_BIDI_BRACKET_PAIR_STRUCT
176 {
177     ULONG gx_bidi_bracket_pair_open;
178     ULONG gx_bidi_bracket_pair_close;
179 } GX_BIDI_BRACKET_PAIR;
180 
181 #define GX_UTILITY_TEXT_DIRECTION_GET(direction, widget, canvas, display)                                                      \
182             direction = GX_LANGUAGE_DIRECTION_LTR;                                                                             \
183                                                                                                                                \
184             if (_gx_widget_canvas_get((GX_WIDGET *)widget, &canvas) == GX_SUCCESS)                                             \
185             {                                                                                                                  \
186                 display = canvas -> gx_canvas_display;                                                                         \
187                                                                                                                                \
188                 if (display -> gx_display_language_direction_table)                                                            \
189                 {                                                                                                              \
190                     direction = (GX_BYTE)display -> gx_display_language_direction_table[display -> gx_display_active_language];\
191                 }                                                                                                              \
192             }
193 #endif
194 
195 #define GX_UTILITY_MATH_UINT_ADD(augend, addend, result) \
196     if ((UINT)-1 - (augend) < (addend))                  \
197     {                                                    \
198         return GX_MATH_OVERFLOW;                         \
199     }                                                    \
200     else                                                 \
201     {                                                    \
202         (result) = (augend) + (addend);                  \
203     }
204 
205 #define GX_UTILITY_MATH_UINT_MULT(multiplicand, multiplier, result) \
206     if ((UINT)-1 / (multiplier) < (multiplicand))                   \
207     {                                                               \
208         return GX_MATH_OVERFLOW;                                    \
209     }                                                               \
210     else                                                            \
211     {                                                               \
212         (result) = (multiplicand) * (multiplier);                   \
213     }
214 
215 #define GX_UTILITY_MATH_USHORT_ADD(augend, addend, result) \
216     if ((USHORT)-1 - (augend) < (addend))                  \
217     {                                                      \
218         return GX_MATH_OVERFLOW;                           \
219     }                                                      \
220     else                                                   \
221     {                                                      \
222         (result) = (USHORT)((augend) + (addend));          \
223     }
224 
225 #define GX_UTILITY_MATH_USHORT_MULT(multiplicand, multiplier, result) \
226     if ((USHORT)-1 / (multiplier) < (multiplicand))                   \
227     {                                                                 \
228         return GX_MATH_OVERFLOW;                                      \
229     }                                                                 \
230     else                                                              \
231     {                                                                 \
232         result = (USHORT)((multiplicand) * (multiplier));             \
233     }
234 
235 #define GX_UTILITY_USHORT_CHECK(a)\
236     if((a) > (USHORT)-1)          \
237     {                             \
238         return GX_MATH_OVERFLOW;  \
239     }
240 
241 /* Define utility component function prototypes.  */
242 UINT _gx_utility_1bpp_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
243 UINT _gx_utility_1bpp_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
244 UINT _gx_utility_1bpp_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
245 UINT _gx_utility_4bpp_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
246 UINT _gx_utility_4bpp_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
247 UINT _gx_utility_4bpp_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
248 UINT _gx_utility_8bpp_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
249 UINT _gx_utility_8bit_alphamap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
250 UINT _gx_utility_8bpp_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
251 UINT _gx_utility_8bpp_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
252 UINT _gx_utility_8bit_alphamap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
253 UINT _gx_utility_16bpp_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
254 UINT _gx_utility_32argb_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
255 UINT _gx_utility_32argb_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
256 UINT _gx_utility_32argb_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
257 UINT _gx_utility_332rgb_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
258 UINT _gx_utility_332rgb_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
259 UINT _gx_utility_565rgb_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
260 UINT _gx_utility_565rgb_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
261 UINT _gx_utility_1555xrgb_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
262 UINT _gx_utility_1555xrgb_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
263 UINT _gx_utility_4444argb_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
264 UINT _gx_utility_4444argb_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
265 UINT _gx_utility_4444argb_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
266 UINT _gx_utility_alphamap_create(INT width, INT height, GX_PIXELMAP *map);
267 UINT _gx_utility_circle_point_get(INT xcenter, INT ycenter, UINT r, INT angle, GX_POINT *point);
268 UINT _gx_utility_easing_function_calculate(USHORT easing_function_style, INT start_val, INT end_val, INT t, INT d, INT *return_value);
269 
270 VOID _gx_utility_glyph_1bpp_to_alphamap_draw(GX_PIXELMAP *map, INT xpos, INT ypos, GX_CONST GX_GLYPH *glyph);
271 VOID _gx_utility_glyph_4bpp_to_alphamap_draw(GX_PIXELMAP *map, INT xpos, INT ypos, GX_CONST GX_GLYPH *glyph);
272 VOID _gx_utility_glyph_8bpp_to_alphamap_draw(GX_PIXELMAP *map, INT xpos, INT ypos, GX_CONST GX_GLYPH *glyph);
273 
274 #if defined(GX_RENESAS_DAVE2D_FONT_SUPPORT)
275 VOID _gx_utility_glyph_reversed_4bpp_to_alphamap_draw(GX_PIXELMAP *map, INT xpos, INT ypos, GX_CONST GX_GLYPH *glyph);
276 VOID _gx_utility_glyph_reversed_1bpp_to_alphamap_draw(GX_PIXELMAP *map, INT xpos, INT ypos, GX_CONST GX_GLYPH *glyph);
277 #endif
278 
279 UINT _gx_utility_gradient_create(GX_GRADIENT *gradient, GX_VALUE width, GX_VALUE height, UCHAR type, GX_UBYTE start_alpha, GX_UBYTE end_alpha);
280 UINT _gx_utility_gradient_delete(GX_GRADIENT *gradient);
281 UINT _gx_utility_canvas_to_bmp(GX_CANVAS *canvas, GX_RECTANGLE *rect, UINT (*write_data)(GX_UBYTE *byte_data, UINT data_count));
282 UINT _gx_utility_ltoa(LONG value, GX_CHAR *return_buffer, UINT return_buffer_size);
283 
284 #if defined(GUIX_5_4_0_COMPATIBILITY)
285 INT _gx_utility_math_acos_5_4_0(INT x);
286 INT _gx_utility_math_asin_5_4_0(INT x);
287 INT _gx_utility_math_cos_5_4_0(INT angle);
288 INT _gx_utility_math_sin_5_4_0(INT angle);
289 #endif
290 
291 INT          _gx_utility_math_acos(GX_FIXED_VAL x);
292 INT          _gx_utility_math_asin(GX_FIXED_VAL x);
293 GX_FIXED_VAL _gx_utility_math_cos(GX_FIXED_VAL angle);
294 GX_FIXED_VAL _gx_utility_math_sin(GX_FIXED_VAL angle);
295 UINT         _gx_utility_math_sqrt(UINT n);
296 
297 UINT         _gx_utility_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
298 UINT         _gx_utility_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
299 UINT         _gx_utility_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
300 UINT         _gx_utility_rectangle_center(GX_RECTANGLE *rectangle, GX_RECTANGLE *within);
301 UINT         _gx_utility_rectangle_center_find(GX_RECTANGLE *rectangle, GX_POINT *return_center);
302 UINT         _gx_utility_rectangle_combine(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle);
303 GX_BOOL      _gx_utility_rectangle_compare(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle);
304 UINT         _gx_utility_rectangle_define(GX_RECTANGLE *rectangle, GX_VALUE left, GX_VALUE top, GX_VALUE right, GX_VALUE bottom);
305 GX_BOOL      _gx_utility_rectangle_inside_detect(GX_RECTANGLE *outer, GX_RECTANGLE *inner);
306 GX_BOOL      _gx_utility_rectangle_overlap_detect(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle, GX_RECTANGLE *return_overlap_area);
307 GX_BOOL      _gx_utility_rectangle_point_detect(GX_RECTANGLE *rectangle, GX_POINT point);
308 UINT         _gx_utility_rectangle_resize(GX_RECTANGLE *rectangle, GX_VALUE adjust);
309 UINT         _gx_utility_rectangle_shift(GX_RECTANGLE *rectangle, GX_VALUE x_shift, GX_VALUE y_shift);
310 
311 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
312 #if defined(GX_DYNAMIC_ARABIC_SHAPING_SUPPORT)
313 UINT _gx_utility_bidi_arabic_shaping(GX_BIDI_CONTEXT *context);
314 #endif
315 UINT _gx_utility_bidi_bracket_pair_get(ULONG code, GX_BIDI_BRACKET_PAIR *bracket_pair);
316 UINT _gx_utility_bidi_character_type_get(ULONG code, GX_UBYTE *type);
317 UINT _gx_utility_bidi_mirroring_get(USHORT code, USHORT *mirror);
318 UINT _gx_utility_bidi_paragraph_reorder(GX_BIDI_TEXT_INFO *input_info, GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
319 UINT _gx_utility_bidi_paragraph_reorder_ext(GX_BIDI_TEXT_INFO *input_info, GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
320 UINT _gx_utility_bidi_resolved_text_info_delete(GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
321 #endif
322 
323 #ifdef GX_THAI_GLYPH_SHAPING_SUPPORT
324 UINT    _gx_utility_thai_glyph_shaping(GX_CONST GX_STRING *string, GX_CHAR_CODE **returned_code_list, UINT *returned_code_count);
325 #endif
326 
327 UINT    _gx_utility_string_length_check(GX_CONST GX_CHAR *string, UINT *length, UINT max_string_length);
328 GX_BOOL _gx_utility_string_compare(GX_CONST GX_STRING *string_1, GX_CONST GX_STRING *string_2, UINT count);
329 
330 #if defined(GX_ENABLE_DEPRECATED_STRING_API)
331 UINT    _gx_utility_string_to_alphamap(GX_CONST GX_CHAR *text, GX_CONST GX_FONT *font, GX_PIXELMAP *textmap);
332 #endif
333 UINT    _gx_utility_string_to_alphamap_ext(GX_CONST GX_STRING *text, GX_CONST GX_FONT *font, GX_PIXELMAP *textmap);
334 VOID    _gx_utility_string_to_alphamap_draw(GX_CONST GX_STRING *text, GX_CONST GX_FONT *font, GX_PIXELMAP *map);
335 
336 #ifdef GX_UTF8_SUPPORT
337 UINT    _gx_utility_unicode_to_utf8(ULONG unicode, GX_UBYTE *return_utf8_str, UINT *return_utf8_size);
338 UINT    _gx_utility_utf8_string_character_get(GX_STRING *utf8_str, GX_CHAR_CODE *glyph_value, UINT *glyph_len);
339 UINT    _gx_utility_utf8_string_backward_character_length_get(GX_STRING *utf8_str, INT start_index, UINT *glyph_len);
340 #endif /* GX_UTF8_SUPPORT */
341 
342 /* Define error checking shells for API services.  These are only referenced by the
343    application.  */
344 UINT    _gxe_utility_canvas_to_bmp(GX_CANVAS *canvas, GX_RECTANGLE *rect, UINT (*write_data)(GX_UBYTE *byte_data, UINT data_count));
345 UINT    _gxe_utility_circle_point_get(INT xcenter, INT ycenter, UINT r, INT angle, GX_POINT *point);
346 UINT    _gxe_utility_gradient_create(GX_GRADIENT *gradient, GX_VALUE width, GX_VALUE height, UCHAR type, GX_UBYTE start_alpha, GX_UBYTE end_alpha);
347 UINT    _gxe_utility_gradient_delete(GX_GRADIENT *gradient);
348 UINT    _gxe_utility_ltoa(LONG value, GX_CHAR *return_buffer, UINT return_buffer_size);
349 UINT    _gxe_utility_pixelmap_resize(GX_PIXELMAP *src, GX_PIXELMAP *destination, INT width, INT height);
350 UINT    _gxe_utility_pixelmap_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
351 UINT    _gxe_utility_pixelmap_simple_rotate(GX_PIXELMAP *src, INT angle, GX_PIXELMAP *destination, INT *rot_cx, INT *rot_cy);
352 UINT    _gxe_utility_rectangle_center(GX_RECTANGLE *rectangle, GX_RECTANGLE *within);
353 UINT    _gxe_utility_rectangle_center_find(GX_RECTANGLE *rectangle, GX_POINT *return_center);
354 UINT    _gxe_utility_rectangle_combine(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle);
355 GX_BOOL _gxe_utility_rectangle_compare(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle);
356 UINT    _gxe_utility_rectangle_define(GX_RECTANGLE *rectangle, GX_VALUE left, GX_VALUE top, GX_VALUE right, GX_VALUE bottom);
357 UINT    _gxe_utility_rectangle_resize(GX_RECTANGLE *rectangle, GX_VALUE adjust);
358 GX_BOOL _gxe_utility_rectangle_overlap_detect(GX_RECTANGLE *first_rectangle, GX_RECTANGLE *second_rectangle, GX_RECTANGLE *return_overlap_area);
359 GX_BOOL _gxe_utility_rectangle_point_detect(GX_RECTANGLE *rectangle, GX_POINT point);
360 UINT    _gxe_utility_rectangle_shift(GX_RECTANGLE *rectangle, GX_VALUE x_shift, GX_VALUE y_shift);
361 #if defined(GX_ENABLE_DEPRECATED_STRING_API)
362 UINT    _gxe_utility_string_to_alphamap(GX_CONST GX_CHAR *text, GX_CONST GX_FONT *font, GX_PIXELMAP *textmap);
363 #endif
364 UINT    _gxe_utility_string_to_alphamap_ext(GX_CONST GX_STRING *text, GX_CONST GX_FONT *font, GX_PIXELMAP *textmap);
365 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
366 UINT    _gxe_utility_bidi_paragraph_reorder(GX_BIDI_TEXT_INFO *input_info, GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
367 UINT    _gxe_utility_bidi_paragraph_reorder_ext(GX_BIDI_TEXT_INFO *input_info, GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
368 UINT    _gxe_utility_bidi_resolved_text_info_delete(GX_BIDI_RESOLVED_TEXT_INFO **resolved_info_head);
369 #endif
370 #endif
371 
372