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
 | 
					LIBS=-lbcm2835 -lpthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
upiwin: $(OBJS)
 | 
					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 "gpio.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
#include "fbinit.h"
 | 
					#include "fbinit.h"
 | 
				
			||||||
 | 
					#include "fbprimitive.h"
 | 
				
			||||||
#include "time_func.h"
 | 
					#include "time_func.h"
 | 
				
			||||||
#include "sysinput.h"
 | 
					#include "sysinput.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void do_draw(void)
 | 
					static void do_draw(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  /*
 | 
					  Fb_filled_rectangle(10, 10, 50, 50, FBPRIMCLR_RED, FALSE);
 | 
				
			||||||
  tmp = (char *)Fb_Ptr;
 | 
					  Fb_filled_rectangle(60, 10, 100, 50, FBPRIMCLR_GREEN, FALSE);
 | 
				
			||||||
  memset(tmp, 0xFF, Fb_Info->screenbytes / 2);
 | 
					  Fb_filled_rectangle(110, 10, 160, 50, FBPRIMCLR_BLUE, FALSE);
 | 
				
			||||||
  memset(tmp + (Fb_Info->screenbytes / 2), 0x1B, Fb_Info->screenbytes / 2);
 | 
					  Fb_filled_rectangle(10, 60, 50, 100, FBPRIMCLR_CYAN, FALSE);
 | 
				
			||||||
  */
 | 
					  Fb_filled_rectangle(60, 60, 100, 100, FBPRIMCLR_MAGENTA, FALSE);
 | 
				
			||||||
  UINT16 pixel = Fb_Info->green_mask;
 | 
					  Fb_filled_rectangle(110, 60, 160, 100, FBPRIMCLR_YELLOW, FALSE);
 | 
				
			||||||
  unsigned npix = Fb_Info->screenbytes / sizeof(UINT16);
 | 
					 | 
				
			||||||
  UINT16 *p = Fb_Ptr;
 | 
					 | 
				
			||||||
  unsigned i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i=0; i<npix; i++)
 | 
					 | 
				
			||||||
    *p++ = pixel;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
				
			|||||||
@ -139,6 +139,7 @@ typedef UINT64 TIMESTAMP;
 | 
				
			|||||||
#ifndef MAX
 | 
					#ifndef MAX
 | 
				
			||||||
#define MAX(x, y)         (((x) > (y)) ? (x) : (y))
 | 
					#define MAX(x, y)         (((x) > (y)) ? (x) : (y))
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#define ABS(v)            ((v) < 0 ? -(v) : (v))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAKEWORD(a, b)    ((WORD)((((UINT_PTR)(a)) & 0xFF) | ((((UINT_PTR)(b)) & 0xFF) << 8)))
 | 
					#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)))
 | 
					#define MAKELONG(a, b)    ((LONG)((((UINT_PTR)(a)) & 0xFFFF) | ((((UINT_PTR)(b)) & 0xFFFF) << 16)))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user