From 4a904c98335b9e0ee322d271585cc04bd334f803 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Mon, 22 Dec 2014 15:31:12 +0330 Subject: [PATCH] draw: clean up draw.h interface The changes are as follows: fb_init() takes the framebuffer device as an argument, fb_set() is no longer defined in draw.c, and the order of framebuffer colors are included in fb_mode(). --- config.h | 3 +++ draw.c | 36 ++++++++++++++++-------------------- draw.h | 13 +++++-------- pad.c | 8 +++++++- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/config.h b/config.h index 99c3472..064e797 100644 --- a/config.h +++ b/config.h @@ -1,3 +1,6 @@ +/* framebuffer device */ +#define FBDEV "/dev/fb0" + /* list of tags */ #define TAGS "xnlhtr01uiva-" #define TAGS_SAVED "" diff --git a/draw.c b/draw.c index 15e61a7..e016220 100644 --- a/draw.c +++ b/draw.c @@ -2,23 +2,23 @@ #include #include #include +#include #include #include #include -#include #include "draw.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define NLEVELS (1 << 8) -static int fd; -static void *fb; -static struct fb_var_screeninfo vinfo; -static struct fb_fix_screeninfo finfo; -static int bpp; -static int nr, ng, nb; -static int rl, rr, gl, gr, bl, br; /* fb_color() shifts */ +static struct fb_var_screeninfo vinfo; /* linux-specific FB structure */ +static struct fb_fix_screeninfo finfo; /* linux-specific FB structure */ +static int fd; /* FB device file descriptor */ +static void *fb; /* mmap()ed FB memory */ +static int bpp; /* bytes per pixel */ +static int nr, ng, nb; /* color levels */ +static int rl, rr, gl, gr, bl, br; /* shifts per color */ static int fb_len(void) { @@ -67,7 +67,8 @@ void fb_cmap(void) unsigned fb_mode(void) { - return (bpp << 16) | (vinfo.red.length << 8) | + return ((rl < gl) << 22) | ((rl < bl) << 21) | ((gl < bl) << 20) | + (bpp << 16) | (vinfo.red.length << 8) | (vinfo.green.length << 4) | (vinfo.blue.length); } @@ -84,14 +85,14 @@ static void init_colors(void) bl = vinfo.blue.offset; } -int fb_init(void) +int fb_init(char *dev) { - fd = open(FBDEV_PATH, O_RDWR); - if (fd == -1) + fd = open(dev, O_RDWR); + if (fd < 0) goto failed; - if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) goto failed; - if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) + if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) < 0) goto failed; fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); bpp = (vinfo.bits_per_pixel + 7) >> 3; @@ -127,12 +128,7 @@ int fb_cols(void) void *fb_mem(int r) { - return fb + (r + vinfo.yoffset) * finfo.line_length; -} - -void fb_set(int r, int c, void *mem, int len) -{ - memcpy(fb_mem(r) + (c + vinfo.xoffset) * bpp, mem, len * bpp); + return fb + (r + vinfo.yoffset) * finfo.line_length + vinfo.xoffset * bpp; } unsigned fb_val(int r, int g, int b) diff --git a/draw.h b/draw.h index 4cdd476..ad8886a 100644 --- a/draw.h +++ b/draw.h @@ -1,19 +1,16 @@ -/* framebuffer device */ -#define FBDEV_PATH "/dev/fb0" +/* fbpad's framebuffer interface */ /* fb_mode() interpretation */ -#define FBM_BPP(m) (((m) >> 16) & 0x0f) -#define FBM_COLORS(m) ((m) & 0x0fff) +#define FBM_BPP(m) (((m) >> 16) & 0x0f) /* bytes per pixel (4 bits) */ +#define FBM_CLR(m) ((m) & 0x0fff) /* bits per color (12 bits) */ +#define FBM_ORD(m) (((m) >> 20) & 0x07) /* color order (3 bits) */ /* main functions */ -int fb_init(void); +int fb_init(char *dev); void fb_free(void); unsigned fb_mode(void); void *fb_mem(int r); int fb_rows(void); int fb_cols(void); void fb_cmap(void); - -/* helper functions */ -void fb_set(int r, int c, void *mem, int len); unsigned fb_val(int r, int g, int b); diff --git a/pad.c b/pad.c index f5a356f..25bbfaf 100644 --- a/pad.c +++ b/pad.c @@ -18,7 +18,7 @@ static struct font *fonts[3]; int pad_init(void) { int r, g, b; - if (fb_init()) + if (fb_init(FBDEV)) return 1; if (sizeof(fbval_t) != FBM_BPP(fb_mode())) { fprintf(stderr, "pad_init: fbval_t doesn't match fb depth\n"); @@ -137,6 +137,12 @@ static fbval_t *ch2fb(int fn, int c, short fg, short bg) return fbbits; } +static void fb_set(int r, int c, void *mem, int len) +{ + int bpp = FBM_BPP(fb_mode()); + memcpy(fb_mem(r) + c * bpp, mem, len * bpp); +} + static void fb_box(int sr, int er, int sc, int ec, fbval_t val) { static fbval_t line[32 * NCOLS]; -- 2.11.4.GIT