PocketEmpires/Gfx.cpp

171 lines
4.0 KiB
C++

/* *************************************
* Includes
* *************************************/
#include "Gfx.h"
/* *************************************
* Defines
* *************************************/
/* *************************************
* Structs and enums
* *************************************/
/* *************************************
* Local variables
* *************************************/
static bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h);
void GfxInit(void)
{
gb.display.persistence = true; /* Clears screen automatically. */
}
void GfxDrawSprite(TYPE_SPRITE* ptrSprite)
{
if (ptrSprite == NULL)
{
return;
}
if (GfxIsSpriteInsideScreenArea(ptrSprite) != false)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(ptrSprite->color, GFX_WHITE);
gb.display.drawBitmap( ptrSprite->x,
ptrSprite->y,
ptrSprite->Data,
ptrSprite->rotation,
ptrSprite->flip );
gb.display.setColor(orig_color);
}
}
bool GfxRefreshNeeded(void)
{
return gb.update();
}
void GfxShowKeyboard(char* str, uint8_t length)
{
gb.keyboard(str, length);
}
bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h)
{
if ( ( (x + w) >= 0)
&&
(x < X_SCREEN_RESOLUTION)
&&
( (y + h) >= 0)
&&
(y < Y_SCREEN_RESOLUTION) )
{
return true;
}
return false;
}
bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE* spr)
{
return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h);
}
uint8_t GfxGetWidthFromSpriteData(const uint8_t* sprData)
{
/* On Gamebuino bitmaps, width is always stored on first byte.. */
return pgm_read_byte_near(&sprData[0]);
}
uint8_t GfxGetHeightFromSpriteData(const uint8_t* sprData)
{
/* On Gamebuino bitmaps, height is always stored on second byte.. */
return pgm_read_byte_near(&sprData[1]);
}
void GfxPrintText_Flash(const __FlashStringHelper * str)
{
gb.popup(str, 20 * 3 /* 3 seconds */);
}
void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y)
{
uint8_t* orig_font = gb.display.getFont();
gb.display.cursorX = x;
gb.display.cursorY = y;
gb.display.setFont(font);
gb.display.setColor(GFX_BLACK, GFX_WHITE);
gb.display.print(str);
if (orig_font != NULL)
{
gb.display.setFont(orig_font);
}
}
void GfxPrintText(const char* str, uint8_t x, uint8_t y)
{
GfxPrintTextFont(str, font3x5, x, y);
}
void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, radius, radius) != false)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.drawCircle(x, y, radius);
gb.display.setColor(orig_color);
}
}
void GfxDrawFillCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, radius, radius) != false)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.fillCircle(x, y, radius);
gb.display.setColor(orig_color);
}
}
void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, w, h) != false)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.drawRect(x, y, w, h);
gb.display.setColor(orig_color);
}
}
void GfxDrawLine(uint8_t x0, uint8_t x1, uint8_t y0, uint8_t y1, uint8_t color)
{
gb.display.setColor(color);
gb.display.drawLine(x0, y0, x1, y1);
}
void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, w, h) != false)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.fillRect(x, y, w, h);
gb.display.setColor(orig_color);
}
}