278 lines
6.7 KiB
C
Raw Normal View History

2021-08-04 10:46:24 +08:00
#include "sys.h"
#include "lcd.h"
#include "GameEngine.h"
#include "GE_Draw.h"
/**************************************** ˽<>к<EFBFBD><D0BA><EFBFBD> ****************************************/
void GE_Draw_SetWinAbs(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end);
void GE_Draw_SetWin(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
/*****************************************************************************************/
_ge_draw_set_private ge_draw_set_private;
_ge_draw_pic_set ge_draw_pic_set;
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> GE_Draw
*/
void GE_Draw_Init(void)
{
//˽<>б<EFBFBD><D0B1><EFBFBD>
ge_draw_set_private.x_start = 0;
ge_draw_set_private.y_start = 0;
ge_draw_set_private.x_end = LCD_WIDTH - 1;
ge_draw_set_private.y_end = LCD_HEIGHT - 1;
//<2F><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
ge_draw_pic_set.is_reverse = FALSE;
ge_draw_pic_set.pos_mode = UP_LEFT;
}
/**
* @brief ʹ<EFBFBD>þ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>
* @param x_start: 0~319
* @param y_start: 0~239<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x_end: 0~319
* @param y_end: 0~239<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GE_Draw_SetWinAbs(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end)
{
if (x_end == ge_draw_set_private.x_end && y_end == ge_draw_set_private.y_end)
{
if (x_start == ge_draw_set_private.x_start && y_start == ge_draw_set_private.y_start)
{
return;
}
else
{
ge_draw_set_private.x_start = x_start;
ge_draw_set_private.y_start = y_start;
LCD_SendCmdData16Bits(LCD_CMD_CASET, x_start);
LCD_SendCmdData16Bits(LCD_CMD_PASET, y_start);
}
}
else
{
ge_draw_set_private.x_start = x_start;
ge_draw_set_private.y_start = y_start;
ge_draw_set_private.x_end = x_end;
ge_draw_set_private.y_end = y_end;
LCD_SendCmdData32Bits(LCD_CMD_CASET, (x_start << 16) | x_end);
LCD_SendCmdData32Bits(LCD_CMD_PASET, (y_start << 16) | y_end);
}
}
/**
* @brief ʹ<EFBFBD>ô<EFBFBD><EFBFBD>ڴ<EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>
* @param x: 0~319
* @param y: 0~239<EFBFBD><EFBFBD>x y Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param width: <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
* @param height: <EFBFBD><EFBFBD><EFBFBD>ڸ߶ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
*/
void GE_Draw_SetWin(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
{
GE_Draw_SetWinAbs(x, y, x + width - 1, y + height - 1);
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_ClrAll(uint16_t color)
{
GE_Draw_Fill(0, 0, LCD_WIDTH, LCD_HEIGHT, color);
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȽ<EFBFBD><EFBFBD><EFBFBD>
* @param x: 0~319
* @param y: 0~239
* @param width: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_Fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
{
GE_Draw_SetWin(x, y, width, height);
uint32_t data16_count = width * height;
LCD_RAM_Wr;
LCD_Data_Mode_On;
for (uint32_t i = 0; i < data16_count; i++)
SPI2_Write16Bits(color);
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD>ĵ<EFBFBD>
* @param x: 0~319
* @param y: 0~239
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_Point(uint16_t x, uint16_t y, uint16_t color)
{
if (x < 0 || x > LCD_WIDTH - 1 || y < 0 || y > LCD_HEIGHT - 1)
return;
GE_Draw_SetWinAbs(x, y, LCD_WIDTH - 1, LCD_HEIGHT - 1);
LCD_SendCmdData16Bits(LCD_CMD_RAMWR, color);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x1: 0~319
* @param y1: 0~239
* @param x2: 0~319
* @param y3: 0~239
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_Line(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color)
{
//ʹ<><CAB9> Bresenham <20>
int16_t dx = abs(x1 - x0);
int8_t sx = x0 < x1 ? 1 : -1;
int16_t dy = -abs(y1 - y0);
int8_t sy = y0 < y1 ? 1 : -1;
int16_t err = dx + dy, e2;
while (1)
{
GE_Draw_Point(x0, y0, color);
if (x0 == x1 && y0 == y1)
break;
e2 = 2 * err;
if (e2 >= dy)
{
err += dy;
x0 += sx;
}
if (e2 <= dx)
{
err += dx;
y0 += sy;
}
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><EFBFBD>α߿<EFBFBD>
* @param x: 0~319
* @param y: 0~239
* @param width: <EFBFBD><EFBFBD><EFBFBD>εĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>εĸ<EFBFBD>
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_Rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
{
uint16_t i;
for (i = 0; i < width; i++)
{
GE_Draw_Point(x + i, y, color);
GE_Draw_Point(x + i, y + height - 1, color);
}
for (i = 0; i < height; i++)
{
GE_Draw_Point(x, y + i, color);
GE_Draw_Point(x + width - 1, y + i, color);
}
}
/**
* @brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ
* @param xm: 0~319
* @param ym: 0~239
* @param r: Բ<EFBFBD>İ
* @param color: <EFBFBD><EFBFBD>ɫ
*/
void GE_Draw_Circle(uint16_t xm, uint16_t ym, uint16_t r, uint16_t color)
{
int16_t x = -r, y = 0, err = 2 - 2 * r, rm = r;
do
{
GE_Draw_Point(xm - x, ym + y, color);
GE_Draw_Point(xm - y, ym - x, color);
GE_Draw_Point(xm + x, ym - y, color);
GE_Draw_Point(xm + y, ym + x, color);
rm = err;
if (rm > x)
err += ++x * 2 + 1;
if (rm <= y)
err += ++y * 2 + 1;
} while (x < 0);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD>ͼƬΪ const unsigned char <EFBFBD><EFBFBD><EFBFBD>4096 ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>ͷ
* @param x: 0~319
* @param y: 0~239
* @param is_reverse: TRUE Ϊ<EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫģʽ<EFBFBD><EFBFBD>ˢ<EFBFBD>½<EFBFBD><EFBFBD><EFBFBD>
* @param pos_mode: UP_LEFT Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻǿ<EFBFBD>ʼ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>MID Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
* @param pic: ָ<EFBFBD><EFBFBD>ͼƬ
* @param width: ͼƬ<EFBFBD>Ŀ<EFBFBD>
* @param height: ͼƬ<EFBFBD>ĸ<EFBFBD>
*/
void GE_Draw_Pic(
uint16_t x,
uint16_t y,
uint8_t is_reverse,
uint8_t pos_mode,
const unsigned char *pic,
uint16_t width,
uint16_t height)
{
if (pos_mode == UP_LEFT)
GE_Draw_SetWin(x, y, width, height);
else
GE_Draw_SetWin(x - width / 2, y - height / 2, width, height);
if (is_reverse == TRUE) //<2F><>ɫģʽ
{
uint16_t data16_temp;
uint32_t data8_count = width * height * 2;
LCD_RAM_Wr;
LCD_Data_Mode_On;
for (uint32_t i = 0; i < data8_count; i += 2)
{
data16_temp = 0xffff - (((uint16_t)pic[i] << 8) | pic[i + 1]); //<2F><>ɫ
SPI2_Write16Bits(data16_temp);
}
}
else //<2F>Ƿ<EFBFBD>ɫģʽ
{
LCD_SendCmdDataBytes(LCD_CMD_RAMWR, (uint8_t *)pic, width * height * 2);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param x: 0~319
* @param y: 0~239
* @param pic: ָ<EFBFBD><EFBFBD>ͼƬ
* @param width: ͼƬ<EFBFBD>Ŀ<EFBFBD>
* @param height: ͼƬ<EFBFBD>ĸ<EFBFBD>
*/
void GE_Draw_Pic_WithSet(uint16_t x, uint16_t y, const unsigned char *pic, uint16_t width, uint16_t height)
{
GE_Draw_Pic(
x,
y,
ge_draw_pic_set.is_reverse,
ge_draw_pic_set.pos_mode,
pic,
width,
height);
}