aboutsummaryrefslogtreecommitdiffstats
path: root/widget_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'widget_image.c')
-rw-r--r--widget_image.c203
1 files changed, 77 insertions, 126 deletions
diff --git a/widget_image.c b/widget_image.c
index b9d37e7..b2f40b0 100644
--- a/widget_image.c
+++ b/widget_image.c
@@ -1,4 +1,5 @@
-/* $Id: widget_image.c,v 1.9 2006/06/21 05:12:43 reinelt Exp $
+/* $Id: widget_image.c 749 2007-01-20 06:37:35Z michael $
+ * $URL: https://ssl.bulix.org/svn/lcd4linux/branches/0.10.1/widget_image.c $
*
* image widget handling
*
@@ -19,35 +20,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
- *
- * $Log: widget_image.c,v $
- * Revision 1.9 2006/06/21 05:12:43 reinelt
- * added checks for libgd version 2 (thanks to Sam)
- *
- * Revision 1.8 2006/06/20 08:50:59 reinelt
- * widget_image linker error hopefully finally fixed
- *
- * Revision 1.7 2006/04/15 05:22:52 reinelt
- * mpd plugin from Stefan Kuhne
- *
- * Revision 1.6 2006/04/09 14:17:50 reinelt
- * autoconf/library fixes, image and graphic display inversion
- *
- * Revision 1.5 2006/02/25 13:36:33 geronet
- * updated indent.sh, applied coding style
- *
- * Revision 1.4 2006/02/19 07:20:54 reinelt
- * image support nearly finished
- *
- * Revision 1.3 2006/02/08 04:55:05 reinelt
- * moved widget registration to drv_generic_graphic
- *
- * Revision 1.2 2006/01/23 06:17:18 reinelt
- * timer widget added
- *
- * Revision 1.1 2006/01/22 09:16:11 reinelt
- * Image Widget framework added
- *
*/
/*
@@ -67,15 +39,6 @@
#include <ctype.h>
#include <errno.h>
-#include "debug.h"
-#include "cfg.h"
-#include "qprintf.h"
-#include "evaluator.h"
-#include "timer.h"
-#include "widget.h"
-#include "widget_image.h"
-#include "rgb.h"
-
#ifdef HAVE_GD_GD_H
#include <gd/gd.h>
#else
@@ -92,6 +55,15 @@
#error "cannot compile image widget"
#endif
+#include "debug.h"
+#include "cfg.h"
+#include "qprintf.h"
+#include "property.h"
+#include "timer.h"
+#include "widget.h"
+#include "widget_image.h"
+#include "rgb.h"
+
#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif
@@ -100,8 +72,8 @@
static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
{
int x, y;
- FILE *fd;
- gdImagePtr gdImage = NULL;
+ int inverted;
+ gdImagePtr gdImage;
/* clear bitmap */
if (Image->bitmap) {
@@ -112,43 +84,57 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
}
}
- if (Image->file == NULL || Image->file[0] == '\0') {
- error("Warning: Image %s has no file", Name);
- return;
- }
+ /* reload image only on first call or on explicit reload request */
+ if (Image->gdImage == NULL || P2N(&Image->reload)) {
- fd = fopen(Image->file, "rb");
- if (fd == NULL) {
- error("Warning: Image %s: fopen(%s) failed: %s", Name, Image->file, strerror(errno));
- return;
- }
+ char *file;
+ FILE *fd;
- gdImage = gdImageCreateFromPng(fd);
- fclose(fd);
+ /* free previous image */
+ if (Image->gdImage) {
+ gdImageDestroy(Image->gdImage);
+ Image->gdImage = NULL;
+ }
+
+ file = P2S(&Image->file);
+ if (file == NULL || file[0] == '\0') {
+ error("Warning: Image %s has no file", Name);
+ return;
+ }
+
+ fd = fopen(file, "rb");
+ if (fd == NULL) {
+ error("Warning: Image %s: fopen(%s) failed: %s", Name, file, strerror(errno));
+ return;
+ }
+
+ Image->gdImage = gdImageCreateFromPng(fd);
+ fclose(fd);
+
+ if (Image->gdImage == NULL) {
+ error("Warning: Image %s: CreateFromPng(%s) failed!", Name, file);
+ return;
+ }
- if (fd == NULL) {
- error("Warning: Image %s: CreateFromPng(%s) failed!", Name, Image->file);
- return;
}
/* maybe resize bitmap */
+ gdImage = Image->gdImage;
if (gdImage->sx > Image->width) {
Image->width = gdImage->sx;
- if (Image->bitmap)
- free(Image->bitmap);
+ free(Image->bitmap);
Image->bitmap = NULL;
}
if (gdImage->sy > Image->height) {
Image->height = gdImage->sy;
- if (Image->bitmap)
- free(Image->bitmap);
+ free(Image->bitmap);
Image->bitmap = NULL;
}
if (Image->bitmap == NULL && Image->width > 0 && Image->height > 0) {
int i = Image->width * Image->height * sizeof(Image->bitmap[0]);
Image->bitmap = malloc(i);
if (Image->bitmap == NULL) {
- error("Warning: Image %s: malloc(%d) failed!", Name, i, strerror(errno));
+ error("Warning: Image %s: malloc(%d) failed: %s", Name, i, strerror(errno));
return;
}
for (i = 0; i < Image->height * Image->width; i++) {
@@ -157,8 +143,10 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
}
}
+
/* finally really render it */
- if (Image->visible) {
+ inverted = P2N(&Image->inverted);
+ if (P2N(&Image->visible)) {
for (x = 0; x < gdImage->sx; x++) {
for (y = 0; y < gdImage->sy; y++) {
int p = gdImageGetTrueColorPixel(gdImage, x, y);
@@ -170,7 +158,7 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
/* GD's alpha is 0 (opaque) to 127 (tranparanet) */
/* our alpha is 0 (transparent) to 255 (opaque) */
Image->bitmap[i].A = (a == 127) ? 0 : 255 - 2 * a;
- if (Image->inverted) {
+ if (inverted) {
Image->bitmap[i].R = 255 - Image->bitmap[i].R;
Image->bitmap[i].G = 255 - Image->bitmap[i].G;
Image->bitmap[i].B = 255 - Image->bitmap[i].B;
@@ -185,46 +173,16 @@ static void widget_image_update(void *Self)
{
WIDGET *W = (WIDGET *) Self;
WIDGET_IMAGE *Image = W->data;
- RESULT result = { 0, 0, 0, NULL };
/* process the parent only */
if (W->parent == NULL) {
- /* evaluate expressions */
- if (Image->file) {
- free(Image->file);
- Image->file = NULL;
- }
- if (Image->file_tree != NULL) {
- Eval(Image->file_tree, &result);
- Image->file = strdup(R2S(&result));
- DelResult(&result);
- }
-
- Image->update = 0;
- if (Image->update_tree != NULL) {
- Eval(Image->update_tree, &result);
- Image->update = R2N(&result);
- if (Image->update < 0)
- Image->update = 0;
- DelResult(&result);
- }
-
- Image->visible = 1;
- if (Image->visible_tree != NULL) {
- Eval(Image->visible_tree, &result);
- Image->visible = R2N(&result);
- Image->visible = Image->visible > 0;
- DelResult(&result);
- }
-
- Image->inverted = 0;
- if (Image->inverted_tree != NULL) {
- Eval(Image->inverted_tree, &result);
- Image->inverted = R2N(&result);
- Image->inverted = Image->inverted > 0;
- DelResult(&result);
- }
+ /* evaluate properties */
+ property_eval(&Image->file);
+ property_eval(&Image->update);
+ property_eval(&Image->reload);
+ property_eval(&Image->visible);
+ property_eval(&Image->inverted);
/* render image into bitmap */
widget_image_render(W->name, Image);
@@ -236,8 +194,9 @@ static void widget_image_update(void *Self)
W->class->draw(W);
/* add a new one-shot timer */
- timer_add(widget_image_update, Self, Image->update, 1);
-
+ if (P2N(&Image->update) > 0) {
+ timer_add(widget_image_update, Self, P2N(&Image->update), 1);
+ }
}
@@ -263,28 +222,18 @@ int widget_image_init(WIDGET * Self)
Image->width = 0;
Image->height = 0;
Image->bitmap = NULL;
- Image->file = NULL;
- /* get raw expressions (we evaluate them ourselves) */
- Image->file_expr = cfg_get_raw(section, "file", NULL);
- Image->update_expr = cfg_get_raw(section, "update", NULL);
- Image->visible_expr = cfg_get_raw(section, "visible", NULL);
- Image->inverted_expr = cfg_get_raw(section, "inverted", NULL);
+ /* load properties */
+ property_load(section, "file", NULL, &Image->file);
+ property_load(section, "update", "100", &Image->update);
+ property_load(section, "reload", "0", &Image->reload);
+ property_load(section, "visible", "1", &Image->visible);
+ property_load(section, "inverted", "0", &Image->inverted);
/* sanity checks */
- if (Image->file_expr == NULL || *Image->file_expr == '\0') {
- error("Warning: Image %s has no file", Self->name);
+ if (!property_valid(&Image->file)) {
+ error("Warning: widget %s has no file", section);
}
- if (Image->update_expr == NULL || *Image->update_expr == '\0') {
- error("Image %s has no update, using '100'", Self->name);
- Image->update_expr = "100";
- }
-
- /* compile'em */
- Compile(Image->file_expr, &Image->file_tree);
- Compile(Image->update_expr, &Image->update_tree);
- Compile(Image->visible_expr, &Image->visible_tree);
- Compile(Image->inverted_expr, &Image->inverted_tree);
free(section);
Self->data = Image;
@@ -310,14 +259,16 @@ int widget_image_quit(WIDGET * Self)
if (Self->parent == NULL) {
if (Self->data) {
WIDGET_IMAGE *Image = Self->data;
- if (Image->bitmap)
- free(Image->bitmap);
- if (Image->file)
- free(Image->file);
- DelTree(Image->file_tree);
- DelTree(Image->update_tree);
- DelTree(Image->visible_tree);
- DelTree(Image->inverted_tree);
+ if (Image->gdImage) {
+ gdImageDestroy(Image->gdImage);
+ Image->gdImage = NULL;
+ }
+ free(Image->bitmap);
+ property_free(&Image->file);
+ property_free(&Image->update);
+ property_free(&Image->reload);
+ property_free(&Image->visible);
+ property_free(&Image->inverted);
free(Self->data);
Self->data = NULL;
}