From fb7fa435af36197db5493775d01b4339484ae225 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Sun, 3 Feb 2019 18:28:22 +0100 Subject: fmt wireup, framebuffer --- fbtools.c | 37 +++++++++++++------------------------ gfx.c | 13 +++++++++++++ gfx.h | 3 +++ 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/fbtools.c b/fbtools.c index 7f993f7..fd77d31 100644 --- a/fbtools.c +++ b/fbtools.c @@ -76,21 +76,6 @@ static void fb_linear_palette(int r, int g, int b) p_cmap.len = size; } -static void fb_dither_palette(int r, int g, int b) -{ - int rs, gs, bs, i; - - rs = 256 / (r - 1); - gs = 256 / (g - 1); - bs = 256 / (b - 1); - for (i = 0; i < 256; i++) { - p_red[i] = color_scale(rs * ((i / (g * b)) % r), 255); - p_green[i] = color_scale(gs * ((i / b) % g), 255); - p_blue[i] = color_scale(bs * ((i) % b), 255); - } - p_cmap.len = 256; -} - static void fb_set_palette(void) { if (fb_fix.visual != FB_VISUAL_DIRECTCOLOR && fb_var.bits_per_pixel != 8) @@ -225,6 +210,7 @@ gfxstate* fb_init(const char *device, char *mode) unsigned long page_mask; struct stat st; gfxstate *gfx; + gfxfmt *fmt = NULL; if (NULL == device) { device = getenv("FRAMEBUFFER"); @@ -294,24 +280,26 @@ gfxstate* fb_init(const char *device, char *mode) /* init palette */ switch (fb_var.bits_per_pixel) { - case 8: - fb_dither_palette(8, 8, 4); - break; case 15: + fmt = gfx_fmt_find_pixman(PIXMAN_x1r5g5b5); + fb_linear_palette(5,5,5); + break; case 16: - if (fb_var.green.length == 5) { - fb_linear_palette(5,5,5); - } else { - fb_linear_palette(5,6,5); - } + fmt = gfx_fmt_find_pixman(PIXMAN_r5g6b5); + fb_linear_palette(5,6,5); break; - case 24: case 32: + fmt = gfx_fmt_find_pixman(PIXMAN_x8r8g8b8); fb_linear_palette(8,8,8); break; } fb_set_palette(); + if (!fmt) { + fprintf(stderr,"can't handle framebuffer format\n"); + goto err; + } + /* prepare gfx */ gfx = malloc(sizeof(*gfx)); memset(gfx, 0, sizeof(*gfx)); @@ -320,6 +308,7 @@ gfxstate* fb_init(const char *device, char *mode) gfx->vdisplay = fb_var.yres; gfx->stride = fb_fix.line_length; gfx->mem = fb_mem; + gfx->fmt = fmt; gfx->rlen = fb_var.red.length; gfx->glen = fb_var.green.length; diff --git a/gfx.c b/gfx.c index dee4eae..81e4396 100644 --- a/gfx.c +++ b/gfx.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -49,3 +50,15 @@ gfxfmt fmt_list[] = { }; uint32_t fmt_count = ARRAY_SIZE(fmt_list); + +gfxfmt *gfx_fmt_find_pixman(pixman_format_code_t pixman) +{ + int i; + + for (i = 0; i < fmt_count; i++) { + if (pixman != fmt_list[i].pixman) + continue; + return fmt_list + i; + } + return NULL; +} diff --git a/gfx.h b/gfx.h index 3b1885c..c2ed7f5 100644 --- a/gfx.h +++ b/gfx.h @@ -28,6 +28,8 @@ struct gfxfmt { extern gfxfmt fmt_list[]; extern uint32_t fmt_count; +gfxfmt *gfx_fmt_find_pixman(pixman_format_code_t pixman); + struct gfxstate { /* info */ uint32_t hdisplay; @@ -35,6 +37,7 @@ struct gfxstate { uint32_t stride; uint8_t *mem; uint8_t *mem2; + gfxfmt *fmt; uint32_t bits_per_pixel; uint32_t rlen, glen, blen, tlen; -- cgit