From bef230cf7300c25d25351615be378e62785f78cf Mon Sep 17 00:00:00 2001 From: reinelt Date: Sun, 15 Feb 2004 21:43:43 +0000 Subject: [lcd4linux @ 2004-02-15 21:43:43 by reinelt] T6963 driver nearly finished framework for graphic displays done i2c_sensors patch from Xavier some more old generation files removed git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@367 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- drv_generic_graphic.c | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 drv_generic_graphic.c (limited to 'drv_generic_graphic.c') diff --git a/drv_generic_graphic.c b/drv_generic_graphic.c new file mode 100644 index 0000000..058b83c --- /dev/null +++ b/drv_generic_graphic.c @@ -0,0 +1,313 @@ +/* $Id + * + * generic driver helper for graphic displays + * + * Copyright 1999, 2000 Michael Reinelt + * Copyright 2004 The LCD4Linux Team + * + * This file is part of LCD4Linux. + * + * LCD4Linux is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * LCD4Linux is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: drv_generic_graphic.c,v $ + * Revision 1.1 2004/02/15 21:43:43 reinelt + * T6963 driver nearly finished + * framework for graphic displays done + * i2c_sensors patch from Xavier + * some more old generation files removed + * + */ + +/* + * + * exported fuctions: + * + * Fixme: document me! + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "cfg.h" +#include "plugin.h" +#include "widget.h" +#include "widget_text.h" +#include "widget_icon.h" +#include "widget_bar.h" +#include "drv.h" +#include "drv_generic_graphic.h" +#include "font_6x8.h" + +#ifdef WITH_DMALLOC +#include +#endif + + +static char *Section=NULL; +static char *Driver=NULL; + +int DROWS, DCOLS; // display size (pixels!) +int LROWS, LCOLS; // layout size (pixels!) +int XRES, YRES; // pixels of one char cell +int GOTO_COST; // number of bytes a goto command requires + +static unsigned char *LayoutFB = NULL; +static unsigned char *DisplayFB = NULL; + + +// **************************************** +// *** generic Framebuffer stuff *** +// **************************************** + +static void drv_generic_graphic_resizeFB (int rows, int cols) +{ + char *newFB; + int row, col; + + // Layout FB is large enough + if (rows<=LROWS && cols<=LCOLS) + return; + + // get maximum values + if (rowsdata; + unsigned char *txt; + int row, col, len; + int x, y; + + row=YRES*W->row; + col=XRES*W->col; + txt=Text->buffer; + len=strlen(txt); + + // maybe grow layout framebuffer + drv_generic_graphic_resizeFB (row+YRES, col+XRES*len); + + // render text into layout FB + while (*txt!='\0') { + int c=*txt; + for (y=0; y>=1; + LayoutFB[(row+y)*LCOLS+col+x] = Font_6x8[c][y]&mask ? 1:0; + } + } + col+=XRES; + txt++; + } + + // flush area + drv_generic_graphic_flush (row, col, YRES, XRES*len); + + return 0; +} + + +// **************************************** +// *** generic icon handling *** +// **************************************** + +int drv_generic_graphic_icon_draw (WIDGET *W) +{ + WIDGET_ICON *Icon = W->data; + unsigned char *bitmap = Icon->bitmap+YRES*Icon->curmap; + int row, col; + int x, y; + + row = YRES*W->row; + col = XRES*W->col; + + // maybe grow layout framebuffer + drv_generic_graphic_resizeFB (row+YRES, col+XRES); + + // render icon + for (y=0; y>=1; + DisplayFB[(row+y)*LCOLS+col+x] = Icon->visible ? 0 : bitmap[y]&mask ? 1 : 0; + } + } + + // flush area + drv_generic_graphic_flush (row, col, YRES, XRES); + + return 0; + +} + + +// **************************************** +// *** generic bar handling *** +// **************************************** + +int drv_generic_graphic_bar_draw (WIDGET *W) +{ + WIDGET_BAR *Bar = W->data; + int row, col, len, res, rev, max, val1, val2; + int x, y; + DIRECTION dir; + + row = YRES*W->row; + col = XRES*W->col; + dir = Bar->direction; + len = Bar->length; + + // maybe grow layout framebuffer + if (dir & (DIR_EAST|DIR_WEST)) { + drv_generic_graphic_resizeFB (row+YRES, col+XRES*len); + } else { + drv_generic_graphic_resizeFB (row+YRES*len, col+XRES); + } + + res = dir & (DIR_EAST|DIR_WEST)?XRES:YRES; + max = len * res; + val1 = Bar->val1 * (double)(max); + val2 = Bar->val2 * (double)(max); + + if (val1<1) val1=1; + else if (val1>max) val1=max; + + if (val2<1) val2=1; + else if (val2>max) val2=max; + + rev=0; + + switch (dir) { + case DIR_WEST: + val1=max-val1; + val2=max-val2; + rev=1; + + case DIR_EAST: + for (y=0; y