Skip to content

Commit 50ead25

Browse files
author
Bo Chen
committed
Update on 30 Jun 2023. Expand to see details.
eb494b63b Fix crash after delete a font or pixelmap resource when page heap is enabled. 97c60f151 Fix jpeg decoding compile error with AC6. 854311469 Fix crash in debug mode when editing an invalid resource name. 305396e7d Fixed Studio crash caused by duplicate widget names (template and derived). ff975d3c6 Correct IAR test script. 419e30052 Fixed font kerning flag issue. 36bef7f76 Fix crash on closing GUIX Studio project. 3f21aed14 Fix IAR test failures. 06b8bf46f Fix bug about gx_dave2d_png_draw not been declared when dave2d is disabled. ea88cf27e Print JPEG decoding cycle count. b7a410718 Declare and extern the system fonts as GX_CONST. 5f02a8d36 Added JPEG decoding IAR test projects. 4afce2633 Fix bug about the recent project path names being converted to lowercase. 74a1c62af Fixed Helium version JPEG decoding bug. 744c6f031 Optimize JPEG decode using Helium intrinsics. f877b9aa1 Remove "Preview Version" tag to release GUIX Studio 6.2.1.2.
1 parent 252bda0 commit 50ead25

40 files changed

Lines changed: 1959 additions & 1504 deletions

File tree

common/inc/gx_display.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
/* COMPONENT DEFINITION RELEASE */
2727
/* */
2828
/* gx_display.h PORTABLE C */
29-
/* 6.1.10 */
29+
/* 6.x */
3030
/* AUTHOR */
3131
/* */
3232
/* Kenneth Maxwell, Microsoft Corporation */
@@ -60,13 +60,15 @@
6060
/* added language direction */
6161
/* table set declarations, */
6262
/* resulting in version 6.1.10 */
63+
/* xx-xx-xxxx Ting Zhu Modified comment(s), */
64+
/* removed unused prototypes, */
65+
/* resulting in version 6.x */
6366
/* */
6467
/**************************************************************************/
6568

6669
#ifndef GX_DISPLAY_H
6770
#define GX_DISPLAY_H
6871

69-
7072
/* Define Display management constants. */
7173

7274
#define GX_DISPLAY_ID ((ULONG)0x53435245)
@@ -283,7 +285,6 @@ VOID _gx_display_driver_565rgb_rotated_pixelmap_blend(GX_DRAW_CONTEXT *conte
283285
VOID _gx_display_driver_565rgb_rotated_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
284286
INT angle, INT rot_cx, INT rot_cy);
285287
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
286-
USHORT _gx_display_driver_565rgb_YCbCr2RGB(INT y, INT cb, INT cr);
287288
VOID _gx_display_driver_565rgb_rotated_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
288289
VOID _gx_display_driver_565rgb_rotated_png_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
289290
#endif
@@ -301,7 +302,6 @@ VOID _gx_display_driver_24xrgb_rotated_pixel_blend(GX_DRAW_CONTEXT *context,
301302

302303

303304
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
304-
UINT _gx_display_driver_24xrgb_YCbCr2RGB(INT y, INT cb, INT cr);
305305
VOID _gx_display_driver_24xrgb_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
306306
VOID _gx_display_driver_24xrgb_png_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
307307
VOID _gx_display_driver_24xrgb_rotated_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);

common/inc/gx_image_reader.h

Lines changed: 130 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
/* COMPONENT DEFINITION RELEASE */
2727
/* */
2828
/* gx_image_reader.h PORTABLE C */
29-
/* 6.2.0 */
29+
/* 6.x */
3030
/* AUTHOR */
3131
/* */
3232
/* Kenneth Maxwell, Microsoft Corporation */
@@ -52,12 +52,19 @@
5252
/* added definitions for fixed */
5353
/* size table dimensions, */
5454
/* resulting in version 6.2.0 */
55+
/* xx-xx-xxxx Ting Zhu Modified comment(s), added */
56+
/* support for ARM Helium, */
57+
/* resulting in version 6.x */
5558
/* */
5659
/**************************************************************************/
5760
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
5861
#ifndef GX_IMAGE_READER_H
5962
#define GX_IMAGE_READER_H
6063

64+
#if defined(GX_ENABLE_ARM_HELIUM)
65+
#include <arm_mve.h>
66+
#endif
67+
6168
#define GX_IMAGE_FORMAT_1BPP 0xf0
6269
#define GX_IMAGE_FORMAT_2BPP 0xf1
6370
#define GX_IMAGE_FORMAT_4BPP 0xf2
@@ -83,15 +90,21 @@
8390
GX_PNG_HUFFMAN_LIT_CODE_LEN_TABLE_SIZE + \
8491
GX_PNG_HUFFMAN_DIST_CODE_LEN_TABLE_SIZE + \
8592
GX_PNG_PALETTE_TABLE_SIZE)
86-
#define JPG_MAX_COMPONENTS 3
87-
#define HUFF_TABLE_DIMENSION 2
88-
#define JPG_QUANT_TABLE_DIMENSION 4
93+
#define JPG_MAX_COMPONENTS 3
94+
#define HUFF_TABLE_DIMENSION 2
95+
#define JPG_QUANT_TABLE_DIMENSION 4
8996

9097
/* Control block used internally for jpeg reader. */
98+
typedef struct GX_HUFFCODE_INFO_STRUCT
99+
{
100+
USHORT start;
101+
USHORT end;
102+
USHORT index;
103+
GX_UBYTE bits;
104+
} GX_HUFFCODE_INFO;
91105

92106
typedef struct GX_JPEG_INFO_STRUCT
93107
{
94-
UINT (*gx_jpeg_mcu_draw)(struct GX_JPEG_INFO_STRUCT *, INT, INT);
95108
USHORT gx_jpeg_width;
96109
USHORT gx_jpeg_height;
97110
INT gx_jpeg_num_of_components;
@@ -101,22 +114,35 @@ typedef struct GX_JPEG_INFO_STRUCT
101114
GX_UBYTE gx_jpeg_dc_table_index[JPG_MAX_COMPONENTS];
102115
GX_UBYTE gx_jpeg_ac_table_index[JPG_MAX_COMPONENTS];
103116
INT gx_jpeg_quantization_table[JPG_QUANT_TABLE_DIMENSION][64];
104-
INT *gx_jpeg_huffman_table[HUFF_TABLE_DIMENSION][HUFF_TABLE_DIMENSION];
105-
GX_VALUE gx_jpeg_huffman_bits_count[HUFF_TABLE_DIMENSION][HUFF_TABLE_DIMENSION][16];
117+
GX_UBYTE *gx_jpeg_huffman_table[HUFF_TABLE_DIMENSION][HUFF_TABLE_DIMENSION];
118+
GX_HUFFCODE_INFO gx_jpeg_huffman_code_info[HUFF_TABLE_DIMENSION][HUFF_TABLE_DIMENSION][16];
106119
INT gx_jpeg_restart_interval;
107-
GX_UBYTE gx_jpeg_Y_block[256];
108-
GX_UBYTE gx_jpeg_Cr_block[64];
109-
GX_UBYTE gx_jpeg_Cb_block[64];
120+
GX_BYTE gx_jpeg_Y_block[256];
121+
GX_BYTE gx_jpeg_Cr_block[64];
122+
GX_BYTE gx_jpeg_Cb_block[64];
110123
INT gx_jpeg_pre_dc[JPG_MAX_COMPONENTS];
111124
INT gx_jpeg_vecter[64];
112125
GX_UBYTE *gx_jpeg_data;
113126
INT gx_jpeg_data_size;
114127
INT gx_jpeg_data_index;
115-
GX_UBYTE *gx_jpeg_decoded_data;
116-
UINT gx_jpeg_decoded_data_size;
117-
GX_DRAW_CONTEXT *gx_jpeg_draw_context;
118-
INT gx_jpeg_draw_xpos;
119-
INT gx_jpeg_draw_ypos;
128+
UINT gx_jpeg_bit_buffer;
129+
UINT gx_jpeg_bit_count;
130+
#if defined(GX_ENABLE_ARM_HELIUM)
131+
VOID (*gx_jpeg_pixel_write_helium)(struct GX_JPEG_INFO_STRUCT *jpeg_info, uint8x16_t vred, uint8x16_t vgreen, uint8x16_t vblue, INT size);
132+
#else
133+
VOID (*gx_jpeg_pixel_write)(struct GX_JPEG_INFO_STRUCT *jpeg_info, GX_UBYTE red, GX_UBYTE green, GX_UBYTE blue);
134+
#endif
135+
GX_UBYTE *gx_jpeg_output_buffer;
136+
USHORT gx_jpeg_output_width;
137+
USHORT gx_jpeg_output_height;
138+
INT gx_jpeg_output_stride;
139+
GX_RECTANGLE gx_jpeg_output_clip;
140+
INT gx_jpeg_output_xpos;
141+
INT gx_jpeg_output_ypos;
142+
GX_UBYTE gx_jpeg_output_bpp;
143+
GX_UBYTE gx_jpeg_output_color_format;
144+
USHORT gx_jpeg_output_rotation_angle;
145+
GX_UBYTE *gx_jpeg_putdata;
120146
} GX_JPEG_INFO;
121147

122148
/* control block used internally for png reader */
@@ -165,11 +191,9 @@ UINT _gx_image_reader_create(GX_IMAGE_READER *image_reader,
165191

166192
/* Define internal function prototypes. */
167193
UINT _gx_image_reader_png_decode(GX_CONST GX_UBYTE *read_data, ULONG read_data_size, GX_PIXELMAP *outmap);
168-
UINT _gx_image_reader_jpeg_decode(GX_CONST GX_UBYTE *read_data, ULONG data_size, GX_PIXELMAP *outmap);
169-
UINT _gx_image_reader_jpeg_mcu_decode(GX_CONST GX_UBYTE * read_data, ULONG data_size,
170-
GX_DRAW_CONTEXT * context, INT xpos, INT ypos,
171-
UINT(draw_function)(GX_JPEG_INFO *, INT, INT));
172-
194+
UINT _gx_image_reader_jpeg_decode(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap);
195+
UINT _gx_image_reader_jpeg_mcu_decode(GX_CONST GX_UBYTE *read_data, ULONG data_size,
196+
GX_DRAW_CONTEXT *context, INT xpos, INT ypos);
173197

174198
UINT _gx_image_reader_pixel_read_callback_set(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap);
175199
UINT _gx_image_reader_pixel_write_callback_set(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap);
@@ -194,6 +218,90 @@ UINT _gxe_image_reader_palette_set(GX_IMAGE_READER *image_reader, GX_COLOR *pal,
194218
UINT _gxe_image_reader_start(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap);
195219

196220

197-
#endif
198-
#endif
221+
#define GX_JPEG_DECODE_YCBCR2RGB(red, green, blue, y, cb, cr) \
222+
red = y + cr + (cr >> 2) + (cr >> 3) + 128; \
223+
green = y - ((cb >> 2) + (cb >> 4) + (cb >> 5)) - ((cr >> 1) + (cr >> 3) + (cr >> 4) + (cr >> 5)) + 128; \
224+
blue = y + cb + (cb >> 1) + (cb >> 2) + (cb >> 6) + 128;
225+
226+
#if defined(GX_ENABLE_ARM_HELIUM)
227+
228+
/* This offset table contains four offset vectors that used to gather load 16 cb/cr values to a 8x16 vector.
229+
The table index represents the subsampling factor in horizontal. */
230+
static uint8x16_t _gx_jpeg_cbcr_offset_table[7] = {
231+
{0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0}, /* h = 1 */
232+
{0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}, /* h = 2 */
233+
{0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7}, /* h = 2 */
234+
{0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3}, /* h = 4 */
235+
{0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4}, /* h = 4 */
236+
{0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4}, /* h = 4 */
237+
{0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4}, /* h = 4 */
238+
};
239+
240+
static uint8x16_t _gx_jpeg_cbcr_offset_rotated_table_cw[3] = {
241+
{0, 8, 16, 24, 32, 40, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0}, /* cw, v = 1 */
242+
{0, 0, 8, 8, 16, 16, 24, 24, 32, 32, 40, 40, 48, 48, 56, 56}, /* cw, v = 2 */
243+
{0, 8, 8, 16, 16, 24, 24, 32, 32, 40, 40, 48, 48, 56, 56, 56} /* cw, v = 2 */
244+
};
245+
246+
static uint8x16_t _gx_jpeg_cbcr_offset_rotated_table_ccw[2] = {
247+
{56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* ccw, v = 1 */
248+
{56, 56, 48, 48, 40, 40, 32, 32, 24, 24, 16, 16, 8, 8, 0, 0}, /* ccw, v = 2 */
249+
};
250+
251+
static uint8x16_t _gx_jpeg_y_offset_rotated_table_cw[3] = {
252+
{0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120}, /* cw, h = 1, v = 1 */
253+
{0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240}, /* cw, h = 2, v = 1 or v = 2 */
254+
{0, 32, 64, 96, 128, 160, 192, 224, 224, 224, 224, 224, 224, 224, 224, 224} /* cw, h = 4, v = 1 */
255+
};
256+
257+
static uint8x16_t _gx_jpeg_y_offset_rotated_table_ccw[4] = {
258+
{56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* ccw, h = 1, v = 1 */
259+
{112, 96, 80, 64, 48, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* ccw, h = 2, v = 1 */
260+
{240, 224, 208, 192, 176, 160, 144, 128, 112, 96, 80, 64, 48, 32, 16, 0}, /* ccw, h = 2, v = 2 */
261+
{224, 192, 160, 128, 96, 64, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* ccw, h = 4, v = 1 */
262+
};
263+
264+
265+
#define GX_JPEG_DECODE_YCBCR2RGB_HELIUM(vred, vgreen, vblue, y, cb, cr) \
266+
{ \
267+
int8x16_t vt; \
268+
vred = (uint8x16_t)vqaddq_s8(y, cr); \
269+
vt = vshrq_n_s8(cr, 2); \
270+
vred = (uint8x16_t)vqaddq_s8((int8x16_t)vred, vt); \
271+
vt = vshrq_n_s8(cr, 3); \
272+
vred = (uint8x16_t)vqaddq_s8((int8x16_t)vred, vt); \
273+
vred = vaddq_n_u8(vred, 128); \
274+
\
275+
vt = vshrq_n_s8(cb, 2); \
276+
vgreen = (uint8x16_t)vshrq_n_s8(cb, 4); \
277+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
278+
vt = vshrq_n_s8(cb, 5); \
279+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
280+
vt = vshrq_n_s8(cr, 1); \
281+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
282+
vt = vshrq_n_s8(cr, 3); \
283+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
284+
vt = vshrq_n_s8(cr, 4); \
285+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
286+
vt = vshrq_n_s8(cr, 5); \
287+
vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
288+
vgreen = (uint8x16_t)vqsubq_s8(y, (int8x16_t)vgreen); \
289+
vgreen = vaddq_n_u8(vgreen, 128); \
290+
\
291+
vblue = (uint8x16_t)vqaddq_s8(y, cb); \
292+
vt = vshrq_n_s8(cb, 1); \
293+
vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
294+
vt = vshrq_n_s8(cb, 2); \
295+
vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
296+
vt = vshrq_n_s8(cb, 6); \
297+
vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
298+
vblue = vaddq_n_u8(vblue, 128); \
299+
}
300+
301+
302+
#endif /* GX_ENABLE_ARM_HELIUM */
303+
304+
#endif /* GX_IMAGE_READER_H */
305+
306+
#endif /* GX_SOFTWARE_DECODER_SUPPORT */
199307

common/inc/gx_user_sample.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
/* APPLICATION INTERFACE DEFINITION RELEASE */
2525
/* */
2626
/* gx_user.h PORTABLE C */
27-
/* 6.1.10 */
27+
/* 6.x */
2828
/* AUTHOR */
2929
/* */
3030
/* Kenneth Maxwell, Microsoft Corporation */
@@ -45,6 +45,10 @@
4545
/* 01-31-2022 Kenneth Maxwell Modified comment(s), */
4646
/* fixed typo, */
4747
/* resulting in version 6.1.10 */
48+
/* xx-xx-xxxx Ting Zhu Modified comment(s), */
49+
/* added GX_ENABLE_ARM_HELIUM */
50+
/* definition, */
51+
/* resulting in version 6.x */
4852
/* */
4953
/**************************************************************************/
5054

@@ -68,5 +72,9 @@
6872
/* This can be defined to insert an application specific data
6973
field into the GX_WIDGET control block */
7074
/* #define GX_WIDGET_USER_DATA */
75+
76+
/* This can be defined to enable the use of ARM Helium intrinsics for
77+
JPEG decoding. */
78+
/* #define GX_ENABLE_ARM_HELIUM */
7179
#endif
7280

0 commit comments

Comments
 (0)