From 3459cefb2dcd1736f50e8134fdc2518aa8edc402 Mon Sep 17 00:00:00 2001 From: reinelt Date: Mon, 19 Aug 2002 07:36:29 +0000 Subject: [lcd4linux @ 2002-08-19 07:36:29 by reinelt] finished bar.c, USBLCD is the first driver that uses the generic bar functions git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@159 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- bar.c | 374 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 373 insertions(+), 1 deletion(-) (limited to 'bar.c') diff --git a/bar.c b/bar.c index f0df581..e48ae4d 100644 --- a/bar.c +++ b/bar.c @@ -1,4 +1,4 @@ -/* $Id: bar.c,v 1.1 2002/08/19 04:41:20 reinelt Exp $ +/* $Id: bar.c,v 1.2 2002/08/19 07:36:29 reinelt Exp $ * * generic bar handling * @@ -20,6 +20,10 @@ * * * $Log: bar.c,v $ + * Revision 1.2 2002/08/19 07:36:29 reinelt + * + * finished bar.c, USBLCD is the first driver that uses the generic bar functions + * * Revision 1.1 2002/08/19 04:41:20 reinelt * introduced bar.c, moved bar stuff from display.h to bar.h * @@ -29,9 +33,377 @@ /* * exported functions: * + * int bar_init (int rows, int cols, int xres, int yres, int chars) + * + * void bar_clear(void) + * + * void bar_add_segment(int len1, int len2, int type, int ascii) + * + * int bar_draw (int type, int row, int col, int max, int len1, int len2) + * + * int bar_process (void) + * + * int bar_peek (int row, int col) * */ +#include + #include "bar.h" #include "debug.h" + +static int ROWS=0; +static int COLS=0; +static int XRES=0; +static int YRES=0; +static int CHARS=0; + +static int nSegment=0; +static int fSegment=0; +static SEGMENT Segment[128]; + +static BAR *Bar=NULL; + + +int bar_init (int rows, int cols, int xres, int yres, int chars) +{ + if (rows<1 || cols<1) + return -1; + + ROWS=rows; + COLS=cols; + XRES=xres; + YRES=yres; + CHARS=chars; + + if (Bar) { + free (Bar); + } + + if ((Bar=malloc (ROWS*COLS*sizeof(BAR)))==NULL) { + return -1; + } + + bar_clear(); + + nSegment=0; + fSegment=0; + + return 0; +} + + +void bar_clear(void) +{ + int n; + + for (n=0; nmax) len1=max; + + if (len2<1) len2=1; + else if (len2>max) len2=max; + + switch (type) { + case BAR_L: + len1=max-len1; + len2=max-len2; + rev=1; + + case BAR_R: + while (max>0 && col=XRES) { + Bar[row*COLS+col].len1=rev?0:XRES; + len1-=XRES; + } else { + Bar[row*COLS+col].len1=rev?XRES-len1:len1; + len1=0; + } + if (len2>=XRES) { + Bar[row*COLS+col].len2=rev?0:XRES; + len2-=XRES; + } else { + Bar[row*COLS+col].len2=rev?XRES-len2:len2; + len2=0; + } + max-=XRES; + col++; + } + break; + + case BAR_U: + len1=max-len1; + len2=max-len2; + rev=1; + + case BAR_D: + while (max>0 && row=YRES) { + Bar[row*COLS+col].len1=rev?0:YRES; + len1-=YRES; + } else { + Bar[row*COLS+col].len1=rev?YRES-len1:len1; + len1=0; + } + if (len2>=YRES) { + Bar[row*COLS+col].len2=rev?0:YRES; + len2-=YRES; + } else { + Bar[row*COLS+col].len2=rev?YRES-len2:len2; + len2=0; + } + max-=YRES; + row++; + } + break; + + } + return 0; +} + + +static void create_segments (void) +{ + int i, j, n; + + /* find first unused segment */ + for (i=fSegment; i=RES && Segment[j].len1=RES && Segment[j].len2RES) i1=RES; + i2=Segment[i].len2; if (i2>RES) i2=RES; + j1=Segment[j].len1; if (j1>RES) i1=RES; + j2=Segment[j].len2; if (j2>RES) i2=RES; + + return (i1-i2)*(i1-i2)+(j1-j2)*(j1-j2); +} + + +static void pack_segments (void) +{ + int i, j, n, min; + int pack_i, pack_j; + int pass1=1; + int deviation[nSegment][nSegment]; + + if (nSegment<=fSegment+CHARS) { + return; + } + + for (i=0; ifSegment+CHARS) { + min=65535; + pack_i=-1; + pack_j=-1; + for (i=fSegment; i