implemented frame buffer primitives
This commit is contained in:
parent
cfc067786a
commit
7b1c8dd5bb
|
@ -1,4 +1,4 @@
|
|||
OBJS=main.o sysinput.o fbinit.o log.o gpio.o msg_queue.o time_func.o config.o splash.o
|
||||
OBJS=main.o sysinput.o fbinit.o fbprimitive.o log.o gpio.o msg_queue.o time_func.o config.o splash.o
|
||||
LIBS=-lbcm2835 -lpthread
|
||||
|
||||
upiwin: $(OBJS)
|
||||
|
|
113
src/fbprimitive.c
Normal file
113
src/fbprimitive.c
Normal file
|
@ -0,0 +1,113 @@
|
|||
#include "wintype.h"
|
||||
#include "fbinit.h"
|
||||
|
||||
inline static PUINT16 loc_from_coords(INT32 x, INT32 y)
|
||||
{
|
||||
return Fb_Ptr + (y * Fb_Info->width) + x;
|
||||
}
|
||||
|
||||
UINT16 Fb_setpixel(INT32 x, INT32 y, UINT16 color, BOOL xor)
|
||||
{
|
||||
UINT16 rc;
|
||||
PUINT16 loc = loc_from_coords(x, y);
|
||||
|
||||
rc = *loc;
|
||||
if (xor)
|
||||
*loc ^= color;
|
||||
else
|
||||
*loc = color;
|
||||
return rc;
|
||||
}
|
||||
|
||||
void Fb_line(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor)
|
||||
{
|
||||
INT32 tmp;
|
||||
INT32 dx = x2 - x1;
|
||||
INT32 dy = y2 - y1;
|
||||
|
||||
if (ABS(dx) < ABS(dy))
|
||||
{
|
||||
if (y1 > y2)
|
||||
{
|
||||
tmp = x1;
|
||||
x1 = x2;
|
||||
x2 = tmp;
|
||||
tmp = y1;
|
||||
y1 = y2;
|
||||
y2 = tmp;
|
||||
dx = -dx;
|
||||
dy = -dy;
|
||||
}
|
||||
x1 <<= 16;
|
||||
dx = (dx << 16) / dy;
|
||||
while (y1 <= y2)
|
||||
{
|
||||
Fb_setpixel(x1 >> 16, y1, color, xor);
|
||||
x1 += dx;
|
||||
y1++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (x1 > x2)
|
||||
{
|
||||
tmp = x1;
|
||||
x1 = x2;
|
||||
x2 = tmp;
|
||||
tmp = y1;
|
||||
y1 = y2;
|
||||
y2 = tmp;
|
||||
dx = -dx;
|
||||
dy = -dy;
|
||||
}
|
||||
y1 <<= 16;
|
||||
dy = dx ? (dy << 16) / dx : 0;
|
||||
while (x1 <= x2)
|
||||
{
|
||||
Fb_setpixel(x1, y1 >> 16, color, xor);
|
||||
y1 += dy;
|
||||
x1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Fb_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor)
|
||||
{
|
||||
FB_line(x1, y1, x2, y1, color, xor);
|
||||
FB_line(x2, y1 + 1, x2, y2 - 1, color, xor);
|
||||
FB_line(x1, y2, x2, y2, color, xor);
|
||||
FB_line(x1, y1 + 1, x1, y2 - 1, color, xor);
|
||||
}
|
||||
|
||||
void Fb_filled_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor)
|
||||
{
|
||||
INT32 tmp;
|
||||
PUINT16 ps, p;
|
||||
|
||||
if (x1 > x2)
|
||||
{
|
||||
tmp = x1;
|
||||
x1 = x2;
|
||||
x2 = tmp;
|
||||
}
|
||||
if (y1 > y2)
|
||||
{
|
||||
tmp = y1;
|
||||
y1 = y2;
|
||||
y2 = tmp;
|
||||
}
|
||||
|
||||
ps = loc_from_coords(x1, y1);
|
||||
for (; y1 <= y2; y1++)
|
||||
{
|
||||
p = ps;
|
||||
for (tmp = x1; tmp <= x2; tmp++)
|
||||
{
|
||||
if (xor)
|
||||
*p++ ^= color;
|
||||
else
|
||||
*p++ = color;
|
||||
}
|
||||
ps += Fb_Info->width;
|
||||
}
|
||||
}
|
20
src/fbprimitive.h
Normal file
20
src/fbprimitive.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
#ifndef __FBPRIMITIVE_H_INCLUDED
|
||||
#define __FBPRIMITIVE_H_INCLUDED
|
||||
|
||||
#include "wintype.h"
|
||||
|
||||
#define FBPRIMCLR_BLACK 0x0000
|
||||
#define FBPRIMCLR_RED 0xF800
|
||||
#define FBPRIMCLR_GREEN 0x07E0
|
||||
#define FBPRIMCLR_BLUE 0x001F
|
||||
#define FBPRIMCLR_YELLOW 0xFFE0
|
||||
#define FBPRIMCLR_CYAN 0x07FF
|
||||
#define FBPRIMCLR_MAGENTA 0xF81F
|
||||
#define FBPRIMCLR_WHITE 0xFFFF
|
||||
|
||||
extern UINT16 Fb_setpixel(INT32 x, INT32 y, UINT16 color, BOOL xor);
|
||||
extern void Fb_line(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
extern void Fb_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
extern void Fb_filled_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
|
||||
#endif /* __FBPRIMITIVE_H_INCLUDED */
|
19
src/main.c
19
src/main.c
|
@ -6,23 +6,18 @@
|
|||
#include "gpio.h"
|
||||
#include "log.h"
|
||||
#include "fbinit.h"
|
||||
#include "fbprimitive.h"
|
||||
#include "time_func.h"
|
||||
#include "sysinput.h"
|
||||
|
||||
static void do_draw(void)
|
||||
{
|
||||
/*
|
||||
tmp = (char *)Fb_Ptr;
|
||||
memset(tmp, 0xFF, Fb_Info->screenbytes / 2);
|
||||
memset(tmp + (Fb_Info->screenbytes / 2), 0x1B, Fb_Info->screenbytes / 2);
|
||||
*/
|
||||
UINT16 pixel = Fb_Info->green_mask;
|
||||
unsigned npix = Fb_Info->screenbytes / sizeof(UINT16);
|
||||
UINT16 *p = Fb_Ptr;
|
||||
unsigned i;
|
||||
|
||||
for (i=0; i<npix; i++)
|
||||
*p++ = pixel;
|
||||
Fb_filled_rectangle(10, 10, 50, 50, FBPRIMCLR_RED, FALSE);
|
||||
Fb_filled_rectangle(60, 10, 100, 50, FBPRIMCLR_GREEN, FALSE);
|
||||
Fb_filled_rectangle(110, 10, 160, 50, FBPRIMCLR_BLUE, FALSE);
|
||||
Fb_filled_rectangle(10, 60, 50, 100, FBPRIMCLR_CYAN, FALSE);
|
||||
Fb_filled_rectangle(60, 60, 100, 100, FBPRIMCLR_MAGENTA, FALSE);
|
||||
Fb_filled_rectangle(110, 60, 160, 100, FBPRIMCLR_YELLOW, FALSE);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
|
|
|
@ -139,6 +139,7 @@ typedef UINT64 TIMESTAMP;
|
|||
#ifndef MAX
|
||||
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||
#endif
|
||||
#define ABS(v) ((v) < 0 ? -(v) : (v))
|
||||
|
||||
#define MAKEWORD(a, b) ((WORD)((((UINT_PTR)(a)) & 0xFF) | ((((UINT_PTR)(b)) & 0xFF) << 8)))
|
||||
#define MAKELONG(a, b) ((LONG)((((UINT_PTR)(a)) & 0xFFFF) | ((((UINT_PTR)(b)) & 0xFFFF) << 16)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user