//***************************************************************************** // // canvas.h - Prototypes for the canvas widget. // // Copyright (c) 2008-2014 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.1.0.12573 of the Tiva Graphics Library. // //***************************************************************************** #ifndef __CANVAS_H__ #define __CANVAS_H__ //***************************************************************************** // //! \addtogroup canvas_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 canvas widget. // //***************************************************************************** typedef struct { // //! The generic widget information. // tWidget sBase; // //! The style for this widget. This is a set of flags defined by //! CANVAS_STYLE_xxx. // uint32_t ui32Style; // //! The 24-bit RGB color used to fill this canvas, if CANVAS_STYLE_FILL is //! selected, and to use as the background color if //! CANVAS_STYLE_TEXT_OPAQUE is selected. // uint32_t ui32FillColor; // //! The 24-bit RGB color used to outline this canvas, if //! CANVAS_STYLE_OUTLINE is selected. // uint32_t ui32OutlineColor; // //! The 24-bit RGB color used to draw text on this canvas, if //! CANVAS_STYLE_TEXT is selected. // uint32_t ui32TextColor; // //! A pointer to the font used to render the canvas text, if //! CANVAS_STYLE_TEXT is selected. // const tFont *psFont; // //! A pointer to the text to draw on this canvas, if CANVAS_STYLE_TEXT is //! selected. // const char *pcText; // //! A pointer to the image to be drawn onto this canvas, if //! CANVAS_STYLE_IMG is selected. // const uint8_t *pui8Image; // //! A pointer to the application-supplied drawing function used to draw //! onto this canvas, if CANVAS_STYLE_APP_DRAWN is selected. // void (*pfnOnPaint)(tWidget *psWidget, tContext *psContext); } tCanvasWidget; //***************************************************************************** // //! This flag indicates that the canvas should be outlined. // //***************************************************************************** #define CANVAS_STYLE_OUTLINE 0x00000001 //***************************************************************************** // //! This flag indicates that the canvas should be filled. // //***************************************************************************** #define CANVAS_STYLE_FILL 0x00000002 //***************************************************************************** // //! This flag indicates that the canvas should have text drawn on it. // //***************************************************************************** #define CANVAS_STYLE_TEXT 0x00000004 //***************************************************************************** // //! This flag indicates that the canvas should have an image drawn on it. // //***************************************************************************** #define CANVAS_STYLE_IMG 0x00000008 //***************************************************************************** // //! This flag indicates that the canvas is drawn using the application-supplied //! drawing function. // //***************************************************************************** #define CANVAS_STYLE_APP_DRAWN 0x00000010 //***************************************************************************** // //! This flag indicates that the canvas text should be drawn opaque (in other //! words, drawing the background pixels as well as the foreground pixels). // //***************************************************************************** #define CANVAS_STYLE_TEXT_OPAQUE \ 0x00000020 //***************************************************************************** // //! This flag indicates that canvas text should be left-aligned. By default, //! text is centered in both X and Y within the canvas bounding rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_LEFT \ 0x00000040 //***************************************************************************** // //! This flag indicates that canvas text should be right-aligned. By default, //! text is centered in both X and Y within the canvas bounding rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_RIGHT \ 0x00000080 //***************************************************************************** // //! This flag indicates that canvas text should be top-aligned. By default, //! text is centered in both X and Y within the canvas bounding rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_TOP \ 0x00000100 //***************************************************************************** // //! This flag indicates that canvas text should be bottom-aligned. By default, //! text is centered in both X and Y within the canvas bounding rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_BOTTOM \ 0x00000200 //***************************************************************************** // //! This flag indicates that canvas text should be centered horizontally. By //! default, text is centered in both X and Y within the canvas bounding //! rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_HCENTER \ 0x00000000 //***************************************************************************** // //! This flag indicates that canvas text should be centered vertically. By //! default, text is centered in both X and Y within the canvas bounding //! rectangle. // //***************************************************************************** #define CANVAS_STYLE_TEXT_VCENTER \ 0x00000000 //***************************************************************************** // // Masks used to extract the text alignment flags from the widget style. // //***************************************************************************** #define CANVAS_STYLE_ALIGN_MASK (CANVAS_STYLE_TEXT_LEFT | \ CANVAS_STYLE_TEXT_RIGHT | \ CANVAS_STYLE_TEXT_TOP | \ CANVAS_STYLE_TEXT_BOTTOM) #define CANVAS_STYLE_ALIGN_HMASK \ (CANVAS_STYLE_TEXT_LEFT | \ CANVAS_STYLE_TEXT_RIGHT) #define CANVAS_STYLE_ALIGN_VMASK \ (CANVAS_STYLE_TEXT_TOP | \ CANVAS_STYLE_TEXT_BOTTOM) //***************************************************************************** // //! Declares an initialized canvas 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 canvas. //! \param i32X is the X coordinate of the upper left corner of the canvas. //! \param i32Y is the Y coordinate of the upper left corner of the canvas. //! \param i32Width is the width of the canvas. //! \param i32Height is the height of the canvas. //! \param ui32Style is the style to be applied to the canvas. //! \param ui32FillColor is the color used to fill in the canvas. //! \param ui32OutlineColor is the color used to outline the canvas. //! \param ui32TextColor is the color used to draw text on the canvas. //! \param psFont is a pointer to the font to be used to draw text on the //! canvas. //! \param pcText is a pointer to the text to draw on this canvas. //! \param pui8Image is a pointer to the image to draw on this canvas. //! \param pfnOnPaint is a pointer to the application function to draw onto //! this canvas. //! //! This macro provides an initialized canvas 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 //! tCanvasWidget g_sCanvas = CanvasStruct(...); //! \endverbatim //! //! Or, in an array of variables: //! //! \verbatim //! tCanvasWidget g_psCanvas[] = //! { //! CanvasStruct(...), //! CanvasStruct(...) //! }; //! \endverbatim //! //! \e ui32Style is the logical OR of the following: //! //! - \b #CANVAS_STYLE_OUTLINE to indicate that the canvas should be outlined. //! - \b #CANVAS_STYLE_FILL to indicate that the canvas should be filled. //! - \b #CANVAS_STYLE_TEXT to indicate that the canvas should have text drawn //! on it (using \e psFont and \e pcText). //! - \b #CANVAS_STYLE_IMG to indicate that the canvas should have an image //! drawn on it (using \e pui8Image). //! - \b #CANVAS_STYLE_APP_DRAWN to indicate that the canvas should be drawn //! with the application-supplied drawing function (using \e pfnOnPaint). //! - \b #CANVAS_STYLE_TEXT_OPAQUE to indicate that the canvas text should be //! drawn opaque (in other words, drawing the background pixels). //! - \b #CANVAS_STYLE_TEXT_LEFT to indicate that the canvas text should be //! left aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_HCENTER to indicate that the canvas text should be //! horizontally centered within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_RIGHT to indicate that the canvas text should be //! right aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_TOP to indicate that the canvas text should be //! top aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_VCENTER to indicate that the canvas text should be //! vertically centered within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_BOTTOM to indicate that the canvas text should be //! bottom aligned within the widget bounding rectangle. //! //! \return Nothing; this is not a function. // //***************************************************************************** #define CanvasStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y, i32Width, \ i32Height, ui32Style, ui32FillColor, ui32OutlineColor, \ ui32TextColor, psFont, pcText, pui8Image, pfnOnPaint) \ { \ { \ sizeof(tCanvasWidget), \ (tWidget *)(psParent), \ (tWidget *)(psNext), \ (tWidget *)(psChild), \ psDisplay, \ { \ i32X, \ i32Y, \ (i32X) + (i32Width) - 1, \ (i32Y) + (i32Height) - 1 \ }, \ CanvasMsgProc \ }, \ ui32Style, \ ui32FillColor, \ ui32OutlineColor, \ ui32TextColor, \ psFont, \ pcText, \ pui8Image, \ pfnOnPaint \ } //***************************************************************************** // //! Declares an initialized variable containing a canvas 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 canvas. //! \param i32X is the X coordinate of the upper left corner of the canvas. //! \param i32Y is the Y coordinate of the upper left corner of the canvas. //! \param i32Width is the width of the canvas. //! \param i32Height is the height of the canvas. //! \param ui32Style is the style to be applied to the canvas. //! \param ui32FillColor is the color used to fill in the canvas. //! \param ui32OutlineColor is the color used to outline the canvas. //! \param ui32TextColor is the color used to draw text on the canvas. //! \param psFont is a pointer to the font to be used to draw text on the //! canvas. //! \param pcText is a pointer to the text to draw on this canvas. //! \param pui8Image is a pointer to the image to draw on this canvas. //! \param pfnOnPaint is a pointer to the application function to draw onto //! this canvas. //! //! This macro declares a variable containing an initialized canvas 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 #CANVAS_STYLE_OUTLINE to indicate that the canvas should be outlined. //! - \b #CANVAS_STYLE_FILL to indicate that the canvas should be filled. //! - \b #CANVAS_STYLE_TEXT to indicate that the canvas should have text drawn //! on it (using \e psFont and \e pcText). //! - \b #CANVAS_STYLE_IMG to indicate that the canvas should have an image //! drawn on it (using \e pui8Image). //! - \b #CANVAS_STYLE_APP_DRAWN to indicate that the canvas should be drawn //! with the application-supplied drawing function (using \e pfnOnPaint). //! - \b #CANVAS_STYLE_TEXT_OPAQUE to indicate that the canvas text should be //! drawn opaque (in other words, drawing the background pixels). //! - \b #CANVAS_STYLE_TEXT_LEFT to indicate that the canvas text should be //! left aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_HCENTER to indicate that the canvas text should be //! horizontally centered within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_RIGHT to indicate that the canvas text should be //! right aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_TOP to indicate that the canvas text should be //! top aligned within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_VCENTER to indicate that the canvas text should be //! vertically centered within the widget bounding rectangle. //! - \b #CANVAS_STYLE_TEXT_BOTTOM to indicate that the canvas text should be //! bottom aligned within the widget bounding rectangle. //! //! \return Nothing; this is not a function. // //***************************************************************************** #define Canvas(sName, psParent, psNext, psChild, psDisplay, i32X, i32Y, i32Width,\ i32Height, ui32Style, ui32FillColor, ui32OutlineColor, \ ui32TextColor, psFont, pcText, pui8Image, pfnOnPaint) \ tCanvasWidget sName = \ CanvasStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y, \ i32Width, i32Height, ui32Style, ui32FillColor, \ ui32OutlineColor, ui32TextColor, psFont, pcText, \ pui8Image, pfnOnPaint) //***************************************************************************** // //! Disables application drawing of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the use of the application callback to draw on a //! canvas widget. The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasAppDrawnOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_APP_DRAWN); \ } \ while(0) //***************************************************************************** // //! Enables application drawing of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the use of the application callback to draw on a //! canvas widget. The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasAppDrawnOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_APP_DRAWN; \ } \ while(0) //***************************************************************************** // //! Sets the function to call when this canvas widget is drawn. //! //! \param psWidget is a pointer to the canvas widget to modify. //! \param pfnOnPnt is a pointer to the function to call. //! //! This function sets the function to be called when this canvas is drawn and //! \b CANVAS_STYLE_APP_DRAWN is selected. //! //! \return None. // //***************************************************************************** #define CanvasCallbackSet(psWidget, pfnOnPnt) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->pfnOnPaint = pfnOnPnt; \ } \ while(0) //***************************************************************************** // //! Sets the fill color of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to be modified. //! \param ui32Color is the 24-bit RGB color to use to fill the canvas. //! //! This function changes the color used to fill the canvas on the display. //! The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasFillColorSet(psWidget, ui32Color) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32FillColor = ui32Color; \ } \ while(0) //***************************************************************************** // //! Disables filling of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the filling of a canvas widget. The display is not //! updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasFillOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_FILL); \ } \ while(0) //***************************************************************************** // //! Enables filling of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the filling of a canvas widget. The display is not //! updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasFillOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_FILL; \ } \ while(0) //***************************************************************************** // //! Sets the font for a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! \param pFnt is a pointer to the font to use to draw text on the canvas. //! //! This function changes the font used to draw text on the canvas. The //! display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasFontSet(psWidget, pFnt) \ do \ { \ tCanvasWidget *pW = psWidget; \ const tFont *pF = pFnt; \ pW->psFont = pF; \ } \ while(0) //***************************************************************************** // //! Changes the image drawn on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to be modified. //! \param pImg is a pointer to the image to draw onto the canvas. //! //! This function changes the image that is drawn onto the canvas. The display //! is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasImageSet(psWidget, pImg) \ do \ { \ tCanvasWidget *pW = psWidget; \ const uint8_t *pI = pImg; \ pW->pui8Image = pI; \ } \ while(0) //***************************************************************************** // //! Disables the image on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the drawing of an image on a canvas widget. The //! display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasImageOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_IMG); \ } \ while(0) //***************************************************************************** // //! Enables the image on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the drawing of an image on a canvas widget. The //! display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasImageOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_IMG; \ } \ while(0) //***************************************************************************** // //! Sets the outline color of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to be modified. //! \param ui32Color is the 24-bit RGB color to use to outline the canvas. //! //! This function changes the color used to outline the canvas on the display. //! The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasOutlineColorSet(psWidget, ui32Color) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32OutlineColor = ui32Color; \ } \ while(0) //***************************************************************************** // //! Disables outlining of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the outlining of a canvas widget. The display is //! not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasOutlineOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_OUTLINE); \ } \ while(0) //***************************************************************************** // //! Enables outlining of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the outlining of a canvas widget. The display is not //! updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasOutlineOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_OUTLINE; \ } \ while(0) //***************************************************************************** // //! Sets the text color of a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to be modified. //! \param ui32Color is the 24-bit RGB color to use to draw text on the canvas. //! //! This function changes the color used to draw text on the canvas on the //! display. The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasTextColorSet(psWidget, ui32Color) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32TextColor = ui32Color; \ } \ while(0) //***************************************************************************** // //! Disables the text on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the drawing of text on a canvas widget. The display //! is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasTextOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_TEXT); \ } \ while(0) //***************************************************************************** // //! Enables the text on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the drawing of text on a canvas widget. The display //! is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasTextOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_TEXT; \ } \ while(0) //***************************************************************************** // //! Disables opaque text on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function disables the use of opaque text on this canvas. When not //! using opaque text, only the foreground pixels of the text are drawn on the //! screen, allowing the previously drawn pixels (such as the canvas image) to //! show through the text. //! //! \return None. // //***************************************************************************** #define CanvasTextOpaqueOff(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~(CANVAS_STYLE_TEXT_OPAQUE); \ } \ while(0) //***************************************************************************** // //! Enables opaque text on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! //! This function enables the use of opaque text on this canvas. When using //! opaque text, both the foreground and background pixels of the text //! are drawn on the screen, blocking out the previously drawn pixels. //! //! \return None. // //***************************************************************************** #define CanvasTextOpaqueOn(psWidget) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style |= CANVAS_STYLE_TEXT_OPAQUE; \ } \ while(0) //***************************************************************************** // //! Sets the text alignment for a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to modify. //! \param ui32Align contains the required text alignment setting. This is a //! logical OR of style values \b #CANVAS_STYLE_TEXT_LEFT, \b //! #CANVAS_STYLE_TEXT_RIGHT, \b #CANVAS_STYLE_TEXT_HCENTER, //! \b #CANVAS_STYLE_TEXT_VCENTER, \b #CANVAS_STYLE_TEXT_TOP and //! \b #CANVAS_STYLE_TEXT_BOTTOM. //! //! This function sets the alignment of the text drawn inside the widget. //! Independent alignment options for horizontal and vertical placement allow //! the text to be positioned in one of 9 positions within the boinding box //! of the widget. The display is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasTextAlignment(psWidget, ui32Align) \ do \ { \ tCanvasWidget *pW = psWidget; \ pW->ui32Style &= ~CANVAS_STYLE_ALIGN_MASK; \ pW->ui32Style |= ((ui32Align) & CANVAS_STYLE_ALIGN_MASK); \ } \ while(0) //***************************************************************************** // //! Changes the text drawn on a canvas widget. //! //! \param psWidget is a pointer to the canvas widget to be modified. //! \param pcTxt is a pointer to the text to draw onto the canvas. //! //! This function changes the text that is drawn onto the canvas. The display //! is not updated until the next paint request. //! //! \return None. // //***************************************************************************** #define CanvasTextSet(psWidget, pcTxt) \ do \ { \ tCanvasWidget *pW = psWidget; \ const char *pcT = pcTxt; \ pW->pcText = pcT; \ } \ while(0) //***************************************************************************** // // Prototypes for the canvas widget APIs. // //***************************************************************************** extern int32_t CanvasMsgProc(tWidget *psWidget, uint32_t ui32Msg, uint32_t ui32Param1, uint32_t ui32Param2); extern void CanvasInit(tCanvasWidget *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 // __CANVAS_H__