/* ----------------------------------------------------------------------------
|
* SAM Software Package License
|
* ----------------------------------------------------------------------------
|
* Copyright (c) 2011, 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.
|
* ----------------------------------------------------------------------------
|
*/
|
|
/**
|
* \file
|
*
|
* Implementation of draw function on LCD, Include draw text, image
|
* and basic shapes (line, rectangle, circle).
|
*
|
*/
|
|
/*----------------------------------------------------------------------------
|
* Headers
|
*----------------------------------------------------------------------------*/
|
|
#include <stdint.h>
|
#include <string.h>
|
#include <assert.h>
|
#include "lcd_font.h"
|
#include "lcd_r61509v.h"
|
#include "lcd_draw.h"
|
|
/*----------------------------------------------------------------------------
|
* Exported functions
|
*----------------------------------------------------------------------------*/
|
|
/**
|
* \brief Fills the given LCD buffer with a particular color.
|
*
|
* \param color Fill color.
|
*/
|
void LCDD_Fill( uint32_t dwColor )
|
{
|
uint32_t i ;
|
|
LCD_SetCursor( 150, 150 ) ;
|
LCD_WriteRAM_Prepare() ;
|
|
for ( i=BOARD_LCD_WIDTH*BOARD_LCD_HEIGHT; i>0; i-- )
|
{
|
LCD_WriteRAM( dwColor ) ;
|
}
|
}
|
|
/**
|
* \brief Draw a pixel on LCD of given color.
|
*
|
* \param x X-coordinate of pixel.
|
* \param y Y-coordinate of pixel.
|
* \param color Pixel color.
|
*/
|
extern void LCDD_DrawPixel( uint32_t x, uint32_t y, uint32_t color )
|
{
|
LCD_SetCursor( x, y ) ;
|
LCD_WriteRAM_Prepare() ;
|
LCD_WriteRAM( color ) ;
|
}
|
|
/**
|
* \brief Read a pixel from LCD.
|
*
|
* \param x X-coordinate of pixel.
|
* \param y Y-coordinate of pixel.
|
*
|
* \return color Readed pixel color.
|
*/
|
extern uint32_t LCDD_ReadPixel( uint32_t x, uint32_t y )
|
{
|
uint32_t color;
|
|
LCD_SetCursor(x, y);
|
LCD_ReadRAM_Prepare();
|
color = LCD_ReadRAM();
|
|
return color;
|
}
|
|
/*
|
* \brief Draw a line on LCD, horizontal and vertical line are supported.
|
*
|
* \param x X-coordinate of line start.
|
* \param y Y-coordinate of line start.
|
* \param length line length.
|
* \param direction line direction: 0 - horizontal, 1 - vertical.
|
* \param color Pixel color.
|
*/
|
extern void LCDD_DrawLine( uint32_t x, uint32_t y, uint32_t length, uint32_t direction, uint32_t color )
|
{
|
uint32_t i = 0 ;
|
|
LCD_SetCursor( x, y ) ;
|
|
if ( direction == DIRECTION_HLINE )
|
{
|
LCD_WriteRAM_Prepare() ;
|
for ( i = 0; i < length; i++ )
|
{
|
LCD_WriteRAM( color ) ;
|
}
|
}
|
else
|
{
|
for ( i = 0; i < length; i++ )
|
{
|
LCD_WriteRAM_Prepare() ;
|
LCD_WriteRAM( color ) ;
|
y++ ;
|
LCD_SetCursor( x, y ) ;
|
}
|
}
|
}
|
|
/*
|
* \brief Draws a rectangle on LCD, at the given coordinates.
|
*
|
* \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.
|
*/
|
extern void LCDD_DrawRectangle( uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t color )
|
{
|
LCDD_DrawLine(x, y, width, DIRECTION_HLINE, color);
|
LCDD_DrawLine(x, (y + height), width, DIRECTION_HLINE, color);
|
|
LCDD_DrawLine(x, y, height, DIRECTION_VLINE, color);
|
LCDD_DrawLine((x + width), y, height, DIRECTION_VLINE, color);
|
}
|
|
/*
|
* \brief Draws a rectangle with fill inside on LCD, at the given coordinates.
|
*
|
* \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.
|
*/
|
extern void LCDD_DrawRectangleWithFill( uint32_t dwX, uint32_t dwY, uint32_t dwWidth, uint32_t dwHeight, uint32_t dwColor )
|
{
|
uint32_t i ;
|
|
LCD_SetWindow( dwX, dwY, dwWidth, dwHeight ) ;
|
LCD_SetCursor( dwX, dwY ) ;
|
LCD_WriteRAM_Prepare() ;
|
|
for ( i = dwWidth * dwHeight; i > 0; i-- )
|
{
|
LCD_WriteRAM( dwColor ) ;
|
}
|
LCD_SetWindow( 0, 0, BOARD_LCD_WIDTH, BOARD_LCD_HEIGHT ) ;
|
LCD_SetCursor( 0, 0 ) ;
|
}
|
|
/**
|
* \brief Draws a circle on LCD, at the given coordinates.
|
*
|
* \param x X-coordinate of circle center.
|
* \param y Y-coordinate of circle center.
|
* \param r circle radius.
|
* \param color circle color.
|
*/
|
extern void LCDD_DrawCircle( uint32_t x, uint32_t y, uint32_t r, uint32_t color )
|
{
|
signed int d; /* Decision Variable */
|
uint32_t curX; /* Current X Value */
|
uint32_t curY; /* Current Y Value */
|
|
d = 3 - (r << 1);
|
curX = 0;
|
curY = r;
|
|
while (curX <= curY)
|
{
|
LCDD_DrawPixel(x + curX, y + curY, color);
|
LCDD_DrawPixel(x + curX, y - curY, color);
|
LCDD_DrawPixel(x - curX, y + curY, color);
|
LCDD_DrawPixel(x - curX, y - curY, color);
|
LCDD_DrawPixel(x + curY, y + curX, color);
|
LCDD_DrawPixel(x + curY, y - curX, color);
|
LCDD_DrawPixel(x - curY, y + curX, color);
|
LCDD_DrawPixel(x - curY, y - curX, color);
|
|
if (d < 0) {
|
d += (curX << 2) + 6;
|
}
|
else {
|
d += ((curX - curY) << 2) + 10;
|
curY--;
|
}
|
curX++;
|
}
|
}
|
|
/**
|
* \brief Draws a string inside a LCD buffer, at the given coordinates. Line breaks
|
* will be honored.
|
*
|
* \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.
|
*/
|
extern void LCDD_DrawString( uint32_t x, uint32_t y, const uint8_t *pString, uint32_t color )
|
{
|
uint32_t xorg = x ;
|
|
while ( *pString != 0 && *pString > 0x1F && *pString < 0x7F)
|
{
|
LCDD_DrawChar( x, y, *pString, color ) ;
|
if ( *pString == '\n' || x > 220)
|
{
|
y += gFont.height + 2 ;
|
x = xorg ;
|
}
|
else
|
{
|
x += gFont.width + 2 ;
|
}
|
|
pString++ ;
|
}
|
}
|
|
/**
|
* \brief Draws a string inside a LCD buffer, at the given coordinates
|
* with given background color. Line breaks will be honored.
|
*
|
* \param x X-coordinate of string top-left corner.
|
* \param y Y-coordinate of string top-left corner.
|
* \param pString String to display.
|
* \param fontColor String color.
|
* \param bgColor Background color.
|
*/
|
extern void LCDD_DrawStringWithBGColor( uint32_t x, uint32_t y, const char *pString, uint32_t fontColor, uint32_t bgColor )
|
{
|
unsigned xorg = x;
|
|
while ( *pString != 0 )
|
{
|
if ( *pString == '\n' )
|
{
|
y += gFont.height + 2 ;
|
x = xorg ;
|
}
|
else
|
{
|
LCDD_DrawCharWithBGColor( x, y, *pString, fontColor, bgColor ) ;
|
x += gFont.width + 2;
|
}
|
|
pString++;
|
}
|
}
|
|
/**
|
* \brief 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.
|
*/
|
extern void LCDD_GetStringSize( const uint8_t *pString, uint32_t *pWidth, uint32_t *pHeight )
|
{
|
uint32_t width = 0;
|
uint32_t 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 != NULL )
|
{
|
*pWidth = width;
|
}
|
|
if ( pHeight != NULL )
|
{
|
*pHeight = height ;
|
}
|
}
|
|
/*
|
* \brief Draw a raw image at given position on LCD.
|
*
|
* \param x X-coordinate of image start.
|
* \param y Y-coordinate of image start.
|
* \param pImage Image buffer.
|
* \param width Image width.
|
* \param height Image height.
|
*/
|
void LCDD_DrawImage( uint32_t dwX, uint32_t dwY, const uint8_t *pImage, uint32_t dwWidth, uint32_t dwHeight )
|
{
|
uint32_t dwCursor ;
|
|
LCD_SetWindow( dwX, dwY, dwWidth, dwHeight ) ;
|
LCD_SetCursor( dwX, dwY ) ;
|
LCD_WriteRAM_Prepare() ;
|
|
for ( dwCursor=dwWidth*dwHeight; dwCursor != 0; dwCursor-- )
|
{
|
LCD_D() = *pImage++ ;
|
LCD_D() = *pImage++ ;
|
LCD_D() = *pImage++ ;
|
}
|
|
LCD_SetWindow( 0, 0, BOARD_LCD_WIDTH, BOARD_LCD_HEIGHT ) ;
|
}
|
|
/*
|
* \brief Draw a raw image at given position on LCD.
|
*
|
* \param dwX X-coordinate of image start.
|
* \param dwY Y-coordinate of image start.
|
* \param pGIMPImage Image data.
|
*/
|
void LCDD_DrawGIMPImage( uint32_t dwX, uint32_t dwY, const SGIMPImage* pGIMPImage )
|
{
|
uint32_t dw ;
|
register uint32_t dwLength ;
|
uint8_t* pucData ;
|
|
// Draw raw RGB bitmap
|
LCD_SetWindow( dwX, dwY, pGIMPImage->dwWidth, pGIMPImage->dwHeight ) ;
|
LCD_SetCursor( dwX, dwY ) ;
|
|
LCD_WriteRAM_Prepare() ;
|
|
dwLength = pGIMPImage->dwWidth*pGIMPImage->dwHeight ;
|
pucData = pGIMPImage->pucPixel_data ;
|
for ( dw=0; dw < dwLength; dw++ )
|
{
|
LCD_D() = (*pucData++) ;
|
LCD_D() = (*pucData++) ;
|
LCD_D() = (*pucData++) ;
|
}
|
|
LCD_SetWindow( 0, 0, BOARD_LCD_WIDTH, BOARD_LCD_HEIGHT ) ;
|
}
|
|
/*
|
* \brief Clear a window with an color.
|
*
|
* \param dwX X-coordinate of the window.
|
* \param dwY Y-coordinate of the window.
|
* \param dwWidth window width.
|
* \param dwHeight window height.
|
* \param dwColor background color
|
*/
|
extern void LCDD_ClearWindow( uint32_t dwX, uint32_t dwY, uint32_t dwWidth, uint32_t dwHeight, uint32_t dwColor )
|
{
|
uint32_t dw ;
|
|
LCD_SetCursor( dwX, dwY) ;
|
LCD_WriteRAM_Prepare() ;
|
|
for ( dw = dwWidth * dwHeight; dw > 0; dw-- )
|
{
|
LCD_WriteRAM( dwColor ) ;
|
}
|
}
|