diff options
Diffstat (limited to 'drv_generic_graphic.c')
-rw-r--r-- | drv_generic_graphic.c | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/drv_generic_graphic.c b/drv_generic_graphic.c index a0cb708..cdc0129 100644 --- a/drv_generic_graphic.c +++ b/drv_generic_graphic.c @@ -1,9 +1,9 @@ -/* $Id: drv_generic_graphic.c 773 2007-02-25 12:39:09Z michael $ - * $URL: https://ssl.bulix.org/svn/lcd4linux/branches/0.10.1/drv_generic_graphic.c $ +/* $Id: drv_generic_graphic.c 1003 2009-03-26 08:11:33Z michux $ + * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/drv_generic_graphic.c $ * * generic driver helper for graphic displays * - * Copyright (C) 1999, 2000 Michael Reinelt <reinelt@eunet.at> + * Copyright (C) 1999, 2000 Michael Reinelt <michael@reinelt.co.at> * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net> * * This file is part of LCD4Linux. @@ -123,7 +123,7 @@ static void drv_generic_graphic_resizeFB(int rows, int cols) /* allocate and initialize new Layout FB */ newFB = malloc(cols * rows * sizeof(*newFB)); for (i = 0; i < rows * cols; i++) - newFB[i] = (l == 0) ? BG_COL : NO_COL; + newFB[i] = NO_COL; /* transfer contents */ if (drv_generic_graphic_FB[l] != NULL) { @@ -177,20 +177,42 @@ static void drv_generic_graphic_blit(const int row, const int col, const int hei static RGBA drv_generic_graphic_blend(const int row, const int col) { - int l; + int l, o; RGBA p; RGBA ret; ret.R = BL_COL.R; ret.G = BL_COL.G; ret.B = BL_COL.B; - ret.A = 0xff; - for (l = LAYERS - 1; l >= 0; l--) { + ret.A = 0x00; + + /* find first opaque layer */ + /* layers below are fully covered */ + o = LAYERS - 1; + for (l = 0; l < LAYERS; l++) { + p = drv_generic_graphic_FB[l][row * LCOLS + col]; + if (p.A == 255) { + o = l; + break; + } + } + + for (l = o; l >= 0; l--) { p = drv_generic_graphic_FB[l][row * LCOLS + col]; - if (p.A > 0) { + switch (p.A) { + case 0: + break; + case 255: + ret.R = p.R; + ret.G = p.G; + ret.B = p.B; + ret.A = 0xff; + break; + default: ret.R = (p.R * p.A + ret.R * (255 - p.A)) / 255; ret.G = (p.G * p.A + ret.G * (255 - p.A)) / 255; ret.B = (p.B * p.A + ret.B * (255 - p.A)) / 255; + ret.A = 0xff; } } if (INVERTED) { @@ -230,7 +252,7 @@ static void drv_generic_graphic_render(const int layer, const int row, const int while (*txt != '\0') { unsigned char *chr; - if (strcasestr(style, "bold") != NULL) { + if (strstr(style, "bold") != NULL) { chr = Font_6x8_bold[(int) *(unsigned char *) txt]; } else { chr = Font_6x8[(int) *(unsigned char *) txt]; @@ -454,16 +476,16 @@ int drv_generic_graphic_bar_draw(WIDGET * W) case DIR_EAST: for (y = 0; y < YRES; y++) { int val = y < YRES / 2 ? val1 : val2; - RGBA bcol = y < YRES / 2 ? bar[0] : bar[1]; + RGBA bc = y < YRES / 2 ? bar[0] : bar[1]; for (x = 0; x < max; x++) { if (x < val) - drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bg : bcol; + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bg : bc; else - drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bcol : bg; + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bc : bg; if (style) { - drv_generic_graphic_FB[layer][(row) * LCOLS + col + x] = fg; + drv_generic_graphic_FB[layer][(row + 0) * LCOLS + col + x] = fg; drv_generic_graphic_FB[layer][(row + YRES - 1) * LCOLS + col + x] = fg; } } @@ -482,11 +504,20 @@ int drv_generic_graphic_bar_draw(WIDGET * W) case DIR_SOUTH: for (x = 0; x < XRES; x++) { int val = x < XRES / 2 ? val1 : val2; + RGBA bc = x < XRES / 2 ? bar[0] : bar[1]; for (y = 0; y < max; y++) { if (y < val) - drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bg : fg; + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bg : bc; else - drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? fg : bg; + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bc : bg; + if (style) { + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + 0] = fg; + drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + XRES - 1] = fg; + } + } + if (style) { + drv_generic_graphic_FB[layer][(row + 0) * LCOLS + col + x] = fg; + drv_generic_graphic_FB[layer][(row + max - 1) * LCOLS + col + x] = fg; } } break; @@ -561,7 +592,7 @@ int drv_generic_graphic_image_draw(WIDGET * W) int drv_generic_graphic_init(const char *section, const char *driver) { - int l; + int i, l; char *color; WIDGET_CLASS wc; @@ -635,8 +666,10 @@ int drv_generic_graphic_init(const char *section, const char *driver) widget_register(&wc); #endif - /* clear framebuffer */ - drv_generic_graphic_clear(); + /* clear framebuffer but do not blit to display */ + for (l = 0; l < LAYERS; l++) + for (i = 0; i < LCOLS * LROWS; i++) + drv_generic_graphic_FB[l][i] = NO_COL; return 0; } |