From 4c88d373fbdae381318e6e5da9c88e5de98d7f7a Mon Sep 17 00:00:00 2001 From: reinelt Date: Thu, 22 Jan 2004 07:57:45 +0000 Subject: [lcd4linux @ 2004-01-22 07:57:45 by reinelt] several bugs fixed where segfaulting on layout>display Crystalfontz driver optimized, 632 display already works git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@334 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- drv_generic_text.c | 89 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 28 deletions(-) (limited to 'drv_generic_text.c') diff --git a/drv_generic_text.c b/drv_generic_text.c index 0ba2f10..87e22ae 100644 --- a/drv_generic_text.c +++ b/drv_generic_text.c @@ -1,4 +1,4 @@ -/* $Id: drv_generic_text.c,v 1.3 2004/01/20 14:25:12 reinelt Exp $ +/* $Id: drv_generic_text.c,v 1.4 2004/01/22 07:57:45 reinelt Exp $ * * generic driver helper for text-based displays * @@ -23,6 +23,10 @@ * * * $Log: drv_generic_text.c,v $ + * Revision 1.4 2004/01/22 07:57:45 reinelt + * several bugs fixed where segfaulting on layout>display + * Crystalfontz driver optimized, 632 display already works + * * Revision 1.3 2004/01/20 14:25:12 reinelt * some reorganization * moved drv_generic to drv_generic_serial @@ -84,11 +88,11 @@ static char *Driver; int DROWS, DCOLS; // display size int LROWS, LCOLS; // layout size int XRES, YRES; // pixels of one char cell -int CHARS; // number of user-defineable characters +int CHARS, CHAR0; // number of user-defineable characters, ASCII of first char char *LayoutFB = NULL; char *DisplayFB = NULL; -static BAR *Bar = NULL; +static BAR *Bar = NULL; static int nSegment=0; static int fSegment=0; @@ -103,15 +107,17 @@ static SEGMENT Segment[128]; void drv_generic_text_resizeFB (int rows, int cols) { char *newFB; - int row, col; + BAR *newBar; + int i, row, col; - // Fixme: resize Bar FB too!!!! - - // Layout FB is large enough if (rows<=LROWS && cols<=LCOLS) return; + // get maximum values + if (rowsgoto_len) break; - } else { - pos2=col; - equal=0; + if (rowgoto_len) break; + } else { + pos2=col; + equal=0; + } } + memcpy (fb2+pos1, fb1+pos1, pos2-pos1+1); + drv_write (fb2+pos1, pos2-pos1+1); } - memcpy (fb2+pos1, fb1+pos1, pos2-pos1+1); - drv_write (fb2+pos1, pos2-pos1+1); } - + return 0; } @@ -202,7 +234,7 @@ static void drv_generic_text_bar_clear(void) static void drv_generic_text_bar_create_bar (int row, int col, DIRECTION dir, int len, int val1, int val2) { int rev=0; - + switch (dir) { case DIR_WEST: val1 = len-val1; @@ -441,7 +473,7 @@ static void drv_generic_text_bar_define_chars (void(*defchar)(int ascii, char *m } break; } - defchar(c, buffer); + defchar(CHAR0+c, buffer); } } @@ -464,9 +496,9 @@ int drv_generic_text_draw_bar (WIDGET *W, int goto_len, // maybe grow layout framebuffer // bars *always* grow heading North or East! if (dir & (DIR_EAST|DIR_WEST)) { - drv_generic_text_resizeFB (row, col+len-1); + drv_generic_text_resizeFB (row+1, col+len); } else { - drv_generic_text_resizeFB (row, col); + drv_generic_text_resizeFB (row+1, col+1); } res = dir & (DIR_EAST|DIR_WEST)?XRES:YRES; @@ -504,6 +536,7 @@ int drv_generic_text_draw_bar (WIDGET *W, int goto_len, if (s==-1) continue; c=Segment[s].ascii; if (c==-1) continue; + if (s>=fSegment) c+=CHAR0; // ascii offset for user-defineable chars if(c==LayoutFB[n]) continue; LayoutFB[n]=c; } -- cgit v1.2.3