From 354445beacb6f69042c4721cae98d24fbb8651d4 Mon Sep 17 00:00:00 2001 From: Bo Chen Date: Mon, 23 Oct 2023 05:31:31 +0000 Subject: [PATCH] Update on 23 Oct 2023. Expand to see details. 8c96f6775 Update release version and date for 6.3.0 minor release. dc8ff31a6 Added partial canvas buffer support for 565rgb color format. 09becae29 Fixed a pattern line draw bug. 8c1e619c2 Remove font page count limitation for standalone binary resource. 34a028615 Drop-list not correctly drawing child widgets. 180ddf8c9 Added VC++ runtime dependency. 57181a765 Fixed GUIX Studio command line to support the opening of a GXP project by specifying the project's pathname. 33c984599 Fixed GUIX Studio test failures. 079b75e09 Improved some error checkings. f166c7633 Improved the performance of the Helium version 24xrgb JPEG decoding. 8ba85ed38 Support standalone binary resource generation and loading. f0b95a87a Re-generate the FreeType library with the Z_PREFIX configuration. ab7e1299a Bump GUIX Studio version to 6.2.1.4. f0a659115 Improved logic to mitigate test failure caused by low-performance test machine. e8100dc1c Fixed crash when delete a color or pixelmap folder with page heap enabled. 9fb6d5d94 Fixed MSRC 81023 bug caused by glyph width casting overflow. ff1ad8aff Fixed potential crash issue with the expand/collapse animation in the accordion menu. 93483ff72 Specify package pipeline triggers to avoid being triggered on everything. 6eea10524 Add pipeline to run codeql. b9c83924e Updated GUIX Studio version and readme for 6.2.1.3 release. b7443814c Enable codeql in onebranch pipeline 5442979ba Bump GUIX Studio version number to 6.2.1.3. --- common/CMakeLists.txt | 4 + common/inc/gx_api.h | 43 +- common/inc/gx_binres_loader.h | 14 +- common/inc/gx_display.h | 18 +- common/inc/gx_image_reader.h | 12 +- common/inc/gx_user_sample.h | 24 +- common/src/gx_accordion_menu_event_process.c | 20 +- common/src/gx_binres_font_load.c | 140 + common/src/gx_binres_pixelmap_load.c | 188 + common/src/gx_binres_theme_load.c | 726 ++- common/src/gx_canvas_block_move.c | 7 +- common/src/gx_canvas_create.c | 16 +- common/src/gx_canvas_drawing_initiate.c | 37 +- common/src/gx_canvas_line_draw.c | 43 +- common/src/gx_canvas_memory_define.c | 25 +- common/src/gx_canvas_mouse_show.c | 13 +- .../gx_display_driver_1555xrgb_jpeg_draw.c | 6 +- .../src/gx_display_driver_16bpp_block_move.c | 13 +- .../src/gx_display_driver_16bpp_canvas_copy.c | 13 +- ...isplay_driver_16bpp_horizontal_line_draw.c | 11 +- ...river_16bpp_horizontal_pattern_line_draw.c | 11 +- .../src/gx_display_driver_16bpp_pixel_write.c | 12 +- .../gx_display_driver_16bpp_pixelmap_draw.c | 59 +- .../gx_display_driver_16bpp_pixelmap_rotate.c | 22 +- ...gx_display_driver_16bpp_simple_line_draw.c | 21 +- ..._display_driver_16bpp_vertical_line_draw.c | 12 +- ..._driver_16bpp_vertical_pattern_line_draw.c | 12 +- .../src/gx_display_driver_24xrgb_jpeg_draw.c | 6 +- ..._display_driver_24xrgb_rotated_jpeg_draw.c | 6 +- .../gx_display_driver_565rgb_canvas_blend.c | 14 +- ...gx_display_driver_565rgb_glyph_1bit_draw.c | 11 +- ...ver_565rgb_horizontal_pixelmap_line_draw.c | 17 +- .../src/gx_display_driver_565rgb_jpeg_draw.c | 6 +- .../gx_display_driver_565rgb_pixel_blend.c | 10 +- ..._display_driver_565rgb_rotated_jpeg_draw.c | 6 +- common/src/gx_display_language_table_set.c | 6 +- common/src/gx_drop_list_draw.c | 201 +- common/src/gx_image_reader_image_decode.c | 6 +- common/src/gx_image_reader_jpeg_decode.c | 154 +- common/src/gx_image_reader_start.c | 6 +- .../src/gx_multi_line_text_button_text_set.c | 35 +- common/src/gx_scrollbar_draw.c | 17 +- common/src/gx_system_canvas_refresh.c | 229 +- common/src/gx_window_root_create.c | 11 +- common/src/gxe_animation_start.c | 9 +- common/src/gxe_binres_font_load.c | 89 + common/src/gxe_binres_pixelmap_load.c | 84 + common/src/gxe_canvas_create.c | 15 +- common/src/gxe_checkbox_pixelmap_set.c | 11 +- common/src/gxe_scrollbar_reset.c | 6 +- common/src/gxe_text_input_cursor_height_set.c | 10 +- ports/arc_em/metaware/inc/gx_port.h | 2 +- ports/arc_hs/metaware/inc/gx_port.h | 2 +- ports/arm9/ac5/inc/gx_port.h | 2 +- ports/arm9/gnu/inc/gx_port.h | 2 +- ports/arm9/iar/inc/gx_port.h | 2 +- ports/c667x/ccs/inc/gx_port.h | 2 +- ports/ccrx/inc/gx_port.h | 2 +- ports/cortex_a15/gnu/inc/gx_port.h | 2 +- ports/cortex_a5/ac5/inc/gx_port.h | 2 +- ports/cortex_a5/gnu/inc/gx_port.h | 2 +- ports/cortex_a5/iar/inc/gx_port.h | 2 +- ports/cortex_a5x/ac6/inc/gx_port.h | 2 +- ports/cortex_a7/ac5/inc/gx_port.h | 2 +- ports/cortex_a7/gnu/inc/gx_port.h | 2 +- ports/cortex_a7/iar/inc/gx_port.h | 2 +- ports/cortex_a8/ac5/inc/gx_port.h | 2 +- ports/cortex_a8/gnu/inc/gx_port.h | 2 +- ports/cortex_a8/iar/inc/gx_port.h | 2 +- ports/cortex_a9/ac5/inc/gx_port.h | 2 +- ports/cortex_a9/gnu/inc/gx_port.h | 2 +- ports/cortex_a9/iar/inc/gx_port.h | 2 +- ports/cortex_m0/ac5/inc/gx_port.h | 2 +- ports/cortex_m0/gnu/inc/gx_port.h | 2 +- ports/cortex_m0/iar/inc/gx_port.h | 2 +- ports/cortex_m3/ac5/inc/gx_port.h | 2 +- ports/cortex_m3/gnu/inc/gx_port.h | 2 +- ports/cortex_m3/iar/inc/gx_port.h | 2 +- ports/cortex_m3/keil/inc/gx_port.h | 2 +- ports/cortex_m4/ac5/inc/gx_port.h | 2 +- ports/cortex_m4/gnu/inc/gx_port.h | 2 +- ports/cortex_m4/iar/inc/gx_port.h | 2 +- ports/cortex_m4/keil/inc/gx_port.h | 2 +- ports/cortex_m7/ac5/inc/gx_port.h | 2 +- ports/cortex_m7/gnu/inc/gx_port.h | 2 +- ports/cortex_m7/iar/inc/gx_port.h | 2 +- ports/cortex_r4/ac5/inc/gx_port.h | 2 +- ports/cortex_r4/ac6/inc/gx_port.h | 2 +- ports/cortex_r4/gnu/inc/gx_port.h | 2 +- ports/cortex_r4/iar/inc/gx_port.h | 2 +- ports/cortex_r5/ac5/inc/gx_port.h | 2 +- ports/cortex_r5/gnu/inc/gx_port.h | 2 +- ports/cortex_r5/iar/inc/gx_port.h | 2 +- ports/generic/inc/gx_port.h | 2 +- ports/linux/gnu/inc/gx_port.h | 2 +- ports/win32/build/vs_2019/guix.vcxproj | 83 + ports/win32/inc/gx_port.h | 2 +- ports/win32/lib/vs_2019/tx_port.h | 2 +- ports/win32/src/gx_win32_display_driver.c | 36 +- ports/win32/vs_2019_standalone/inc/gx_port.h | 2 +- .../vs_2019/demo_guix_binres_standalone.sln | 31 + .../demo_guix_binres_standalone.vcxproj | 103 + .../demo_guix_binres_standalone.c | 231 + .../demo_guix_binres_standalone.gxp | 5260 +++++++++++++++++ .../demo_guix_binres_standalone_resources.c | 765 +++ .../demo_guix_binres_standalone_resources.h | 51 + ...mo_guix_binres_standalone_specifications.c | 425 ++ ...mo_guix_binres_standalone_specifications.h | 150 + .../demo_guix_binres_standalone/font_vera.bin | Bin 0 -> 15433 bytes .../demo_guix_binres_standalone/font_vera.xml | 34 + .../graphics/MS-Azure_logo.png | Bin 0 -> 3189 bytes .../graphics/red_apple.png | Bin 0 -> 63716 bytes .../pixelmap_red_apple.bin | Bin 0 -> 125848 bytes 113 files changed, 9136 insertions(+), 614 deletions(-) create mode 100644 common/src/gx_binres_font_load.c create mode 100644 common/src/gx_binres_pixelmap_load.c create mode 100644 common/src/gxe_binres_font_load.c create mode 100644 common/src/gxe_binres_pixelmap_load.c create mode 100644 tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.sln create mode 100644 tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.vcxproj create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.c create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.gxp create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.c create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.h create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.c create mode 100644 tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.h create mode 100644 tutorials/demo_guix_binres_standalone/font_vera.bin create mode 100644 tutorials/demo_guix_binres_standalone/font_vera.xml create mode 100644 tutorials/demo_guix_binres_standalone/graphics/MS-Azure_logo.png create mode 100644 tutorials/demo_guix_binres_standalone/graphics/red_apple.png create mode 100644 tutorials/demo_guix_binres_standalone/pixelmap_red_apple.bin diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index ba96e2ac..e64bd5b2 100755 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -24,6 +24,8 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/gx_binres_language_info_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gx_binres_language_table_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gx_binres_theme_load.c + ${CMAKE_CURRENT_LIST_DIR}/src/gx_binres_pixelmap_load.c + ${CMAKE_CURRENT_LIST_DIR}/src/gx_binres_font_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gx_brush_default.c ${CMAKE_CURRENT_LIST_DIR}/src/gx_brush_define.c ${CMAKE_CURRENT_LIST_DIR}/src/gx_button_background_draw.c @@ -913,6 +915,8 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/gxe_binres_language_info_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gxe_binres_language_table_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gxe_binres_theme_load.c + ${CMAKE_CURRENT_LIST_DIR}/src/gxe_binres_pixelmap_load.c + ${CMAKE_CURRENT_LIST_DIR}/src/gxe_binres_font_load.c ${CMAKE_CURRENT_LIST_DIR}/src/gxe_brush_default.c ${CMAKE_CURRENT_LIST_DIR}/src/gxe_brush_define.c ${CMAKE_CURRENT_LIST_DIR}/src/gxe_button_create.c diff --git a/common/inc/gx_api.h b/common/inc/gx_api.h index 46c0d38c..34ee9e81 100644 --- a/common/inc/gx_api.h +++ b/common/inc/gx_api.h @@ -24,7 +24,7 @@ /* APPLICATION INTERFACE DEFINITION RELEASE */ /* */ /* gx_api.h PORTABLE C */ -/* 6.2.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -68,7 +68,7 @@ /* added new widget type */ /* GX_GENERIC_SCROLL_WHEEL, */ /* added animation delete API, */ -/* added generic Dave2D */ +/* added generic Dave2D */ /* graphics accelerator */ /* support, */ /* resulting in version 6.1.7 */ @@ -104,6 +104,14 @@ /* 03-08-2023 Ting Zhu Modified comment(s), */ /* updated patch version, */ /* resulting in version 6.2.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added new APIs for loading */ +/* pixelmap and font from */ +/* standalone binary, */ +/* removed unused defines, */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ @@ -126,8 +134,8 @@ extern "C" { #define AZURE_RTOS_GUIX #define GUIX_MAJOR_VERSION 6 -#define GUIX_MINOR_VERSION 2 -#define GUIX_PATCH_VERSION 1 +#define GUIX_MINOR_VERSION 3 +#define GUIX_PATCH_VERSION 0 /* The following symbols are defined for backward compatibility reasons.*/ #define __PRODUCT_GUIX__ @@ -363,7 +371,9 @@ typedef struct GX_STRING_STRUCT #define GX_FALSE 0 #define GX_NULL 0 #define GX_ID_NONE 0 -#define GX_MAGIC_NUMBER 0x4758U +#define GX_MAGIC_NUMBER 0x4758U /* GX */ +#define GX_RESOURCE_TYPE_BINRES_NORMAL 0x4758U /* GX */ +#define GX_RESOURCE_TYPE_BINRES_STANDALONE 0x4753U /* GS */ /* API return values. */ @@ -970,6 +980,7 @@ typedef struct GX_STRING_STRUCT #define GX_CANVAS_VISIBLE 0x04 /* Canvas is visible */ #define GX_CANVAS_MODIFIED 0x08 #define GX_CANVAS_COMPOSITE 0x20 /* Canvas is a buffer for creating composite*/ +#define GX_CANVAS_PARTIAL_FRAME_BUFFER 0x40 /* Define common combinations. */ @@ -1519,6 +1530,10 @@ typedef struct GX_DRAW_CONTEXT_STRUCT GX_RECTANGLE gx_draw_context_dirty; GX_RECTANGLE *gx_draw_context_clip; GX_VALUE gx_draw_context_pitch; +#if defined GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + GX_VALUE gx_draw_context_offset_x; + GX_VALUE gx_draw_context_offset_y; +#endif } GX_DRAW_CONTEXT; /* Define fill map info type. */ @@ -1808,6 +1823,12 @@ typedef struct GX_CANVAS_STRUCT /* Define the canvas memory pointer. */ GX_COLOR *gx_canvas_memory; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + GX_VALUE gx_canvas_memory_width; + GX_VALUE gx_canvas_memory_height; + GX_VALUE gx_canvas_memory_offset_x; + GX_VALUE gx_canvas_memory_offset_y; +#endif /* padded canvas memory buffer, only needed for Win32 */ #ifdef GX_TARGET_WIN32 @@ -1835,7 +1856,6 @@ typedef struct GX_CANVAS_STRUCT GX_UBYTE gx_canvas_alpha; GX_UBYTE gx_canvas_draw_nesting; GX_BYTE gx_canvas_hardware_layer; - } GX_CANVAS; /* Define Theme type */ @@ -1877,7 +1897,6 @@ typedef struct GX_PEN_CONFIGURATION_STRUCT UINT gx_pen_configuration_max_pen_speed_ticks; } GX_PEN_CONFIGURATION; - #define GX_RESOURCE_HEADER_SIZE 20 #define GX_THEME_HEADER_SIZE 114 #define GX_COLOR_HEADER_SIZE 8 @@ -3002,6 +3021,8 @@ typedef struct GX_FIXED_POINT_STRUCT #endif #define gx_binres_language_table_load_ext _gx_binres_language_table_load_ext #define gx_binres_theme_load _gx_binres_theme_load +#define gx_binres_pixelmap_load _gx_binres_pixelmap_load +#define gx_binres_font_load _gx_binres_font_load #define gx_brush_default _gx_brush_default #define gx_brush_define _gx_brush_define @@ -3488,8 +3509,6 @@ typedef struct GX_FIXED_POINT_STRUCT #define gx_text_scroll_wheel_draw _gx_text_scroll_wheel_draw #define gx_text_scroll_wheel_event_process _gx_text_scroll_wheel_event_process -#define gx_transition_window_create(a, b, c, d, e, f) _gx_transition_window_create(a, b, (GX_WIDGET *)c, d, e, f) - #define gx_tree_view_create(a, b, c, d, e, f) _gx_tree_view_create((GX_TREE_VIEW *)a, b, (GX_WIDGET *)c, d, e, f) #define gx_tree_view_draw _gx_tree_view_draw #define gx_tree_view_event_process _gx_tree_view_event_process @@ -3662,6 +3681,8 @@ UINT _gx_binres_language_table_load(GX_UBYTE *root_address, GX_UBYTE ****returne #endif UINT _gx_binres_language_table_load_ext(GX_UBYTE *root_address, GX_STRING ***returned_language_table); UINT _gx_binres_theme_load(GX_UBYTE *root_address, INT theme_id, GX_THEME **returned_theme); +UINT _gx_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap); +UINT _gx_binres_font_load(GX_UBYTE *root_address, UINT font_index, GX_UBYTE *buffer, ULONG *buffer_size); UINT _gx_brush_default(GX_BRUSH *brush); UINT _gx_brush_define(GX_BRUSH *brush, GX_COLOR line_color, GX_COLOR fill_color, UINT style); @@ -4484,6 +4505,8 @@ UINT _gx_window_wallpaper_set(GX_WINDOW *window, GX_RESOURCE_ID wallpaper_id, GX #endif #define gx_binres_language_table_load_ext _gxe_binres_language_table_load_ext #define gx_binres_theme_load _gxe_binres_theme_load +#define gx_binres_pixelmap_load _gxe_binres_pixelmap_load +#define gx_binres_font_load _gxe_binres_font_load #define gx_brush_default _gxe_brush_default #define gx_brush_define _gxe_brush_define @@ -5139,6 +5162,8 @@ UINT _gxe_binres_language_table_load(GX_UBYTE *root_address, GX_UBYTE ****return #endif UINT _gxe_binres_language_table_load_ext(GX_UBYTE *root_address, GX_STRING ***returned_language_table); UINT _gxe_binres_theme_load(GX_UBYTE *root_address, INT theme_id, GX_THEME **returned_theme); +UINT _gxe_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap); +UINT _gxe_binres_font_load(GX_UBYTE *root_address, UINT font_index, GX_UBYTE *buffer, ULONG *buffer_size); UINT _gxe_brush_default(GX_BRUSH *brush); UINT _gxe_brush_define(GX_BRUSH *brush, GX_COLOR line_color, GX_COLOR fill_color, UINT style); diff --git a/common/inc/gx_binres_loader.h b/common/inc/gx_binres_loader.h index b69fb5f1..ef26fafa 100644 --- a/common/inc/gx_binres_loader.h +++ b/common/inc/gx_binres_loader.h @@ -26,7 +26,7 @@ /* COMPONENT DEFINITION RELEASE */ /* */ /* gx_binres_loader.h PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -46,6 +46,9 @@ /* defined macros to read */ /* integer value, */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* declared new prototypes, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ @@ -84,6 +87,13 @@ UINT _gx_binres_resource_header_load(GX_BINRES_DATA_INFO *info, GX_RESOURCE_HEAD UINT _gx_binres_string_header_load(GX_BINRES_DATA_INFO *info, GX_STRING_HEADER *header); UINT _gx_binres_language_header_load(GX_BINRES_DATA_INFO *info, GX_LANGUAGE_HEADER *header); +UINT _gx_binres_one_pixelmap_load(GX_BINRES_DATA_INFO *info, GX_PIXELMAP **returned_pixelmap, USHORT *map_id); +UINT _gx_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap); +UINT _gx_binres_font_buffer_size_get(GX_BINRES_DATA_INFO *info, UINT *buffer_size, GX_BOOL reset_read_offset); +UINT _gx_binres_one_font_load(GX_BINRES_DATA_INFO *info, GX_FONT **return_font); +UINT _gx_binres_font_header_load(GX_BINRES_DATA_INFO *info, GX_FONT_HEADER *header); +UINT _gx_binres_font_load(GX_UBYTE *root_address, UINT font_index, GX_UBYTE *buffer, ULONG *buffer_size); +UINT _gx_binres_standalone_resource_seek(GX_BINRES_DATA_INFO *info, UINT res_index); /* Define error checking shells for API services. These are only referenced by the application. */ @@ -95,6 +105,8 @@ UINT _gxe_binres_language_table_load(GX_UBYTE *root_address, GX_UBYTE ****return #endif UINT _gxe_binres_language_table_load_ext(GX_UBYTE *root_address, GX_STRING ***returned_language_table); UINT _gxe_binres_theme_load(GX_UBYTE *root_address, INT theme_id, GX_THEME **returned_theme); +UINT _gxe_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap); +UINT _gxe_binres_font_load(GX_UBYTE *root_address, UINT res_index, GX_UBYTE *buffer, ULONG *buffer_size); #endif diff --git a/common/inc/gx_display.h b/common/inc/gx_display.h index d47105e3..a31ea4a6 100644 --- a/common/inc/gx_display.h +++ b/common/inc/gx_display.h @@ -26,7 +26,7 @@ /* COMPONENT DEFINITION RELEASE */ /* */ /* gx_display.h PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -60,9 +60,11 @@ /* added language direction */ /* table set declarations, */ /* resulting in version 6.1.10 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed unused prototypes, */ -/* resulting in version 6.x */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ @@ -542,3 +544,13 @@ VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty); } #endif +#if defined GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER +#define GX_CALCULATE_PUTROW(putrow, xpos, ypos, context)\ + putrow += (ypos - context->gx_draw_context_offset_y) * context->gx_draw_context_pitch;\ + putrow += (xpos - context->gx_draw_context_offset_x) +#else +#define GX_CALCULATE_PUTROW(putrow, xpos, ypos, context)\ + putrow += ypos * context->gx_draw_context_pitch;\ + putrow += xpos +#endif + diff --git a/common/inc/gx_image_reader.h b/common/inc/gx_image_reader.h index 5f366763..1c7669cc 100644 --- a/common/inc/gx_image_reader.h +++ b/common/inc/gx_image_reader.h @@ -26,7 +26,7 @@ /* COMPONENT DEFINITION RELEASE */ /* */ /* gx_image_reader.h PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -52,9 +52,11 @@ /* added definitions for fixed */ /* size table dimensions, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), added */ +/* 10-31-2023 Ting Zhu Modified comment(s), added */ /* support for ARM Helium, */ -/* resulting in version 6.x */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) @@ -133,6 +135,10 @@ typedef struct GX_JPEG_INFO_STRUCT VOID (*gx_jpeg_pixel_write)(struct GX_JPEG_INFO_STRUCT *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue); #endif GX_UBYTE *gx_jpeg_output_buffer; +#if defined(GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER) + GX_VALUE gx_jpeg_output_buffer_offset_x; + GX_VALUE gx_jpeg_output_buffer_offset_y; +#endif USHORT gx_jpeg_output_width; USHORT gx_jpeg_output_height; INT gx_jpeg_output_stride; diff --git a/common/inc/gx_user_sample.h b/common/inc/gx_user_sample.h index 77ed1c6c..f8253d91 100644 --- a/common/inc/gx_user_sample.h +++ b/common/inc/gx_user_sample.h @@ -24,7 +24,7 @@ /* APPLICATION INTERFACE DEFINITION RELEASE */ /* */ /* gx_user.h PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -45,10 +45,11 @@ /* 01-31-2022 Kenneth Maxwell Modified comment(s), */ /* fixed typo, */ /* resulting in version 6.1.10 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ -/* added GX_ENABLE_ARM_HELIUM */ -/* definition, */ -/* resulting in version 6.x */ +/* 10-31-2023 Ting Zhu Modified comment(s), added */ +/* GX_ENABLE_ARM_HELIUM and */ +/* partial canvas frame buffer */ +/* support configurations, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ @@ -76,5 +77,18 @@ /* This can be defined to enable the use of ARM Helium intrinsics for JPEG decoding. */ /* #define GX_ENABLE_ARM_HELIUM */ + +/* This can be defined to enable the partial canvas frame buffer feature. */ +/* #define GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER */ + +/* The two following definitions can be used to specify the canvas refresh directions for the partial canvas frame buffer feature. + By default, the canvas refreshes its dirty areas one by one. + If the application requires refreshing the canvas in a specific direction to mitigate tearing effects, one of the following two definitions can be used. + In this scenario, the total dirty area that covers all the dirty areas is calculated, and then the canvas is refreshed in the direction + defined by one of the following two definitions. */ + +/* #define GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL */ +/* #define GX_CANVAS_REFRESH_DIRECTION_VERTICAL */ + #endif diff --git a/common/src/gx_accordion_menu_event_process.c b/common/src/gx_accordion_menu_event_process.c index 5a1a6060..8545ecd1 100644 --- a/common/src/gx_accordion_menu_event_process.c +++ b/common/src/gx_accordion_menu_event_process.c @@ -238,7 +238,7 @@ GX_WIDGET *child; /* FUNCTION RELEASE */ /* */ /* _gx_accordion_menu_close_animation_update PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -276,6 +276,9 @@ GX_WIDGET *child; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added NULL pointer check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_accordion_menu_close_animation_update(GX_ACCORDION_MENU *accordion) @@ -287,6 +290,11 @@ GX_VALUE shift; GX_RECTANGLE size; GX_WIDGET *child; + if (!deselected) + { + return GX_SUCCESS; + } + child = deselected -> gx_menu_list.gx_widget_first_child; /* Calcualte total height of list children. */ @@ -334,7 +342,7 @@ GX_WIDGET *child; /* FUNCTION RELEASE */ /* */ /* _gx_accordion_menu_open_animation_update PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -370,6 +378,9 @@ GX_WIDGET *child; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added NULL pointer check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_accordion_menu_open_animation_update(GX_ACCORDION_MENU *accordion) @@ -381,6 +392,11 @@ GX_VALUE list_children_height = 0; GX_VALUE height = 0; GX_WIDGET *child; + if (!selected) + { + return GX_SUCCESS; + } + child = selected -> gx_menu_list.gx_widget_first_child; /* Calcualte total height of list children. */ diff --git a/common/src/gx_binres_font_load.c b/common/src/gx_binres_font_load.c new file mode 100644 index 00000000..01ad72c4 --- /dev/null +++ b/common/src/gx_binres_font_load.c @@ -0,0 +1,140 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** GUIX Component */ +/** */ +/** Binres Loader Management (Binres Loader) */ +/** */ +/**************************************************************************/ + +#define GX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "gx_api.h" +#include "gx_binres_loader.h" +#include "gx_utility.h" + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_binres_font_load PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This service loads a font from a resource data memory. */ +/* */ +/* INPUT */ +/* */ +/* root_address Pointer to the binary data */ +/* memory */ +/* font_index Resource index of the font */ +/* to be loaded */ +/* buffer Pointer to the buffer to */ +/* store the loaded font */ +/* buffer_size Size of the buffer. It will */ +/* be overwritten with the */ +/* required buffer size if the */ +/* input buffer size is */ +/* insufficient */ +/* */ +/* OUTPUT */ +/* */ +/* Status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_standalone_resource_seek Locate the resource data */ +/* _gx_binres_font_buffer_size_get Get the required font buffer */ +/* size */ +/* _gx_binres_one_font_load Load one font */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +UINT _gx_binres_font_load(GX_UBYTE *root_address, UINT font_index, GX_UBYTE *buffer, ULONG *buffer_size) +{ +UINT status = GX_SUCCESS; +GX_BINRES_DATA_INFO info; +UINT required_size; + + /* file format + +--------+ + | | <-- represents one bytes + +--------+ + + |+========+ + | | <-- represents a variable number of bytes + |+========+ + + |+--------+--------+--------+--------+ + | magic number | resource count | + |+--------+--------+--------+--------+ + |+--------+--------+--------+--------+ + | resource offset | + |+--------+--------+--------+--------+ + |+--------+--------+--------+--------+ + | ... | + |+--------+--------+--------+--------+ + |+===================================+ + | resource data | + |+===================================+ + */ + + memset(&info, 0, sizeof(GX_BINRES_DATA_INFO)); + + info.gx_binres_root_address = (GX_UBYTE *)root_address; + info.gx_binres_buffer = (GX_UBYTE *)buffer; + info.gx_binres_buffer_size = *buffer_size; + + status = _gx_binres_standalone_resource_seek(&info, font_index); + + if (status != GX_SUCCESS) + { + return status; + } + + status = _gx_binres_font_buffer_size_get(&info, &required_size, GX_TRUE); + + if (status != GX_SUCCESS) + { + return status; + } + + if (required_size > *buffer_size) + { + *buffer_size = required_size; + return GX_INVALID_MEMORY_SIZE; + } + + status = _gx_binres_one_font_load(&info, GX_NULL); + + return status; +} + diff --git a/common/src/gx_binres_pixelmap_load.c b/common/src/gx_binres_pixelmap_load.c new file mode 100644 index 00000000..fab2e968 --- /dev/null +++ b/common/src/gx_binres_pixelmap_load.c @@ -0,0 +1,188 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** GUIX Component */ +/** */ +/** Binres Loader Management (Binres Loader) */ +/** */ +/**************************************************************************/ + +#define GX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "gx_api.h" +#include "gx_binres_loader.h" +#include "gx_utility.h" + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_binres_standalone_resource_seek PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function locates the resource data in the binary data memory. */ +/* */ +/* INPUT */ +/* */ +/* info Binary resource control block */ +/* res_index The index of the resource to */ +/* be located */ +/* */ +/* OUTPUT */ +/* */ +/* Status Completion status */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* GUIX Internal Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +UINT _gx_binres_standalone_resource_seek(GX_BINRES_DATA_INFO *info, UINT res_index) +{ +USHORT type; +ULONG count; + + GX_BINRES_READ_USHORT(type, info -> gx_binres_root_address + info -> gx_binres_read_offset); + info -> gx_binres_read_offset += sizeof(USHORT); + + if (type != GX_RESOURCE_TYPE_BINRES_STANDALONE) + { + return GX_INVALID_FORMAT; + } + + /* Skip 2 bytes version. */ + info -> gx_binres_read_offset += sizeof(USHORT); + + GX_BINRES_READ_ULONG(count, info -> gx_binres_root_address + info -> gx_binres_read_offset); + info -> gx_binres_read_offset += sizeof(ULONG); + + if ((USHORT)res_index >= count) + { + return GX_NOT_FOUND; + } + + if (count > 1) + { + GX_BINRES_READ_ULONG(info -> gx_binres_read_offset, info -> gx_binres_root_address + info -> gx_binres_read_offset + sizeof(ULONG) * res_index); + } + + return GX_SUCCESS; +} + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_binres_pixelmap_load PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This service loads a pixelmap from a resource data memory. */ +/* */ +/* INPUT */ +/* */ +/* root_address Pointer to the binary data */ +/* memory */ +/* map_index Resource index of the pixelmap*/ +/* to be loaded */ +/* pixelmap Pointer to the returned */ +/* pixelmap */ +/* */ +/* OUTPUT */ +/* */ +/* Status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_standalone_resource_seek Locate the resource data */ +/* _gx_binres_one_pixelmap_load Load one pixelmap */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +UINT _gx_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap) +{ +UINT status = GX_SUCCESS; +GX_BINRES_DATA_INFO info; + + /* file format + +--------+ + | | <-- represents one bytes + +--------+ + + |+========+ + | | <-- represents a variable number of bytes + |+========+ + + |+--------+--------+--------+--------+ + | magic number | resource count | + |+--------+--------+--------+--------+ + |+--------+--------+--------+--------+ + | resource offset | + |+--------+--------+--------+--------+ + |+--------+--------+--------+--------+ + | ... | + |+--------+--------+--------+--------+ + |+===================================+ + | resource data | + |+===================================+ + */ + + memset(&info, 0, sizeof(GX_BINRES_DATA_INFO)); + + info.gx_binres_root_address = (GX_UBYTE *)root_address; + info.gx_binres_buffer = (GX_UBYTE *)pixelmap; + info.gx_binres_buffer_size = sizeof(GX_PIXELMAP); + + status = _gx_binres_standalone_resource_seek(&info, map_index); + + if (status == GX_SUCCESS) + { + status = _gx_binres_one_pixelmap_load(&info, GX_NULL, GX_NULL); + } + + return status; +} + diff --git a/common/src/gx_binres_theme_load.c b/common/src/gx_binres_theme_load.c index ecd49e00..6e5bbe20 100644 --- a/common/src/gx_binres_theme_load.c +++ b/common/src/gx_binres_theme_load.c @@ -312,7 +312,7 @@ static UINT _gx_binres_palette_header_load(GX_BINRES_DATA_INFO *info, GX_PALETTE /* FUNCTION RELEASE */ /* */ /* _gx_binres_font_header_load PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -346,14 +346,22 @@ static UINT _gx_binres_palette_header_load(GX_BINRES_DATA_INFO *info, GX_PALETTE /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* removed use of memcpy, */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* made the function public, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT -static UINT _gx_binres_font_header_load(GX_BINRES_DATA_INFO *info, GX_FONT_HEADER *header) +UINT _gx_binres_font_header_load(GX_BINRES_DATA_INFO *info, GX_FONT_HEADER *header) { GX_BINRES_READ_USHORT(header -> gx_font_header_magic_number, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); + if(header -> gx_font_header_magic_number != GX_MAGIC_NUMBER) + { + return GX_INVALID_FORMAT; + } + GX_BINRES_READ_USHORT(header -> gx_font_header_index, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); @@ -425,6 +433,11 @@ ULONG read_data = 0; GX_BINRES_READ_USHORT(header -> gx_page_header_magic_number, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); + if(header -> gx_page_header_magic_number != GX_MAGIC_NUMBER) + { + return GX_INVALID_FORMAT; + } + GX_BINRES_READ_USHORT(header -> gx_page_header_index, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); @@ -515,7 +528,7 @@ static UINT _gx_binres_glyph_header_load(GX_BINRES_DATA_INFO *info, GX_GLYPH_HEA GX_BINRES_READ_ULONG(header -> gx_glyph_header_map_offset, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(ULONG); - GX_BINRES_READ_USHORT(header -> gx_glyph_header_index, info -> gx_binres_root_address + info -> gx_binres_read_offset); + GX_BINRES_READ_USHORT(header -> gx_glyph_header_index, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); GX_BINRES_READ_SHORT(header -> gx_glyph_header_ascent, info -> gx_binres_root_address + info -> gx_binres_read_offset); @@ -604,7 +617,7 @@ static UINT _gx_binres_kerning_glyph_header_load(GX_BINRES_DATA_INFO *info, GX_K /* FUNCTION RELEASE */ /* */ /* _gx_binres_pixelmap_header_load PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -638,6 +651,9 @@ static UINT _gx_binres_kerning_glyph_header_load(GX_BINRES_DATA_INFO *info, GX_K /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* removed use of memcpy, */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added magic number check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT @@ -646,6 +662,11 @@ static UINT _gx_binres_pixelmap_header_load(GX_BINRES_DATA_INFO *info, GX_PIXELM GX_BINRES_READ_USHORT(header -> gx_pixelmap_header_magic_number, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); + if (header -> gx_pixelmap_header_magic_number != GX_MAGIC_NUMBER) + { + return GX_INVALID_FORMAT; + } + GX_BINRES_READ_USHORT(header -> gx_pixelmap_header_index, info -> gx_binres_root_address + info -> gx_binres_read_offset); info -> gx_binres_read_offset += sizeof(USHORT); @@ -686,12 +707,156 @@ static UINT _gx_binres_pixelmap_header_load(GX_BINRES_DATA_INFO *info, GX_PIXELM } #endif +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_binres_font_buffer_size_get PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function calculates the required buffer size needed for */ +/* loading the font from the current position. */ +/* */ +/* INPUT */ +/* */ +/* info Binary resource control block */ +/* buffer_size The required buffer size */ +/* */ +/* OUTPUT */ +/* */ +/* Status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_font_header_load Read font header */ +/* _gx_binres_page_header_load Read font page header */ +/* */ +/* CALLED BY */ +/* */ +/* GUIX Internal Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +#ifdef GX_BINARY_RESOURCE_SUPPORT +UINT _gx_binres_font_buffer_size_get(GX_BINRES_DATA_INFO *info, UINT *buffer_size, GX_BOOL reset_read_offset) +{ +UINT status; +GX_FONT_HEADER font_header; +GX_PAGE_HEADER page_header; +USHORT page_index; +UINT glyph_count; +UINT read_offset = 0; +UINT temp; +UINT size = 0; +UINT old_offset; + + if(reset_read_offset) + { + old_offset = info -> gx_binres_read_offset; + } + + status = _gx_binres_font_header_load(info, &font_header); + + if (status != GX_SUCCESS) + { + return status; + } + + if (font_header.gx_font_header_data_offset) + { + /* The font data is not follow the header directly, + the data offset gives the position where the font + data located. */ + + /* Record current data offset. */ + read_offset = info -> gx_binres_read_offset; + + /* Temporarily reset data offset of access font data. */ + info -> gx_binres_read_offset = font_header.gx_font_header_data_offset; + + /* Load font header. */ + _gx_binres_font_header_load(info, &font_header); + } + + for (page_index = 0; page_index < font_header.gx_font_header_page_count; page_index++) + { + /* Load page header. */ + status = _gx_binres_page_header_load(info, &page_header); + + if(status != GX_SUCCESS) + { + return status; + } + + info -> gx_binres_read_offset += page_header.gx_page_header_data_size; + +#if defined(GX_EXTENDED_UNICODE_SUPPORT) + if (page_header.gx_page_header_last_glyph > GX_MAX_GLYPH_CODE) + { + return GX_INVALID_FONT; + } +#endif + + /* Max glyph code is 0x10f000, overflow cannot occur. */ + glyph_count = (UINT)(page_header.gx_page_header_last_glyph - page_header.gx_page_header_first_glyph + 1); + + /* Calculate size for loading font page. */ + temp = sizeof(GX_FONT); + + /* Calculate size for loading glyphs. */ + if (page_header.gx_page_header_format & GX_FONT_FORMAT_COMPRESSED) + { + temp += sizeof(GX_COMPRESSED_GLYPH) * glyph_count; + } +#if defined(GX_FONT_KERNING_SUPPORT) + else if (page_header.gx_page_header_format & GX_FONT_FORMAT_KERNING) + { + temp += sizeof(GX_KERNING_GLYPH) * glyph_count; + } +#endif + else + { + temp += sizeof(GX_GLYPH) * glyph_count; + } + + GX_UTILITY_MATH_UINT_ADD(size, temp, size); + } + + if (read_offset) + { + /* Restore data offset. */ + info -> gx_binres_read_offset = read_offset; + read_offset = 0; + } + + *buffer_size = size; + + if (reset_read_offset) + { + /* Reset offset. */ + info -> gx_binres_read_offset = old_offset; + } + + return GX_SUCCESS; +} +#endif + /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _gx_binres_theme_table_buffer_allocate PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -715,8 +880,7 @@ static UINT _gx_binres_pixelmap_header_load(GX_BINRES_DATA_INFO *info, GX_PIXELM /* allocation function */ /* _gx_binres_resource_header_load Read resource header */ /* _gx_binres_theme_header_load Read theme header */ -/* _gx_binres_font_header_load Read font header */ -/* _gx_binres_page_header_load Read font page header */ +/* _gx_binres_font_buffer_size_get Get required font buffer size */ /* */ /* CALLED BY */ /* */ @@ -729,20 +893,19 @@ static UINT _gx_binres_pixelmap_header_load(GX_BINRES_DATA_INFO *info, GX_PIXELM /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* improved logic, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT static UINT _gx_binres_theme_buffer_allocate(GX_BINRES_DATA_INFO *info, INT theme_id) { +UINT status = GX_SUCCESS; GX_RESOURCE_HEADER res_header; GX_THEME_HEADER theme_header; -GX_FONT_HEADER font_header; -GX_PAGE_HEADER page_header; USHORT theme_index; USHORT font_index; -USHORT page_index; -UINT glyph_count; -UINT read_offset = 0; UINT temp; /* Read resource header. */ @@ -790,77 +953,14 @@ UINT temp; for (font_index = 0; font_index < theme_header.gx_theme_header_font_count; font_index++) { - _gx_binres_font_header_load(info, &font_header); - - if (font_header.gx_font_header_magic_number != GX_MAGIC_NUMBER) - { - return GX_INVALID_FORMAT; - } - - if (font_header.gx_font_header_data_offset) - { - /* The font data is not follow the header directly, - the data offset gives the position where the font - data located. */ - - /* Record current data offset. */ - read_offset = info -> gx_binres_read_offset; + status = _gx_binres_font_buffer_size_get(info, &temp, GX_FALSE); - /* Temporarily reset data offset of access font data. */ - info -> gx_binres_read_offset = font_header.gx_font_header_data_offset; - - /* Load font header. */ - _gx_binres_font_header_load(info, &font_header); - } - - for (page_index = 0; page_index < font_header.gx_font_header_page_count; page_index++) + if (status != GX_SUCCESS) { - /* Load page header. */ - _gx_binres_page_header_load(info, &page_header); - info -> gx_binres_read_offset += page_header.gx_page_header_data_size; - - if (page_header.gx_page_header_magic_number != GX_MAGIC_NUMBER) - { - return GX_INVALID_FORMAT; - } -#if defined(GX_EXTENDED_UNICODE_SUPPORT) - if (page_header.gx_page_header_last_glyph > GX_MAX_GLYPH_CODE) - { - return GX_INVALID_FONT; - } -#endif - - /* Max glyph code is 0x10f000, overflow cannot occur. */ - glyph_count = (UINT)(page_header.gx_page_header_last_glyph - page_header.gx_page_header_first_glyph + 1); - - /* Calculate size for loading font page. */ - temp = sizeof(GX_FONT); - - /* Calculate size for loading glyphs. */ - if (page_header.gx_page_header_format & GX_FONT_FORMAT_COMPRESSED) - { - temp += sizeof(GX_COMPRESSED_GLYPH) * glyph_count; - } -#if defined(GX_FONT_KERNING_SUPPORT) - else if (page_header.gx_page_header_format & GX_FONT_FORMAT_KERNING) - { - temp += sizeof(GX_KERNING_GLYPH) * glyph_count; - } -#endif - else - { - temp += sizeof(GX_GLYPH) * glyph_count; - } - - GX_UTILITY_MATH_UINT_ADD(info -> gx_binres_buffer_size, temp, info -> gx_binres_buffer_size); + return status; } - if (read_offset) - { - /* Restore data offset. */ - info -> gx_binres_read_offset = read_offset; - read_offset = 0; - } + GX_UTILITY_MATH_UINT_ADD(info -> gx_binres_buffer_size, temp, info -> gx_binres_buffer_size); } } @@ -894,7 +994,10 @@ UINT temp; memset(info -> gx_binres_buffer, 0, info -> gx_binres_buffer_size); info -> gx_binres_buffer_index = 0; - return GX_SUCCESS; + /* Reset read offset. */ + info -> gx_binres_read_offset = 0; + + return status; } #endif @@ -1182,21 +1285,19 @@ USHORT index = 0; /* */ /* FUNCTION RELEASE */ /* */ -/* _gx_binres_font_load PORTABLE C */ -/* 6.1 */ +/* _gx_binres_one_font_load PORTABLE C */ +/* 6.3.0 */ /* AUTHOR */ /* */ -/* Kenneth Maxwell, Microsoft Corporation */ +/* Ting Zhu, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ -/* This service loads a font table from a binary data buffer. */ +/* This service loads a font from a binary data buffer. */ /* */ /* INPUT */ /* */ /* info Binary resource control block */ -/* page_count The number of pages that a */ -/* font contains. */ /* return_font Returned font */ /* */ /* OUTPUT */ @@ -1205,6 +1306,7 @@ USHORT index = 0; /* */ /* CALLS */ /* */ +/* _gx_binres_font_header_load Read font header */ /* _gx_binres_page_header_load Read font page header */ /* _gx_binres_compressed_glyphs_read Read compressed glyph data */ /* _gx_binres_glyphs_read Read glyph data */ @@ -1217,77 +1319,136 @@ USHORT index = 0; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ -/* 09-30-2020 Kenneth Maxwell Modified comment(s), */ -/* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT -static UINT _gx_binres_font_load(GX_BINRES_DATA_INFO *info, USHORT page_count, GX_FONT **return_font) +UINT _gx_binres_one_font_load(GX_BINRES_DATA_INFO *info, GX_FONT **return_font) { UINT status = GX_SUCCESS; +GX_FONT_HEADER font_header; GX_PAGE_HEADER header; GX_FONT *font; GX_FONT *head_page = GX_NULL; GX_FONT *pre_page = GX_NULL; USHORT index; USHORT glyph_count; +UINT read_offset = 0; - for (index = 0; index < page_count; index++) - { - /* Read page header. */ - _gx_binres_page_header_load(info, &header); + /* Read font header. */ + status = _gx_binres_font_header_load(info, &font_header); - font = (GX_FONT *)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); - info -> gx_binres_buffer_index += sizeof(GX_FONT); + if (status != GX_SUCCESS) + { + return status; + } - font -> gx_font_baseline = header.gx_page_header_baseline; - font -> gx_font_first_glyph = header.gx_page_header_first_glyph; - font -> gx_font_format = header.gx_page_header_format; - font -> gx_font_last_glyph = header.gx_page_header_last_glyph; - font -> gx_font_line_height = header.gx_page_header_line_height; - font -> gx_font_postspace = header.gx_page_header_postspace; - font -> gx_font_prespace = header.gx_page_header_prespace; + if (font_header.gx_font_header_deault) + { + switch (font_header.gx_font_header_bits) + { + case 1: + head_page = (GX_FONT *)&_gx_system_font_mono; + break; - /* Read glyphs data. */ - glyph_count = (USHORT)(font -> gx_font_last_glyph - font -> gx_font_first_glyph + 1); + case 4: + head_page = (GX_FONT *)&_gx_system_font_4bpp; + break; - if (font -> gx_font_format & GX_FONT_FORMAT_COMPRESSED) - { - status = _gx_binres_compressed_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_compressed_glyphs); - } -#if defined(GX_FONT_KERNING_SUPPORT) - else if (font -> gx_font_format & GX_FONT_FORMAT_KERNING) - { - status = _gx_binres_kerning_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_kerning_glyphs); + case 8: + head_page = (GX_FONT *)&_gx_system_font_8bpp; + break; } -#endif /* GX_FONT_KERNING_SUPPORT */ - else + } + else + { + if (font_header.gx_font_header_data_offset) { - status = _gx_binres_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_normal_glyphs); - } + /* The font data is not follow the header directly, + the data offset gives the position where the font + data located. */ - if (status != GX_SUCCESS) - { - break; - } + /* Record current data offset. */ + read_offset = info -> gx_binres_read_offset; - font -> gx_font_next_page = NULL; + /* Temporarily reset data offset to access font data. */ + info -> gx_binres_read_offset = font_header.gx_font_header_data_offset; - if (!head_page) - { - head_page = font; + /* Read font header. */ + _gx_binres_font_header_load(info, &font_header); } - if (pre_page) + for (index = 0; index < font_header.gx_font_header_page_count; index++) { - pre_page -> gx_font_next_page = font; + /* Read page header. */ + status = _gx_binres_page_header_load(info, &header); + + if (status != GX_SUCCESS) + { + return status; + } + + font = (GX_FONT *)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); + info -> gx_binres_buffer_index += sizeof(GX_FONT); + + font -> gx_font_baseline = header.gx_page_header_baseline; + font -> gx_font_first_glyph = header.gx_page_header_first_glyph; + font -> gx_font_format = header.gx_page_header_format; + font -> gx_font_last_glyph = header.gx_page_header_last_glyph; + font -> gx_font_line_height = header.gx_page_header_line_height; + font -> gx_font_postspace = header.gx_page_header_postspace; + font -> gx_font_prespace = header.gx_page_header_prespace; + + /* Read glyphs data. */ + glyph_count = (USHORT)(font -> gx_font_last_glyph - font -> gx_font_first_glyph + 1); + + if (font -> gx_font_format & GX_FONT_FORMAT_COMPRESSED) + { + status = _gx_binres_compressed_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_compressed_glyphs); + } +#if defined(GX_FONT_KERNING_SUPPORT) + else if (font -> gx_font_format & GX_FONT_FORMAT_KERNING) + { + status = _gx_binres_kerning_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_kerning_glyphs); + } +#endif /* GX_FONT_KERNING_SUPPORT */ + else + { + status = _gx_binres_glyphs_address_get(info, glyph_count, &font -> gx_font_glyphs.gx_font_normal_glyphs); + } + + if (status != GX_SUCCESS) + { + break; + } + + font -> gx_font_next_page = NULL; + + if (!head_page) + { + head_page = font; + } + + if (pre_page) + { + pre_page -> gx_font_next_page = font; + } + + pre_page = font; } + } - pre_page = font; + if (read_offset) + { + /* Restore data offset. */ + info -> gx_binres_read_offset = read_offset; + read_offset = 0; } - *return_font = head_page; + if (return_font) + { + *return_font = head_page; + } return status; } @@ -1435,7 +1596,7 @@ GX_COLOR *palette_table = GX_NULL; /* FUNCTION RELEASE */ /* */ /* _gx_binres_font_table_load PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -1456,8 +1617,7 @@ GX_COLOR *palette_table = GX_NULL; /* */ /* CALLS */ /* */ -/* _gx_binres_font_header_load Read font header */ -/* _gx_binres_font_read Read font data */ +/* _gx_binres_one_font_load Load one font */ /* */ /* CALLED BY */ /* */ @@ -1470,78 +1630,28 @@ GX_COLOR *palette_table = GX_NULL; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* improved logic, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT static UINT _gx_binres_font_table_load(GX_BINRES_DATA_INFO *info, USHORT table_size, GX_FONT ***returned_font_table) { -UINT status = GX_SUCCESS; -GX_FONT_HEADER header; -GX_FONT **font_table = GX_NULL; -USHORT index; -UINT read_offset = 0; - - if (!table_size) - { - return status; - } +UINT status = GX_SUCCESS; +GX_FONT **font_table = GX_NULL; +USHORT index; font_table = (GX_FONT **)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); info -> gx_binres_buffer_index += sizeof(GX_FONT *) * table_size; for (index = 0; index < table_size; index++) { - /* Read font header. */ - _gx_binres_font_header_load(info, &header); - - if (header.gx_font_header_deault) - { - switch (header.gx_font_header_bits) - { - case 1: - font_table[index] = (GX_FONT *)&_gx_system_font_mono; - break; + status = _gx_binres_one_font_load(info, &font_table[index]); - case 4: - font_table[index] = (GX_FONT *)&_gx_system_font_4bpp; - break; - - case 8: - font_table[index] = (GX_FONT *)&_gx_system_font_8bpp; - break; - } - } - else + if (status != GX_SUCCESS) { - if (header.gx_font_header_data_offset) - { - /* The font data is not follow the header directly, - the data offset gives the position where the font - data located. */ - - /* Record current data offset. */ - read_offset = info -> gx_binres_read_offset; - - /* Temporarily reset data offset to access font data. */ - info -> gx_binres_read_offset = header.gx_font_header_data_offset; - - /* Read font header. */ - _gx_binres_font_header_load(info, &header); - } - - status = _gx_binres_font_load(info, header.gx_font_header_page_count, &font_table[index]); - - if (status != GX_SUCCESS) - { - break; - } - - if (read_offset) - { - /* Restore data offset. */ - info -> gx_binres_read_offset = read_offset; - read_offset = 0; - } + return status; } } @@ -1555,21 +1665,21 @@ UINT read_offset = 0; /* */ /* FUNCTION RELEASE */ /* */ -/* _gx_binres_pixelmap_table_load PORTABLE C */ -/* 6.1 */ +/* _gx_binres_one_pixelmap_load PORTABLE C */ +/* 6.3.0 */ /* AUTHOR */ /* */ -/* Kenneth Maxwell, Microsoft Corporation */ +/* Ting Zhu, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ -/* This function loads a pixelmap table from resource data memory. */ +/* This function loads one pixelmap from resource data memory. */ /* */ /* INPUT */ /* */ /* info Binary resource control block */ -/* table_size Pixelmap table size */ -/* returned_pixelmp_table Returned pixelmap table */ +/* returned_pixelmap Returned pixelmap table */ +/* map_id Loaded pixelmap ID */ /* */ /* OUTPUT */ /* */ @@ -1587,119 +1697,165 @@ UINT read_offset = 0; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ -/* 09-30-2020 Kenneth Maxwell Modified comment(s), */ -/* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ #ifdef GX_BINARY_RESOURCE_SUPPORT -static UINT _gx_binres_pixelmap_table_load(GX_BINRES_DATA_INFO *info, USHORT table_size, GX_PIXELMAP ***returned_pixelmap_table) +UINT _gx_binres_one_pixelmap_load(GX_BINRES_DATA_INFO *info, GX_PIXELMAP **returned_pixelmap, USHORT *map_id) { UINT status = GX_SUCCESS; GX_PIXELMAP_HEADER header; -GX_PIXELMAP **pixelmap_table = GX_NULL; -USHORT index; ULONG size; -GX_BOOL keep_looping; UINT read_offset = 0; - if (table_size <= 1) +GX_PIXELMAP *pixelmap; + + /* Read pixelmap header. */ + status = _gx_binres_pixelmap_header_load(info, &header); + + if (status) { - return GX_SUCCESS; + return status; } - pixelmap_table = (GX_PIXELMAP **)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); - info -> gx_binres_buffer_index += sizeof(GX_PIXELMAP *) * table_size; - - for (index = 1; index < table_size; index++) + if (header.gx_pixelmap_header_data_offset) { - /* Read pixelmap header. */ + /* The pixelmap data is not follow the header directly, + the data offset gives the position where the pixelmap + data located. */ + + /* Record current data offset. */ + read_offset = info -> gx_binres_read_offset; + + /* Temporarily reset data offset to access pixelmap data. */ + info -> gx_binres_read_offset = header.gx_pixelmap_header_data_offset; + + /* Read pixelmap header. */ _gx_binres_pixelmap_header_load(info, &header); + } - if (header.gx_pixelmap_header_magic_number != GX_MAGIC_NUMBER) - { - return GX_INVALID_FORMAT; - } + /* Allocate memory for pixelmap. */ + pixelmap = (GX_PIXELMAP *)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); + info -> gx_binres_buffer_index += sizeof(GX_PIXELMAP); + + pixelmap -> gx_pixelmap_aux_data_size = header.gx_pixelmap_header_aux_data_size; + pixelmap -> gx_pixelmap_data_size = header.gx_pixelmap_header_map_size; + pixelmap -> gx_pixelmap_flags = header.gx_pixelmap_header_flags; + pixelmap -> gx_pixelmap_format = header.gx_pixelmap_header_format; + pixelmap -> gx_pixelmap_width = (GX_VALUE)header.gx_pixelmap_header_width; + pixelmap -> gx_pixelmap_height = (GX_VALUE)header.gx_pixelmap_header_height; + pixelmap -> gx_pixelmap_transparent_color = header.gx_pixelmap_header_transparent_color; + pixelmap -> gx_pixelmap_version_major = header.gx_pixelmap_header_version_major; + pixelmap -> gx_pixelmap_version_minor = header.gx_pixelmap_header_version_minor; + + /* Skip padding bytes. */ + info -> gx_binres_read_offset = (info -> gx_binres_read_offset + 3) & (~0x03UL); + + /* Read pixelmap data. */ + size = pixelmap -> gx_pixelmap_data_size; + if (size) + { + pixelmap -> gx_pixelmap_data = (GX_UBYTE *)(info -> gx_binres_root_address + info -> gx_binres_read_offset); + info -> gx_binres_read_offset += size; + } - if (header.gx_pixelmap_header_data_offset) - { - /* The pixelmap data is not follow the header directly, - the data offset gives the position where the pixelmap - data located. */ + /* Read pixelmap aux data. */ + size = pixelmap -> gx_pixelmap_aux_data_size; + if (size) + { + pixelmap -> gx_pixelmap_aux_data = (GX_UBYTE *)(info -> gx_binres_root_address + info -> gx_binres_read_offset); + info -> gx_binres_read_offset += size; + } - /* Record current data offset. */ - read_offset = info -> gx_binres_read_offset; + if (read_offset) + { + /* Restore data offset. */ + info -> gx_binres_read_offset = read_offset; + read_offset = 0; + } - /* Temporarily reset data offset to access pixelmap data. */ - info -> gx_binres_read_offset = header.gx_pixelmap_header_data_offset; + if (returned_pixelmap) + { + *returned_pixelmap = pixelmap; + } - /* Read pixelmap header. */ - _gx_binres_pixelmap_header_load(info, &header); - } + if (map_id) + { + *map_id = header.gx_pixelmap_header_index; + } - keep_looping = GX_TRUE; + return status; +} - while (keep_looping) - { - keep_looping = GX_FALSE; - /* Allocate memory for pixelmap. */ - pixelmap_table[index] = (GX_PIXELMAP *)(info -> gx_binres_buffer + info -> gx_binres_buffer_index); - info -> gx_binres_buffer_index += sizeof(GX_PIXELMAP); +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_binres_pixelmap_table_load PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Kenneth Maxwell, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function loads a pixelmap table from resource data memory. */ +/* */ +/* INPUT */ +/* */ +/* info Binary resource control block */ +/* table_size Pixelmap table size */ +/* returned_pixelmp_table Returned pixelmap table */ +/* */ +/* OUTPUT */ +/* */ +/* Status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_one_pixelmap_load Load one pixelmap */ +/* */ +/* CALLED BY */ +/* */ +/* GUIX Internal Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ +/* 09-30-2020 Kenneth Maxwell Modified comment(s), */ +/* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* improved logic, */ +/* resulting in version 6.3.0 */ +/* */ +/**************************************************************************/ +static UINT _gx_binres_pixelmap_table_load(GX_BINRES_DATA_INFO *info, USHORT table_size, GX_PIXELMAP **pixelmap_table) +{ +UINT status = GX_SUCCESS; +USHORT index; +USHORT map_id; +GX_PIXELMAP *pixelmap; - switch (index) - { - case GX_PIXELMAP_RADIO_ON_ID: - case GX_PIXELMAP_RADIO_OFF_ID: - case GX_PIXELMAP_CHECKBOX_ON_ID: - case GX_PIXELMAP_CHECKBOX_OFF_ID: - if (index != header.gx_pixelmap_header_index) - { - pixelmap_table[index++] = GX_NULL; - keep_looping = GX_TRUE; - } - } - } + for (index = 1; index < table_size; index++) + { + status = _gx_binres_one_pixelmap_load(info, &pixelmap, &map_id); - pixelmap_table[index] -> gx_pixelmap_aux_data_size = header.gx_pixelmap_header_aux_data_size; - pixelmap_table[index] -> gx_pixelmap_data_size = header.gx_pixelmap_header_map_size; - pixelmap_table[index] -> gx_pixelmap_flags = header.gx_pixelmap_header_flags; - pixelmap_table[index] -> gx_pixelmap_format = header.gx_pixelmap_header_format; - pixelmap_table[index] -> gx_pixelmap_width = (GX_VALUE)header.gx_pixelmap_header_width; - pixelmap_table[index] -> gx_pixelmap_height = (GX_VALUE)header.gx_pixelmap_header_height; - pixelmap_table[index] -> gx_pixelmap_transparent_color = header.gx_pixelmap_header_transparent_color; - pixelmap_table[index] -> gx_pixelmap_version_major = header.gx_pixelmap_header_version_major; - pixelmap_table[index] -> gx_pixelmap_version_minor = header.gx_pixelmap_header_version_minor; - - /* Skip padding bytes. */ - info -> gx_binres_read_offset = (info -> gx_binres_read_offset + 3) & (~0x03UL); - - /* Read pixelmap data. */ - size = pixelmap_table[index] -> gx_pixelmap_data_size; - if (size) + while (index < map_id) { - pixelmap_table[index] -> gx_pixelmap_data = (GX_UBYTE *)(info -> gx_binres_root_address + info -> gx_binres_read_offset); - info -> gx_binres_read_offset += size; + pixelmap_table[index++] = GX_NULL; } - /* Read pixelmap aux data. */ - size = pixelmap_table[index] -> gx_pixelmap_aux_data_size; - if (size) - { - pixelmap_table[index] -> gx_pixelmap_aux_data = (GX_UBYTE *)(info -> gx_binres_root_address + info -> gx_binres_read_offset); - info -> gx_binres_read_offset += size; - } + pixelmap_table[index] = pixelmap; - if (read_offset) + if (status) { - /* Restore data offset. */ - info -> gx_binres_read_offset = read_offset; - read_offset = 0; + return status; } } - *returned_pixelmap_table = pixelmap_table; - return status; } #endif @@ -1776,7 +1932,6 @@ INT index; if (status == GX_SUCCESS) { - info.gx_binres_read_offset = 0; status = _gx_binres_resource_header_load(&info, &header); } @@ -1817,7 +1972,7 @@ INT index; } /* Read font table. */ - if ((status == GX_SUCCESS) && theme_header.gx_theme_header_font_data_size) + if ((status == GX_SUCCESS) && theme_header.gx_theme_header_font_data_size && theme_header.gx_theme_header_font_count) { status = _gx_binres_font_table_load(&info, theme_header.gx_theme_header_font_count, @@ -1825,11 +1980,16 @@ INT index; } /* Read pixelmap table. */ - if ((status == GX_SUCCESS) && theme_header.gx_theme_header_pixelmap_data_size) + if ((status == GX_SUCCESS) && theme_header.gx_theme_header_pixelmap_data_size && theme_header.gx_theme_header_pixelmap_count) { + /* Allocate pixelmap table size. */ + theme -> theme_pixelmap_table = (GX_PIXELMAP **)(info.gx_binres_buffer + info.gx_binres_buffer_index); + info.gx_binres_buffer_index += sizeof(GX_PIXELMAP *) * (UINT)(theme_header.gx_theme_header_pixelmap_count + 1); + + /* Load pixelmap table. */ status = _gx_binres_pixelmap_table_load(&info, - (USHORT)(theme_header.gx_theme_header_pixelmap_count + 1), - &theme -> theme_pixelmap_table); + theme -> theme_pixelmap_table_size, + theme -> theme_pixelmap_table); } if (status == GX_SUCCESS) diff --git a/common/src/gx_canvas_block_move.c b/common/src/gx_canvas_block_move.c index db4b95b8..18edcaf1 100644 --- a/common/src/gx_canvas_block_move.c +++ b/common/src/gx_canvas_block_move.c @@ -37,7 +37,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_block_move.c PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -78,6 +78,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added canvas status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_canvas_block_move(GX_RECTANGLE *block, GX_VALUE x_shift, GX_VALUE y_shift, GX_RECTANGLE *dirty) @@ -101,7 +104,7 @@ UINT status = GX_FAILURE; display = context -> gx_draw_context_display; /* check to see if this driver supports block move */ - if (!display -> gx_display_driver_block_move) + if (!display -> gx_display_driver_block_move || (context -> gx_draw_context_canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER)) { /* this driver doesn't support block move. If we are partial drawing just mark the caller as dirty so that diff --git a/common/src/gx_canvas_create.c b/common/src/gx_canvas_create.c index de49a985..0070c63d 100644 --- a/common/src/gx_canvas_create.c +++ b/common/src/gx_canvas_create.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_create PORTABLE C */ -/* 6.1.3 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -81,6 +81,10 @@ /* resulting in version 6.1 */ /* 12-31-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1.3 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added initilization to the */ +/* canvas members, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_canvas_create(GX_CANVAS *canvas, GX_CONST GX_CHAR *name, GX_DISPLAY *display, @@ -100,9 +104,13 @@ UINT _gx_canvas_create(GX_CANVAS *canvas, GX_CONST GX_CHAR *name, GX_DISPLAY *d canvas -> gx_canvas_draw_nesting = 0; canvas -> gx_canvas_dirty_count = 0; canvas -> gx_canvas_status = type; - canvas -> gx_canvas_x_resolution = (GX_VALUE) width; - canvas -> gx_canvas_y_resolution = (GX_VALUE) height; - canvas -> gx_canvas_hardware_layer = (GX_BYTE) -1; + canvas -> gx_canvas_x_resolution = (GX_VALUE)width; + canvas -> gx_canvas_y_resolution = (GX_VALUE)height; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + canvas -> gx_canvas_memory_width = (GX_VALUE)width; + canvas -> gx_canvas_memory_height = (GX_VALUE)height; +#endif + canvas -> gx_canvas_hardware_layer = (GX_BYTE)-1; /* Determine if there is a memory area. */ if (memory_area) diff --git a/common/src/gx_canvas_drawing_initiate.c b/common/src/gx_canvas_drawing_initiate.c index d711d3e3..1d435d54 100644 --- a/common/src/gx_canvas_drawing_initiate.c +++ b/common/src/gx_canvas_drawing_initiate.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_drawing_initiate PORTABLE C */ -/* 6.1.5 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -86,6 +86,10 @@ /* 03-02-2021 Kenneth Maxwell Modified comment(s), added */ /* flip rotation support, */ /* resulting in version 6.1.5 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_canvas_drawing_initiate(GX_CANVAS *canvas, GX_WIDGET *who, GX_RECTANGLE *dirty_area) @@ -122,6 +126,21 @@ GX_DISPLAY *display = canvas -> gx_canvas_display; { /* initialize the dirty rectangle */ canvas -> gx_canvas_dirty_area = *dirty_area; + +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + canvas -> gx_canvas_memory_width = (GX_VALUE)(dirty_area -> gx_rectangle_right - dirty_area -> gx_rectangle_left + 1); + canvas -> gx_canvas_memory_width = (GX_VALUE)((canvas -> gx_canvas_memory_width + 3) & 0xFFFC); + canvas -> gx_canvas_memory_height = (GX_VALUE)(canvas -> gx_canvas_memory_size / display -> gx_display_driver_row_pitch_get((USHORT)canvas -> gx_canvas_memory_width)); + if (canvas -> gx_canvas_memory_height < (dirty_area -> gx_rectangle_bottom - dirty_area -> gx_rectangle_top + 1)) + { + return GX_INVALID_MEMORY_SIZE; + } + canvas -> gx_canvas_memory_offset_x = dirty_area -> gx_rectangle_left; + canvas -> gx_canvas_memory_offset_y = dirty_area -> gx_rectangle_top; + } +#endif } /* Are we nested? */ @@ -146,7 +165,23 @@ GX_DISPLAY *display = canvas -> gx_canvas_display; if (new_context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_NONE || new_context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_FLIP) { +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + new_context -> gx_draw_context_pitch = canvas -> gx_canvas_memory_width; + new_context -> gx_draw_context_offset_x = canvas -> gx_canvas_memory_offset_x; + new_context -> gx_draw_context_offset_y = canvas -> gx_canvas_memory_offset_y; + } + else + { + new_context -> gx_draw_context_pitch = canvas -> gx_canvas_x_resolution; + new_context -> gx_draw_context_offset_x = 0; + new_context -> gx_draw_context_offset_y = 0; + } + +#else new_context -> gx_draw_context_pitch = canvas -> gx_canvas_x_resolution; +#endif } else { diff --git a/common/src/gx_canvas_line_draw.c b/common/src/gx_canvas_line_draw.c index 8f730ce0..095070e5 100644 --- a/common/src/gx_canvas_line_draw.c +++ b/common/src/gx_canvas_line_draw.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_line_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -87,6 +87,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), fixed a */ +/* pattern line draw issue, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_canvas_line_draw(GX_VALUE x_start, GX_VALUE y_start, GX_VALUE x_end, GX_VALUE y_end) @@ -254,11 +257,30 @@ GX_VALUE brush_width; { if (brush -> gx_brush_line_pattern) { + if (clip_rect.gx_rectangle_left > x_start) + { + width = (GX_VALUE)((clip_rect.gx_rectangle_left - x_start) & 0x1F); + context -> gx_draw_context_brush.gx_brush_pattern_mask >>= width; + } + /* Call display driver's simple horizontal pattern line drawing function. */ display -> gx_display_driver_horizontal_pattern_line_draw(context, clip_rect.gx_rectangle_left, clip_rect.gx_rectangle_right, y_start); + + if (clip_rect.gx_rectangle_right < x_end) + { + width = (GX_VALUE)((x_end - clip_rect.gx_rectangle_right) & 0x1F); + if ((context -> gx_draw_context_brush.gx_brush_pattern_mask >> width) == 0) + { + context -> gx_draw_context_brush.gx_brush_pattern_mask <<= (32 - width); + } + else + { + context -> gx_draw_context_brush.gx_brush_pattern_mask >>= width; + } + } } else { @@ -275,11 +297,30 @@ GX_VALUE brush_width; { if (brush -> gx_brush_line_pattern) { + if (clip_rect.gx_rectangle_top > y_start) + { + width = (GX_VALUE)((clip_rect.gx_rectangle_top - y_start) & 0x1F); + context -> gx_draw_context_brush.gx_brush_pattern_mask >>= width; + } + /* Call display driver's simple vertical line drawing function. */ display -> gx_display_driver_vertical_pattern_line_draw(context, clip_rect.gx_rectangle_top, clip_rect.gx_rectangle_bottom, x_start); + + if (clip_rect.gx_rectangle_bottom < y_end) + { + width = (GX_VALUE)((y_end - clip_rect.gx_rectangle_bottom) & 0x1F); + if ((context -> gx_draw_context_brush.gx_brush_pattern_mask >> width) == 0) + { + context -> gx_draw_context_brush.gx_brush_pattern_mask <<= (32 - width); + } + else + { + context -> gx_draw_context_brush.gx_brush_pattern_mask >>= width; + } + } } else { diff --git a/common/src/gx_canvas_memory_define.c b/common/src/gx_canvas_memory_define.c index 285e49ca..c9cc3a1f 100644 --- a/common/src/gx_canvas_memory_define.c +++ b/common/src/gx_canvas_memory_define.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_memory_define PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -67,15 +67,36 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_canvas_memory_define(GX_CANVAS *canvas, GX_COLOR *memory, ULONG memsize) { +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER +GX_DISPLAY *display = canvas -> gx_canvas_display; +ULONG canvas_size; + + if (!display) + { + return GX_INVALID_DISPLAY; + } + + canvas_size = (ULONG)(display -> gx_display_driver_row_pitch_get((USHORT)canvas -> gx_canvas_x_resolution) * canvas -> gx_canvas_y_resolution); + + if (memsize < canvas_size) + { + canvas -> gx_canvas_status |= GX_CANVAS_PARTIAL_FRAME_BUFFER; + } +#endif + /* change the memory pointer value */ canvas -> gx_canvas_memory = memory; /* change the memory size */ - canvas ->gx_canvas_memory_size = memsize; + canvas -> gx_canvas_memory_size = memsize; /* mark the canvas dirty so that it get refreshed */ _gx_canvas_dirty_mark(canvas, GX_NULL); diff --git a/common/src/gx_canvas_mouse_show.c b/common/src/gx_canvas_mouse_show.c index d255b29f..6e7f2cd9 100644 --- a/common/src/gx_canvas_mouse_show.c +++ b/common/src/gx_canvas_mouse_show.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_canvas_mouse_show PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -65,6 +65,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added canvas status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_MOUSE_SUPPORT) @@ -73,6 +76,14 @@ UINT _gx_canvas_mouse_show(GX_CANVAS *canvas) GX_DISPLAY *display; GX_MOUSE_CURSOR_INFO *mouse_info; +#if defined(GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER) + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + /* Not supported. */ + return GX_FAILURE; + } +#endif + display = canvas -> gx_canvas_display; mouse_info = display -> gx_display_mouse.gx_mouse_cursor_info; diff --git a/common/src/gx_display_driver_1555xrgb_jpeg_draw.c b/common/src/gx_display_driver_1555xrgb_jpeg_draw.c index a9f3d874..c01bd155 100644 --- a/common/src/gx_display_driver_1555xrgb_jpeg_draw.c +++ b/common/src/gx_display_driver_1555xrgb_jpeg_draw.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_dislay_driver_565rgb_jpeg_draw PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -70,10 +70,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed a parameter from */ /* jpeg mcu decode function, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_display_driver_16bpp_block_move.c b/common/src/gx_display_driver_16bpp_block_move.c index 280a54cb..b9fd2f05 100644 --- a/common/src/gx_display_driver_16bpp_block_move.c +++ b/common/src/gx_display_driver_16bpp_block_move.c @@ -34,7 +34,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_block_move PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -69,6 +69,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added canvas status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_block_move(GX_DRAW_CONTEXT *context, @@ -81,6 +84,14 @@ INT width_in_bytes; INT y; INT height; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (context -> gx_draw_context_canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + /* Not supported. */ + return; + } +#endif + if (xshift) { if (xshift > 0) diff --git a/common/src/gx_display_driver_16bpp_canvas_copy.c b/common/src/gx_display_driver_16bpp_canvas_copy.c index 2f706121..07fc2fd5 100644 --- a/common/src/gx_display_driver_16bpp_canvas_copy.c +++ b/common/src/gx_display_driver_16bpp_canvas_copy.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_canvas_copy PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -71,6 +71,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added canvas status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_canvas_copy(GX_CANVAS *canvas, GX_CANVAS *composite) @@ -82,6 +85,14 @@ USHORT *write; INT width; INT row; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + /* Not supported. */ + return; + } +#endif + dirty.gx_rectangle_left = dirty.gx_rectangle_top = 0; dirty.gx_rectangle_right = (GX_VALUE)(canvas -> gx_canvas_x_resolution - (GX_VALUE)1); dirty.gx_rectangle_bottom = (GX_VALUE)(canvas -> gx_canvas_y_resolution - (GX_VALUE)1); diff --git a/common/src/gx_display_driver_16bpp_horizontal_line_draw.c b/common/src/gx_display_driver_16bpp_horizontal_line_draw.c index c0fb79f5..20eb4287 100644 --- a/common/src/gx_display_driver_16bpp_horizontal_line_draw.c +++ b/common/src/gx_display_driver_16bpp_horizontal_line_draw.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_horizontal_line_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -73,6 +73,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color) @@ -103,11 +107,8 @@ GX_UBYTE alpha; /* pick up start address of canvas memory */ rowstart = (USHORT *)context -> gx_draw_context_memory; - /* calculate start of row address */ - rowstart += context -> gx_draw_context_pitch * ypos; + GX_CALCULATE_PUTROW(rowstart, xstart, ypos, context); - /* calculate pixel address */ - rowstart += xstart; /* draw 1-pixel hi lines to fill width */ for (row = 0; row < width; row++) { diff --git a/common/src/gx_display_driver_16bpp_horizontal_pattern_line_draw.c b/common/src/gx_display_driver_16bpp_horizontal_pattern_line_draw.c index 521ddc77..5a3b4e0f 100644 --- a/common/src/gx_display_driver_16bpp_horizontal_pattern_line_draw.c +++ b/common/src/gx_display_driver_16bpp_horizontal_pattern_line_draw.c @@ -34,7 +34,7 @@ /* */ /* _gx_display_driver_16bpp_horizontal_pattern_line_draw */ /* PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -69,6 +69,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_horizontal_pattern_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos) @@ -86,11 +90,8 @@ INT len = xend - xstart + 1; /* pick up start address of canvas memory */ rowstart = (USHORT *)context -> gx_draw_context_memory; - /* calculate start of row address */ - rowstart += context -> gx_draw_context_pitch * ypos; + GX_CALCULATE_PUTROW(rowstart, xstart, ypos, context); - /* calculate pixel address */ - rowstart += xstart; /* draw 1-pixel hi lines to fill width */ /* pick up the requested pattern and mask */ diff --git a/common/src/gx_display_driver_16bpp_pixel_write.c b/common/src/gx_display_driver_16bpp_pixel_write.c index bf5a8f46..4d6ef251 100644 --- a/common/src/gx_display_driver_16bpp_pixel_write.c +++ b/common/src/gx_display_driver_16bpp_pixel_write.c @@ -32,7 +32,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_pixel_write PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -67,17 +67,17 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_pixel_write(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR color) { USHORT *put = (USHORT *)context -> gx_draw_context_memory; - /* calculate address of scan line */ - put += context -> gx_draw_context_pitch * y; - - /* step in by x coordinate */ - put += x; + GX_CALCULATE_PUTROW(put, x, y, context); /* write the pixel value */ *put = (USHORT)color; diff --git a/common/src/gx_display_driver_16bpp_pixelmap_draw.c b/common/src/gx_display_driver_16bpp_pixelmap_draw.c index c8f05233..304485cb 100644 --- a/common/src/gx_display_driver_16bpp_pixelmap_draw.c +++ b/common/src/gx_display_driver_16bpp_pixelmap_draw.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_565rgb_pixelmap_raw_write PORTABLE C */ -/* 6.1 */ +/* 6.X */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -69,6 +69,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_pixelmap_raw_write(GX_DRAW_CONTEXT *context, @@ -85,8 +89,8 @@ GX_CONST USHORT *get; GX_RECTANGLE *clip = context -> gx_draw_context_clip; putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; + + GX_CALCULATE_PUTROW(putrow, clip->gx_rectangle_left, clip->gx_rectangle_top, context); getrow = (USHORT *)(pixelmap -> gx_pixelmap_data); getrow += pixelmap -> gx_pixelmap_width * (clip -> gx_rectangle_top - ypos); @@ -201,7 +205,7 @@ void (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* */ /* _gx_display_driver_565rgb_pixelmap_compressed_write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.X */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -237,6 +241,10 @@ void (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_pixelmap_compressed_write(GX_DRAW_CONTEXT *context, @@ -281,8 +289,8 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; to the enf of the last visible row */ putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += yval * context -> gx_draw_context_pitch; - putrow += xpos; + + GX_CALCULATE_PUTROW(putrow, xpos, yval, context); while (yval <= clip -> gx_rectangle_bottom) { @@ -534,7 +542,7 @@ void (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_565rgb_palette_pixelmap_raw_write PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -570,6 +578,10 @@ void (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_palette_pixelmap_raw_write(GX_DRAW_CONTEXT *context, @@ -590,8 +602,8 @@ GX_UBYTE b; GX_RECTANGLE *clip = context -> gx_draw_context_clip; putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; + + GX_CALCULATE_PUTROW(putrow, clip->gx_rectangle_left, clip->gx_rectangle_top, context); getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data); getrow += pixelmap -> gx_pixelmap_width * (clip -> gx_rectangle_top - ypos); @@ -624,7 +636,7 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* */ /* _gx_display_driver_565rgb_palette_pixelmap_transparent_raw_write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.X */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -660,6 +672,10 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_palette_pixelmap_transparent_raw_write(GX_DRAW_CONTEXT *context, @@ -679,9 +695,8 @@ GX_UBYTE b; GX_RECTANGLE *clip = context -> gx_draw_context_clip; - putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; + putrow = (USHORT *)context->gx_draw_context_memory; + GX_CALCULATE_PUTROW(putrow, clip->gx_rectangle_left, clip->gx_rectangle_top, context); getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data); getrow += pixelmap -> gx_pixelmap_width * (clip -> gx_rectangle_top - ypos); @@ -720,7 +735,7 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* _gx_display_driver_565rgb_palette_pixelmap_transparent_compressed */ /* _write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -757,6 +772,10 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_palette_pixelmap_transparent_compressed_write(GX_DRAW_CONTEXT *context, @@ -805,8 +824,7 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* Now we are on the first visible row, copy pixels until we get to the end of the last visible row. */ putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += yval * context -> gx_draw_context_pitch; - putrow += xpos; + GX_CALCULATE_PUTROW(putrow, xpos, yval, context); palette = (GX_COLOR *)pixelmap -> gx_pixelmap_aux_data; @@ -923,7 +941,7 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* */ /* _gx_display_driver_565rgb_palette_pixelmap_compressed_write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -959,6 +977,10 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_palette_pixelmap_compressed_write(GX_DRAW_CONTEXT *context, @@ -1006,8 +1028,7 @@ GX_RECTANGLE *clip = context -> gx_draw_context_clip; /* Now we are on the first visible row, copy pixels until we get to the end of the last visible row. */ putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += yval * context -> gx_draw_context_pitch; - putrow += xpos; + GX_CALCULATE_PUTROW(putrow, xpos, yval, context); palette = (GX_COLOR *)pixelmap -> gx_pixelmap_aux_data; diff --git a/common/src/gx_display_driver_16bpp_pixelmap_rotate.c b/common/src/gx_display_driver_16bpp_pixelmap_rotate.c index abdaf8a1..8f26aa75 100644 --- a/common/src/gx_display_driver_16bpp_pixelmap_rotate.c +++ b/common/src/gx_display_driver_16bpp_pixelmap_rotate.c @@ -580,7 +580,7 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR col /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_pixelmap_simple_rotate PORTABLE C */ -/* 6.1.7 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -622,6 +622,10 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR col /* 06-02-2021 Kenneth Maxwell Modified comment(s), */ /* remove unused assignment, */ /* resulting in version 6.1.7 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_pixelmap_simple_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, @@ -640,6 +644,10 @@ INT newypos; clip = context -> gx_draw_context_clip; + putrow = (USHORT *)context -> gx_draw_context_memory; + + GX_CALCULATE_PUTROW(putrow, clip -> gx_rectangle_left, clip -> gx_rectangle_top, context); + if (angle == 90) { width = pixelmap -> gx_pixelmap_height; @@ -648,10 +656,6 @@ INT newypos; newxpos = xpos + cx - (width - 1 - cy); newypos = ypos + cy - cx; - putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; - for (y = clip -> gx_rectangle_top - newypos; y <= clip -> gx_rectangle_bottom - newypos; y++) { put = putrow; @@ -677,10 +681,6 @@ INT newypos; newxpos = xpos + cx - (width - 1 - cx); newypos = ypos + cy - (height - 1 - cy); - putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; - for (y = clip -> gx_rectangle_top - newypos; y <= clip -> gx_rectangle_bottom - newypos; y++) { put = putrow; @@ -703,10 +703,6 @@ INT newypos; newxpos = xpos + cx - cy; newypos = ypos + cx - (height - 1 - cy); - putrow = (USHORT *)context -> gx_draw_context_memory; - putrow += clip -> gx_rectangle_top * context -> gx_draw_context_pitch; - putrow += clip -> gx_rectangle_left; - for (y = clip -> gx_rectangle_top - newypos; y <= clip -> gx_rectangle_bottom - newypos; y++) { put = putrow; diff --git a/common/src/gx_display_driver_16bpp_simple_line_draw.c b/common/src/gx_display_driver_16bpp_simple_line_draw.c index cef9d1aa..6001e0dc 100644 --- a/common/src/gx_display_driver_16bpp_simple_line_draw.c +++ b/common/src/gx_display_driver_16bpp_simple_line_draw.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_simple_line_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -75,6 +75,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend) @@ -103,8 +107,9 @@ INT dy = GX_ABS(yend - ystart); GX_RECTANGLE *clip = context -> gx_draw_context_clip; GX_COLOR linecolor = context -> gx_draw_context_brush.gx_brush_line_color; -#if defined GX_BRUSH_ALPHA_SUPPORT -GX_UBYTE alpha; + +#if defined GX_BRUSH_ALPHA_SUPPORT +GX_UBYTE alpha; alpha = context -> gx_draw_context_brush.gx_brush_alpha; if (alpha == 0) @@ -136,8 +141,11 @@ GX_UBYTE alpha; y_increment = 0 - context -> gx_draw_context_pitch; } - put = (USHORT *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart; - next_put = (USHORT *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend; + put = (USHORT *)(context -> gx_draw_context_memory); + GX_CALCULATE_PUTROW(put, xstart, ystart, context); + + next_put = (USHORT *)(context -> gx_draw_context_memory); + GX_CALCULATE_PUTROW(next_put, xend, yend, context); end_point.gx_point_x = (GX_VALUE)xstart; @@ -296,7 +304,7 @@ GX_UBYTE alpha; PIXEL_WRITE(put, linecolor); put += context -> gx_draw_context_pitch; } - } + } } else { @@ -461,3 +469,4 @@ GX_UBYTE alpha; } } } + diff --git a/common/src/gx_display_driver_16bpp_vertical_line_draw.c b/common/src/gx_display_driver_16bpp_vertical_line_draw.c index 128a34ec..48cc81f8 100644 --- a/common/src/gx_display_driver_16bpp_vertical_line_draw.c +++ b/common/src/gx_display_driver_16bpp_vertical_line_draw.c @@ -31,7 +31,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_vertical_line_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -70,6 +70,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_vertical_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos, INT width, GX_COLOR color) @@ -98,11 +102,7 @@ GX_UBYTE alpha; /* pick up starting address of canvas memory */ rowstart = (USHORT *)context -> gx_draw_context_memory; - /* calculate start of scanline */ - rowstart += context -> gx_draw_context_pitch * ystart; - - /* offset into starting pixel */ - rowstart += xpos; + GX_CALCULATE_PUTROW(rowstart, xpos, ystart, context); /* draw line from top to bottom */ for (row = 0; row < len; row++) diff --git a/common/src/gx_display_driver_16bpp_vertical_pattern_line_draw.c b/common/src/gx_display_driver_16bpp_vertical_pattern_line_draw.c index 16404336..c4f092ac 100644 --- a/common/src/gx_display_driver_16bpp_vertical_pattern_line_draw.c +++ b/common/src/gx_display_driver_16bpp_vertical_pattern_line_draw.c @@ -32,7 +32,7 @@ /* */ /* _gx_display_driver_16bpp_vertical_pattern_line_draw */ /* PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -67,6 +67,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_vertical_pattern_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos) @@ -84,11 +88,7 @@ INT len = yend - ystart + 1; /* pick up starting address of canvas memory */ rowstart = (USHORT *)context -> gx_draw_context_memory; - /* calculate start of scanline */ - rowstart += context -> gx_draw_context_pitch * ystart; - - /* offset into starting pixel */ - rowstart += xpos; + GX_CALCULATE_PUTROW(rowstart, xpos, ystart, context); /* pick up the requested pattern and mask */ pattern = context -> gx_draw_context_brush.gx_brush_line_pattern; diff --git a/common/src/gx_display_driver_24xrgb_jpeg_draw.c b/common/src/gx_display_driver_24xrgb_jpeg_draw.c index 7ed13824..042a3a65 100644 --- a/common/src/gx_display_driver_24xrgb_jpeg_draw.c +++ b/common/src/gx_display_driver_24xrgb_jpeg_draw.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_dislay_driver_24xrgb_jpeg_draw PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -70,10 +70,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed a parameter from */ /* jpeg mcu decode function, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_display_driver_24xrgb_rotated_jpeg_draw.c b/common/src/gx_display_driver_24xrgb_rotated_jpeg_draw.c index 45cea5f9..d99e22a3 100644 --- a/common/src/gx_display_driver_24xrgb_rotated_jpeg_draw.c +++ b/common/src/gx_display_driver_24xrgb_rotated_jpeg_draw.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_dislay_driver_24xrgb_rotated_jpeg_draw PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -70,10 +70,10 @@ /* DATE NAME DESCRIPTION */ /* */ /* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed a parameter from */ /* jpeg mcu decode function, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_display_driver_565rgb_canvas_blend.c b/common/src/gx_display_driver_565rgb_canvas_blend.c index 353b8100..dabdb603 100644 --- a/common/src/gx_display_driver_565rgb_canvas_blend.c +++ b/common/src/gx_display_driver_565rgb_canvas_blend.c @@ -45,7 +45,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_565rgb_canvas_blend PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -83,7 +83,9 @@ /* */ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ -/* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added canvas status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_565rgb_canvas_blend(GX_CANVAS *canvas, GX_CANVAS *composite) @@ -103,6 +105,14 @@ USHORT bcolor; INT row; INT col; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + /* Not supported. */ + return; + } +#endif + dirty.gx_rectangle_left = dirty.gx_rectangle_top = 0; dirty.gx_rectangle_right = (GX_VALUE)(canvas -> gx_canvas_x_resolution - 1); dirty.gx_rectangle_bottom = (GX_VALUE)(canvas -> gx_canvas_y_resolution - 1); diff --git a/common/src/gx_display_driver_565rgb_glyph_1bit_draw.c b/common/src/gx_display_driver_565rgb_glyph_1bit_draw.c index 2d3c8117..ec8d4294 100644 --- a/common/src/gx_display_driver_565rgb_glyph_1bit_draw.c +++ b/common/src/gx_display_driver_565rgb_glyph_1bit_draw.c @@ -50,7 +50,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_16bpp_glyph_1bit_draw PORTABLE C */ -/* 6.1.11 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -92,6 +92,10 @@ /* 04-25-2022 Ting Zhu Modified comment(s), */ /* fixed access violation bug, */ /* resulting in version 6.1.11 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_16bpp_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph) @@ -188,10 +192,9 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *, INT, INT, GX_COLOR, GX_UBYTE); y_height = (UINT)(draw_area -> gx_rectangle_bottom - draw_area -> gx_rectangle_top + 1); line_start = (USHORT *)context -> gx_draw_context_memory; - line_start += context -> gx_draw_context_pitch * (draw_area -> gx_rectangle_top); - line_start += draw_area -> gx_rectangle_left; + GX_CALCULATE_PUTROW(line_start, draw_area -> gx_rectangle_left, draw_area -> gx_rectangle_top, context); -#if defined (GX_BRUSH_ALPHA_SUPPORT) +#if defined(GX_BRUSH_ALPHA_SUPPORT) if (brush_alpha != 0xff) { yval = draw_area -> gx_rectangle_top; diff --git a/common/src/gx_display_driver_565rgb_horizontal_pixelmap_line_draw.c b/common/src/gx_display_driver_565rgb_horizontal_pixelmap_line_draw.c index f2ab8b4d..b12bb7c2 100644 --- a/common/src/gx_display_driver_565rgb_horizontal_pixelmap_line_draw.c +++ b/common/src/gx_display_driver_565rgb_horizontal_pixelmap_line_draw.c @@ -536,7 +536,7 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* */ /* _gx_display_driver_565rgb_horizontal_pixelmap_line_raw_write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.X */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -573,6 +573,10 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_horizontal_pixelmap_line_raw_write(GX_DRAW_CONTEXT *context, @@ -596,8 +600,7 @@ GX_PIXELMAP *pixelmap; if ((info -> draw) && (xstart <= xend)) { put = (USHORT *)context -> gx_draw_context_memory; - put += y * context -> gx_draw_context_pitch; - put += xstart; + GX_CALCULATE_PUTROW(put, xstart, y, context); /*calculate the offset.*/ offset = (info -> x_offset % pic_width); @@ -723,7 +726,7 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* */ /* _gx_display_driver_565rgb_horizontal_pixelmap_line_compressed_write */ /* PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -760,6 +763,10 @@ VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLO /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_display_driver_565rgb_horizontal_pixelmap_line_compressed_write(GX_DRAW_CONTEXT *context, @@ -781,7 +788,7 @@ GX_PIXELMAP *pixelmap; start_pos = xstart - (info -> x_offset % pixelmap -> gx_pixelmap_width); put = (USHORT *)context -> gx_draw_context_memory; - put += y * context -> gx_draw_context_pitch + start_pos; + GX_CALCULATE_PUTROW(put, start_pos, y, context); /*Repeat the draw operation to fill the whole dirty area.*/ while (start_pos <= xend) diff --git a/common/src/gx_display_driver_565rgb_jpeg_draw.c b/common/src/gx_display_driver_565rgb_jpeg_draw.c index a226c7da..19c2b415 100644 --- a/common/src/gx_display_driver_565rgb_jpeg_draw.c +++ b/common/src/gx_display_driver_565rgb_jpeg_draw.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_dislay_driver_565rgb_jpeg_draw PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -72,10 +72,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed a parameter from */ /* jpeg mcu decode function, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_display_driver_565rgb_pixel_blend.c b/common/src/gx_display_driver_565rgb_pixel_blend.c index d2a0eac2..dd4bccd2 100644 --- a/common/src/gx_display_driver_565rgb_pixel_blend.c +++ b/common/src/gx_display_driver_565rgb_pixel_blend.c @@ -44,7 +44,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_display_driver_565rgb_pixel_blend PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -83,6 +83,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_display_driver_565rgb_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha) @@ -94,14 +98,12 @@ GX_UBYTE balpha; USHORT bcolor; USHORT *put; - /* Is the pixel non-transparent? */ if (alpha > 0) { /* calculate address of pixel */ put = (USHORT *)context -> gx_draw_context_memory; - put += context -> gx_draw_context_pitch * y; - put += x; + GX_CALCULATE_PUTROW(put, x, y, context); /* No need to blend if alpha value is 255. */ if (alpha == 255) diff --git a/common/src/gx_display_driver_565rgb_rotated_jpeg_draw.c b/common/src/gx_display_driver_565rgb_rotated_jpeg_draw.c index beb1dfdc..382ed3c0 100644 --- a/common/src/gx_display_driver_565rgb_rotated_jpeg_draw.c +++ b/common/src/gx_display_driver_565rgb_rotated_jpeg_draw.c @@ -35,7 +35,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_dislay_driver_565rgb_jpeg_draw PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -70,10 +70,10 @@ /* DATE NAME DESCRIPTION */ /* */ /* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* removed a parameter from */ /* jpeg mcu decode function, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_display_language_table_set.c b/common/src/gx_display_language_table_set.c index 3f11055a..f3c54837 100644 --- a/common/src/gx_display_language_table_set.c +++ b/common/src/gx_display_language_table_set.c @@ -212,7 +212,7 @@ GX_CONST GX_STRING **old_table = display -> gx_display_language_table; /* FUNCTION RELEASE */ /* */ /* _gx_display_language_direction_table_set_ext PORTABLE C */ -/* 6.1.10 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -224,7 +224,7 @@ GX_CONST GX_STRING **old_table = display -> gx_display_language_table; /* INPUT */ /* */ /* display Pointer to display */ -/* language_direciton_table The language direction table */ +/* language_direction_table The language direction table */ /* to be set */ /* num_languages Number of languages in the */ /* table */ @@ -246,6 +246,8 @@ GX_CONST GX_STRING **old_table = display -> gx_display_language_table; /* DATE NAME DESCRIPTION */ /* */ /* 01-31-2022 Ting Zhu Initial Version 6.1.10 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT) diff --git a/common/src/gx_drop_list_draw.c b/common/src/gx_drop_list_draw.c index 641a9835..66dcc1b4 100644 --- a/common/src/gx_drop_list_draw.c +++ b/common/src/gx_drop_list_draw.c @@ -33,13 +33,114 @@ #include "gx_utility.h" #include "gx_drop_list.h" +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_drop_list_selected_children_draw PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function draws the children of the selected item to the drop */ +/* list client area with the specified shift values. */ +/* */ +/* INPUT */ +/* */ +/* drop_list Pointer to drop list widget */ +/* widget Widget to be drawn */ +/* xshift Shift value in x coordinate */ +/* yshift Shift value in y coordinate */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _gx_utility_rectangle_shift Shift rectangle */ +/* */ +/* CALLED BY */ +/* */ +/* _gx_drop_list_draw */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +static VOID _gx_drop_list_selected_children_draw(GX_DROP_LIST *drop_list, GX_WIDGET *widget, GX_VALUE xshift, GX_VALUE yshift) +{ +GX_WIDGET *child; +GX_WIDGET *child_child; +GX_RECTANGLE old_size; +GX_RECTANGLE old_clip; +ULONG old_style; + + /* Save the first child. */ + child = widget -> gx_widget_first_child; + + /* Draw the children. */ + while (child) + { + /* Save the widget size. */ + old_size = child -> gx_widget_size; + + /* Save the widget clip size. */ + old_clip = child -> gx_widget_clip; + + /* Save the widget style. */ + old_style = child -> gx_widget_style; + + /* Update the widget style temporarily. */ + if (drop_list -> gx_widget_status & GX_STATUS_HAS_FOCUS) + { + child -> gx_widget_style |= ~GX_STYLE_DRAW_SELECTED; + } + else + { + child -> gx_widget_style &= ~GX_STYLE_DRAW_SELECTED; + } + + /* Shift the widget size and clip with the specified shift values temporarily. */ + _gx_utility_rectangle_shift(&child -> gx_widget_size, xshift, yshift); + _gx_utility_rectangle_shift(&child -> gx_widget_clip, xshift, yshift); + + child_child = child -> gx_widget_first_child; + + /* Set the first child to NULL temporarily. */ + child -> gx_widget_first_child = GX_NULL; + + /* Draw the widget. */ + child -> gx_widget_draw_function(child); + + if (child_child) + { + child -> gx_widget_first_child = child_child; + + _gx_drop_list_selected_children_draw(drop_list, child, xshift, yshift); + } + + /* Recover the widget properties. */ + child -> gx_widget_size = old_size; + child -> gx_widget_clip = old_clip; + child -> gx_widget_style = old_style; + + child = child -> gx_widget_next; + } +} /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _gx_drop_list_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -77,32 +178,79 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* improved drawing of the */ +/* selected item, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_drop_list_draw(GX_DROP_LIST *drop_list) { GX_RECTANGLE client; GX_WIDGET *selected; -GX_WIDGET *widget; -GX_VERTICAL_LIST *list; -GX_RECTANGLE selected_size; -GX_RECTANGLE selected_clip; -ULONG selected_style; +GX_VALUE xshift; +GX_VALUE yshift; +INT selected_index; +GX_VERTICAL_LIST *list = &drop_list -> gx_drop_list_popup.gx_popup_list_list; +GX_RECTANGLE size; +GX_RECTANGLE clip; +ULONG style; +GX_WIDGET *child = GX_NULL; +GX_BOOL reuse_list_item = GX_FALSE; - widget = (GX_WIDGET *)drop_list; + /* Draw the background. */ _gx_drop_list_background_draw(drop_list); - list = (GX_VERTICAL_LIST *)&drop_list -> gx_drop_list_popup.gx_popup_list_list; + /* Pick the selected item. */ _gx_vertical_list_selected_widget_get(list, &selected); + if (!selected && list -> gx_vertical_list_callback) + { + /* If not be able to retrieve the selected widget, its possible that the selcted item + has been reused for displaying the other list items during the scrolling. + In this case, try to get the selected index first, then reuse the list child to draw the selected item. */ + + /* Get the selected index. */ + _gx_vertical_list_selected_index_get(list, &selected_index); + + if((selected_index >= 0) && (selected_index < list -> gx_vertical_list_total_rows)) + { + /* Make the first list child as the selected widget temporarily. */ + selected = _gx_widget_first_client_child_get((GX_WIDGET *)list); + + /* Call the list callback function to create the selected widget. */ + list -> gx_vertical_list_callback(list, selected, selected_index); + + reuse_list_item = GX_TRUE; + } + } + if (selected) { - /* draw the selected widget into my client area: */ - _gx_widget_client_get(widget, -1, &client); - selected_size = selected -> gx_widget_size; - selected_clip = selected -> gx_widget_clip; - selected_style = selected -> gx_widget_style; + _gx_widget_client_get((GX_WIDGET *)drop_list, -1, &client); + + size = selected -> gx_widget_size; + clip = selected -> gx_widget_clip; + + if (selected -> gx_widget_first_child) + { + child = selected -> gx_widget_first_child; + selected -> gx_widget_first_child = GX_NULL; + + /* Calculate the distance from the selected widget to the client area. */ + xshift = (GX_VALUE)(client.gx_rectangle_left - size.gx_rectangle_left); + yshift = (GX_VALUE)((client.gx_rectangle_bottom + client.gx_rectangle_top - size.gx_rectangle_bottom - size.gx_rectangle_top) >> 1); + } + + selected -> gx_widget_size = client; + selected -> gx_widget_clip = client; + + + /* Save the widget style. */ + style = selected -> gx_widget_style; + + /* Update the widget style temporarily. */ if (drop_list -> gx_widget_status & GX_STATUS_HAS_FOCUS) { selected -> gx_widget_style |= ~GX_STYLE_DRAW_SELECTED; @@ -111,14 +259,29 @@ ULONG selected_style; { selected -> gx_widget_style &= ~GX_STYLE_DRAW_SELECTED; } - selected -> gx_widget_size = client; - selected -> gx_widget_clip = client; + selected -> gx_widget_draw_function(selected); - selected -> gx_widget_size = selected_size; - selected -> gx_widget_clip = selected_clip; - selected -> gx_widget_style = selected_style; + + if (child) + { + selected -> gx_widget_first_child = child; + + /* Draw the selected widget into my client area: */ + _gx_drop_list_selected_children_draw(drop_list, selected, xshift, yshift); + } + + selected -> gx_widget_size = size; + selected -> gx_widget_clip = clip; + selected -> gx_widget_style = style; + } + + if (reuse_list_item) + { + /* Call the list callback funtion to create the widget with its original index. */ + list -> gx_vertical_list_callback(list, selected, list -> gx_vertical_list_top_index); } - _gx_widget_children_draw(widget); + /* Draw the children. */ + _gx_widget_children_draw((GX_WIDGET *)drop_list); } diff --git a/common/src/gx_image_reader_image_decode.c b/common/src/gx_image_reader_image_decode.c index 3910e13c..94c193af 100644 --- a/common/src/gx_image_reader_image_decode.c +++ b/common/src/gx_image_reader_image_decode.c @@ -108,7 +108,7 @@ GX_CONST GX_UBYTE *buffer; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_image_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -143,10 +143,10 @@ GX_CONST GX_UBYTE *buffer; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* modified jpeg decode */ /* function parameter list, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_SOFTWARE_DECODER_SUPPORT) diff --git a/common/src/gx_image_reader_jpeg_decode.c b/common/src/gx_image_reader_jpeg_decode.c index 4db1e52e..df0adc8f 100644 --- a/common/src/gx_image_reader_jpeg_decode.c +++ b/common/src/gx_image_reader_jpeg_decode.c @@ -178,7 +178,7 @@ INT index; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_huffcode_find PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -221,9 +221,9 @@ INT index; /* changed bit_count to */ /* GX_VALUE data type, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_huffcode_find(GX_JPEG_INFO *jpeg_info, @@ -266,7 +266,7 @@ GX_HUFFCODE_INFO *code_info; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_huffman_table_set PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -303,9 +303,9 @@ GX_HUFFCODE_INFO *code_info; /* added range test to prevent */ /* underflow, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_huffman_table_set(GX_JPEG_INFO *jpeg_info, UINT segment_len) @@ -554,7 +554,7 @@ INT index; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_dc_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -595,9 +595,9 @@ INT index; /* 10-31-2022 Kenneth Maxwell Modified comment(s), */ /* added range test, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_dc_decode(GX_JPEG_INFO *jpeg_info, UINT i_component) @@ -654,7 +654,7 @@ GX_BOOL negative; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_ac_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -695,9 +695,9 @@ GX_BOOL negative; /* 10-31-2022 Kenneth Maxwell Modified comment(s), */ /* added range test, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_ac_decode(GX_JPEG_INFO *jpeg_info, UINT i_component) @@ -834,7 +834,7 @@ INT negative; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_dequantize_idct PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -891,7 +891,7 @@ INT negative; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_dequantize_idct(INT *block, INT *quant_table, GX_BYTE *out, INT stride) @@ -1099,7 +1099,7 @@ int16_t const *base; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_1d_idct PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -1135,9 +1135,9 @@ int16_t const *base; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_1d_idct(INT *input_data, INT *output_data, INT post_scale, INT round) @@ -1190,7 +1190,7 @@ INT t; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_dequantize_idct PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -1234,9 +1234,9 @@ INT t; /* added range check for */ /* table_index, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_dequantize_idct(INT *block, INT *quant_table, GX_BYTE *out, INT stride) @@ -1291,7 +1291,7 @@ INT row; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_one_block_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -1332,9 +1332,9 @@ INT row; /* returned result of */ /* dequantize_idct, */ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_one_block_decode(GX_JPEG_INFO *jpeg_info, UINT i_component, GX_BYTE *block_data) @@ -1386,7 +1386,7 @@ INT stride; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_24xrgb_pixel_write_helium PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1423,34 +1423,18 @@ INT stride; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_24xrgb_pixel_write_helium(GX_JPEG_INFO *jpeg_info, uint8x16_t vred, uint8x16_t vgreen, uint8x16_t vblue, INT size) { -static uint8x16_t voffset = {0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60}; -static uint8x16_t valpha = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -mve_pred16_t p; +INT index; - if (size == 16) - { - vstrbq_scatter_offset_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vblue); - vstrbq_scatter_offset_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vgreen); - vstrbq_scatter_offset_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vred); - vstrbq_scatter_offset_u8(jpeg_info -> gx_jpeg_putdata++, voffset, valpha); - - jpeg_info -> gx_jpeg_putdata += 60; - } - else + for(index = 0; index < size; index++) { - /* Write the specified size of RGB values to memory. */ - p = 0xffff >> (16 - size); - vstrbq_scatter_offset_p_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vblue, p); - vstrbq_scatter_offset_p_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vgreen, p); - vstrbq_scatter_offset_p_u8(jpeg_info -> gx_jpeg_putdata++, voffset, vred, p); - vstrbq_scatter_offset_p_u8(jpeg_info -> gx_jpeg_putdata++, voffset, valpha, p); + *((GX_COLOR *)jpeg_info -> gx_jpeg_putdata) = 0xff000000 | ((ULONG)vred[index] << 16) | ((ULONG)vgreen[index] << 8) | (ULONG)vblue[index]; - jpeg_info -> gx_jpeg_putdata += ((size - 1) << 2); + jpeg_info -> gx_jpeg_putdata += 4; } } #else @@ -1459,7 +1443,7 @@ mve_pred16_t p; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_1555xrgb_pixel_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1492,7 +1476,7 @@ mve_pred16_t p; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_24xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue) @@ -1509,7 +1493,7 @@ static VOID _gx_image_reader_jpeg_24xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_24bpp_pixel_write_helium PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1547,7 +1531,7 @@ static VOID _gx_image_reader_jpeg_24xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_24bpp_pixel_write_helium(GX_JPEG_INFO *jpeg_info, uint8x16_t vred, uint8x16_t vgreen, uint8x16_t vblue, INT size) @@ -1578,7 +1562,7 @@ mve_pred16_t p; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_24bpp_pixel_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1611,7 +1595,7 @@ mve_pred16_t p; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_24bpp_pixel_write(GX_JPEG_INFO *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue) @@ -1628,7 +1612,7 @@ static VOID _gx_image_reader_jpeg_24bpp_pixel_write(GX_JPEG_INFO *jpeg_info, GX_ /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_565rgb_pixel_write_helium PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1672,7 +1656,7 @@ static VOID _gx_image_reader_jpeg_24bpp_pixel_write(GX_JPEG_INFO *jpeg_info, GX_ /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_565rgb_pixel_write_helium(GX_JPEG_INFO *jpeg_info, uint8x16_t vred, uint8x16_t vgreen, uint8x16_t vblue, INT size) @@ -1729,7 +1713,7 @@ GX_UBYTE blue[16]; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_1555xrgb_pixel_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1762,7 +1746,7 @@ GX_UBYTE blue[16]; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_565rgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue) @@ -1783,7 +1767,7 @@ static VOID _gx_image_reader_jpeg_565rgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_1555xrgb_pixel_write_helium PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1827,7 +1811,7 @@ static VOID _gx_image_reader_jpeg_565rgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_1555xrgb_pixel_write_helium(GX_JPEG_INFO *jpeg_info, uint8x16_t vred, uint8x16_t vgreen, uint8x16_t vblue, INT size) @@ -1884,7 +1868,7 @@ GX_UBYTE blue[16]; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_1555xrgb_pixel_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1917,7 +1901,7 @@ GX_UBYTE blue[16]; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static VOID _gx_image_reader_jpeg_1555xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue) @@ -1937,7 +1921,7 @@ static VOID _gx_image_reader_jpeg_1555xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_pixel_write_info_set PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -1979,7 +1963,7 @@ static VOID _gx_image_reader_jpeg_1555xrgb_pixel_write(GX_JPEG_INFO *jpeg_info, /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_pixel_write_info_set(GX_JPEG_INFO *jpeg_info) @@ -2063,7 +2047,7 @@ static UINT _gx_image_reader_jpeg_pixel_write_info_set(GX_JPEG_INFO *jpeg_info) /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_one_mcu_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -2103,9 +2087,11 @@ static UINT _gx_image_reader_jpeg_pixel_write_info_set(GX_JPEG_INFO *jpeg_info) /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* added Helium support, */ -/* resulting in version 6.x */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_one_mcu_write(GX_JPEG_INFO *jpeg_info, INT xpos, INT ypos, INT h, INT v) @@ -2162,8 +2148,13 @@ INT blue; } put = (GX_UBYTE *)jpeg_info -> gx_jpeg_output_buffer; +#if defined(GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER) + put += (ypos + ystart - jpeg_info -> gx_jpeg_output_buffer_offset_y) * jpeg_info -> gx_jpeg_output_stride; + put += (xpos + xstart - jpeg_info -> gx_jpeg_output_buffer_offset_x) * jpeg_info -> gx_jpeg_output_bpp; +#else put += (ypos + ystart) * jpeg_info -> gx_jpeg_output_stride; put += (xpos + xstart) * jpeg_info -> gx_jpeg_output_bpp; +#endif #if defined(GX_ENABLE_ARM_HELIUM) index = (h == 1 ? 0 : (h - 1 + (xstart % h))); @@ -2224,7 +2215,7 @@ INT blue; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_one_mcu_rotated_write PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Ting Zhu, Microsoft Corporation */ @@ -2261,7 +2252,7 @@ INT blue; /* */ /* DATE NAME DESCRIPTION */ /* */ -/* xx-xx-xxxx Ting Zhu Initial Version 6.x */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_one_mcu_rotated_write(GX_JPEG_INFO *jpeg_info, INT xpos, INT ypos, INT h, INT v) @@ -2427,7 +2418,7 @@ GX_BYTE sign = 1; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_decompress PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -2465,9 +2456,9 @@ GX_BYTE sign = 1; /* 10-31-2022 Kenneth Maxwell Modified comment(s), */ /* abort if block decode fails,*/ /* resulting in version 6.2.0 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_decompress(GX_JPEG_INFO *jpeg_info) @@ -2542,7 +2533,7 @@ UINT (*one_mcu_write)(GX_JPEG_INFO *jpeg_info, INT xpos, INT ypos, INT h, INT v) /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_decode_blocks PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -2584,9 +2575,9 @@ UINT (*one_mcu_write)(GX_JPEG_INFO *jpeg_info, INT xpos, INT ypos, INT h, INT v) /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), removed */ +/* 10-31-2023 Ting Zhu Modified comment(s), removed */ /* huffman table free logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ static UINT _gx_image_reader_jpeg_decode_blocks(GX_JPEG_INFO *jpeg_info) @@ -2689,7 +2680,7 @@ UINT status = GX_SUCCESS; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -2724,9 +2715,9 @@ UINT status = GX_SUCCESS; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_image_reader_jpeg_decode(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap) @@ -2794,7 +2785,7 @@ GX_JPEG_INFO *jpeg_info; /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_jpeg_mcu_decode PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -2833,9 +2824,9 @@ GX_JPEG_INFO *jpeg_info; /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_image_reader_jpeg_mcu_decode(GX_CONST GX_UBYTE *read_data, ULONG data_size, @@ -2871,8 +2862,15 @@ GX_JPEG_INFO *jpeg_info; jpeg_info -> gx_jpeg_output_color_format = context -> gx_draw_context_display -> gx_display_color_format; jpeg_info -> gx_jpeg_output_rotation_angle = context -> gx_draw_context_display -> gx_display_rotation_angle; jpeg_info -> gx_jpeg_output_buffer = (GX_UBYTE *)context -> gx_draw_context_memory; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + jpeg_info -> gx_jpeg_output_width = (USHORT)context -> gx_draw_context_canvas -> gx_canvas_memory_width; + jpeg_info -> gx_jpeg_output_height = (USHORT)context -> gx_draw_context_canvas -> gx_canvas_memory_height; + jpeg_info -> gx_jpeg_output_buffer_offset_x = context -> gx_draw_context_offset_x; + jpeg_info -> gx_jpeg_output_buffer_offset_y = context -> gx_draw_context_offset_y; +#else jpeg_info -> gx_jpeg_output_width = (USHORT)context -> gx_draw_context_canvas -> gx_canvas_x_resolution; jpeg_info -> gx_jpeg_output_height = (USHORT)context -> gx_draw_context_canvas -> gx_canvas_y_resolution; +#endif jpeg_info -> gx_jpeg_output_clip = *context -> gx_draw_context_clip; diff --git a/common/src/gx_image_reader_start.c b/common/src/gx_image_reader_start.c index 6249909f..e5d5bc63 100644 --- a/common/src/gx_image_reader_start.c +++ b/common/src/gx_image_reader_start.c @@ -292,7 +292,7 @@ static UINT _gx_image_reader_pixelmap_info_set(GX_IMAGE_READER *image_reader, GX /* FUNCTION RELEASE */ /* */ /* _gx_image_reader_start PORTABLE C */ -/* 6.x */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -340,9 +340,9 @@ static UINT _gx_image_reader_pixelmap_info_set(GX_IMAGE_READER *image_reader, GX /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ -/* xx-xx-xxxx Ting Zhu Modified comment(s), */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ /* improved logic, */ -/* resulting in version 6.x */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_image_reader_start(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap) diff --git a/common/src/gx_multi_line_text_button_text_set.c b/common/src/gx_multi_line_text_button_text_set.c index 7ec818c2..83837125 100644 --- a/common/src/gx_multi_line_text_button_text_set.c +++ b/common/src/gx_multi_line_text_button_text_set.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_multi_line_text_button_text_set PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -67,14 +67,24 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added return status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ #if defined(GX_ENABLE_DEPRECATED_STRING_API) UINT _gx_multi_line_text_button_text_set(GX_MULTI_LINE_TEXT_BUTTON *button, GX_CONST GX_CHAR *text) { - _gx_text_button_text_set((GX_TEXT_BUTTON *)button, text); - _gx_multi_line_text_button_line_pointers_set(button); - return GX_SUCCESS; +UINT status; + + status = _gx_text_button_text_set((GX_TEXT_BUTTON *)button, text); + + if (status == GX_SUCCESS) + { + _gx_multi_line_text_button_line_pointers_set(button); + } + + return status; } #endif @@ -83,7 +93,7 @@ UINT _gx_multi_line_text_button_text_set(GX_MULTI_LINE_TEXT_BUTTON *button, GX_ /* FUNCTION RELEASE */ /* */ /* _gx_multi_line_text_button_text_set_ext PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -117,11 +127,20 @@ UINT _gx_multi_line_text_button_text_set(GX_MULTI_LINE_TEXT_BUTTON *button, GX_ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added return status check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_multi_line_text_button_text_set_ext(GX_MULTI_LINE_TEXT_BUTTON *button, GX_CONST GX_STRING *text) { - _gx_text_button_text_set_ext((GX_TEXT_BUTTON *)button, text); - _gx_multi_line_text_button_line_pointers_set(button); - return GX_SUCCESS; +UINT status; + + status = _gx_text_button_text_set_ext((GX_TEXT_BUTTON *)button, text); + + if (status == GX_SUCCESS) + { + _gx_multi_line_text_button_line_pointers_set(button); + } + return status; } diff --git a/common/src/gx_scrollbar_draw.c b/common/src/gx_scrollbar_draw.c index 708d6832..ea0c62af 100644 --- a/common/src/gx_scrollbar_draw.c +++ b/common/src/gx_scrollbar_draw.c @@ -37,7 +37,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_scrollbar_draw PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -83,6 +83,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* improved logic, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ VOID _gx_scrollbar_draw(GX_SCROLLBAR *scrollbar) @@ -216,13 +219,15 @@ GX_COLOR fill_color; /* Reset dirty area temporarily to avoid cover the end pixelmap area. */ old_dirty = _gx_system_current_draw_context -> gx_draw_context_dirty; - _gx_utility_rectangle_combine(&old_dirty, &size); - _gx_system_current_draw_context -> gx_draw_context_dirty = size; + if(_gx_utility_rectangle_overlap_detect(&old_dirty, &size, &size) == GX_TRUE) + { + _gx_system_current_draw_context -> gx_draw_context_dirty = size; - _gx_canvas_pixelmap_draw(xpos, ypos, map); + _gx_canvas_pixelmap_draw(xpos, ypos, map); - /* Set dirty area back. */ - _gx_system_current_draw_context -> gx_draw_context_dirty = old_dirty; + /* Set dirty area back. */ + _gx_system_current_draw_context -> gx_draw_context_dirty = old_dirty; + } } } } diff --git a/common/src/gx_system_canvas_refresh.c b/common/src/gx_system_canvas_refresh.c index 70d5b213..d79691de 100644 --- a/common/src/gx_system_canvas_refresh.c +++ b/common/src/gx_system_canvas_refresh.c @@ -30,13 +30,217 @@ #include "gx_widget.h" #include "gx_utility.h" +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gx_system_canvas_draw_partial_canvas PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function draws the dirty area of the specified canvas with */ +/* partial canvas buffer and toggle the dirty area to the display or */ +/* a composite canvas. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _gx_system_dirty_list_trim Trim dirty area list */ +/* _gx_canvas_drawing_initiate Initiate drawing on canvas */ +/* _gx_widget_children_draw Draw widgets children */ +/* [gx_widget_draw_function] Call widget's drawing function*/ +/* _gx_canvas_drawing_complete Complete drawing on canvas */ +/* _gx_system_canvas_toggle Toggle the frame buffer */ +/* _gx_utility_rectangle_shift Shift a rectangle */ +/* */ +/* CALLED BY */ +/* */ +/* _gx_system_canvas_refresh */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER +static UINT _gx_system_canvas_draw_partial_canvas(GX_WINDOW_ROOT *root) +{ +UINT status = GX_SUCCESS; +GX_RECTANGLE dirty_sum; +GX_RECTANGLE dirty_frame; +UINT index; +GX_WIDGET *drawit; +GX_DIRTY_AREA *dirty_list_entry; +GX_CANVAS *canvas = root -> gx_window_root_canvas; +GX_VALUE dirty_width; +GX_VALUE dirty_height; + +#if defined(GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL) || defined(GX_CANVAS_REFRESH_DIRECTION_VERTICAL) +GX_RECTANGLE dirty_mask; + + if (_gx_system_dirty_list_trim(&dirty_sum, root) == GX_FALSE) + { + return GX_SUCCESS; + } + + dirty_mask = dirty_sum; +#endif + + /* Refresh canvas in the dirty area. */ + if (canvas -> gx_canvas_draw_count > 0) + { + _gx_system_dirty_partial_add((GX_WIDGET *)root, &canvas -> gx_canvas_dirty_area); + canvas -> gx_canvas_draw_count = 0; + } + +#if defined(GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL) + dirty_height = (GX_VALUE)(dirty_sum.gx_rectangle_bottom - dirty_sum.gx_rectangle_top + 1); + dirty_width = (GX_VALUE)(canvas -> gx_canvas_memory_size / canvas -> gx_canvas_display -> gx_display_driver_row_pitch_get((USHORT)dirty_height)); + dirty_width = (GX_VALUE)(dirty_width & 0xFFFC); + dirty_mask.gx_rectangle_right = (GX_VALUE)(dirty_mask.gx_rectangle_left + dirty_width - 1); + + while (dirty_mask.gx_rectangle_left <= dirty_sum.gx_rectangle_right) + { + if (dirty_mask.gx_rectangle_right > dirty_sum.gx_rectangle_right) + { + dirty_mask.gx_rectangle_right = dirty_sum.gx_rectangle_right; + } +#elif defined(GX_CANVAS_REFRESH_DIRECTION_VERTICAL) + dirty_width = (GX_VALUE)(dirty_sum.gx_rectangle_right - dirty_sum.gx_rectangle_left + 1); + dirty_height = (GX_VALUE)(canvas -> gx_canvas_memory_size / canvas -> gx_canvas_display -> gx_display_driver_row_pitch_get((USHORT)((dirty_width + 3) & 0xFFFC))); + dirty_mask.gx_rectangle_bottom = (GX_VALUE)(dirty_mask.gx_rectangle_top + dirty_height - 1); + + while (dirty_mask.gx_rectangle_top <= dirty_sum.gx_rectangle_bottom) + { + if (dirty_mask.gx_rectangle_bottom > dirty_sum.gx_rectangle_bottom) + { + dirty_mask.gx_rectangle_bottom = dirty_sum.gx_rectangle_bottom; + } +#endif + + /* Initialize dirty area pointers. */ + dirty_list_entry = canvas -> gx_canvas_dirty_list; + + /* Loop through dirty areas to redraw as needed. */ + for (index = 0; index < canvas -> gx_canvas_dirty_count; index++) + { + /* Pickup widget associated with dirty area. */ + drawit = dirty_list_entry -> gx_dirty_area_widget; + + /* Is the widget pointer valid? */ + + if (drawit && (drawit -> gx_widget_status & GX_STATUS_VISIBLE)) + { + /* if the object is transparent, we need to draw the parent. + This should not happen, because dircty_partial_add checks + for transparency, but just for safety we test again here */ + + if (drawit -> gx_widget_status & GX_STATUS_TRANSPARENT || + drawit -> gx_widget_style & (GX_STYLE_BORDER_RAISED | GX_STYLE_BORDER_RECESSED)) + { + while (drawit -> gx_widget_parent) + { + drawit = drawit -> gx_widget_parent; + + if (!(drawit -> gx_widget_status & GX_STATUS_TRANSPARENT)) + { + /* we need to start drawing at this non-transparent + background widget */ + + drawit -> gx_widget_status |= GX_STATUS_DIRTY; + break; + } + } + } + +#if defined(GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL) || defined(GX_CANVAS_REFRESH_DIRECTION_VERTICAL) + if (_gx_utility_rectangle_overlap_detect(&dirty_list_entry -> gx_dirty_area_rectangle, &dirty_mask, &dirty_frame) == GX_TRUE && + _gx_utility_rectangle_overlap_detect(&dirty_frame, &drawit -> gx_widget_clip, &dirty_frame) == GX_TRUE) + { +#else + dirty_sum = dirty_list_entry -> gx_dirty_area_rectangle; + if (_gx_utility_rectangle_overlap_detect(&dirty_sum, &drawit -> gx_widget_clip, &dirty_sum) == GX_TRUE) + { + dirty_frame = dirty_sum; + + /* Split dirty area into small pieces. */ + dirty_width = (GX_VALUE)(dirty_frame.gx_rectangle_right - dirty_frame.gx_rectangle_left + 1); + dirty_height = (GX_VALUE)(canvas -> gx_canvas_memory_size / canvas -> gx_canvas_display -> gx_display_driver_row_pitch_get((USHORT)((dirty_width + 3) & 0xFFFC))); + dirty_frame.gx_rectangle_bottom = (GX_VALUE)(dirty_frame.gx_rectangle_top + dirty_height - 1); + + while (dirty_frame.gx_rectangle_top <= dirty_sum.gx_rectangle_bottom) + { + if (dirty_frame.gx_rectangle_bottom > dirty_sum.gx_rectangle_bottom) + { + dirty_frame.gx_rectangle_bottom = dirty_sum.gx_rectangle_bottom; + } +#endif + + /* Initiate drawing on this canvas. */ + status = _gx_canvas_drawing_initiate(canvas, drawit, &dirty_frame); + + if (status == GX_NO_VIEWS) + { + /* If we are attempting to draw the root window and it has no views, + just draw the children of the root */ + + if (drawit -> gx_widget_type == GX_TYPE_ROOT_WINDOW) + { + _gx_widget_children_draw(drawit); + } + } + else + { + drawit -> gx_widget_draw_function(drawit); + } + + /* Indicate that drawing on this canvas is complete. */ + _gx_canvas_drawing_complete(canvas, GX_TRUE); + +#if !defined(GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL) && !defined(GX_CANVAS_REFRESH_DIRECTION_VERTICAL) + _gx_utility_rectangle_shift(&dirty_frame, 0, dirty_height); + } +#endif + } + } + + /* Move to the next dirty area. */ + dirty_list_entry++; + } + +#ifdef GX_CANVAS_REFRESH_DIRECTION_HORIZONTAL + _gx_utility_rectangle_shift(&dirty_mask, dirty_width, 0); +} +#elif defined(GX_CANVAS_REFRESH_DIRECTION_VERTICAL) + _gx_utility_rectangle_shift(&dirty_mask, 0, dirty_height); +} +#endif + +canvas -> gx_canvas_dirty_count = 0; + +return GX_SUCCESS; +} +#endif /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _gx_system_canvas_refresh PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -77,6 +281,10 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added partial canvas buffer */ +/* support, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_system_canvas_refresh(VOID) @@ -119,6 +327,15 @@ GX_WINDOW_ROOT *root; /* pick up the canvas pointer */ canvas = root -> gx_window_root_canvas; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + if (canvas -> gx_canvas_status & GX_CANVAS_PARTIAL_FRAME_BUFFER) + { + _gx_system_canvas_draw_partial_canvas(root); + root = (GX_WINDOW_ROOT *)root -> gx_widget_next; + continue; + } +#endif + /* Trim any redundant dirty areas prior to doing the update. */ if (_gx_system_dirty_list_trim(&dirty_sum, root)) { @@ -126,20 +343,20 @@ GX_WINDOW_ROOT *root; _gx_canvas_drawing_initiate(canvas, (GX_WIDGET *)root, &dirty_sum); /* Initialize dirty area pointers. */ - dirty = canvas -> gx_canvas_dirty_list; + dirty = canvas -> gx_canvas_dirty_list; /* Loop through dirty areas to redraw as needed. */ for (index = 0; index < canvas -> gx_canvas_dirty_count; index++) { /* Pickup widget associated with dirty area. */ - drawit = dirty -> gx_dirty_area_widget; + drawit = dirty -> gx_dirty_area_widget; /* Is the widget pointer valid? */ if (drawit) { /* if the object is transparent, we need to draw the parent. - This should not happen, because dircty_partial_add checks + This should not happen, because dircty_partial_add checks for transparency, but just for safety we test again here */ if (drawit -> gx_widget_status & GX_STATUS_TRANSPARENT) @@ -152,7 +369,7 @@ GX_WINDOW_ROOT *root; { /* we need to start drawing at this non-transparent background widget */ - + drawit -> gx_widget_status |= GX_STATUS_DIRTY; break; } @@ -196,7 +413,7 @@ GX_WINDOW_ROOT *root; if (_gx_canvas_composite_create(&canvas)) { - if(canvas -> gx_canvas_draw_count > 0) + if (canvas -> gx_canvas_draw_count > 0) { canvas -> gx_canvas_display -> gx_display_driver_buffer_toggle(canvas, &canvas -> gx_canvas_dirty_area); canvas -> gx_canvas_draw_count = 0; diff --git a/common/src/gx_window_root_create.c b/common/src/gx_window_root_create.c index 83f3c6ec..10ee979e 100644 --- a/common/src/gx_window_root_create.c +++ b/common/src/gx_window_root_create.c @@ -34,7 +34,7 @@ /* FUNCTION RELEASE */ /* */ /* _gx_window_root_create PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -74,6 +74,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* updated the link logic, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gx_window_root_create(GX_WINDOW_ROOT *root_window, GX_CONST GX_CHAR *name, @@ -97,15 +100,21 @@ UINT _gx_window_root_create(GX_WINDOW_ROOT *root_window, GX_CONST GX_CHAR *name root_window -> gx_widget_status &= ~GX_STATUS_MOVABLE; root_window -> gx_widget_event_process_function = (UINT (*)(GX_WIDGET *, GX_EVENT *))_gx_window_root_event_process; + GX_ENTER_CRITICAL + if (_gx_system_root_window_created_list) { /* link this root to the one previously created */ root_window -> gx_widget_next = (GX_WIDGET *)_gx_system_root_window_created_list; + + _gx_system_root_window_created_list -> gx_widget_previous = (GX_WIDGET *)root_window; } /* Update the root window pointer */ _gx_system_root_window_created_list = root_window; + GX_EXIT_CRITICAL + /* Return the status from window create. */ return(GX_SUCCESS); } diff --git a/common/src/gxe_animation_start.c b/common/src/gxe_animation_start.c index ef517ccd..aeffe635 100644 --- a/common/src/gxe_animation_start.c +++ b/common/src/gxe_animation_start.c @@ -30,13 +30,15 @@ #include "gx_canvas.h" #include "gx_animation.h" +/* Bring in externs for caller checking code. */ +GX_CALLER_CHECKING_EXTERNS /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _gxe_animation_start PORTABLE C */ -/* 6.1.7 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -74,10 +76,15 @@ /* 06-02-2021 Ting Zhu Modified comment(s), */ /* removed unnecessary check, */ /* resulting in version 6.1.7 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added caller check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gxe_animation_start(GX_ANIMATION *animation, GX_ANIMATION_INFO *info) { + /* Check for appropriate caller. */ + GX_INIT_AND_THREADS_CALLER_CHECKING if (animation == GX_NULL || info == GX_NULL) diff --git a/common/src/gxe_binres_font_load.c b/common/src/gxe_binres_font_load.c new file mode 100644 index 00000000..3dbbf681 --- /dev/null +++ b/common/src/gxe_binres_font_load.c @@ -0,0 +1,89 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** GUIX Component */ +/** */ +/** Binres Loader Management (Binres Loader) */ +/** */ +/**************************************************************************/ + +#define GX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "gx_api.h" +#include "gx_binres_loader.h" +#include "gx_system.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gxe_binres_font_load PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function checks for errors in binres font load function. */ +/* */ +/* INPUT */ +/* */ +/* root_address Pointer to the binary data */ +/* memory */ +/* font_index Resource index of the font */ +/* to be loaded */ +/* buffer Pointer to the buffer to */ +/* store the loaded font */ +/* buffer_size Size of the buffer. It will */ +/* be overwritten with the */ +/* required buffer size if the */ +/* input buffer size is */ +/* insufficient */ +/* */ +/* OUTPUT */ +/* */ +/* status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_font_load The actual binres font load */ +/* function */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +UINT _gxe_binres_font_load(GX_UBYTE *root_address, UINT font_index, GX_UBYTE *buffer, ULONG *buffer_size) +{ + if (root_address == GX_NULL || buffer == GX_NULL || buffer_size == GX_NULL) + { + return GX_PTR_ERROR; + } + + return _gx_binres_font_load(root_address, font_index, buffer, buffer_size); +} + diff --git a/common/src/gxe_binres_pixelmap_load.c b/common/src/gxe_binres_pixelmap_load.c new file mode 100644 index 00000000..b62a28f9 --- /dev/null +++ b/common/src/gxe_binres_pixelmap_load.c @@ -0,0 +1,84 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** GUIX Component */ +/** */ +/** Binres Loader Management (Binres Loader) */ +/** */ +/**************************************************************************/ + +#define GX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "gx_api.h" +#include "gx_binres_loader.h" +#include "gx_system.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _gxe_binres_pixelmap_load PORTABLE C */ +/* 6.3.0 */ +/* AUTHOR */ +/* */ +/* Ting Zhu, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function checks for errors in binres pixelmap load function. */ +/* */ +/* INPUT */ +/* */ +/* root_address Pointer to the binary data */ +/* memory */ +/* map_index Resource index of the pixelmap*/ +/* to be loaded */ +/* pixelmap Pointer to the returned */ +/* pixelmap */ +/* */ +/* OUTPUT */ +/* */ +/* status Completion status */ +/* */ +/* CALLS */ +/* */ +/* _gx_binres_pixelmap_load The actual binres pixelmap */ +/* load function */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 10-31-2023 Ting Zhu Initial Version 6.3.0 */ +/* */ +/**************************************************************************/ +UINT _gxe_binres_pixelmap_load(GX_UBYTE *root_address, UINT map_index, GX_PIXELMAP *pixelmap) +{ + if (root_address == GX_NULL || pixelmap == GX_NULL) + { + return GX_PTR_ERROR; + } + + return _gx_binres_pixelmap_load(root_address, map_index, pixelmap); +} + diff --git a/common/src/gxe_canvas_create.c b/common/src/gxe_canvas_create.c index a949d743..5010dfb4 100644 --- a/common/src/gxe_canvas_create.c +++ b/common/src/gxe_canvas_create.c @@ -38,7 +38,7 @@ GX_CALLER_CHECKING_EXTERNS /* FUNCTION RELEASE */ /* */ /* _gxe_canvas_create PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -80,6 +80,10 @@ GX_CALLER_CHECKING_EXTERNS /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), verify */ +/* the memory size only when */ +/* memory_area is provided, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gxe_canvas_create(GX_CANVAS *canvas, GX_CONST GX_CHAR *name, GX_DISPLAY *display, UINT type, @@ -109,10 +113,13 @@ UINT pitch; return(GX_ALREADY_CREATED); } - pitch = (UINT)(display -> gx_display_driver_row_pitch_get((USHORT)width)); - if (memory_size < pitch * height) + if (memory_area) { - return GX_INVALID_SIZE; + pitch = (UINT)(display -> gx_display_driver_row_pitch_get((USHORT)width)); + if (memory_size < pitch * height) + { + return GX_INVALID_SIZE; + } } if (type & (~((UINT)(GX_CANVAS_SIMPLE | GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE | diff --git a/common/src/gxe_checkbox_pixelmap_set.c b/common/src/gxe_checkbox_pixelmap_set.c index 6b9c2798..77653cce 100644 --- a/common/src/gxe_checkbox_pixelmap_set.c +++ b/common/src/gxe_checkbox_pixelmap_set.c @@ -36,7 +36,7 @@ /* FUNCTION RELEASE */ /* */ /* _gxe_checkbox_pixelmap_set PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -80,6 +80,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added invalid widget check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gxe_checkbox_pixelmap_set(GX_CHECKBOX *checkbox, @@ -96,6 +99,12 @@ UINT status; return(GX_PTR_ERROR); } + /* Check for the invalid widget. */ + if (checkbox -> gx_widget_type == 0) + { + return(GX_INVALID_WIDGET); + } + status = _gx_checkbox_pixelmap_set(checkbox, unchecked_id, checked_id, unchecked_disabled_id, checked_disabled_id); diff --git a/common/src/gxe_scrollbar_reset.c b/common/src/gxe_scrollbar_reset.c index ae5426e2..84b2ba5c 100644 --- a/common/src/gxe_scrollbar_reset.c +++ b/common/src/gxe_scrollbar_reset.c @@ -34,7 +34,7 @@ GX_CALLER_CHECKING_EXTERNS /* FUNCTION RELEASE */ /* */ /* _gxe_scrollbar_reset PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -71,6 +71,8 @@ GX_CALLER_CHECKING_EXTERNS /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gxe_scrollbar_reset(GX_SCROLLBAR *scrollbar, GX_SCROLL_INFO *info) @@ -92,7 +94,7 @@ UINT status; return(GX_INVALID_WIDGET); } - /* Check fro valid scroll info. */ + /* Check for valid scroll info. */ if ((info != GX_NULL) && ((info -> gx_scroll_value > info -> gx_scroll_maximum) || (info -> gx_scroll_value < info -> gx_scroll_minimum))) { diff --git a/common/src/gxe_text_input_cursor_height_set.c b/common/src/gxe_text_input_cursor_height_set.c index 272e01f8..83d23645 100644 --- a/common/src/gxe_text_input_cursor_height_set.c +++ b/common/src/gxe_text_input_cursor_height_set.c @@ -33,7 +33,7 @@ /* FUNCTION RELEASE */ /* */ /* _gxe_text_input_cursor_height_set PORTABLE C */ -/* 6.1 */ +/* 6.3.0 */ /* AUTHOR */ /* */ /* Kenneth Maxwell, Microsoft Corporation */ @@ -71,6 +71,9 @@ /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */ /* 09-30-2020 Kenneth Maxwell Modified comment(s), */ /* resulting in version 6.1 */ +/* 10-31-2023 Ting Zhu Modified comment(s), */ +/* added invalid height check, */ +/* resulting in version 6.3.0 */ /* */ /**************************************************************************/ UINT _gxe_text_input_cursor_height_set(GX_TEXT_INPUT_CURSOR *cursor_ptr, GX_UBYTE height) @@ -82,6 +85,11 @@ UINT status; return(GX_PTR_ERROR); } + if (height == 0) + { + return(GX_INVALID_VALUE); + } + status = _gx_text_input_cursor_height_set(cursor_ptr, height); return(status); diff --git a/ports/arc_em/metaware/inc/gx_port.h b/ports/arc_em/metaware/inc/gx_port.h index a80e1ae6..92282b6a 100644 --- a/ports/arc_em/metaware/inc/gx_port.h +++ b/ports/arc_em/metaware/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARCv2_EM/MetaWare Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARCv2_EM/MetaWare Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/arc_hs/metaware/inc/gx_port.h b/ports/arc_hs/metaware/inc/gx_port.h index 3ae64ad1..4a607251 100644 --- a/ports/arc_hs/metaware/inc/gx_port.h +++ b/ports/arc_hs/metaware/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARC_HS/MetaWare Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARC_HS/MetaWare Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/arm9/ac5/inc/gx_port.h b/ports/arm9/ac5/inc/gx_port.h index 3e171353..8b6a8e6b 100644 --- a/ports/arm9/ac5/inc/gx_port.h +++ b/ports/arm9/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/arm9/gnu/inc/gx_port.h b/ports/arm9/gnu/inc/gx_port.h index f59db64d..93dbb649 100644 --- a/ports/arm9/gnu/inc/gx_port.h +++ b/ports/arm9/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/arm9/iar/inc/gx_port.h b/ports/arm9/iar/inc/gx_port.h index 13ad7876..1df67e7c 100644 --- a/ports/arm9/iar/inc/gx_port.h +++ b/ports/arm9/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX ARM9/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/c667x/ccs/inc/gx_port.h b/ports/c667x/ccs/inc/gx_port.h index 43a812c9..fa5c4c22 100644 --- a/ports/c667x/ccs/inc/gx_port.h +++ b/ports/c667x/ccs/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX C6xxx/TI Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX C6xxx/TI Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/ccrx/inc/gx_port.h b/ports/ccrx/inc/gx_port.h index 788cc188..344ee7ea 100644 --- a/ports/ccrx/inc/gx_port.h +++ b/ports/ccrx/inc/gx_port.h @@ -146,7 +146,7 @@ typedef unsigned char GX_UCHAR; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a15/gnu/inc/gx_port.h b/ports/cortex_a15/gnu/inc/gx_port.h index 7bb35b1f..470e3829 100644 --- a/ports/cortex_a15/gnu/inc/gx_port.h +++ b/ports/cortex_a15/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A15/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A15/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a5/ac5/inc/gx_port.h b/ports/cortex_a5/ac5/inc/gx_port.h index 99194e7d..04c3ca9f 100644 --- a/ports/cortex_a5/ac5/inc/gx_port.h +++ b/ports/cortex_a5/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a5/gnu/inc/gx_port.h b/ports/cortex_a5/gnu/inc/gx_port.h index e50bacc0..664e9981 100644 --- a/ports/cortex_a5/gnu/inc/gx_port.h +++ b/ports/cortex_a5/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a5/iar/inc/gx_port.h b/ports/cortex_a5/iar/inc/gx_port.h index 23efdd68..c4436803 100644 --- a/ports/cortex_a5/iar/inc/gx_port.h +++ b/ports/cortex_a5/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a5x/ac6/inc/gx_port.h b/ports/cortex_a5x/ac6/inc/gx_port.h index 35a3a048..27144356 100644 --- a/ports/cortex_a5x/ac6/inc/gx_port.h +++ b/ports/cortex_a5x/ac6/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5x/AC6 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A5x/AC6 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a7/ac5/inc/gx_port.h b/ports/cortex_a7/ac5/inc/gx_port.h index 23d4ee4d..5ac2c25b 100644 --- a/ports/cortex_a7/ac5/inc/gx_port.h +++ b/ports/cortex_a7/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a7/gnu/inc/gx_port.h b/ports/cortex_a7/gnu/inc/gx_port.h index 7df4d128..0d735693 100644 --- a/ports/cortex_a7/gnu/inc/gx_port.h +++ b/ports/cortex_a7/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a7/iar/inc/gx_port.h b/ports/cortex_a7/iar/inc/gx_port.h index dd7b45c5..a03361b9 100644 --- a/ports/cortex_a7/iar/inc/gx_port.h +++ b/ports/cortex_a7/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A7/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a8/ac5/inc/gx_port.h b/ports/cortex_a8/ac5/inc/gx_port.h index 4c51b6d2..0d43226f 100644 --- a/ports/cortex_a8/ac5/inc/gx_port.h +++ b/ports/cortex_a8/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a8/gnu/inc/gx_port.h b/ports/cortex_a8/gnu/inc/gx_port.h index c6d16efc..e027fbe6 100644 --- a/ports/cortex_a8/gnu/inc/gx_port.h +++ b/ports/cortex_a8/gnu/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a8/iar/inc/gx_port.h b/ports/cortex_a8/iar/inc/gx_port.h index 45ab7f89..1c3cb53b 100644 --- a/ports/cortex_a8/iar/inc/gx_port.h +++ b/ports/cortex_a8/iar/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A8/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a9/ac5/inc/gx_port.h b/ports/cortex_a9/ac5/inc/gx_port.h index 4bc4a2a5..aa814818 100644 --- a/ports/cortex_a9/ac5/inc/gx_port.h +++ b/ports/cortex_a9/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a9/gnu/inc/gx_port.h b/ports/cortex_a9/gnu/inc/gx_port.h index c82df2f5..8ea10214 100644 --- a/ports/cortex_a9/gnu/inc/gx_port.h +++ b/ports/cortex_a9/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_a9/iar/inc/gx_port.h b/ports/cortex_a9/iar/inc/gx_port.h index 7878d648..6ea07762 100644 --- a/ports/cortex_a9/iar/inc/gx_port.h +++ b/ports/cortex_a9/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-A9/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m0/ac5/inc/gx_port.h b/ports/cortex_m0/ac5/inc/gx_port.h index 54b13553..faeb0141 100644 --- a/ports/cortex_m0/ac5/inc/gx_port.h +++ b/ports/cortex_m0/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m0/gnu/inc/gx_port.h b/ports/cortex_m0/gnu/inc/gx_port.h index 3460afd0..7068a1b8 100644 --- a/ports/cortex_m0/gnu/inc/gx_port.h +++ b/ports/cortex_m0/gnu/inc/gx_port.h @@ -143,7 +143,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m0/iar/inc/gx_port.h b/ports/cortex_m0/iar/inc/gx_port.h index 6c7f4eb5..942afd48 100644 --- a/ports/cortex_m0/iar/inc/gx_port.h +++ b/ports/cortex_m0/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M0/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m3/ac5/inc/gx_port.h b/ports/cortex_m3/ac5/inc/gx_port.h index 1dd8b8fd..67898c48 100644 --- a/ports/cortex_m3/ac5/inc/gx_port.h +++ b/ports/cortex_m3/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m3/gnu/inc/gx_port.h b/ports/cortex_m3/gnu/inc/gx_port.h index 60aba6de..e36048b3 100644 --- a/ports/cortex_m3/gnu/inc/gx_port.h +++ b/ports/cortex_m3/gnu/inc/gx_port.h @@ -143,7 +143,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m3/iar/inc/gx_port.h b/ports/cortex_m3/iar/inc/gx_port.h index 8b57502f..b8927bf0 100644 --- a/ports/cortex_m3/iar/inc/gx_port.h +++ b/ports/cortex_m3/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m3/keil/inc/gx_port.h b/ports/cortex_m3/keil/inc/gx_port.h index 6c1da67c..41d4aa5f 100644 --- a/ports/cortex_m3/keil/inc/gx_port.h +++ b/ports/cortex_m3/keil/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/KEIL Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M3/KEIL Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m4/ac5/inc/gx_port.h b/ports/cortex_m4/ac5/inc/gx_port.h index 1ade5370..00d3ef8e 100644 --- a/ports/cortex_m4/ac5/inc/gx_port.h +++ b/ports/cortex_m4/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m4/gnu/inc/gx_port.h b/ports/cortex_m4/gnu/inc/gx_port.h index adf0a399..563cc1bd 100644 --- a/ports/cortex_m4/gnu/inc/gx_port.h +++ b/ports/cortex_m4/gnu/inc/gx_port.h @@ -143,7 +143,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m4/iar/inc/gx_port.h b/ports/cortex_m4/iar/inc/gx_port.h index 614315ff..90f0f01e 100644 --- a/ports/cortex_m4/iar/inc/gx_port.h +++ b/ports/cortex_m4/iar/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m4/keil/inc/gx_port.h b/ports/cortex_m4/keil/inc/gx_port.h index d0cfc37e..e433661b 100644 --- a/ports/cortex_m4/keil/inc/gx_port.h +++ b/ports/cortex_m4/keil/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/KEIL Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M4/KEIL Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m7/ac5/inc/gx_port.h b/ports/cortex_m7/ac5/inc/gx_port.h index 6a76b93a..569bb005 100644 --- a/ports/cortex_m7/ac5/inc/gx_port.h +++ b/ports/cortex_m7/ac5/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m7/gnu/inc/gx_port.h b/ports/cortex_m7/gnu/inc/gx_port.h index 33d1492b..6f3bd4d3 100644 --- a/ports/cortex_m7/gnu/inc/gx_port.h +++ b/ports/cortex_m7/gnu/inc/gx_port.h @@ -143,7 +143,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_m7/iar/inc/gx_port.h b/ports/cortex_m7/iar/inc/gx_port.h index b2eecebd..99203484 100644 --- a/ports/cortex_m7/iar/inc/gx_port.h +++ b/ports/cortex_m7/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-M7/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r4/ac5/inc/gx_port.h b/ports/cortex_r4/ac5/inc/gx_port.h index 6cbc7b9d..5cbd9ac9 100644 --- a/ports/cortex_r4/ac5/inc/gx_port.h +++ b/ports/cortex_r4/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r4/ac6/inc/gx_port.h b/ports/cortex_r4/ac6/inc/gx_port.h index 41121c99..0a729580 100644 --- a/ports/cortex_r4/ac6/inc/gx_port.h +++ b/ports/cortex_r4/ac6/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/AC6 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/AC6 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r4/gnu/inc/gx_port.h b/ports/cortex_r4/gnu/inc/gx_port.h index 09365eac..8d6a0b79 100644 --- a/ports/cortex_r4/gnu/inc/gx_port.h +++ b/ports/cortex_r4/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r4/iar/inc/gx_port.h b/ports/cortex_r4/iar/inc/gx_port.h index 4d21c965..7402feb7 100644 --- a/ports/cortex_r4/iar/inc/gx_port.h +++ b/ports/cortex_r4/iar/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R4/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r5/ac5/inc/gx_port.h b/ports/cortex_r5/ac5/inc/gx_port.h index ba048c99..05b26b4d 100644 --- a/ports/cortex_r5/ac5/inc/gx_port.h +++ b/ports/cortex_r5/ac5/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/AC5 Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/AC5 Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r5/gnu/inc/gx_port.h b/ports/cortex_r5/gnu/inc/gx_port.h index 6a583a01..ec007c07 100644 --- a/ports/cortex_r5/gnu/inc/gx_port.h +++ b/ports/cortex_r5/gnu/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/cortex_r5/iar/inc/gx_port.h b/ports/cortex_r5/iar/inc/gx_port.h index f77937a7..ab4ba519 100644 --- a/ports/cortex_r5/iar/inc/gx_port.h +++ b/ports/cortex_r5/iar/inc/gx_port.h @@ -139,7 +139,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/IAR Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Cortex-R5/IAR Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/generic/inc/gx_port.h b/ports/generic/inc/gx_port.h index 5842a97a..6a6ad668 100644 --- a/ports/generic/inc/gx_port.h +++ b/ports/generic/inc/gx_port.h @@ -144,7 +144,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/linux/gnu/inc/gx_port.h b/ports/linux/gnu/inc/gx_port.h index fa788f25..dd3f7081 100644 --- a/ports/linux/gnu/inc/gx_port.h +++ b/ports/linux/gnu/inc/gx_port.h @@ -137,7 +137,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Linux/GNU Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Linux/GNU Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/win32/build/vs_2019/guix.vcxproj b/ports/win32/build/vs_2019/guix.vcxproj index 51f153f1..f4070fa7 100644 --- a/ports/win32/build/vs_2019/guix.vcxproj +++ b/ports/win32/build/vs_2019/guix.vcxproj @@ -13,6 +13,14 @@ Debug_GX_DYNAMIC_BIDI_TEXT_SUPPORT Win32 + + Debug_GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + Win32 + + + Debug_GX_EXTENDED_UNICODE_SUPPORT + Win32 + Debug_GX_FONT_KERNING_SUPPORT Win32 @@ -40,6 +48,8 @@ + + @@ -53,6 +63,8 @@ + + @@ -1229,6 +1241,7 @@ + @@ -1422,6 +1435,18 @@ MultiByte v142 + + StaticLibrary + true + MultiByte + v142 + + + StaticLibrary + true + MultiByte + v142 + StaticLibrary true @@ -1477,6 +1502,12 @@ + + + + + + @@ -1506,6 +1537,14 @@ $(ProjectDir)$(Configuration)\ gx + + $(ProjectDir)$(Configuration)\ + gx + + + $(ProjectDir)$(Configuration)\ + gx + $(ProjectDir)$(Configuration)\ gx @@ -1560,6 +1599,50 @@ $(OutDir)$(TargetName).bsc + + + NotUsing + Level3 + Disabled + $(DefineConstants);WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;GX_ANIMATION_POOL_SIZE=16;GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER;%(PreprocessorDefinitions) + ..\..\..\tx;%(AdditionalIncludeDirectories) + false + true + false + ..\..\lib\vs_2019;..\..\inc;..\..\inc\synergy;..\..\..\..\common\inc + true + MultiThreadedDebug + + + Windows + true + + + $(OutDir)$(TargetName).bsc + + + + + NotUsing + Level3 + Disabled + $(DefineConstants);WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;GX_ANIMATION_POOL_SIZE=16;GX_EXTENDED_UNICODE_SUPPORT;%(PreprocessorDefinitions) + ..\..\..\tx;%(AdditionalIncludeDirectories) + false + true + false + ..\..\lib\vs_2019;..\..\inc;..\..\inc\synergy;..\..\..\..\common\inc + true + MultiThreadedDebug + + + Windows + true + + + $(OutDir)$(TargetName).bsc + + NotUsing diff --git a/ports/win32/inc/gx_port.h b/ports/win32/inc/gx_port.h index ea9e1e42..d0a3792d 100644 --- a/ports/win32/inc/gx_port.h +++ b/ports/win32/inc/gx_port.h @@ -170,7 +170,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Win32/Visual Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Win32/Visual Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/ports/win32/lib/vs_2019/tx_port.h b/ports/win32/lib/vs_2019/tx_port.h index 622a52b0..4bfcc8af 100644 --- a/ports/win32/lib/vs_2019/tx_port.h +++ b/ports/win32/lib/vs_2019/tx_port.h @@ -419,7 +419,7 @@ VOID _tx_thread_interrupt_restore(UINT previous_posture); #ifdef TX_THREAD_INIT CHAR _tx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Win32/Visual Studio Version 6.1.12 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Win32/Visual Studio Version 6.3.0 *"; #else extern CHAR _tx_version_id[]; #endif diff --git a/ports/win32/src/gx_win32_display_driver.c b/ports/win32/src/gx_win32_display_driver.c index a9810d1b..ffee797c 100644 --- a/ports/win32/src/gx_win32_display_driver.c +++ b/ports/win32/src/gx_win32_display_driver.c @@ -1302,33 +1302,35 @@ VOID *memptr; return; } - /* Driver just becomes ready. So we need to refresh the whole display. */ - if (driver_instance -> win32_driver_ready == 1) - { - gx_utility_rectangle_define(&canvas -> gx_canvas_dirty_area, 0, 0, - canvas -> gx_canvas_x_resolution - 1, - canvas -> gx_canvas_y_resolution - 1); - driver_instance -> win32_driver_ready = 2; - } - gx_utility_rectangle_define(&Limit, 0, 0, canvas -> gx_canvas_x_resolution - 1, canvas -> gx_canvas_y_resolution - 1); - if (gx_utility_rectangle_overlap_detect(&Limit, &canvas -> gx_canvas_dirty_area, &Copy)) + if (gx_utility_rectangle_overlap_detect(&Limit, dirty, &Copy)) { memptr = _win32_canvas_memory_prepare(canvas, &Copy); - INT xsrc = Copy.gx_rectangle_left; - INT ysrc = Copy.gx_rectangle_top; - - gx_utility_rectangle_shift(&Copy, canvas -> gx_canvas_display_offset_x, canvas -> gx_canvas_display_offset_y); + INT xsrc; + INT ysrc; - win_device = GetDC(driver_instance -> win32_driver_winhandle); + win_device = GetDC(driver_instance->win32_driver_winhandle); SetMapMode(win_device, MM_TEXT); - driver_instance -> win32_driver_bmpinfo.gx_bmp_header.biWidth = canvas -> gx_canvas_x_resolution; - driver_instance -> win32_driver_bmpinfo.gx_bmp_header.biHeight = canvas -> gx_canvas_y_resolution; +#ifdef GX_ENABLE_CANVAS_PARTIAL_FRAME_BUFFER + xsrc = Copy.gx_rectangle_left - canvas->gx_canvas_memory_offset_x; + ysrc = Copy.gx_rectangle_top - canvas->gx_canvas_memory_offset_y; + + driver_instance->win32_driver_bmpinfo.gx_bmp_header.biWidth = canvas->gx_canvas_memory_width; + driver_instance->win32_driver_bmpinfo.gx_bmp_header.biHeight = canvas->gx_canvas_memory_height; +#else + xsrc = Copy.gx_rectangle_left; + ysrc = Copy.gx_rectangle_top; + + driver_instance->win32_driver_bmpinfo.gx_bmp_header.biWidth = canvas->gx_canvas_x_resolution; + driver_instance->win32_driver_bmpinfo.gx_bmp_header.biHeight = canvas->gx_canvas_y_resolution; +#endif + + gx_utility_rectangle_shift(&Copy, canvas->gx_canvas_display_offset_x, canvas->gx_canvas_display_offset_y); Top = Copy.gx_rectangle_top; Left = Copy.gx_rectangle_left; diff --git a/ports/win32/vs_2019_standalone/inc/gx_port.h b/ports/win32/vs_2019_standalone/inc/gx_port.h index 6376d664..20aaa4ae 100644 --- a/ports/win32/vs_2019_standalone/inc/gx_port.h +++ b/ports/win32/vs_2019_standalone/inc/gx_port.h @@ -100,7 +100,7 @@ typedef SHORT GX_VALUE; #ifdef GX_SYSTEM_INIT CHAR _gx_version_id[] = - "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Win32/Standalone/Visual Version 6.2.1 *"; + "Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Win32/Standalone/Visual Version 6.3.0 *"; #else extern CHAR _gx_version_id[]; #endif diff --git a/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.sln b/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.sln new file mode 100644 index 00000000..a1ea1127 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29905.134 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "guix", "..\..\..\..\ports\win32\build\vs_2019\guix.vcxproj", "{A3336F4F-7A7B-46D3-A7F0-A2AAED6C08ED}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_guix_binres_standalone", "demo_guix_binres_standalone.vcxproj", "{10B36C4C-FA91-4491-8B51-EA4F5BABEB6B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A3336F4F-7A7B-46D3-A7F0-A2AAED6C08ED}.Debug|Win32.ActiveCfg = Debug|Win32 + {A3336F4F-7A7B-46D3-A7F0-A2AAED6C08ED}.Debug|Win32.Build.0 = Debug|Win32 + {A3336F4F-7A7B-46D3-A7F0-A2AAED6C08ED}.Release|Win32.ActiveCfg = Release|Win32 + {A3336F4F-7A7B-46D3-A7F0-A2AAED6C08ED}.Release|Win32.Build.0 = Release|Win32 + {10B36C4C-FA91-4491-8B51-EA4F5BABEB6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {10B36C4C-FA91-4491-8B51-EA4F5BABEB6B}.Debug|Win32.Build.0 = Debug|Win32 + {10B36C4C-FA91-4491-8B51-EA4F5BABEB6B}.Release|Win32.ActiveCfg = Release|Win32 + {10B36C4C-FA91-4491-8B51-EA4F5BABEB6B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2BA427AA-80DB-4588-A3AC-D9AB4C83970D} + EndGlobalSection +EndGlobal diff --git a/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.vcxproj b/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.vcxproj new file mode 100644 index 00000000..11c968dc --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/build/vs_2019/demo_guix_binres_standalone.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + {a3336f4f-7a7b-46d3-a7f0-a2aaed6c08ed} + false + + + + + + + + + + + + + {10B36C4C-FA91-4491-8B51-EA4F5BABEB6B} + Win32Proj + medical + + + + Application + true + Unicode + v142 + + + Application + false + true + Unicode + v142 + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;GX_EXTERNAL_RESOURCE_BUFFER_SIZE=1024;GX_EXTERNAL_RESOURCE_SUPPORT;%(PreprocessorDefinitions) + ..\..\..\..\common\inc;../../../../ports/win32/lib/vs_2019;..\include;..\..\..\..\ports\win32\inc + MultiThreadedDebug + + + Windows + true + ../../../../ports/win32/lib/vs_2019;$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration) + gx.lib;tx.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + ..\..\..\..\common\inc;../../../../ports/win32/lib/vs_2019;..\include;..\..\..\..\ports\win32\inc + + + Windows + true + true + true + ../../../../ports/win32/lib/vs_2019;$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration) + gx.lib;tx.lib;%(AdditionalDependencies) + + + + + + \ No newline at end of file diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.c b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.c new file mode 100644 index 00000000..80f32f27 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.c @@ -0,0 +1,231 @@ +/* This is a small demo of the high-performance GUIX graphics framework. */ + +#include +#include +#include "gx_api.h" + +#include "demo_guix_binres_standalone_resources.h" +#include "demo_guix_binres_standalone_specifications.h" + +#define FONT_BUFFER_SIZE 5120 +#define GUIX_POOL_SIZE (640*480) + +/* Define variables. */ +GX_WINDOW_ROOT* root; +TX_THREAD demo_thread; +ULONG demo_thread_stack[1024]; +TX_BYTE_POOL memory_pool; +UCHAR guix_pool_memory[GUIX_POOL_SIZE]; +GX_PIXELMAP pixelmap_red_apple; +GX_UBYTE font_vera_buffer[FONT_BUFFER_SIZE]; +VOID *root_address_pixelmap_red_apple = GX_NULL; +VOID *root_address_font_vera = GX_NULL; + +/* Define prototypes. */ +extern UINT win32_graphics_driver_setup_565rgb(GX_DISPLAY *display); +VOID demo_thread_entry(ULONG thread_input); +VOID *load_binary_resource_data_to_ram(GX_CHAR* pathname); +UINT load_standalone_resources(); + +/************************************************************************************/ +/* Program entry. */ +/************************************************************************************/ +int main(int argc, char ** argv) +{ + tx_kernel_enter(); + return(0); +} + +/************************************************************************************/ +/* User defined memory allocate function. */ +/************************************************************************************/ +VOID* memory_allocate(ULONG size) +{ + VOID* memptr; + + if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS) + { + return memptr; + } + + return NULL; +} + +/************************************************************************************/ +/* User defined memory free function. */ +/************************************************************************************/ +VOID memory_free(VOID* mem) +{ + tx_byte_release(mem); +} + +/************************************************************************************/ +/* Define system initialization. */ +/************************************************************************************/ +VOID tx_application_define(void *first_unused_memory) +{ + tx_thread_create(&demo_thread, "Demo Thread", demo_thread_entry, 0, + demo_thread_stack, sizeof(demo_thread_stack), + GX_SYSTEM_THREAD_PRIORITY + 1, + GX_SYSTEM_THREAD_PRIORITY + 1, TX_NO_TIME_SLICE, TX_AUTO_START); +} + +/************************************************************************************/ +/* Demo thread entry. */ +/************************************************************************************/ +VOID demo_thread_entry(ULONG thread_input) +{ + /* Initialize GUIX. */ + gx_system_initialize(); + + /* Create byte pool. */ + tx_byte_pool_create(&memory_pool, "guix_pool_memory", guix_pool_memory, GUIX_POOL_SIZE); + + /* Configure display. */ + gx_studio_display_configure(MAIN_DISPLAY, win32_graphics_driver_setup_565rgb, + LANGUAGE_ENGLISH, MAIN_DISPLAY_THEME_1, &root); + + /* Create the main screen. */ + gx_studio_named_widget_create("main_screen", (GX_WIDGET*)root, GX_NULL); + + /* Load standalone resources. */ + if (load_standalone_resources() != GX_SUCCESS) + { + return; + } + + /* Show the root window to make it and patients screen visible. */ + gx_widget_show(root); + + /* Start GUIX thread. */ + gx_system_start(); +} + +/************************************************************************************/ +/* Load binary resource data into ram. */ +/* This is an example of how an application might load a binary resource data */ +/* file to RAM (or FLASH) from a local filesystem. In this case we are using */ +/* generic ANSI file I/O to read the resource data file. */ +/* */ +/* Note that for a typical embedded target, this step is not required. For most */ +/* targets, the binary resource data has been directly programmed to FLASH rather */ +/* than saved in a filesytem. */ +/************************************************************************************/ +VOID *load_binary_resource_data_to_ram(GX_CHAR *pathname) +{ + UCHAR *address = GX_NULL; + + /* If generated resource is stored in a FAT filesystem, it must be + loaded into memory before it can be used. This memory could be + RAM or FLASH, but for the purpose of this example will simply + read the file to RAM. */ + FILE *p_file; + size_t total_length; + + p_file = fopen(pathname, "rb"); + + if (p_file) + { + fseek(p_file, 0, SEEK_END); + total_length = ftell(p_file); + fseek(p_file, SEEK_SET, SEEK_SET); + + address = memory_allocate(total_length); + + if (address) + { + fread(address, 1, total_length, p_file); + } + + fclose(p_file); + } + + return address; +} + +/************************************************************************************/ +/* Load font and pixelmap resources from standalone binary data. */ +/************************************************************************************/ +UINT load_standalone_resources() +{ + UINT status; + ULONG buffer_size; + + /* Load binary file into ram. */ + root_address_pixelmap_red_apple = load_binary_resource_data_to_ram("..\\..\\pixelmap_red_apple.bin"); + + if (!root_address_pixelmap_red_apple) + { + return GX_FAILURE; + } + + /* Load binary file into ram. */ + root_address_font_vera = load_binary_resource_data_to_ram("..\\..\\font_vera.bin"); + + if (!root_address_font_vera) + { + return GX_FAILURE; + } + + /* Load a pixelmap from the standalone binary data. */ + status = gx_binres_pixelmap_load(root_address_pixelmap_red_apple, 0, &pixelmap_red_apple); + + if (status != GX_SUCCESS) + { + return status; + } + + buffer_size = FONT_BUFFER_SIZE; + + /* Load a font from the standalone binary data. */ + status = gx_binres_font_load(root_address_font_vera, 0, font_vera_buffer, &buffer_size); + + if (status != GX_SUCCESS) + { + return status; + } + + return status; +} + +/************************************************************************************/ +/* Define the custom drawing function for the "pixelmap_window" widget. */ +/************************************************************************************/ +VOID pixelmap_window_draw(GX_WINDOW *window) +{ + GX_RECTANGLE *client = &window->gx_window_client;; + + /* Draw the window's background. */ + gx_window_background_draw(window); + + /* Draw a pixlemap. */ + gx_canvas_pixelmap_draw(client->gx_rectangle_left, client->gx_rectangle_top, &pixelmap_red_apple); +} + +/************************************************************************************/ +/* Define the custom drawing function for the "prompt" widget. */ +/************************************************************************************/ +VOID text_draw(GX_PROMPT *prompt) +{ + GX_BRUSH* brush; + GX_RECTANGLE* size = &prompt->gx_widget_size; + GX_STRING string; + + /* Draw the promt's background. */ + gx_widget_background_draw(prompt); + + /* Retrieve the context brush. */ + gx_context_brush_get(&brush); + + /* Set text font. */ + brush->gx_brush_font = (GX_FONT*)font_vera_buffer; + + /* Set text color. */ + gx_context_line_color_set(GX_COLOR_ID_TEXT); + + /* Get text. */ + gx_context_string_get_ext(prompt->gx_prompt_text_id, &string); + + /* Draw text. */ + gx_canvas_aligned_text_draw(&string, size, GX_STYLE_TEXT_CENTER); +} \ No newline at end of file diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.gxp b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.gxp new file mode 100644 index 00000000..03ef33e7 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone.gxp @@ -0,0 +1,5260 @@ + + + +
+56 +60201 +6020105 +demo_guix_binres_standalone +.\ +.\ +.\ +FALSE +0 +0 +FALSE +FALSE +0 +0 +FALSE +FALSE +FALSE +10 +10 +FALSE +1 +0 +TRUE +FALSE +0 +0 +FALSE +8 +1 +4 +1 + +English +FALSE +FALSE +FALSE +FALSE +TRUE + + +0 +1 +2 +.\ +STRING_EXPORT_TYPE_XLIFF + +
+ +0 +main_display +640 +480 +16 +FALSE +FALSE +FALSE +FALSE +FALSE +FALSE +TRUE +TRUE +None +TRUE + +1 +0 +theme_1 +TRUE +TRUE +TRUE +TRUE +TRUE + + +HEADER +theme_1 + +project_relative + +FALSE +TRUE +FALSE +THEME_HEADER + + +GROUP +Colors + +project_relative + +FALSE +TRUE +FALSE +COLOR_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_COLOR_FOLDER + +COLOR +CANVAS + +project_relative + +TRUE +TRUE +FALSE +4278190080 + + +COLOR +WIDGET_FILL + +project_relative + +TRUE +TRUE +FALSE +4286086264 + + +COLOR +WINDOW_FILL + +project_relative + +TRUE +TRUE +FALSE +4293059298 + + +COLOR +DEFAULT_BORDER + +project_relative + +TRUE +TRUE +FALSE +4288387955 + + +COLOR +WINDOW_BORDER + +project_relative + +TRUE +TRUE +FALSE +4285897130 + + +COLOR +TEXT + +project_relative + +TRUE +TRUE +FALSE +4292467161 + + +COLOR +SELECTED_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +SELECTED_FILL + +project_relative + +TRUE +TRUE +FALSE +4278190264 + + +COLOR +SHADOW + +project_relative + +TRUE +TRUE +FALSE +4286611584 + + +COLOR +SHINE + +project_relative + +TRUE +TRUE +FALSE +4292532954 + + +COLOR +BTN_BORDER + +project_relative + +TRUE +TRUE +FALSE +4292919392 + + +COLOR +BTN_UPPER + +project_relative + +TRUE +TRUE +FALSE +4294506720 + + +COLOR +BTN_LOWER + +project_relative + +TRUE +TRUE +FALSE +4294503600 + + +COLOR +BTN_TEXT + +project_relative + +TRUE +TRUE +FALSE +4278190080 + + +COLOR +SCROLL_FILL + +project_relative + +TRUE +TRUE +FALSE +4293449976 + + +COLOR +SCROLL_BUTTON + +project_relative + +TRUE +TRUE +FALSE +4293446832 + + +COLOR +TEXT_INPUT_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +TEXT_INPUT_FILL + +project_relative + +TRUE +TRUE +FALSE +4293059298 + + +COLOR +SLIDER_TICK + +project_relative + +TRUE +TRUE +FALSE +4278190080 + + +COLOR +SLIDER_GROOVE_TOP + +project_relative + +TRUE +TRUE +FALSE +4290822336 + + +COLOR +SLIDER_GROOVE_BOTTOM + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +SLIDER_NEEDLE_OUTLINE + +project_relative + +TRUE +TRUE +FALSE +4278190080 + + +COLOR +SLIDER_NEEDLE_FILL + +project_relative + +TRUE +TRUE +FALSE +4286611584 + + +COLOR +SLIDER_NEEDLE_LINE1 + +project_relative + +TRUE +TRUE +FALSE +4290822336 + + +COLOR +SLIDER_NEEDLE_LINE2 + +project_relative + +TRUE +TRUE +FALSE +4292919392 + + +COLOR +DISABLED_TEXT + +project_relative + +TRUE +TRUE +FALSE +4288716960 + + +COLOR +DISABLED_FILL + +project_relative + +TRUE +TRUE +FALSE +4286086264 + + +COLOR +READONLY_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +READONLY_FILL + +project_relative + +TRUE +TRUE +FALSE +4286086264 + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_COLOR_FOLDER + +Add New Color + +project_relative + +FALSE +TRUE +FALSE + + +COLOR +BLUE + +project_relative + +FALSE +TRUE +FALSE +4278223103 + + + + +GROUP +Fonts + +project_relative + +FALSE +TRUE +FALSE +FONT_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_FONT_FOLDER + +FONT +SYSTEM + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +BUTTON + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +PROMPT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +TEXT_INPUT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_FONT_FOLDER + +Add New Font + +project_relative + +FALSE +TRUE +FALSE + + +FONT +VERA + +..\..\fonts\verasans\Vera.ttf +project_relative + +FALSE +TRUE +FALSE +20 +8 +FALSE +FALSE +FALSE +TRUE +font_vera +TRUE + +TRUE +32 +126 +FALSE +128 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1536 +1791 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + + + +GROUP +Pixelmaps + +project_relative + +FALSE +TRUE +FALSE +PIXELMAP_GROUP + +FOLDER +System + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_PIXELMAP_FOLDER + +PIXELMAP +RADIO_ON + +project_relative + +TRUE +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +RADIO_OFF + +project_relative + +TRUE +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_ON + +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_OFF + +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_PIXELMAP_FOLDER + +Add New Pixelmap + +project_relative + +FALSE +TRUE +FALSE + + +PIXELMAP +MS_AZURE_LOGO + +graphics\MS-Azure_logo.png +project_relative + +FALSE +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +RED_APPLE + +graphics\red_apple.png +project_relative + +FALSE +TRUE +TRUE +TRUE +FALSE +FALSE +TRUE +pixelmap_red_apple +TRUE +None + + + + +GROUP +Strings + +project_relative + +FALSE +TRUE +FALSE +STRING_GROUP + +Add New String + +project_relative + +FALSE +TRUE +FALSE + + +Add New String + +project_relative + +FALSE +TRUE +FALSE + + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +17170432 + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +33947648 + + + +TRUE + +2 +2 +1 + +STRING_1 +0 +Hello World! + + + +default_folder + +window +main_screen + +0 +0 +639 +479 + + +0 +TRUE +CANVAS +CANVAS +CANVAS + +FALSE + +icon +express_logo + +18 +18 +206 +47 + + +0 +TRUE +WIDGET_FILL +SELECTED_FILL +WIDGET_FILL + +FALSE +MS_AZURE_LOGO + + +window +pixelmap_window + +114 +98 +310 +366 + + +0 +TRUE +WINDOW_FILL +WINDOW_FILL +DISABLED_FILL +pixelmap_window_draw + +FALSE + + +prompt +prompt + +388 +107 +541 +151 + + +0 +TRUE +WIDGET_FILL +SELECTED_FILL +DISABLED_FILL +text_draw + +FALSE +STRING_1 +SYSTEM +TEXT +SELECTED_TEXT +DISABLED_TEXT + + + + + +1 +display_2 +320 +240 +32 +FALSE +FALSE +FALSE +FALSE +FALSE +FALSE +TRUE +FALSE +None +FALSE + +1 +0 +default_theme +TRUE +TRUE +TRUE +FALSE +TRUE + + +HEADER +default_theme + +project_relative + +FALSE +TRUE +FALSE +THEME_HEADER + + +GROUP +Colors + +project_relative + +FALSE +TRUE +FALSE +COLOR_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_COLOR_FOLDER + +COLOR +CANVAS + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +WIDGET_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +WINDOW_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +DEFAULT_BORDER + +project_relative + +TRUE +TRUE +FALSE +10197875 + + +COLOR +WINDOW_BORDER + +project_relative + +TRUE +TRUE +FALSE +7707050 + + +COLOR +TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SELECTED_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SELECTED_FILL + +project_relative + +TRUE +TRUE +FALSE +184 + + +COLOR +SHADOW + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SHINE + +project_relative + +TRUE +TRUE +FALSE +14342874 + + +COLOR +BTN_BORDER + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +BTN_UPPER + +project_relative + +TRUE +TRUE +FALSE +16316640 + + +COLOR +BTN_LOWER + +project_relative + +TRUE +TRUE +FALSE +16313520 + + +COLOR +BTN_TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SCROLL_FILL + +project_relative + +TRUE +TRUE +FALSE +15259896 + + +COLOR +SCROLL_BUTTON + +project_relative + +TRUE +TRUE +FALSE +15256752 + + +COLOR +TEXT_INPUT_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +TEXT_INPUT_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +SLIDER_TICK + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_GROOVE_TOP + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_GROOVE_BOTTOM + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SLIDER_NEEDLE_OUTLINE + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_NEEDLE_FILL + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SLIDER_NEEDLE_LINE1 + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_NEEDLE_LINE2 + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +DISABLED_TEXT + +project_relative + +TRUE +TRUE +FALSE +10526880 + + +COLOR +DISABLED_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +READONLY_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +READONLY_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_COLOR_FOLDER + +Add New Color + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Fonts + +project_relative + +FALSE +TRUE +FALSE +FONT_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_FONT_FOLDER + +FONT +SYSTEM + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +BUTTON + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +PROMPT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +TEXT_INPUT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_FONT_FOLDER + +Add New Font + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Pixelmaps + +project_relative + +FALSE +TRUE +FALSE +PIXELMAP_GROUP + +FOLDER +System + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_PIXELMAP_FOLDER + +PIXELMAP +RADIO_ON + +..\..\graphics\system_png\radiobutton_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +RADIO_OFF + +..\..\graphics\system_png\radiobutton_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_ON + +..\..\graphics\system_png\checkbox_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_OFF + +..\..\graphics\system_png\checkbox_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_PIXELMAP_FOLDER + +Add New Pixelmap + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Strings + +project_relative + +FALSE +TRUE +FALSE +STRING_GROUP + +Add New String + +project_relative + +FALSE +TRUE +FALSE + + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +17170432 + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +33947648 + + + +TRUE + +default_folder + + + +2 +display_3 +320 +240 +32 +FALSE +FALSE +FALSE +FALSE +FALSE +FALSE +TRUE +FALSE +None +FALSE + +1 +0 +default_theme +TRUE +TRUE +TRUE +FALSE +TRUE + + +HEADER +default_theme + +project_relative + +FALSE +TRUE +FALSE +THEME_HEADER + + +GROUP +Colors + +project_relative + +FALSE +TRUE +FALSE +COLOR_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_COLOR_FOLDER + +COLOR +CANVAS + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +WIDGET_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +WINDOW_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +DEFAULT_BORDER + +project_relative + +TRUE +TRUE +FALSE +10197875 + + +COLOR +WINDOW_BORDER + +project_relative + +TRUE +TRUE +FALSE +7707050 + + +COLOR +TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SELECTED_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SELECTED_FILL + +project_relative + +TRUE +TRUE +FALSE +184 + + +COLOR +SHADOW + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SHINE + +project_relative + +TRUE +TRUE +FALSE +14342874 + + +COLOR +BTN_BORDER + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +BTN_UPPER + +project_relative + +TRUE +TRUE +FALSE +16316640 + + +COLOR +BTN_LOWER + +project_relative + +TRUE +TRUE +FALSE +16313520 + + +COLOR +BTN_TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SCROLL_FILL + +project_relative + +TRUE +TRUE +FALSE +15259896 + + +COLOR +SCROLL_BUTTON + +project_relative + +TRUE +TRUE +FALSE +15256752 + + +COLOR +TEXT_INPUT_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +TEXT_INPUT_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +SLIDER_TICK + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_GROOVE_TOP + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_GROOVE_BOTTOM + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SLIDER_NEEDLE_OUTLINE + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_NEEDLE_FILL + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SLIDER_NEEDLE_LINE1 + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_NEEDLE_LINE2 + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +DISABLED_TEXT + +project_relative + +TRUE +TRUE +FALSE +10526880 + + +COLOR +DISABLED_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +READONLY_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +READONLY_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_COLOR_FOLDER + +Add New Color + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Fonts + +project_relative + +FALSE +TRUE +FALSE +FONT_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_FONT_FOLDER + +FONT +SYSTEM + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +BUTTON + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +PROMPT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +TEXT_INPUT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_FONT_FOLDER + +Add New Font + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Pixelmaps + +project_relative + +FALSE +TRUE +FALSE +PIXELMAP_GROUP + +FOLDER +System + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_PIXELMAP_FOLDER + +PIXELMAP +RADIO_ON + +..\..\graphics\system_png\radiobutton_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +RADIO_OFF + +..\..\graphics\system_png\radiobutton_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_ON + +..\..\graphics\system_png\checkbox_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_OFF + +..\..\graphics\system_png\checkbox_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_PIXELMAP_FOLDER + +Add New Pixelmap + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Strings + +project_relative + +FALSE +TRUE +FALSE +STRING_GROUP + +Add New String + +project_relative + +FALSE +TRUE +FALSE + + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +17170432 + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +33947648 + + + +TRUE + +default_folder + + + +3 +display_4 +320 +240 +32 +FALSE +FALSE +FALSE +FALSE +FALSE +FALSE +TRUE +FALSE +None +FALSE + +1 +0 +default_theme +TRUE +TRUE +TRUE +FALSE +TRUE + + +HEADER +default_theme + +project_relative + +FALSE +TRUE +FALSE +THEME_HEADER + + +GROUP +Colors + +project_relative + +FALSE +TRUE +FALSE +COLOR_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_COLOR_FOLDER + +COLOR +CANVAS + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +WIDGET_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +WINDOW_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +DEFAULT_BORDER + +project_relative + +TRUE +TRUE +FALSE +10197875 + + +COLOR +WINDOW_BORDER + +project_relative + +TRUE +TRUE +FALSE +7707050 + + +COLOR +TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SELECTED_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SELECTED_FILL + +project_relative + +TRUE +TRUE +FALSE +184 + + +COLOR +SHADOW + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SHINE + +project_relative + +TRUE +TRUE +FALSE +14342874 + + +COLOR +BTN_BORDER + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +BTN_UPPER + +project_relative + +TRUE +TRUE +FALSE +16316640 + + +COLOR +BTN_LOWER + +project_relative + +TRUE +TRUE +FALSE +16313520 + + +COLOR +BTN_TEXT + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SCROLL_FILL + +project_relative + +TRUE +TRUE +FALSE +15259896 + + +COLOR +SCROLL_BUTTON + +project_relative + +TRUE +TRUE +FALSE +15256752 + + +COLOR +TEXT_INPUT_TEXT + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +TEXT_INPUT_FILL + +project_relative + +TRUE +TRUE +FALSE +14869218 + + +COLOR +SLIDER_TICK + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_GROOVE_TOP + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_GROOVE_BOTTOM + +project_relative + +TRUE +TRUE +FALSE +16777215 + + +COLOR +SLIDER_NEEDLE_OUTLINE + +project_relative + +TRUE +TRUE +FALSE +0 + + +COLOR +SLIDER_NEEDLE_FILL + +project_relative + +TRUE +TRUE +FALSE +8421504 + + +COLOR +SLIDER_NEEDLE_LINE1 + +project_relative + +TRUE +TRUE +FALSE +12632256 + + +COLOR +SLIDER_NEEDLE_LINE2 + +project_relative + +TRUE +TRUE +FALSE +14729312 + + +COLOR +DISABLED_TEXT + +project_relative + +TRUE +TRUE +FALSE +10526880 + + +COLOR +DISABLED_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + +COLOR +READONLY_TEXT + +project_relative + +TRUE +TRUE +FALSE +4294967295 + + +COLOR +READONLY_FILL + +project_relative + +TRUE +TRUE +FALSE +7896184 + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_COLOR_FOLDER + +Add New Color + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Fonts + +project_relative + +FALSE +TRUE +FALSE +FONT_GROUP + +FOLDER +Defaults + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_FONT_FOLDER + +FONT +SYSTEM + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +BUTTON + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +PROMPT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + +FONT +TEXT_INPUT + +project_relative + +TRUE +TRUE +FALSE +18 +8 +FALSE +FALSE +FALSE +FALSE +FALSE + +TRUE +32 +126 +FALSE +256 +383 +FALSE +384 +535 +FALSE +592 +683 +FALSE +688 +745 +FALSE +768 +837 +FALSE +884 +1011 +FALSE +1025 +1273 +FALSE +1329 +1417 +FALSE +1425 +1524 +FALSE +1567 +1785 +FALSE +1792 +1866 +FALSE +1920 +1968 +FALSE +2305 +2416 +FALSE +2433 +2554 +FALSE +2562 +2676 +FALSE +2689 +2799 +FALSE +2817 +2928 +FALSE +2946 +3058 +FALSE +3073 +3183 +FALSE +3202 +3311 +FALSE +3330 +3439 +FALSE +3456 +3572 +FALSE +3585 +3675 +FALSE +3713 +3805 +FALSE +3840 +4025 +FALSE +4096 +4185 +FALSE +4256 +4347 +FALSE +4352 +4601 +FALSE +6144 +6313 +FALSE +7680 +7929 +FALSE +7936 +8190 +FALSE +8192 +8262 +FALSE +8352 +8364 +FALSE +8448 +8504 +FALSE +8531 +8578 +FALSE +8704 +8945 +FALSE +12353 +12446 +FALSE +12449 +12542 +FALSE +12549 +12588 +FALSE +12593 +12686 +FALSE +12688 +12703 +FALSE +13056 +13310 +FALSE +19968 +40880 +FALSE +44032 +55215 +FALSE +63744 +64045 + + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_FONT_FOLDER + +Add New Font + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Pixelmaps + +project_relative + +FALSE +TRUE +FALSE +PIXELMAP_GROUP + +FOLDER +System + +project_relative + +FALSE +TRUE +FALSE +DEFAULT_PIXELMAP_FOLDER + +PIXELMAP +RADIO_ON + +..\..\graphics\system_png\radiobutton_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +RADIO_OFF + +..\..\graphics\system_png\radiobutton_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_ON + +..\..\graphics\system_png\checkbox_on.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + +PIXELMAP +CHECKBOX_OFF + +..\..\graphics\system_png\checkbox_off.png +project_relative + +TRUE +TRUE +TRUE +FALSE +FALSE +FALSE +FALSE +FALSE +None + + + +FOLDER +Custom + +project_relative + +FALSE +TRUE +FALSE +CUSTOM_PIXELMAP_FOLDER + +Add New Pixelmap + +project_relative + +FALSE +TRUE +FALSE + + + + +GROUP +Strings + +project_relative + +FALSE +TRUE +FALSE +STRING_GROUP + +Add New String + +project_relative + +FALSE +TRUE +FALSE + + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +17170432 + + +20 +18 +20 +20 +4 +CANVAS +CANVAS +SCROLL_BUTTON +33947648 + + + +TRUE + +default_folder + + +
diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.c b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.c new file mode 100644 index 00000000..c902ec06 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.c @@ -0,0 +1,765 @@ +/*******************************************************************************/ +/* This file is auto-generated by Azure RTOS GUIX Studio. Do not edit this */ +/* file by hand. Modifications to this file should only be made by running */ +/* the Azure RTOS GUIX Studio application and re-generating the application */ +/* resource file(s). For more information please refer to the Azure RTOS GUIX */ +/* Studio User Guide, or visit our web site at azure.com/rtos */ +/* */ +/* GUIX Studio Revision 6.2.1.5 (Preview Version) */ +/* Date (dd.mm.yyyy): 17. 8.2023 Time (hh:mm): 15:56 */ +/*******************************************************************************/ + + +#include "gx_api.h" +#include "demo_guix_binres_standalone_resources.h" + +/* Color Table */ + +GX_CONST GX_COLOR main_display_theme_1_color_table[] = +{ + 0x00000000, + 0x00007bef, + 0x0000e71c, + 0x00009cce, + 0x000074d5, + 0x0000dedb, + 0x0000ffff, + 0x00000017, + 0x00008410, + 0x0000dedb, + 0x0000e60c, + 0x0000ffdc, + 0x0000ff76, + 0x00000000, + 0x0000eedf, + 0x0000ee76, + 0x0000ffff, + 0x0000e71c, + 0x00000000, + 0x0000c618, + 0x0000ffff, + 0x00000000, + 0x00008410, + 0x0000c618, + 0x0000e60c, + 0x0000a514, + 0x00007bef, + 0x0000ffff, + 0x00007bef, + 0x0000041f +}; + + +/* Font Table */ + + +extern GX_CONST GX_FONT _gx_system_font_8bpp; +GX_CONST GX_FONT *main_display_theme_1_font_table[] = +{ + &_gx_system_font_8bpp, + &_gx_system_font_8bpp, + &_gx_system_font_8bpp, + &_gx_system_font_8bpp +}; + +/* Pixelmap data definitions */ + + +/* THEME_1_RADIO_ON pixelmap data */ + +static GX_CONST USHORT MAIN_DISPLAY_THEME_1_RADIO_ON_pixelmap_data[308] = +{ + 0x0083, 0xffff, 0x8007, 0xf7bf, 0xcc00, 0xae1a, 0xff00, 0x7cd6, 0xff00, 0x6c95, + 0xff00, 0x74b6, 0xff00, 0x8517, 0xa300, 0xb63a, 0x0000, 0xffdf, 0x0083, 0xffff, + 0x0082, 0xffff, 0x8009, 0xd6fc, 0xff00, 0x7496, 0xff00, 0xddf2, 0xff00, 0xfdad, + 0xff00, 0xfd8b, 0xff00, 0xfd8b, 0xff00, 0xfdcd, 0xff00, 0xd5d3, 0xff00, 0x7496, + 0x8000, 0xe73d, 0x0082, 0xffff, 0x000f, 0xffff, 0x0000, 0xffff, 0xcc00, 0xb63a, + 0xff00, 0xb595, 0xff00, 0xfdac, 0xff00, 0xa6c9, 0xff00, 0x7747, 0xff00, 0x4f40, + 0xff00, 0x4f40, 0xff00, 0x7746, 0xff00, 0xa6c8, 0xff00, 0xfdcd, 0xff00, 0x9d35, + 0xcc00, 0xc69b, 0x0000, 0xffff, 0x0000, 0xffff, 0x0004, 0xffff, 0x8000, 0xd6fc, + 0xff00, 0xbdb5, 0xff00, 0xfd8b, 0xff00, 0x7767, 0xff85, 0x4f40, 0xff04, 0x7747, + 0xff00, 0xfd8b, 0xff00, 0x9d56, 0x8000, 0xe75e, 0x0000, 0xffff, 0x3303, 0xf7bf, + 0xff00, 0x7cd6, 0xff00, 0xfdcd, 0xff00, 0x7767, 0xff87, 0x4f40, 0xff03, 0x7747, + 0xff00, 0xfdcd, 0xff00, 0x74b6, 0x0000, 0xffff, 0xcc02, 0xae1a, 0xff00, 0xe613, + 0xff00, 0xa6ea, 0xff89, 0x4f40, 0xff02, 0xfe30, 0xff00, 0xcdf5, 0xa400, 0xcebc, + 0xff02, 0x8d37, 0xff00, 0xfdcd, 0xff00, 0x7767, 0xff89, 0x4f40, 0xff02, 0xa72c, + 0xff00, 0xfe10, 0xff00, 0x9d99, 0xff01, 0x8d37, 0xff00, 0xfdcd, 0xff8b, 0x4f40, + 0xff01, 0xfdcd, 0xff00, 0x8d37, 0xff01, 0x8517, 0xff00, 0xfdcd, 0xff8b, 0x4f40, + 0xff01, 0xfdac, 0xff00, 0x8517, 0xff02, 0x8517, 0xff00, 0xfdcd, 0xff00, 0x7767, + 0xff89, 0x4f40, 0xff02, 0x6743, 0xff00, 0xfe10, 0xff00, 0x9d99, 0xcc02, 0xae1a, + 0xff00, 0xe613, 0xff00, 0x7725, 0xff89, 0x4f40, 0xff02, 0xfe30, 0xff00, 0xcdf5, + 0x8300, 0xcebc, 0x0003, 0xf7bf, 0xff00, 0x7cd6, 0xff00, 0xfdcd, 0xff00, 0x6744, + 0xff87, 0x4f40, 0xff03, 0x7747, 0xff00, 0xfdcd, 0xff00, 0x74b6, 0x0000, 0xffff, + 0x0004, 0xffff, 0xcc00, 0xd6fc, 0xff00, 0xbdb5, 0xff00, 0xfd8b, 0xff00, 0x6743, + 0xff85, 0x4f40, 0xff04, 0x7747, 0xff00, 0xfd8b, 0xff00, 0x9d56, 0x8000, 0xe75e, + 0x0000, 0xffff, 0x000f, 0xffff, 0x0000, 0xffff, 0xcc00, 0xb63a, 0xff00, 0xb595, + 0xff00, 0xfdac, 0xff00, 0xa6c9, 0xff00, 0x7746, 0xff00, 0x4f40, 0xff00, 0x4f40, + 0xff00, 0x7746, 0xff00, 0xfe30, 0xff00, 0xfdac, 0xff00, 0x9d35, 0xcc00, 0xc69b, + 0x0000, 0xffff, 0x0000, 0xffff, 0x0082, 0xffff, 0xcc09, 0xd6fc, 0xff00, 0x7496, + 0xff00, 0xddf2, 0xff00, 0xfdcd, 0xff00, 0xfd8b, 0xff00, 0xfd6a, 0xff00, 0xfdcd, + 0xff00, 0xd5d3, 0xff00, 0x7496, 0x8000, 0xe73d, 0x0082, 0xffff, 0x0083, 0xffff, + 0x3307, 0xf7bf, 0xcc00, 0xae1a, 0xff00, 0x84f7, 0xff00, 0x6c95, 0xff00, 0x74b6, + 0xff00, 0x8517, 0xcc00, 0xb63a, 0x0000, 0xffdf, 0x0083, 0xffff +}; +GX_CONST GX_PIXELMAP MAIN_DISPLAY_THEME_1_RADIO_ON_pixelmap = +{ + 0x00000001, /* major version */ + 0x00000000, /* minor version */ + GX_PIXELMAP_COMPRESSED|GX_PIXELMAP_ALPHA, /* flags */ + GX_COLOR_FORMAT_565RGB, /* Format */ + (GX_UBYTE *) MAIN_DISPLAY_THEME_1_RADIO_ON_pixelmap_data, + sizeof(MAIN_DISPLAY_THEME_1_RADIO_ON_pixelmap_data), /* the size of pixelmap_data*/ + NULL, + 0, /* auxiliary data size */ + 0x00, /* used for transparent iamges */ + 16, /* width in pixel */ + 16 /* height in pixel */ +}; + +/* THEME_1_RADIO_OFF pixelmap data */ + +static GX_CONST USHORT MAIN_DISPLAY_THEME_1_RADIO_OFF_pixelmap_data[308] = +{ + 0x0083, 0xffff, 0xff07, 0xf7bf, 0xb300, 0xae1a, 0xff00, 0x7cd6, 0xff00, 0x6c95, + 0xff00, 0x74b6, 0xff00, 0x8517, 0xb300, 0xb63a, 0x0000, 0xffdf, 0x0083, 0xffff, + 0x0082, 0xffff, 0x8009, 0xd6fc, 0xff00, 0x7496, 0xff00, 0xddf2, 0xff00, 0xfdad, + 0xff00, 0xfd8b, 0xff00, 0xfd8b, 0xff00, 0xfdcd, 0xff00, 0xd5d3, 0xff00, 0x7496, + 0x3300, 0xe73d, 0x0082, 0xffff, 0x000f, 0xffff, 0x0000, 0xffff, 0xb300, 0xb63a, + 0xff00, 0xb595, 0xff00, 0xfdac, 0xff00, 0xfe72, 0xff00, 0xff7b, 0xff00, 0xffff, + 0xff00, 0xffff, 0xff00, 0xff5a, 0xff00, 0xfe51, 0xff00, 0xfdcd, 0xff00, 0x9d35, + 0xb300, 0xc69b, 0x0000, 0xffff, 0x0000, 0xffff, 0x0004, 0xffff, 0x8000, 0xd6fc, + 0xff00, 0xbdb5, 0xff00, 0xfd8b, 0xff00, 0xffbd, 0xff85, 0xffff, 0xff04, 0xff9c, + 0xff00, 0xfd8b, 0xff00, 0x9d56, 0x3300, 0xe75e, 0x0000, 0xffff, 0x3303, 0xf7bf, + 0xff00, 0x7cd6, 0xff00, 0xfdcd, 0xff00, 0xffde, 0xff87, 0xffff, 0xff03, 0xff9c, + 0xff00, 0xfdcd, 0xff00, 0x74b6, 0x0000, 0xffff, 0xb302, 0xae1a, 0xff00, 0xe613, + 0xff00, 0xfeb5, 0xff89, 0xffff, 0xff02, 0xfe30, 0xff00, 0xcdf5, 0x8000, 0xcebc, + 0xff02, 0x8d37, 0xff00, 0xfdcd, 0xff00, 0xffde, 0xff89, 0xffff, 0xff02, 0xff39, + 0xff00, 0xfe10, 0xff00, 0x9d99, 0xff01, 0x8d37, 0xff00, 0xfdcd, 0xff8b, 0xffff, + 0xff01, 0xfdcd, 0xff00, 0x8d37, 0xff01, 0x8517, 0xff00, 0xfdcd, 0xff8b, 0xffff, + 0xff01, 0xfdac, 0xff00, 0x8517, 0xff02, 0x8517, 0xff00, 0xfdcd, 0xff00, 0xffde, + 0xff89, 0xffff, 0xff02, 0xff39, 0xff00, 0xfe10, 0xff00, 0x9d99, 0xb302, 0xae1a, + 0xff00, 0xe613, 0xff00, 0xfeb5, 0xff89, 0xffff, 0xff02, 0xfe30, 0xff00, 0xcdf5, + 0x8000, 0xcebc, 0x0003, 0xf7bf, 0xff00, 0x7cd6, 0xff00, 0xfdcd, 0xff00, 0xffde, + 0xff87, 0xffff, 0xff03, 0xff9c, 0xff00, 0xfdcd, 0xff00, 0x74b6, 0x0000, 0xffff, + 0x0004, 0xffff, 0x8000, 0xd6fc, 0xff00, 0xbdb5, 0xff00, 0xfd8b, 0xff00, 0xffbd, + 0xff85, 0xffff, 0xff04, 0xff9c, 0xff00, 0xfd8b, 0xff00, 0x9d56, 0x3300, 0xe75e, + 0x0000, 0xffff, 0x000f, 0xffff, 0x0000, 0xffff, 0xb300, 0xb63a, 0xff00, 0xb595, + 0xff00, 0xfdac, 0xff00, 0xfe72, 0xff00, 0xff5a, 0xff00, 0xffff, 0xff00, 0xffff, + 0xff00, 0xff39, 0xff00, 0xfe30, 0xff00, 0xfdac, 0xff00, 0x9d35, 0xb300, 0xc69b, + 0x0000, 0xffff, 0x0000, 0xffff, 0x0082, 0xffff, 0x8009, 0xd6fc, 0xff00, 0x7496, + 0xff00, 0xddf2, 0xff00, 0xfdcd, 0xff00, 0xfd8b, 0xff00, 0xfd6a, 0xff00, 0xfdcd, + 0xff00, 0xd5d3, 0xff00, 0x7496, 0x8000, 0xe73d, 0x0082, 0xffff, 0x0083, 0xffff, + 0x3307, 0xf7bf, 0xb300, 0xae1a, 0xff00, 0x84f7, 0xff00, 0x6c95, 0xff00, 0x74b6, + 0xff00, 0x8517, 0xb300, 0xb63a, 0x0000, 0xffdf, 0x0083, 0xffff +}; +GX_CONST GX_PIXELMAP MAIN_DISPLAY_THEME_1_RADIO_OFF_pixelmap = +{ + 0x00000001, /* major version */ + 0x00000000, /* minor version */ + GX_PIXELMAP_COMPRESSED|GX_PIXELMAP_ALPHA, /* flags */ + GX_COLOR_FORMAT_565RGB, /* Format */ + (GX_UBYTE *) MAIN_DISPLAY_THEME_1_RADIO_OFF_pixelmap_data, + sizeof(MAIN_DISPLAY_THEME_1_RADIO_OFF_pixelmap_data), /* the size of pixelmap_data*/ + NULL, + 0, /* auxiliary data size */ + 0x00, /* used for transparent iamges */ + 16, /* width in pixel */ + 16 /* height in pixel */ +}; + +/* THEME_1_CHECKBOX_ON pixelmap data */ + +static GX_CONST USHORT MAIN_DISPLAY_THEME_1_CHECKBOX_ON_pixelmap_data[242] = +{ + 0x800f, 0x1a90, 0x000f, 0x1a90, 0xbe17, 0xe6d8, 0xde97, 0xde75, 0xde74, 0xde53, + 0xde31, 0xd610, 0xde11, 0xde32, 0xde32, 0xd611, 0xde0f, 0xb52d, 0x1a90, 0x000f, + 0x1a90, 0xe6d8, 0xfff9, 0xff97, 0xff55, 0xff33, 0xff11, 0xfef0, 0xfef0, 0xff11, + 0xff33, 0xff76, 0xff54, 0xff10, 0xddee, 0x1a90, 0x000f, 0x1a90, 0xde97, 0xff97, + 0xff57, 0xff58, 0xff57, 0xff36, 0xff16, 0xff36, 0xff58, 0xff9a, 0xb691, 0xded3, + 0xff13, 0xd5cf, 0x1a90, 0x000f, 0x1a90, 0xde96, 0xff97, 0xff9a, 0xffdf, 0xf7df, + 0xf7bf, 0xf7df, 0xffdf, 0xffff, 0xdf7b, 0x2525, 0x9e2d, 0xff55, 0xd5cf, 0x1a90, + 0x000f, 0x1a90, 0xde96, 0xff98, 0xff9b, 0xffdf, 0xffde, 0xf7be, 0xf7be, 0xffff, + 0xdf7b, 0x2504, 0x0ce2, 0xae4f, 0xff34, 0xd5cf, 0x1a90, 0x000f, 0x1a90, 0xde75, + 0xffb9, 0xae91, 0x55aa, 0xffff, 0xffdf, 0xffff, 0xc718, 0x3526, 0x1d03, 0x04a1, + 0xa64e, 0xff34, 0xd5ce, 0x1a90, 0x000f, 0x1a90, 0xde74, 0xffb9, 0xa670, 0x14e2, + 0x760e, 0xffdf, 0xbf17, 0x4588, 0x0cc1, 0x14c2, 0x8e72, 0xe6f5, 0xfef1, 0xd5ad, + 0x1a90, 0x000f, 0x1a90, 0xde53, 0xffb8, 0xa670, 0x04a1, 0x14c2, 0x9eb3, 0x55aa, + 0x04a0, 0x2504, 0x760e, 0xf7df, 0xff57, 0xfe6c, 0xd56b, 0x1a90, 0x000f, 0x1a90, + 0xde33, 0xff97, 0xbeb2, 0x3546, 0x1d03, 0x14e2, 0x14e2, 0x2504, 0x65ec, 0xffff, + 0xffff, 0xfed3, 0xfe08, 0xd549, 0x1a90, 0x000f, 0x1a90, 0xde32, 0xff33, 0xff9a, + 0xdf7b, 0x2504, 0x1d03, 0x14c2, 0x760e, 0xffff, 0xffde, 0xf7df, 0xfe91, 0xfdc6, + 0xd528, 0x1a90, 0x000f, 0x1a90, 0xd5ef, 0xfed0, 0xff37, 0xffff, 0xdf7b, 0x2525, + 0x8651, 0xf7df, 0xffff, 0xf7df, 0xf7ff, 0xfe90, 0xfdc5, 0xd528, 0x1a90, 0x000f, + 0x1a90, 0xd5ce, 0xfe8d, 0xfeb1, 0xff36, 0xff79, 0xb670, 0xe6f5, 0xff57, 0xfed3, + 0xfe91, 0xfe90, 0xfdea, 0xfdc5, 0xd528, 0x1a90, 0x000f, 0x1a90, 0xddcd, 0xfeac, + 0xfe6b, 0xfe8d, 0xfed0, 0xff33, 0xfef1, 0xfe6c, 0xfe08, 0xfdc6, 0xfdc5, 0xfdc5, + 0xfde5, 0xdd27, 0x1a90, 0x0009, 0x1a90, 0xb50d, 0xddac, 0xd58b, 0xd58c, 0xd5ae, + 0xd5ce, 0xd5ad, 0xd56b, 0xd549, 0x8002, 0xd528, 0x0002, 0xdd27, 0xb4a9, 0x1a90, + 0x800f, 0x1a90 +}; +GX_CONST GX_PIXELMAP MAIN_DISPLAY_THEME_1_CHECKBOX_ON_pixelmap = +{ + 0x00000001, /* major version */ + 0x00000000, /* minor version */ + GX_PIXELMAP_COMPRESSED, /* flags */ + GX_COLOR_FORMAT_565RGB, /* Format */ + (GX_UBYTE *) MAIN_DISPLAY_THEME_1_CHECKBOX_ON_pixelmap_data, + sizeof(MAIN_DISPLAY_THEME_1_CHECKBOX_ON_pixelmap_data), /* the size of pixelmap_data*/ + NULL, + 0, /* auxiliary data size */ + 0x00, /* used for transparent iamges */ + 16, /* width in pixel */ + 16 /* height in pixel */ +}; + +/* THEME_1_CHECKBOX_OFF pixelmap data */ + +static GX_CONST USHORT MAIN_DISPLAY_THEME_1_CHECKBOX_OFF_pixelmap_data[217] = +{ + 0x800f, 0x1a90, 0x000f, 0x1a90, 0xbe17, 0xe6d8, 0xde97, 0xde75, 0xde74, 0xde53, + 0xde32, 0xde10, 0xd610, 0xd5ef, 0xd5ef, 0xd5ce, 0xddcd, 0xb50d, 0x1a90, 0x000f, + 0x1a90, 0xe6d8, 0xfff9, 0xff97, 0xff75, 0xff53, 0xff12, 0xfef0, 0xfecf, 0xfece, + 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xddac, 0x1a90, 0x000f, 0x1a90, 0xde97, 0xff97, + 0xff37, 0xf737, 0xf716, 0xf6f5, 0xf6f5, 0xf6f4, 0xf6d4, 0xf6d3, 0xf6d3, 0xfe6e, + 0xfe4a, 0xd58b, 0x1a90, 0x0003, 0x1a90, 0xde75, 0xff75, 0xf737, 0x8006, 0xe75d, + 0x0004, 0xe75e, 0xf692, 0xfe29, 0xd56b, 0x1a90, 0x0004, 0x1a90, 0xde74, 0xff53, + 0xf716, 0xe75d, 0x8005, 0xe73c, 0x0004, 0xe75d, 0xf691, 0xfe28, 0xd56a, 0x1a90, + 0x0004, 0x1a90, 0xde53, 0xff12, 0xf6f5, 0xe75d, 0x8005, 0xe73c, 0x0004, 0xe75d, + 0xf670, 0xfe07, 0xd54a, 0x1a90, 0x0004, 0x1a90, 0xde32, 0xfef0, 0xf6f5, 0xe75d, + 0x8005, 0xe73c, 0x0004, 0xe75d, 0xf670, 0xfe07, 0xd549, 0x1a90, 0x0004, 0x1a90, + 0xde10, 0xfecf, 0xf6f4, 0xe75d, 0x8005, 0xe73c, 0x0004, 0xe75d, 0xf670, 0xfde6, + 0xd549, 0x1a90, 0x0004, 0x1a90, 0xd610, 0xfece, 0xf6d4, 0xe75d, 0x8005, 0xe73c, + 0x0004, 0xe75d, 0xf66f, 0xfde6, 0xd529, 0x1a90, 0x0004, 0x1a90, 0xd5ef, 0xfead, + 0xf6d3, 0xe75d, 0x8005, 0xe73c, 0x0004, 0xe75d, 0xf64f, 0xfdc5, 0xd528, 0x1a90, + 0x0004, 0x1a90, 0xd5ef, 0xfe8c, 0xf6d3, 0xe75e, 0x8005, 0xe75d, 0x0004, 0xe77f, + 0xf64f, 0xfdc5, 0xd528, 0x1a90, 0x0005, 0x1a90, 0xd5ce, 0xfe8c, 0xfe6e, 0xf692, + 0xf691, 0x8002, 0xf670, 0x0006, 0xf66f, 0xf64f, 0xf64f, 0xf5ea, 0xfdc5, 0xd528, + 0x1a90, 0x0009, 0x1a90, 0xddcd, 0xfeac, 0xfe4a, 0xfe29, 0xfe28, 0xfe07, 0xfe07, + 0xfde6, 0xfde6, 0x8002, 0xfdc5, 0x0002, 0xfde5, 0xdd27, 0x1a90, 0x0009, 0x1a90, + 0xb50d, 0xddac, 0xd58b, 0xd56b, 0xd56a, 0xd54a, 0xd549, 0xd549, 0xd529, 0x8002, + 0xd528, 0x0002, 0xdd27, 0xb4a9, 0x1a90, 0x800f, 0x1a90 +}; +GX_CONST GX_PIXELMAP MAIN_DISPLAY_THEME_1_CHECKBOX_OFF_pixelmap = +{ + 0x00000001, /* major version */ + 0x00000000, /* minor version */ + GX_PIXELMAP_COMPRESSED, /* flags */ + GX_COLOR_FORMAT_565RGB, /* Format */ + (GX_UBYTE *) MAIN_DISPLAY_THEME_1_CHECKBOX_OFF_pixelmap_data, + sizeof(MAIN_DISPLAY_THEME_1_CHECKBOX_OFF_pixelmap_data), /* the size of pixelmap_data*/ + NULL, + 0, /* auxiliary data size */ + 0x00, /* used for transparent iamges */ + 16, /* width in pixel */ + 16 /* height in pixel */ +}; + +/* THEME_1_MS_AZURE_LOGO pixelmap data */ + +static GX_CONST USHORT MAIN_DISPLAY_THEME_1_MS_AZURE_LOGO_pixelmap_data[4080] = +{ + 0x00ff, 0x0000, 0x00bc, 0x0000, 0x0001, 0x0000, 0xf200, 0xf284, 0xfe89, 0xf284, + 0xff04, 0xf262, 0xf400, 0xf2c7, 0x1c00, 0xff9e, 0x9e00, 0xbed4, 0xff00, 0x75a0, + 0xfe88, 0x7dc0, 0xff02, 0x7dc0, 0xda00, 0x9e2d, 0x0e00, 0xffff, 0x00ff, 0xffff, + 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x00ff, 0xffff, + 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x00ff, 0xffff, + 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x00ff, 0xffff, + 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x00d5, 0xffff, + 0x2a03, 0xffff, 0x6800, 0xffff, 0x7900, 0xffff, 0x4f00, 0xffff, 0x00c3, 0xffff, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, 0xff89, 0xf284, + 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, 0xff00, 0x75a0, + 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x1304, 0xffff, + 0x5300, 0xffff, 0x5400, 0xffff, 0x5600, 0xffff, 0x4200, 0xffff, 0x0087, 0xffff, + 0x020a, 0xffff, 0x4700, 0xffff, 0x5500, 0xffff, 0x5500, 0xffff, 0x4a00, 0xffff, + 0x0600, 0xffff, 0x0000, 0xffff, 0x2400, 0xffff, 0x9c00, 0xffff, 0x8500, 0xffff, + 0x0c00, 0xffff, 0x00b6, 0xffff, 0x7905, 0xffff, 0xf700, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0xdb00, 0xffff, 0x0400, 0xffff, 0x008e, 0xffff, 0x0504, 0xffff, + 0x4c00, 0xffff, 0x5500, 0xffff, 0x5500, 0xffff, 0x1500, 0xffff, 0x00ae, 0xffff, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, 0xff89, 0xf284, + 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, 0xff00, 0x75a0, + 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x3a00, 0xffff, + 0xff82, 0xffff, 0xf501, 0xffff, 0x2600, 0xffff, 0x0086, 0xffff, 0x350a, 0xffff, + 0xfe00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xe800, 0xffff, 0x1200, 0xffff, + 0x0000, 0xffff, 0xb000, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x7300, 0xffff, + 0x00b5, 0xffff, 0x5709, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xef00, 0xffff, + 0xbf00, 0xffff, 0xa900, 0xffff, 0x0300, 0xffff, 0x0000, 0xffff, 0x0f00, 0xffff, + 0x1800, 0xffff, 0x008b, 0xffff, 0x4300, 0xffff, 0xff82, 0xffff, 0x7e00, 0xffff, + 0x00ae, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x3901, 0xffff, 0xfb00, 0xffff, 0xff82, 0xffff, 0x7b00, 0xffff, 0x0086, 0xffff, + 0x9500, 0xffff, 0xff82, 0xffff, 0xe206, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x9500, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x5b00, 0xffff, 0x00b5, 0xffff, + 0xb609, 0xffff, 0xff00, 0xffff, 0xf800, 0xffff, 0x4400, 0xffff, 0x0000, 0xffff, + 0x0200, 0xffff, 0x1800, 0xffff, 0x9700, 0xffff, 0xe500, 0xffff, 0x8500, 0xffff, + 0x008b, 0xffff, 0x9d00, 0xffff, 0xff82, 0xffff, 0xd201, 0xffff, 0x0900, 0xffff, + 0x00ad, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x3901, 0xffff, 0xfb00, 0xffff, 0xff82, 0xffff, 0xd301, 0xffff, 0x0900, 0xffff, + 0x0084, 0xffff, 0x1901, 0xffff, 0xe800, 0xffff, 0xff82, 0xffff, 0xe205, 0xffff, + 0x1200, 0xffff, 0x0000, 0xffff, 0x0900, 0xffff, 0x5a00, 0xffff, 0x4600, 0xffff, + 0x00b5, 0xffff, 0x030a, 0xffff, 0xd100, 0xffff, 0xff00, 0xffff, 0xd600, 0xffff, + 0x0400, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3600, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x8700, 0xffff, 0x008a, 0xffff, 0x1806, 0xffff, 0xe800, 0xffff, + 0xff00, 0xffff, 0xeb00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x4700, 0xffff, + 0x00ad, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, + 0xff89, 0xf284, 0xff04, 0xf262, 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, + 0xff00, 0x75a0, 0xff89, 0x7dc0, 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x3906, 0xffff, 0xfc00, 0xffff, 0xfe00, 0xffff, 0xd000, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x4900, 0xffff, 0x0084, 0xffff, 0x6c0b, 0xffff, 0xff00, 0xffff, + 0xe800, 0xffff, 0xde00, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, + 0x0000, 0xffff, 0x0200, 0xffff, 0x0100, 0xffff, 0x0200, 0xffff, 0x0100, 0xffff, + 0x0084, 0xffff, 0x180d, 0xffff, 0x2f00, 0xffff, 0x3100, 0xffff, 0x1c00, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x0100, 0xffff, 0x0900, 0xffff, 0x0900, 0xffff, + 0x0500, 0xffff, 0x0000, 0xffff, 0x0c00, 0xffff, 0x2300, 0xffff, 0x0d00, 0xffff, + 0x0082, 0xffff, 0x0504, 0xffff, 0x2300, 0xffff, 0x2f00, 0xffff, 0x2900, 0xffff, + 0x0e00, 0xffff, 0x0086, 0xffff, 0x1803, 0xffff, 0x3000, 0xffff, 0x2f00, 0xffff, + 0x1900, 0xffff, 0x0085, 0xffff, 0x1004, 0xffff, 0x2900, 0xffff, 0x2f00, 0xffff, + 0x2200, 0xffff, 0x0300, 0xffff, 0x0082, 0xffff, 0x050e, 0xffff, 0x0e00, 0xffff, + 0xd300, 0xffff, 0xff00, 0xffff, 0xd300, 0xffff, 0x1000, 0xffff, 0x0700, 0xffff, + 0x0300, 0xffff, 0x3c00, 0xffff, 0xfa00, 0xffff, 0xff00, 0xffff, 0x8a00, 0xffff, + 0x0000, 0xffff, 0x0900, 0xffff, 0x0200, 0xffff, 0x0087, 0xffff, 0x6306, 0xffff, + 0xff00, 0xffff, 0xfb00, 0xffff, 0x6400, 0xffff, 0xea00, 0xffff, 0xff00, 0xffff, + 0xa100, 0xffff, 0x0084, 0xffff, 0x0500, 0xffff, 0x0987, 0xffff, 0x0404, 0xffff, + 0x0200, 0xffff, 0x0900, 0xffff, 0x0900, 0xffff, 0x0400, 0xffff, 0x0083, 0xffff, + 0x070c, 0xffff, 0x0900, 0xffff, 0x0800, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0x0500, 0xffff, 0x0900, 0xffff, 0x0900, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0x1e00, 0xffff, 0x1b00, 0xffff, 0x0100, 0xffff, 0x0082, 0xffff, 0x1c03, 0xffff, + 0x2a00, 0xffff, 0x2000, 0xffff, 0x0200, 0xffff, 0x0082, 0xffff, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0xf284, 0xff89, 0xf284, 0xff04, 0xf262, + 0xf500, 0xf2c7, 0x1d00, 0xff9e, 0x9f00, 0xbed4, 0xff00, 0x75a0, 0xff89, 0x7dc0, + 0xdb01, 0x9e2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x3906, 0xffff, 0xfc00, 0xffff, + 0xff00, 0xffff, 0x7a00, 0xffff, 0xe200, 0xffff, 0xff00, 0xffff, 0xa600, 0xffff, + 0x0083, 0xffff, 0x050c, 0xffff, 0xcc00, 0xffff, 0xff00, 0xffff, 0x9800, 0xffff, + 0xbd00, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x6c00, 0xffff, 0xe600, 0xffff, 0xdb00, 0xffff, 0x3600, 0xffff, 0x0082, 0xffff, + 0x3519, 0xffff, 0xb100, 0xffff, 0xeb00, 0xffff, 0xfd00, 0xffff, 0xff00, 0xffff, + 0xf100, 0xffff, 0xa700, 0xffff, 0x0300, 0xffff, 0x1c00, 0xffff, 0xd100, 0xffff, + 0xe600, 0xffff, 0x8200, 0xffff, 0x5400, 0xffff, 0xde00, 0xffff, 0xfb00, 0xffff, + 0x8200, 0xffff, 0x0000, 0xffff, 0x0600, 0xffff, 0x7200, 0xffff, 0xd300, 0xffff, + 0xf400, 0xffff, 0xfd00, 0xffff, 0xf800, 0xffff, 0xe100, 0xffff, 0x9100, 0xffff, + 0x1400, 0xffff, 0x0082, 0xffff, 0x1806, 0xffff, 0x9e00, 0xffff, 0xec00, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xf200, 0xffff, 0x7600, 0xffff, 0x0082, 0xffff, + 0x2218, 0xffff, 0x9d00, 0xffff, 0xe400, 0xffff, 0xf900, 0xffff, 0xfd00, 0xffff, + 0xf300, 0xffff, 0xce00, 0xffff, 0x6200, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0xa000, 0xffff, 0xe300, 0xffff, 0xf900, 0xffff, 0xff00, 0xffff, 0xf900, 0xffff, + 0xdd00, 0xffff, 0xdc00, 0xffff, 0xdc00, 0xffff, 0xe300, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0xef00, 0xffff, 0xdc00, 0xffff, 0xdf00, 0xffff, 0x3900, 0xffff, + 0x0087, 0xffff, 0xbe07, 0xffff, 0xff00, 0xffff, 0xd200, 0xffff, 0x0500, 0xffff, + 0xb200, 0xffff, 0xff00, 0xffff, 0xeb00, 0xffff, 0x1b00, 0xffff, 0x0083, 0xffff, + 0x7a01, 0xffff, 0xe500, 0xffff, 0xdd82, 0xffff, 0xdc82, 0xffff, 0xe605, 0xffff, + 0x7600, 0xffff, 0x3500, 0xffff, 0xe000, 0xffff, 0xe400, 0xffff, 0x6500, 0xffff, + 0x0083, 0xffff, 0xa518, 0xffff, 0xe700, 0xffff, 0xbf00, 0xffff, 0x0d00, 0xffff, + 0x0000, 0xffff, 0x8800, 0xffff, 0xe700, 0xffff, 0xca00, 0xffff, 0x3600, 0xffff, + 0xb000, 0xffff, 0xf400, 0xffff, 0xd900, 0xffff, 0x1300, 0xffff, 0x0000, 0xffff, + 0x3e00, 0xffff, 0xbb00, 0xffff, 0xf000, 0xffff, 0xfc00, 0xffff, 0xf300, 0xffff, + 0xca00, 0xffff, 0x5200, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0xf800, 0xf240, 0xff89, 0xf240, 0xff04, 0xf220, + 0xfa00, 0xf2a5, 0x1d00, 0xff9e, 0xa200, 0xbed4, 0xff00, 0x75a0, 0xff88, 0x7dc0, + 0xff02, 0x75a0, 0xdf00, 0x962c, 0x0f00, 0xffff, 0x0085, 0xffff, 0x3907, 0xffff, + 0xfc00, 0xffff, 0xff00, 0xffff, 0x5700, 0xffff, 0x9500, 0xffff, 0xff00, 0xffff, + 0xee00, 0xffff, 0x2000, 0xffff, 0x0082, 0xffff, 0x4521, 0xffff, 0xff00, 0xffff, + 0xfd00, 0xffff, 0x3d00, 0xffff, 0xc000, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, + 0x1200, 0xffff, 0x0000, 0xffff, 0x7f00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x3f00, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x5000, 0xffff, 0xf500, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0xf500, 0xffff, 0xff00, 0xffff, + 0xec00, 0xffff, 0x0c00, 0xffff, 0x2000, 0xffff, 0xf700, 0xffff, 0xff00, 0xffff, + 0xd500, 0xffff, 0xf600, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x9100, 0xffff, + 0x0000, 0xffff, 0xaf00, 0xffff, 0xff82, 0xffff, 0xf800, 0xffff, 0xff82, 0xffff, + 0xce12, 0xffff, 0x1800, 0xffff, 0x0000, 0xffff, 0x0a00, 0xffff, 0xc500, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xeb00, 0xffff, 0xec00, 0xffff, 0xff00, 0xffff, + 0x9d00, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3200, 0xffff, 0xe500, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xfe00, 0xffff, 0xf900, 0xffff, 0xff82, 0xffff, + 0x8b02, 0xffff, 0x0000, 0xffff, 0xbf00, 0xffff, 0xff8c, 0xffff, 0x4400, 0xffff, + 0x0086, 0xffff, 0x3108, 0xffff, 0xf800, 0xffff, 0xff00, 0xffff, 0x8400, 0xffff, + 0x0000, 0xffff, 0x5f00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x6800, 0xffff, + 0x0083, 0xffff, 0x9000, 0xffff, 0xff87, 0xffff, 0x4c04, 0xffff, 0x4000, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0x7700, 0xffff, 0x0083, 0xffff, 0xc318, 0xffff, + 0xff00, 0xffff, 0xe100, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0x9f00, 0xffff, + 0xff00, 0xffff, 0xf300, 0xffff, 0xd300, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xf300, 0xffff, 0x1000, 0xffff, 0x5100, 0xffff, 0xf900, 0xffff, 0xff00, 0xffff, + 0xfc00, 0xffff, 0xdd00, 0xffff, 0xf500, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x6000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, + 0xcc00, 0xf3cc, 0xd689, 0xf3cc, 0xd804, 0xf3ac, 0xce00, 0xf3ed, 0x1800, 0xff9e, + 0x8600, 0xc6f6, 0xde00, 0x8e0a, 0xd688, 0x962c, 0xda02, 0x962b, 0xb900, 0xae71, + 0x0c00, 0xffff, 0x0085, 0xffff, 0x3907, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, + 0x5700, 0xffff, 0x3400, 0xffff, 0xfe00, 0xffff, 0xff00, 0xffff, 0x7300, 0xffff, + 0x0082, 0xffff, 0xa74f, 0xffff, 0xff00, 0xffff, 0xc200, 0xffff, 0x0500, 0xffff, + 0xc500, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x7d00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0x3e00, 0xffff, 0x0000, 0xffff, + 0x2100, 0xffff, 0xea00, 0xffff, 0xff00, 0xffff, 0xfe00, 0xffff, 0x8d00, 0xffff, + 0x2d00, 0xffff, 0x1d00, 0xffff, 0x4a00, 0xffff, 0x9700, 0xffff, 0x0d00, 0xffff, + 0x2000, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xd900, 0xffff, + 0x6700, 0xffff, 0x6a00, 0xffff, 0x4f00, 0xffff, 0x7c00, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0xc700, 0xffff, 0x4400, 0xffff, 0x2000, 0xffff, 0x3b00, 0xffff, + 0xbb00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xa000, 0xffff, 0x0000, 0xffff, + 0x4f00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x9100, 0xffff, 0x1100, 0xffff, + 0x1600, 0xffff, 0x5600, 0xffff, 0x6100, 0xffff, 0x0000, 0xffff, 0x0b00, 0xffff, + 0xcf00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x9300, 0xffff, 0x2e00, 0xffff, + 0x2200, 0xffff, 0x5e00, 0xffff, 0xe800, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x4c00, 0xffff, 0x2f00, 0xffff, 0x5100, 0xffff, 0xdf00, 0xffff, 0xff00, 0xffff, + 0xdf00, 0xffff, 0x5100, 0xffff, 0x4b00, 0xffff, 0x4800, 0xffff, 0x7000, 0xffff, + 0xfc00, 0xffff, 0xff00, 0xffff, 0xaa00, 0xffff, 0x4600, 0xffff, 0x4d00, 0xffff, + 0x1300, 0xffff, 0x0086, 0xffff, 0x8809, 0xffff, 0xff00, 0xffff, 0xfa00, 0xffff, + 0x3300, 0xffff, 0x0000, 0xffff, 0x1900, 0xffff, 0xea00, 0xffff, 0xff00, 0xffff, + 0xc100, 0xffff, 0x0100, 0xffff, 0x0082, 0xffff, 0x220d, 0xffff, 0x4000, 0xffff, + 0x3e00, 0xffff, 0x3e00, 0xffff, 0x3400, 0xffff, 0x8f00, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x8f00, 0xffff, 0x0000, 0xffff, 0x4600, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x7500, 0xffff, 0x0083, 0xffff, 0xbf05, 0xffff, 0xff00, 0xffff, + 0xdd00, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0x9d00, 0xffff, 0xff82, 0xffff, + 0x900f, 0xffff, 0x5900, 0xffff, 0x7300, 0xffff, 0x3600, 0xffff, 0xec00, 0xffff, + 0xff00, 0xffff, 0xd100, 0xffff, 0x3400, 0xffff, 0x0900, 0xffff, 0x2700, 0xffff, + 0xc800, 0xffff, 0xff00, 0xffff, 0xe300, 0xffff, 0x3100, 0xffff, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0x0d00, 0xffbf, 0x0e8a, 0xffbf, 0x0d02, 0xffbf, + 0x0100, 0xffff, 0x0800, 0xffff, 0x0e8a, 0xffde, 0x0c00, 0xffde, 0x0086, 0xffff, + 0x391c, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0x5d00, 0xffff, 0x0000, 0xffff, + 0xc500, 0xffff, 0xff00, 0xffff, 0xcd00, 0xffff, 0x0500, 0xffff, 0x0000, 0xffff, + 0x2500, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0x6400, 0xffff, 0x0000, 0xffff, + 0xc600, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x7d00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0x3e00, 0xffff, 0x0000, 0xffff, + 0x8600, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x7f00, 0xffff, 0x0085, 0xffff, + 0x220b, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0xef00, 0xffff, 0x2b00, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x1000, 0xffff, 0xe300, 0xffff, 0xff00, 0xffff, + 0xe400, 0xffff, 0x1b00, 0xffff, 0x0082, 0xffff, 0x1008, 0xffff, 0xd900, 0xffff, + 0xff00, 0xffff, 0xf000, 0xffff, 0x1700, 0xffff, 0x6300, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x7300, 0xffff, 0x0084, 0xffff, 0x5503, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0xa200, 0xffff, 0x0083, 0xffff, 0x5008, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0xb000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0xd000, 0xffff, + 0xff00, 0xffff, 0xd100, 0xffff, 0x0082, 0xffff, 0x2f03, 0xffff, 0xfa00, 0xffff, + 0xff00, 0xffff, 0x8300, 0xffff, 0x0088, 0xffff, 0x0d0a, 0xffff, 0xda00, 0xffff, + 0xff00, 0xffff, 0xc400, 0xffff, 0x0100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0xa500, 0xffff, 0xff00, 0xffff, 0xfb00, 0xffff, 0x3500, 0xffff, 0x0086, 0xffff, + 0x2309, 0xffff, 0xe500, 0xffff, 0xff00, 0xffff, 0xc400, 0xffff, 0x0900, 0xffff, + 0x0000, 0xffff, 0x4600, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x7500, 0xffff, + 0x0083, 0xffff, 0xbf08, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, 0x1000, 0xffff, + 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x8800, 0xffff, + 0x0082, 0xffff, 0x8703, 0xffff, 0xff00, 0xffff, 0xf700, 0xffff, 0x2d00, 0xffff, + 0x0082, 0xffff, 0x4205, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xae00, 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xcc00, 0x659e, 0xd689, 0x659e, + 0xd804, 0x5d9e, 0xce00, 0x6dbe, 0x1800, 0xefbf, 0x8600, 0xfef6, 0xde00, 0xfe0a, + 0xd688, 0xfe2c, 0xda02, 0xfe0b, 0xb900, 0xfe71, 0x0c00, 0xffff, 0x0085, 0xffff, + 0x391c, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0000, 0xffff, + 0x6500, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x4200, 0xffff, 0x0000, 0xffff, + 0x7f00, 0xffff, 0xff00, 0xffff, 0xe500, 0xffff, 0x1500, 0xffff, 0x0000, 0xffff, + 0xc600, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x7d00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0x3d00, 0xffff, 0x0000, 0xffff, + 0xc700, 0xffff, 0xff00, 0xffff, 0xea00, 0xffff, 0x1800, 0xffff, 0x0085, 0xffff, + 0x2303, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0xb500, 0xffff, 0x0082, 0xffff, + 0x3f03, 0xffff, 0xfe00, 0xffff, 0xff00, 0xffff, 0x9b00, 0xffff, 0x0084, 0xffff, + 0x9009, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x4400, 0xffff, 0x3000, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xf800, 0xffff, 0x9b00, 0xffff, 0x3400, 0xffff, + 0x0082, 0xffff, 0x9203, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x4500, 0xffff, + 0x0083, 0xffff, 0x0c0f, 0xffff, 0xdc00, 0xffff, 0xff00, 0xffff, 0xdc00, 0xffff, + 0x0c00, 0xffff, 0x0300, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, 0xd200, 0xffff, + 0x0700, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3500, 0xffff, 0xfa00, 0xffff, + 0xff00, 0xffff, 0x8700, 0xffff, 0x0088, 0xffff, 0x4f0a, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x7500, 0xffff, 0x0000, 0xffff, 0x0600, 0xffff, 0x0000, 0xffff, + 0x5400, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x8c00, 0xffff, 0x0085, 0xffff, + 0x080a, 0xffff, 0xc400, 0xffff, 0xff00, 0xffff, 0xed00, 0xffff, 0x2b00, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x4600, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x7500, 0xffff, 0x0083, 0xffff, 0xbf18, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, + 0x1000, 0xffff, 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, 0xfa00, 0xffff, + 0x3200, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0100, 0xffff, 0xc500, 0xffff, + 0xff00, 0xffff, 0xe700, 0xffff, 0x7300, 0xffff, 0x6e00, 0xffff, 0x6f00, 0xffff, + 0x6c00, 0xffff, 0x8800, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0xf200, 0xffff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf800, 0x051d, 0xff8a, 0x051d, + 0xfa03, 0x1d3e, 0x1d00, 0xefbf, 0xa200, 0xfeb4, 0xff00, 0xfda0, 0xff88, 0xfdc0, + 0xff02, 0xfda0, 0xdf00, 0xfe0c, 0x0f00, 0xffff, 0x0085, 0xffff, 0x391c, 0xffff, + 0xfc00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0000, 0xffff, 0x1500, 0xffff, + 0xe400, 0xffff, 0xff00, 0xffff, 0x9c00, 0xffff, 0x0500, 0xffff, 0xd900, 0xffff, + 0xff00, 0xffff, 0x9400, 0xffff, 0x0000, 0xffff, 0x0300, 0xffff, 0xc600, 0xffff, + 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, 0x7d00, 0xffff, + 0xff00, 0xffff, 0xfd00, 0xffff, 0x3c00, 0xffff, 0x0700, 0xffff, 0xdf00, 0xffff, + 0xff00, 0xffff, 0xd100, 0xffff, 0x0300, 0xffff, 0x0085, 0xffff, 0x2303, 0xffff, + 0xf200, 0xffff, 0xff00, 0xffff, 0x9e00, 0xffff, 0x0082, 0xffff, 0x5303, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0x7c00, 0xffff, 0x0084, 0xffff, 0x7405, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0x5b00, 0xffff, 0x0000, 0xffff, 0x8000, 0xffff, + 0xff82, 0xffff, 0xfd07, 0xffff, 0xa800, 0xffff, 0x1700, 0xffff, 0x0000, 0xffff, + 0xab00, 0xffff, 0xff00, 0xffff, 0xf600, 0xffff, 0x2c00, 0xffff, 0x0083, 0xffff, + 0x040f, 0xffff, 0xc600, 0xffff, 0xff00, 0xffff, 0xe600, 0xffff, 0x1600, 0xffff, + 0x0100, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, 0xd200, 0xffff, 0x0700, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x3500, 0xffff, 0xfa00, 0xffff, 0xff00, 0xffff, + 0x8700, 0xffff, 0x0088, 0xffff, 0xaa0b, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xdb00, 0xffff, 0xcf00, 0xffff, 0xd000, 0xffff, 0xcf00, 0xffff, 0xd600, 0xffff, + 0xfe00, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, 0x0e00, 0xffff, 0x0084, 0xffff, + 0x9103, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0082, 0xffff, + 0x4603, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x7500, 0xffff, 0x0083, 0xffff, + 0xbf0c, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, + 0x9d00, 0xffff, 0xff00, 0xffff, 0xef00, 0xffff, 0x2100, 0xffff, 0x0000, 0xffff, + 0x0000, 0xffff, 0x0d00, 0xffff, 0xd700, 0xffff, 0xff89, 0xffff, 0x0001, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, + 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, + 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x391c, 0xffff, 0xfc00, 0xffff, + 0xff00, 0xffff, 0x5e00, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x9000, 0xffff, + 0xff00, 0xffff, 0xe200, 0xffff, 0x7400, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, + 0x3800, 0xffff, 0x0000, 0xffff, 0x0300, 0xffff, 0xc600, 0xffff, 0xff00, 0xffff, + 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, 0x7d00, 0xffff, 0xff00, 0xffff, + 0xfd00, 0xffff, 0x3c00, 0xffff, 0x0700, 0xffff, 0xdf00, 0xffff, 0xff00, 0xffff, + 0xd800, 0xffff, 0x0800, 0xffff, 0x0085, 0xffff, 0x2303, 0xffff, 0xf200, 0xffff, + 0xff00, 0xffff, 0x9d00, 0xffff, 0x0082, 0xffff, 0x5003, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x8400, 0xffff, 0x0084, 0xffff, 0x7d10, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x5100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3e00, 0xffff, + 0xad00, 0xffff, 0xf800, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xb800, 0xffff, + 0x0000, 0xffff, 0xa500, 0xffff, 0xff00, 0xffff, 0xf900, 0xffff, 0x3300, 0xffff, + 0x0083, 0xffff, 0x060f, 0xffff, 0xce00, 0xffff, 0xff00, 0xffff, 0xe000, 0xffff, + 0x1000, 0xffff, 0x0200, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, 0xd200, 0xffff, + 0x0700, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3500, 0xffff, 0xfa00, 0xffff, + 0xff00, 0xffff, 0x8700, 0xffff, 0x0087, 0xffff, 0x2101, 0xffff, 0xef00, 0xffff, + 0xff89, 0xffff, 0x5300, 0xffff, 0x0083, 0xffff, 0x5703, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x9700, 0xffff, 0x0083, 0xffff, 0x4703, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x7400, 0xffff, 0x0083, 0xffff, 0xbf0f, 0xffff, 0xff00, 0xffff, + 0xdd00, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, + 0xef00, 0xffff, 0x2100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0b00, 0xffff, + 0xd500, 0xffff, 0xff00, 0xffff, 0xe100, 0xffff, 0x8200, 0xffff, 0x8485, 0xffff, + 0x8102, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, + 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, + 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x391c, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0000, 0xffff, + 0x0000, 0xffff, 0x3200, 0xffff, 0xf900, 0xffff, 0xff00, 0xffff, 0xf700, 0xffff, + 0xff00, 0xffff, 0xc100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0300, 0xffff, + 0xc600, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, + 0x7d00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0x3d00, 0xffff, 0x0000, 0xffff, + 0xc200, 0xffff, 0xff00, 0xffff, 0xfa00, 0xffff, 0x3600, 0xffff, 0x0085, 0xffff, + 0x2303, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0x9d00, 0xffff, 0x0082, 0xffff, + 0x3203, 0xffff, 0xfa00, 0xffff, 0xff00, 0xffff, 0xbb00, 0xffff, 0x0084, 0xffff, + 0xb303, 0xffff, 0xff00, 0xffff, 0xf900, 0xffff, 0x2c00, 0xffff, 0x0083, 0xffff, + 0x3308, 0xffff, 0xd900, 0xffff, 0xff00, 0xffff, 0xfa00, 0xffff, 0x2700, 0xffff, + 0x7c00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x6700, 0xffff, 0x0083, 0xffff, + 0x220f, 0xffff, 0xf000, 0xffff, 0xff00, 0xffff, 0xc000, 0xffff, 0x0000, 0xffff, + 0x0400, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, 0xd200, 0xffff, 0x0700, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x3600, 0xffff, 0xfa00, 0xffff, 0xff00, 0xffff, + 0x8700, 0xffff, 0x0087, 0xffff, 0x7204, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xa700, 0xffff, 0x6c00, 0xffff, 0x7182, 0xffff, 0x6e04, 0xffff, 0x9100, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xae00, 0xffff, 0x0082, 0xffff, 0x2704, 0xffff, + 0xea00, 0xffff, 0xff00, 0xffff, 0xcb00, 0xffff, 0x0c00, 0xffff, 0x0083, 0xffff, + 0x4303, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x8800, 0xffff, 0x0082, 0xffff, + 0x0809, 0xffff, 0xd500, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, 0x1000, 0xffff, + 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, 0xef00, 0xffff, 0x2100, 0xffff, + 0x0082, 0xffff, 0xbc03, 0xffff, 0xff00, 0xffff, 0xde00, 0xffff, 0x0600, 0xffff, + 0x0086, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, + 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, + 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x3903, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0082, 0xffff, + 0xb800, 0xffff, 0xff82, 0xffff, 0x641b, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0x0300, 0xffff, 0xc600, 0xffff, 0xff00, 0xffff, 0xe200, 0xffff, 0x1200, 0xffff, + 0x0000, 0xffff, 0x7d00, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0x3e00, 0xffff, + 0x0000, 0xffff, 0x7100, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xc700, 0xffff, + 0x2100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0900, 0xffff, 0x4900, 0xffff, + 0x0800, 0xffff, 0x2100, 0xffff, 0xf200, 0xffff, 0xff00, 0xffff, 0x9d00, 0xffff, + 0x0082, 0xffff, 0x0504, 0xffff, 0xc900, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x6600, 0xffff, 0x0082, 0xffff, 0x5a06, 0xffff, 0xfb00, 0xffff, 0xff00, 0xffff, + 0xbf00, 0xffff, 0x0000, 0xffff, 0x3500, 0xffff, 0x3400, 0xffff, 0x0082, 0xffff, + 0x961e, 0xffff, 0xff00, 0xffff, 0xfc00, 0xffff, 0x2e00, 0xffff, 0x3200, 0xffff, + 0xfc00, 0xffff, 0xff00, 0xffff, 0xdd00, 0xffff, 0x2b00, 0xffff, 0x0000, 0xffff, + 0x0000, 0xffff, 0x0600, 0xffff, 0xa100, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x6b00, 0xffff, 0x0000, 0xffff, 0x0500, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, + 0xd200, 0xffff, 0x0700, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x3100, 0xffff, + 0xfa00, 0xffff, 0xff00, 0xffff, 0xb100, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0x0300, 0xffff, 0x0083, 0xffff, 0x0404, 0xffff, 0xca00, 0xffff, 0xff00, 0xffff, + 0xf500, 0xffff, 0x2600, 0xffff, 0x0084, 0xffff, 0x080a, 0xffff, 0xdc00, 0xffff, + 0xff00, 0xffff, 0xf100, 0xffff, 0x2400, 0xffff, 0x0000, 0xffff, 0x0700, 0xffff, + 0xc300, 0xffff, 0xff00, 0xffff, 0xed00, 0xffff, 0x3100, 0xffff, 0x0084, 0xffff, + 0x2a10, 0xffff, 0xf700, 0xffff, 0xff00, 0xffff, 0xd600, 0xffff, 0x1500, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x6900, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xdd00, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, + 0xef00, 0xffff, 0x2100, 0xffff, 0x0082, 0xffff, 0x7403, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x8700, 0xffff, 0x0083, 0xffff, 0x1604, 0xffff, 0x3500, 0xffff, + 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, + 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, + 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, + 0x3903, 0xffff, 0xfc00, 0xffff, 0xff00, 0xffff, 0x5e00, 0xffff, 0x0082, 0xffff, + 0x571f, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xe400, 0xffff, 0x1500, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x0300, 0xffff, 0xc600, 0xffff, 0xff00, 0xffff, + 0xe200, 0xffff, 0x1200, 0xffff, 0x0000, 0xffff, 0x7d00, 0xffff, 0xff00, 0xffff, + 0xfd00, 0xffff, 0x3e00, 0xffff, 0x0000, 0xffff, 0x0a00, 0xffff, 0xc300, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xed00, 0xffff, 0xb100, 0xffff, 0xa300, 0xffff, + 0xd900, 0xffff, 0xe400, 0xffff, 0x0d00, 0xffff, 0x2000, 0xffff, 0xf300, 0xffff, + 0xff00, 0xffff, 0x9e00, 0xffff, 0x0083, 0xffff, 0x462f, 0xffff, 0xfb00, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xc500, 0xffff, 0xa000, 0xffff, 0xbd00, 0xffff, + 0xfc00, 0xffff, 0xff00, 0xffff, 0xf100, 0xffff, 0x3700, 0xffff, 0x0000, 0xffff, + 0x6f00, 0xffff, 0xff00, 0xffff, 0xba00, 0xffff, 0x8b00, 0xffff, 0x9f00, 0xffff, + 0xf100, 0xffff, 0xff00, 0xffff, 0xd000, 0xffff, 0x0900, 0xffff, 0x0000, 0xffff, + 0x9300, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xef00, 0xffff, 0xb000, 0xffff, + 0xa200, 0xffff, 0xd500, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xbc00, 0xffff, + 0x0800, 0xffff, 0x0000, 0xffff, 0x0500, 0xffff, 0xd200, 0xffff, 0xff00, 0xffff, + 0xd200, 0xffff, 0x0700, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x1400, 0xffff, + 0xe500, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0xb900, 0xffff, 0xb500, 0xffff, + 0x3a00, 0xffff, 0x0083, 0xffff, 0x3c03, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xbc00, 0xffff, 0x0086, 0xffff, 0x8d09, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0x7600, 0xffff, 0x0000, 0xffff, 0x8d00, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, + 0xee00, 0xffff, 0xc400, 0xffff, 0xc982, 0xffff, 0xd112, 0xffff, 0x7100, 0xffff, + 0x0000, 0xffff, 0xc000, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xd700, 0xffff, + 0x9400, 0xffff, 0xb300, 0xffff, 0xff00, 0xffff, 0xfd00, 0xffff, 0xff00, 0xffff, + 0xdd00, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0x9d00, 0xffff, 0xff00, 0xffff, + 0xef00, 0xffff, 0x2100, 0xffff, 0x0082, 0xffff, 0x110c, 0xffff, 0xd400, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0xc800, 0xffff, 0x8800, 0xffff, 0x7e00, 0xffff, + 0xa000, 0xffff, 0xed00, 0xffff, 0xa000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, + 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, + 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x3a03, 0xffff, 0xff00, 0xffff, + 0xff00, 0xffff, 0x6100, 0xffff, 0x0082, 0xffff, 0x0d03, 0xffff, 0xdc00, 0xffff, + 0xff00, 0xffff, 0x9300, 0xffff, 0x0082, 0xffff, 0x030d, 0xffff, 0xcb00, 0xffff, + 0xff00, 0xffff, 0xe800, 0xffff, 0x1300, 0xffff, 0x0000, 0xffff, 0x8000, 0xffff, + 0xff00, 0xffff, 0xff00, 0xffff, 0x4000, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, + 0x1700, 0xffff, 0xb000, 0xffff, 0xff84, 0xffff, 0xd505, 0xffff, 0x0700, 0xffff, + 0x2100, 0xffff, 0xf800, 0xffff, 0xff00, 0xffff, 0xa200, 0xffff, 0x0084, 0xffff, + 0x5101, 0xffff, 0xe100, 0xffff, 0xff84, 0xffff, 0xd604, 0xffff, 0x3f00, 0xffff, + 0x0000, 0xffff, 0x0000, 0xffff, 0x6400, 0xffff, 0xff84, 0xffff, 0xd906, 0xffff, + 0x3400, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0500, 0xffff, 0x8e00, 0xffff, + 0xf700, 0xffff, 0xff84, 0xffff, 0xa908, 0xffff, 0x1400, 0xffff, 0x0000, 0xffff, + 0x0000, 0xffff, 0x0500, 0xffff, 0xd700, 0xffff, 0xff00, 0xffff, 0xd700, 0xffff, + 0x0800, 0xffff, 0x0082, 0xffff, 0x7400, 0xffff, 0xff83, 0xffff, 0x4400, 0xffff, + 0x0083, 0xffff, 0x9c03, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0x6b00, 0xffff, + 0x0086, 0xffff, 0x3a05, 0xffff, 0xff00, 0xffff, 0xff00, 0xffff, 0xd000, 0xffff, + 0x1a00, 0xffff, 0xe900, 0xffff, 0xff87, 0xffff, 0x9903, 0xffff, 0x0000, 0xffff, + 0x2d00, 0xffff, 0xd600, 0xffff, 0xff83, 0xffff, 0x8a09, 0xffff, 0xc700, 0xffff, + 0xff00, 0xffff, 0xe200, 0xffff, 0x1000, 0xffff, 0x0000, 0xffff, 0xa100, 0xffff, + 0xff00, 0xffff, 0xf400, 0xffff, 0x2200, 0xffff, 0x0083, 0xffff, 0x2701, 0xffff, + 0xc800, 0xffff, 0xff85, 0xffff, 0x7a03, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, + 0xf500, 0x355e, 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, + 0xdb01, 0xfe2d, 0x0e00, 0xffff, 0x0085, 0xffff, 0x1103, 0xffff, 0x4e00, 0xffff, + 0x5100, 0xffff, 0x1d00, 0xffff, 0x0083, 0xffff, 0x3302, 0xffff, 0x5400, 0xffff, + 0x1800, 0xffff, 0x0082, 0xffff, 0x0109, 0xffff, 0x3e00, 0xffff, 0x5200, 0xffff, + 0x4600, 0xffff, 0x0500, 0xffff, 0x0000, 0xffff, 0x2700, 0xffff, 0x5200, 0xffff, + 0x4e00, 0xffff, 0x1300, 0xffff, 0x0083, 0xffff, 0x3c0a, 0xffff, 0x7a00, 0xffff, + 0x9400, 0xffff, 0x8b00, 0xffff, 0x6400, 0xffff, 0x2000, 0xffff, 0x0000, 0xffff, + 0x0a00, 0xffff, 0x4b00, 0xffff, 0x5200, 0xffff, 0x3100, 0xffff, 0x0085, 0xffff, + 0x1106, 0xffff, 0x5800, 0xffff, 0x8700, 0xffff, 0x9400, 0xffff, 0x8300, 0xffff, + 0x4f00, 0xffff, 0x0b00, 0xffff, 0x0082, 0xffff, 0x0c06, 0xffff, 0x4b00, 0xffff, + 0x7d00, 0xffff, 0x9400, 0xffff, 0x8800, 0xffff, 0x5800, 0xffff, 0x0e00, 0xffff, + 0x0084, 0xffff, 0x2905, 0xffff, 0x6d00, 0xffff, 0x8f00, 0xffff, 0x9100, 0xffff, + 0x7400, 0xffff, 0x3500, 0xffff, 0x0083, 0xffff, 0x0104, 0xffff, 0x4100, 0xffff, + 0x5200, 0xffff, 0x4100, 0xffff, 0x0200, 0xffff, 0x0083, 0xffff, 0x4404, 0xffff, + 0x8800, 0xffff, 0x9200, 0xffff, 0x6e00, 0xffff, 0x1100, 0xffff, 0x0082, 0xffff, + 0x0104, 0xffff, 0x4000, 0xffff, 0x5100, 0xffff, 0x4f00, 0xffff, 0x1000, 0xffff, + 0x0086, 0xffff, 0x0406, 0xffff, 0x4600, 0xffff, 0x5000, 0xffff, 0x4c00, 0xffff, + 0x1100, 0xffff, 0x4500, 0xffff, 0x5000, 0xffff, 0x4e85, 0xffff, 0x5212, 0xffff, + 0x2d00, 0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0f00, 0xffff, 0x5300, 0xffff, + 0x7400, 0xffff, 0x6900, 0xffff, 0x2e00, 0xffff, 0x0000, 0xffff, 0x3900, 0xffff, + 0x5200, 0xffff, 0x4500, 0xffff, 0x0500, 0xffff, 0x0000, 0xffff, 0x3100, 0xffff, + 0x5200, 0xffff, 0x4a00, 0xffff, 0x0a00, 0xffff, 0x0084, 0xffff, 0x060a, 0xffff, + 0x4a00, 0xffff, 0x8100, 0xffff, 0x9400, 0xffff, 0x8a00, 0xffff, 0x6700, 0xffff, + 0x2d00, 0xffff, 0x0100, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, + 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, + 0x0e00, 0xffff, 0x00ff, 0xffff, 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, + 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, + 0x0e00, 0xffff, 0x00ff, 0xffff, 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, + 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, + 0x0e00, 0xffff, 0x00ff, 0xffff, 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0xf300, 0x053d, 0xff89, 0x053d, 0xff04, 0x051d, 0xf500, 0x355e, + 0x1d00, 0xefbf, 0x9f00, 0xfed4, 0xff00, 0xfda0, 0xff89, 0xfdc0, 0xdb01, 0xfe2d, + 0x0e00, 0xffff, 0x00ff, 0xffff, 0x009d, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0000, 0xed00, 0x053d, 0xfa89, 0x053d, 0xfc04, 0x051d, 0xf000, 0x355e, + 0x1c00, 0xefbf, 0x9c00, 0xfed4, 0xff00, 0xfda0, 0xfa88, 0xfdc0, 0xff02, 0xfdc0, + 0xd700, 0xfe2d, 0x0e00, 0xffff, 0x00ff, 0xffff, 0x009d, 0xffff, 0x0001, 0x0000, + 0x0000, 0x0000, 0x00ff, 0x0000, 0x00bc, 0x0000, 0x00ff, 0x0000, 0x00bc, 0x0000 + +}; +GX_CONST GX_PIXELMAP MAIN_DISPLAY_THEME_1_MS_AZURE_LOGO_pixelmap = +{ + 0x00000001, /* major version */ + 0x00000000, /* minor version */ + GX_PIXELMAP_COMPRESSED|GX_PIXELMAP_ALPHA, /* flags */ + GX_COLOR_FORMAT_565RGB, /* Format */ + (GX_UBYTE *) MAIN_DISPLAY_THEME_1_MS_AZURE_LOGO_pixelmap_data, + sizeof(MAIN_DISPLAY_THEME_1_MS_AZURE_LOGO_pixelmap_data), /* the size of pixelmap_data*/ + NULL, + 0, /* auxiliary data size */ + 0x00, /* used for transparent iamges */ + 189, /* width in pixel */ + 30 /* height in pixel */ +}; + +/* Pixelmap Table */ + + +GX_CONST GX_PIXELMAP *main_display_theme_1_pixelmap_table[] = +{ + GX_NULL, + &MAIN_DISPLAY_THEME_1_RADIO_ON_pixelmap, + &MAIN_DISPLAY_THEME_1_RADIO_OFF_pixelmap, + &MAIN_DISPLAY_THEME_1_CHECKBOX_ON_pixelmap, + &MAIN_DISPLAY_THEME_1_CHECKBOX_OFF_pixelmap, + &MAIN_DISPLAY_THEME_1_MS_AZURE_LOGO_pixelmap +}; + +/* String values */ + +GX_CONST GX_UBYTE main_display_STRING_1_English[] = "Hello World!"; + +/* String Table for main_display language English */ + +GX_CONST GX_STRING main_display_English_string_table[2] = +{ + {GX_NULL, 0}, + {(GX_CONST GX_CHAR *)main_display_STRING_1_English, sizeof(main_display_STRING_1_English) - 1} +}; + +/* Language Table */ + + +GX_CONST GX_STRING *main_display_language_table[1] = +{ + main_display_English_string_table, +}; + +GX_THEME main_display_theme_1 = +{ + (GX_COLOR *) main_display_theme_1_color_table, + (GX_FONT **) main_display_theme_1_font_table, + (GX_PIXELMAP **) main_display_theme_1_pixelmap_table, + NULL, + { + 20, /* scroll width */ + 18, /* thumb width */ + 20, /* thumb travel min */ + 20, /* thumb travel max */ + 4, /* thumb border style */ + 0, /* scroll fill pixelmap */ + 0, /* scroll thumb pixelmap */ + 0, /* scroll up pixelmap */ + 0, /* scroll down pixelmap */ + GX_COLOR_ID_CANVAS, /* scroll thumb color */ + GX_COLOR_ID_CANVAS, /* scroll thumb border color */ + GX_COLOR_ID_SCROLL_BUTTON, /* scroll button color */ + }, + { + 20, /* scroll width */ + 18, /* thumb width */ + 20, /* thumb travel min */ + 20, /* thumb travel max */ + 4, /* thumb border style */ + 0, /* scroll fill pixelmap */ + 0, /* scroll thumb pixelmap */ + 0, /* scroll up pixelmap */ + 0, /* scroll down pixelmap */ + GX_COLOR_ID_CANVAS, /* scroll thumb color */ + GX_COLOR_ID_CANVAS, /* scroll thumb border color */ + GX_COLOR_ID_SCROLL_BUTTON, /* scroll button color */ + }, + GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_VERTICAL, + GX_SCROLLBAR_RELATIVE_THUMB|GX_SCROLLBAR_END_BUTTONS|GX_SCROLLBAR_HORIZONTAL, + 30, /* color table size */ + 4, /* font table size */ + 6, /* pixelmap table size */ + 0 /* palette size */ + +}; +GX_CONST GX_THEME *main_display_theme_table[1] = +{ + &main_display_theme_1 +}; + diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.h b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.h new file mode 100644 index 00000000..a247f8a5 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_resources.h @@ -0,0 +1,51 @@ +/*******************************************************************************/ +/* This file is auto-generated by Azure RTOS GUIX Studio. Do not edit this */ +/* file by hand. Modifications to this file should only be made by running */ +/* the Azure RTOS GUIX Studio application and re-generating the application */ +/* resource file(s). For more information please refer to the Azure RTOS GUIX */ +/* Studio User Guide, or visit our web site at azure.com/rtos */ +/* */ +/* GUIX Studio Revision 6.2.1.5 (Preview Version) */ +/* Date (dd.mm.yyyy): 17. 8.2023 Time (hh:mm): 15:56 */ +/*******************************************************************************/ + + +#ifndef _DEMO_GUIX_BINRES_STANDALONE_MAIN_DISPLAY_RESOURCES_H_ +#define _DEMO_GUIX_BINRES_STANDALONE_MAIN_DISPLAY_RESOURCES_H_ + +#include "gx_api.h" + +/* Display and theme definitions */ + +#define MAIN_DISPLAY 0 +#define MAIN_DISPLAY_COLOR_FORMAT GX_COLOR_FORMAT_565RGB +#define MAIN_DISPLAY_X_RESOLUTION 640 +#define MAIN_DISPLAY_Y_RESOLUTION 480 +#define MAIN_DISPLAY_THEME_1 0 +#define MAIN_DISPLAY_THEME_TABLE_SIZE 1 + +/* Language definitions */ + +#define LANGUAGE_ENGLISH 0 +#define MAIN_DISPLAY_LANGUAGE_TABLE_SIZE 1 + +/* Color ID definitions */ + +#define GX_COLOR_ID_BLUE 29 +#define MAIN_DISPLAY_COLOR_TABLE_SIZE 30 + +/* Font ID definitions */ + +#define MAIN_DISPLAY_FONT_TABLE_SIZE 4 + +/* Pixelmap ID definitions */ + +#define GX_PIXELMAP_ID_MS_AZURE_LOGO 5 +#define MAIN_DISPLAY_PIXELMAP_TABLE_SIZE 6 + +/* String Ids */ + +#define GX_STRING_ID_STRING_1 1 +#define MAIN_DISPLAY_STRING_TABLE_SIZE 2 + +#endif /* sentry */ diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.c b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.c new file mode 100644 index 00000000..afa9f30b --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.c @@ -0,0 +1,425 @@ +/*******************************************************************************/ +/* This file is auto-generated by Azure RTOS GUIX Studio. Do not edit this */ +/* file by hand. Modifications to this file should only be made by running */ +/* the Azure RTOS GUIX Studio application and re-generating the application */ +/* specification file(s). For more information please refer to the Azure RTOS */ +/* GUIX Studio User Guide, or visit our web site at azure.com/rtos */ +/* */ +/* GUIX Studio Revision 6.2.1.5 (Preview Version) */ +/* Date (dd.mm.yyyy): 17. 8.2023 Time (hh:mm): 15:56 */ +/*******************************************************************************/ + + +#define GUIX_STUDIO_GENERATED_FILE +#include +#include "demo_guix_binres_standalone_resources.h" +#include "demo_guix_binres_standalone_specifications.h" + +static GX_WIDGET *gx_studio_nested_widget_create(GX_BYTE *control, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent); +MAIN_SCREEN_CONTROL_BLOCK main_screen; +GX_DISPLAY main_display_control_block; +GX_WINDOW_ROOT main_display_root_window; +GX_CANVAS main_display_canvas_control_block; +ULONG main_display_canvas_memory[153600]; + +extern GX_CONST GX_THEME *main_display_theme_table[]; +extern GX_CONST GX_STRING *main_display_language_table[]; + +GX_STUDIO_DISPLAY_INFO demo_guix_binres_standalone_display_table[1] = +{ + { + "main_display", + "main_display_canvas", + main_display_theme_table, + main_display_language_table, + MAIN_DISPLAY_THEME_TABLE_SIZE, + MAIN_DISPLAY_LANGUAGE_TABLE_SIZE, + MAIN_DISPLAY_STRING_TABLE_SIZE, + 640, /* x resolution */ + 480, /* y resolution */ + &main_display_control_block, + &main_display_canvas_control_block, + &main_display_root_window, + main_display_canvas_memory, /* canvas memory area */ + 614400, /* canvas memory size in bytes */ + GX_SCREEN_ROTATION_NONE /* rotation angle */ + } +}; + + +UINT gx_studio_icon_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent) +{ + UINT status; + GX_ICON *icon = (GX_ICON *) control_block; + GX_ICON_PROPERTIES *props = (GX_ICON_PROPERTIES *) info->properties; + status = gx_icon_create(icon, info->widget_name, parent, props->normal_pixelmap_id, info->style, info->widget_id, info->size.gx_rectangle_left, info->size.gx_rectangle_top); + if (props->selected_pixelmap_id) + { + gx_icon_pixelmap_set(icon, props->normal_pixelmap_id, props->selected_pixelmap_id); + } + else + { + gx_widget_resize((GX_WIDGET *)icon, (GX_RECTANGLE *)&info->size); + } + return status; +} + +UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent) +{ + UINT status; + GX_PROMPT *prompt = (GX_PROMPT *) control_block; + GX_PROMPT_PROPERTIES *props = (GX_PROMPT_PROPERTIES *) info->properties; + status = gx_prompt_create(prompt, info->widget_name, parent, props->string_id, info->style, info->widget_id, &info->size); + if (status == GX_SUCCESS) + { + gx_prompt_font_set(prompt, props->font_id); +#if defined(GUIX_5_4_0_COMPATIBILITY) + gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id); +#else + gx_prompt_text_color_set(prompt, props->normal_text_color_id, props->selected_text_color_id, props->disabled_text_color_id); +#endif + } + return status; +} + +UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent) +{ + UINT status; + GX_WINDOW *window = (GX_WINDOW *) control_block; + GX_WINDOW_PROPERTIES *props = (GX_WINDOW_PROPERTIES *) info->properties; + status = gx_window_create(window, info->widget_name, parent, info->style, info->widget_id, &info->size); + if (status == GX_SUCCESS) + { + if (props->wallpaper_id) + { + gx_window_wallpaper_set(window, props->wallpaper_id, info->style & GX_STYLE_TILE_WALLPAPER); + } + } + return status; +} +GX_WINDOW_PROPERTIES main_screen_properties = +{ + 0 /* wallpaper pixelmap id */ +}; +GX_ICON_PROPERTIES main_screen_express_logo_properties = +{ + GX_PIXELMAP_ID_MS_AZURE_LOGO, /* normal pixelmap id */ + 0 /* selected pixelmap id */ +}; +GX_WINDOW_PROPERTIES main_screen_pixelmap_window_properties = +{ + 0 /* wallpaper pixelmap id */ +}; +GX_PROMPT_PROPERTIES main_screen_prompt_properties = +{ + GX_STRING_ID_STRING_1, /* string id */ + GX_FONT_ID_SYSTEM, /* font id */ + GX_COLOR_ID_TEXT, /* normal text color */ + GX_COLOR_ID_SELECTED_TEXT, /* selected text color */ + GX_COLOR_ID_DISABLED_TEXT /* disabled text color */ +}; + +GX_CONST GX_STUDIO_WIDGET main_screen_prompt_define = +{ + "prompt", + GX_TYPE_PROMPT, /* widget type */ + GX_ID_NONE, /* widget id */ + #if defined(GX_WIDGET_USER_DATA) + 0, /* user data */ + #endif + GX_STYLE_BORDER_THIN|GX_STYLE_TRANSPARENT|GX_STYLE_ENABLED|GX_STYLE_TEXT_CENTER, /* style flags */ + GX_STATUS_ACCEPTS_FOCUS, /* status flags */ + sizeof(GX_PROMPT), /* control block size */ + GX_COLOR_ID_WIDGET_FILL, /* normal color id */ + GX_COLOR_ID_SELECTED_FILL, /* selected color id */ + GX_COLOR_ID_DISABLED_FILL, /* disabled color id */ + gx_studio_prompt_create, /* create function */ + (VOID (*)(GX_WIDGET *)) text_draw, /* drawing function override */ + GX_NULL, /* event function override */ + {388, 107, 541, 151}, /* widget size */ + GX_NULL, /* no next widget */ + GX_NULL, /* no child widgets */ + offsetof(MAIN_SCREEN_CONTROL_BLOCK, main_screen_prompt), /* control block */ + (void *) &main_screen_prompt_properties /* extended properties */ +}; + +GX_CONST GX_STUDIO_WIDGET main_screen_pixelmap_window_define = +{ + "pixelmap_window", + GX_TYPE_WINDOW, /* widget type */ + GX_ID_NONE, /* widget id */ + #if defined(GX_WIDGET_USER_DATA) + 0, /* user data */ + #endif + GX_STYLE_BORDER_THIN|GX_STYLE_TRANSPARENT|GX_STYLE_ENABLED, /* style flags */ + GX_STATUS_ACCEPTS_FOCUS, /* status flags */ + sizeof(GX_WINDOW), /* control block size */ + GX_COLOR_ID_WINDOW_FILL, /* normal color id */ + GX_COLOR_ID_WINDOW_FILL, /* selected color id */ + GX_COLOR_ID_DISABLED_FILL, /* disabled color id */ + gx_studio_window_create, /* create function */ + (VOID (*)(GX_WIDGET *)) pixelmap_window_draw, /* drawing function override */ + GX_NULL, /* event function override */ + {114, 98, 310, 366}, /* widget size */ + &main_screen_prompt_define, /* next widget definition */ + GX_NULL, /* no child widgets */ + offsetof(MAIN_SCREEN_CONTROL_BLOCK, main_screen_pixelmap_window), /* control block */ + (void *) &main_screen_pixelmap_window_properties /* extended properties */ +}; + +GX_CONST GX_STUDIO_WIDGET main_screen_express_logo_define = +{ + "express_logo", + GX_TYPE_ICON, /* widget type */ + GX_ID_NONE, /* widget id */ + #if defined(GX_WIDGET_USER_DATA) + 0, /* user data */ + #endif + GX_STYLE_BORDER_NONE|GX_STYLE_TRANSPARENT|GX_STYLE_ENABLED|GX_STYLE_HALIGN_LEFT|GX_STYLE_VALIGN_TOP, /* style flags */ + GX_STATUS_ACCEPTS_FOCUS, /* status flags */ + sizeof(GX_ICON), /* control block size */ + GX_COLOR_ID_WIDGET_FILL, /* normal color id */ + GX_COLOR_ID_SELECTED_FILL, /* selected color id */ + GX_COLOR_ID_WIDGET_FILL, /* disabled color id */ + gx_studio_icon_create, /* create function */ + GX_NULL, /* drawing function override */ + GX_NULL, /* event function override */ + {18, 18, 206, 47}, /* widget size */ + &main_screen_pixelmap_window_define, /* next widget definition */ + GX_NULL, /* no child widgets */ + offsetof(MAIN_SCREEN_CONTROL_BLOCK, main_screen_express_logo), /* control block */ + (void *) &main_screen_express_logo_properties /* extended properties */ +}; + +GX_CONST GX_STUDIO_WIDGET main_screen_define = +{ + "main_screen", + GX_TYPE_WINDOW, /* widget type */ + GX_ID_NONE, /* widget id */ + #if defined(GX_WIDGET_USER_DATA) + 0, /* user data */ + #endif + GX_STYLE_BORDER_NONE, /* style flags */ + GX_STATUS_ACCEPTS_FOCUS, /* status flags */ + sizeof(MAIN_SCREEN_CONTROL_BLOCK), /* control block size */ + GX_COLOR_ID_CANVAS, /* normal color id */ + GX_COLOR_ID_CANVAS, /* selected color id */ + GX_COLOR_ID_CANVAS, /* disabled color id */ + gx_studio_window_create, /* create function */ + GX_NULL, /* drawing function override */ + GX_NULL, /* event function override */ + {0, 0, 639, 479}, /* widget size */ + GX_NULL, /* next widget */ + &main_screen_express_logo_define, /* child widget */ + 0, /* control block */ + (void *) &main_screen_properties /* extended properties */ +}; +GX_CONST GX_STUDIO_WIDGET_ENTRY demo_guix_binres_standalone_widget_table[] = +{ + { &main_screen_define, (GX_WIDGET *) &main_screen }, + {GX_NULL, GX_NULL} +}; + +static GX_WIDGET *gx_studio_nested_widget_create(GX_BYTE *control, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent) +{ + UINT status = GX_SUCCESS; + GX_WIDGET *widget = GX_NULL; + GX_VALUE list_count = 0; + GX_VALUE list_total_count = 0; + + if(parent && (parent->gx_widget_type == GX_TYPE_MENU)) + { + list_total_count = ((GX_MENU *)parent)->gx_menu_list_total_count; + } + + while(definition && status == GX_SUCCESS) + { + if (definition->create_function) + { + if (definition->style & GX_STYLE_DYNAMICALLY_ALLOCATED) + { + status = gx_widget_allocate(&widget, definition->control_block_size); + if (status != GX_SUCCESS) + { + return GX_NULL; + } + } + else + { + if (control == GX_NULL) + { + return GX_NULL; + } + widget = (GX_WIDGET *) (control + definition->control_block_offset); + } + + status = definition->create_function(definition, widget, parent); + + if(list_count < list_total_count) + { + gx_menu_insert((GX_MENU *)parent, widget); + ((GX_MENU *)parent)->gx_menu_list_total_count--; + list_count++; + } + + if (status == GX_SUCCESS) + { + if (definition->widget_type != GX_TYPE_TEMPLATE) + { +#if defined(GUIX_5_4_0_COMPATIBILITY) + gx_widget_fill_color_set(widget, definition->normal_fill_color_id, definition->selected_fill_color_id); +#else + gx_widget_fill_color_set(widget, definition->normal_fill_color_id, definition->selected_fill_color_id, definition->disabled_fill_color_id); +#endif + } + + if (!(definition->status & GX_STATUS_ACCEPTS_FOCUS)) + { + gx_widget_status_remove(widget, GX_STATUS_ACCEPTS_FOCUS); + } + + if (definition->draw_function) + { + gx_widget_draw_set(widget, definition->draw_function); + } + if (definition->event_function) + { + gx_widget_event_process_set(widget, definition->event_function); + } + + #if defined(GX_WIDGET_USER_DATA) + widget->gx_widget_user_data = definition->user_data; + #endif + + if (definition->child_widget) + { + gx_studio_nested_widget_create(control, definition->child_widget, widget); + } + } + definition = definition->next_widget; + } + } + return widget; +} + +GX_WIDGET *gx_studio_widget_create(GX_BYTE *control, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent) +{ + GX_WIDGET *widget; + widget = gx_studio_nested_widget_create(control, definition, GX_NULL); + + if (parent && widget) + { + gx_widget_attach(parent, widget); + } + return widget; +} + +UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget) +{ + UINT status = GX_FAILURE; + GX_CONST GX_STUDIO_WIDGET_ENTRY *entry = demo_guix_binres_standalone_widget_table; + GX_WIDGET *widget = GX_NULL; + + while(entry->widget_information) + { + if (!strcmp(name, entry->widget_information->widget_name)) + { + widget = gx_studio_widget_create((GX_BYTE *) entry->widget, entry->widget_information, parent); + if (widget) + { + status = GX_SUCCESS; + } + break; + } + entry++; + } + + if (new_widget) + { + *new_widget = widget; + } + return status; +} + + +UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *), + GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root) +{ + GX_CONST GX_THEME *theme_ptr; + GX_RECTANGLE size; + + GX_STUDIO_DISPLAY_INFO *display_info = &demo_guix_binres_standalone_display_table[display]; + + +/* create the requested display */ + + gx_display_create(display_info->display, + display_info->name, + driver, + (GX_VALUE) display_info->x_resolution, + (GX_VALUE) display_info->y_resolution); + + +/* install the request theme */ + + if(display_info->theme_table) + { + theme_ptr = display_info->theme_table[theme]; + if(theme_ptr) + { + gx_display_color_table_set(display_info->display, theme_ptr->theme_color_table, theme_ptr->theme_color_table_size); + +/* install the color palette if required */ + if (display_info->display->gx_display_driver_palette_set && + theme_ptr->theme_palette != NULL) + { + display_info->display->gx_display_driver_palette_set(display_info->display, theme_ptr->theme_palette, theme_ptr->theme_palette_size); + } + + gx_display_font_table_set(display_info->display, theme_ptr->theme_font_table, theme_ptr->theme_font_table_size); + gx_display_pixelmap_table_set(display_info->display, theme_ptr->theme_pixelmap_table, theme_ptr->theme_pixelmap_table_size); + gx_system_scroll_appearance_set(theme_ptr->theme_vertical_scroll_style, (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_vertical_scrollbar_appearance); + gx_system_scroll_appearance_set(theme_ptr->theme_horizontal_scroll_style, (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_horizontal_scrollbar_appearance); + } + } + +/* Install the language table. */ + + if(display_info->language_table) + { + gx_display_language_table_set_ext(display_info->display, display_info->language_table, (GX_UBYTE) display_info->language_table_size, display_info->string_table_size); + gx_display_active_language_set(display_info->display, language); + } + +/* Set screen rotation angle. */ + + display_info->display->gx_display_rotation_angle = display_info->rotation_angle; + +/* create the canvas for this display */ + + gx_canvas_create(display_info->canvas, + display_info->canvas_name, + display_info->display, + GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE, + display_info->x_resolution, + display_info->y_resolution, + display_info->canvas_memory, + display_info->canvas_memory_size); + +/* Create the root window for this canvas */ + + gx_utility_rectangle_define(&size, + 0, 0, + (GX_VALUE) (display_info->x_resolution - 1), + (GX_VALUE) (display_info->y_resolution - 1)); + + gx_window_root_create(display_info->root_window, + display_info->name, + display_info->canvas, GX_STYLE_NONE, 0, &size); + if (return_root) + { + *return_root = display_info->root_window; + } + return GX_SUCCESS; +} +#undef GUIX_STUDIO_GENERATED_FILE diff --git a/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.h b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.h new file mode 100644 index 00000000..cf5a70f0 --- /dev/null +++ b/tutorials/demo_guix_binres_standalone/demo_guix_binres_standalone_specifications.h @@ -0,0 +1,150 @@ +/*******************************************************************************/ +/* This file is auto-generated by Azure RTOS GUIX Studio. Do not edit this */ +/* file by hand. Modifications to this file should only be made by running */ +/* the Azure RTOS GUIX Studio application and re-generating the application */ +/* specification file(s). For more information please refer to the Azure RTOS */ +/* GUIX Studio User Guide, or visit our web site at azure.com/rtos */ +/* */ +/* GUIX Studio Revision 6.2.1.5 (Preview Version) */ +/* Date (dd.mm.yyyy): 17. 8.2023 Time (hh:mm): 15:56 */ +/*******************************************************************************/ + + +#ifndef _DEMO_GUIX_BINRES_STANDALONE_SPECIFICATIONS_H_ +#define _DEMO_GUIX_BINRES_STANDALONE_SPECIFICATIONS_H_ + +#include "gx_api.h" + +/* Determine if C++ compiler is being used, if so use standard C. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Define widget ids */ + + + +/* Define animation ids */ + +#define GX_NEXT_ANIMATION_ID 1 + + +/* Define user event ids */ + +#define GX_NEXT_USER_EVENT_ID GX_FIRST_USER_EVENT + + +/* Declare properties structures for each utilized widget type */ + +typedef struct GX_STUDIO_WIDGET_STRUCT +{ + GX_CHAR *widget_name; + USHORT widget_type; + USHORT widget_id; + #if defined(GX_WIDGET_USER_DATA) + INT user_data; + #endif + ULONG style; + ULONG status; + ULONG control_block_size; + GX_RESOURCE_ID normal_fill_color_id; + GX_RESOURCE_ID selected_fill_color_id; + GX_RESOURCE_ID disabled_fill_color_id; + UINT (*create_function) (GX_CONST struct GX_STUDIO_WIDGET_STRUCT *, GX_WIDGET *, GX_WIDGET *); + void (*draw_function) (GX_WIDGET *); + UINT (*event_function) (GX_WIDGET *, GX_EVENT *); + GX_RECTANGLE size; + GX_CONST struct GX_STUDIO_WIDGET_STRUCT *next_widget; + GX_CONST struct GX_STUDIO_WIDGET_STRUCT *child_widget; + ULONG control_block_offset; + GX_CONST void *properties; +} GX_STUDIO_WIDGET; + +typedef struct +{ + GX_CONST GX_STUDIO_WIDGET *widget_information; + GX_WIDGET *widget; +} GX_STUDIO_WIDGET_ENTRY; + +typedef struct +{ + GX_RESOURCE_ID normal_pixelmap_id; + GX_RESOURCE_ID selected_pixelmap_id; +} GX_ICON_PROPERTIES; + +typedef struct +{ + GX_RESOURCE_ID string_id; + GX_RESOURCE_ID font_id; + GX_RESOURCE_ID normal_text_color_id; + GX_RESOURCE_ID selected_text_color_id; + GX_RESOURCE_ID disabled_text_color_id; +} GX_PROMPT_PROPERTIES; + +typedef struct +{ + GX_RESOURCE_ID wallpaper_id; +} GX_WINDOW_PROPERTIES; + + +/* Declare top-level control blocks */ + +typedef struct MAIN_SCREEN_CONTROL_BLOCK_STRUCT +{ + GX_WINDOW_MEMBERS_DECLARE + GX_ICON main_screen_express_logo; + GX_WINDOW main_screen_pixelmap_window; + GX_PROMPT main_screen_prompt; +} MAIN_SCREEN_CONTROL_BLOCK; + + +/* extern statically defined control blocks */ + +#ifndef GUIX_STUDIO_GENERATED_FILE +extern MAIN_SCREEN_CONTROL_BLOCK main_screen; +#endif + +/* Declare event process functions, draw functions, and callback functions */ + +VOID pixelmap_window_draw(GX_WINDOW *widget); +VOID text_draw(GX_PROMPT *widget); + +/* Declare the GX_STUDIO_DISPLAY_INFO structure */ + + +typedef struct GX_STUDIO_DISPLAY_INFO_STRUCT +{ + GX_CONST GX_CHAR *name; + GX_CONST GX_CHAR *canvas_name; + GX_CONST GX_THEME **theme_table; + GX_CONST GX_STRING **language_table; + USHORT theme_table_size; + USHORT language_table_size; + UINT string_table_size; + UINT x_resolution; + UINT y_resolution; + GX_DISPLAY *display; + GX_CANVAS *canvas; + GX_WINDOW_ROOT *root_window; + GX_COLOR *canvas_memory; + ULONG canvas_memory_size; + USHORT rotation_angle; +} GX_STUDIO_DISPLAY_INFO; + + +/* Declare Studio-generated functions for creating top-level widgets */ + +UINT gx_studio_icon_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent); +UINT gx_studio_prompt_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent); +UINT gx_studio_window_create(GX_CONST GX_STUDIO_WIDGET *info, GX_WIDGET *control_block, GX_WIDGET *parent); +GX_WIDGET *gx_studio_widget_create(GX_BYTE *storage, GX_CONST GX_STUDIO_WIDGET *definition, GX_WIDGET *parent); +UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget); +UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *), GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root); + +/* Determine if a C++ compiler is being used. If so, complete the standard + C conditional started above. */ +#ifdef __cplusplus +} +#endif + +#endif /* sentry */ diff --git a/tutorials/demo_guix_binres_standalone/font_vera.bin b/tutorials/demo_guix_binres_standalone/font_vera.bin new file mode 100644 index 0000000000000000000000000000000000000000..55d1681935c28a211118d79102bae98f88e3d33a GIT binary patch literal 15433 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 + + +
+font_vera +56 +GUIX Studio +6020105 +60201 +Generic +Generic +FALSE +
+ +GX_COLOR_FORMAT_565RGB +None + + +FONT +VERA + +..\..\fonts\verasans\Vera.ttf +project_relative + +FALSE +20 +8 +FALSE + +32 +126 + + +
diff --git a/tutorials/demo_guix_binres_standalone/graphics/MS-Azure_logo.png b/tutorials/demo_guix_binres_standalone/graphics/MS-Azure_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..91c1186b378b76d4165ae10fd372a7627e08bbf7 GIT binary patch literal 3189 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 bl!E>XmE`PeAAJa&00000NkvXXu0mjf;4(lU literal 0 HcmV?d00001 diff --git a/tutorials/demo_guix_binres_standalone/graphics/red_apple.png b/tutorials/demo_guix_binres_standalone/graphics/red_apple.png new file mode 100644 index 0000000000000000000000000000000000000000..36b44caf71a51be328a5a48ba8f2f260bcd6bd5b GIT binary patch literal 63716 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

elqeD>F%W+Ma;1KPCaC0Q^*K_fWAs3i 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

VF^4<*Cl$2qoRBH}{zFmDcGmWN8hS4@!?Xi8hY) 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 literal 0 HcmV?d00001 diff --git a/tutorials/demo_guix_binres_standalone/pixelmap_red_apple.bin b/tutorials/demo_guix_binres_standalone/pixelmap_red_apple.bin new file mode 100644 index 0000000000000000000000000000000000000000..b3ca818f9990591acb6487a686418d3f01b46fb0 GIT binary patch literal 125848 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 literal 0 HcmV?d00001