//*****************************************************************************
//
// imgbutton.h - Prototypes for the image button widget.
//
// Copyright (c) 2008-2020 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 2.2.0.295 of the Tiva Graphics Library.
//
//*****************************************************************************

#ifndef __IMGBUTTON_H__
#define __IMGBUTTON_H__

//*****************************************************************************
//
//! \addtogroup imgbutton_api
//! @{
//
//*****************************************************************************

//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif

//*****************************************************************************
//
//! The structure that describes a image button widget.
//
//*****************************************************************************
typedef struct
{
    //
    //! The generic widget information.
    //
    tWidget sBase;

    //
    //! The style for this widget.  This is a set of flags defined by
    //! IB_STYLE_xxx.
    //
    uint32_t ui32Style;

    //
    //! The color to use for foreground pixels when a 1bpp image or text is in
    //! use.  This value is ignored for all other image bit depths.
    //
    uint32_t ui32ForegroundColor;

    //
    //! The color to use for background pixels when the button is pressed
    //! and a 1bpp image is in use.  This value is ignored for all other image
    //! bit depths.  If IB_STYLE_FILL is specified, this is also the color that
    //! will be used to fill the widget when it is in the pressed state.
    //
    uint32_t ui32PressedColor;

    //
    //! The color to use for background pixels when the button is released
    //! and a 1bpp image is in use.  This value is ignored for all other image
    //! bit depths.  If IB_STYLE_FILL is specified, this is also the color that
    //! will be used to fill the widget when it is in the unpressed state.
    //
    uint32_t ui32BackgroundColor;

    //
    //! A pointer to the font used to render the button text, if
    //! IB_STYLE_TEXT is selected.
    //
    const tFont *psFont;

    //
    //! A pointer to the text to draw on this push button, if IB_STYLE_TEXT is
    //! selected.
    //
    const char *pcText;

    //
    //! A pointer to the image to be drawn onto this image button, if
    //! IB_STYLE_IMG is selected.
    //
    const uint8_t *pui8Image;

    //
    //! A pointer to the image to be drawn onto this image button when it is
    //! pressed.
    //
    const uint8_t *pui8PressImage;

    //
    //! A pointer to the image to be drawn above the background image for
    //! the button.
    //
    const uint8_t *pui8KeycapImage;

    //! The number of pixels to move the keycap image horizontally when the
    //! button is drawn in its pressed state.
    //
    int16_t i16XOffset;

    //
    //! The number of pixels to move the keycap image vertically when the
    //! button is drawn in its pressed state.
    //
    int16_t i16YOffset;

    //
    //! The number of pointer events to delay before starting to auto-repeat,
    //! if IB_STYLE_AUTO_REPEAT is selected.  The amount of time to which this
    //! corresponds is dependent upon the rate at which pointer events are
    //! generated by the pointer driver.
    //
    uint16_t ui16AutoRepeatDelay;

    //
    //! The number of pointer events between button presses generated by the
    //! auto-repeat function, if IB_STYLE_AUTO_REPEAT is selected.  The amount
    //! of time to which this corresponds is dependent up on the rate at which
    //! pointer events are generated by the pointer driver.
    //
    uint16_t ui16AutoRepeatRate;

    //
    //! The number of pointer events that have occurred.  This is used when
    //! IB_STYLE_AUTO_REPEAT is selected to generate the auto-repeat events.
    //
    uint32_t ui32AutoRepeatCount;

    //
    //! A pointer to the function to be called when the button is pressed.
    //! This is repeatedly called when IB_STYLE_AUTO_REPEAT is selected.
    //
    void (*pfnOnClick)(tWidget *psWidget);
}
tImageButtonWidget;

//*****************************************************************************
//
//! This flag indicates that the image button should be filled.
//
//*****************************************************************************
#define IB_STYLE_FILL           0x00000002

//*****************************************************************************
//
//! This flag indicates that the image button should have text drawn on it.
//
//*****************************************************************************
#define IB_STYLE_TEXT           0x00000004

//*****************************************************************************
//
//! This flag indicates that the background image is to be disabled.
//
//*****************************************************************************
#define IB_STYLE_IMAGE_OFF      0x00000008

//*****************************************************************************
//
//! This flag indicates that the keycap image is to be disabled.
//
//*****************************************************************************
#define IB_STYLE_KEYCAP_OFF     0x00000010

//*****************************************************************************
//
//! This flag indicates that the image button should auto-repeat, generating
//! repeated click events while it is pressed.
//
//*****************************************************************************
#define IB_STYLE_AUTO_REPEAT    0x00000020

//*****************************************************************************
//
//! This flag indicates that the image button is pressed.
//
//*****************************************************************************
#define IB_STYLE_PRESSED        0x00000040

//*****************************************************************************
//
//! This flag indicates that the image button callback should be made when
//! the button is released rather than when it is pressed.  This does not
//! affect the operation of auto repeat buttons.
//
//*****************************************************************************
#define IB_STYLE_RELEASE_NOTIFY 0x00000080

//*****************************************************************************
//
//! Declares an initialized image button widget data structure.
//!
//! \param psParent is a pointer to the parent widget.
//! \param psNext is a pointer to the sibling widget.
//! \param psChild is a pointer to the first child widget.
//! \param psDisplay is a pointer to the display on which to draw the push
//! button.
//! \param i32X is the X coordinate of the upper left corner of the image
//! button.
//! \param i32Y is the Y coordinate of the upper left corner of the image
//! button.
//! \param i32Width is the width of the image button.
//! \param i32Height is the height of the image button.
//! \param ui32Style is the style to be applied to the image button.
//! \param ui32ForeColor is the color to be used for foreground pixels when
//! a 1bpp image or text is being drawn.  It is ignored for all other image bit
//! depths.
//! \param ui32PressColor is the color to be used for foreground pixels when
//! the button is pressed and a 1bpp image is being drawn.  It is ignored for
//! all other image bit depths.
//! \param ui32BackColor is the color to be used for background pixels when
//! the button is released and a 1bpp image is being drawn.  It is ignored for
//! all other image bit depths.
//! \param psFont is a pointer to the font to be used to draw text on the button.
//! \param pcText is a pointer to the text to draw on this button.
//! \param pui8Image is a pointer to the image to draw on the background of
//! this image button when it is in the released state.
//! \param pui8PressImage is a pointer to the image to draw on the background
//! of this image button when it is in the pressed state.
//! \param pui8KeycapImage is a pointer to the image to draw as the keycap of
//! the on top of the image button, on top of the background image.
//! \param i16XOff is the horizontal offset to apply when drawing the keycap
//! image on the button when in the pressed state.
//! \param i16YOff is the vertical offset to apply when drawing the keycap
//! image on the button when in the pressed state.
//! \param ui16AutoRepeatDelay is the delay before starting auto-repeat.
//! \param ui16AutoRepeatRate is the rate at which auto-repeat events are
//! generated.
//! \param pfnOnClick is a pointer to the function that is called when the push
//! button is pressed.
//!
//! This macro provides an initialized image button widget data structure,
//! which can be used to construct the widget tree at compile time in global
//! variables (as opposed to run-time via function calls).  This must be
//! assigned to a variable, such as:
//!
//! \verbatim
//!     tImageButtonWidget g_sImageButton = ImageButtonStruct(...);
//! \endverbatim
//!
//! Or, in an array of variables:
//!
//! \verbatim
//!     tImageButtonWidget g_psImageButtons[] =
//!     {
//!         ImageButtonStruct(...),
//!         ImageButtonStruct(...)
//!     };
//! \endverbatim
//!
//! \e ui32Style is the logical OR of the following:
//!
//! - \b #IB_STYLE_TEXT to indicate that text should be drawn on the button.
//! - \b #IB_STYLE_FILL to indicate that the background of the button should
//!   be filled with color.
//! - \b #IB_STYLE_KEYCAP_OFF to indicate that the keycap image should not be
//!   drawn.
//! - \b #IB_STYLE_IMAGE_OFF to indicate that the background image should not be
//!   drawn.
//! - \b #IB_STYLE_AUTO_REPEAT to indicate that auto-repeat should be used.
//! - \b #IB_STYLE_RELEASE_NOTIFY to indicate that the callback should be made
//!   when the button is released.  If absent, the callback is called when the
//!   button is initially pressed.
//!
//! \return Nothing; this is not a function.
//
//*****************************************************************************
#define ImageButtonStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y,   \
                          i32Width, i32Height, ui32Style, ui32ForeColor,      \
                          ui32PressColor, ui32BackColor, psFont, pcText,      \
                          pui8Image, pui8PressImage, pui8KeycapImage,         \
                          i16XOff, i16YOff, ui16AutoRepeatDelay,              \
                          ui16AutoRepeatRate, pfnOnClick)                     \
        {                                                                     \
            {                                                                 \
                sizeof(tImageButtonWidget),                                   \
                (tWidget *)(psParent),                                        \
                (tWidget *)(psNext),                                          \
                (tWidget *)(psChild),                                         \
                psDisplay,                                                    \
                {                                                             \
                    i32X,                                                     \
                    i32Y,                                                     \
                    (i32X) + (i32Width) - 1,                                  \
                    (i32Y) + (i32Height) - 1                                  \
                },                                                            \
                ImageButtonMsgProc                                            \
            },                                                                \
            ui32Style,                                                        \
            ui32ForeColor,                                                    \
            ui32PressColor,                                                   \
            ui32BackColor,                                                    \
            psFont,                                                           \
            pcText,                                                           \
            pui8Image,                                                        \
            pui8PressImage,                                                   \
            pui8KeycapImage,                                                  \
            i16XOff,                                                          \
            i16YOff,                                                          \
            ui16AutoRepeatDelay,                                              \
            ui16AutoRepeatRate,                                               \
            0,                                                                \
            pfnOnClick                                                        \
        }

//*****************************************************************************
//
//! Declares an initialized variable containing a image button widget data
//! structure.
//!
//! \param sName is the name of the variable to be declared.
//! \param psParent is a pointer to the parent widget.
//! \param psNext is a pointer to the sibling widget.
//! \param psChild is a pointer to the first child widget.
//! \param psDisplay is a pointer to the display on which to draw the push
//! button.
//! \param i32X is the X coordinate of the upper left corner of the image
//! button.
//! \param i32Y is the Y coordinate of the upper left corner of the image
//! button.
//! \param i32Width is the width of the image button.
//! \param i32Height is the height of the image button.
//! \param ui32Style is the style to be applied to the image button.
//! \param ui32ForeColor is the color to be used for foreground pixels when
//! a 1bpp image is being drawn.  It is ignored for all other image bit depths.
//! \param ui32PressColor is the color to be used for foreground pixels when
//! the button is pressed and a 1bpp image is being drawn.  It is ignored for
//! all other image bit depths.
//! \param ui32BackColor is the color to be used for background pixels when
//! the button is released and a 1bpp image is being drawn.  It is ignored for
//! all other image bit depths.
//! \param psFont is a pointer to the font to be used to draw text on the
//! button.
//! \param pcText is a pointer to the text to draw on this button.
//! \param pui8Image is a pointer to the image to draw on the background of
//! this image button when it is in the released state.
//! \param pui8PressImage is a pointer to the image to draw on the background
//! of this image button when it is in the pressed state.
//! \param pui8KeycapImage is a pointer to the image to draw as the keycap of
//! the on top of the image button, on top of the background image.
//! \param i16XOff is the horizontal offset to apply when drawing the keycap
//! image on the button when in the pressed state.
//! \param i16YOff is the vertical offset to apply when drawing the keycap
//! image on the button when in the pressed state.
//! \param ui16AutoRepeatDelay is the delay before starting auto-repeat.
//! \param ui16AutoRepeatRate is the rate at which auto-repeat events are
//! generated.
//! \param pfnOnClick is a pointer to the function that is called when the push
//! button is pressed.
//!
//! This macro provides an initialized image button widget data structure,
//! which can be used to construct the widget tree at compile time in global
//! variables (as opposed to run-time via function calls).
//!
//! \e ui32Style is the logical OR of the following:
//!
//! - \b #IB_STYLE_TEXT to indicate that text should be drawn on the button.
//! - \b #IB_STYLE_FILL to indicate that the background of the button should
//!   be filled with color.
//! - \b #IB_STYLE_KEYCAP_OFF to indicate that the keycap image should not be
//!   drawn.
//! - \b #IB_STYLE_IMAGE_OFF to indicate that the background image should not
//!   be drawn.
//! - \b #IB_STYLE_AUTO_REPEAT to indicate that auto-repeat should be used.
//! - \b #IB_STYLE_RELEASE_NOTIFY to indicate that the callback should be made
//!   when the button is released.  If absent, the callback is called when the
//!   button is initially pressed.
//!
//! \return Nothing; this is not a function.
//
//*****************************************************************************
#define ImageButton(sName, psParent, psNext, psChild, psDisplay, i32X, i32Y,  \
                   i32Width, i32Height, ui32Style, ui32ForeColor,             \
                   ui32PressColor, ui32BackColor, psFont, pcText, pui8Image,  \
                   pui8PressImage, pui8KeycapImage, i16XOff, i16YOff,         \
                   ui16AutoRepeatDelay, ui16AutoRepeatRate, pfnOnClick)       \
        tImageButtonWidget sName =                                            \
            ImageButtonStruct(psParent, psNext, psChild, psDisplay, i32X,     \
                              i32Y, i32Width, i32Height, ui32Style,           \
                              ui32ForeColor, ui32PressColor, ui32BackColor,   \
                              psFont, pcText, pui8Image, pui8PressImage,      \
                              pui8KeycapImage, i16XOff, i16YOff,              \
                              ui16AutoRepeatDelay, ui16AutoRepeatRate,        \
                              pfnOnClick)

//*****************************************************************************
//
//! Sets the auto-repeat delay for a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//! \param ui16Delay is the number of pointer events before auto-repeat starts.
//!
//! This function sets the delay before auto-repeat begins.  Unpredictable
//! behavior will occur if this is called while the image button is pressed.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonAutoRepeatDelaySet(psWidget, ui16Delay)                    \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui16AutoRepeatDelay = ui16Delay;                             \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables auto-repeat for a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function disables the auto-repeat behavior of a image button.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonAutoRepeatOff(psWidget)                                    \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style &= ~(IB_STYLE_AUTO_REPEAT);                        \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables auto-repeat for a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function enables the auto-repeat behavior of a image button.
//! Unpredictable behavior will occur if this is called while the image button
//! is pressed.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonAutoRepeatOn(psWidget)                                     \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style |= IB_STYLE_AUTO_REPEAT;                           \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the auto-repeat rate for a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//! \param ui16Rate is the number of pointer events between auto-repeat events.
//!
//! This function sets the rate at which auto-repeat events occur.
//! Unpredictable behavior will occur if this is called while the image button
//! is pressed.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonAutoRepeatRateSet(psWidget, ui16Rate)                      \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui16AutoRepeatRate = ui16Rate;                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the function to call when this image button widget is pressed.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//! \param pfnOnClik is a pointer to the function to call.
//!
//! This function sets the function to be called when this image button is
//! pressed.  The supplied function is called when the image button is first
//! pressed, and then repeated while the image button is pressed if auto-repeat
//! is enabled.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonCallbackSet(psWidget, pfnOnClik)                           \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->pfnOnClick = pfnOnClik;                                      \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the fill color of a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to fill the image button.
//!
//! This function changes the color used to fill the background of the image
//! button on the display.  This is a duplicate of
//! ImageButtonBackgroundColorSet which is left for backwards compatibility.
//! The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonFillColorSet(psWidget, ui32Color)                          \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32BackgroundColor = ui32Color;                             \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables filling of a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function disables the filling of a image button widget.  The display
//! is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonFillOff(psWidget)                                          \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style &= ~(IB_STYLE_FILL);                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables filling of a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function enables the filling of a image button widget.  The display is
//! not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonFillOn(psWidget)                                           \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style |= IB_STYLE_FILL;                                  \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the background image for an image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function enables the drawing of the background image on an image
//! button widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonImageOn(psWidget)                                          \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style &= ~(IB_STYLE_IMAGE_OFF);                          \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the background image for an image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function disables the drawing of the background image on an image
//! button widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonImageOff(psWidget)                                         \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style |= IB_STYLE_IMAGE_OFF;                             \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the keycap image for an image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function enables the drawing of the keycap image on an image button
//! widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonKeycapOn(psWidget)                                         \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style &= ~(IB_STYLE_KEYCAP_OFF);                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the keycap image for an image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function disables the drawing of the keycap image on an image button
//! widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonKeycapOff(psWidget)                                        \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style |= IB_STYLE_KEYCAP_OFF;                            \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the image drawn on a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param pImg is a pointer to the image to draw onto the image button.
//!
//! This function changes the image that is drawn onto the background of the
//! image button in its unpressed state.  The display is not updated until the
//! next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonImageSet(psWidget, pImg)                                   \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            const uint8_t *pI = pImg;                                         \
            psW->pui8Image = pI;                                              \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the image drawn on a image button widget when it is pressed.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param pImg is a pointer to the image to draw onto the image button when it
//! is pressed.
//!
//! This function changes the image that is drawn onto the background of the
//! image button in its pressed state.  The display is not updated until the
//! next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonImagePressedSet(psWidget, pImg)                            \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            const uint8_t *pI = pImg;                                         \
            psW->pui8PressImage = pI;                                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the keycap image drawn on a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param pImg is a pointer to the image to draw onto the image button.
//!
//! This function changes the image that is drawn onto the top of the push
//! button.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonImageKeycapSet(psWidget, pImg)                             \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            const uint8_t *pI = (pImg);                                       \
            psW->pui8KeycapImage = pI;                                        \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the keycap image offset position on an image button widget.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param i16X is the signed horizontal position offset for the keycap image
//! when the image button is pressed.  Positive values move the image right.
//! \param i16Y is the signed vertical position offset for the keycap image
//! when the image button is pressed.  Positive values move the image down.
//!
//! This function changes the position that the keycap image is drawn at when
//! the image button is pressed.  The keycap image is moved iX pixels right and
//! iY pixels down from the center position if the image button is pressed.
//! This feature can be used to support 3D buttons.   The display is not
//! updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonKeycapOffsetSet(psWidget, i16X, i16Y)                      \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->i16XOffset = (int16_t)(i16X);                                \
            psW->i16YOffset = (int16_t)(i16Y);                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the color of background pixels when using 1bpp images.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param ui32Color is the background color to use.
//!
//! This function changes the color that is used to draw background pixels when
//! a 1bpp image is rendered on the button and the button is in the released
//! state.  The value is ignored for all other image bit depths.  The display
//! is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonBackgroundColorSet(psWidget, ui32Color)                    \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32BackgroundColor  = (ui32Color);                          \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the color of foreground pixels when using 1bpp images.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param ui32Color is the foreground color to use.
//!
//! This function changes the color that is used to draw foreground pixels when
//! a 1bpp image or text string is rendered on the button.  The value is
//! ignored for all other image bit depths.  The display is not updated until
//! the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonForegroundColorSet(psWidget, ui32Color)                    \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32ForegroundColor  = (ui32Color);                          \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the color of foreground pixels when the button is pressed and when
//! using 1bpp images.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param ui32Color is the pressed foreground color to use.
//!
//! This function changes the color that is used to draw foreground pixels when
//! a 1bpp image is rendered on the button and the button is in the pressed
//! state.  The value is ignored for all other image bit depths.  The display
//! is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonPressedColorSet(psWidget, ui32Color)                       \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32PressedColor  = (ui32Color);                             \
        }                                                                     \
        while(0)


//*****************************************************************************
//
//! Changes the text drawn on a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to be modified.
//! \param pcTxt is a pointer to the text to draw onto the image button.
//!
//! This function changes the text that is drawn onto the image button.  The
//! display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonTextSet(psWidget, pcTxt)                                   \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            const char *pcT = pcTxt;                                          \
            psW->pcText = pcT;                                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the text on a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function disables the drawing of text on a image button widget.  The
//! display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonTextOff(psWidget)                                          \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style &= ~(IB_STYLE_TEXT);                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the text on a image button widget.
//!
//! \param psWidget is a pointer to the image button widget to modify.
//!
//! This function enables the drawing of text on a image button widget.  The
//! display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define ImageButtonTextOn(psWidget)                                           \
        do                                                                    \
        {                                                                     \
            tImageButtonWidget *psW = (tImageButtonWidget *)(psWidget);       \
            psW->ui32Style |= IB_STYLE_TEXT;                                  \
        }                                                                     \
        while(0)

//*****************************************************************************
//
// Prototypes for the image button widget APIs.
//
//*****************************************************************************
extern int32_t ImageButtonMsgProc(tWidget *psWidget, uint32_t ui32Msg,
                               uint32_t ui32Param1,
                               uint32_t ui32Param2);
extern void ImageButtonInit(tImageButtonWidget *psWidget,
                            const tDisplay *psDisplay,
                            int32_t i32X, int32_t i32Y,
                            int32_t i32Width, int32_t i32Height);

//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif

//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************

#endif // __IMGBUTTON_H__
