aboutsummaryrefslogtreecommitdiffstats
path: root/drv_generic_graphic.c
diff options
context:
space:
mode:
Diffstat (limited to 'drv_generic_graphic.c')
-rw-r--r--drv_generic_graphic.c69
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;
}