| /* ---------------------------------------------------------------------------- | |
| * ATMEL Microcontroller Software Support | |
| * ---------------------------------------------------------------------------- | |
| * Copyright (c) 2008, Atmel Corporation | |
| * | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the disclaimer below. | |
| * | |
| * Atmel's name may not be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR | |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | |
| * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, | |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | |
| * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
| * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * ---------------------------------------------------------------------------- | |
| */ | |
| //------------------------------------------------------------------------------ | |
| // Headers | |
| //------------------------------------------------------------------------------ | |
| #include "draw.h" | |
| #include "font.h" | |
| #include <board.h> | |
| #include <utility/assert.h> | |
| #include <hx8347/hx8347.h> | |
| #include <string.h> | |
| //------------------------------------------------------------------------------ | |
| // Global functions | |
| //------------------------------------------------------------------------------ | |
| //------------------------------------------------------------------------------ | |
| /// Fills the given LCD buffer with a particular color. | |
| /// Only works in 24-bits packed mode for now. | |
| /// \param pBuffer LCD buffer to fill. | |
| /// \param color Fill color. | |
| //------------------------------------------------------------------------------ | |
| void LCDD_Fill(void *pBuffer, unsigned int color) | |
| { | |
| unsigned int i; | |
| unsigned short color16 = RGB24ToRGB16(color); | |
| LCD_SetCursor((void *)BOARD_LCD_BASE, 0, 0); | |
| LCD_WriteRAM_Prepare((void *)BOARD_LCD_BASE); | |
| for (i = 0; i < (BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT); i++) { | |
| LCD_WriteRAM((void *)BOARD_LCD_BASE, color16); | |
| } | |
| } | |
| //------------------------------------------------------------------------------ | |
| /// Sets the specified pixel to the given color. | |
| /// !!! Only works in 24-bits packed mode for now. !!! | |
| /// \param pBuffer LCD buffer to draw on. | |
| /// \param x X-coordinate of pixel. | |
| /// \param y Y-coordinate of pixel. | |
| /// \param color Pixel color. | |
| //------------------------------------------------------------------------------ | |
| void LCDD_DrawPixel( | |
| void *pBuffer, | |
| unsigned int x, | |
| unsigned int y, | |
| unsigned int color) | |
| { | |
| unsigned short color16 = RGB24ToRGB16(color); | |
| LCD_SetCursor(pBuffer, x, y); | |
| LCD_WriteRAM_Prepare(pBuffer); | |
| LCD_WriteRAM(pBuffer, color16); | |
| } | |
| //------------------------------------------------------------------------------ | |
| /// Draws a rectangle inside a LCD buffer, at the given coordinates. | |
| /// \param pBuffer LCD buffer to draw on. | |
| /// \param x X-coordinate of upper-left rectangle corner. | |
| /// \param y Y-coordinate of upper-left rectangle corner. | |
| /// \param width Rectangle width in pixels. | |
| /// \param height Rectangle height in pixels. | |
| /// \param color Rectangle color. | |
| //------------------------------------------------------------------------------ | |
| void LCDD_DrawRectangle( | |
| void *pBuffer, | |
| unsigned int x, | |
| unsigned int y, | |
| unsigned int width, | |
| unsigned int height, | |
| unsigned int color) | |
| { | |
| unsigned int rx, ry; | |
| for (ry=0; ry < height; ry++) { | |
| for (rx=0; rx < width; rx++) { | |
| LCDD_DrawPixel(pBuffer, x+rx, y+ry, color); | |
| } | |
| } | |
| } | |
| //------------------------------------------------------------------------------ | |
| /// Draws a string inside a LCD buffer, at the given coordinates. Line breaks | |
| /// will be honored. | |
| /// \param pBuffer Buffer to draw on. | |
| /// \param x X-coordinate of string top-left corner. | |
| /// \param y Y-coordinate of string top-left corner. | |
| /// \param pString String to display. | |
| /// \param color String color. | |
| //------------------------------------------------------------------------------ | |
| void LCDD_DrawString( | |
| void *pBuffer, | |
| unsigned int x, | |
| unsigned int y, | |
| const char *pString, | |
| unsigned int color) | |
| { | |
| unsigned xorg = x; | |
| while (*pString != 0) { | |
| if (*pString == '\n') { | |
| y += gFont.height + 2; | |
| x = xorg; | |
| } | |
| else { | |
| LCDD_DrawChar(pBuffer, x, y, *pString, color); | |
| x += gFont.width + 2; | |
| } | |
| pString++; | |
| } | |
| } | |
| //------------------------------------------------------------------------------ | |
| /// Returns the width & height in pixels that a string will occupy on the screen | |
| /// if drawn using LCDD_DrawString. | |
| /// \param pString String. | |
| /// \param pWidth Pointer for storing the string width (optional). | |
| /// \param pHeight Pointer for storing the string height (optional). | |
| /// \return String width in pixels. | |
| //------------------------------------------------------------------------------ | |
| void LCDD_GetStringSize( | |
| const char *pString, | |
| unsigned int *pWidth, | |
| unsigned int *pHeight) | |
| { | |
| unsigned int width = 0; | |
| unsigned int height = gFont.height; | |
| while (*pString != 0) { | |
| if (*pString == '\n') { | |
| height += gFont.height + 2; | |
| } | |
| else { | |
| width += gFont.width + 2; | |
| } | |
| pString++; | |
| } | |
| if (width > 0) width -= 2; | |
| if (pWidth) *pWidth = width; | |
| if (pHeight) *pHeight = height; | |
| } |