graphics_rgb565.c: small refactoring. Linux-demo: moved from display interface to graphics interface

This commit is contained in:
Federico Amedeo Izzo 2020-10-09 12:47:30 +02:00 committed by Niccolò Izzo
parent 94bece00c0
commit 52b4718deb
3 changed files with 36 additions and 51 deletions

View File

@ -128,6 +128,11 @@ void graphics_render();
*/ */
bool graphics_renderingInProgress(); bool graphics_renderingInProgress();
/**
* Makes the screen black.
*/
void graphics_clearScreen();
/** /**
* Fills screen with the specified color. * Fills screen with the specified color.
* @param color: border and fill color, in color_t format. * @param color: border and fill color, in color_t format.

View File

@ -23,6 +23,9 @@
#include "display.h" #include "display.h"
#include "graphics.h" #include "graphics.h"
#include <string.h>
#define COLOR_WHITE = {31, 63, 31}
typedef struct rgb565_t typedef struct rgb565_t
{ {
@ -33,7 +36,7 @@ typedef struct rgb565_t
bool initialized = 0; bool initialized = 0;
uint16_t screen_width = 0; uint16_t screen_width = 0;
uint16_t screen_heigth = 0; uint16_t screen_height = 0;
rgb565_t *buf; rgb565_t *buf;
void graphics_init() void graphics_init()
@ -41,7 +44,7 @@ void graphics_init()
display_init(); display_init();
// Set global variables and framebuffer pointer // Set global variables and framebuffer pointer
screen_width = graphics_screenWidth(); screen_width = graphics_screenWidth();
screen_heigth = graphics_screenHeight(); screen_height = graphics_screenHeight();
buf = (rgb565_t *)(display_getFrameBuffer()); buf = (rgb565_t *)(display_getFrameBuffer());
initialized = 1; initialized = 1;
} }
@ -82,7 +85,7 @@ bool graphics_renderingInProgress()
return display_renderingInProgress(); return display_renderingInProgress();
} }
rgb565_t true2highColor(color_t true_color) rgb565_t _true2highColor(color_t true_color)
{ {
uint8_t high_r = true_color.r >> 3; uint8_t high_r = true_color.r >> 3;
uint8_t high_g = true_color.g >> 2; uint8_t high_g = true_color.g >> 2;
@ -91,12 +94,20 @@ rgb565_t true2highColor(color_t true_color)
return high_color; return high_color;
} }
void graphics_clearScreen()
{
if(!initialized)
return;
// Set the whole framebuffer to 0x00 = make the screen black
memset(buf, 0x00, sizeof(rgb565_t) * screen_width * screen_height);
}
void graphics_fillScreen(color_t color) void graphics_fillScreen(color_t color)
{ {
if(!initialized) if(!initialized)
return; return;
rgb565_t color_565 = true2highColor(color); rgb565_t color_565 = _true2highColor(color);
for(int y=0; y < screen_heigth; y++) for(int y=0; y < screen_height; y++)
{ {
for(int x=0; x < screen_width; x++) for(int x=0; x < screen_width; x++)
{ {
@ -109,8 +120,8 @@ void graphics_drawLine(point_t start, point_t end, color_t color)
{ {
if(!initialized) if(!initialized)
return; return;
rgb565_t color_565 = true2highColor(color); rgb565_t color_565 = _true2highColor(color);
for(int y=0; y < screen_heigth; y++) for(int y=0; y < screen_height; y++)
{ {
for(int x=0; x < screen_width; x++) for(int x=0; x < screen_width; x++)
{ {
@ -123,13 +134,11 @@ void graphics_drawRect(point_t start, uint16_t width, uint16_t height, color_t c
{ {
if(!initialized) if(!initialized)
return; return;
rgb565_t color_565 = true2highColor(color); rgb565_t color_565 = _true2highColor(color);
uint16_t x_max = start.x + width; uint16_t x_max = start.x + width;
if(x_max > (screen_width - 1))
x_max = screen_width - 1;
uint16_t y_max = start.y + height; uint16_t y_max = start.y + height;
if(y_max > (screen_heigth - 1)) if(x_max > (screen_width - 1)) x_max = screen_width - 1;
y_max = screen_heigth - 1; if(y_max > (screen_height - 1)) y_max = screen_height - 1;
for(int y=start.y; y < y_max; y++) for(int y=start.y; y < y_max; y++)
{ {
for(int x=start.x; x < x_max; x++) for(int x=start.x; x < x_max; x++)

View File

@ -7,7 +7,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#undef main #undef main
#include "display.h" #include "graphics.h"
static OS_TCB App_TaskStartTCB; static OS_TCB App_TaskStartTCB;
static CPU_STK_SIZE App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE]; static CPU_STK_SIZE App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE];
@ -19,36 +19,6 @@ static void gfxThread(void *arg);
static int running = 0; static int running = 0;
void drawRect(int x, int y, int width, int height, uint16_t color)
{
int x_max = x + width;
int y_max = y + height;
if(x_max > display_screenWidth()) x_max = display_screenWidth();
if(y_max > display_screenHeight()) y_max = display_screenHeight();
uint16_t *buf = (uint16_t *)(display_getFrameBuffer());
for(int i=y; i < y_max; i++)
{
for(int j=x; j < x_max; j++)
{
buf[j + i*display_screenWidth()] = color;
}
}
}
void clearScreen()
{
uint16_t *buf = (uint16_t *)(display_getFrameBuffer());
for(int i=0; i < display_screenHeight(); i++)
{
for(int j=0; j < display_screenWidth(); j++)
{
buf[j + i*display_screenWidth()] = 0xFFFF;
}
}
}
int main (void) int main (void)
{ {
OS_ERR err; OS_ERR err;
@ -91,7 +61,6 @@ int main (void)
return 0; return 0;
} }
static void App_TaskStart(void *p_arg) static void App_TaskStart(void *p_arg)
{ {
@ -117,24 +86,26 @@ static void gfxThread(void *arg)
int pos = 0; int pos = 0;
SDL_Event eventListener; SDL_Event eventListener;
display_init(); graphics_init();
while(1) while(1)
{ {
SDL_PollEvent(&eventListener); SDL_PollEvent(&eventListener);
if(eventListener.type == SDL_QUIT) break; if(eventListener.type == SDL_QUIT) break;
clearScreen(); graphics_clearScreen();
drawRect(0, pos, display_screenWidth(), 20, 0xF800); point_t origin = {0, pos};
display_render(); color_t color_red = {255, 0, 0};
while(display_renderingInProgress()) ; graphics_drawRect(origin, display_screenWidth(), 20, color_red, 1);
graphics_render();
while(graphics_renderingInProgress()) ;
pos += 20; pos += 20;
if(pos > display_screenHeight() - 20) pos = 0; if(pos > graphics_screenHeight() - 20) pos = 0;
OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err); OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err);
} }
running = 0; running = 0;
OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err); OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err);
display_terminate(); graphics_terminate();
} }