1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-01-14 06:43:20 +08:00

Release 6.1.4

This commit is contained in:
Yuxin Zhou 2021-02-02 00:52:44 +00:00
parent 6381fa5859
commit 09b3b1509f
66 changed files with 92705 additions and 79611 deletions

View File

@ -162,11 +162,18 @@ target_sources(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_pixelmap_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_png_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_rotated_canvas_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_rotated_jpeg_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_rotated_pixel_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_rotated_png_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_24xrgb_rotated_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_native_color_get.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_pixel_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_pixelmap_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_pixelmap_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_rotated_pixel_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32argb_rotated_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_block_move.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_canvas_copy.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_glyph_1bit_draw.c
@ -180,6 +187,19 @@ target_sources(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_simple_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_vertical_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_vertical_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_block_move.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_canvas_copy.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_glyph_1bit_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_horizontal_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_horizontal_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_horizontal_pixelmap_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_pixel_write.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_pixelmap_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_pixelmap_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_pixelmap_rotate.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_simple_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_vertical_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_32bpp_rotated_vertical_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_332rgb_native_color_get.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_332rgb_pixel_blend.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_332rgb_pixelmap_draw.c
@ -226,6 +246,7 @@ target_sources(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_565rgb_rotated_png_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_565rgb_rotated_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bit_palette_native_color_get.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bit_palette_rotated_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bit_palette_setup.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_block_move.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_canvas_copy.c
@ -245,6 +266,20 @@ target_sources(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_simple_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_vertical_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_vertical_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_block_move.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_canvas_copy.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_glyph_1bit_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_glyph_3bit_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_glyph_4bit_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_horizontal_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_horizontal_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_pixel_write.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_pixelmap_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_pixelmap_rotate.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_simple_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_vertical_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_8bpp_rotated_vertical_pattern_line_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_arc_clipping_get.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_generic_aliased_arc_draw.c
${CMAKE_CURRENT_LIST_DIR}/src/gx_display_driver_generic_aliased_circle_draw.c

View File

@ -24,7 +24,7 @@
/* APPLICATION INTERFACE DEFINITION RELEASE */
/* */
/* gx_api.h PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -53,6 +53,13 @@
/* declare new APIs, */
/* defined new status, */
/* resulting in version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* change scroll_wheel style */
/* flag to status flag, */
/* renamed */
/* GX_STATUS_TRACKING_START to */
/* GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
@ -76,7 +83,7 @@ extern "C" {
#define AZURE_RTOS_GUIX
#define GUIX_MAJOR_VERSION 6
#define GUIX_MINOR_VERSION 1
#define GUIX_PATCH_VERSION 3
#define GUIX_PATCH_VERSION 4
/* The following symbols are defined for backward compatibility reasons.*/
#define __PRODUCT_GUIX__
@ -690,7 +697,7 @@ typedef struct GX_STRING_STRUCT
/* Define radial slider status flags */
#define GX_STATUS_ANIMATION_NONE 0x00010000UL
#define GX_STATUS_TRACKING_START 0x00020000UL
#define GX_STATUS_TRACKING_PEN 0x00020000UL
#define GX_STATUS_MODAL 0x00100000UL
@ -813,10 +820,6 @@ typedef struct GX_STRING_STRUCT
#define GX_SCROLLBAR_VERTICAL 0x01000000UL
#define GX_SCROLLBAR_HORIZONTAL 0x02000000UL
/* Define Animation Styles. */
/* Define generic scroll wheel styles*/
#define GX_STYLE_SCROLL_WHEEL_DRAG 0x00000200UL
/* Define text scroll wheel styles*/
#define GX_STYLE_TEXT_SCROLL_WHEEL_ROUND 0x00000100UL

View File

@ -26,7 +26,7 @@
/* COMPONENT DEFINITION RELEASE */
/* */
/* gx_display.h PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -48,6 +48,10 @@
/* added rotated display */
/* driver declarations, */
/* resulting in version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* added 8bpp/32bpp rotated */
/* display driver declarations,*/
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
@ -208,6 +212,21 @@ VOID _gx_display_driver_8bpp_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RE
VOID _gx_display_driver_8bpp_glyph_3bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_8bpp_glyph_4bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_8bpp_rotated_block_move(GX_DRAW_CONTEXT *context, GX_RECTANGLE *src, INT xshift, INT yshift);
VOID _gx_display_driver_8bpp_rotated_canvas_copy(GX_CANVAS *source, GX_CANVAS *dest);
VOID _gx_display_driver_8bpp_rotated_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_8bpp_rotated_glyph_3bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_8bpp_rotated_glyph_4bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_8bpp_rotated_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color);
VOID _gx_display_driver_8bpp_rotated_horizontal_pattern_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos);
VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, GX_FILL_PIXELMAP_INFO *info);
VOID _gx_display_driver_8bpp_rotated_pixel_write(GX_DRAW_CONTEXT *context, INT xcoord, INT ycoord, GX_COLOR color);
VOID _gx_display_driver_8bpp_rotated_pixelmap_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp);
VOID _gx_display_driver_8bpp_rotated_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, INT angle, INT cx, INT cy);
VOID _gx_display_driver_8bpp_rotated_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend);
VOID _gx_display_driver_8bpp_rotated_vertical_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos, INT width, GX_COLOR color);
VOID _gx_display_driver_8bpp_rotated_vertical_pattern_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos);
VOID _gx_display_driver_565rgb_canvas_blend(GX_CANVAS *source, GX_CANVAS *dest);
VOID _gx_display_driver_16bpp_canvas_copy(GX_CANVAS *source, GX_CANVAS *dest);
VOID _gx_display_driver_16bpp_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color);
@ -263,9 +282,16 @@ VOID _gx_display_driver_24xrgb_pixel_blend(GX_DRAW_CONTEXT *context, INT xco
VOID _gx_display_driver_24xrgb_pixelmap_blend(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp, GX_UBYTE alpha);
VOID _gx_display_driver_24xrgb_pixelmap_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp);
VOID _gx_display_driver_24xrgb_rotated_canvas_blend(GX_CANVAS *source, GX_CANVAS *dest);
VOID _gx_display_driver_24xrgb_rotated_pixel_blend(GX_DRAW_CONTEXT *context, INT xcoord, INT ycoord, GX_COLOR fcolor, GX_UBYTE alpha);
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
UINT _gx_display_driver_24xrgb_YCbCr2RGB(INT y, INT cb, INT cr);
VOID _gx_display_driver_24xrgb_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
VOID _gx_display_driver_24xrgb_png_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
VOID _gx_display_driver_24xrgb_rotated_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
VOID _gx_display_driver_24xrgb_rotated_png_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap);
#endif
GX_COLOR _gx_display_driver_24xrgb_native_color_get(GX_DISPLAY *, GX_COLOR rawcolor);
@ -279,13 +305,30 @@ VOID _gx_display_driver_32bpp_vertical_pattern_line_draw(GX_DRAW_CONTEXT *co
VOID _gx_display_driver_32bpp_block_move(GX_DRAW_CONTEXT *context, GX_RECTANGLE *src, INT xshift, INT yshift);
USHORT _gx_display_driver_32bpp_row_pitch_get(USHORT width);
VOID _gx_display_driver_32bpp_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend);
VOID _gx_display_driver_32bpp_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT rot_cx, INT rot_cy);
VOID _gx_display_driver_32bpp_rotated_canvas_copy(GX_CANVAS *source, GX_CANVAS *dest);
VOID _gx_display_driver_32bpp_rotated_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph);
VOID _gx_display_driver_32bpp_rotated_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color);
VOID _gx_display_driver_32bpp_rotated_horizontal_pattern_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos);
VOID _gx_display_driver_32bpp_rotated_horizontal_pixelmap_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, GX_FILL_PIXELMAP_INFO *info);
VOID _gx_display_driver_32bpp_rotated_pixel_write(GX_DRAW_CONTEXT *context, INT xcoord, INT ycoord, GX_COLOR color);
VOID _gx_display_driver_32bpp_rotated_pixelmap_blend(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp, GX_UBYTE alpha);
VOID _gx_display_driver_32bpp_rotated_pixelmap_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp);
VOID _gx_display_driver_32bpp_rotated_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, INT angle, INT rot_cx, INT rot_cy);
VOID _gx_display_driver_32bpp_rotated_vertical_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos, INT width, GX_COLOR color);
VOID _gx_display_driver_32bpp_rotated_vertical_pattern_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos);
VOID _gx_display_driver_32bpp_rotated_block_move(GX_DRAW_CONTEXT *context, GX_RECTANGLE *src, INT xshift, INT yshift);
VOID _gx_display_driver_32bpp_rotated_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend);
VOID _gx_display_driver_32argb_pixel_blend(GX_DRAW_CONTEXT *context, INT xcoord, INT ycoord, GX_COLOR fcolor, GX_UBYTE alpha);
VOID _gx_display_driver_32argb_pixelmap_blend(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp, GX_UBYTE alpha);
VOID _gx_display_driver_32argb_pixelmap_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, GX_PIXELMAP *pmp);
GX_COLOR _gx_display_driver_32argb_native_color_get(GX_DISPLAY *, GX_COLOR rawcolor);
VOID _gx_display_driver_32bpp_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT rot_cx, INT rot_cy);
VOID _gx_display_driver_32argb_rotated_pixel_blend(GX_DRAW_CONTEXT *context, INT xcoord, INT ycoord, GX_COLOR fcolor, GX_UBYTE alpha);
VOID _gx_display_driver_4444argb_canvas_blend(GX_CANVAS *canvas, GX_CANVAS *composite);
VOID _gx_display_driver_4444argb_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
VOID _gx_display_driver_4444argb_horizontal_pixelmap_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, GX_FILL_PIXELMAP_INFO *info);
@ -361,9 +404,18 @@ VOID _gx_display_driver_32argb_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_32argb_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_24xrgb_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_24xrgb_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_4444argb_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
@ -380,6 +432,10 @@ VOID _gx_display_driver_8bit_palette_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_8bit_palette_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
VOID _gx_display_driver_332rgb_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area));
@ -398,10 +454,9 @@ VOID _gx_display_driver_1555xrgb_canvas_blend(GX_CANVAS *canvas, GX_CANVAS *comp
VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty);
#endif
#define REDVAL_16BPP(_c) (GX_UBYTE)(((_c) >> 11) & 0x1f)
#define GREENVAL_16BPP(_c) (GX_UBYTE)(((_c) >> 5) & 0x3f)
#define BLUEVAL_16BPP(_c) (GX_UBYTE)(((_c)) & 0x1f)
#define REDVAL_16BPP(_c) (GX_UBYTE)(((_c) >> 11) & 0x1f)
#define GREENVAL_16BPP(_c) (GX_UBYTE)(((_c) >> 5) & 0x3f)
#define BLUEVAL_16BPP(_c) (GX_UBYTE)(((_c)) & 0x1f)
/* Define macros for assembling a 16-bit r:g:b value from 3 components. */
@ -411,9 +466,9 @@ VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty);
(((_b) & 0x1f)))
#define REDVAL_24BPP(_c) (GX_UBYTE)((_c) >> 16)
#define GREENVAL_24BPP(_c) (GX_UBYTE)((_c) >> 8)
#define BLUEVAL_24BPP(_c) (GX_UBYTE)(_c)
#define REDVAL_24BPP(_c) (GX_UBYTE)((_c) >> 16)
#define GREENVAL_24BPP(_c) (GX_UBYTE)((_c) >> 8)
#define BLUEVAL_24BPP(_c) (GX_UBYTE)(_c)
/* Define macros for assembling a 24-bit r:g:b value from 3 components. */
#define ASSEMBLECOLOR_24BPP(_r, _g, _b) \
@ -422,10 +477,10 @@ VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty);
(_b))
#define REDVAL_32BPP(_c) (GX_UBYTE)((_c) >> 16)
#define GREENVAL_32BPP(_c) (GX_UBYTE)((_c) >> 8)
#define BLUEVAL_32BPP(_c) (GX_UBYTE)(_c)
#define ALPHAVAL_32BPP(_c) (GX_UBYTE)((_c) >> 24)
#define REDVAL_32BPP(_c) (GX_UBYTE)((_c) >> 16)
#define GREENVAL_32BPP(_c) (GX_UBYTE)((_c) >> 8)
#define BLUEVAL_32BPP(_c) (GX_UBYTE)(_c)
/* Define macros for assembling a 32-bit r:g:b value from 3 components. */
@ -433,16 +488,30 @@ VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty);
(((_r) << 16) | \
((_g) << 8) | \
(_b))
#define ASSEMBLECOLOR_32ARGB(_a, _r, _g, _b) \
(((_a) << 24) | \
((_r) << 16) | \
((_g) << 8) | \
(_b))
#define GX_SET_BLEND_FUNCTION(blend_func, color_format) \
switch (color_format) \
{ \
case GX_COLOR_FORMAT_565RGB: \
blend_func = _gx_display_driver_565rgb_pixel_blend; \
break; \
case GX_COLOR_FORMAT_24XRGB: \
blend_func = _gx_display_driver_24xrgb_pixel_blend; \
break; \
case GX_COLOR_FORMAT_32ARGB: \
blend_func = _gx_display_driver_32argb_pixel_blend; \
break; \
default: \
/* Not supported. */ \
return; \
}
#endif
#define GX_SET_BLEND_FUNCTION(blend_func, color_format) \
switch (color_format) \
{ \
case GX_COLOR_FORMAT_565RGB: \
blend_func = _gx_display_driver_565rgb_pixel_blend; \
break; \
default: \
/* Not supported. */ \
return; \
}

View File

@ -35,7 +35,7 @@
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_YCbCr2RGB PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -69,10 +69,13 @@
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* made function public, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
static UINT _gx_display_driver_24xrgb_YCbCr2RGB(INT y, INT cb, INT cr)
UINT _gx_display_driver_24xrgb_YCbCr2RGB(INT y, INT cb, INT cr)
{
INT red;
INT green;

View File

@ -0,0 +1,167 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_utility.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_rotated_canvas_blend PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Rotated canvas blend function for 24xrgb color format. */
/* */
/* INPUT */
/* */
/* canvas The canvas to blend to */
/* composite The canvas to blend from */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_rectangle_shift Adjust the rectangle */
/* _gx_utility_recttangle_overlap_detect Detect whether two areas */
/* overlap */
/* REDVAL_24BPP Extrace Red from canvas */
/* GREENVAL_24BPP Extrace Green from canvas */
/* BLUEVAL_24BPP Extrace Blue from canvas */
/* ASSEMBLECOLOR_24BPP Compose the RGB color */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_24xrgb_rotated_canvas_blend(GX_CANVAS *canvas, GX_CANVAS *composite)
{
GX_RECTANGLE dirty;
GX_RECTANGLE overlap;
ULONG *read;
ULONG *read_start;
ULONG *write;
ULONG *write_start;
ULONG fcolor;
GX_UBYTE fred, fgreen, fblue;
GX_UBYTE bred, bgreen, bblue;
GX_UBYTE alpha, balpha;
ULONG bcolor;
INT row;
INT col;
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);
_gx_utility_rectangle_shift(&dirty, canvas -> gx_canvas_display_offset_x, canvas -> gx_canvas_display_offset_y);
if (_gx_utility_rectangle_overlap_detect(&dirty, &composite -> gx_canvas_dirty_area, &overlap))
{
alpha = canvas -> gx_canvas_alpha;
balpha = (GX_UBYTE)(256 - alpha);
read_start = (ULONG *)canvas -> gx_canvas_memory;
write_start = (ULONG *)composite -> gx_canvas_memory;
if (canvas -> gx_canvas_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Index into starting row. */
read_start += (dirty.gx_rectangle_right - overlap.gx_rectangle_right) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read_start += overlap.gx_rectangle_top - dirty.gx_rectangle_top;
/* Calculate the write pointer. */
write_start += (composite -> gx_canvas_x_resolution - overlap.gx_rectangle_right - 1) * composite -> gx_canvas_y_resolution;
write_start += overlap.gx_rectangle_top;
}
else
{
/* Index into starting row. */
read_start += (overlap.gx_rectangle_left - dirty.gx_rectangle_left) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read_start += dirty.gx_rectangle_bottom - overlap.gx_rectangle_bottom;
/* Calculate the write pointer. */
write_start += overlap.gx_rectangle_left * composite -> gx_canvas_y_resolution;
write_start += (composite -> gx_canvas_y_resolution - overlap.gx_rectangle_bottom - 1);
}
for (row = overlap.gx_rectangle_left; row <= overlap.gx_rectangle_right; row++)
{
read = read_start;
write = write_start;
for (col = overlap.gx_rectangle_top; col <= overlap.gx_rectangle_bottom; col++)
{
/* Read the foreground color. */
fcolor = *read++;
/* Split foreground into red, green, and blue components. */
fred = REDVAL_24BPP(fcolor);
fgreen = GREENVAL_24BPP(fcolor);
fblue = BLUEVAL_24BPP(fcolor);
/* Read background color. */
bcolor = *write;
/* Split background color into red, green, and blue components. */
bred = REDVAL_24BPP(bcolor);
bgreen = GREENVAL_24BPP(bcolor);
bblue = BLUEVAL_24BPP(bcolor);
/* Blend foreground and background, each color channel. */
fred = (GX_UBYTE)(((bred * balpha) + (fred * alpha)) >> 8);
fgreen = (GX_UBYTE)(((bgreen * balpha) + (fgreen * alpha)) >> 8);
fblue = (GX_UBYTE)(((bblue * balpha) + (fblue * alpha)) >> 8);
/* Re-assemble into 16-bit color and write it out. */
*write++ = ASSEMBLECOLOR_32ARGB((ULONG)0xff, (ULONG)fred, (ULONG)fgreen, (ULONG)fblue);
}
write_start += composite -> gx_canvas_y_resolution;
read_start += canvas -> gx_canvas_y_resolution;
}
}
}

View File

@ -0,0 +1,191 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_context.h"
#include "gx_system.h"
#include "gx_image_reader.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_rotated_mcu_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function to draw one MCU of decoded JPEG data to */
/* rotated canvas. */
/* */
/* INPUT */
/* */
/* context GUIX draw context */
/* xpos X position to draw */
/* ypos y position to draw */
/* jpeg_info JPEG control block */
/* */
/* OUTPUT */
/* */
/* Status Code */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_YCbCr2RGB */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_24xrgb_rotated_jpeg_decode */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
static UINT _gx_display_driver_24xrgb_rotated_mcu_draw(GX_JPEG_INFO *jpeg_info, INT xpos, INT ypos)
{
GX_COLOR *put;
INT x;
INT y;
INT w;
INT h;
INT coff;
INT Y;
INT Cb;
INT Cr;
GX_DRAW_CONTEXT *context = jpeg_info -> gx_jpeg_draw_context;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
INT rotated_xpos;
INT rotated_ypos;
INT sign;
h = (jpeg_info -> gx_jpeg_sample_factor[0] >> 4);
w = (jpeg_info -> gx_jpeg_sample_factor[0] & 0x0f);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_xpos = ypos;
rotated_ypos = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xpos - 1;
sign = 1;
}
else
{
rotated_xpos = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ypos - 1;
rotated_ypos = xpos;
sign = -1;
}
put = context -> gx_draw_context_memory;
put += rotated_ypos * context -> gx_draw_context_pitch;
put += rotated_xpos;
for (x = 0; x < 8 * w; x++)
{
for (y = 0; y < 8 * h; y++)
{
if ((xpos + x >= clip -> gx_rectangle_left) && (xpos + x <= clip -> gx_rectangle_right) &&
(ypos + y >= clip -> gx_rectangle_top) && (ypos + y <= clip -> gx_rectangle_bottom))
{
coff = x / w + ((y / h) << 3);
Y = jpeg_info -> gx_jpeg_Y_block[x + y * w * 8];
Cb = jpeg_info -> gx_jpeg_Cb_block[coff];
Cr = jpeg_info -> gx_jpeg_Cr_block[coff];
*(put + y * sign) = (_gx_display_driver_24xrgb_YCbCr2RGB(Y, Cb, Cr) | 0xff000000);
}
}
put -= context -> gx_draw_context_pitch * sign;
}
return GX_SUCCESS;
}
#endif
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_dislay_driver_24xrgb_rotated_jpeg_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 24xrgb rotated screen driver JPEG image draw routine. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_image_reader_jpeg_mcu_decode */
/* [_gx_display_driver_24xrgb_rotated_mcu_draw] */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
VOID _gx_display_driver_24xrgb_rotated_jpeg_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
_gx_image_reader_jpeg_mcu_decode(pixelmap -> gx_pixelmap_data,
pixelmap -> gx_pixelmap_data_size,
context, xpos, ypos,
_gx_display_driver_24xrgb_rotated_mcu_draw);
}
#endif

View File

@ -0,0 +1,131 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_rotated_pixel_blend PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Rotated pixel blend function for 24xrgb color format. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* x X coordinate */
/* y Y coordinate */
/* color Color of line to write */
/* alpha Alpha value */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* REDVAL_24BPP Extract the red component */
/* GREENVAL_24BPP Extract the green component */
/* BLUEVAL_24BPP Extract the blue component */
/* ASSEMBLECOLOR_24BPP Assemble color components */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_24xrgb_rotated_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha)
{
GX_UBYTE fred, fgreen, fblue;
GX_UBYTE bred, bgreen, bblue;
GX_UBYTE balpha;
ULONG bcolor;
ULONG *put;
/* Is the pixel non-transparent? */
if (alpha > 0)
{
/* Calculate address of pixel. */
put = (ULONG *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
put += context -> gx_draw_context_pitch * (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - x - 1);
put += y;
}
else
{
put += context -> gx_draw_context_pitch * x;
put += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - y - 1);
}
/* No need to blend if alpha value is 255. */
if (alpha == 255)
{
*put = (ULONG)(fcolor | 0xff000000);
return;
}
/* Split foreground into red, green, and blue components. */
fred = REDVAL_24BPP(fcolor);
fgreen = GREENVAL_24BPP(fcolor);
fblue = BLUEVAL_24BPP(fcolor);
/* Read background color. */
bcolor = *put;
/* Split background color into red, green, and blue components. */
bred = REDVAL_24BPP(bcolor);
bgreen = GREENVAL_24BPP(bcolor);
bblue = BLUEVAL_24BPP(bcolor);
/* Background alpha is inverse of foreground alpha. */
balpha = (GX_UBYTE)(256 - alpha);
/* Blend foreground and background, each color channel. */
fred = (GX_UBYTE)(((bred * balpha) + (fred * alpha)) >> 8);
fgreen = (GX_UBYTE)(((bgreen * balpha) + (fgreen * alpha)) >> 8);
fblue = (GX_UBYTE)(((bblue * balpha) + (fblue * alpha)) >> 8);
/* Re-assemble into 32-bit color and write it out. */
*put = (ULONG)(ASSEMBLECOLOR_32ARGB(0xff, fred, fgreen, fblue));
}
}

View File

@ -0,0 +1,107 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_context.h"
#include "gx_system.h"
#include "gx_display.h"
#include "gx_image_reader.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_rotated_png_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Rotated 24xrgb format screen driver PNG drawing function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_image_reader_create */
/* _gx_image_reader_start */
/* _gx_display_driver_24xrgb_rotated_pixelmap_draw */
/* _gx_system_memory_free */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
VOID _gx_display_driver_24xrgb_rotated_png_draw(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
GX_IMAGE_READER image_reader;
GX_PIXELMAP pic_outmap;
GX_UBYTE mode = GX_IMAGE_READER_MODE_ALPHA;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
mode |= GX_IMAGE_READER_MODE_ROTATE_CW;
}
else
{
mode |= GX_IMAGE_READER_MODE_ROTATE_CCW;
}
_gx_image_reader_create(&image_reader,
pixelmap -> gx_pixelmap_data,
(INT)pixelmap -> gx_pixelmap_data_size,
GX_COLOR_FORMAT_24XRGB, mode);
if (_gx_image_reader_start(&image_reader, &pic_outmap) == GX_SUCCESS)
{
_gx_display_driver_32bpp_rotated_pixelmap_draw(context, xpos, ypos, &pic_outmap);
_gx_system_memory_free((VOID *)pic_outmap.gx_pixelmap_data);
}
}
#endif

View File

@ -0,0 +1,129 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_24xrgb_rotated_setup PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32-bit XRGB color format display driver setup */
/* routine. */
/* */
/* INPUT */
/* */
/* display The display control block */
/* aux_data Driver-defined auxiliary data */
/* toggle_function Driver-defined screen toggle */
/* function */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_24xrgb_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area))
{
_gx_display_driver_24xrgb_setup(display, aux_data, toggle_function);
#if defined(GX_MOUSE_SUPPORT)
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_draw = GX_NULL;
display -> gx_display_driver_drawing_initiate = GX_NULL;
display -> gx_display_driver_drawing_complete = GX_NULL;
display -> gx_display_mouse_position_set = GX_NULL;
display -> gx_display_mouse_enable = GX_NULL;
#endif
display -> gx_display_rotation_angle = GX_SCREEN_ROTATION_CW;
display -> gx_display_driver_canvas_copy = _gx_display_driver_32bpp_rotated_canvas_copy;
display -> gx_display_driver_simple_line_draw = _gx_display_driver_32bpp_rotated_simple_line_draw;
display -> gx_display_driver_horizontal_line_draw = _gx_display_driver_32bpp_rotated_horizontal_line_draw;
display -> gx_display_driver_vertical_line_draw = _gx_display_driver_32bpp_rotated_vertical_line_draw;
display -> gx_display_driver_horizontal_pattern_line_draw = _gx_display_driver_32bpp_rotated_horizontal_pattern_line_draw;
display -> gx_display_driver_vertical_pattern_line_draw = _gx_display_driver_32bpp_rotated_vertical_pattern_line_draw;
display -> gx_display_driver_horizontal_pixelmap_line_draw = _gx_display_driver_32bpp_rotated_horizontal_pixelmap_line_draw;
display -> gx_display_driver_pixel_write = _gx_display_driver_32bpp_rotated_pixel_write;
display -> gx_display_driver_block_move = _gx_display_driver_32bpp_rotated_block_move;
display -> gx_display_driver_pixelmap_draw = _gx_display_driver_32bpp_rotated_pixelmap_draw;
display -> gx_display_driver_pixelmap_rotate = _gx_display_driver_32bpp_rotated_pixelmap_rotate;
display -> gx_display_driver_alphamap_draw = _gx_display_driver_generic_rotated_alphamap_draw;
display -> gx_display_driver_polygon_fill = _gx_display_driver_generic_rotated_polygon_fill;
#if defined(GX_ARC_DRAWING_SUPPORT)
display -> gx_display_driver_circle_fill = _gx_display_driver_generic_rotated_circle_fill;
display -> gx_display_driver_pie_fill = _gx_display_driver_generic_rotated_pie_fill;
display -> gx_display_driver_arc_fill = _gx_display_driver_generic_rotated_arc_fill;
display -> gx_display_driver_ellipse_fill = _gx_display_driver_generic_rotated_ellipse_fill;
#endif
display -> gx_display_driver_palette_set = GX_NULL;
display -> gx_display_driver_buffer_toggle = toggle_function;
display -> gx_display_driver_canvas_blend = _gx_display_driver_24xrgb_rotated_canvas_blend;
display -> gx_display_driver_pixel_blend = _gx_display_driver_24xrgb_rotated_pixel_blend;
display -> gx_display_driver_pixelmap_blend = _gx_display_driver_32bpp_rotated_pixelmap_blend;
display -> gx_display_driver_8bit_glyph_draw = _gx_display_driver_generic_rotated_glyph_8bit_draw;
display -> gx_display_driver_4bit_glyph_draw = _gx_display_driver_generic_rotated_glyph_4bit_draw;
display -> gx_display_driver_1bit_glyph_draw = _gx_display_driver_32bpp_rotated_glyph_1bit_draw;
display -> gx_display_driver_8bit_compressed_glyph_draw = GX_NULL;
display -> gx_display_driver_4bit_compressed_glyph_draw = GX_NULL;
display -> gx_display_driver_1bit_compressed_glyph_draw = GX_NULL;
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
display -> gx_display_driver_jpeg_draw = _gx_display_driver_24xrgb_rotated_jpeg_draw;
display -> gx_display_driver_png_draw = _gx_display_driver_24xrgb_rotated_png_draw;
#endif
}

View File

@ -0,0 +1,135 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32argb_rotated_pixel_blend PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Rotated Pixel blend function for 32argb color format. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* x X coordinate */
/* y Y coordinate */
/* color Color of line to write */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32argb_rotated_pixel_blend(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha)
{
GX_UBYTE falpha, fred, fgreen, fblue;
GX_UBYTE balpha, bred, bgreen, bblue;
GX_UBYTE oalpha;
ULONG bcolor;
ULONG *put;
INT combined_alpha;
falpha = ALPHAVAL_32BPP(fcolor);
falpha = (GX_UBYTE)((falpha * alpha) / 255);
/* Is the pixel non-transparent? */
if (falpha > 0)
{
/* Calculate address of pixel. */
put = (ULONG *)context -> gx_draw_context_memory;
GX_SWAP_VALS(x, y);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
y = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - y - 1;
}
else
{
x = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - x - 1;
}
put += context -> gx_draw_context_pitch * y;
put += x;
/* No need to blend if alpha value is 255. */
if (falpha == 255)
{
*put = (ULONG)fcolor;
return;
}
/* Split foreground into alpha, red, green, and blue components. */
fred = REDVAL_32BPP(fcolor);
fgreen = GREENVAL_32BPP(fcolor);
fblue = BLUEVAL_32BPP(fcolor);
/* Read background color. */
bcolor = *put;
/* Split background color into red, green, and blue components. */
balpha = ALPHAVAL_32BPP(bcolor);
bred = REDVAL_32BPP(bcolor);
bgreen = GREENVAL_32BPP(bcolor);
bblue = BLUEVAL_32BPP(bcolor);
/* Background alpha is inverse of foreground alpha. */
combined_alpha = (falpha * balpha) / 0xff;
/* Blend foreground and background, each color channel. */
oalpha = (GX_UBYTE)(falpha + balpha - combined_alpha);
fred = (GX_UBYTE)((fred * falpha + bred * balpha - bred * combined_alpha) / oalpha);
fgreen = (GX_UBYTE)((fgreen * falpha + bgreen * balpha - bgreen * combined_alpha) / oalpha);
fblue = (GX_UBYTE)((fblue * falpha + bblue * balpha - bblue * combined_alpha) / oalpha);
/* Re-assemble into 16-bit color and write it out. */
*put = (ULONG)ASSEMBLECOLOR_32ARGB(oalpha, fred, fgreen, fblue);
}
}

View File

@ -0,0 +1,121 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32argb_rotated_setup PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32-bit ARGB color format display driver setup */
/* routine. */
/* */
/* INPUT */
/* */
/* display The display control block */
/* aux_data Driver-defined auxiliary data */
/* toggle_function Driver-defined screen toggle */
/* function */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32argb_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area))
{
_gx_display_driver_32argb_setup(display, aux_data, toggle_function);
#if defined(GX_MOUSE_SUPPORT)
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_draw = GX_NULL;
display -> gx_display_driver_drawing_initiate = GX_NULL;
display -> gx_display_driver_drawing_complete = GX_NULL;
display -> gx_display_mouse_position_set = GX_NULL;
display -> gx_display_mouse_enable = GX_NULL;
#endif
display -> gx_display_rotation_angle = GX_SCREEN_ROTATION_CW;
display -> gx_display_driver_canvas_copy = _gx_display_driver_32bpp_rotated_canvas_copy;
display -> gx_display_driver_simple_line_draw = _gx_display_driver_32bpp_rotated_simple_line_draw;
display -> gx_display_driver_horizontal_line_draw = _gx_display_driver_32bpp_rotated_horizontal_line_draw;
display -> gx_display_driver_vertical_line_draw = _gx_display_driver_32bpp_rotated_vertical_line_draw;
display -> gx_display_driver_horizontal_pattern_line_draw = _gx_display_driver_32bpp_rotated_horizontal_pattern_line_draw;
display -> gx_display_driver_vertical_pattern_line_draw = _gx_display_driver_32bpp_rotated_vertical_pattern_line_draw;
display -> gx_display_driver_horizontal_pixelmap_line_draw = _gx_display_driver_32bpp_rotated_horizontal_pixelmap_line_draw;
display -> gx_display_driver_pixel_write = _gx_display_driver_32bpp_rotated_pixel_write;
display -> gx_display_driver_block_move = _gx_display_driver_32bpp_rotated_block_move;
display -> gx_display_driver_pixelmap_draw = _gx_display_driver_32bpp_rotated_pixelmap_draw;
display -> gx_display_driver_alphamap_draw = _gx_display_driver_generic_rotated_alphamap_draw;
display -> gx_display_driver_polygon_fill = _gx_display_driver_generic_rotated_polygon_fill;
#if defined(GX_ARC_DRAWING_SUPPORT)
display -> gx_display_driver_circle_fill = _gx_display_driver_generic_rotated_circle_fill;
display -> gx_display_driver_pie_fill = _gx_display_driver_generic_rotated_pie_fill;
display -> gx_display_driver_arc_fill = _gx_display_driver_generic_rotated_arc_fill;
display -> gx_display_driver_ellipse_fill = _gx_display_driver_generic_rotated_ellipse_fill;
display -> gx_display_driver_anti_aliased_wide_ellipse_draw = _gx_display_driver_generic_aliased_wide_ellipse_draw;
#endif
display -> gx_display_driver_canvas_blend = _gx_display_driver_24xrgb_rotated_canvas_blend;
display -> gx_display_driver_pixel_blend = _gx_display_driver_32argb_rotated_pixel_blend;
display -> gx_display_driver_pixelmap_blend = _gx_display_driver_32bpp_rotated_pixelmap_blend;
display -> gx_display_driver_pixelmap_rotate = _gx_display_driver_32bpp_rotated_pixelmap_rotate;
display -> gx_display_driver_8bit_glyph_draw = _gx_display_driver_generic_rotated_glyph_8bit_draw;
display -> gx_display_driver_4bit_glyph_draw = _gx_display_driver_generic_rotated_glyph_4bit_draw;
display -> gx_display_driver_1bit_glyph_draw = _gx_display_driver_32bpp_rotated_glyph_1bit_draw;
#if defined(GX_SOFTWARE_DECODER_SUPPORT)
display -> gx_display_driver_jpeg_draw = _gx_display_driver_24xrgb_rotated_jpeg_draw;
display -> gx_display_driver_png_draw = _gx_display_driver_24xrgb_rotated_png_draw;
#endif
}

View File

@ -0,0 +1,210 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_system.h"
#include "gx_utility.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_block_move PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32bpp color format display driver block moving */
/* function. */
/* */
/* INPUT */
/* */
/* context Draw context */
/* block The rectangle to be moved */
/* xshift Amount to move on X-axis */
/* yshift Amount to move on Y-axis */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* memmove Move memory content */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_block_move(GX_DRAW_CONTEXT *context,
GX_RECTANGLE *block, INT xshift, INT yshift)
{
GX_COLOR *pGet;
GX_COLOR *pPut;
int width;
int width_in_bytes;
int y;
int height;
GX_RECTANGLE rotated_block;
GX_SWAP_VALS(xshift, yshift);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_block.gx_rectangle_left = block -> gx_rectangle_top;
rotated_block.gx_rectangle_right = block -> gx_rectangle_bottom;
rotated_block.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - block -> gx_rectangle_right - 1);
rotated_block.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - block -> gx_rectangle_left - 1);
yshift = -yshift;
}
else
{
rotated_block.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - block -> gx_rectangle_bottom - 1);
rotated_block.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - block -> gx_rectangle_top - 1);
rotated_block.gx_rectangle_top = block -> gx_rectangle_left;
rotated_block.gx_rectangle_bottom = block -> gx_rectangle_right;
xshift = -xshift;
}
if (xshift)
{
if (xshift > 0)
{
/* Have to copy from left to right. */
pPut = context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left + xshift;
pGet = context -> gx_draw_context_memory;
pGet += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1 - xshift;
width_in_bytes = width * (int)sizeof(GX_COLOR);
if (width_in_bytes <= 0)
{
return;
}
for (y = rotated_block.gx_rectangle_top; y <= rotated_block.gx_rectangle_bottom; y++)
{
memmove(pPut, pGet, (size_t)width_in_bytes);
pPut += context -> gx_draw_context_pitch;
pGet += context -> gx_draw_context_pitch;
}
}
else
{
/* Have to copy from right to left. */
pPut = context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = context -> gx_draw_context_memory;
pGet += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left - xshift;
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1 + xshift;
width_in_bytes = width * (int)sizeof(GX_COLOR);
if (width_in_bytes <= 0)
{
return;
}
for (y = rotated_block.gx_rectangle_top; y <= rotated_block.gx_rectangle_bottom; y++)
{
memmove(pPut, pGet, (size_t)width_in_bytes);
pPut += context -> gx_draw_context_pitch;
pGet += context -> gx_draw_context_pitch;
}
}
}
else
{
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1;
width_in_bytes = width * (int)sizeof(GX_COLOR);
if (yshift > 0)
{
/* Have to copy from top to bottom. */
pPut = context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_bottom * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = context -> gx_draw_context_memory;
pGet += (rotated_block.gx_rectangle_bottom - yshift) * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
height = rotated_block.gx_rectangle_bottom - rotated_block.gx_rectangle_top + 1 - yshift;
for (y = 0; y < height; y++)
{
memmove(pPut, pGet, (size_t)width_in_bytes);
pPut -= context -> gx_draw_context_pitch;
pGet -= context -> gx_draw_context_pitch;
}
}
else
{
/* Have to copy from bottom to top. */
pPut = context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = context -> gx_draw_context_memory;
pGet += (rotated_block.gx_rectangle_top - yshift) * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
height = rotated_block.gx_rectangle_bottom - rotated_block.gx_rectangle_top + 1 + yshift;
for (y = 0; y < height; y++)
{
memmove(pPut, pGet, (size_t)width_in_bytes);
pPut += context -> gx_draw_context_pitch;
pGet += context -> gx_draw_context_pitch;
}
}
}
}

View File

@ -0,0 +1,129 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_utility.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_canvas_copy PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32bpp canvas copy function. */
/* */
/* INPUT */
/* */
/* canvas The canvas to copy from */
/* composite The canvas to copy to */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_rectangle_shift Move the rectangle */
/* _gx_utility_rectangle_overlap_detect Detect two rectangles being */
/* overlap to each other */
/* memcpy Move canvas data */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_canvas_copy(GX_CANVAS *canvas, GX_CANVAS *composite)
{
GX_RECTANGLE dirty;
GX_RECTANGLE overlap;
ULONG *read;
ULONG *write;
INT width;
INT row;
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);
_gx_utility_rectangle_shift(&dirty, canvas -> gx_canvas_display_offset_x, canvas -> gx_canvas_display_offset_y);
if (_gx_utility_rectangle_overlap_detect(&dirty, &composite -> gx_canvas_dirty_area, &overlap))
{
width = overlap.gx_rectangle_bottom - overlap.gx_rectangle_top + 1;
read = (ULONG *)canvas -> gx_canvas_memory;
write = (ULONG *)composite -> gx_canvas_memory;
if (canvas -> gx_canvas_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Index into starting row. */
read += (dirty.gx_rectangle_right - overlap.gx_rectangle_right) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read += overlap.gx_rectangle_top - dirty.gx_rectangle_top;
/* Calculate the write pointer. */
write += (composite -> gx_canvas_x_resolution - overlap.gx_rectangle_right - 1) * composite -> gx_canvas_y_resolution;
write += overlap.gx_rectangle_top;
}
else
{
/* Index into starting row. */
read += (overlap.gx_rectangle_left - dirty.gx_rectangle_left) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read += dirty.gx_rectangle_bottom - overlap.gx_rectangle_bottom;
/* Calculate the write pointer. */
write += overlap.gx_rectangle_left * composite -> gx_canvas_y_resolution;
write += (composite -> gx_canvas_y_resolution - overlap.gx_rectangle_bottom - 1);
}
for (row = overlap.gx_rectangle_left; row <= overlap.gx_rectangle_right; row++)
{
memcpy(write, read, (size_t)width * 4); /* Use case of memcpy is verified. */
write += composite -> gx_canvas_y_resolution;
read += canvas -> gx_canvas_y_resolution;
}
}
}

View File

@ -0,0 +1,313 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_system.h"
#include "gx_utility.h"
#include "gx_display.h"
#define DRAW_PIXEL if (alpha & mask) \
{ \
*put = text_color; \
} \
put++; \
mask = mask >> 1;
#if defined(GX_BRUSH_ALPHA_SUPPORT)
#define BLEND_PIXEL if (alpha & mask) \
{ \
_gx_display_driver_24xrgb_pixel_blend(context, xval, yval, text_color, brush_alpha); \
} \
xval++; \
mask = mask >> 1;
#endif
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_glyph_1bit_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This functions draw monochrome font on 32bpp rotated canvas, */
/* clipped to one viewport. */
/* */
/* INPUT */
/* */
/* context Draw context */
/* draw_area The region bound by the */
/* rectangle where the glyph */
/* is drawn */
/* map_offset X,Y offset into the glyph map */
/* glyph Pointer to the glyph */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* GUIX Internal code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph)
{
GX_UBYTE *glyph_row;
GX_UBYTE *glyph_data;
UINT row;
UINT pixel_per_row;
UINT pixel_in_first_byte;
UINT pixel_in_last_byte = 0;
GX_COLOR text_color;
UINT y_height;
GX_UBYTE alpha;
UINT glyph_width;
UINT *put;
UINT num_bytes;
UINT num_bits;
UINT *line_start;
GX_UBYTE mask, init_mask;
UINT i;
GX_VALUE rotated_map_offset_x;
GX_VALUE rotated_map_offset_y;
GX_VALUE rotated_draw_left;
GX_VALUE rotated_draw_top;
#if defined(GX_BRUSH_ALPHA_SUPPORT)
GX_UBYTE brush_alpha;
INT xval, yval;
VOID (*blend_func)(GX_DRAW_CONTEXT * context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
brush_alpha = context -> gx_draw_context_brush.gx_brush_alpha;
if (brush_alpha == 0)
{
return;
}
GX_SET_BLEND_FUNCTION(blend_func, context->gx_draw_context_display->gx_display_color_format);
#endif
text_color = context -> gx_draw_context_brush.gx_brush_line_color;
pixel_per_row = (UINT)(draw_area -> gx_rectangle_bottom - draw_area -> gx_rectangle_top + 1);
y_height = (UINT)(draw_area -> gx_rectangle_right - draw_area -> gx_rectangle_left + 1);
/* Find the width of the glyph, in terms of bytes. */
glyph_width = glyph -> gx_glyph_height;
/* Make it byte-aligned. */
glyph_width = (glyph_width + 7) >> 3;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_draw_left = draw_area -> gx_rectangle_top;
rotated_draw_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - draw_area -> gx_rectangle_right - 1);
rotated_map_offset_x = map_offset -> gx_point_y;
rotated_map_offset_y = (GX_VALUE)(glyph -> gx_glyph_width - map_offset -> gx_point_x - (GX_VALUE)y_height);
}
else
{
rotated_draw_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_display_offset_y - draw_area -> gx_rectangle_bottom - 1);
rotated_draw_top = draw_area -> gx_rectangle_left;
rotated_map_offset_x = (GX_VALUE)(glyph -> gx_glyph_height - map_offset -> gx_point_y - (GX_VALUE)pixel_per_row);
rotated_map_offset_y = map_offset -> gx_point_x;
}
/* Compute the number of useful bytes from the glyph this routine is going to use.
Because of map_offset, the first byte may contain pixel bits we don't need to draw;
And the width of the draw_area may produce part of the last byte in the row to be ignored. */
num_bytes = (UINT)(((UINT)rotated_map_offset_x + pixel_per_row + 7) >> 3);
/* Take into account if map_offset specifies the number of bytes to ignore from the beginning of the row. */
num_bytes = num_bytes - (((UINT)rotated_map_offset_x) >> 3);
/* Compute the number of pixels to draw from the first byte of the glyph data. */
pixel_in_first_byte = 8 - (UINT)(rotated_map_offset_x & 0x7);
init_mask = (GX_UBYTE)(1 << (pixel_in_first_byte - 1));
/* Compute the number of pixels to draw from the last byte, if there are more than one byte in a row. */
if (num_bytes != 1)
{
pixel_in_last_byte = (((UINT)rotated_map_offset_x + pixel_per_row) & 0x7);
if (pixel_in_last_byte == 0)
{
pixel_in_last_byte = 8;
}
}
else
{
pixel_in_first_byte = pixel_per_row;
}
glyph_row = (GX_UBYTE *)glyph -> gx_glyph_map;
if (rotated_map_offset_y)
{
glyph_row = glyph_row + ((INT)glyph_width * (INT)rotated_map_offset_y);
}
glyph_row += (rotated_map_offset_x >> 3);
#if defined(GX_BRUSH_ALPHA_SUPPORT)
if (brush_alpha != 0xff)
{
yval = rotated_draw_top;
for (row = 0; row < y_height; row++)
{
xval = rotated_draw_left;
glyph_data = glyph_row;
alpha = *(glyph_data);
mask = init_mask;
num_bits = pixel_in_first_byte;
for (i = 0; i < num_bytes; i++)
{
if ((i == (num_bytes - 1)) && (num_bytes > 1))
{
num_bits = pixel_in_last_byte;
}
switch (num_bits)
{
case 8:
BLEND_PIXEL;
/* fallthrough */
case 7:
BLEND_PIXEL;
/* fallthrough */
case 6:
BLEND_PIXEL;
/* fallthrough */
case 5:
BLEND_PIXEL;
/* fallthrough */
case 4:
BLEND_PIXEL;
/* fallthrough */
case 3:
BLEND_PIXEL;
/* fallthrough */
case 2:
BLEND_PIXEL;
/* fallthrough */
default:
if (alpha & mask)
{
blend_func(context, xval, yval, text_color, brush_alpha);
}
xval++;
break;
}
glyph_data++;
alpha = *(glyph_data);
num_bits = 8;
mask = 0x80;
}
glyph_row += glyph_width;
yval++;
}
}
else
{
#endif
line_start = (UINT *)context -> gx_draw_context_memory;
line_start += context -> gx_draw_context_pitch * (rotated_draw_top);
line_start += rotated_draw_left;
for (row = 0; row < y_height; row++)
{
glyph_data = glyph_row;
alpha = *(glyph_data);
mask = init_mask;
num_bits = pixel_in_first_byte;
put = line_start;
for (i = 0; i < num_bytes; i++)
{
if ((i == (num_bytes - 1)) && (num_bytes > 1))
{
num_bits = pixel_in_last_byte;
}
switch (num_bits)
{
case 8:
DRAW_PIXEL;
/* fallthrough */
case 7:
DRAW_PIXEL;
/* fallthrough */
case 6:
DRAW_PIXEL;
/* fallthrough */
case 5:
DRAW_PIXEL;
/* fallthrough */
case 4:
DRAW_PIXEL;
/* fallthrough */
case 3:
DRAW_PIXEL;
/* fallthrough */
case 2:
DRAW_PIXEL;
/* fallthrough */
default:
if (alpha & mask)
{
*put = text_color;
}
put++;
break;
}
glyph_data++;
alpha = *(glyph_data);
num_bits = 8;
mask = 0x80;
}
glyph_row += glyph_width;
line_start += context -> gx_draw_context_pitch;
}
#if defined(GX_BRUSH_ALPHA_SUPPORT)
}
#endif
return;
}

View File

@ -0,0 +1,129 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_horizontal_line_draw */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 32bpp color format horizontal line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of left endpoint */
/* xend x-coord of right endpoint */
/* ypos y-coord of line top */
/* width Width (height) of the line */
/* color Color of line to write */
/* */
/* OUTPUT */
/* */
/* NOne */
/* */
/* CALLS */
/* */
/* _gx_display_driver_horizontal_line_alpha_draw */
/* Basic horizontal line alpha */
/* draw function */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color)
{
INT row;
INT column;
ULONG *put;
ULONG *rowstart;
INT len = xend - xstart + 1;
#if defined GX_BRUSH_ALPHA_SUPPORT
GX_UBYTE alpha;
alpha = context -> gx_draw_context_brush.gx_brush_alpha;
if (alpha == 0)
{
/* Nothing to drawn. Just return. */
return;
}
if (alpha != 0xff)
{
_gx_display_driver_horizontal_line_alpha_draw(context, xstart, xend, ypos, width, color, alpha);
return;
}
#endif
/* Pick up start address of canvas memory. */
rowstart = (ULONG *)context -> gx_draw_context_memory;
/* Calculate start of row address. */
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xstart - 1) * context -> gx_draw_context_pitch;
rowstart += ypos;
}
else
{
rowstart += xend * context -> gx_draw_context_pitch;
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ypos - width);
}
/* Draw one line, left to right. */
for (column = 0; column < len; column++)
{
put = rowstart;
/* Draw 1-pixel vertical lines to fill width. */
for (row = 0; row < width; row++)
{
*put++ = (ULONG)color;
}
rowstart -= context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,132 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_roizontal_horizontal_pattern_line_draw */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 32bpp color format horizontal pattern line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of left endpoint */
/* xend x-coord of right endpoint */
/* ypos y-coord of line top */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_horizontal_pattern_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos)
{
INT column;
ULONG *put;
ULONG *rowstart;
ULONG pattern;
ULONG mask;
ULONG on_color;
ULONG off_color;
INT len = xend - xstart + 1;
/* Pick up start address of canvas memory. */
rowstart = (ULONG *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Calculate start of row address. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xstart - 1) * context -> gx_draw_context_pitch;
/* Calculate pixel address. */
rowstart += ypos;
}
else
{
/* Calculate start of row address. */
rowstart += xend * context -> gx_draw_context_pitch;
/* Calculate pixel address. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ypos - 1);
}
/* Pick up the requested pattern and mask. */
pattern = context -> gx_draw_context_brush.gx_brush_line_pattern;
mask = context -> gx_draw_context_brush.gx_brush_pattern_mask;
on_color = (ULONG)context -> gx_draw_context_brush.gx_brush_line_color;
off_color = (ULONG)context -> gx_draw_context_brush.gx_brush_fill_color;
put = rowstart;
/* Draw one line, left to right. */
for (column = 0; column < len; column++)
{
if (pattern & mask)
{
*put = on_color;
}
else
{
*put = off_color;
}
put -= context -> gx_draw_context_pitch;
mask >>= 1;
if (!mask)
{
mask = 0x80000000;
}
}
/* Save current masks value back to brush. */
context -> gx_draw_context_brush.gx_brush_pattern_mask = mask;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,93 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixel_write PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32bpp color format pixel write function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* x X coordinate */
/* y Y coordinate */
/* color Color of pixel to write */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_pixel_write(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR color)
{
ULONG *put = (ULONG *)context -> gx_draw_context_memory;
/* Calculate address of scan line. */
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
put += context -> gx_draw_context_pitch * (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - x - 1);
/* Step in by y coordinate. */
put += y;
}
else
{
put += context -> gx_draw_context_pitch * x;
/* Step in by y coordinate. */
put += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - y - 1);
}
/* Write the pixel value. */
*put = (ULONG)color;
}

View File

@ -0,0 +1,863 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_raw_blend */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles blending of rotated */
/* uncompressed pixlemap data without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_pixelmap_raw_blend(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT yval;
INT xval;
ULONG *get;
ULONG *getrow;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
getrow = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
blend_func(context, xval, yval, (*get++), alpha);
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_alpha_blend */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles blending of rotated */
/* uncompressed pixlemap data with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_pixelmap_alpha_blend(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
int xval;
int yval;
ULONG *get;
ULONG *getrow;
UCHAR alpha_value;
ULONG combined_alpha;
ULONG color;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
xval = clip -> gx_rectangle_left;
yval = clip -> gx_rectangle_top;
getrow = (GX_COLOR *)(pixelmap -> gx_pixelmap_data);
getrow += (pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos));
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
color = (*get);
alpha_value = ALPHAVAL_32BPP(color);
if (alpha_value)
{
combined_alpha = alpha_value;
combined_alpha *= alpha;
combined_alpha /= 255;
if (combined_alpha)
{
color |= 0xff000000;
blend_func(context, xval, yval, color, (GX_UBYTE)combined_alpha);
}
}
get++;
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_palette_pixelmap_blend */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of rotated */
/* uncompressed palette pixlemap data without transparent. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_palette_pixelmap_blend(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT xval;
INT yval;
GX_UBYTE *getrow;
GX_UBYTE *get;
GX_COLOR *palette;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
palette = (GX_COLOR *)pixelmap -> gx_pixelmap_aux_data;
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
blend_func(context, xval, yval, palette[*get++], alpha);
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_palette_pixelmap_transparent_blend */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of rotated */
/* uncompressed palette pixlemap data with transparent. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_palette_pixelmap_transparent_blend(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT xval;
INT yval;
GX_UBYTE *getrow;
GX_UBYTE *get;
GX_COLOR *palette;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
palette = (GX_COLOR *)pixelmap -> gx_pixelmap_aux_data;
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
if ((*get) != pixelmap -> gx_pixelmap_transparent_color)
{
blend_func(context, xval, yval, palette[*get], alpha);
}
get++;
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_4444argb_pixelmap_alpha_blend */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of rotated */
/* uncompressed 4444argb format pixlemap data with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_4444argb_pixelmap_alpha_blend(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT xval;
INT yval;
USHORT *getrow;
GX_CONST USHORT *get;
UCHAR falpha;
GX_UBYTE combined_alpha;
ULONG pixel;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
/* Calculate how many pixels to skip. */
getrow = (USHORT *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
/* Pick alpha value from 4444argb color. */
falpha = (UCHAR)(((*get) & 0xf000) >> 8);
if (falpha)
{
/* Extend alpha value to improve accuracy. */
falpha = (GX_UBYTE)(falpha | (falpha >> 4));
/* Convert 4444argb color to 24xrgb color. */
pixel = (GX_COLOR)((((*get) & 0x0f00) << 12) | (((*get) & 0x00f0) << 8) | (((*get) & 0x000f) << 4));
pixel |= 0xff000000;
/* Calulate combined alpha. */
combined_alpha = (GX_UBYTE)(falpha * alpha / 255);
/* Blend color to background. */
blend_func(context, xval, yval, pixel, combined_alpha);
}
get++;
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_565rgb_pixelmap_alpha_blend */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of rotated */
/* uncompressed 565rgb format pixelmap data with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_565rgb_pixelmap_alpha_blend(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT skipcount;
INT xval;
INT yval;
GX_CONST GX_UBYTE *getalpha;
GX_CONST USHORT *get;
USHORT *getrow;
GX_UBYTE *getrowalpha;
GX_COLOR pixel;
GX_UBYTE falpha;
GX_UBYTE combined_alpha;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
skipcount = (pixelmap -> gx_pixelmap_height) * (rotated_clip.gx_rectangle_top - ypos);
skipcount += (rotated_clip.gx_rectangle_left - xpos);
getrow = (USHORT *)(pixelmap -> gx_pixelmap_data);
getrow += skipcount;
getrowalpha = (GX_UBYTE *)(pixelmap -> gx_pixelmap_aux_data);
getrowalpha += skipcount;
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
getalpha = getrowalpha;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
falpha = *getalpha++;
if (falpha)
{
combined_alpha = (GX_UBYTE)(falpha * alpha / 255);
pixel = *get;
/* Convert 565rgb color to 24xrgb color. */
pixel = (GX_COLOR)ASSEMBLECOLOR_32ARGB(0xff,
REDVAL_16BPP(*get) << 3,
GREENVAL_16BPP(*get) << 2,
BLUEVAL_16BPP(*get) << 3);
/* Blend 24xrgb color to background. */
blend_func(context, xval, yval, pixel, combined_alpha);
}
get++;
}
getrow += pixelmap -> gx_pixelmap_height;
getrowalpha += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_565rgb_pixelmap_raw_blend */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of rotated */
/* uncompressed 565rgb format pixlemap data without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_pixel_blend */
/* _gx_display_driver_32argb_pixel_blend */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_565rgb_pixelmap_raw_blend(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
INT xval;
INT yval;
USHORT *getrow;
GX_CONST USHORT *get;
GX_COLOR pixel;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
getrow = (USHORT *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
/* Convert 565rgb color to 24xrgb color. */
pixel = (GX_COLOR)ASSEMBLECOLOR_32ARGB(0xff,
REDVAL_16BPP(*get) << 3,
GREENVAL_16BPP(*get) << 2,
BLUEVAL_16BPP(*get) << 3);
blend_func(context, xval, yval, pixel, alpha);
get++;
}
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_blend PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 24xrgb format screen driver pixelmap blending function that */
/* handles uncompressed pixelmap blend, with or without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* alpha blending value 0 to 255 */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_32bpp_rotated_palette_pixelmap_transparent_blend */
/* _gx_display_driver_32bpp_rotated_palette_pixelmap_blend */
/* _gx_display_driver_32bpp_rotated_4444argb_pixelmap_alpha_blend */
/* _gx_display_driver_32bpp_rotated_565rgb_pixelmap_alpha_blend */
/* _gx_display_driver_32bpp_rotated_565rgb_pixelmap_raw_blend */
/* _gx_display_driver_32bpp_rotated_pixelmap_alpha_blend */
/* _gx_display_driver_32bpp_rotated_pixelmap_raw_blend */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_pixelmap_blend(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap, GX_UBYTE alpha)
{
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED)
{
return;
}
switch (pixelmap -> gx_pixelmap_format)
{
case GX_COLOR_FORMAT_8BIT_PALETTE:
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_TRANSPARENT)
{
_gx_display_driver_32bpp_rotated_palette_pixelmap_transparent_blend(context, xpos, ypos, pixelmap, alpha);
}
else
{
_gx_display_driver_32bpp_rotated_palette_pixelmap_blend(context, xpos, ypos, pixelmap, alpha);
}
break;
case GX_COLOR_FORMAT_4444ARGB:
_gx_display_driver_32bpp_rotated_4444argb_pixelmap_alpha_blend(context, xpos, ypos, pixelmap, alpha);
break;
case GX_COLOR_FORMAT_565RGB:
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
_gx_display_driver_32bpp_rotated_565rgb_pixelmap_alpha_blend(context, xpos, ypos, pixelmap, alpha);
}
else
{
_gx_display_driver_32bpp_rotated_565rgb_pixelmap_raw_blend(context, xpos, ypos, pixelmap, alpha);
}
break;
case GX_COLOR_FORMAT_24XRGB:
case GX_COLOR_FORMAT_32ARGB:
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
_gx_display_driver_32bpp_rotated_pixelmap_alpha_blend(context, xpos, ypos, pixelmap, alpha);
}
else
{
_gx_display_driver_32bpp_rotated_pixelmap_raw_blend(context, xpos, ypos, pixelmap, alpha);
}
break;
}
return;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,875 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define BYTE_RANGE(_c) _c > 255 ? 255 : _c
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_context.h"
#include "gx_utility.h"
#include "gx_system.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_raw_rotate */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that rotate an rotated uncompressed */
/* pixelmap without alpha. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_utility_math_cos Compute the cosine value */
/* _gx_utility_math_sin Compute the sine value */
/* [gx_display_driver_pixel_blend] Basic display driver pixel */
/* blend function */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_rotate */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_pixelmap_raw_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_COLOR *get;
INT srcxres;
INT srcyres;
INT cosv;
INT sinv;
INT alpha;
GX_COLOR red;
GX_COLOR green;
GX_COLOR blue;
INT idxminx;
INT idxmaxx;
INT idxmaxy;
INT *mx;
INT *my;
INT xres;
INT yres;
INT x;
INT y;
INT xx;
INT yy;
GX_COLOR a;
GX_COLOR b;
GX_COLOR c;
GX_COLOR d;
INT xdiff;
INT ydiff;
INT newxpos;
INT newypos;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
clip = context -> gx_draw_context_clip;
if (!blend_func)
{
return;
}
mx = _gx_system_scratchpad;
my = mx + 4;
mx[0] = mx[3] = -1;
mx[1] = mx[2] = 1;
my[0] = my[1] = 1;
my[2] = my[3] = -1;
idxminx = (angle / 90) & 0x3;
idxmaxx = (idxminx + 2) & 0x3;
idxmaxy = (idxminx + 1) & 0x3;
/* Calculate the source x and y center. */
srcxres = pixelmap -> gx_pixelmap_height >> 1;
srcyres = pixelmap -> gx_pixelmap_width >> 1;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
srcyres = pixelmap -> gx_pixelmap_width - 1 - srcyres;
ypos = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width;
cy = pixelmap -> gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_left);
}
else
{
srcxres = pixelmap -> gx_pixelmap_height - 1 - srcxres;
xpos = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height;
cx = pixelmap -> gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
}
cosv = _gx_utility_math_cos(GX_FIXED_VAL_MAKE(angle));
sinv = _gx_utility_math_sin(GX_FIXED_VAL_MAKE(angle));
xres = mx[idxmaxx] * (srcxres + 2) * cosv - my[idxmaxx] * (srcyres + 2) * sinv;
yres = my[idxmaxy] * (srcyres + 2) * cosv + mx[idxmaxy] * (srcxres + 2) * sinv;
xres = GX_FIXED_VAL_TO_INT(xres);
yres = GX_FIXED_VAL_TO_INT(yres);
/* Calculate the new rotation axis. */
x = (cx - srcxres) * cosv - (cy - srcyres) * sinv;
y = (cy - srcyres) * cosv + (cx - srcxres) * sinv;
x = GX_FIXED_VAL_TO_INT(x) + xres;
y = GX_FIXED_VAL_TO_INT(y) + yres;
newxpos = xpos + cx - x;
newypos = ypos + cy - y;
/* Loop through the destination's pixels. */
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
xx = (x - xres) * cosv + (y - yres) * sinv;
yy = (y - yres) * cosv - (x - xres) * sinv;
xdiff = GX_FIXED_VAL_TO_INT(xx << 8) & 0xff;
ydiff = GX_FIXED_VAL_TO_INT(yy << 8) & 0xff;
xx = GX_FIXED_VAL_TO_INT(xx) + srcxres;
yy = GX_FIXED_VAL_TO_INT(yy) + srcyres;
if ((xx >= -1) && (xx < pixelmap -> gx_pixelmap_height) &&
(yy >= -1) && (yy < pixelmap -> gx_pixelmap_width))
{
if ((xx >= 0) && (xx < pixelmap -> gx_pixelmap_height - 1) &&
(yy >= 0) && (yy < pixelmap -> gx_pixelmap_width - 1))
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
get += yy * pixelmap -> gx_pixelmap_height;
get += xx;
a = *get;
b = *(get + 1);
c = *(get + pixelmap -> gx_pixelmap_height);
d = *(get + pixelmap -> gx_pixelmap_height + 1);
alpha = 0xff;
}
else
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
a = 0;
b = 0;
c = 0;
d = 0;
alpha = 0;
if (xx == -1)
{
/* Handle left edge. */
if (yy >= 0)
{
b = *(get + yy * pixelmap -> gx_pixelmap_height);
}
if (yy < pixelmap -> gx_pixelmap_width - 1)
{
d = *(get + (yy + 1) * pixelmap -> gx_pixelmap_height);
}
}
else if (yy == -1)
{
/* Handle top edge. */
c = *(get + xx);
if (xx < pixelmap -> gx_pixelmap_height - 1)
{
d = *(get + xx + 1);
}
}
else if (xx == pixelmap -> gx_pixelmap_height - 1)
{
/* Handle right edget. */
a = *(get + yy * pixelmap -> gx_pixelmap_height + xx);
if (yy < pixelmap -> gx_pixelmap_width - 1)
{
c = *(get + (yy + 1) * pixelmap -> gx_pixelmap_height + xx);
}
}
else
{
/* Handle bottom edge. */
a = *(get + yy * pixelmap -> gx_pixelmap_height + xx);
b = *(get + yy * pixelmap -> gx_pixelmap_height + xx + 1);
}
if (a)
{
alpha += (256 - xdiff) * (256 - ydiff);
}
if (b)
{
alpha += xdiff * (256 - ydiff);
}
if (c)
{
alpha += ydiff * (256 - xdiff);
}
if (d)
{
alpha += xdiff * ydiff;
}
alpha >>= 8;
}
red = (GX_COLOR)(REDVAL_24BPP(a) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
REDVAL_24BPP(b) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
REDVAL_24BPP(c) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
REDVAL_24BPP(d) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
green = (GX_COLOR)(GREENVAL_24BPP(a) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
GREENVAL_24BPP(b) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
GREENVAL_24BPP(c) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
GREENVAL_24BPP(d) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
blue = (GX_COLOR)(BLUEVAL_24BPP(a) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
BLUEVAL_24BPP(b) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
BLUEVAL_24BPP(c) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
BLUEVAL_24BPP(d) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
if ((alpha > 0) && (alpha < 0xff))
{
red = (red << 8) / (GX_COLOR)alpha;
green = (green << 8) / (GX_COLOR)alpha;
blue = (blue << 8) / (GX_COLOR)alpha;
}
red = BYTE_RANGE(red);
green = BYTE_RANGE(green);
blue = BYTE_RANGE(blue);
alpha = BYTE_RANGE(alpha);
blend_func(context, x + newxpos, y + newypos, ASSEMBLECOLOR_32ARGB((ULONG)0xff, red, green, blue), (GX_UBYTE)alpha);
}
}
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_utility_32bppted_pixelmap_alpha_rotate PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that rotate an rotated uncompressed */
/* pixelmap with alpha. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_math_cos Compute the cosine value */
/* _gx_utility_math_sin Compute the sine value */
/* [gx_display_driver_pixel_blend] Basic display driver pixel */
/* blend function */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_rotate */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_pixelmap_alpha_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_COLOR *get;
INT srcxres;
INT srcyres;
INT cosv;
INT sinv;
INT alpha;
GX_COLOR red;
GX_COLOR green;
GX_COLOR blue;
INT idxminx;
INT idxmaxx;
INT idxmaxy;
INT *mx;
INT *my;
INT xres;
INT yres;
INT x;
INT y;
INT xx;
INT yy;
GX_COLOR a;
GX_COLOR b;
GX_COLOR c;
GX_COLOR d;
INT xdiff;
INT ydiff;
INT newxpos;
INT newypos;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
clip = context -> gx_draw_context_clip;
if (!blend_func)
{
return;
}
mx = _gx_system_scratchpad;
my = mx + 4;
mx[0] = mx[3] = -1;
mx[1] = mx[2] = 1;
my[0] = my[1] = 1;
my[2] = my[3] = -1;
idxminx = (angle / 90) & 0x3;
idxmaxx = (idxminx + 2) & 0x3;
idxmaxy = (idxminx + 1) & 0x3;
/* Calculate the source x and y center. */
srcxres = pixelmap -> gx_pixelmap_height >> 1;
srcyres = pixelmap -> gx_pixelmap_width >> 1;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
srcyres = pixelmap -> gx_pixelmap_width - 1 - srcyres;
ypos = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width;
cy = pixelmap -> gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_left);
}
else
{
srcxres = pixelmap -> gx_pixelmap_height - 1 - srcxres;
xpos = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height;
cx = pixelmap -> gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
}
cosv = _gx_utility_math_cos(GX_FIXED_VAL_MAKE(angle));
sinv = _gx_utility_math_sin(GX_FIXED_VAL_MAKE(angle));
xres = mx[idxmaxx] * (srcxres + 2) * cosv - my[idxmaxx] * (srcyres + 2) * sinv;
yres = my[idxmaxy] * (srcyres + 2) * cosv + mx[idxmaxy] * (srcxres + 2) * sinv;
xres = GX_FIXED_VAL_TO_INT(xres);
yres = GX_FIXED_VAL_TO_INT(yres);
x = GX_FIXED_VAL_TO_INT(xres) + xres;
y = GX_FIXED_VAL_TO_INT(yres) + yres;
newxpos = xpos + cx - x;
newypos = ypos + cy - y;
/* Loop through the source's pixels. */
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
xx = (x - xres) * cosv + (y - yres) * sinv;
yy = (y - yres) * cosv - (x - xres) * sinv;
xdiff = GX_FIXED_VAL_TO_INT(xx << 8) & 0xff;
ydiff = GX_FIXED_VAL_TO_INT(yy << 8) & 0xff;
xx = GX_FIXED_VAL_TO_INT(xx);
yy = GX_FIXED_VAL_TO_INT(yy);
xx += srcxres;
yy += srcyres;
if ((xx >= -1) && (xx < pixelmap -> gx_pixelmap_height) &&
(yy >= -1) && (yy < pixelmap -> gx_pixelmap_width))
{
if ((xx >= 0) && (xx < pixelmap -> gx_pixelmap_height - 1) && \
(yy >= 0) && (yy < pixelmap -> gx_pixelmap_width - 1))
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
get += yy * pixelmap -> gx_pixelmap_height;
get += xx;
a = *get;
b = *(get + 1);
c = *(get + pixelmap -> gx_pixelmap_height);
d = *(get + pixelmap -> gx_pixelmap_height + 1);
}
else
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
a = 0;
b = a;
c = a;
d = a;
if (xx == -1)
{
/* Handle left edge. */
if (yy >= 0)
{
b = *(get + yy * pixelmap -> gx_pixelmap_height);
}
if (yy < pixelmap -> gx_pixelmap_width - 1)
{
d = *(get + (yy + 1) * pixelmap -> gx_pixelmap_height);
}
}
else if (yy == -1)
{
/* Handle top edge. */
c = *(get + xx);
if (xx < pixelmap -> gx_pixelmap_height - 1)
{
d = *(get + xx + 1);
}
}
else if (xx == pixelmap -> gx_pixelmap_height - 1)
{
/* Handle right edget. */
a = *(get + yy * pixelmap -> gx_pixelmap_height + xx);
if (yy < pixelmap -> gx_pixelmap_width - 1)
{
c = *(get + (yy + 1) * pixelmap -> gx_pixelmap_height + xx);
}
}
else
{
/* Handle bottom edge. */
a = *(get + yy * pixelmap -> gx_pixelmap_height + xx);
b = *(get + yy * pixelmap -> gx_pixelmap_height + xx + 1);
}
}
red = (REDVAL_24BPP(a) * (a >> 24) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
REDVAL_24BPP(b) * (b >> 24) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
REDVAL_24BPP(c) * (c >> 24) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
REDVAL_24BPP(d) * (d >> 24) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
green = (GREENVAL_24BPP(a) * (a >> 24) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
GREENVAL_24BPP(b) * (b >> 24) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
GREENVAL_24BPP(c) * (c >> 24) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
GREENVAL_24BPP(d) * (d >> 24) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
blue = (BLUEVAL_24BPP(a) * (a >> 24) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
BLUEVAL_24BPP(b) * (b >> 24) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
BLUEVAL_24BPP(c) * (c >> 24) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
BLUEVAL_24BPP(d) * (d >> 24) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16;
alpha = (INT)(((a >> 24) * (256 - (GX_COLOR)xdiff) * (256 - (GX_COLOR)ydiff) + \
(b >> 24) * (GX_COLOR)xdiff * (256 - (GX_COLOR)ydiff) + \
(c >> 24) * (GX_COLOR)ydiff * (256 - (GX_COLOR)xdiff) + \
(d >> 24) * (GX_COLOR)xdiff * (GX_COLOR)ydiff) >> 16);
if (alpha)
{
red /= (UINT)alpha;
green /= (UINT)alpha;
blue /= (UINT)alpha;
}
red = BYTE_RANGE(red);
green = BYTE_RANGE(green);
blue = BYTE_RANGE(blue);
alpha = BYTE_RANGE(alpha);
blend_func(context, x + newxpos, y + newypos, (GX_COLOR)ASSEMBLECOLOR_32ARGB((ULONG)0xff, red, green, blue), (GX_UBYTE)alpha);
}
}
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_simple_rotate */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal help function that hangles 90, 180 and 270 degree rotated */
/* pixelmap rotation. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* [gx_display_driver_pixel_blend] Basic display driver pixel */
/* blend function */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_32bpp_rotated_pixelmap_simple_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_COLOR *putrow;
GX_COLOR *put;
GX_COLOR *get;
INT width;
INT height;
INT x;
INT y;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
INT newxpos;
INT newypos;
VOID (*blend_func)(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR fcolor, GX_UBYTE alpha);
GX_SET_BLEND_FUNCTION(blend_func, context -> gx_draw_context_display -> gx_display_color_format);
clip = context -> gx_draw_context_clip;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
ypos = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width;
cy = pixelmap -> gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - 1 - clip -> gx_rectangle_left);
}
else
{
xpos = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height;
cx = pixelmap -> gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - 1 - clip -> gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
}
if (angle == 90)
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - (width - 1 - cy);
newypos = ypos + cy - cx;
putrow = context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
get += (width - 1 - x) * height;
get += y;
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
blend_func(context, rotated_clip.gx_rectangle_left + x, rotated_clip.gx_rectangle_top + y, (*get) | 0xff000000, (GX_UBYTE)((*get) >> 24));
}
else
{
*put++ = *get;
}
}
putrow += context -> gx_draw_context_pitch;
}
}
else if (angle == 180)
{
width = pixelmap -> gx_pixelmap_height;
height = pixelmap -> gx_pixelmap_width;
newxpos = xpos + cx - (width - 1 - cx);
newypos = ypos + cy - (height - 1 - cy);
putrow = context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
get += (height - 1 - y) * width;
get += width - 1 - x;
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
blend_func(context, rotated_clip.gx_rectangle_left + x, rotated_clip.gx_rectangle_top + y, (*get) | 0xff000000, (GX_UBYTE)((*get) >> 24));
}
else
{
*put++ = *get;
}
}
putrow += context -> gx_draw_context_pitch;
}
}
else
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - cy;
newypos = ypos + cx - (height - 1 - cy);
putrow = context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_COLOR *)pixelmap -> gx_pixelmap_data;
get += x * height;
get += height - 1 - y;
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
blend_func(context, rotated_clip.gx_rectangle_left + x, rotated_clip.gx_rectangle_top + y, (*get) | 0xff000000, (GX_UBYTE)((*get) >> 24));
}
else
{
*put++ = *get;
}
}
putrow += context -> gx_draw_context_pitch;
}
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_rotate PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This service rotate a rotated pixelmap directly to canvas memory. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* rot_cx x-coord of rotating center. */
/* rot_cy y-coord of rotationg center. */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_32bpp_rotated_pixelmap_simple_rotate */
/* _gx_display_driver_32bpp_rotated_pixelmap_alpha_rotate */
/* _gx_display_driver_32bpp_rotated_pixelmap_rotate */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT rot_cx, INT rot_cy)
{
switch (pixelmap -> gx_pixelmap_format)
{
case GX_COLOR_FORMAT_24XRGB:
case GX_COLOR_FORMAT_32ARGB:
if (angle % 90 == 0)
{
/* Simple angle rotate: 90 degree, 180 degree and 270 degree. */
_gx_display_driver_32bpp_rotated_pixelmap_simple_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
else
{
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA)
{
/* With alpha. */
_gx_display_driver_32bpp_rotated_pixelmap_alpha_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
else
{
/* Without alpha. */
_gx_display_driver_32bpp_rotated_pixelmap_raw_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
}
break;
}
return;
}

View File

@ -0,0 +1,490 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define PIXEL_WRITE(loc, val) (*(loc) = (val))
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_utility.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_simple_line_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32bpp color format line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of endpoint */
/* ystart y-coord of endpoint */
/* xend x-coord of endpoint */
/* yend y-coord of endpoint */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_simple_line_alpha_draw */
/* Basic display driver line */
/* alpha draw function */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend)
{
INT curx;
INT cury;
INT x_sign;
INT y_sign;
INT decision;
INT nextx;
INT nexty;
INT y_increment;
GX_POINT end_point;
GX_POINT mid_point;
GX_RECTANGLE half_rectangle;
GX_RECTANGLE half_over;
INT sign;
INT steps;
ULONG *put;
ULONG *next_put;
GX_BOOL clipped = GX_TRUE;
INT dx;
INT dy;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
GX_COLOR linecolor = context -> gx_draw_context_brush.gx_brush_line_color;
#if defined GX_BRUSH_ALPHA_SUPPORT
GX_UBYTE alpha;
alpha = context -> gx_draw_context_brush.gx_brush_alpha;
if (alpha == 0)
{
/* Nothing to drawn. Just return. */
return;
}
if (alpha != 0xff)
{
_gx_display_driver_simple_line_alpha_draw(context, xstart, ystart, xend, yend, alpha);
return;
}
#endif
GX_SWAP_VALS(xstart, ystart);
GX_SWAP_VALS(xend, yend);
clip = context -> gx_draw_context_clip;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
ystart = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ystart - 1;
yend = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - yend - 1;
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
}
else
{
xstart = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xstart - 1;
xend = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xend - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
}
dx = GX_ABS(xend - xstart);
dy = GX_ABS(yend - ystart);
if (((dx >= dy && (xstart > xend)) || ((dy > dx) && ystart > yend)))
{
GX_SWAP_VALS(xend, xstart);
GX_SWAP_VALS(yend, ystart);
}
x_sign = (xend - xstart) / dx;
y_sign = (yend - ystart) / dy;
if (y_sign > 0)
{
y_increment = context -> gx_draw_context_pitch;
}
else
{
y_increment = 0 - context -> gx_draw_context_pitch;
}
put = (ULONG *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart;
next_put = (ULONG *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend;
end_point.gx_point_x = (GX_VALUE)xstart;
end_point.gx_point_y = (GX_VALUE)ystart;
if (_gx_utility_rectangle_point_detect(&rotated_clip, end_point))
{
end_point.gx_point_x = (GX_VALUE)xend;
end_point.gx_point_y = (GX_VALUE)yend;
if (_gx_utility_rectangle_point_detect(&rotated_clip, end_point))
{
clipped = GX_FALSE;
}
}
if (clipped)
{
/* Here if we must do clipping in the inner loop, because one
or both of the end points are outside clipping rectangle. */
/* Calculate the middle point of the line. */
mid_point.gx_point_x = (GX_VALUE)(xend + xstart) >> 1;
mid_point.gx_point_y = (GX_VALUE)(yend + ystart) >> 1;
/* Judge the clip in which side. */
if (_gx_utility_rectangle_point_detect(&rotated_clip, mid_point))
{
/* The clip in two sides. */
if (dx >= dy)
{
/* Walk out the clipping point. */
for (curx = xstart, cury = ystart, decision = (dx >> 1); curx < mid_point.gx_point_x;
curx++, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
if (curx >= rotated_clip.gx_rectangle_left &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
break;
}
put++;
}
for (; curx <= mid_point.gx_point_x;
curx++, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
PIXEL_WRITE(put, linecolor);
put++;
}
for (nextx = xend, nexty = yend, decision = (dx >> 1); nextx > mid_point.gx_point_x;
nextx--, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
nexty -= y_sign;
next_put -= y_increment;
}
if (nextx <= rotated_clip.gx_rectangle_right &&
nexty >= rotated_clip.gx_rectangle_top &&
nexty <= rotated_clip.gx_rectangle_bottom)
{
break;
}
next_put--;
}
for (; nextx > mid_point.gx_point_x;
nextx--, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
nexty -= y_sign;
next_put -= y_increment;
}
PIXEL_WRITE(next_put, linecolor);
next_put--;
}
}
else
{
for (nextx = xend, nexty = yend, decision = (dy >> 1); nexty > mid_point.gx_point_y;
nexty--, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
nextx -= x_sign;
next_put -= x_sign;
}
if (nextx >= rotated_clip.gx_rectangle_left &&
nextx <= rotated_clip.gx_rectangle_right &&
nexty <= rotated_clip.gx_rectangle_bottom)
{
break;
}
next_put -= context -> gx_draw_context_pitch;
}
for (; nexty > mid_point.gx_point_y;
nexty--, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
nextx -= x_sign;
next_put -= x_sign;
}
PIXEL_WRITE(next_put, linecolor);
next_put -= context -> gx_draw_context_pitch;
}
/* Walk out the clipping point. */
for (curx = xstart, cury = ystart, decision = (dy >> 1); cury < mid_point.gx_point_y;
cury++, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top)
{
break;
}
put += context -> gx_draw_context_pitch;
}
for (; cury <= mid_point.gx_point_y;
cury++, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
PIXEL_WRITE(put, linecolor);
put += context -> gx_draw_context_pitch;
}
}
}
else
{
/* The clip stay at one side. */
if (dx >= dy)
{
half_rectangle.gx_rectangle_left = (GX_VALUE)xstart;
half_rectangle.gx_rectangle_right = mid_point.gx_point_x;
if (y_sign == 1)
{
half_rectangle.gx_rectangle_top = (GX_VALUE)ystart;
half_rectangle.gx_rectangle_bottom = mid_point.gx_point_y;
}
else
{
half_rectangle.gx_rectangle_top = mid_point.gx_point_y;
half_rectangle.gx_rectangle_bottom = (GX_VALUE)ystart;
}
if (_gx_utility_rectangle_overlap_detect(&rotated_clip, &half_rectangle, &half_over))
{
curx = xstart;
cury = ystart;
steps = mid_point.gx_point_x - curx + 1;
sign = 1;
}
else
{
curx = xend;
cury = yend;
steps = xend - mid_point.gx_point_x;
sign = -1;
y_increment = 0 - y_increment;
y_sign = 0 - y_sign;
put = next_put;
}
for (decision = (dx >> 1); steps > 0; curx += sign, decision += dy, steps--)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
PIXEL_WRITE(put, linecolor);
}
put += sign;
}
}
else
{
half_rectangle.gx_rectangle_top = (GX_VALUE)ystart;
half_rectangle.gx_rectangle_bottom = mid_point.gx_point_y;
if (x_sign == 1)
{
half_rectangle.gx_rectangle_right = mid_point.gx_point_x;
half_rectangle.gx_rectangle_left = (GX_VALUE)xstart;
}
else
{
half_rectangle.gx_rectangle_right = (GX_VALUE)xstart;
half_rectangle.gx_rectangle_left = mid_point.gx_point_x;
}
if (_gx_utility_rectangle_overlap_detect(&rotated_clip, &half_rectangle, &half_over))
{
curx = xstart;
cury = ystart;
steps = mid_point.gx_point_y - cury + 1;
y_increment = context -> gx_draw_context_pitch;
sign = 1;
}
else
{
curx = xend;
cury = yend;
steps = yend - mid_point.gx_point_y;
sign = -1;
y_increment = 0 - context -> gx_draw_context_pitch;
x_sign = 0 - x_sign;
put = next_put;
}
for (decision = (dy >> 1); steps > 0; cury += sign, decision += dx, steps--)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
PIXEL_WRITE(put, linecolor);
}
put += y_increment;
}
}
}
}
else
{
/* Here if both line ends lie within clipping rectangle, we can
run a faster inner loop. */
if (dx >= dy)
{
put = (ULONG *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart;
next_put = (ULONG *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend;
for (curx = xstart, cury = ystart, nextx = xend, nexty = yend,
decision = (dx >> 1); curx <= nextx; curx++, nextx--,
decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
nexty -= y_sign;
put += y_increment;
next_put -= y_increment;
}
PIXEL_WRITE(put, linecolor);
PIXEL_WRITE(next_put, linecolor);
put++;
next_put--;
}
}
else
{
for (curx = xstart, cury = ystart, nextx = xend, nexty = yend,
decision = (dy >> 1); cury <= nexty; cury++, nexty--,
decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
nextx -= x_sign;
put += x_sign;
next_put -= x_sign;
}
PIXEL_WRITE(put, linecolor);
PIXEL_WRITE(next_put, linecolor);
put += context -> gx_draw_context_pitch;
next_put -= context -> gx_draw_context_pitch;
}
}
}
}

View File

@ -0,0 +1,131 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_vertical_line_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated vertical line draw function for 16bpp canvas. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* ystart y-coord of top endpoint */
/* yend y-coord of bottom endpoint */
/* xpos x-coord of left edge */
/* width width of the line */
/* color Color of line to write */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_vertical_line_alpha_draw */
/* Basic display driver vertical */
/* line alpha draw function */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_vertical_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos, INT width, GX_COLOR color)
{
INT row;
INT column;
ULONG *put;
ULONG *rowstart;
INT len = yend - ystart + 1;
#if defined GX_BRUSH_ALPHA_SUPPORT
GX_UBYTE alpha;
alpha = context -> gx_draw_context_brush.gx_brush_alpha;
if (alpha == 0)
{
/* Nothing to drawn. Just return. */
return;
}
if (alpha != 0xff)
{
_gx_display_driver_vertical_line_alpha_draw(context, ystart, yend, xpos, width, color, alpha);
return;
}
#endif
/* Pick up starting address of canvas memory. */
rowstart = (ULONG *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Calculate start of scanline. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xpos - 1) * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += ystart;
}
else
{
rowstart += (xpos + width - 1) * context -> gx_draw_context_pitch;
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - yend - 1);
}
/* Draw line width from left to right. */
for (column = 0; column < width; column++)
{
put = rowstart;
/* Draw line from top to bottom. */
for (row = 0; row < len; row++)
{
*put++ = (ULONG)color;
}
/* Advance to the next scaneline. */
rowstart -= context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,135 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_32bpp_rotated_vertical_pattern_line_draw */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic rotated 32bpp color format vertical pattern line draw */
/* function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* ystart y-coord of top endpoint */
/* yend y-coord of bottom endpoint */
/* xpos x-coord of left edge */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_32bpp_rotated_vertical_pattern_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos)
{
INT row;
ULONG *put;
ULONG *rowstart;
ULONG pattern;
ULONG mask;
ULONG on_color;
ULONG off_color;
INT len = yend - ystart + 1;
/* Pick up starting address of canvas memory. */
rowstart = (ULONG *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Calculate start of scanline. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xpos - 1) * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += ystart;
}
else
{
/* Calculate start of scanline. */
rowstart += xpos * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - yend - 1);
}
/* Pick up the requested pattern and mask. */
pattern = context -> gx_draw_context_brush.gx_brush_line_pattern;
mask = context -> gx_draw_context_brush.gx_brush_pattern_mask;
on_color = (ULONG)context -> gx_draw_context_brush.gx_brush_line_color;
off_color = (ULONG)context -> gx_draw_context_brush.gx_brush_fill_color;
put = rowstart;
/* Draw line from top to bottom. */
for (row = 0; row < len; row++)
{
if (pattern & mask)
{
*put = on_color;
}
else
{
*put = off_color;
}
mask >>= 1;
if (!mask)
{
mask = 0x80000000;
}
/* Advance to the next scaneline. */
put++;
}
/* Save current masks value back to brush. */
context -> gx_draw_context_brush.gx_brush_pattern_mask = mask;
}

View File

@ -0,0 +1,120 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bit_palette_rotated_setup PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 8-bit palettte color format display driver rotated setup routine. */
/* */
/* INPUT */
/* */
/* display The display control block */
/* aux_data Driver-defined auxiliary data */
/* toggle_function Driver-defined screen toggle */
/* function */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bit_palette_rotated_setup(GX_DISPLAY *display, VOID *aux_data,
VOID (*toggle_function)(struct GX_CANVAS_STRUCT *canvas,
GX_RECTANGLE *dirty_area))
{
_gx_display_driver_8bit_palette_setup(display, aux_data, toggle_function);
#if defined(GX_MOUSE_SUPPORT)
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_capture = GX_NULL;
display -> gx_display_mouse_restore = GX_NULL;
display -> gx_display_mouse_draw = GX_NULL;
display -> gx_display_driver_drawing_initiate = GX_NULL;
display -> gx_display_driver_drawing_complete = GX_NULL;
display -> gx_display_mouse_position_set = GX_NULL;
display -> gx_display_mouse_enable = GX_NULL;
#endif
display -> gx_display_rotation_angle = GX_SCREEN_ROTATION_CW;
display -> gx_display_driver_canvas_copy = _gx_display_driver_8bpp_rotated_canvas_copy;
display -> gx_display_driver_simple_line_draw = _gx_display_driver_8bpp_rotated_simple_line_draw;
display -> gx_display_driver_horizontal_line_draw = _gx_display_driver_8bpp_rotated_horizontal_line_draw;
display -> gx_display_driver_vertical_line_draw = _gx_display_driver_8bpp_rotated_vertical_line_draw;
display -> gx_display_driver_horizontal_pattern_line_draw = _gx_display_driver_8bpp_rotated_horizontal_pattern_line_draw;
display -> gx_display_driver_horizontal_pixelmap_line_draw = _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_draw;
display -> gx_display_driver_vertical_pattern_line_draw = _gx_display_driver_8bpp_rotated_vertical_pattern_line_draw;
display -> gx_display_driver_pixel_write = _gx_display_driver_8bpp_rotated_pixel_write;
display -> gx_display_driver_block_move = _gx_display_driver_8bpp_rotated_block_move;
display -> gx_display_driver_pixelmap_draw = _gx_display_driver_8bpp_rotated_pixelmap_draw;
display -> gx_display_driver_pixelmap_rotate = _gx_display_driver_8bpp_rotated_pixelmap_rotate;
display -> gx_display_driver_polygon_fill = _gx_display_driver_generic_rotated_polygon_fill;
#if defined(GX_ARC_DRAWING_SUPPORT)
display -> gx_display_driver_circle_fill = _gx_display_driver_generic_rotated_circle_fill;
display -> gx_display_driver_pie_fill = _gx_display_driver_generic_rotated_pie_fill;
display -> gx_display_driver_arc_fill = _gx_display_driver_generic_rotated_arc_fill;
display -> gx_display_driver_ellipse_fill = _gx_display_driver_generic_rotated_ellipse_fill;
#endif
#if (GX_PALETTE_MODE_AA_TEXT_COLORS == 8)
display -> gx_display_driver_4bit_glyph_draw = _gx_display_driver_8bpp_rotated_glyph_3bit_draw;
#else
display -> gx_display_driver_4bit_glyph_draw = _gx_display_driver_8bpp_rotated_glyph_4bit_draw;
#endif
display -> gx_display_driver_1bit_glyph_draw = _gx_display_driver_8bpp_rotated_glyph_1bit_draw;
}

View File

@ -0,0 +1,193 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_system.h"
#include "gx_utility.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_block_move PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 8-bit color format display driver rotated block moving function. */
/* */
/* INPUT */
/* */
/* context Draw context */
/* block The rectangle to be moved */
/* xshift Amount to move on X-axis */
/* yshift Amount to move on Y-axis */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* memmove Move a block of data */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_block_move(GX_DRAW_CONTEXT *context,
GX_RECTANGLE *block, INT xshift, INT yshift)
{
GX_UBYTE *pGet;
GX_UBYTE *pPut;
int width;
int y;
int height;
GX_RECTANGLE rotated_block;
GX_SWAP_VALS(xshift, yshift);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_block.gx_rectangle_left = block -> gx_rectangle_top;
rotated_block.gx_rectangle_right = block -> gx_rectangle_bottom;
rotated_block.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - block -> gx_rectangle_right - 1);
rotated_block.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - block -> gx_rectangle_left - 1);
yshift = -yshift;
}
else
{
rotated_block.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - block -> gx_rectangle_bottom - 1);
rotated_block.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - block -> gx_rectangle_top - 1);
rotated_block.gx_rectangle_top = block -> gx_rectangle_left;
rotated_block.gx_rectangle_bottom = block -> gx_rectangle_right;
xshift = -xshift;
}
if (xshift)
{
if (xshift > 0)
{
pPut = (GX_UBYTE *)context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left + xshift;
pGet = (GX_UBYTE *)context -> gx_draw_context_memory;
pGet += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1 - xshift;
}
else
{
/* Have to copy from right to left. */
pPut = (GX_UBYTE *)context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = (GX_UBYTE *)context -> gx_draw_context_memory;
pGet += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left - xshift;
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1 + xshift;
}
if (width <= 0)
{
return;
}
for (y = rotated_block.gx_rectangle_top; y <= rotated_block.gx_rectangle_bottom; y++)
{
memmove(pPut, pGet, (size_t)width);
pPut += context -> gx_draw_context_pitch;
pGet += context -> gx_draw_context_pitch;
}
}
else
{
width = rotated_block.gx_rectangle_right - rotated_block.gx_rectangle_left + 1;
if (yshift > 0)
{
/* Have to copy from top to bottom. */
pPut = (GX_UBYTE *)context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_bottom * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = (GX_UBYTE *)context -> gx_draw_context_memory;
pGet += (rotated_block.gx_rectangle_bottom - yshift) * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
height = rotated_block.gx_rectangle_bottom - rotated_block.gx_rectangle_top + 1 - yshift;
for (y = 0; y < height; y++)
{
memmove(pPut, pGet, (size_t)width);
pPut -= context -> gx_draw_context_pitch;
pGet -= context -> gx_draw_context_pitch;
}
}
else
{
/* Have to copy from bottom to top. */
pPut = (GX_UBYTE *)context -> gx_draw_context_memory;
pPut += rotated_block.gx_rectangle_top * context -> gx_draw_context_pitch;
pPut += rotated_block.gx_rectangle_left;
pGet = (GX_UBYTE *)context -> gx_draw_context_memory;
pGet += (rotated_block.gx_rectangle_top - yshift) * context -> gx_draw_context_pitch;
pGet += rotated_block.gx_rectangle_left;
height = rotated_block.gx_rectangle_bottom - rotated_block.gx_rectangle_top + 1 + yshift;
for (y = 0; y < height; y++)
{
memmove(pPut, pGet, (size_t)width);
pPut += context -> gx_draw_context_pitch;
pGet += context -> gx_draw_context_pitch;
}
}
}
}

View File

@ -0,0 +1,130 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_utility.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_canvas_copy PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp rotated canvas copy function. */
/* */
/* INPUT */
/* */
/* canvas The canvas to copy from */
/* composite The canvas to copy to */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_rectangle_shift Move the rectangle */
/* _gx_utility_rectangle_overlap_detect Detect two rectangles being */
/* overlap to each other */
/* memcpy Move canvas data */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_canvas_copy(GX_CANVAS *canvas, GX_CANVAS *composite)
{
GX_RECTANGLE dirty;
GX_RECTANGLE overlap;
GX_UBYTE *read;
GX_UBYTE *write;
INT width;
INT row;
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);
_gx_utility_rectangle_shift(&dirty, canvas -> gx_canvas_display_offset_x, canvas -> gx_canvas_display_offset_y);
if (_gx_utility_rectangle_overlap_detect(&dirty, &composite -> gx_canvas_dirty_area, &overlap))
{
width = overlap.gx_rectangle_bottom - overlap.gx_rectangle_top + 1;
read = (GX_UBYTE *)canvas -> gx_canvas_memory;
write = (GX_UBYTE *)composite -> gx_canvas_memory;
if (canvas -> gx_canvas_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Index into starting row. */
read += (dirty.gx_rectangle_right - overlap.gx_rectangle_right) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read += overlap.gx_rectangle_top - dirty.gx_rectangle_top;
/* Calculate the write pointer. */
write += (composite -> gx_canvas_x_resolution - overlap.gx_rectangle_right - 1) * composite -> gx_canvas_y_resolution;
write += overlap.gx_rectangle_top;
}
else
{
/* Index into starting row. */
read += (overlap.gx_rectangle_left - dirty.gx_rectangle_left) * canvas -> gx_canvas_y_resolution;
/* Index into pixel. */
read += dirty.gx_rectangle_bottom - overlap.gx_rectangle_bottom;
/* Calculate the write pointer. */
write += overlap.gx_rectangle_left * composite -> gx_canvas_y_resolution;
write += (composite -> gx_canvas_y_resolution - overlap.gx_rectangle_bottom - 1);
}
for (row = overlap.gx_rectangle_left; row <= overlap.gx_rectangle_right; row++)
{
memcpy(write, read, (size_t)width); /* Use case of memcpy is verified. */
write += composite -> gx_canvas_y_resolution;
read += canvas -> gx_canvas_y_resolution;
}
}
}

View File

@ -0,0 +1,241 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_system.h"
#include "gx_utility.h"
#include "gx_display.h"
#define DRAW_PIXEL if (alpha & mask) \
{ \
*put = text_color; \
} \
put++; \
mask = mask >> 1;
#if defined(GX_BRUSH_ALPHA_SUPPORT)
#define BLEND_PIXEL if (alpha & mask) \
{ \
blend_func(context, xval, yval, text_color, brush_alpha); \
} \
xval++; \
mask = mask >> 1;
#endif
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_glyph_1bit_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function draws monochrome font to the 8bpp canvas, clipped */
/* to one viweport. */
/* */
/* INPUT */
/* */
/* context Draw context */
/* draw_area The region bound by the */
/* rectangle where the glyph */
/* is drawn */
/* map_offset X,Y offset into the glyph map */
/* glyph Pointer to the glyph */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* [gx_display_driver_pixel_blend] Basic display driver pixel */
/* blend function */
/* */
/* CALLED BY */
/* */
/* GUIX internal code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_glyph_1bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph)
{
GX_UBYTE *glyph_row;
GX_UBYTE *glyph_data;
UINT row;
UINT pixel_per_row;
UINT pixel_in_first_byte;
UINT pixel_in_last_byte = 0;
GX_UBYTE text_color;
UINT y_height;
GX_UBYTE alpha;
UINT glyph_width;
GX_UBYTE *put;
UINT num_bytes;
UINT num_bits;
GX_UBYTE *line_start;
GX_UBYTE mask, init_mask;
UINT i;
GX_VALUE rotated_map_offset_x;
GX_VALUE rotated_map_offset_y;
GX_VALUE rotated_draw_left;
GX_VALUE rotated_draw_top;
text_color = (GX_UBYTE)context -> gx_draw_context_brush.gx_brush_line_color;
pixel_per_row = (UINT)draw_area -> gx_rectangle_bottom - (UINT)draw_area -> gx_rectangle_top + (UINT)1;
y_height = (UINT)(draw_area -> gx_rectangle_right - draw_area -> gx_rectangle_left + 1);
/* Find the width of the glyph, in terms of bytes */
glyph_width = glyph -> gx_glyph_height;
/* Make it byte-aligned. */
glyph_width = (glyph_width + 7) >> 3;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_draw_left = draw_area -> gx_rectangle_top;
rotated_draw_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - draw_area -> gx_rectangle_right - 1);
rotated_map_offset_x = map_offset -> gx_point_y;
rotated_map_offset_y = (GX_VALUE)(glyph -> gx_glyph_width - map_offset -> gx_point_x - (GX_VALUE)y_height);
}
else
{
rotated_draw_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_display_offset_y - draw_area -> gx_rectangle_bottom - 1);
rotated_draw_top = draw_area -> gx_rectangle_left;
rotated_map_offset_x = (GX_VALUE)(glyph -> gx_glyph_height - map_offset -> gx_point_y - (GX_VALUE)pixel_per_row);
rotated_map_offset_y = map_offset -> gx_point_x;
}
/* Compute the number of useful bytes from the glyph this routine is going to use.
Because of map_offset, the first byte may contain pixel bits we don't need to draw;
And the width of the draw_area may produce part of the last byte in the row to be ignored. */
num_bytes = ((UINT)rotated_map_offset_x + pixel_per_row + 7) >> 3;
/* Take into account if map_offset specifies the number of bytes to ignore from the beginning of the row. */
num_bytes -= (UINT)(rotated_map_offset_x) >> 3;
/* Compute the number of pixels to draw from the first byte of the glyph data. */
pixel_in_first_byte = (UINT)(8 - (rotated_map_offset_x & 0x7));
init_mask = (GX_UBYTE)(1 << (pixel_in_first_byte - 1));
/* Compute the number of pixels to draw from the last byte, if there are more than one byte in a row. */
if (num_bytes != 1)
{
pixel_in_last_byte = (rotated_map_offset_x + (INT)pixel_per_row) & 0x7;
if (pixel_in_last_byte == 0)
{
pixel_in_last_byte = 8;
}
}
else
{
pixel_in_first_byte = pixel_per_row;
}
glyph_row = (GX_UBYTE *)glyph -> gx_glyph_map;
if (rotated_map_offset_y)
{
glyph_row = glyph_row + ((INT)glyph_width * rotated_map_offset_y);
}
glyph_row += (rotated_map_offset_x >> 3);
line_start = (GX_UBYTE *)context -> gx_draw_context_memory;
line_start += context -> gx_draw_context_pitch * rotated_draw_top;
line_start += rotated_draw_left;
for (row = 0; row < y_height; row++)
{
glyph_data = glyph_row;
alpha = *(glyph_data);
mask = init_mask;
num_bits = pixel_in_first_byte;
put = line_start;
for (i = 0; i < num_bytes; i++)
{
if ((i == (num_bytes - 1)) && (num_bytes > 1))
{
num_bits = pixel_in_last_byte;
}
switch (num_bits)
{
case 8:
DRAW_PIXEL;
/* fallthrough */
case 7:
DRAW_PIXEL;
/* fallthrough */
case 6:
DRAW_PIXEL;
/* fallthrough */
case 5:
DRAW_PIXEL;
/* fallthrough */
case 4:
DRAW_PIXEL;
/* fallthrough */
case 3:
DRAW_PIXEL;
/* fallthrough */
case 2:
DRAW_PIXEL;
/* fallthrough */
default:
if (alpha & mask)
{
*put = text_color;
}
put++;
break;
}
glyph_data++;
alpha = *(glyph_data);
num_bits = 8;
mask = 0x80;
}
glyph_row += glyph_width;
line_start += context -> gx_draw_context_pitch;
}
return;
}

View File

@ -0,0 +1,198 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_system.h"
#include "gx_utility.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_glyph_3bit_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This draws the specified 3bit glyph using the current context, */
/* clipped to one viewport */
/* */
/* INPUT */
/* */
/* context Draw context */
/* draw_position The X and Y coordinate where */
/* the glyph is drawn to */
/* string String to draw */
/* count Count of string characters */
/* view view to clip drawing within */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_canvas_text_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_glyph_3bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph)
{
GX_UBYTE *glyph_row;
GX_UBYTE *glyph_data;
UINT row;
UINT pixel_width = 0;
UINT leading_pixel;
UINT trailing_pixel;
GX_UBYTE text_color;
UINT y_height;
GX_UBYTE alpha;
UINT pitch;
UINT index;
GX_UBYTE *put;
GX_UBYTE *draw_start;
GX_VALUE rotated_map_offset_x;
GX_VALUE rotated_map_offset_y;
GX_VALUE rotated_left;
GX_VALUE rotated_top;
text_color = (GX_UBYTE)(context -> gx_draw_context_brush.gx_brush_line_color + 7);
pixel_width = (UINT)(draw_area -> gx_rectangle_bottom - draw_area -> gx_rectangle_top + 1);
y_height = (UINT)(draw_area -> gx_rectangle_right - draw_area -> gx_rectangle_left + 1);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_left = draw_area -> gx_rectangle_top;
rotated_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - draw_area -> gx_rectangle_right - 1);
rotated_map_offset_x = map_offset -> gx_point_y;
rotated_map_offset_y = (GX_VALUE)(glyph -> gx_glyph_width - map_offset -> gx_point_x - (GX_VALUE)y_height);
}
else
{
rotated_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_display_offset_y - draw_area -> gx_rectangle_bottom - 1);
rotated_top = draw_area -> gx_rectangle_left;
rotated_map_offset_x = (GX_VALUE)(glyph -> gx_glyph_height - map_offset -> gx_point_y - (GX_VALUE)pixel_width);
rotated_map_offset_y = map_offset -> gx_point_x;
}
leading_pixel = (rotated_map_offset_x & 1);
pixel_width -= leading_pixel;
trailing_pixel = pixel_width & 1;
pixel_width = pixel_width >> 1;
/* Find the width of the glyph. */
pitch = glyph -> gx_glyph_height;
/* Make it byte-aligned. */
pitch = (pitch + 1) >> 1;
glyph_row = (GX_UBYTE *)glyph -> gx_glyph_map;
if (rotated_map_offset_y)
{
glyph_row = glyph_row + ((INT)pitch * rotated_map_offset_y);
}
glyph_row += (rotated_map_offset_x >> 1);
draw_start = (GX_UBYTE *)context -> gx_draw_context_memory;
draw_start += context -> gx_draw_context_pitch * rotated_top;
draw_start += rotated_left;
for (row = 0; row < y_height; row++)
{
glyph_data = glyph_row;
put = draw_start;
if (leading_pixel)
{
alpha = (*glyph_data) & 0x0f;
/* use 3bit color gradient instead of 4 bit */
alpha >>= 1;
*put = (GX_UBYTE)(text_color - alpha);
put++;
glyph_data++;
}
for (index = 0; index < pixel_width; index++)
{
alpha = (*glyph_data) & 0xf0;
/* use 3bit color gradient instead of 4 bit */
alpha >>= 1;
*put = (GX_UBYTE)(text_color - (alpha >> 4));
put++;
alpha = (*glyph_data) & 0x0f;
/* use 3bit color gradient instead of 4 bit */
alpha >>= 1;
*put = (GX_UBYTE)(text_color - alpha);
put++;
glyph_data++;
}
if (trailing_pixel)
{
alpha = (*glyph_data) & 0xf0;
/* use 3bit color gradient instead of 4 bit */
alpha >>= 1;
*put = (GX_UBYTE)(text_color - (alpha >> 4));
put++;
}
glyph_row += pitch;
draw_start += context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,184 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_system.h"
#include "gx_utility.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_glyph_4bit_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This draws the specified text using the current context, */
/* clipped to one viewport */
/* */
/* INPUT */
/* */
/* context Draw context */
/* draw_position The X and Y coordinate where */
/* the glyph is drawn to */
/* string String to draw */
/* count Count of string characters */
/* view view to clip drawing within */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_canvas_text_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_glyph_4bit_draw(GX_DRAW_CONTEXT *context, GX_RECTANGLE *draw_area, GX_POINT *map_offset, GX_CONST GX_GLYPH *glyph)
{
GX_UBYTE *glyph_row;
GX_UBYTE *glyph_data;
UINT row;
UINT pixel_width = 0;
UINT leading_pixel;
UINT trailing_pixel;
GX_UBYTE text_color;
UINT y_height;
GX_UBYTE alpha;
UINT pitch;
UINT index;
GX_UBYTE *put;
GX_UBYTE *draw_start;
GX_VALUE rotated_map_offset_x;
GX_VALUE rotated_map_offset_y;
GX_VALUE rotated_left;
GX_VALUE rotated_top;
text_color = (GX_UBYTE)(context -> gx_draw_context_brush.gx_brush_line_color + 15);
pixel_width = (UINT)(draw_area -> gx_rectangle_bottom - draw_area -> gx_rectangle_top + 1);
y_height = (UINT)(draw_area -> gx_rectangle_right - draw_area -> gx_rectangle_left + 1);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_left = draw_area -> gx_rectangle_top;
rotated_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - draw_area -> gx_rectangle_right - 1);
rotated_map_offset_x = map_offset -> gx_point_y;
rotated_map_offset_y = (GX_VALUE)(glyph -> gx_glyph_width - map_offset -> gx_point_x - (GX_VALUE)y_height);
}
else
{
rotated_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_display_offset_y - draw_area -> gx_rectangle_bottom - 1);
rotated_top = draw_area -> gx_rectangle_left;
rotated_map_offset_x = (GX_VALUE)(glyph -> gx_glyph_height - map_offset -> gx_point_y - (GX_VALUE)pixel_width);
rotated_map_offset_y = map_offset -> gx_point_x;
}
leading_pixel = (rotated_map_offset_x & 1);
pixel_width -= leading_pixel;
trailing_pixel = pixel_width & 1;
pixel_width = pixel_width >> 1;
/* Find the width of the glyph. */
pitch = glyph -> gx_glyph_height;
/* Make it byte-aligned. */
pitch = (pitch + 1) >> 1;
glyph_row = (GX_UBYTE *)glyph -> gx_glyph_map;
if (rotated_map_offset_y)
{
glyph_row = glyph_row + ((INT)pitch * rotated_map_offset_y);
}
glyph_row += (rotated_map_offset_x >> 1);
draw_start = (GX_UBYTE *)context -> gx_draw_context_memory;
draw_start += context -> gx_draw_context_pitch * rotated_top;
draw_start += rotated_left;
for (row = 0; row < y_height; row++)
{
glyph_data = glyph_row;
put = draw_start;
if (leading_pixel)
{
alpha = (*glyph_data) & 0x0f;
*put = (GX_UBYTE)(text_color - alpha);
put++;
glyph_data++;
}
for (index = 0; index < pixel_width; index++)
{
alpha = (*glyph_data) & 0xf0;
*put = (GX_UBYTE)(text_color - (alpha >> 4));
put++;
alpha = (*glyph_data) & 0x0f;
*put = (GX_UBYTE)(text_color - alpha);
put++;
glyph_data++;
}
if (trailing_pixel)
{
alpha = (*glyph_data) & 0xf0;
*put = (GX_UBYTE)(text_color - (alpha >> 4));
put++;
}
glyph_row += pitch;
draw_start += context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,106 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_line_draw */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated horizontal line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of left endpoint */
/* xend x-coord of right endpoint */
/* ypos y-coord of line top */
/* width Width (height) of the line */
/* color Color of line to write */
/* */
/* OUTPUT */
/* */
/* NOne */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_horizontal_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos, INT width, GX_COLOR color)
{
INT row;
INT column;
GX_UBYTE *put;
GX_UBYTE *rowstart;
INT len = xend - xstart + 1;
/* Pick up start address of canvas memory. */
rowstart = (GX_UBYTE *)context -> gx_draw_context_memory;
/* Calculate start of row address. */
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xstart - 1) * context -> gx_draw_context_pitch;
rowstart += ypos;
}
else
{
rowstart += xend * context -> gx_draw_context_pitch;
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ypos - width);
}
/* Draw one line, left to right. */
for (column = 0; column < len; column++)
{
put = rowstart;
/* Draw pixel to fill width. */
for (row = 0; row < width; row++)
{
*put++ = (GX_UBYTE)color;
}
rowstart -= context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,131 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_pattern_line_draw */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated horizontal pattern line draw */
/* function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of left endpoint */
/* xend x-coord of right endpoint */
/* ypos y-coord of line top */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_horizontal_pattern_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT xend, INT ypos)
{
INT column;
GX_UBYTE *put;
GX_UBYTE *rowstart;
ULONG pattern;
ULONG mask;
GX_UBYTE on_color;
GX_UBYTE off_color;
INT len = xend - xstart + 1;
/* Pick up start address of canvas memory. */
rowstart = (GX_UBYTE *)context -> gx_draw_context_memory;
/* Calculate start of row address. */
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xstart - 1) * context -> gx_draw_context_pitch;
rowstart += ypos;
}
else
{
rowstart += xend * context -> gx_draw_context_pitch;
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ypos - 1);
}
/* Pick up the requested pattern and mask. */
pattern = context -> gx_draw_context_brush.gx_brush_line_pattern;
mask = context -> gx_draw_context_brush.gx_brush_pattern_mask;
on_color = (GX_UBYTE)context -> gx_draw_context_brush.gx_brush_line_color;
off_color = (GX_UBYTE)context -> gx_draw_context_brush.gx_brush_fill_color;
put = rowstart;
/* Draw one line, left to right. */
for (column = 0; column < len; column++)
{
if (pattern & mask)
{
*put = on_color;
}
else
{
*put = off_color;
}
put -= context -> gx_draw_context_pitch;
mask >>= 1;
if (!mask)
{
mask = 0x80000000;
}
}
/* Save current masks value back to brush. */
context -> gx_draw_context_brush.gx_brush_pattern_mask = mask;
}

View File

@ -0,0 +1,602 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_context.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_raw_write */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of uncompressed */
/* pixlemap file without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of line left */
/* xend x-coord of line right */
/* y y-coord of line top */
/* info GX_FILL_PIXELMAP_INFO struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_horizontal_pixelmap_line_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_raw_write(GX_DRAW_CONTEXT *context,
INT xstart, INT xend, INT y, GX_FILL_PIXELMAP_INFO *info)
{
INT xval;
INT offset;
INT pic_width;
GX_CONST GX_UBYTE *get;
GX_UBYTE *put;
GX_PIXELMAP *pixelmap;
pixelmap = info -> pixelmap;
pic_width = pixelmap -> gx_pixelmap_height;
if ((info -> draw) && (xstart <= xend))
{
get = info -> current_pixel_ptr;
put = (GX_UBYTE *)context -> gx_draw_context_memory;
put += y * context -> gx_draw_context_pitch + xstart;
/* Calculate the map offset in x-axis. */
offset = (info -> x_offset % pic_width);
for (xval = xstart; xval <= xend; xval++)
{
/* get points to the start postion of this row. So we need to calculate its position. */
*put++ = *(get + offset);
offset++;
if (offset >= pic_width)
{
offset -= pic_width;
}
}
}
/* This line is drawn. Update the pointer position for next row. */
info -> current_pixel_ptr += (UINT)pic_width * sizeof(GX_UBYTE);
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_ */
/* compressed_write */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of compressed */
/* pixlemap file. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of line left */
/* xend x-coord of line right */
/* y y-coord of line top */
/* info GX_FILL_PIXELMAP_INFO struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_horizontal_pixelmap_line_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_compressed_write(GX_DRAW_CONTEXT *context,
INT xstart, INT xend, INT y, GX_FILL_PIXELMAP_INFO *info)
{
INT start_pos;
INT xval;
GX_UBYTE count;
GX_CONST GX_UBYTE *get = GX_NULL;
GX_UBYTE pixel;
GX_UBYTE *put;
GX_PIXELMAP *pixelmap;
pixelmap = info -> pixelmap;
if ((info -> draw) && (xstart <= xend))
{
/* Calculate draw start position. */
start_pos = xstart - (info -> x_offset % pixelmap -> gx_pixelmap_height);
put = (GX_UBYTE *)context -> gx_draw_context_memory;
put += y * context -> gx_draw_context_pitch + start_pos;
/*Repeat the draw operation to fill the whole dirty area.*/
while (start_pos <= xend)
{
xval = start_pos;
/*Start from where we need to repeat.*/
get = (GX_CONST GX_UBYTE *)info -> current_pixel_ptr;
while (xval < start_pos + pixelmap -> gx_pixelmap_width)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
pixel = *get++;
while (count--)
{
if (xval >= xstart && xval <= xend)
{
*put = pixel;
}
xval++;
put++;
}
}
else
{
count++;
while (count--)
{
pixel = *get++;
if (xval >= xstart && xval <= xend)
{
*put = pixel;
}
xval++;
put++;
}
}
}
start_pos += pixelmap -> gx_pixelmap_height;
}
}
else
{
xval = 0;
get = (GX_CONST GX_UBYTE *)info -> current_pixel_ptr;
while (xval < pixelmap -> gx_pixelmap_height)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
get++;
}
else
{
count++;
get += count;
}
xval += count;
}
}
/*This line is drawn. cache the pointer for next line draw.*/
info -> current_pixel_ptr = (GX_UBYTE *)get;
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_line_pixelmap_ */
/* transparent_write */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of uncompressed */
/* pixlemap file with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of line left */
/* xend x-coord of line right */
/* y y-coord of line top */
/* info GX_FILL_PIXELMAP_INFO struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_horizontal_pixelmap_line_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_transparent_write(GX_DRAW_CONTEXT *context,
INT xstart, INT xend, INT y, GX_FILL_PIXELMAP_INFO *info)
{
INT xval;
INT offset;
INT pic_width;
GX_CONST GX_UBYTE *get;
GX_UBYTE *put;
GX_PIXELMAP *pixelmap;
GX_UBYTE pixel;
pixelmap = info -> pixelmap;
pic_width = pixelmap -> gx_pixelmap_height;
if ((info -> draw) && (xstart <= xend))
{
get = info -> current_pixel_ptr;
put = (GX_UBYTE *)context -> gx_draw_context_memory;
put += y * context -> gx_draw_context_pitch + xstart;
/* Calculate the map offset in x-axis. */
offset = (info -> x_offset % pic_width);
for (xval = xstart; xval <= xend; xval++)
{
/* get points to the start postion of this row. So we need to calculate its position. */
pixel = *(get + offset);
offset++;
if (offset >= pic_width)
{
offset -= pic_width;
}
if (pixel != pixelmap -> gx_pixelmap_transparent_color)
{
*put = pixel;
}
put++;
}
}
/* This line is drawn. Update the pointer position for next row. */
info -> current_pixel_ptr += (UINT)pic_width * sizeof(GX_UBYTE);
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_ */
/* compressed_transparent_write */
/* */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of compressed */
/* pixlemap file with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of line left */
/* xend x-coord of line right */
/* y y-coord of line top */
/* info GX_FILL_PIXELMAP_INFO struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_horizontal_pixelmap_line_draw */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_compressed_transparent_write(GX_DRAW_CONTEXT *context,
INT xstart, INT xend, INT y, GX_FILL_PIXELMAP_INFO *info)
{
INT start_pos;
INT xval;
GX_UBYTE count;
GX_CONST GX_UBYTE *get = GX_NULL;
GX_UBYTE pixel;
GX_UBYTE *put;
GX_PIXELMAP *pixelmap;
pixelmap = info -> pixelmap;
if ((info -> draw) && (xstart <= xend))
{
/* Calcualte draw start position. */
start_pos = xstart - (info -> x_offset % pixelmap -> gx_pixelmap_height);
put = (GX_UBYTE *)context -> gx_draw_context_memory;
put += y * context -> gx_draw_context_pitch + start_pos;
/*Repeat the draw operation to fill the whole dirty area.*/
while (start_pos <= xend)
{
xval = start_pos;
/*Start from where we need to repeat.*/
get = (GX_CONST GX_UBYTE *)info -> current_pixel_ptr;
while (xval < start_pos + pixelmap -> gx_pixelmap_height)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
pixel = *get++;
if (pixel != pixelmap -> gx_pixelmap_transparent_color)
{
while (count--)
{
if (xval >= xstart && xval <= xend)
{
*put = pixel;
}
xval++;
put++;
}
}
else
{
xval += count;
put += count;
}
}
else
{
count++;
while (count--)
{
pixel = *get++;
if (xval >= xstart && xval <= xend)
{
if (pixel != pixelmap -> gx_pixelmap_transparent_color)
{
*put = pixel;
}
}
xval++;
put++;
}
}
}
start_pos += pixelmap -> gx_pixelmap_height;
}
}
else
{
xval = 0;
get = (GX_CONST GX_UBYTE *)info -> current_pixel_ptr;
while (xval < pixelmap -> gx_pixelmap_height)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
get++;
}
else
{
count++;
get += count;
}
xval += count;
}
}
/* This line is drawn. cache the pointer for next line draw.*/
info -> current_pixel_ptr = (GX_UBYTE *)get;
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 8bit screen driver pixelmap drawing function that handles */
/* compressed or uncompress, with or without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of line left */
/* xend x-coord of line end */
/* y y-coord of line top */
/* info GX_FILL_PIXELMAP_INFO struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_8bit_rotated_horizontal_pixelmap_line_raw_write */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_ */
/* compressed_write */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_ */
/* transparent_write */
/* _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_ */
/* compressed_transparent_write */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_draw(GX_DRAW_CONTEXT *context,
INT ystart, INT yend, INT x, GX_FILL_PIXELMAP_INFO *info)
{
INT xstart;
INT xend;
INT y;
if (info -> pixelmap == GX_NULL)
{
/* Nothing to drawn. Just return. */
return;
}
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
xstart = ystart;
xend = yend;
y = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - x - 1;
}
else
{
xstart = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - yend - 1;
xend = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - ystart - 1;
y = x;
info -> x_offset = (yend - ystart + 1 + info -> x_offset) % info -> pixelmap -> gx_pixelmap_height;
if (info -> x_offset)
{
info -> x_offset = info -> pixelmap -> gx_pixelmap_height - info -> x_offset;
}
}
if (info -> pixelmap == GX_NULL)
{
return;
}
if (info -> pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_TRANSPARENT)
{
if (info -> pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED)
{
/* has both compression and transparent */
_gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_compressed_transparent_write(context, xstart, xend, y, info);
}
else
{
/* transparent, no compression */
_gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_transparent_write(context, xstart, xend, y, info);
}
}
else
{
if (info -> pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED)
{
/* compressed with no transparency */
_gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_compressed_write(context, xstart, xend, y, info);
}
else
{
/* no compression or transaprency */
_gx_display_driver_8bpp_rotated_horizontal_pixelmap_line_raw_write(context, xstart, xend, y, info);
}
}
/*Current pixelmap has gone over, so the offset pointer should be reset.*/
if (info -> current_pixel_ptr >= info -> pixelmap -> gx_pixelmap_data + info -> pixelmap -> gx_pixelmap_data_size)
{
info -> current_pixel_ptr = (GX_UBYTE *)info -> pixelmap -> gx_pixelmap_data;
info -> current_aux_ptr = (GX_UBYTE *)info -> pixelmap -> gx_pixelmap_aux_data;
}
return;
}

View File

@ -0,0 +1,92 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixel_write PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated pixel write function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* x X coordinate */
/* y Y coordinate */
/* color Color of pixel to write */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_pixel_write(GX_DRAW_CONTEXT *context, INT x, INT y, GX_COLOR color)
{
GX_UBYTE *put = (GX_UBYTE *)context -> gx_draw_context_memory;
/* Calculate address of scan line. */
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
put += context -> gx_draw_context_pitch * (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - x - 1);
/* Step in by y coordinate. */
put += y;
}
else
{
put += context -> gx_draw_context_pitch * x;
/* Step in by y coordinate. */
put += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - y - 1);
}
/* write the pixel value */
*put = (GX_UBYTE)color;
}

View File

@ -0,0 +1,646 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_context.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_raw_write PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of uncompressed */
/* pixlemap file without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_raw_write(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
INT xval;
INT yval;
GX_UBYTE *putrow;
GX_UBYTE *getrow;
GX_UBYTE *put;
GX_CONST GX_UBYTE *get;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
put = putrow;
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
*put++ = *get++;
}
putrow += context -> gx_draw_context_pitch;
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_compressed_write */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of compressed */
/* pixlemap file. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_compressed_write(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
INT yval;
INT xval;
GX_CONST GX_UBYTE *get;
GX_UBYTE *put;
GX_UBYTE *putrow;
GX_UBYTE count;
GX_UBYTE pixel = 0;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
get = (GX_CONST GX_UBYTE *)pixelmap -> gx_pixelmap_data;
/* First, skip to the starting row. */
for (yval = ypos; yval < rotated_clip.gx_rectangle_top; yval++)
{
xval = 0;
while (xval < pixelmap -> gx_pixelmap_height)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
/* Skip repeated pixel value. */
get++;
}
else
{
count++;
/* Skip raw pixel values. */
get += count;
}
xval += count;
}
}
/* Now we are on the first visible row, copy pixels until we get
to the end of the last visible row. */
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += yval * context -> gx_draw_context_pitch;
putrow += xpos;
while (yval <= rotated_clip.gx_rectangle_bottom)
{
put = putrow;
xval = xpos;
while (xval < (xpos + pixelmap -> gx_pixelmap_height))
{
count = *get++;
if (count & 0x80)
{
/* Repeated value. */
count = (GX_UBYTE)((count & 0x7f) + 1);
pixel = *get++;
while (count--)
{
if (xval >= rotated_clip.gx_rectangle_left &&
xval <= rotated_clip.gx_rectangle_right)
{
*put = pixel;
}
put++;
xval++;
}
}
else
{
/* String of non-repeated values. */
count++;
while (count--)
{
if (xval >= rotated_clip.gx_rectangle_left &&
xval <= rotated_clip.gx_rectangle_right)
{
*put = *get;
}
put++;
get++;
xval++;
}
}
}
putrow += context -> gx_draw_context_pitch;
yval++;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_transparent_write */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of uncompressed */
/* pixlemap file with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_transparent_write(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
INT xval;
INT yval;
GX_UBYTE *putrow;
GX_UBYTE *getrow;
GX_UBYTE *put;
GX_UBYTE inval;
GX_CONST GX_UBYTE *get;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
getrow = (GX_UBYTE *)(pixelmap -> gx_pixelmap_data);
getrow += pixelmap -> gx_pixelmap_height * (rotated_clip.gx_rectangle_top - ypos);
getrow += (rotated_clip.gx_rectangle_left - xpos);
for (yval = rotated_clip.gx_rectangle_top; yval <= rotated_clip.gx_rectangle_bottom; yval++)
{
put = putrow;
get = getrow;
for (xval = rotated_clip.gx_rectangle_left; xval <= rotated_clip.gx_rectangle_right; xval++)
{
inval = *get++;
if (inval == pixelmap -> gx_pixelmap_transparent_color)
{
put++;
}
else
{
*put++ = inval;
}
}
putrow += context -> gx_draw_context_pitch;
getrow += pixelmap -> gx_pixelmap_height;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_compressed_transparent_ */
/* write */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that handles writing of compressed */
/* pixlemap file with alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_compressed_transparent_write(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
INT yval;
INT xval;
GX_CONST GX_UBYTE *get;
GX_UBYTE *put;
GX_UBYTE *putrow;
GX_UBYTE count;
GX_UBYTE pixel = 0;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_RECTANGLE rotated_clip;
GX_SWAP_VALS(xpos, ypos);
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
ypos = (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ypos - pixelmap -> gx_pixelmap_width);
}
else
{
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
xpos = (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xpos - pixelmap -> gx_pixelmap_height);
}
get = (GX_CONST GX_UBYTE *)pixelmap -> gx_pixelmap_data;
/* First, skip to the starting row. */
for (yval = ypos; yval < rotated_clip.gx_rectangle_top; yval++)
{
xval = 0;
while (xval < pixelmap -> gx_pixelmap_height)
{
count = *get++;
if (count & 0x80)
{
count = (GX_UBYTE)((count & 0x7f) + 1);
/* Skip repeated pixel value. */
get++;
}
else
{
count++;
/* Skip raw pixel values. */
get += count;
}
xval += count;
}
}
/* Now we are on the first visible row, copy pixels until we get
to the end of the last visible row. */
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += yval * context -> gx_draw_context_pitch;
putrow += xpos;
while (yval <= rotated_clip.gx_rectangle_bottom)
{
put = putrow;
xval = xpos;
while (xval < (xpos + pixelmap -> gx_pixelmap_height))
{
count = *get++;
if (count & 0x80)
{
/* Repeated value. */
count = (GX_UBYTE)((count & 0x7f) + 1);
pixel = *get++;
if (pixel == pixelmap -> gx_pixelmap_transparent_color)
{
put += count;
xval += count;
}
else
{
while (count--)
{
if (xval >= rotated_clip.gx_rectangle_left &&
xval <= rotated_clip.gx_rectangle_right)
{
*put = pixel;
}
put++;
xval++;
}
}
}
else
{
/* String of non-repeated values. */
count++;
while (count--)
{
pixel = *get++;
if (xval >= rotated_clip.gx_rectangle_left &&
xval <= rotated_clip.gx_rectangle_right &&
pixel != pixelmap -> gx_pixelmap_transparent_color)
{
*put = pixel;
}
put++;
xval++;
}
}
}
putrow += context -> gx_draw_context_pitch;
yval++;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* 8bit screen driver pixelmap drawing function that handles */
/* compressed or uncompress, with or without alpha channel. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_display_driver_8bit_rotated_pixelmap_compressed_write */
/* _gx_display_driver_8bit_rotated_pixelmap_compressed_transparent_ */
/* write */
/* _gx_display_driver_8bit_rotated_pixelmap_transparent_write */
/* _gx_display_driver_8bit_rotated_pixelmap_raw_write */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_pixelmap_draw(GX_DRAW_CONTEXT *context,
INT xpos, INT ypos, GX_PIXELMAP *pixelmap)
{
if (pixelmap -> gx_pixelmap_format != GX_COLOR_FORMAT_8BIT_PALETTE ||
(pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_ALPHA))
{
/* Wrong color format for this driver. */
return;
}
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_TRANSPARENT)
{
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED)
{
/* Has both compression and transparent. */
_gx_display_driver_8bpp_rotated_pixelmap_compressed_transparent_write(context, xpos, ypos, pixelmap);
}
else
{
/* Transparent, no compression. */
_gx_display_driver_8bpp_rotated_pixelmap_transparent_write(context, xpos, ypos, pixelmap);
}
}
else
{
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_COMPRESSED)
{
/* Compressed with no transparency. */
_gx_display_driver_8bpp_rotated_pixelmap_compressed_write(context, xpos, ypos, pixelmap);
}
else
{
/* No compression or transaprency. */
_gx_display_driver_8bpp_rotated_pixelmap_raw_write(context, xpos, ypos, pixelmap);
}
}
}

View File

@ -0,0 +1,789 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
#include "gx_context.h"
#include "gx_utility.h"
#include "gx_system.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_raw_rotate PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that rotate an uncompressed pixelmap */
/* without alpha. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_math_cos Compute the cosine value */
/* _gx_utility_math_sin Compute the sine value */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_pixelmap_rotate */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_raw_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_UBYTE *putrow;
GX_UBYTE *put;
GX_UBYTE *get;
INT srcxres;
INT srcyres;
INT cosv;
INT sinv;
INT idxminx;
INT idxmaxx;
INT idxmaxy;
INT mx[] = {-1, 1, 1, -1};
INT my[] = {1, 1, -1, -1};
INT xres;
INT yres;
INT x;
INT y;
INT xx;
INT yy;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
INT newxpos;
INT newypos;
clip = context -> gx_draw_context_clip;
/* Set transparent color. */
idxminx = (angle / 90) & 0x3;
idxmaxx = (idxminx + 2) & 0x3;
idxmaxy = (idxminx + 1) & 0x3;
/* Calculate the source x and y center. */
srcxres = pixelmap -> gx_pixelmap_height >> 1;
srcyres = pixelmap -> gx_pixelmap_width >> 1;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context->gx_draw_context_display->gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
srcyres = pixelmap->gx_pixelmap_width - 1 - srcyres;
ypos = context->gx_draw_context_canvas->gx_canvas_x_resolution - ypos - pixelmap->gx_pixelmap_width;
cy = pixelmap->gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip->gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip->gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_left);
}
else
{
srcxres = pixelmap->gx_pixelmap_height - 1 - srcxres;
xpos = context->gx_draw_context_canvas->gx_canvas_y_resolution - xpos - pixelmap->gx_pixelmap_height;
cx = pixelmap->gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip->gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip->gx_rectangle_right;
}
cosv = _gx_utility_math_cos(GX_FIXED_VAL_MAKE(angle));
sinv = _gx_utility_math_sin(GX_FIXED_VAL_MAKE(angle));
xres = GX_FIXED_VAL_TO_INT((mx[idxmaxx] * (srcxres + 2) * cosv - my[idxmaxx] * (srcyres + 2) * sinv));
yres = GX_FIXED_VAL_TO_INT((my[idxmaxy] * (srcyres + 2) * cosv + mx[idxmaxy] * (srcxres + 2) * sinv));
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
/* Calculate the new rotation axis. */
x = GX_FIXED_VAL_TO_INT((cx - srcxres) * cosv - (cy - srcyres) * sinv);
y = GX_FIXED_VAL_TO_INT((cy - srcyres) * cosv + (cx - srcxres) * sinv);
x += xres;
y += yres;
newxpos = xpos + cx - x;
newypos = ypos + cy - y;
/* For every pixel in destination bitmap, find its position in source bitmap,
and set the pixel with the value in source bitmap. */
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
xx = GX_FIXED_VAL_TO_INT((x - xres) * cosv + (y - yres) * sinv);
yy = GX_FIXED_VAL_TO_INT((y - yres) * cosv - (x - xres) * sinv);
xx += srcxres;
yy += srcyres;
if ((xx >= 0) && (xx < pixelmap -> gx_pixelmap_height) &&
(yy >= 0) && (yy < pixelmap -> gx_pixelmap_width))
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += yy * pixelmap -> gx_pixelmap_height;
get += xx;
*put = *get;
}
put++;
}
putrow += context -> gx_draw_context_pitch;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_transparent_rotate */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal helper function that rotate an uncompressed pixelmap */
/* without alpha. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _gx_utility_math_cos Compute the cosine value */
/* _gx_utility_math_sin Compute the sine value */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_transparent_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_UBYTE *putrow;
GX_UBYTE *put;
GX_UBYTE *get;
INT srcxres;
INT srcyres;
INT cosv;
INT sinv;
INT idxminx;
INT idxmaxx;
INT idxmaxy;
INT mx[] = {-1, 1, 1, -1};
INT my[] = {1, 1, -1, -1};
INT xres;
INT yres;
INT x;
INT y;
INT xx;
INT yy;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
INT newxpos;
INT newypos;
clip = context -> gx_draw_context_clip;
/* Set transparent color. */
idxminx = (angle / 90) & 0x3;
idxmaxx = (idxminx + 2) & 0x3;
idxmaxy = (idxminx + 1) & 0x3;
/* Calculate the source x and y center. */
srcxres = pixelmap -> gx_pixelmap_height >> 1;
srcyres = pixelmap -> gx_pixelmap_width >> 1;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context->gx_draw_context_display->gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
srcyres = pixelmap->gx_pixelmap_width - 1 - srcyres;
ypos = context->gx_draw_context_canvas->gx_canvas_x_resolution - ypos - pixelmap->gx_pixelmap_width;
cy = pixelmap->gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip->gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip->gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_left);
}
else
{
srcxres = pixelmap->gx_pixelmap_height - 1 - srcxres;
xpos = context->gx_draw_context_canvas->gx_canvas_y_resolution - xpos - pixelmap->gx_pixelmap_height;
cx = pixelmap->gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip->gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip->gx_rectangle_right;
}
cosv = _gx_utility_math_cos(GX_FIXED_VAL_MAKE(angle));
sinv = _gx_utility_math_sin(GX_FIXED_VAL_MAKE(angle));
xres = GX_FIXED_VAL_TO_INT((mx[idxmaxx] * (srcxres + 2) * cosv - my[idxmaxx] * (srcyres + 2) * sinv));
yres = GX_FIXED_VAL_TO_INT((my[idxmaxy] * (srcyres + 2) * cosv + mx[idxmaxy] * (srcxres + 2) * sinv));
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
/* Calculate the new rotation axis. */
x = (cx - srcxres) * cosv - (cy - srcyres) * sinv;
y = (cy - srcyres) * cosv + (cx - srcxres) * sinv;
x = GX_FIXED_VAL_TO_INT(x) + xres;
y = GX_FIXED_VAL_TO_INT(y) + yres;
newxpos = xpos + cx - x;
newypos = ypos + cy - y;
/* For every pixel in destination bitmap, find its position in source bitmap,
and set the pixel with the value in source bitmap. */
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
xx = GX_FIXED_VAL_TO_INT((x - xres) * cosv + (y - yres) * sinv);
yy = GX_FIXED_VAL_TO_INT((y - yres) * cosv - (x - xres) * sinv);
xx += srcxres;
yy += srcyres;
if ((xx >= 0) && (xx < pixelmap -> gx_pixelmap_height) &&
(yy >= 0) && (yy < pixelmap -> gx_pixelmap_width))
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += yy * pixelmap -> gx_pixelmap_height;
get += xx;
if ((*get) != pixelmap -> gx_pixelmap_transparent_color)
{
*put = *get;
}
}
put++;
}
putrow += context -> gx_draw_context_pitch;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_simple_rotate */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal help function that hangles 90, 180 and 270 degree pixelmap */
/* rotation. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_pixelmap_rotate */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_simple_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_UBYTE *putrow;
GX_UBYTE *put;
GX_UBYTE *get;
INT width;
INT height;
INT x;
INT y;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
INT newxpos;
INT newypos;
clip = context->gx_draw_context_clip;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context->gx_draw_context_display->gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
ypos = context->gx_draw_context_canvas->gx_canvas_x_resolution - ypos - pixelmap->gx_pixelmap_width;
cy = pixelmap->gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip->gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip->gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_left);
}
else
{
xpos = context->gx_draw_context_canvas->gx_canvas_y_resolution - xpos - pixelmap->gx_pixelmap_height;
cx = pixelmap->gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip->gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip->gx_rectangle_right;
}
if (angle == 90)
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - (width - 1 - cy);
newypos = ypos + cy - cx;
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += (width - 1 - x) * height;
get += y;
*put++ = *get;
}
putrow += context -> gx_draw_context_pitch;
}
}
else if (angle == 180)
{
width = pixelmap -> gx_pixelmap_height;
height = pixelmap -> gx_pixelmap_width;
newxpos = xpos + cx - (width - 1 - cx);
newypos = ypos + cy - (height - 1 - cy);
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += (height - 1 - y) * width;
get += width - 1 - x;
*put++ = *get;
}
putrow += context -> gx_draw_context_pitch;
}
}
else
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - cy;
newypos = ypos + cx - (height - 1 - cy);
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += x * height;
get += height - 1 - y;
*put++ = *get;
}
putrow += context -> gx_draw_context_pitch;
}
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_simple_transparent_rotate */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Internal help function that hangles 90, 180 and 270 degree pixelmap */
/* rotation. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* cx x-coord of rotate center */
/* cy y-coord of rotate center */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_display_driver_8bpp_pixelmap_rotate */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static VOID _gx_display_driver_8bpp_rotated_pixelmap_simple_transparent_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT cx, INT cy)
{
GX_UBYTE *putrow;
GX_UBYTE *put;
GX_UBYTE *get;
INT width;
INT height;
INT x;
INT y;
GX_RECTANGLE *clip;
GX_RECTANGLE rotated_clip;
INT newxpos;
INT newypos;
clip = context -> gx_draw_context_clip;
GX_SWAP_VALS(xpos, ypos);
GX_SWAP_VALS(cx, cy);
if (context->gx_draw_context_display->gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
ypos = context->gx_draw_context_canvas->gx_canvas_x_resolution - ypos - pixelmap->gx_pixelmap_width;
cy = pixelmap->gx_pixelmap_width - cy - 1;
rotated_clip.gx_rectangle_left = clip->gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip->gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_right);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_x_resolution - 1 - clip->gx_rectangle_left);
}
else
{
xpos = context->gx_draw_context_canvas->gx_canvas_y_resolution - xpos - pixelmap->gx_pixelmap_height;
cx = pixelmap->gx_pixelmap_height - cx - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_bottom);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context->gx_draw_context_canvas->gx_canvas_y_resolution - 1 - clip->gx_rectangle_top);
rotated_clip.gx_rectangle_top = clip->gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip->gx_rectangle_right;
}
if (angle == 90)
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - (width - 1 - cy);
newypos = ypos + cy - cx;
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += (width - 1 - x) * height;
get += y;
if ((*get) != pixelmap -> gx_pixelmap_transparent_color)
{
*put = *get;
}
put++;
}
putrow += context -> gx_draw_context_pitch;
}
}
else if (angle == 180)
{
width = pixelmap -> gx_pixelmap_height;
height = pixelmap -> gx_pixelmap_width;
newxpos = xpos + cx - (width - 1 - cx);
newypos = ypos + cy - (height - 1 - cy);
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += (height - 1 - y) * width;
get += width - 1 - x;
if ((*get) != pixelmap -> gx_pixelmap_transparent_color)
{
*put = *get;
}
put++;
}
putrow += context -> gx_draw_context_pitch;
}
}
else
{
width = pixelmap -> gx_pixelmap_width;
height = pixelmap -> gx_pixelmap_height;
newxpos = xpos + cx - cy;
newypos = ypos + cx - (height - 1 - cy);
putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
putrow += rotated_clip.gx_rectangle_top * context -> gx_draw_context_pitch;
putrow += rotated_clip.gx_rectangle_left;
for (y = rotated_clip.gx_rectangle_top - newypos; y <= rotated_clip.gx_rectangle_bottom - newypos; y++)
{
put = putrow;
for (x = rotated_clip.gx_rectangle_left - newxpos; x <= rotated_clip.gx_rectangle_right - newxpos; x++)
{
get = (GX_UBYTE *)pixelmap -> gx_pixelmap_data;
get += x * height;
get += height - 1 - y;
if ((*get) != pixelmap -> gx_pixelmap_transparent_color)
{
*put = *get;
}
put++;
}
putrow += context -> gx_draw_context_pitch;
}
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_rotate PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This service rotate a pixelmap directly to canvas memory. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xpos x-coord of top-left draw point*/
/* ypos y-coord of top-left draw point*/
/* pixelmap Pointer to GX_PIXELMAP struct */
/* angle The angle to rotate */
/* rot_cx x-coord of rotating center. */
/* rot_cy y-coord of rotationg center. */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_display_driver_8bpp_rotated_pixelmap_simple_transparent_rotate */
/* _gx_display_driver_8bpp_rotated_pixelmap_simple_rotate */
/* _gx_display_driver_8bpp_rotated_pixelmap_transparent_rotate */
/* _gx_display_driver_8bpp_rotated_pixelmap_raw_rotate */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_pixelmap_rotate(GX_DRAW_CONTEXT *context, INT xpos, INT ypos, GX_PIXELMAP *pixelmap,
INT angle, INT rot_cx, INT rot_cy)
{
if (angle % 90 == 0)
{
/* Simple angle rotate: 90 degree, 180 degree and 270 degree. */
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_TRANSPARENT)
{
_gx_display_driver_8bpp_rotated_pixelmap_simple_transparent_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
else
{
_gx_display_driver_8bpp_rotated_pixelmap_simple_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
}
else
{
if (pixelmap -> gx_pixelmap_flags & GX_PIXELMAP_TRANSPARENT)
{
/* no compression or alpha */
_gx_display_driver_8bpp_rotated_pixelmap_transparent_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
else
{
/* no compression or alpha */
_gx_display_driver_8bpp_rotated_pixelmap_raw_rotate(context, xpos, ypos, pixelmap, angle, rot_cx, rot_cy);
}
}
return;
}

View File

@ -0,0 +1,476 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define PIXEL_WRITE(loc, val) (*(loc) = ((GX_UBYTE)val))
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_utility.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_simple_line_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* xstart x-coord of endpoint */
/* ystart y-coord of endpoint */
/* xend x-coord of endpoint */
/* yend y-coord of endpoint */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* GX_ABS Compute the absolute value */
/* GX_SWAP_VALUE Swap two values */
/* [PIXEL_WRITE] Driver level pixel write */
/* routine */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_simple_line_draw(GX_DRAW_CONTEXT *context, INT xstart, INT ystart, INT xend, INT yend)
{
INT curx;
INT cury;
INT x_sign;
INT y_sign;
INT decision;
INT nextx;
INT nexty;
INT y_increment;
GX_POINT end_point;
GX_POINT mid_point;
GX_RECTANGLE half_rectangle;
GX_RECTANGLE half_over;
INT sign;
INT steps;
GX_UBYTE *put;
GX_UBYTE *next_put;
GX_BOOL clipped = GX_TRUE;
INT dx;
INT dy;
GX_RECTANGLE *clip = context -> gx_draw_context_clip;
GX_COLOR linecolor = context -> gx_draw_context_brush.gx_brush_line_color;
GX_RECTANGLE rotated_clip;
GX_SWAP_VALS(xstart, ystart);
GX_SWAP_VALS(xend, yend);
clip = context -> gx_draw_context_clip;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
ystart = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - ystart - 1;
yend = context -> gx_draw_context_canvas -> gx_canvas_x_resolution - yend - 1;
rotated_clip.gx_rectangle_left = clip -> gx_rectangle_top;
rotated_clip.gx_rectangle_right = clip -> gx_rectangle_bottom;
rotated_clip.gx_rectangle_top = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_right - 1);
rotated_clip.gx_rectangle_bottom = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_x_resolution - clip -> gx_rectangle_left - 1);
}
else
{
xstart = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xstart - 1;
xend = context -> gx_draw_context_canvas -> gx_canvas_y_resolution - xend - 1;
rotated_clip.gx_rectangle_left = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_bottom - 1);
rotated_clip.gx_rectangle_right = (GX_VALUE)(context -> gx_draw_context_canvas -> gx_canvas_y_resolution - clip -> gx_rectangle_top - 1);
rotated_clip.gx_rectangle_top = clip -> gx_rectangle_left;
rotated_clip.gx_rectangle_bottom = clip -> gx_rectangle_right;
}
dx = GX_ABS(xend - xstart);
dy = GX_ABS(yend - ystart);
if (((dx >= dy && (xstart > xend)) || ((dy > dx) && ystart > yend)))
{
GX_SWAP_VALS(xend, xstart);
GX_SWAP_VALS(yend, ystart);
}
x_sign = (xend - xstart) / dx;
y_sign = (yend - ystart) / dy;
if (y_sign > 0)
{
y_increment = context -> gx_draw_context_pitch;
}
else
{
y_increment = 0 - context -> gx_draw_context_pitch;
}
put = (GX_UBYTE *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart;
next_put = (GX_UBYTE *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend;
end_point.gx_point_x = (GX_VALUE)xstart;
end_point.gx_point_y = (GX_VALUE)ystart;
if (_gx_utility_rectangle_point_detect(&rotated_clip, end_point))
{
end_point.gx_point_x = (GX_VALUE)xend;
end_point.gx_point_y = (GX_VALUE)yend;
if (_gx_utility_rectangle_point_detect(&rotated_clip, end_point))
{
clipped = GX_FALSE;
}
}
if (clipped)
{
/* here if we must do clipping in the inner loop, because one
or both of the end points are outside clipping rectangle */
/* Calculate the middle point of the line. */
mid_point.gx_point_x = (GX_VALUE)(xend + xstart) >> 1;
mid_point.gx_point_y = (GX_VALUE)(yend + ystart) >> 1;
/* Judge the &rotated_clip in which side. */
if (_gx_utility_rectangle_point_detect(&rotated_clip, mid_point))
{
/* the &rotated_clip in two sides. */
if (dx >= dy)
{
/* walk out the clipping point. */
for (curx = xstart, cury = ystart, decision = (dx >> 1); curx < mid_point.gx_point_x;
curx++, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
if (curx >= rotated_clip.gx_rectangle_left &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
break;
}
put++;
}
for (; curx <= mid_point.gx_point_x;
curx++, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
PIXEL_WRITE(put, linecolor);
put++;
}
for (nextx = xend, nexty = yend, decision = (dx >> 1); nextx > mid_point.gx_point_x;
nextx--, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
nexty -= y_sign;
next_put -= y_increment;
}
if (nextx <= rotated_clip.gx_rectangle_right &&
nexty >= rotated_clip.gx_rectangle_top &&
nexty <= rotated_clip.gx_rectangle_bottom)
{
break;
}
next_put--;
}
for (; nextx > mid_point.gx_point_x;
nextx--, decision += dy)
{
if (decision >= dx)
{
decision -= dx;
nexty -= y_sign;
next_put -= y_increment;
}
PIXEL_WRITE(next_put, linecolor);
next_put--;
}
}
else
{
for (nextx = xend, nexty = yend, decision = (dy >> 1); nexty > mid_point.gx_point_y;
nexty--, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
nextx -= x_sign;
next_put -= x_sign;
}
if (nextx >= rotated_clip.gx_rectangle_left &&
nextx <= rotated_clip.gx_rectangle_right &&
nexty <= rotated_clip.gx_rectangle_bottom)
{
break;
}
next_put -= context -> gx_draw_context_pitch;
}
for (; nexty > mid_point.gx_point_y;
nexty--, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
nextx -= x_sign;
next_put -= x_sign;
}
PIXEL_WRITE(next_put, linecolor);
next_put -= context -> gx_draw_context_pitch;
}
/* walk out the clipping point. */
for (curx = xstart, cury = ystart, decision = (dy >> 1); cury < mid_point.gx_point_y;
cury++, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top)
{
break;
}
put += context -> gx_draw_context_pitch;
}
for (; cury <= mid_point.gx_point_y;
cury++, decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
PIXEL_WRITE(put, linecolor);
put += context -> gx_draw_context_pitch;
}
}
}
else
{
/* The &rotated_clip stay at one side. */
if (dx >= dy)
{
half_rectangle.gx_rectangle_left = (GX_VALUE)xstart;
half_rectangle.gx_rectangle_right = mid_point.gx_point_x;
if (y_sign == 1)
{
half_rectangle.gx_rectangle_top = (GX_VALUE)ystart;
half_rectangle.gx_rectangle_bottom = mid_point.gx_point_y;
}
else
{
half_rectangle.gx_rectangle_top = mid_point.gx_point_y;
half_rectangle.gx_rectangle_bottom = (GX_VALUE)ystart;
}
if (_gx_utility_rectangle_overlap_detect(&rotated_clip, &half_rectangle, &half_over))
{
curx = xstart;
cury = ystart;
steps = mid_point.gx_point_x - curx + 1;
sign = 1;
}
else
{
curx = xend;
cury = yend;
steps = xend - mid_point.gx_point_x;
sign = -1;
y_increment = 0 - y_increment;
y_sign = 0 - y_sign;
put = next_put;
}
for (decision = (dx >> 1); steps > 0; curx += sign, decision += dy, steps--)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
put += y_increment;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
PIXEL_WRITE(put, linecolor);
}
put += sign;
}
}
else
{
half_rectangle.gx_rectangle_top = (GX_VALUE)ystart;
half_rectangle.gx_rectangle_bottom = mid_point.gx_point_y;
if (x_sign == 1)
{
half_rectangle.gx_rectangle_right = mid_point.gx_point_x;
half_rectangle.gx_rectangle_left = (GX_VALUE)xstart;
}
else
{
half_rectangle.gx_rectangle_right = (GX_VALUE)xstart;
half_rectangle.gx_rectangle_left = mid_point.gx_point_x;
}
if (_gx_utility_rectangle_overlap_detect(&rotated_clip, &half_rectangle, &half_over))
{
curx = xstart;
cury = ystart;
steps = mid_point.gx_point_y - cury + 1;
y_increment = context -> gx_draw_context_pitch;
sign = 1;
}
else
{
curx = xend;
cury = yend;
steps = yend - mid_point.gx_point_y;
sign = -1;
y_increment = 0 - context -> gx_draw_context_pitch;
x_sign = 0 - x_sign;
put = next_put;
}
for (decision = (dy >> 1); steps > 0; cury += sign, decision += dx, steps--)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
put += x_sign;
}
if (curx >= rotated_clip.gx_rectangle_left &&
curx <= rotated_clip.gx_rectangle_right &&
cury >= rotated_clip.gx_rectangle_top &&
cury <= rotated_clip.gx_rectangle_bottom)
{
PIXEL_WRITE(put, linecolor);
}
put += y_increment;
}
}
}
}
else
{
/* here if both line ends lie within clipping rectangle, we can
run a faster inner loop */
if (dx >= dy)
{
put = (GX_UBYTE *)(context -> gx_draw_context_memory) + ystart * context -> gx_draw_context_pitch + xstart;
next_put = (GX_UBYTE *)(context -> gx_draw_context_memory) + yend * context -> gx_draw_context_pitch + xend;
for (curx = xstart, cury = ystart, nextx = xend, nexty = yend,
decision = (dx >> 1); curx <= nextx; curx++, nextx--,
decision += dy)
{
if (decision >= dx)
{
decision -= dx;
cury += y_sign;
nexty -= y_sign;
put += y_increment;
next_put -= y_increment;
}
PIXEL_WRITE(put, linecolor);
PIXEL_WRITE(next_put, linecolor);
put++;
next_put--;
}
}
else
{
for (curx = xstart, cury = ystart, nextx = xend, nexty = yend,
decision = (dy >> 1); cury <= nexty; cury++, nexty--,
decision += dx)
{
if (decision >= dy)
{
decision -= dy;
curx += x_sign;
nextx -= x_sign;
put += x_sign;
next_put -= x_sign;
}
PIXEL_WRITE(put, linecolor);
PIXEL_WRITE(next_put, linecolor);
put += context -> gx_draw_context_pitch;
next_put -= context -> gx_draw_context_pitch;
}
}
}
}

View File

@ -0,0 +1,110 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_vertical_line_draw PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated vertical line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* ystart y-coord of top endpoint */
/* yend y-coord of bottom endpoint */
/* xpos x-coord of left edge */
/* width width of the line */
/* color Color of line to draw */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_vertical_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos, INT width, GX_COLOR color)
{
INT row;
INT column;
GX_UBYTE *put;
GX_UBYTE *rowstart;
INT len = yend - ystart + 1;
/* Pick up starting address of canvas memory. */
rowstart = (GX_UBYTE *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Calculate start of scanline. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xpos - 1) * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += ystart;
}
else
{
rowstart += (xpos + width - 1) * context -> gx_draw_context_pitch;
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - yend - 1);
}
/* Draw line width from left to right. */
for (column = 0; column < width; column++)
{
put = rowstart;
/* Draw line from top to bottom. */
for (row = 0; row < len; row++)
{
*put++ = (GX_UBYTE)color;
}
/* Ddvance to the next scaneline. */
rowstart -= context -> gx_draw_context_pitch;
}
}

View File

@ -0,0 +1,135 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Display Management (Display) */
/** */
/**************************************************************************/
#define GX_SOURCE_CODE
/* Include necessary system files. */
#include "gx_api.h"
#include "gx_display.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_8bpp_rotated_vertical_pattern_line_draw */
/* PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* Generic 8bpp color format rotated vertical line draw function. */
/* */
/* INPUT */
/* */
/* context Drawing context */
/* ystart y-coord of top endpoint */
/* yend y-coord of bottom endpoint */
/* xpos x-coord of left edge */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* GUIX Internal Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
VOID _gx_display_driver_8bpp_rotated_vertical_pattern_line_draw(GX_DRAW_CONTEXT *context, INT ystart, INT yend, INT xpos)
{
INT row;
GX_UBYTE *put;
GX_UBYTE *rowstart;
ULONG pattern;
ULONG mask;
GX_UBYTE on_color;
GX_UBYTE off_color;
INT len = yend - ystart + 1;
/* Pick up starting address of canvas memory. */
rowstart = (GX_UBYTE *)context -> gx_draw_context_memory;
if (context -> gx_draw_context_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
/* Calculate start of scanline. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_x_resolution - xpos - 1) * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += ystart;
}
else
{
/* Calculate start of scanline. */
rowstart += xpos * context -> gx_draw_context_pitch;
/* Offset into starting pixel. */
rowstart += (context -> gx_draw_context_canvas -> gx_canvas_y_resolution - yend - 1);
}
/* Pick up the requested pattern and mask. */
pattern = context -> gx_draw_context_brush.gx_brush_line_pattern;
mask = context -> gx_draw_context_brush.gx_brush_pattern_mask;
on_color = (GX_UBYTE)context -> gx_draw_context_brush.gx_brush_line_color;
off_color = (GX_UBYTE)context -> gx_draw_context_brush.gx_brush_fill_color;
/* Draw line from top to bottom. */
for (row = 0; row < len; row++)
{
put = rowstart;
if (pattern & mask)
{
*put = on_color;
}
else
{
*put = off_color;
}
mask >>= 1;
if (!mask)
{
mask = 0x80000000;
}
/* advance to the next scaneline */
rowstart++;
}
/* save current masks value back to brush */
context -> gx_draw_context_brush.gx_brush_pattern_mask = mask;
}

View File

@ -778,7 +778,7 @@ GX_POLYGON_EDGE temp;
/* FUNCTION RELEASE */
/* */
/* _gx_display_driver_generic_rotated_polygon_fill PORTABLE C */
/* x.x */
/* 6.1.3 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */

View File

@ -215,6 +215,71 @@ GX_COLOR *pLine;
return GX_SUCCESS;
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _gx_image_reader_24xrgb_rotated_pixel_write PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function writes a pixel to output rotated pixelmap data */
/* structure. */
/* */
/* INPUT */
/* */
/* image_reader Image reader control block. */
/* pixel Pixel to write. */
/* */
/* OUTPUT */
/* */
/* Completion Status */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _gx_image_reader_pixel_write_callback_set */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_image_reader_24xrgb_rotated_pixel_write(GX_IMAGE_READER *image_reader, GX_PIXEL *pixel)
{
GX_COLOR *pLine;
if (!image_reader -> gx_image_reader_size_testing)
{
pLine = (GX_COLOR *)image_reader -> gx_image_reader_putdata;
(*pLine) = (GX_COLOR)((pixel -> gx_pixel_red << 16));
(*pLine) = (GX_COLOR)((*pLine) | ((ULONG)(pixel -> gx_pixel_green) << 8));
(*pLine) = (GX_COLOR)((*pLine) | pixel -> gx_pixel_blue);
(*pLine) = (GX_COLOR)((*pLine) | ((ULONG)(pixel -> gx_pixel_alpha) << 24));
}
if (image_reader -> gx_image_reader_mode & GX_IMAGE_READER_MODE_ROTATE_CW)
{
image_reader -> gx_image_reader_putdata -= (image_reader -> gx_image_reader_image_height << 2);
}
else
{
image_reader -> gx_image_reader_putdata += (image_reader -> gx_image_reader_image_height << 2);
}
return GX_SUCCESS;
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
@ -1207,7 +1272,7 @@ GX_UBYTE color;
/* FUNCTION RELEASE */
/* */
/* _gx_image_reader_pixel_rotated_write_callback_set PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -1229,8 +1294,11 @@ GX_UBYTE color;
/* CALLS */
/* */
/* _gx_image_reader_565rgb_rotated_pixel_write */
/* Write 565 rgb format pixel */
/* in rotation mode */
/* Write 565rgb format pixel in */
/* rotation mode */
/* _gx_image_reader_24xrgb_rotated_pixel_write */
/* Write 24xrgn format pixel in */
/* rotation mode */
/* */
/* CALLED BY */
/* */
@ -1241,6 +1309,9 @@ GX_UBYTE color;
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* added 24xrgb format support,*/
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_image_reader_pixel_rotated_write_callback_set(GX_IMAGE_READER *image_reader, GX_PIXELMAP *outmap)
@ -1284,6 +1355,29 @@ static UINT _gx_image_reader_pixel_rotated_write_callback_set(GX_IMAGE_READER *i
}
break;
case GX_COLOR_FORMAT_24XRGB:
image_reader -> gx_image_reader_pixel_write = _gx_image_reader_24xrgb_rotated_pixel_write;
if (image_reader -> gx_image_reader_mode & GX_IMAGE_READER_MODE_ROTATE_CW)
{
outmap -> gx_pixelmap_flags |= GX_PIXELMAP_ROTATED_90;
image_reader -> gx_image_reader_putdatarow = (GX_UBYTE *)outmap -> gx_pixelmap_data;
image_reader -> gx_image_reader_putdatarow += (outmap -> gx_pixelmap_width - 1) * (outmap -> gx_pixelmap_height << 2);
image_reader -> gx_image_reader_putdatarow_stride = 4;
}
else
{
outmap -> gx_pixelmap_flags |= GX_PIXELMAP_ROTATED_270;
image_reader -> gx_image_reader_putdatarow = (GX_UBYTE *)outmap -> gx_pixelmap_data;
image_reader -> gx_image_reader_putdatarow += ((outmap -> gx_pixelmap_height - 1) << 2);
image_reader -> gx_image_reader_putdatarow_stride = -4;
}
break;
default:
return GX_NOT_SUPPORTED;
break;

View File

@ -35,7 +35,7 @@
/* FUNCTION RELEASE */
/* */
/* _gx_radial_slider_pen_down_event_process PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -75,6 +75,11 @@
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STATUS_TRACKING_START to */
/* GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_radial_slider_pen_down_event_process(GX_RADIAL_SLIDER *slider, GX_EVENT *event_ptr)
@ -100,7 +105,7 @@ GX_RECTANGLE rectangle;
/* Check if click point is inside needle area. */
if (_gx_utility_rectangle_point_detect(&rectangle, *point))
{
slider -> gx_widget_status |= GX_STATUS_TRACKING_START;
slider -> gx_widget_status |= GX_STATUS_TRACKING_PEN;
_gx_system_input_capture((GX_WIDGET *)slider);
}
@ -136,7 +141,7 @@ GX_RECTANGLE rectangle;
/* FUNCTION RELEASE */
/* */
/* _gx_radial_slider_pen_drag_event_process PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -171,6 +176,11 @@ GX_RECTANGLE rectangle;
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STATUS_TRACKING_START to */
/* GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_radial_slider_pen_drag_event_process(GX_RADIAL_SLIDER *slider, GX_EVENT *event_ptr)
@ -181,7 +191,7 @@ GX_RADIAL_SLIDER_INFO *info = &slider -> gx_radial_slider_info;
GX_BOOL update = GX_FALSE;
/* move my needle */
if (slider -> gx_widget_status & GX_STATUS_TRACKING_START)
if (slider -> gx_widget_status & GX_STATUS_TRACKING_PEN)
{
/* Calcualte new slider value. */
_gx_radial_slider_angle_calculate(slider, event_ptr -> gx_event_payload.gx_event_pointdata, &new_value);
@ -231,7 +241,7 @@ GX_BOOL update = GX_FALSE;
/* FUNCTION RELEASE */
/* */
/* _gx_radial_slider_pen_up_event_process PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -271,6 +281,11 @@ GX_BOOL update = GX_FALSE;
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STATUS_TRACKING_START to */
/* GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_radial_slider_pen_up_event_process(GX_RADIAL_SLIDER *slider, GX_EVENT *event_ptr)
@ -285,11 +300,11 @@ GX_POINT *point;
point = &event_ptr -> gx_event_payload.gx_event_pointdata;
if (slider -> gx_widget_status & GX_STATUS_TRACKING_START ||
if (slider -> gx_widget_status & GX_STATUS_TRACKING_PEN ||
((GX_ABS(point -> gx_point_x - slider -> gx_radial_slider_pendown_point.gx_point_x) < 5) &&
(GX_ABS(point -> gx_point_y - slider -> gx_radial_slider_pendown_point.gx_point_y) < 5)))
{
if (slider -> gx_widget_status & GX_STATUS_TRACKING_START)
if (slider -> gx_widget_status & GX_STATUS_TRACKING_PEN)
{
new_value = info -> gx_radial_slider_info_current_angle;
}
@ -304,7 +319,7 @@ GX_POINT *point;
}
slider -> gx_widget_status |= GX_STATUS_ANIMATION_NONE;
slider -> gx_widget_status &= ~GX_STATUS_TRACKING_START;
slider -> gx_widget_status &= ~GX_STATUS_TRACKING_PEN;
}
else
{

View File

@ -335,7 +335,7 @@ INT speed;
/* FUNCTION RELEASE */
/* */
/* _gx_scroll_wheel_pen_up_event_handler PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -372,13 +372,18 @@ INT speed;
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STYLE_SCROLL_WHEEL_DRAG */
/* to GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_scroll_wheel_pen_up_event_handler(GX_SCROLL_WHEEL *wheel)
{
GX_RECTANGLE dirty;
wheel -> gx_widget_style &= (ULONG)(~GX_STYLE_SCROLL_WHEEL_DRAG);
wheel -> gx_widget_status &= (ULONG)(~GX_STATUS_TRACKING_PEN);
if (wheel -> gx_scroll_wheel_selected_yshift)
{
@ -409,7 +414,7 @@ GX_RECTANGLE dirty;
/* FUNCTION RELEASE */
/* */
/* _gx_scroll_wheel_event_process PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -454,6 +459,11 @@ GX_RECTANGLE dirty;
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STYLE_SCROLL_WHEEL_DRAG */
/* to GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
UINT _gx_scroll_wheel_event_process(GX_SCROLL_WHEEL *wheel, GX_EVENT *event_ptr)
@ -474,7 +484,7 @@ GX_VALUE shift;
case GX_EVENT_PEN_DRAG:
if (wheel -> gx_widget_status & GX_STATUS_OWNS_INPUT)
{
wheel -> gx_widget_style |= GX_STYLE_SCROLL_WHEEL_DRAG;
wheel -> gx_widget_status |= GX_STATUS_TRACKING_PEN;
shift = (GX_VALUE)(event_ptr -> gx_event_payload.gx_event_pointdata.gx_point_y - wheel -> gx_window_move_start.gx_point_y);
if (shift)
{

View File

@ -273,7 +273,7 @@ GX_BRUSH *brush;
/* FUNCTION RELEASE */
/* */
/* _gx_text_scroll_wheel_row_draw PORTABLE C */
/* 6.1 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -312,6 +312,11 @@ GX_BRUSH *brush;
/* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
/* 09-30-2020 Kenneth Maxwell Modified comment(s), */
/* resulting in version 6.1 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* renamed */
/* GX_STYLE_SCROLL_WHEEL_DRAG */
/* to GX_STATUS_TRACKING_PEN, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static UINT _gx_text_scroll_wheel_row_draw(GX_TEXT_SCROLL_WHEEL *wheel, GX_RECTANGLE *selected_area, GX_RECTANGLE *draw_area, GX_CONST GX_STRING *string)
@ -342,7 +347,7 @@ UINT (*text_draw)(GX_TEXT_SCROLL_WHEEL *wheel, GX_RESOURCE_ID tColor,
text_draw = _gx_text_scroll_wheel_flat_text_draw;
}
if ((wheel -> gx_widget_style & GX_STYLE_SCROLL_WHEEL_DRAG) ||
if ((wheel -> gx_widget_status & GX_STATUS_TRACKING_PEN) ||
(wheel -> gx_scroll_wheel_animation_steps != 0) ||
(!_gx_utility_rectangle_compare(selected_area, draw_area)))
{

154
ports/generic/inc/gx_port.h Normal file
View File

@ -0,0 +1,154 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Port Specific */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* APPLICATION INTERFACE DEFINITION RELEASE */
/* */
/* gx_api.h Generic */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file contains data type definitions and constants that work */
/* generically on most compiler and processor architectures. */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
#ifndef GX_PORT_H
#define GX_PORT_H
/* Determine if the optional GUIX user define file should be used. */
#ifdef GX_INCLUDE_USER_DEFINE_FILE
/* Include the user defines in gx_user.h. The defines in this file may
alternately be defined on the command line. */
#include "gx_user.h"
#endif
typedef INT GX_BOOL;
typedef SHORT GX_VALUE;
#define GX_VALUE_MAX 0x7FFF
/* Define the basic system parameters. */
#ifndef GX_THREAD_STACK_SIZE
#define GX_THREAD_STACK_SIZE 4096
#endif
#ifndef GX_TICKS_SECOND
#define GX_TICKS_SECOND 20
#endif
#define GX_CONST const
#define GX_INCLUDE_DEFAULT_COLORS
#define GX_MAX_ACTIVE_TIMERS 32
#define GX_SYSTEM_TIMER_TICKS 2 /* 20 ms */
#define GX_MAX_VIEWS 32
#define GX_MAX_DISPLAY_HEIGHT 800
/* Define several macros for the error checking shell in GUIX. */
#ifdef GX_DISABLE_THREADX_BINDING
/* Here if not running with ThreadX RTOS */
#define GX_CALLER_CHECKING_EXTERNS
#define GX_THREADS_ONLY_CALLER_CHECKING
#define GX_INIT_AND_THREADS_CALLER_CHECKING
#define GX_NOT_ISR_CALLER_CHECKING
#define GX_THREAD_WAIT_CALLER_CHECKING
#else
#ifdef TX_TIMER_PROCESS_IN_ISR
#define GX_CALLER_CHECKING_EXTERNS extern TX_THREAD *_tx_thread_current_ptr; \
extern volatile ULONG _tx_thread_system_state;
#define GX_THREADS_ONLY_CALLER_CHECKING if ((TX_THREAD_GET_SYSTEM_STATE()) || \
(_tx_thread_current_ptr == TX_NULL)) \
return(GX_CALLER_ERROR);
#define GX_INIT_AND_THREADS_CALLER_CHECKING if (((TX_THREAD_GET_SYSTEM_STATE()) && ((TX_THREAD_GET_SYSTEM_STATE()) < ((ULONG) 0xF0F0F0F0)))) \
return(GX_CALLER_ERROR);
#define GX_NOT_ISR_CALLER_CHECKING if ((TX_THREAD_GET_SYSTEM_STATE()) && ((TX_THREAD_GET_SYSTEM_STATE()) < ((ULONG) 0xF0F0F0F0))) \
return(GX_CALLER_ERROR);
#define GX_THREAD_WAIT_CALLER_CHECKING if ((wait_option) && \
((_tx_thread_current_ptr == NX_NULL) || (TX_THREAD_GET_SYSTEM_STATE()))) \
return(GX_CALLER_ERROR);
#else
#define GX_CALLER_CHECKING_EXTERNS extern TX_THREAD *_tx_thread_current_ptr; \
extern TX_THREAD _tx_timer_thread; \
extern volatile ULONG _tx_thread_system_state;
#define GX_THREADS_ONLY_CALLER_CHECKING if ((TX_THREAD_GET_SYSTEM_STATE()) || \
(_tx_thread_current_ptr == TX_NULL) || \
(_tx_thread_current_ptr == &_tx_timer_thread)) \
return(GX_CALLER_ERROR);
#define GX_INIT_AND_THREADS_CALLER_CHECKING if (((TX_THREAD_GET_SYSTEM_STATE()) && ((TX_THREAD_GET_SYSTEM_STATE()) < ((ULONG) 0xF0F0F0F0))) || \
(_tx_thread_current_ptr == &_tx_timer_thread)) \
return(GX_CALLER_ERROR);
#define GX_NOT_ISR_CALLER_CHECKING if ((TX_THREAD_GET_SYSTEM_STATE()) && ((TX_THREAD_GET_SYSTEM_STATE()) < ((ULONG) 0xF0F0F0F0))) \
return(GX_CALLER_ERROR);
#define GX_THREAD_WAIT_CALLER_CHECKING if ((wait_option) && \
((_tx_thread_current_ptr == NX_NULL) || (TX_THREAD_GET_SYSTEM_STATE()) || (_tx_thread_current_ptr == &_tx_timer_thread))) \
return(GX_CALLER_ERROR);
#endif
#endif
/* Define the version ID of GUIX. This may be utilized by the application. */
#ifdef GX_SYSTEM_INIT
CHAR _gx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * GUIX Version 6.x *";
#else
extern CHAR _gx_version_id[];
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -26,7 +26,7 @@
/* COMPONENT DEFINITION RELEASE */
/* */
/* gx_win32_driver.h PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -40,6 +40,10 @@
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* added 8bpp/24bpp rotated */
/* display driver declarations,*/
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
@ -85,20 +89,22 @@ typedef struct GX_WIN32_DISPLAY_DRIVER_STRUCT
UINT win32_graphics_driver_setup_monochrome(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_4bpp_grayscale(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_8bit_palette(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_8bit_palette_rotated(GX_DISPLAY* display);
UINT win32_graphics_driver_setup_565rgb(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_565rgb_rotated(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_565bgr(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_1555xrgb(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_4444argb(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_24xrgb_rotated(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_32argb(GX_DISPLAY *display);
UINT win32_graphics_driver_setup_32argb_rotated(GX_DISPLAY *display);
UINT win32_chromeart_graphics_driver_setup_565rgb(GX_DISPLAY *display);
UINT win32_synergy_graphics_driver_setup_8bit_palette(GX_DISPLAY *display);
UINT win32_synergy_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
UINT win32_synergy_graphics_driver_setup_565rgb(GX_DISPLAY *display);
UINT win32_synergy_graphics_driver_setup_565rgb_rotated(GX_DISPLAY *display);
VOID win32_32bpp_bitmap_header_create(GX_DISPLAY *display);
VOID win32_display_driver_8bit_palette_set(GX_DISPLAY *display, GX_COLOR *palette, INT count);
VOID win32_8bit_palette_bitmap_header_create(GX_DISPLAY *display);
void gx_win32_display_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty);
void gx_win32_driver_thread_entry(ULONG thread_input);
HWND gx_win32_window_create(GX_WIN32_DISPLAY_DRIVER_DATA *gx_driver_ptr, WNDPROC gx_win32_event_process, INT xpos, INT ypos);

View File

@ -615,6 +615,95 @@ int index;
return(0);
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* gx_win32_rotate_canvas_to_bmp_32bpp PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function prepare canvas memory at which do draw operation. */
/* */
/* INPUT */
/* */
/* winHandle Win32 handle */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* win32_canvas_memory_prepare */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static void gx_win32_rotate_canvas_to_bmp_32bpp(GX_CANVAS *canvas)
{
/* First pass, just copy the entire canvas, ignoring the dirty
rectangle. Come back and apply dirty rectangle to improve
efficiency. */
ULONG *pReadStart;
ULONG *pWriteStart;
ULONG *pRead;
ULONG *pWrite;
INT copy_width;
INT copy_height;
INT row;
INT column;
INT write_sign;
/* Copy left-to-right from source canvas
and top-to-bottom in destination bitmap (90 degree rotation)
and bottom-to-top in destination bitmap (270 degree rotation). */
pReadStart = (ULONG *)canvas -> gx_canvas_memory;
pWriteStart = (ULONG *)canvas -> gx_canvas_padded_memory;
copy_width = canvas -> gx_canvas_y_resolution;
copy_height = canvas -> gx_canvas_x_resolution;
if (canvas -> gx_canvas_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
pWriteStart += copy_height - 1;
write_sign = -1;
}
else
{
/* Here for 270 degree rotation. */
pWriteStart += (copy_width - 1) * copy_height;
write_sign = 1;
}
for (row = 0; row < copy_height; row++)
{
pRead = pReadStart;
pWrite = pWriteStart;
for (column = 0; column < copy_width; column++)
{
*pWrite = *pRead++;
pWrite -= copy_height * write_sign;
}
pReadStart += copy_width;
pWriteStart += write_sign;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
@ -649,7 +738,8 @@ int index;
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial version x.x */
/* 12-31-2020 Kenneth Maxwell Initial version 6.1.3 */
/* */
/**************************************************************************/
static void gx_win32_rotate_canvas_to_bmp_16bpp(GX_CANVAS *canvas)
{
@ -708,12 +798,107 @@ INT write_stride;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* gx_win32_rotate_canvas_to_bmp_8bpp PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function prepare canvas memory at which do draw operation. */
/* */
/* INPUT */
/* */
/* winHandle Win32 handle */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* win32_canvas_memory_prepare */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
static void gx_win32_rotate_canvas_to_bmp_8bpp(GX_CANVAS *canvas)
{
/* first pass, just copy the entire canvas, ignoring the dirty
rectangle. Come back and apply dirty rectangle to improve
efficiency.
*/
GX_UBYTE *pReadStart;
GX_UBYTE *pWriteStart;
GX_UBYTE *pRead;
GX_UBYTE *pWrite;
INT copy_width;
INT copy_height;
INT row;
INT column;
INT write_sign;
INT write_stride;
/* copy left-to-right from source canvas
and top-to-bottom in destination bitmap (90 degree rotation)
and bottom-to-top in destination bitmap (270 degree rotation)
*/
pReadStart = (GX_UBYTE *)canvas -> gx_canvas_memory;
pWriteStart = (GX_UBYTE *)canvas -> gx_canvas_padded_memory;
copy_width = canvas -> gx_canvas_y_resolution;
copy_height = canvas -> gx_canvas_x_resolution;
write_stride = (copy_height + 1) & 0xfffc;
if (canvas -> gx_canvas_display -> gx_display_rotation_angle == GX_SCREEN_ROTATION_CW)
{
pWriteStart += copy_height - 1;
write_sign = -1;
}
else
{
/* Here for 270 degree rotation. */
pWriteStart += (copy_width - 1) * write_stride;
write_sign = 1;
}
for (row = 0; row < copy_height; row++)
{
pRead = pReadStart;
pWrite = pWriteStart;
for (column = 0; column < copy_width; column++)
{
*pWrite = *pRead++;
pWrite -= write_stride * write_sign;
}
pReadStart += copy_width;
pWriteStart += write_sign;
}
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _win32_canvas_memory_prepare PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -743,6 +928,10 @@ INT write_stride;
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* added 8bpp and 32bpp canvas */
/* rotate logic, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
VOID *_win32_canvas_memory_prepare(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
@ -797,11 +986,22 @@ INT row;
{
switch (display -> gx_display_color_format)
{
case GX_COLOR_FORMAT_24XRGB:
case GX_COLOR_FORMAT_32ARGB:
gx_win32_rotate_canvas_to_bmp_32bpp(canvas);
memptr = canvas -> gx_canvas_padded_memory;
break;
case GX_COLOR_FORMAT_565RGB:
gx_win32_rotate_canvas_to_bmp_16bpp(canvas);
memptr = canvas -> gx_canvas_padded_memory;
break;
case GX_COLOR_FORMAT_8BIT_PALETTE:
gx_win32_rotate_canvas_to_bmp_8bpp(canvas);
memptr = canvas -> gx_canvas_padded_memory;
break;
default:
return canvas -> gx_canvas_memory;
}
@ -815,7 +1015,7 @@ INT row;
/* FUNCTION RELEASE */
/* */
/* gx_win32_display_buffer_toggle PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -851,6 +1051,9 @@ INT row;
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* fixed logic, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
VOID gx_win32_display_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
@ -894,6 +1097,9 @@ VOID *memptr;
{
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);
win_device = GetDC(driver_instance -> win32_driver_winhandle);
@ -908,8 +1114,8 @@ VOID *memptr;
Height = Copy.gx_rectangle_bottom - Copy.gx_rectangle_top + 1;
StretchDIBits(win_device, Left, Top, Width, Height,
Copy.gx_rectangle_left,
Copy.gx_rectangle_top + Height + 1,
xsrc,
ysrc + Height + 1,
Width, -Height, memptr,
(BITMAPINFO *)&(driver_instance -> win32_driver_bmpinfo),
DIB_RGB_COLORS,

View File

@ -31,7 +31,7 @@
/* FUNCTION RELEASE */
/* */
/* win32_24xrgb_bitmap_header_create PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -61,9 +61,12 @@
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* Renamed function, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static void win32_24xrgb_bitmap_header_create(GX_DISPLAY *display)
VOID win32_32bpp_bitmap_header_create(GX_DISPLAY *display)
{
GX_WIN32_DISPLAY_DRIVER_DATA *instance;
DWORD *putmask;
@ -93,7 +96,7 @@ DWORD *putmask;
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_setup_24xrgb PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -126,6 +129,9 @@ DWORD *putmask;
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* Updated function name, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display)
@ -156,7 +162,7 @@ GX_WIN32_DISPLAY_DRIVER_DATA *data;
GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-24xrgb");
/* Create bitmap header for 24xrgb display driver. */
win32_24xrgb_bitmap_header_create(display);
win32_32bpp_bitmap_header_create(display);
return(GX_SUCCESS);
}

View File

@ -0,0 +1,103 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Win32 Display Management (Display) */
/** */
/**************************************************************************/
#ifdef WIN32
#include "tx_api.h"
#include "gx_api.h"
#include "gx_system.h"
#include "gx_display.h"
#include "windows.h"
#include "gx_win32_display_driver.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_setup_24xrgb_rotated PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function creates a Windows specific 24xrgb rotated display */
/* driver. */
/* */
/* INPUT */
/* */
/* display Pointer to GX_DISPLAY */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_display_driver_24xrgb_setup guix display setup funciton. */
/* win32_24xrgb_bitmap_header_create Create bitmap header info */
/* gx_win32_get_free_data_instance Get display data instance */
/* GX_WIN32_EVENT_THREAD_CREATE Create event thread */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
UINT win32_graphics_driver_setup_24xrgb_rotated(GX_DISPLAY* display)
{
GX_WIN32_DISPLAY_DRIVER_DATA* data;
/* Initialize the low-level drawing function pointers.
For windows, these are always just the generic funcions,
but for some hardware, these will be customized,
optimized functions specific to that hardware. */
data = gx_win32_get_free_data_instance();
if (!data)
{
/* We don't have any free display data instance. */
return(GX_FAILURE);
}
/* Save off the format of display driver. */
data->win32_driver_type = GX_COLOR_FORMAT_24XRGB;
_gx_display_driver_24xrgb_rotated_setup(display, data, gx_win32_display_buffer_toggle);
/* Create the GUIX / Windows event thread
This thread is a substitute for a touch screen
or keyboard driver thread that would be running
on embedded hardware. */
GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-24xrgb");
/* Create bitmap header for 24xrgb display driver. */
win32_32bpp_bitmap_header_create(display);
return(GX_SUCCESS);
}
#endif /* WIN32 */

View File

@ -26,74 +26,12 @@
#include "gx_display.h"
#include "gx_win32_display_driver.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_32argb_bitmap_header_create PORTABLE C */
/* 6.1.3 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function creates bitmap header for 32argb driver. */
/* */
/* INPUT */
/* */
/* display Pointer to GX_DISPLAY */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* win32_graphics_driver_setup_32argb */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* */
/**************************************************************************/
static void win32_32argb_bitmap_header_create(GX_DISPLAY *display)
{
GX_WIN32_DISPLAY_DRIVER_DATA *instance;
DWORD *putmask;
instance = (GX_WIN32_DISPLAY_DRIVER_DATA *)display -> gx_display_driver_data;
instance -> win32_driver_bmpinfo.gx_bmp_header.biSize = sizeof(BITMAPINFOHEADER);
instance -> win32_driver_bmpinfo.gx_bmp_header.biWidth = display -> gx_display_width;
instance -> win32_driver_bmpinfo.gx_bmp_header.biHeight = display -> gx_display_height;
instance -> win32_driver_bmpinfo.gx_bmp_header.biPlanes = 1;
instance -> win32_driver_bmpinfo.gx_bmp_header.biBitCount = 32;
instance -> win32_driver_bmpinfo.gx_bmp_header.biSizeImage = display -> gx_display_width * display -> gx_display_height * 4;
instance -> win32_driver_bmpinfo.gx_bmp_header.biClrUsed = 16777215;
instance -> win32_driver_bmpinfo.gx_bmp_header.biClrImportant = 16777215;
instance -> win32_driver_bmpinfo.gx_bmp_header.biCompression = BI_BITFIELDS;
putmask = (DWORD *)&(instance -> win32_driver_bmpinfo.gx_bmp_colors[0]);
*putmask++ = 0x00ff0000;
*putmask++ = 0x0000ff00;
*putmask = 0x000000ff;
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_setup_32argb PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -113,7 +51,7 @@ DWORD *putmask;
/* CALLS */
/* */
/* _gx_display_driver_32argb_setup guix display setup funciton. */
/* win32_32argb_bitmap_header_create Create bitmap header info */
/* win32_32bpp_bitmap_header_create Create bitmap header info */
/* gx_win32_get_free_data_instance Get display data instance */
/* GX_WIN32_EVENT_THREAD_CREATE Create event thread */
/* */
@ -126,6 +64,10 @@ DWORD *putmask;
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* Updated bitmap header */
/* create function call, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
UINT win32_graphics_driver_setup_32argb(GX_DISPLAY *display)
@ -156,57 +98,8 @@ GX_WIN32_DISPLAY_DRIVER_DATA *data;
GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-32argb");
/* Create bitmap header for 32argb display driver. */
win32_32argb_bitmap_header_create(display);
win32_32bpp_bitmap_header_create(display);
return(GX_SUCCESS);
}
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_cleanup_32argb PORTABLE C */
/* 6.1.3 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function do cleanup operation for specific 32argb display */
/* driver. */
/* */
/* INPUT */
/* */
/* display Pointer to GX_DISPLAY */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* guix_studio_delete_display */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* */
/**************************************************************************/
VOID win32_graphics_driver_cleanup_32argb(GX_DISPLAY *display)
{
GX_WIN32_DISPLAY_DRIVER_DATA *instance;
instance = (GX_WIN32_DISPLAY_DRIVER_DATA *)display -> gx_display_driver_data;
/* mark this instance as not used: */
instance -> win32_driver_type = 0;
}
#endif /* WIN32 */

View File

@ -0,0 +1,103 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Win32 Display Management (Display) */
/** */
/**************************************************************************/
#ifdef WIN32
#include "windows.h"
#include "tx_api.h"
#include "gx_api.h"
#include "gx_system.h"
#include "gx_display.h"
#include "gx_win32_display_driver.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_setup_32argb_rotated PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function creates a Windows specific 32argb display driver. */
/* */
/* INPUT */
/* */
/* display Pointer to GX_DISPLAY */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_display_driver_32argb_rotated_setup */
/* guix display setup funciton. */
/* win32_32bpp_bitmap_header_create Create bitmap header info */
/* gx_win32_get_free_data_instance Get display data instance */
/* GX_WIN32_EVENT_THREAD_CREATE Create event thread */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
UINT win32_graphics_driver_setup_32argb_rotated(GX_DISPLAY *display)
{
GX_WIN32_DISPLAY_DRIVER_DATA *data;
/* Initialize the low-level drawing function pointers.
For windows, these are always just the generic funcions,
but for some hardware, these will be customized,
optimized functions specific to that hardware. */
data = gx_win32_get_free_data_instance();
if (!data)
{
/* We don't have any free display data instance. */
return(GX_FAILURE);
}
/* Save off the format of display driver*/
data -> win32_driver_type = GX_COLOR_FORMAT_32ARGB;
_gx_display_driver_32argb_rotated_setup(display, data, gx_win32_display_buffer_toggle);
/* Create the GUIX / Windows event thread
This thread is a substitute for a touch screen
or keyboard driver thread that would be running
on embedded hardware. */
GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-32argb");
/* Create bitmap header for 32argb display driver. */
win32_32bpp_bitmap_header_create(display);
return(GX_SUCCESS);
}
#endif /* WIN32 */

View File

@ -31,7 +31,7 @@
/* FUNCTION RELEASE */
/* */
/* win32_display_driver_8bit_palette_set PORTABLE C */
/* 6.1.3 */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
@ -63,9 +63,12 @@
/* DATE NAME DESCRIPTION */
/* */
/* 12-31-2020 Kenneth Maxwell Initial Version 6.1.3 */
/* 02-02-2021 Kenneth Maxwell Modified comment(s), */
/* made the function public, */
/* resulting in version 6.1.4 */
/* */
/**************************************************************************/
static VOID win32_display_driver_8bit_palette_set(GX_DISPLAY *display, GX_COLOR *palette, INT count)
VOID win32_display_driver_8bit_palette_set(GX_DISPLAY *display, GX_COLOR *palette, INT count)
{
GX_COLOR color;
int loop;

View File

@ -0,0 +1,107 @@
/**************************************************************************/
/* */
/* 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 */
/** */
/** Win32 Display Management (Display) */
/** */
/**************************************************************************/
#ifdef WIN32
#include "tx_api.h"
#include "gx_api.h"
#include "gx_system.h"
#include "gx_display.h"
#include "windows.h"
#include "gx_win32_display_driver.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* win32_graphics_driver_setup_8bit_palette_rotated PORTABLE C */
/* 6.1.4 */
/* AUTHOR */
/* */
/* Kenneth Maxwell, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function creates a Windows specific 8bpp display driver. */
/* */
/* INPUT */
/* */
/* display Pointer to GX_DISPLAY */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* _gx_display_driver_8bit_palette_setup guix display setup funciton. */
/* win32_8bit_palette_bitmap_header_create */
/* Create bitmap header info */
/* gx_win32_get_free_data_instance Get display data instance */
/* [gx_display_driver_palette_set] Set palette table for 8bpp */
/* GX_WIN32_EVENT_THREAD_CREATE Create event thread */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 02-02-2021 Kenneth Maxwell Initial Version 6.1.4 */
/* */
/**************************************************************************/
UINT win32_graphics_driver_setup_8bit_palette_rotated(GX_DISPLAY* display)
{
GX_WIN32_DISPLAY_DRIVER_DATA* data;
/* Initialize the low-level drawing function pointers.
For windows, these are always just the generic funcions,
but for some hardware, these will be customized,
optimized functions specific to that hardware. */
data = gx_win32_get_free_data_instance();
if (!data)
{
/* We don't have any free display data instance. */
return(GX_FAILURE);
}
/* Save off the format of display driver. */
data->win32_driver_type = GX_COLOR_FORMAT_8BIT_PALETTE;
_gx_display_driver_8bit_palette_rotated_setup(display, data, gx_win32_display_buffer_toggle);
display->gx_display_driver_palette_set = win32_display_driver_8bit_palette_set;
/* Create the GUIX / Windows event thread
This thread is a substitute for a touch display
or keyboard driver thread that would be running
on embedded hardware. */
GX_WIN32_EVENT_THREAD_CREATE(data, "GUI-WIN32-8bit-palette");
/* Create bitmap header for 8bit palette driver. */
win32_8bit_palette_bitmap_header_create(display);
return(GX_SUCCESS);
}
#endif /* WIN32 */

View File

@ -1,112 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\demo_guix_calculator.c" />
<ClCompile Include="..\..\evaluate.c" />
<ClCompile Include="..\..\guix_calculator_resources.c" />
<ClCompile Include="..\..\guix_calculator_specifications.c" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\guix_calculator_resources.h" />
<ClInclude Include="..\..\guix_calculator_specifications.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\ports\win32\build\vs_2019\guix.vcxproj">
<Project>{a3336f4f-7a7b-46d3-a7f0-a2aaed6c08ed}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E7A54E57-6B8C-4417-B587-1F461D9A3562}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>smart_watch</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\..\common\inc;..\..\..\..\ports\win32\inc;..\..\..\..\ports\win32\lib\vs_2019</AdditionalIncludeDirectories>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration);$(SolutionDir)/../../../../ports/win32/lib/vs_2019</AdditionalLibraryDirectories>
<AdditionalDependencies>gx.lib;tx.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\..\common\inc;..\..\..\..\ports\win32\inc;..\..\..\..\ports\win32\lib\vs_2019</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration);$(SolutionDir)/../../../../ports/win32/lib/vs_2019</AdditionalLibraryDirectories>
<AdditionalDependencies>gx.lib;tx.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\demo_guix_calculator.c" />
<ClCompile Include="..\..\evaluate.c" />
<ClCompile Include="..\..\guix_calculator_resources.c" />
<ClCompile Include="..\..\guix_calculator_specifications.c" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\guix_calculator_resources.h" />
<ClInclude Include="..\..\guix_calculator_specifications.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\ports\win32\build\vs_2019\guix.vcxproj">
<Project>{a3336f4f-7a7b-46d3-a7f0-a2aaed6c08ed}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E7A54E57-6B8C-4417-B587-1F461D9A3562}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>smart_watch</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\..\common\inc;..\..\..\..\ports\win32\inc;..\..\..\..\ports\win32\lib\vs_2019</AdditionalIncludeDirectories>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration);$(SolutionDir)/../../../../ports/win32/lib/vs_2019</AdditionalLibraryDirectories>
<AdditionalDependencies>gx.lib;tx.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\..\common\inc;..\..\..\..\ports\win32\inc;..\..\..\..\ports\win32\lib\vs_2019</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)/../../../../ports/win32/build/vs_2019/$(Configuration);$(SolutionDir)/../../../../ports/win32/lib/vs_2019</AdditionalLibraryDirectories>
<AdditionalDependencies>gx.lib;tx.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -33,8 +33,6 @@ extern GX_SCROLLBAR_APPEARANCE Window_Screen_Vertical_Scroll_properties;
void ToggleScreen(GX_WINDOW *new_win, GX_WINDOW *old_win);
UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length);
TX_THREAD demo_thread;
UCHAR demo_thread_stack[4096];
TX_BYTE_POOL rotate_pool;
GX_WINDOW_ROOT *root;
GX_SCROLLBAR list_scroll;