/* -------------------------------------------------------------------------------- */
/* -- µGUI - Generic GUI module (C)Achim Döbler, 2015                            -- */
/* -------------------------------------------------------------------------------- */
// µGUI is a generic GUI module for embedded systems.
// This is a free software that is open for education, research and commercial
// developments under license policy of following terms.
//
//  Copyright (C) 2015, Achim Döbler, all rights reserved.
//  URL: http://www.embeddedlightning.com/
//
// * The µGUI module is a free software and there is NO WARRANTY.
// * No restriction on use. You can use, modify and redistribute it for
//   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
// * Redistributions of source code must retain the above copyright notice.
//
/* -------------------------------------------------------------------------------- */
#ifndef __UGUI_H
#define __UGUI_H

#include "ugui_config.h"
#if _UGUI_ENABLE

/* -------------------------------------------------------------------------------- */
/* -- µGUI FONTS                                                                 -- */
/* -- Source: http://www.mikrocontroller.net/user/show/benedikt                  -- */
/* -------------------------------------------------------------------------------- */
typedef enum
{
    FONT_TYPE_1BPP,
    FONT_TYPE_8BPP
} FONT_TYPE;

typedef struct
{
    unsigned char* p;
    FONT_TYPE      font_type;
    UG_S16         char_width;
    UG_S16         char_height;
    UG_U16         start_char;
    UG_U16         end_char;
    UG_U8*         widths;
} UG_FONT;

#ifdef USE_FONT_4X6
extern const UG_FONT FONT_4X6;
#endif
#ifdef USE_FONT_5X8
extern const UG_FONT FONT_5X8;
#endif
#ifdef USE_FONT_5X12
extern const UG_FONT FONT_5X12;
#endif
#ifdef USE_FONT_6X8
extern const UG_FONT FONT_6X8;
#endif
#ifdef USE_FONT_6X10
extern const UG_FONT FONT_6X10;
#endif
#ifdef USE_FONT_7X12
extern const UG_FONT FONT_7X12;
#endif
#ifdef USE_FONT_8X8
extern const UG_FONT FONT_8X8;
#endif
#ifdef USE_FONT_8X12
extern const UG_FONT FONT_8X12;
#endif
#ifdef USE_FONT_8X12_CYRILLIC
extern const UG_FONT FONT_8X12;
#endif
#ifdef USE_FONT_8X14
extern const UG_FONT FONT_8X14;
#endif
#ifdef USE_FONT_10X16
extern const UG_FONT FONT_10X16;
#endif
#ifdef USE_FONT_12X16
extern const UG_FONT FONT_12X16;
#endif
#ifdef USE_FONT_12X20
extern const UG_FONT FONT_12X20;
#endif
#ifdef USE_FONT_16X26
extern const UG_FONT FONT_16X26;
#endif
#ifdef USE_FONT_22X36
extern const UG_FONT FONT_22X36;
#endif
#ifdef USE_FONT_24X40
extern const UG_FONT FONT_24X40;
#endif
#ifdef USE_FONT_32X53
extern const UG_FONT FONT_32X53;
#endif
#if _GUI_FONT == 3
extern UG_FONT bGUI_XBF_Font;
#endif
/* -------------------------------------------------------------------------------- */
/* -- TYPEDEFS                                                                   -- */
/* -------------------------------------------------------------------------------- */
typedef struct S_OBJECT UG_OBJECT;
typedef struct S_WINDOW UG_WINDOW;
typedef UG_S8           UG_RESULT;
#ifdef USE_COLOR_RGB888
typedef UG_U32 UG_COLOR;
#endif
#ifdef USE_COLOR_RGB565
typedef UG_U16 UG_COLOR;
#endif
/* -------------------------------------------------------------------------------- */
/* -- DEFINES                                                                    -- */
/* -------------------------------------------------------------------------------- */
#ifndef NULL
#define NULL ((void*)0)
#endif

/* Alignments */
#define ALIGN_H_LEFT (1 << 0)
#define ALIGN_H_CENTER (1 << 1)
#define ALIGN_H_RIGHT (1 << 2)
#define ALIGN_V_TOP (1 << 3)
#define ALIGN_V_CENTER (1 << 4)
#define ALIGN_V_BOTTOM (1 << 5)
#define ALIGN_BOTTOM_RIGHT (ALIGN_V_BOTTOM | ALIGN_H_RIGHT)
#define ALIGN_BOTTOM_CENTER (ALIGN_V_BOTTOM | ALIGN_H_CENTER)
#define ALIGN_BOTTOM_LEFT (ALIGN_V_BOTTOM | ALIGN_H_LEFT)
#define ALIGN_CENTER_RIGHT (ALIGN_V_CENTER | ALIGN_H_RIGHT)
#define ALIGN_CENTER (ALIGN_V_CENTER | ALIGN_H_CENTER)
#define ALIGN_CENTER_LEFT (ALIGN_V_CENTER | ALIGN_H_LEFT)
#define ALIGN_TOP_RIGHT (ALIGN_V_TOP | ALIGN_H_RIGHT)
#define ALIGN_TOP_CENTER (ALIGN_V_TOP | ALIGN_H_CENTER)
#define ALIGN_TOP_LEFT (ALIGN_V_TOP | ALIGN_H_LEFT)

/* Default IDs */
#define OBJ_ID_0 0
#define OBJ_ID_1 1
#define OBJ_ID_2 2
#define OBJ_ID_3 3
#define OBJ_ID_4 4
#define OBJ_ID_5 5
#define OBJ_ID_6 6
#define OBJ_ID_7 7
#define OBJ_ID_8 8
#define OBJ_ID_9 9
#define OBJ_ID_10 10
#define OBJ_ID_11 11
#define OBJ_ID_12 12
#define OBJ_ID_13 13
#define OBJ_ID_14 14
#define OBJ_ID_15 15
#define OBJ_ID_16 16
#define OBJ_ID_17 17
#define OBJ_ID_18 18
#define OBJ_ID_19 19

/* -------------------------------------------------------------------------------- */
/* -- FUNCTION RESULTS                                                           -- */
/* -------------------------------------------------------------------------------- */
#define UG_RESULT_FAIL -1
#define UG_RESULT_OK 0

/* -------------------------------------------------------------------------------- */
/* -- UNIVERSAL STRUCTURES                                                       -- */
/* -------------------------------------------------------------------------------- */
/* Area structure */
typedef struct
{
    UG_S16 xs;
    UG_S16 ys;
    UG_S16 xe;
    UG_S16 ye;
} UG_AREA;

/* Text structure */
typedef struct
{
    char*          str;
    const UG_FONT* font;
    UG_AREA        a;
    UG_COLOR       fc;
    UG_COLOR       bc;
    UG_U8          align;
    UG_S16         h_space;
    UG_S16         v_space;
} UG_TEXT;

/* -------------------------------------------------------------------------------- */
/* -- BITMAP                                                                     -- */
/* -------------------------------------------------------------------------------- */
typedef struct
{
    void*  p;
    UG_U16 width;
    UG_U16 height;
    UG_U8  bpp;
    UG_U8  colors;
} UG_BMP;

#define BMP_BPP_1 (1 << 0)
#define BMP_BPP_2 (1 << 1)
#define BMP_BPP_4 (1 << 2)
#define BMP_BPP_8 (1 << 3)
#define BMP_BPP_16 (1 << 4)
#define BMP_BPP_32 (1 << 5)
#define BMP_RGB888 (1 << 0)
#define BMP_RGB565 (1 << 1)
#define BMP_RGB555 (1 << 2)

/* -------------------------------------------------------------------------------- */
/* -- MESSAGE                                                                    -- */
/* -------------------------------------------------------------------------------- */
/* Message structure */
typedef struct
{
    UG_U8 type;
    UG_U8 id;
    UG_U8 sub_id;
    UG_U8 event;
    void* src;
} UG_MESSAGE;

/* Message types */
#define MSG_TYPE_NONE 0
#define MSG_TYPE_WINDOW 1
#define MSG_TYPE_OBJECT 2

/* -------------------------------------------------------------------------------- */
/* -- TOUCH                                                                      -- */
/* -------------------------------------------------------------------------------- */
/* Touch structure */
typedef struct
{
    UG_U8  state;
    UG_S16 xp;
    UG_S16 yp;
} UG_TOUCH;

#define TOUCH_STATE_PRESSED 1
#define TOUCH_STATE_RELEASED 0

/* -------------------------------------------------------------------------------- */
/* -- OBJECTS                                                                    -- */
/* -------------------------------------------------------------------------------- */
/* Object structure */
struct S_OBJECT
{
    UG_U8 state;                            /* object state                               */
    UG_U8 touch_state;                      /* object touch state                         */
    void (*update)(UG_WINDOW*, UG_OBJECT*); /* pointer to object-specific update function */
    UG_AREA a_abs;                          /* absolute area of the object                */
    UG_AREA a_rel;                          /* relative area of the object                */
    UG_U8   type;                           /* object type                                */
    UG_U8   id;                             /* object ID                                  */
    UG_U8   event;                          /* object-specific events                     */
    void*   data;                           /* pointer to object-specific data            */
};

/* Currently supported objects */
#define OBJ_TYPE_NONE 0
#define OBJ_TYPE_BUTTON 1
#define OBJ_TYPE_TEXTBOX 2
#define OBJ_TYPE_IMAGE 3
#define OBJ_TYPE_CHECKBOX 4

/* Standard object events */
#define OBJ_EVENT_NONE 0
#define OBJ_EVENT_CLICKED 1
#ifdef USE_PRERENDER_EVENT
#define OBJ_EVENT_PRERENDER 2
#endif
#ifdef USE_POSTRENDER_EVENT
#define OBJ_EVENT_POSTRENDER 3
#endif
#define OBJ_EVENT_PRESSED 4
#define OBJ_EVENT_RELEASED 5

/* Object states */
#define OBJ_STATE_FREE (1 << 0)
#define OBJ_STATE_VALID (1 << 1)
#define OBJ_STATE_BUSY (1 << 2)
#define OBJ_STATE_VISIBLE (1 << 3)
#define OBJ_STATE_ENABLE (1 << 4)
#define OBJ_STATE_UPDATE (1 << 5)
#define OBJ_STATE_REDRAW (1 << 6)
#define OBJ_STATE_TOUCH_ENABLE (1 << 7)
#define OBJ_STATE_INIT (OBJ_STATE_FREE | OBJ_STATE_VALID)

/* Object touch states */
#define OBJ_TOUCH_STATE_CHANGED (1 << 0)
#define OBJ_TOUCH_STATE_PRESSED_ON_OBJECT (1 << 1)
#define OBJ_TOUCH_STATE_PRESSED_OUTSIDE_OBJECT (1 << 2)
#define OBJ_TOUCH_STATE_RELEASED_ON_OBJECT (1 << 3)
#define OBJ_TOUCH_STATE_RELEASED_OUTSIDE_OBJECT (1 << 4)
#define OBJ_TOUCH_STATE_IS_PRESSED_ON_OBJECT (1 << 5)
#define OBJ_TOUCH_STATE_IS_PRESSED (1 << 6)
#define OBJ_TOUCH_STATE_CLICK_ON_OBJECT (1 << 7)
#define OBJ_TOUCH_STATE_INIT 0

/* -------------------------------------------------------------------------------- */
/* -- WINDOW                                                                     -- */
/* -------------------------------------------------------------------------------- */
/* Title structure */
typedef struct
{
    char*          str;
    const UG_FONT* font;
    UG_S8          h_space;
    UG_S8          v_space;
    UG_U8          align;
    UG_COLOR       fc;
    UG_COLOR       bc;
    UG_COLOR       ifc;
    UG_COLOR       ibc;
    UG_U8          height;
} UG_TITLE;

/* Window structure */
struct S_WINDOW
{
    UG_U8      objcnt;
    UG_OBJECT* objlst;
    UG_U8      state;
    UG_COLOR   fc;
    UG_COLOR   bc;
    UG_S16     xs;
    UG_S16     ys;
    UG_S16     xe;
    UG_S16     ye;
    UG_U8      style;
    UG_TITLE   title;
    void (*cb)(UG_MESSAGE*);
};

/* Window states */
#define WND_STATE_FREE (1 << 0)
#define WND_STATE_VALID (1 << 1)
#define WND_STATE_BUSY (1 << 2)
#define WND_STATE_VISIBLE (1 << 3)
#define WND_STATE_ENABLE (1 << 4)
#define WND_STATE_UPDATE (1 << 5)
#define WND_STATE_REDRAW_TITLE (1 << 6)

/* Window styles */
#define WND_STYLE_2D (0 << 0)
#define WND_STYLE_3D (1 << 0)
#define WND_STYLE_HIDE_TITLE (0 << 1)
#define WND_STYLE_SHOW_TITLE (1 << 1)

/* -------------------------------------------------------------------------------- */
/* -- BUTTON OBJECT                                                              -- */
/* -------------------------------------------------------------------------------- */
/* Button structure */
typedef struct
{
    UG_U8          state;
    UG_U8          style;
    UG_COLOR       fc;
    UG_COLOR       bc;
    UG_COLOR       afc;
    UG_COLOR       abc;
    const UG_FONT* font;
    UG_U8          align;
    UG_S8          h_space;
    UG_S8          v_space;
    char*          str;
} UG_BUTTON;

/* Default button IDs */
#define BTN_ID_0 OBJ_ID_0
#define BTN_ID_1 OBJ_ID_1
#define BTN_ID_2 OBJ_ID_2
#define BTN_ID_3 OBJ_ID_3
#define BTN_ID_4 OBJ_ID_4
#define BTN_ID_5 OBJ_ID_5
#define BTN_ID_6 OBJ_ID_6
#define BTN_ID_7 OBJ_ID_7
#define BTN_ID_8 OBJ_ID_8
#define BTN_ID_9 OBJ_ID_9
#define BTN_ID_10 OBJ_ID_10
#define BTN_ID_11 OBJ_ID_11
#define BTN_ID_12 OBJ_ID_12
#define BTN_ID_13 OBJ_ID_13
#define BTN_ID_14 OBJ_ID_14
#define BTN_ID_15 OBJ_ID_15
#define BTN_ID_16 OBJ_ID_16
#define BTN_ID_17 OBJ_ID_17
#define BTN_ID_18 OBJ_ID_18
#define BTN_ID_19 OBJ_ID_19

/* Button states */
#define BTN_STATE_RELEASED (0 << 0)
#define BTN_STATE_PRESSED (1 << 0)
#define BTN_STATE_ALWAYS_REDRAW (1 << 1)

/* Button style */
#define BTN_STYLE_2D (0 << 0)
#define BTN_STYLE_3D (1 << 0)
#define BTN_STYLE_TOGGLE_COLORS (1 << 1)
#define BTN_STYLE_USE_ALTERNATE_COLORS (1 << 2)
#define BTN_STYLE_NO_BORDERS (1 << 3)
#define BTN_STYLE_NO_FILL (1 << 4)

/* Button events */
#define BTN_EVENT_CLICKED OBJ_EVENT_CLICKED

/* -------------------------------------------------------------------------------- */
/* -- CHECKBOX OBJECT                                                            -- */
/* -------------------------------------------------------------------------------- */
/* Checkbox structure */
typedef struct
{
    UG_U8          state;
    UG_U8          style;
    UG_COLOR       fc;
    UG_COLOR       bc;
    UG_COLOR       afc;
    UG_COLOR       abc;
    const UG_FONT* font;
    UG_U8          align;
    UG_S8          h_space;
    UG_S8          v_space;
    char*          str;
    UG_U8          checked;
} UG_CHECKBOX;

/* Default checkbox IDs */
#define CHB_ID_0 OBJ_ID_0
#define CHB_ID_1 OBJ_ID_1
#define CHB_ID_2 OBJ_ID_2
#define CHB_ID_3 OBJ_ID_3
#define CHB_ID_4 OBJ_ID_4
#define CHB_ID_5 OBJ_ID_5
#define CHB_ID_6 OBJ_ID_6
#define CHB_ID_7 OBJ_ID_7
#define CHB_ID_8 OBJ_ID_8
#define CHB_ID_9 OBJ_ID_9
#define CHB_ID_10 OBJ_ID_10
#define CHB_ID_11 OBJ_ID_11
#define CHB_ID_12 OBJ_ID_12
#define CHB_ID_13 OBJ_ID_13
#define CHB_ID_14 OBJ_ID_14
#define CHB_ID_15 OBJ_ID_15
#define CHB_ID_16 OBJ_ID_16
#define CHB_ID_17 OBJ_ID_17
#define CHB_ID_18 OBJ_ID_18
#define CHB_ID_19 OBJ_ID_19

/* Checkbox states */
#define CHB_STATE_RELEASED (0 << 0)
#define CHB_STATE_PRESSED (1 << 0)
#define CHB_STATE_ALWAYS_REDRAW (1 << 1)

/* Checkbox style */
#define CHB_STYLE_2D (0 << 0)
#define CHB_STYLE_3D (1 << 0)
#define CHB_STYLE_TOGGLE_COLORS (1 << 1)
#define CHB_STYLE_USE_ALTERNATE_COLORS (1 << 2)
#define CHB_STYLE_NO_BORDERS (1 << 3)
#define CHB_STYLE_NO_FILL (1 << 4)

/* Checkbox events */
#define CHB_EVENT_CLICKED OBJ_EVENT_CLICKED

/* -------------------------------------------------------------------------------- */
/* -- TEXTBOX OBJECT                                                             -- */
/* -------------------------------------------------------------------------------- */
/* Textbox structure */
typedef struct
{
    char*          str;
    const UG_FONT* font;
    UG_U8          style;
    UG_COLOR       fc;
    UG_COLOR       bc;
    UG_U8          align;
    UG_S8          h_space;
    UG_S8          v_space;
} UG_TEXTBOX;

/* Default textbox IDs */
#define TXB_ID_0 OBJ_ID_0
#define TXB_ID_1 OBJ_ID_1
#define TXB_ID_2 OBJ_ID_2
#define TXB_ID_3 OBJ_ID_3
#define TXB_ID_4 OBJ_ID_4
#define TXB_ID_5 OBJ_ID_5
#define TXB_ID_6 OBJ_ID_6
#define TXB_ID_7 OBJ_ID_7
#define TXB_ID_8 OBJ_ID_8
#define TXB_ID_9 OBJ_ID_9
#define TXB_ID_10 OBJ_ID_10
#define TXB_ID_11 OBJ_ID_11
#define TXB_ID_12 OBJ_ID_12
#define TXB_ID_13 OBJ_ID_13
#define TXB_ID_14 OBJ_ID_14
#define TXB_ID_15 OBJ_ID_15
#define TXB_ID_16 OBJ_ID_16
#define TXB_ID_17 OBJ_ID_17
#define TXB_ID_18 OBJ_ID_18
#define TXB_ID_19 OBJ_ID_19

/* -------------------------------------------------------------------------------- */
/* -- IMAGE OBJECT                                                               -- */
/* -------------------------------------------------------------------------------- */
/* Image structure */
typedef struct
{
    void* img;
    UG_U8 type;
} UG_IMAGE;

/* Default image IDs */
#define IMG_ID_0 OBJ_ID_0
#define IMG_ID_1 OBJ_ID_1
#define IMG_ID_2 OBJ_ID_2
#define IMG_ID_3 OBJ_ID_3
#define IMG_ID_4 OBJ_ID_4
#define IMG_ID_5 OBJ_ID_5
#define IMG_ID_6 OBJ_ID_6
#define IMG_ID_7 OBJ_ID_7
#define IMG_ID_8 OBJ_ID_8
#define IMG_ID_9 OBJ_ID_9
#define IMG_ID_10 OBJ_ID_10
#define IMG_ID_11 OBJ_ID_11
#define IMG_ID_12 OBJ_ID_12
#define IMG_ID_13 OBJ_ID_13
#define IMG_ID_14 OBJ_ID_14
#define IMG_ID_15 OBJ_ID_15
#define IMG_ID_16 OBJ_ID_16
#define IMG_ID_17 OBJ_ID_17
#define IMG_ID_18 OBJ_ID_18
#define IMG_ID_19 OBJ_ID_19

/* Image types */
#define IMG_TYPE_BMP (1 << 0)

/* -------------------------------------------------------------------------------- */
/* -- µGUI DRIVER                                                                -- */
/* -------------------------------------------------------------------------------- */
typedef struct
{
    void* driver;
    UG_U8 state;
} UG_DRIVER;

#define DRIVER_REGISTERED (1 << 0)
#define DRIVER_ENABLED (1 << 1)

/* Supported drivers */
#define NUMBER_OF_DRIVERS 3
#define DRIVER_DRAW_LINE 0
#define DRIVER_FILL_FRAME 1
#define DRIVER_FILL_AREA 2

/* -------------------------------------------------------------------------------- */
/* -- µGUI CORE STRUCTURE                                                        -- */
/* -------------------------------------------------------------------------------- */
typedef struct
{
    void (*pset)(UG_S16, UG_S16, UG_COLOR);
    UG_S16     x_dim;
    UG_S16     y_dim;
    UG_TOUCH   touch;
    UG_WINDOW* next_window;
    UG_WINDOW* active_window;
    UG_WINDOW* last_window;
    struct
    {
        UG_S16   x_pos;
        UG_S16   y_pos;
        UG_S16   x_start;
        UG_S16   y_start;
        UG_S16   x_end;
        UG_S16   y_end;
        UG_COLOR fore_color;
        UG_COLOR back_color;
    } console;
    UG_FONT   font;
    UG_S8     char_h_space;
    UG_S8     char_v_space;
    UG_COLOR  fore_color;
    UG_COLOR  back_color;
    UG_COLOR  desktop_color;
    UG_U8     state;
    UG_DRIVER driver[NUMBER_OF_DRIVERS];
} UG_GUI;

#define UG_SATUS_WAIT_FOR_UPDATE (1 << 0)

/* -------------------------------------------------------------------------------- */
/* -- µGUI COLORS                                                                -- */
/* -- Source: http://www.rapidtables.com/web/color/RGB_Color.htm                 -- */
/* -------------------------------------------------------------------------------- */
#ifdef USE_COLOR_RGB565
#define C_MAROON 0x8000
#define C_DARK_RED 0x8800
#define C_BROWN 0xA145
#define C_FIREBRICK 0xB104
#define C_CRIMSON 0xD8A7
#define C_RED 0xF800
#define C_TOMATO 0xFB09
#define C_CORAL 0xFBEA
#define C_INDIAN_RED 0xCAEB
#define C_LIGHT_CORAL 0xEC10
#define C_DARK_SALMON 0xE4AF
#define C_SALMON 0xF40E
#define C_LIGHT_SALMON 0xFD0F
#define C_ORANGE_RED 0xFA20
#define C_DARK_ORANGE 0xFC60
#define C_ORANGE 0xFD20
#define C_GOLD 0xFEA0
#define C_DARK_GOLDEN_ROD 0xB421
#define C_GOLDEN_ROD 0xDD24
#define C_PALE_GOLDEN_ROD 0xEF35
#define C_DARK_KHAKI 0xBDAD
#define C_KHAKI 0xEF31
#define C_OLIVE 0x8400
#define C_YELLOW 0xFFE0
#define C_YELLOW_GREEN 0x9E66
#define C_DARK_OLIVE_GREEN 0x5346
#define C_OLIVE_DRAB 0x6C64
#define C_LAWN_GREEN 0x7FC0
#define C_CHART_REUSE 0x7FE0
#define C_GREEN_YELLOW 0xAFE6
#define C_DARK_GREEN 0x0320
#define C_GREEN 0x07E0
#define C_FOREST_GREEN 0x2444
#define C_LIME 0x07E0
#define C_LIME_GREEN 0x3666
#define C_LIGHT_GREEN 0x9772
#define C_PALE_GREEN 0x97D2
#define C_DARK_SEA_GREEN 0x8DD1
#define C_MEDIUM_SPRING_GREEN 0x07D3
#define C_SPRING_GREEN 0x07EF
#define C_SEA_GREEN 0x344B
#define C_MEDIUM_AQUA_MARINE 0x6675
#define C_MEDIUM_SEA_GREEN 0x3D8E
#define C_LIGHT_SEA_GREEN 0x2595
#define C_DARK_SLATE_GRAY 0x328A
#define C_TEAL 0x0410
#define C_DARK_CYAN 0x0451
#define C_AQUA 0x07FF
#define C_CYAN 0x07FF
#define C_LIGHT_CYAN 0xDFFF
#define C_DARK_TURQUOISE 0x0679
#define C_TURQUOISE 0x46F9
#define C_MEDIUM_TURQUOISE 0x4E99
#define C_PALE_TURQUOISE 0xAF7D
#define C_AQUA_MARINE 0x7FFA
#define C_POWDER_BLUE 0xAEFC
#define C_CADET_BLUE 0x64F3
#define C_STEEL_BLUE 0x4C16
#define C_CORN_FLOWER_BLUE 0x64BD
#define C_DEEP_SKY_BLUE 0x05FF
#define C_DODGER_BLUE 0x249F
#define C_LIGHT_BLUE 0xAEBC
#define C_SKY_BLUE 0x867D
#define C_LIGHT_SKY_BLUE 0x867E
#define C_MIDNIGHT_BLUE 0x18CE
#define C_NAVY 0x0010
#define C_DARK_BLUE 0x0011
#define C_MEDIUM_BLUE 0x0019
#define C_BLUE 0x001F
#define C_ROYAL_BLUE 0x435B
#define C_BLUE_VIOLET 0x897B
#define C_INDIGO 0x4810
#define C_DARK_SLATE_BLUE 0x49F1
#define C_SLATE_BLUE 0x6AD9
#define C_MEDIUM_SLATE_BLUE 0x7B5D
#define C_MEDIUM_PURPLE 0x939B
#define C_DARK_MAGENTA 0x8811
#define C_DARK_VIOLET 0x901A
#define C_DARK_ORCHID 0x9999
#define C_MEDIUM_ORCHID 0xBABA
#define C_PURPLE 0x8010
#define C_THISTLE 0xD5FA
#define C_PLUM 0xDD1B
#define C_VIOLET 0xEC1D
#define C_MAGENTA 0xF81F
#define C_ORCHID 0xDB9A
#define C_MEDIUM_VIOLET_RED 0xC0B0
#define C_PALE_VIOLET_RED 0xDB92
#define C_DEEP_PINK 0xF8B2
#define C_HOT_PINK 0xFB56
#define C_LIGHT_PINK 0xFDB7
#define C_PINK 0xFDF9
#define C_ANTIQUE_WHITE 0xF75A
#define C_BEIGE 0xF7BB
#define C_BISQUE 0xFF18
#define C_BLANCHED_ALMOND 0xFF59
#define C_WHEAT 0xF6F6
#define C_CORN_SILK 0xFFBB
#define C_LEMON_CHIFFON 0xFFD9
#define C_LIGHT_GOLDEN_ROD_YELLOW 0xF7DA
#define C_LIGHT_YELLOW 0xFFFB
#define C_SADDLE_BROWN 0x8A22
#define C_SIENNA 0x9A85
#define C_CHOCOLATE 0xD344
#define C_PERU 0xCC28
#define C_SANDY_BROWN 0xF52C
#define C_BURLY_WOOD 0xDDB0
#define C_TAN 0xD591
#define C_ROSY_BROWN 0xBC71
#define C_MOCCASIN 0xFF16
#define C_NAVAJO_WHITE 0xFEF5
#define C_PEACH_PUFF 0xFED6
#define C_MISTY_ROSE 0xFF1B
#define C_LAVENDER_BLUSH 0xFF7E
#define C_LINEN 0xF77C
#define C_OLD_LACE 0xFFBC
#define C_PAPAYA_WHIP 0xFF7A
#define C_SEA_SHELL 0xFFBD
#define C_MINT_CREAM 0xF7FE
#define C_SLATE_GRAY 0x7412
#define C_LIGHT_SLATE_GRAY 0x7453
#define C_LIGHT_STEEL_BLUE 0xAE1B
#define C_LAVENDER 0xE73E
#define C_FLORAL_WHITE 0xFFDD
#define C_ALICE_BLUE 0xEFBF
#define C_GHOST_WHITE 0xF7BF
#define C_HONEYDEW 0xEFFD
#define C_IVORY 0xFFFD
#define C_AZURE 0xEFFF
#define C_SNOW 0xFFDE
#define C_BLACK 0x0000
#define C_DIM_GRAY 0x6B4D
#define C_GRAY 0x8410
#define C_DARK_GRAY 0xAD55
#define C_SILVER 0xBDF7
#define C_LIGHT_GRAY 0xD69A
#define C_GAINSBORO 0xDEDB
#define C_WHITE_SMOKE 0xF7BE
#define C_WHITE 0xFFFF
#endif

#ifdef USE_COLOR_RGB888
#define C_MAROON 0x800000
#define C_DARK_RED 0x8B0000
#define C_BROWN 0xA52A2A
#define C_FIREBRICK 0xB22222
#define C_CRIMSON 0xDC143C
#define C_RED 0xFF0000
#define C_TOMATO 0xFF6347
#define C_CORAL 0xFF7F50
#define C_INDIAN_RED 0xCD5C5C
#define C_LIGHT_CORAL 0xF08080
#define C_DARK_SALMON 0xE9967A
#define C_SALMON 0xFA8072
#define C_LIGHT_SALMON 0xFFA07A
#define C_ORANGE_RED 0xFF4500
#define C_DARK_ORANGE 0xFF8C00
#define C_ORANGE 0xFFA500
#define C_GOLD 0xFFD700
#define C_DARK_GOLDEN_ROD 0xB8860B
#define C_GOLDEN_ROD 0xDAA520
#define C_PALE_GOLDEN_ROD 0xEEE8AA
#define C_DARK_KHAKI 0xBDB76B
#define C_KHAKI 0xF0E68C
#define C_OLIVE 0x808000
#define C_YELLOW 0xFFFF00
#define C_YELLOW_GREEN 0x9ACD32
#define C_DARK_OLIVE_GREEN 0x556B2F
#define C_OLIVE_DRAB 0x6B8E23
#define C_LAWN_GREEN 0x7CFC00
#define C_CHART_REUSE 0x7FFF00
#define C_GREEN_YELLOW 0xADFF2F
#define C_DARK_GREEN 0x006400
#define C_GREEN 0x00FF00
#define C_FOREST_GREEN 0x228B22
#define C_LIME 0x00FF00
#define C_LIME_GREEN 0x32CD32
#define C_LIGHT_GREEN 0x90EE90
#define C_PALE_GREEN 0x98FB98
#define C_DARK_SEA_GREEN 0x8FBC8F
#define C_MEDIUM_SPRING_GREEN 0x00FA9A
#define C_SPRING_GREEN 0x00FF7F
#define C_SEA_GREEN 0x2E8B57
#define C_MEDIUM_AQUA_MARINE 0x66CDAA
#define C_MEDIUM_SEA_GREEN 0x3CB371
#define C_LIGHT_SEA_GREEN 0x20B2AA
#define C_DARK_SLATE_GRAY 0x2F4F4F
#define C_TEAL 0x008080
#define C_DARK_CYAN 0x008B8B
#define C_AQUA 0x00FFFF
#define C_CYAN 0x00FFFF
#define C_LIGHT_CYAN 0xE0FFFF
#define C_DARK_TURQUOISE 0x00CED1
#define C_TURQUOISE 0x40E0D0
#define C_MEDIUM_TURQUOISE 0x48D1CC
#define C_PALE_TURQUOISE 0xAFEEEE
#define C_AQUA_MARINE 0x7FFFD4
#define C_POWDER_BLUE 0xB0E0E6
#define C_CADET_BLUE 0x5F9EA0
#define C_STEEL_BLUE 0x4682B4
#define C_CORN_FLOWER_BLUE 0x6495ED
#define C_DEEP_SKY_BLUE 0x00BFFF
#define C_DODGER_BLUE 0x1E90FF
#define C_LIGHT_BLUE 0xADD8E6
#define C_SKY_BLUE 0x87CEEB
#define C_LIGHT_SKY_BLUE 0x87CEFA
#define C_MIDNIGHT_BLUE 0x191970
#define C_NAVY 0x000080
#define C_DARK_BLUE 0x00008B
#define C_MEDIUM_BLUE 0x0000CD
#define C_BLUE 0x0000FF
#define C_ROYAL_BLUE 0x4169E1
#define C_BLUE_VIOLET 0x8A2BE2
#define C_INDIGO 0x4B0082
#define C_DARK_SLATE_BLUE 0x483D8B
#define C_SLATE_BLUE 0x6A5ACD
#define C_MEDIUM_SLATE_BLUE 0x7B68EE
#define C_MEDIUM_PURPLE 0x9370DB
#define C_DARK_MAGENTA 0x8B008B
#define C_DARK_VIOLET 0x9400D3
#define C_DARK_ORCHID 0x9932CC
#define C_MEDIUM_ORCHID 0xBA55D3
#define C_PURPLE 0x800080
#define C_THISTLE 0xD8BFD8
#define C_PLUM 0xDDA0DD
#define C_VIOLET 0xEE82EE
#define C_MAGENTA 0xFF00FF
#define C_ORCHID 0xDA70D6
#define C_MEDIUM_VIOLET_RED 0xC71585
#define C_PALE_VIOLET_RED 0xDB7093
#define C_DEEP_PINK 0xFF1493
#define C_HOT_PINK 0xFF69B4
#define C_LIGHT_PINK 0xFFB6C1
#define C_PINK 0xFFC0CB
#define C_ANTIQUE_WHITE 0xFAEBD7
#define C_BEIGE 0xF5F5DC
#define C_BISQUE 0xFFE4C4
#define C_BLANCHED_ALMOND 0xFFEBCD
#define C_WHEAT 0xF5DEB3
#define C_CORN_SILK 0xFFF8DC
#define C_LEMON_CHIFFON 0xFFFACD
#define C_LIGHT_GOLDEN_ROD_YELLOW 0xFAFAD2
#define C_LIGHT_YELLOW 0xFFFFE0
#define C_SADDLE_BROWN 0x8B4513
#define C_SIENNA 0xA0522D
#define C_CHOCOLATE 0xD2691E
#define C_PERU 0xCD853F
#define C_SANDY_BROWN 0xF4A460
#define C_BURLY_WOOD 0xDEB887
#define C_TAN 0xD2B48C
#define C_ROSY_BROWN 0xBC8F8F
#define C_MOCCASIN 0xFFE4B5
#define C_NAVAJO_WHITE 0xFFDEAD
#define C_PEACH_PUFF 0xFFDAB9
#define C_MISTY_ROSE 0xFFE4E1
#define C_LAVENDER_BLUSH 0xFFF0F5
#define C_LINEN 0xFAF0E6
#define C_OLD_LACE 0xFDF5E6
#define C_PAPAYA_WHIP 0xFFEFD5
#define C_SEA_SHELL 0xFFF5EE
#define C_MINT_CREAM 0xF5FFFA
#define C_SLATE_GRAY 0x708090
#define C_LIGHT_SLATE_GRAY 0x778899
#define C_LIGHT_STEEL_BLUE 0xB0C4DE
#define C_LAVENDER 0xE6E6FA
#define C_FLORAL_WHITE 0xFFFAF0
#define C_ALICE_BLUE 0xF0F8FF
#define C_GHOST_WHITE 0xF8F8FF
#define C_HONEYDEW 0xF0FFF0
#define C_IVORY 0xFFFFF0
#define C_AZURE 0xF0FFFF
#define C_SNOW 0xFFFAFA
#define C_BLACK 0x000000
#define C_DIM_GRAY 0x696969
#define C_GRAY 0x808080
#define C_DARK_GRAY 0xA9A9A9
#define C_SILVER 0xC0C0C0
#define C_LIGHT_GRAY 0xD3D3D3
#define C_GAINSBORO 0xDCDCDC
#define C_WHITE_SMOKE 0xF5F5F5
#define C_WHITE 0xFFFFFF
#endif

/* -------------------------------------------------------------------------------- */
/* -- PROTOTYPES                                                                 -- */
/* -------------------------------------------------------------------------------- */
#if _GUI_FONT == 3

typedef struct
{
    uint32_t addr;
    uint16_t len;
} XBF_Info_t;

typedef struct
{
    uint16_t x_len;
    uint16_t x_byte;
} XBF_Data_t;

int UG_ReadXBF(UG_U32 off, UG_U8* pbuf, UG_U16 len);
#endif
/* Classic functions */
UG_S16 UG_Init(UG_GUI* g, void (*p)(UG_S16, UG_S16, UG_COLOR), UG_S16 x, UG_S16 y);
UG_S16 UG_SelectGUI(UG_GUI* g);
void   UG_FontSelect(const UG_FONT* font);
void   UG_FillScreen(UG_COLOR c);
void   UG_FillFrame(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c);
void   UG_FillRoundFrame(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_S16 r, UG_COLOR c);
void   UG_DrawMesh(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c);
void   UG_DrawFrame(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c);
void   UG_DrawRoundFrame(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_S16 r, UG_COLOR c);
void   UG_DrawPixel(UG_S16 x0, UG_S16 y0, UG_COLOR c);
void   UG_DrawCircle(UG_S16 x0, UG_S16 y0, UG_S16 r, UG_COLOR c);
void   UG_FillCircle(UG_S16 x0, UG_S16 y0, UG_S16 r, UG_COLOR c);
void   UG_DrawArc(UG_S16 x0, UG_S16 y0, UG_S16 r, UG_U8 s, UG_COLOR c);
void   UG_DrawLine(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c);
void   UG_PutString(UG_S16 x, UG_S16 y, char* str);
void   UG_PutCharUnicode(uint32_t v, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc);
void   UG_PutChar(char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc);
void   UG_ConsolePutString(char* str);
void   UG_ConsoleSetArea(UG_S16 xs, UG_S16 ys, UG_S16 xe, UG_S16 ye);
void   UG_ConsoleSetForecolor(UG_COLOR c);
void   UG_ConsoleSetBackcolor(UG_COLOR c);
void   UG_SetForecolor(UG_COLOR c);
void   UG_SetBackcolor(UG_COLOR c);
UG_S16 UG_GetXDim(void);
UG_S16 UG_GetYDim(void);
void   UG_FontSetHSpace(UG_U16 s);
void   UG_FontSetVSpace(UG_U16 s);

/* Miscellaneous functions */
void UG_WaitForUpdate(void);
void UG_Update(void);
void UG_DrawBMP(UG_S16 xp, UG_S16 yp, UG_BMP* bmp);
void UG_TouchUpdate(UG_S16 xp, UG_S16 yp, UG_U8 state);

/* Driver functions */
void UG_DriverRegister(UG_U8 type, void* driver);
void UG_DriverEnable(UG_U8 type);
void UG_DriverDisable(UG_U8 type);

/* Window functions */
UG_RESULT UG_WindowCreate(UG_WINDOW* wnd, UG_OBJECT* objlst, UG_U8 objcnt, void (*cb)(UG_MESSAGE*));
UG_RESULT UG_WindowDelete(UG_WINDOW* wnd);
UG_RESULT UG_WindowShow(UG_WINDOW* wnd);
UG_RESULT UG_WindowHide(UG_WINDOW* wnd);
UG_RESULT UG_WindowResize(UG_WINDOW* wnd, UG_S16 xs, UG_S16 ys, UG_S16 xe, UG_S16 ye);
UG_RESULT UG_WindowAlert(UG_WINDOW* wnd);
UG_RESULT UG_WindowSetForeColor(UG_WINDOW* wnd, UG_COLOR fc);
UG_RESULT UG_WindowSetBackColor(UG_WINDOW* wnd, UG_COLOR bc);
UG_RESULT UG_WindowSetTitleTextColor(UG_WINDOW* wnd, UG_COLOR c);
UG_RESULT UG_WindowSetTitleColor(UG_WINDOW* wnd, UG_COLOR c);
UG_RESULT UG_WindowSetTitleInactiveTextColor(UG_WINDOW* wnd, UG_COLOR c);
UG_RESULT UG_WindowSetTitleInactiveColor(UG_WINDOW* wnd, UG_COLOR c);
UG_RESULT UG_WindowSetTitleText(UG_WINDOW* wnd, char* str);
UG_RESULT UG_WindowSetTitleTextFont(UG_WINDOW* wnd, const UG_FONT* font);
UG_RESULT UG_WindowSetTitleTextHSpace(UG_WINDOW* wnd, UG_S8 hs);
UG_RESULT UG_WindowSetTitleTextVSpace(UG_WINDOW* wnd, UG_S8 vs);
UG_RESULT UG_WindowSetTitleTextAlignment(UG_WINDOW* wnd, UG_U8 align);
UG_RESULT UG_WindowSetTitleHeight(UG_WINDOW* wnd, UG_U8 height);
UG_RESULT UG_WindowSetXStart(UG_WINDOW* wnd, UG_S16 xs);
UG_RESULT UG_WindowSetYStart(UG_WINDOW* wnd, UG_S16 ys);
UG_RESULT UG_WindowSetXEnd(UG_WINDOW* wnd, UG_S16 xe);
UG_RESULT UG_WindowSetYEnd(UG_WINDOW* wnd, UG_S16 ye);
UG_RESULT UG_WindowSetStyle(UG_WINDOW* wnd, UG_U8 style);
UG_COLOR  UG_WindowGetForeColor(UG_WINDOW* wnd);
UG_COLOR  UG_WindowGetBackColor(UG_WINDOW* wnd);
UG_COLOR  UG_WindowGetTitleTextColor(UG_WINDOW* wnd);
UG_COLOR  UG_WindowGetTitleColor(UG_WINDOW* wnd);
UG_COLOR  UG_WindowGetTitleInactiveTextColor(UG_WINDOW* wnd);
UG_COLOR  UG_WindowGetTitleInactiveColor(UG_WINDOW* wnd);
char*     UG_WindowGetTitleText(UG_WINDOW* wnd);
UG_FONT*  UG_WindowGetTitleTextFont(UG_WINDOW* wnd);
UG_S8     UG_WindowGetTitleTextHSpace(UG_WINDOW* wnd);
UG_S8     UG_WindowGetTitleTextVSpace(UG_WINDOW* wnd);
UG_U8     UG_WindowGetTitleTextAlignment(UG_WINDOW* wnd);
UG_U8     UG_WindowGetTitleHeight(UG_WINDOW* wnd);
UG_S16    UG_WindowGetXStart(UG_WINDOW* wnd);
UG_S16    UG_WindowGetYStart(UG_WINDOW* wnd);
UG_S16    UG_WindowGetXEnd(UG_WINDOW* wnd);
UG_S16    UG_WindowGetYEnd(UG_WINDOW* wnd);
UG_U8     UG_WindowGetStyle(UG_WINDOW* wnd);
UG_RESULT UG_WindowGetArea(UG_WINDOW* wnd, UG_AREA* a);
UG_S16    UG_WindowGetInnerWidth(UG_WINDOW* wnd);
UG_S16    UG_WindowGetOuterWidth(UG_WINDOW* wnd);
UG_S16    UG_WindowGetInnerHeight(UG_WINDOW* wnd);
UG_S16    UG_WindowGetOuterHeight(UG_WINDOW* wnd);

/* Button functions */
UG_RESULT UG_ButtonCreate(UG_WINDOW* wnd, UG_BUTTON* btn, UG_U8 id, UG_S16 xs, UG_S16 ys, UG_S16 xe,
                          UG_S16 ye);
UG_RESULT UG_ButtonDelete(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ButtonShow(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ButtonHide(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ButtonSetForeColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR fc);
UG_RESULT UG_ButtonSetBackColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR bc);
UG_RESULT UG_ButtonSetAlternateForeColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR afc);
UG_RESULT UG_ButtonSetAlternateBackColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR abc);
UG_RESULT UG_ButtonSetText(UG_WINDOW* wnd, UG_U8 id, char* str);
UG_RESULT UG_ButtonSetFont(UG_WINDOW* wnd, UG_U8 id, const UG_FONT* font);
UG_RESULT UG_ButtonSetStyle(UG_WINDOW* wnd, UG_U8 id, UG_U8 style);
UG_RESULT UG_ButtonSetHSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 hs);
UG_RESULT UG_ButtonSetVSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 vs);
UG_RESULT UG_ButtonSetAlignment(UG_WINDOW* wnd, UG_U8 id, UG_U8 align);
UG_COLOR  UG_ButtonGetForeColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_ButtonGetBackColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_ButtonGetAlternateForeColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_ButtonGetAlternateBackColor(UG_WINDOW* wnd, UG_U8 id);
char*     UG_ButtonGetText(UG_WINDOW* wnd, UG_U8 id);
UG_FONT*  UG_ButtonGetFont(UG_WINDOW* wnd, UG_U8 id);
UG_U8     UG_ButtonGetStyle(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_ButtonGetHSpace(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_ButtonGetVSpace(UG_WINDOW* wnd, UG_U8 id);
UG_U8     UG_ButtonGetAlignment(UG_WINDOW* wnd, UG_U8 id);

/* Checkbox functions */
UG_RESULT UG_CheckboxCreate(UG_WINDOW* wnd, UG_CHECKBOX* btn, UG_U8 id, UG_S16 xs, UG_S16 ys,
                            UG_S16 xe, UG_S16 ye);
UG_RESULT UG_CheckboxDelete(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_CheckboxShow(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_CheckboxHide(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_CheckboxSetCheched(UG_WINDOW* wnd, UG_U8 id, UG_U8 ch);
UG_RESULT UG_CheckboxSetForeColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR fc);
UG_RESULT UG_CheckboxSetBackColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR bc);
UG_RESULT UG_CheckboxSetAlternateForeColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR afc);
UG_RESULT UG_CheckboxSetAlternateBackColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR abc);
UG_RESULT UG_CheckboxSetText(UG_WINDOW* wnd, UG_U8 id, char* str);
UG_RESULT UG_CheckboxSetFont(UG_WINDOW* wnd, UG_U8 id, const UG_FONT* font);
UG_RESULT UG_CheckboxSetStyle(UG_WINDOW* wnd, UG_U8 id, UG_U8 style);
UG_RESULT UG_CheckboxSetHSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 hs);
UG_RESULT UG_CheckboxSetVSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 vs);
UG_RESULT UG_CheckboxSetAlignment(UG_WINDOW* wnd, UG_U8 id, UG_U8 align);
UG_U8     UG_CheckboxGetChecked(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_CheckboxGetForeColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_CheckboxGetBackColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_CheckboxGetAlternateForeColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_CheckboxGetAlternateBackColor(UG_WINDOW* wnd, UG_U8 id);
char*     UG_CheckboxGetText(UG_WINDOW* wnd, UG_U8 id);
UG_FONT*  UG_CheckboxGetFont(UG_WINDOW* wnd, UG_U8 id);
UG_U8     UG_CheckboxGetStyle(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_CheckboxGetHSpace(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_CheckboxGetVSpace(UG_WINDOW* wnd, UG_U8 id);
UG_U8     UG_CheckboxGetAlignment(UG_WINDOW* wnd, UG_U8 id);

/* Textbox functions */
UG_RESULT UG_TextboxCreate(UG_WINDOW* wnd, UG_TEXTBOX* txb, UG_U8 id, UG_S16 xs, UG_S16 ys,
                           UG_S16 xe, UG_S16 ye);
UG_RESULT UG_TextboxDelete(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_TextboxShow(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_TextboxHide(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_TextboxSetForeColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR fc);
UG_RESULT UG_TextboxSetBackColor(UG_WINDOW* wnd, UG_U8 id, UG_COLOR bc);
UG_RESULT UG_TextboxSetText(UG_WINDOW* wnd, UG_U8 id, char* str);
UG_RESULT UG_TextboxSetFont(UG_WINDOW* wnd, UG_U8 id, const UG_FONT* font);
UG_RESULT UG_TextboxSetHSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 hs);
UG_RESULT UG_TextboxSetVSpace(UG_WINDOW* wnd, UG_U8 id, UG_S8 vs);
UG_RESULT UG_TextboxSetAlignment(UG_WINDOW* wnd, UG_U8 id, UG_U8 align);
UG_COLOR  UG_TextboxGetForeColor(UG_WINDOW* wnd, UG_U8 id);
UG_COLOR  UG_TextboxGetBackColor(UG_WINDOW* wnd, UG_U8 id);
char*     UG_TextboxGetText(UG_WINDOW* wnd, UG_U8 id);
UG_FONT*  UG_TextboxGetFont(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_TextboxGetHSpace(UG_WINDOW* wnd, UG_U8 id);
UG_S8     UG_TextboxGetVSpace(UG_WINDOW* wnd, UG_U8 id);
UG_U8     UG_TextboxGetAlignment(UG_WINDOW* wnd, UG_U8 id);

/* Image functions */
UG_RESULT UG_ImageCreate(UG_WINDOW* wnd, UG_IMAGE* img, UG_U8 id, UG_S16 xs, UG_S16 ys, UG_S16 xe,
                         UG_S16 ye);
UG_RESULT UG_ImageDelete(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ImageShow(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ImageHide(UG_WINDOW* wnd, UG_U8 id);
UG_RESULT UG_ImageSetBMP(UG_WINDOW* wnd, UG_U8 id, const UG_BMP* bmp);

#endif

#endif