* Copyright (C) 2005, 2006, 2007 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This driver is based on playusb.c created on Aug 2, 2010 by Andre Puschmann
- * which is in turn based on code from Grace Woo:
+ * which is in turn based on code from Grace Woo:
* http://web.media.mit.edu/~gracewoo/stuff/picframe
*
* This file is part of LCD4Linux.
*
*/
-/*
+/*
*
* exported fuctions:
*
// Drivername for verbose output
static char Name[] = "SamsungSPF";
-struct SPFdev {
- const char type[64];
- const int vendorID;
- struct {
- const int storageMode;
- const int monitorMode;
- } productID;
- const unsigned int xRes;
- const unsigned int yRes;
+struct SPFdev
+{
+ const char type[64];
+ const int vendorID;
+ struct
+ {
+ const int storageMode;
+ const int monitorMode;
+ } productID;
+ const unsigned int xRes;
+ const unsigned int yRes;
};
-static struct SPFdev spfDevices[] = {
- {
- .type = "SPF-AUTO",
- .vendorID = 0x04e8,
- .productID = {0xffff, 0xffff},
- .xRes = 1,
- .yRes = 1,
- },
- {
- .type = "SPF-72H",
- .vendorID = 0x04e8,
- .productID = {0x200a, 0x200b},
- .xRes = 800,
- .yRes = 480,
- },
- {
- .type = "SPF-75H",
- .vendorID = 0x04e8,
- .productID = {0x200e, 0x200f},
- .xRes = 800,
- .yRes = 480,
- },
- {
- .type = "SPF-76H",
- .vendorID = 0x04e8,
- .productID = {0x200e, 0x200f},
- .xRes = 800,
- .yRes = 480,
- },
- {
- .type = "SPF-83H",
- .vendorID = 0x04e8,
- .productID = {0x200c, 0x200d},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-85H",
- .vendorID = 0x04e8,
- .productID = {0x2012, 0x2013},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-85P",
- .vendorID = 0x04e8,
- .productID = {0x2016, 0x2017},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-86H",
- .vendorID = 0x04e8,
- .productID = {0x2012, 0x2013},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-86P",
- .vendorID = 0x04e8,
- .productID = {0x2016, 0x2017},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-87H",
- .vendorID = 0x04e8,
- .productID = {0x2025, 0x2026},
- .xRes = 800,
- .yRes = 480,
- },
- {
- .type = "SPF-87H-v2",
- .vendorID = 0x04e8,
- .productID = {0x2033, 0x2034},
- .xRes = 800,
- .yRes = 480,
- },
- {
- .type = "SPF-105P",
- .vendorID = 0x04e8,
- .productID = {0x201c, 0x201b},
- .xRes = 1024,
- .yRes = 600,
- },
- {
- .type = "SPF-107H",
- .vendorID = 0x04e8,
- .productID = {0x2027, 0x2028},
- .xRes = 1024,
- .yRes = 600,
- },
- {
- .type = "SPF-107H-v2",
- .vendorID = 0x04e8,
- .productID = {0x2035, 0x2036},
- .xRes = 1024,
- .yRes = 600,
- },
- {
- .type = "SPF-700T",
- .vendorID = 0x04e8,
- .productID = {0x204f, 0x2050},
- .xRes = 800,
- .yRes = 600,
- },
- {
- .type = "SPF-1000P",
- .vendorID = 0x04e8,
- .productID = {0x2039, 0x2040},
- .xRes = 1024,
- .yRes = 600,
- },
+static struct SPFdev spfDevices[] =
+{
+ {
+ .type = "SPF-AUTO",
+ .vendorID = 0x04e8,
+ .productID = {0xffff, 0xffff},
+ .xRes = 1,
+ .yRes = 1,
+ },
+ {
+ .type = "SPF-72H",
+ .vendorID = 0x04e8,
+ .productID = {0x200a, 0x200b},
+ .xRes = 800,
+ .yRes = 480,
+ },
+ {
+ .type = "SPF-75H",
+ .vendorID = 0x04e8,
+ .productID = {0x200e, 0x200f},
+ .xRes = 800,
+ .yRes = 480,
+ },
+ {
+ .type = "SPF-76H",
+ .vendorID = 0x04e8,
+ .productID = {0x200e, 0x200f},
+ .xRes = 800,
+ .yRes = 480,
+ },
+ {
+ .type = "SPF-83H",
+ .vendorID = 0x04e8,
+ .productID = {0x200c, 0x200d},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-85H",
+ .vendorID = 0x04e8,
+ .productID = {0x2012, 0x2013},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-85P",
+ .vendorID = 0x04e8,
+ .productID = {0x2016, 0x2017},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-86H",
+ .vendorID = 0x04e8,
+ .productID = {0x2012, 0x2013},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-86P",
+ .vendorID = 0x04e8,
+ .productID = {0x2016, 0x2017},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-87H",
+ .vendorID = 0x04e8,
+ .productID = {0x2025, 0x2026},
+ .xRes = 800,
+ .yRes = 480,
+ },
+ {
+ .type = "SPF-87H-v2",
+ .vendorID = 0x04e8,
+ .productID = {0x2033, 0x2034},
+ .xRes = 800,
+ .yRes = 480,
+ },
+ {
+ .type = "SPF-105P",
+ .vendorID = 0x04e8,
+ .productID = {0x201c, 0x201b},
+ .xRes = 1024,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-107H",
+ .vendorID = 0x04e8,
+ .productID = {0x2027, 0x2028},
+ .xRes = 1024,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-107H-v2",
+ .vendorID = 0x04e8,
+ .productID = {0x2035, 0x2036},
+ .xRes = 1024,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-700T",
+ .vendorID = 0x04e8,
+ .productID = {0x204f, 0x2050},
+ .xRes = 800,
+ .yRes = 600,
+ },
+ {
+ .type = "SPF-1000P",
+ .vendorID = 0x04e8,
+ .productID = {0x2039, 0x2040},
+ .xRes = 1024,
+ .yRes = 600,
+ },
};
static int numFrames = sizeof(spfDevices) / sizeof(spfDevices[0]);
usb_dev_handle *myDevHandle;
struct SPFdev *myFrame;
-typedef struct {
- unsigned char R, G, B;
+typedef struct
+{
+ unsigned char R, G, B;
} RGB;
-static struct {
- RGB *buf;
- int dirty;
- int fbsize;
+static struct
+{
+ RGB *buf;
+ int dirty;
+ int fbsize;
} image;
-static struct {
- unsigned char *buf;
- unsigned long int size;
+static struct
+{
+ unsigned char *buf;
+ unsigned long int size;
} jpegImage;
/* please note that in-memory compression doesn't work satisfactory */
int convert2JPG()
{
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- int row_stride; /* physical row width in buffer */
- JSAMPROW row_pointer[1]; /* pointer to a single row */
-
- /* Initialize compression frame */
- cinfo.err = jpeg_std_error(&jerr);
- jpeg_create_compress(&cinfo);
- jpeg_mem_dest(&cinfo, &jpegImage.buf, &jpegImage.size);
-
- cinfo.image_width = myFrame->xRes;
- cinfo.image_height = myFrame->yRes;
- cinfo.input_components = sizeof(RGB);
- cinfo.in_color_space = JCS_RGB;
-
- /* call some jpeg helpers */
- jpeg_set_defaults(&cinfo);
- jpeg_set_quality(&cinfo, 100, 1); /*set the quality [0..100] */
- jpeg_start_compress(&cinfo, 1);
-
- row_stride = cinfo.image_width;
-
- /* Convert line by line */
- while (cinfo.next_scanline < cinfo.image_height) {
- row_pointer[0] = (JSAMPROW) (image.buf + (cinfo.next_scanline * row_stride));
- jpeg_write_scanlines(&cinfo, row_pointer, 1);
- }
-
- /* Finish compression and free internal memory */
- jpeg_finish_compress(&cinfo);
- jpeg_destroy_compress(&cinfo);
-
- return 0;
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ int row_stride; /* physical row width in buffer */
+ JSAMPROW row_pointer[1]; /* pointer to a single row */
+
+ /* Initialize compression frame */
+ cinfo.err = jpeg_std_error(&jerr);
+ jpeg_create_compress(&cinfo);
+ jpeg_mem_dest(&cinfo, &jpegImage.buf, &jpegImage.size);
+
+ cinfo.image_width = myFrame->xRes;
+ cinfo.image_height = myFrame->yRes;
+ cinfo.input_components = sizeof(RGB);
+ cinfo.in_color_space = JCS_RGB;
+
+ /* call some jpeg helpers */
+ jpeg_set_defaults(&cinfo);
+ jpeg_set_quality(&cinfo, 100, 1); /*set the quality [0..100] */
+ jpeg_start_compress(&cinfo, 1);
+
+ row_stride = cinfo.image_width;
+
+ /* Convert line by line */
+ while (cinfo.next_scanline < cinfo.image_height)
+ {
+ row_pointer[0] = (JSAMPROW) (image.buf + (cinfo.next_scanline * row_stride));
+ jpeg_write_scanlines(&cinfo, row_pointer, 1);
+ }
+
+ /* Finish compression and free internal memory */
+ jpeg_finish_compress(&cinfo);
+ jpeg_destroy_compress(&cinfo);
+
+ return 0;
}
// Find specific Samsung device
static void drv_SamsungSPF_find()
{
- info("%s: Searching SPF.", Name);
+ info("%s: Searching SPF.", Name);
- /* open USB device */
- struct usb_bus *bus;
- struct usb_device *dev;
+ /* open USB device */
+ struct usb_bus *bus;
+ struct usb_device *dev;
int i;
- usb_init();
- usb_find_busses();
- usb_find_devices();
-
- for (bus = usb_busses; bus; bus = bus->next) {
- for (dev = bus->devices; dev; dev = dev->next) {
- if (dev->descriptor.idVendor == myFrame->vendorID) {
- if (myFrame->productID.storageMode == 0xFFFF) {
- for (i = 0; i < numFrames; i++) {
- if (dev->descriptor.idProduct == spfDevices[i].productID.storageMode) {
-
- info("Samsung photoframe in Mass Storage mode found.");
- myFrame = &spfDevices[i];
- info("%s: Autodetect model %s.", Name, spfDevices[i].type);
- myDev = dev;
-
- return;
- } else if (dev->descriptor.idProduct == spfDevices[i].productID.monitorMode) {
-
- info("Samsung photoframe in Custom Product mode found.");
- myFrame = &spfDevices[i];
- info("%s: Autodetect model %s.", Name, spfDevices[i].type);
- myDev = dev;
-
- return;
- }}
- } else {
- if (dev->descriptor.idProduct == myFrame->productID.storageMode) {
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ for (bus = usb_busses; bus; bus = bus->next)
+ {
+ for (dev = bus->devices; dev; dev = dev->next)
+ {
+ if (dev->descriptor.idVendor == myFrame->vendorID)
+ {
+ if (myFrame->productID.storageMode == 0xFFFF)
+ {
+ for (i = 0; i < numFrames; i++)
+ {
+ if (dev->descriptor.idProduct == spfDevices[i].productID.storageMode)
+ {
+
+ info("Samsung photoframe in Mass Storage mode found.");
+ myFrame = &spfDevices[i];
+ info("%s: Autodetect model %s.", Name, spfDevices[i].type);
+ myDev = dev;
+
+ return;
+ }
+ else if (dev->descriptor.idProduct == spfDevices[i].productID.monitorMode)
+ {
+
+ info("Samsung photoframe in Custom Product mode found.");
+ myFrame = &spfDevices[i];
+ info("%s: Autodetect model %s.", Name, spfDevices[i].type);
+ myDev = dev;
+
+ return;
+ }
+ }
+ }
+ else
+ {
+ if (dev->descriptor.idProduct == myFrame->productID.storageMode)
+ {
- info("Samsung photoframe in Mass Storage mode found.");
- myDev = dev;
+ info("Samsung photoframe in Mass Storage mode found.");
+ myDev = dev;
- return;
- } else if (dev->descriptor.idProduct == myFrame->productID.monitorMode) {
+ return;
+ }
+ else if (dev->descriptor.idProduct == myFrame->productID.monitorMode)
+ {
- info("Samsung photoframe in Custom Product mode found.");
- myDev = dev;
+ info("Samsung photoframe in Custom Product mode found.");
+ myDev = dev;
- return;
+ return;
+ }
}
- }
+ }
}
}
- }
- free(bus);
- myDev = 0;
+ free(bus);
+ myDev = 0;
}
static int drv_SamsungSPF_open()
{
- if (!myDev) {
- error("%s: No device specified!", Name);
- return -1;
- }
+ if (!myDev)
+ {
+ error("%s: No device specified!", Name);
+ return -1;
+ }
- int res = -1;
- char buf[256];
+ int res = -1;
+ char buf[256];
- if (myDev->descriptor.idProduct == myFrame->productID.storageMode) {
- info("%s: Opening device and switching to monitor mode", Name);
+ if (myDev->descriptor.idProduct == myFrame->productID.storageMode)
+ {
+ info("%s: Opening device and switching to monitor mode", Name);
- myDevHandle = usb_open(myDev);
+ myDevHandle = usb_open(myDev);
#if 0
- setuid(getuid());
+ setuid(getuid());
#endif
- strcpy(buf, "** no string **");
- res = usb_get_string_simple(myDevHandle, myDev->descriptor.iManufacturer, buf, sizeof(buf));
- debug("usb_get_string_simple => %d, %s", res, buf);
+ strcpy(buf, "** no string **");
+ res = usb_get_string_simple(myDevHandle, myDev->descriptor.iManufacturer, buf, sizeof(buf));
+ debug("usb_get_string_simple => %d, %s", res, buf);
- memset(buf, 0, 256);
+ memset(buf, 0, 256);
- res = usb_control_msg(myDevHandle, USB_TYPE_STANDARD | USB_ENDPOINT_IN,
- USB_REQ_GET_DESCRIPTOR, 0xfe, 0xfe, buf, 0xfe, 1000);
- /* usb_close( myDev ); */
- usb_close(myDevHandle);
- // Sleep some time before research
- sleep(1);
- drv_SamsungSPF_find();
- } else
- info("%s: No device in storage mode found", Name);
+ res = usb_control_msg(myDevHandle, USB_TYPE_STANDARD | USB_ENDPOINT_IN,
+ USB_REQ_GET_DESCRIPTOR, 0xfe, 0xfe, buf, 0xfe, 1000);
+ /* usb_close( myDev ); */
+ usb_close(myDevHandle);
+ // Sleep some time before research
+ sleep(1);
+ drv_SamsungSPF_find();
+ }
+ else
+ info("%s: No device in storage mode found", Name);
- if (myDev->descriptor.idProduct == myFrame->productID.storageMode) {
- error("%s: Was not able to switch to monitor mode!", Name);
- return -1;
- }
+ if (myDev->descriptor.idProduct == myFrame->productID.storageMode)
+ {
+ error("%s: Was not able to switch to monitor mode!", Name);
+ return -1;
+ }
- if (myDev->descriptor.idProduct == myFrame->productID.monitorMode) {
- info("%s: Device '%s' is now in monitor mode.", Name, myFrame->type);
- myDevHandle = usb_open(myDev);
- return 0;
- }
+ if (myDev->descriptor.idProduct == myFrame->productID.monitorMode)
+ {
+ info("%s: Device '%s' is now in monitor mode.", Name, myFrame->type);
+ myDevHandle = usb_open(myDev);
+ return 0;
+ }
- error("Unknown error: usb_control_msg() = %d", res);
- return -1;
+ error("Unknown error: usb_control_msg() = %d", res);
+ return -1;
}
/* dummy function that sends something to the display */
static int drv_SamsungSPF_send(char *data, unsigned int len)
{
- char usb_hdr[HEADERSIZE] = { 0xa5, 0x5a, 0x18, 0x04, 0xff, 0xff,
- 0xff, 0xff, 0x48, 0x00, 0x00, 0x00
- };
+ char usb_hdr[HEADERSIZE] = { 0xa5, 0x5a, 0x18, 0x04, 0xff, 0xff,
+ 0xff, 0xff, 0x48, 0x00, 0x00, 0x00
+ };
#if 0
- char buffer[1] = { 0x0 };
+ char buffer[1] = { 0x0 };
#endif
- int usb_timeout = 1000;
- int usb_endpoint = 0x2;
- int ret;
+ int usb_timeout = 1000;
+ int usb_endpoint = 0x2;
+ int ret;
- *(int *) (usb_hdr + 4) = len;
+ *(int *) (usb_hdr + 4) = len;
- debug("bytes_to_send: %d, offset: %d", len, HEADERSIZE);
+ debug("bytes_to_send: %d, offset: %d", len, HEADERSIZE);
#if 0
- /* Send USB header */
- if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, usb_hdr, 12, usb_timeout)) < 0) {
- error("%s: Error occurred while writing data to device.", Name);
- error("%s: usb_bulk_write returned: %d", Name, ret);
- return -1;
- }
+ /* Send USB header */
+ if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, usb_hdr, 12, usb_timeout)) < 0)
+ {
+ error("%s: Error occurred while writing data to device.", Name);
+ error("%s: usb_bulk_write returned: %d", Name, ret);
+ return -1;
+ }
- /* Send JPEG image */
- if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, data, len, usb_timeout)) < 0) {
- error("%s: Error occurred while writing data to device.", Name);
- error("%s: usb_bulk_write returned: %d", Name, ret);
- return -1;
- }
+ /* Send JPEG image */
+ if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, data, len, usb_timeout)) < 0)
+ {
+ error("%s: Error occurred while writing data to device.", Name);
+ error("%s: usb_bulk_write returned: %d", Name, ret);
+ return -1;
+ }
- /* Finish transmission by sending zero */
- if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, buffer, 1, usb_timeout)) < 0) {
- error("%s: Error occurred while writing data to device.", Name);
- error("%s: usb_bulk_write returned: %d", Name, ret);
- return -1;
- }
+ /* Finish transmission by sending zero */
+ if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, buffer, 1, usb_timeout)) < 0)
+ {
+ error("%s: Error occurred while writing data to device.", Name);
+ error("%s: usb_bulk_write returned: %d", Name, ret);
+ return -1;
+ }
#endif
char *buffer;
debug("calculated full bytes_to_send:: %d", full);
buffer = malloc(full + FILLSIZE); //added FILLSIZE is just for safety
- if (buffer != NULL) {
+ if (buffer != NULL)
+ {
int i;
for (i = 0; i < HEADERSIZE; i++)
buffer[i] = usb_hdr[i];
memset(buffer + HEADERSIZE + len, 0x00, rest);
memcpy(buffer + HEADERSIZE, data, len);
- if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, buffer, full, usb_timeout)) < 0) {
+ if ((ret = usb_bulk_write(myDevHandle, usb_endpoint, buffer, full, usb_timeout)) < 0)
+ {
error("%s: Error occurred while writing data to device.", Name);
error("%s: usb_bulk_write returned: %d", Name, ret);
free(buffer);
return -1;
- } else {
+ }
+ else
+ {
free(buffer);
}
- } else {
+ }
+ else
+ {
error("%s: Not enough free memory.", Name);
return -1;
}
/* Keep SPF87h and friends in MiniMonitorMode */
- char bytes[]={0x09,0x04};
+ char bytes[]= {0x09,0x04};
- if ((ret = usb_control_msg(myDevHandle, 0xc0, 0x01, 0x0000, 0x0000, bytes, 0x02, 1000)) < 0) {
+ if ((ret = usb_control_msg(myDevHandle, 0xc0, 0x01, 0x0000, 0x0000, bytes, 0x02, 1000)) < 0)
+ {
error("%s: Error occurred while sending control_msg to device.", Name);
error("%s: usb_control_msg returned: %d", Name, ret);
};
- return 0;
+ return 0;
}
/* for graphic displays only */
static void drv_SamsungSPF_blit(const int row, const int col, const int height, const int width)
{
- int r, c;
-
- for (r = row; r < row + height; r++) {
- for (c = col; c < col + width; c++) {
- RGB p1 = image.buf[r * myFrame->xRes + c];
- RGBA p2 = drv_generic_graphic_rgb(r, c);
- if (p1.R != p2.R || p1.G != p2.G || p1.B != p2.B) {
- image.buf[r * myFrame->xRes + c].R = p2.R;
- image.buf[r * myFrame->xRes + c].G = p2.G;
- image.buf[r * myFrame->xRes + c].B = p2.B;
- image.dirty = 1;
- }
+ int r, c;
+
+ for (r = row; r < row + height; r++)
+ {
+ for (c = col; c < col + width; c++)
+ {
+ RGB p1 = image.buf[r * myFrame->xRes + c];
+ RGBA p2 = drv_generic_graphic_rgb(r, c);
+ if (p1.R != p2.R || p1.G != p2.G || p1.B != p2.B)
+ {
+ image.buf[r * myFrame->xRes + c].R = p2.R;
+ image.buf[r * myFrame->xRes + c].G = p2.G;
+ image.buf[r * myFrame->xRes + c].B = p2.B;
+ image.dirty = 1;
+ }
+ }
}
- }
}
static void drv_SamsungSPF_timer( __attribute__ ((unused))
- void *notused)
+ void *notused)
{
- if (image.dirty) {
- debug("FB dirty, writing jpeg...");
- convert2JPG();
-
- /* Sent image to display */
- if ((drv_SamsungSPF_send((char *) jpegImage.buf, jpegImage.size)) != 0) {
- error("%s: Error occurred while sending jpeg image to device.", Name);
+ if (image.dirty)
+ {
+ debug("FB dirty, writing jpeg...");
+ convert2JPG();
+
+ /* Sent image to display */
+ if ((drv_SamsungSPF_send((char *) jpegImage.buf, jpegImage.size)) != 0)
+ {
+ error("%s: Error occurred while sending jpeg image to device.", Name);
+ }
+ /* Clean dirty bit */
+ image.dirty = 0;
+
+ /* Free JPEG buffer since a new is allocated each time an image is
+ compressed */
+ if (jpegImage.size)
+ free(jpegImage.buf);
+ jpegImage.size = 0;
}
- /* Clean dirty bit */
- image.dirty = 0;
-
- /* Free JPEG buffer since a new is allocated each time an image is
- compressed */
- if (jpegImage.size)
- free(jpegImage.buf);
- jpegImage.size = 0;
- }
}
/* start graphic display */
static int drv_SamsungSPF_start(const char *section)
{
- int timerInterval = 1000;
- char *s;
+ int timerInterval = 1000;
+ char *s;
- cfg_number(section, "update", timerInterval, 0, -1, &timerInterval);
- debug("Updating display every %dms", timerInterval);
+ cfg_number(section, "update", timerInterval, 0, -1, &timerInterval);
+ debug("Updating display every %dms", timerInterval);
- DROWS = myFrame->yRes;
- DCOLS = myFrame->xRes;
- info("%s: Using SPF with %dx%d pixels.", Name, DCOLS, DROWS);
+ DROWS = myFrame->yRes;
+ DCOLS = myFrame->xRes;
+ info("%s: Using SPF with %dx%d pixels.", Name, DCOLS, DROWS);
- s = cfg_get(section, "Font", "6x8");
- if (s == NULL || *s == '\0') {
- error("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
- return -1;
- }
+ s = cfg_get(section, "Font", "6x8");
+ if (s == NULL || *s == '\0')
+ {
+ error("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
+ return -1;
+ }
- XRES = -1;
- YRES = -1;
- if (sscanf(s, "%dx%d", &XRES, &YRES) != 2 || XRES < 1 || YRES < 1) {
- error("%s: bad Font '%s' from %s", Name, s, cfg_source());
- return -1;
- }
+ XRES = -1;
+ YRES = -1;
+ if (sscanf(s, "%dx%d", &XRES, &YRES) != 2 || XRES < 1 || YRES < 1)
+ {
+ error("%s: bad Font '%s' from %s", Name, s, cfg_source());
+ return -1;
+ }
- if (XRES < 6 || YRES < 8) {
- error("%s: bad Font '%s' from %s (must be at least 6x8)", Name, s, cfg_source());
- return -1;
- }
- free(s);
+ if (XRES < 6 || YRES < 8)
+ {
+ error("%s: bad Font '%s' from %s (must be at least 6x8)", Name, s, cfg_source());
+ return -1;
+ }
+ free(s);
- /* Allocate framebuffer */
- image.fbsize = myFrame->xRes * myFrame->yRes * sizeof(RGB);
- image.buf = malloc(image.fbsize);
- memset(image.buf, 128, image.fbsize);
- image.dirty = 0;
+ /* Allocate framebuffer */
+ image.fbsize = myFrame->xRes * myFrame->yRes * sizeof(RGB);
+ image.buf = malloc(image.fbsize);
+ memset(image.buf, 128, image.fbsize);
+ image.dirty = 0;
- /* JPEG buffer is allocated by jpeglib */
- jpegImage.buf = 0;
- jpegImage.size = 0;
+ /* JPEG buffer is allocated by jpeglib */
+ jpegImage.buf = 0;
+ jpegImage.size = 0;
- /* regularly transmit the image */
- timer_add(drv_SamsungSPF_timer, NULL, timerInterval, 0);
+ /* regularly transmit the image */
+ timer_add(drv_SamsungSPF_timer, NULL, timerInterval, 0);
- return 0;
+ return 0;
}
/* list models */
int drv_SamsungSPF_list(void)
{
- int i;
+ int i;
- printf("SamsungSPF driver, supported models [");
- for (i = 0; i < numFrames; i++) {
- printf("%s", spfDevices[i].type);
- if (i < numFrames - 1)
- printf(", ");
- }
- printf("]\n");
+ printf("SamsungSPF driver, supported models [");
+ for (i = 0; i < numFrames; i++)
+ {
+ printf("%s", spfDevices[i].type);
+ if (i < numFrames - 1)
+ printf(", ");
+ }
+ printf("]\n");
- return 0;
+ return 0;
}
/* use this function for a graphic display */
int drv_SamsungSPF_init(const char *section, const int quiet)
{
- info("%s: Initializing SPF.", Name);
+ info("%s: Initializing SPF.", Name);
- char *s;
- int i;
+ char *s;
+ int i;
- myDev = 0;
- myFrame = 0;
+ myDev = 0;
+ myFrame = 0;
- // Look for model entry in config
- s = cfg_get(section, "Model", NULL);
- if (s == NULL || *s != '\0') {
+ // Look for model entry in config
s = cfg_get(section, "Model", NULL);
- if (s == NULL || *s == '\0') {
-
- drv_SamsungSPF_list();
- error("%s: no '%s.Model' entry from %s", Name, section, cfg_source());
- return -1;
+ if (s == NULL || *s != '\0')
+ {
+ s = cfg_get(section, "Model", NULL);
+ if (s == NULL || *s == '\0')
+ {
+
+ drv_SamsungSPF_list();
+ error("%s: no '%s.Model' entry from %s", Name, section, cfg_source());
+ return -1;
+ }
}
- }
- // Look for specified device
- for (i = 0; i < numFrames; i++) {
- if (strcasecmp(s, spfDevices[i].type) == 0) {
- myFrame = &spfDevices[i];
- info("%s: Configured for model %s.", Name, spfDevices[i].type);
- break;
+ // Look for specified device
+ for (i = 0; i < numFrames; i++)
+ {
+ if (strcasecmp(s, spfDevices[i].type) == 0)
+ {
+ myFrame = &spfDevices[i];
+ info("%s: Configured for model %s.", Name, spfDevices[i].type);
+ break;
+ }
}
- }
- if (!myFrame) {
- drv_SamsungSPF_list();
- error("%s: unknown model '%s'!", Name, s);
- return -1;
- }
+ if (!myFrame)
+ {
+ drv_SamsungSPF_list();
+ error("%s: unknown model '%s'!", Name, s);
+ return -1;
+ }
- free(s);
+ free(s);
- /* try to open USB device */
- drv_SamsungSPF_find();
- while (!myDev) { //endless loop waitung for SPF
+ /* try to open USB device */
+ drv_SamsungSPF_find();
+ while (!myDev) //endless loop waitung for SPF
+ {
sleep(5);
- drv_SamsungSPF_find();
+ drv_SamsungSPF_find();
+ }
+ if (!myDev)
+ {
+ error("%s: No Samsung '%s' found!", Name, myFrame->type);
+ return -1;
}
- if (!myDev) {
- error("%s: No Samsung '%s' found!", Name, myFrame->type);
- return -1;
- }
- /* open display and switch to monitor mode if necessary */
- if (drv_SamsungSPF_open() == -1)
- return -1;
+ /* open display and switch to monitor mode if necessary */
+ if (drv_SamsungSPF_open() == -1)
+ return -1;
- int ret;
+ int ret;
- /* real worker functions */
- drv_generic_graphic_real_blit = drv_SamsungSPF_blit;
+ /* real worker functions */
+ drv_generic_graphic_real_blit = drv_SamsungSPF_blit;
- /* start display */
- if ((ret = drv_SamsungSPF_start(section)) != 0)
- return ret;
+ /* start display */
+ if ((ret = drv_SamsungSPF_start(section)) != 0)
+ return ret;
- /* initialize generic graphic driver */
- if ((ret = drv_generic_graphic_init(section, Name)) != 0)
- return ret;
+ /* initialize generic graphic driver */
+ if ((ret = drv_generic_graphic_init(section, Name)) != 0)
+ return ret;
- if (!quiet) {
- char buffer[40];
- qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
- if (drv_generic_graphic_greet(buffer, NULL)) {
- sleep(3);
- drv_generic_graphic_clear();
+ if (!quiet)
+ {
+ char buffer[40];
+ qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
+ if (drv_generic_graphic_greet(buffer, NULL))
+ {
+ sleep(3);
+ drv_generic_graphic_clear();
+ }
}
- }
- return 0;
+ return 0;
}
int drv_SamsungSPF_quit(const int quiet)
{
- info("%s: shutting down.", Name);
+ info("%s: shutting down.", Name);
- /* clear display */
- drv_generic_graphic_clear();
+ /* clear display */
+ drv_generic_graphic_clear();
- /* say goodbye... */
- if (!quiet) {
- drv_generic_graphic_greet("goodbye!", NULL);
- }
+ /* say goodbye... */
+ if (!quiet)
+ {
+ drv_generic_graphic_greet("goodbye!", NULL);
+ }
- drv_generic_graphic_quit();
+ drv_generic_graphic_quit();
- debug("closing connection");
- printf("%s: Closing driver...\n", Name);
- usb_close(myDevHandle);
- free(myDev);
- free(myDevHandle);
+ debug("closing connection");
+ printf("%s: Closing driver...\n", Name);
+ usb_close(myDevHandle);
+ free(myDev);
+ free(myDevHandle);
- return (0);
+ return (0);
}
/* use this one for a graphic display */
-DRIVER drv_SamsungSPF = {
- .name = Name,
- .list = drv_SamsungSPF_list,
- .init = drv_SamsungSPF_init,
- .quit = drv_SamsungSPF_quit,
+DRIVER drv_SamsungSPF =
+{
+ .name = Name,
+ .list = drv_SamsungSPF_list,
+ .init = drv_SamsungSPF_init,
+ .quit = drv_SamsungSPF_quit,
};
*
*/
-/*
+/*
*
* exported functions:
*
static void drv_generic_graphic_resizeFB(int rows, int cols)
{
- RGBA *newFB;
- int i, l, row, col;
-
- /* Layout FB is large enough */
- if (rows <= LROWS && cols <= LCOLS)
- return;
-
- /* get maximum values */
- if (rows < LROWS)
- rows = LROWS;
- if (cols < LCOLS)
- cols = LCOLS;
-
- for (l = 0; l < LAYERS; l++) {
-
- /* allocate and initialize new Layout FB */
- newFB = malloc(cols * rows * sizeof(*newFB));
- for (i = 0; i < rows * cols; i++)
- newFB[i] = NO_COL;
-
- /* transfer contents */
- if (drv_generic_graphic_FB[l] != NULL) {
- for (row = 0; row < LROWS; row++) {
- for (col = 0; col < LCOLS; col++) {
- newFB[row * cols + col] = drv_generic_graphic_FB[l][row * LCOLS + col];
+ RGBA *newFB;
+ int i, l, row, col;
+
+ /* Layout FB is large enough */
+ if (rows <= LROWS && cols <= LCOLS)
+ return;
+
+ /* get maximum values */
+ if (rows < LROWS)
+ rows = LROWS;
+ if (cols < LCOLS)
+ cols = LCOLS;
+
+ for (l = 0; l < LAYERS; l++)
+ {
+
+ /* allocate and initialize new Layout FB */
+ newFB = malloc(cols * rows * sizeof(*newFB));
+ for (i = 0; i < rows * cols; i++)
+ newFB[i] = NO_COL;
+
+ /* transfer contents */
+ if (drv_generic_graphic_FB[l] != NULL)
+ {
+ for (row = 0; row < LROWS; row++)
+ {
+ for (col = 0; col < LCOLS; col++)
+ {
+ newFB[row * cols + col] = drv_generic_graphic_FB[l][row * LCOLS + col];
+ }
+ }
+ free(drv_generic_graphic_FB[l]);
}
- }
- free(drv_generic_graphic_FB[l]);
+ drv_generic_graphic_FB[l] = newFB;
}
- drv_generic_graphic_FB[l] = newFB;
- }
- LCOLS = cols;
- LROWS = rows;
+ LCOLS = cols;
+ LROWS = rows;
}
static void drv_generic_graphic_window(int pos, int size, int max, int *wpos, int *wsize)
{
- int p1 = pos;
- int p2 = pos + size;
+ int p1 = pos;
+ int p2 = pos + size;
- *wpos = 0;
- *wsize = 0;
+ *wpos = 0;
+ *wsize = 0;
- if (p1 > max || p2 < 0 || size < 1)
- return;
+ if (p1 > max || p2 < 0 || size < 1)
+ return;
- if (p1 < 0)
- p1 = 0;
+ if (p1 < 0)
+ p1 = 0;
- if (p2 > max)
- p2 = max;
+ if (p2 > max)
+ p2 = max;
- *wpos = p1;
- *wsize = p2 - p1;
+ *wpos = p1;
+ *wsize = p2 - p1;
}
static void drv_generic_graphic_blit(const int row, const int col, const int height, const int width)
{
- if (drv_generic_graphic_real_blit) {
- int r, c, h, w;
- drv_generic_graphic_window(row, height, DROWS, &r, &h);
- drv_generic_graphic_window(col, width, DCOLS, &c, &w);
- if (h > 0 && w > 0) {
- drv_generic_graphic_real_blit(r, c, h, w);
+ if (drv_generic_graphic_real_blit)
+ {
+ int r, c, h, w;
+ drv_generic_graphic_window(row, height, DROWS, &r, &h);
+ drv_generic_graphic_window(col, width, DCOLS, &c, &w);
+ if (h > 0 && w > 0)
+ {
+ drv_generic_graphic_real_blit(r, c, h, w);
+ }
}
- }
}
static RGBA drv_generic_graphic_blend(const int row, const int col)
{
- int l, o;
- RGBA p;
- RGBA ret;
-
- ret.R = BL_COL.R;
- ret.G = BL_COL.G;
- ret.B = BL_COL.B;
- 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;
+ int l, o;
+ RGBA p;
+ RGBA ret;
+
+ ret.R = BL_COL.R;
+ ret.G = BL_COL.G;
+ ret.B = BL_COL.B;
+ 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];
+ 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;
+ }
}
- }
-
- for (l = o; l >= 0; l--) {
- p = drv_generic_graphic_FB[l][row * LCOLS + col];
- 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)
+ {
+ ret.R = 255 - ret.R;
+ ret.G = 255 - ret.G;
+ ret.B = 255 - ret.B;
}
- }
- if (INVERTED) {
- ret.R = 255 - ret.R;
- ret.G = 255 - ret.G;
- ret.B = 255 - ret.B;
- }
-
- return ret;
+
+ return ret;
}
/****************************************/
static void drv_generic_graphic_render(const int layer, const int row, const int col, const RGBA fg, const RGBA bg,
- const char *style, const char *txt)
+ const char *style, const char *txt)
{
- int c, r, x, y, len;
- int bold;
-
- /* sanity checks */
- if (layer < 0 || layer >= LAYERS) {
- error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
- return;
- }
-
- len = strlen(txt);
-
- /* maybe grow layout framebuffer */
- drv_generic_graphic_resizeFB(row + YRES, col + XRES * len);
-
- r = row;
- c = col;
+ int c, r, x, y, len;
+ int bold;
+
+ /* sanity checks */
+ if (layer < 0 || layer >= LAYERS)
+ {
+ error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
+ return;
+ }
- /* render text into layout FB */
- bold = 0;
- while (*txt != '\0') {
- unsigned char *chr;
+ len = strlen(txt);
- /* magic char to toggle bold */
- if (*txt == '\a') {
- bold ^= 1;
- txt++;
- continue;
- }
- if (bold || strstr(style, "bold") != NULL) {
- chr = Font_6x8_bold[(int) *(unsigned char *) txt];
- } else {
- chr = Font_6x8[(int) *(unsigned char *) txt];
- }
+ /* maybe grow layout framebuffer */
+ drv_generic_graphic_resizeFB(row + YRES, col + XRES * len);
- for (y = 0; y < YRES; y++) {
- for (x = 0; x < XRES; x++) {
- int mask = 1 << 6;
- mask >>= ((x * 6) / (XRES)) + 1;
- if (chr[(y * 8) / (YRES)] & mask)
- drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;
+ r = row;
+ c = col;
+
+ /* render text into layout FB */
+ bold = 0;
+ while (*txt != '\0')
+ {
+ unsigned char *chr;
+
+ /* magic char to toggle bold */
+ if (*txt == '\a')
+ {
+ bold ^= 1;
+ txt++;
+ continue;
+ }
+ if (bold || strstr(style, "bold") != NULL)
+ {
+ chr = Font_6x8_bold[(int) *(unsigned char *) txt];
+ }
else
- drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;
- }
+ {
+ chr = Font_6x8[(int) *(unsigned char *) txt];
+ }
+
+ for (y = 0; y < YRES; y++)
+ {
+ for (x = 0; x < XRES; x++)
+ {
+ int mask = 1 << 6;
+ mask >>= ((x * 6) / (XRES)) + 1;
+ if (chr[(y * 8) / (YRES)] & mask)
+ drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;
+ else
+ drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;
+ }
+ }
+ c += XRES;
+ txt++;
}
- c += XRES;
- txt++;
- }
- /* flush area */
- drv_generic_graphic_blit(row, col, YRES, XRES * len);
+ /* flush area */
+ drv_generic_graphic_blit(row, col, YRES, XRES * len);
}
int drv_generic_graphic_greet(const char *msg1, const char *msg2)
{
#if 0
- char *line1[] = { "* LCD4Linux " VERSION " *",
- "LCD4Linux " VERSION,
- "* LCD4Linux *",
- "LCD4Linux",
- "L4Linux",
- NULL
- };
-
- char *line2[] = { "http://lcd4linux.bulix.org",
- "lcd4linux.bulix.org",
- NULL
- };
+ char *line1[] = { "* LCD4Linux " VERSION " *",
+ "LCD4Linux " VERSION,
+ "* LCD4Linux *",
+ "LCD4Linux",
+ "L4Linux",
+ NULL
+ };
+
+ char *line2[] = { "http://lcd4linux.bulix.org",
+ "lcd4linux.bulix.org",
+ NULL
+ };
#endif
- char *line1[] = { NULL };
- char *line2[] = { NULL };
+ char *line1[] = { NULL };
+ char *line2[] = { NULL };
- int i;
- int flag = 0;
+ int i;
+ int flag = 0;
- unsigned int cols = DCOLS / XRES;
- unsigned int rows = DROWS / YRES;
+ unsigned int cols = DCOLS / XRES;
+ unsigned int rows = DROWS / YRES;
- for (i = 0; line1[i]; i++) {
- if (strlen(line1[i]) <= cols) {
- drv_generic_graphic_render(0, YRES * 0, XRES * ((cols - strlen(line1[i])) / 2), FG_COL, BG_COL, "norm",
- line1[i]);
- flag = 1;
- break;
+ for (i = 0; line1[i]; i++)
+ {
+ if (strlen(line1[i]) <= cols)
+ {
+ drv_generic_graphic_render(0, YRES * 0, XRES * ((cols - strlen(line1[i])) / 2), FG_COL, BG_COL, "norm",
+ line1[i]);
+ flag = 1;
+ break;
+ }
}
- }
-
- if (rows >= 2) {
- for (i = 0; line2[i]; i++) {
- if (strlen(line2[i]) <= cols) {
- drv_generic_graphic_render(0, YRES * 1, XRES * ((cols - strlen(line2[i])) / 2), FG_COL, BG_COL, "norm",
- line2[i]);
- flag = 1;
- break;
- }
+
+ if (rows >= 2)
+ {
+ for (i = 0; line2[i]; i++)
+ {
+ if (strlen(line2[i]) <= cols)
+ {
+ drv_generic_graphic_render(0, YRES * 1, XRES * ((cols - strlen(line2[i])) / 2), FG_COL, BG_COL, "norm",
+ line2[i]);
+ flag = 1;
+ break;
+ }
+ }
}
- }
- if (msg1 && rows >= 3) {
- unsigned int len = strlen(msg1);
- if (len <= cols) {
- drv_generic_graphic_render(0, YRES * 2, XRES * ((cols - len) / 2), FG_COL, BG_COL, "norm", msg1);
- flag = 1;
+ if (msg1 && rows >= 3)
+ {
+ unsigned int len = strlen(msg1);
+ if (len <= cols)
+ {
+ drv_generic_graphic_render(0, YRES * 2, XRES * ((cols - len) / 2), FG_COL, BG_COL, "norm", msg1);
+ flag = 1;
+ }
}
- }
- if (msg2 && rows >= 4) {
- unsigned int len = strlen(msg2);
- if (len <= cols) {
- drv_generic_graphic_render(0, YRES * 3, XRES * ((cols - len) / 2), FG_COL, BG_COL, "norm", msg2);
- flag = 1;
+ if (msg2 && rows >= 4)
+ {
+ unsigned int len = strlen(msg2);
+ if (len <= cols)
+ {
+ drv_generic_graphic_render(0, YRES * 3, XRES * ((cols - len) / 2), FG_COL, BG_COL, "norm", msg2);
+ flag = 1;
+ }
}
- }
- return flag;
+ return flag;
}
int drv_generic_graphic_draw(WIDGET * W)
{
- WIDGET_TEXT *Text = W->data;
- RGBA fg, bg;
+ WIDGET_TEXT *Text = W->data;
+ RGBA fg, bg;
- fg = W->fg_valid ? W->fg_color : FG_COL;
- bg = W->bg_valid ? W->bg_color : BG_COL;
+ fg = W->fg_valid ? W->fg_color : FG_COL;
+ bg = W->bg_valid ? W->bg_color : BG_COL;
- drv_generic_graphic_render(W->layer, YRES * W->row, XRES * W->col, fg, bg, P2S(&Text->style), Text->buffer);
+ drv_generic_graphic_render(W->layer, YRES * W->row, XRES * W->col, fg, bg, P2S(&Text->style), Text->buffer);
- return 0;
+ return 0;
}
int drv_generic_graphic_icon_draw(WIDGET * W)
{
- WIDGET_ICON *Icon = W->data;
- RGBA fg, bg;
- unsigned char *bitmap = Icon->bitmap + YRES * Icon->curmap;
- int layer, row, col;
- int x, y;
- int visible;
-
- layer = W->layer;
- row = YRES * W->row;
- col = XRES * W->col;
-
- fg = W->fg_valid ? W->fg_color : FG_COL;
- bg = W->bg_valid ? W->bg_color : BG_COL;
-
- /* sanity check */
- if (layer < 0 || layer >= LAYERS) {
- error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
- return -1;
- }
-
- /* maybe grow layout framebuffer */
- drv_generic_graphic_resizeFB(row + YRES, col + XRES);
-
- /* Icon visible? */
- visible = P2N(&Icon->visible) > 0;
-
- /* render icon */
- for (y = 0; y < YRES; y++) {
- int mask = 1 << XRES;
- for (x = 0; x < XRES; x++) {
- int i = (row + y) * LCOLS + col + x;
- mask >>= 1;
- if (visible) {
- if (bitmap[y] & mask)
- drv_generic_graphic_FB[layer][i] = fg;
- else
- drv_generic_graphic_FB[layer][i] = bg;
- } else {
- drv_generic_graphic_FB[layer][i] = BG_COL;
- }
+ WIDGET_ICON *Icon = W->data;
+ RGBA fg, bg;
+ unsigned char *bitmap = Icon->bitmap + YRES * Icon->curmap;
+ int layer, row, col;
+ int x, y;
+ int visible;
+
+ layer = W->layer;
+ row = YRES * W->row;
+ col = XRES * W->col;
+
+ fg = W->fg_valid ? W->fg_color : FG_COL;
+ bg = W->bg_valid ? W->bg_color : BG_COL;
+
+ /* sanity check */
+ if (layer < 0 || layer >= LAYERS)
+ {
+ error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
+ return -1;
}
- }
- /* flush area */
- drv_generic_graphic_blit(row, col, YRES, XRES);
+ /* maybe grow layout framebuffer */
+ drv_generic_graphic_resizeFB(row + YRES, col + XRES);
+
+ /* Icon visible? */
+ visible = P2N(&Icon->visible) > 0;
+
+ /* render icon */
+ for (y = 0; y < YRES; y++)
+ {
+ int mask = 1 << XRES;
+ for (x = 0; x < XRES; x++)
+ {
+ int i = (row + y) * LCOLS + col + x;
+ mask >>= 1;
+ if (visible)
+ {
+ if (bitmap[y] & mask)
+ drv_generic_graphic_FB[layer][i] = fg;
+ else
+ drv_generic_graphic_FB[layer][i] = bg;
+ }
+ else
+ {
+ drv_generic_graphic_FB[layer][i] = BG_COL;
+ }
+ }
+ }
+
+ /* flush area */
+ drv_generic_graphic_blit(row, col, YRES, XRES);
- return 0;
+ return 0;
}
int drv_generic_graphic_bar_draw(WIDGET * W)
{
- WIDGET_BAR *Bar = W->data;
- RGBA fg, bg, bar[2];
- int layer, row, col, len, res, rev, max, val1, val2;
- int x, y;
- DIRECTION dir;
- STYLE style;
-
- layer = W->layer;
- row = YRES * W->row;
- col = XRES * W->col;
- dir = Bar->direction;
- style = Bar->style;
- len = Bar->length;
-
- fg = W->fg_valid ? W->fg_color : FG_COL;
- bg = W->bg_valid ? W->bg_color : BG_COL;
-
- bar[0] = Bar->color_valid[0] ? Bar->color[0] : fg;
- bar[1] = Bar->color_valid[1] ? Bar->color[1] : fg;
-
- /* sanity check */
- if (layer < 0 || layer >= LAYERS) {
- error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
- return -1;
- }
-
- /* 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 < YRES; y++) {
- int val = y < YRES / 2 ? val1 : val2;
- 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 : bc;
- else
- drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bc : bg;
+ WIDGET_BAR *Bar = W->data;
+ RGBA fg, bg, bar[2];
+ int layer, row, col, len, res, rev, max, val1, val2;
+ int x, y;
+ DIRECTION dir;
+ STYLE style;
+
+ layer = W->layer;
+ row = YRES * W->row;
+ col = XRES * W->col;
+ dir = Bar->direction;
+ style = Bar->style;
+ len = Bar->length;
+
+ fg = W->fg_valid ? W->fg_color : FG_COL;
+ bg = W->bg_valid ? W->bg_color : BG_COL;
+
+ bar[0] = Bar->color_valid[0] ? Bar->color[0] : fg;
+ bar[1] = Bar->color_valid[1] ? Bar->color[1] : fg;
+
+ /* sanity check */
+ if (layer < 0 || layer >= LAYERS)
+ {
+ error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
+ return -1;
+ }
- if (style) {
- drv_generic_graphic_FB[layer][(row + 0) * LCOLS + col + x] = fg;
- drv_generic_graphic_FB[layer][(row + YRES - 1) * LCOLS + col + x] = fg;
- }
- }
- if (style) {
- drv_generic_graphic_FB[layer][(row + y) * LCOLS + col] = fg;
- drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + max - 1] = fg;
- }
+ /* maybe grow layout framebuffer */
+ if (dir & (DIR_EAST | DIR_WEST))
+ {
+ drv_generic_graphic_resizeFB(row + YRES, col + XRES * len);
}
- break;
-
- case DIR_NORTH:
- val1 = max - val1;
- val2 = max - val2;
- rev = 1;
-
- 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 : bc;
- else
- 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;
+ 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 < YRES; y++)
+ {
+ int val = y < YRES / 2 ? val1 : val2;
+ 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 : bc;
+ else
+ drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + x] = rev ? bc : bg;
+
+ if (style)
+ {
+ drv_generic_graphic_FB[layer][(row + 0) * LCOLS + col + x] = fg;
+ drv_generic_graphic_FB[layer][(row + YRES - 1) * LCOLS + col + x] = fg;
+ }
+ }
+ if (style)
+ {
+ drv_generic_graphic_FB[layer][(row + y) * LCOLS + col] = fg;
+ drv_generic_graphic_FB[layer][(row + y) * LCOLS + col + max - 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;
+
+ case DIR_NORTH:
+ val1 = max - val1;
+ val2 = max - val2;
+ rev = 1;
+
+ 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 : bc;
+ else
+ 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;
}
- break;
- }
- /* flush area */
- if (dir & (DIR_EAST | DIR_WEST)) {
- drv_generic_graphic_blit(row, col, YRES, XRES * len);
- } else {
- drv_generic_graphic_blit(row, col, YRES * len, XRES);
- }
+ /* flush area */
+ if (dir & (DIR_EAST | DIR_WEST))
+ {
+ drv_generic_graphic_blit(row, col, YRES, XRES * len);
+ }
+ else
+ {
+ drv_generic_graphic_blit(row, col, YRES * len, XRES);
+ }
- return 0;
+ return 0;
}
int drv_generic_graphic_image_draw(WIDGET * W)
{
- WIDGET_IMAGE *Image = W->data;
- int layer, row, col, width, height;
- int x, y;
- int visible;
-
- layer = W->layer;
- row = W->row;
- col = W->col;
- width = Image->width;
- height = Image->height;
-
- /* sanity check */
- if (layer < 0 || layer >= LAYERS) {
- error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
- return -1;
- }
-
- /* if no size or no image at all, do nothing */
- if (width <= 0 || height <= 0 || Image->bitmap == NULL) {
- return 0;
- }
+ WIDGET_IMAGE *Image = W->data;
+ int layer, row, col, width, height;
+ int x, y;
+ int visible;
+
+ layer = W->layer;
+ row = W->row;
+ col = W->col;
+ width = Image->width;
+ height = Image->height;
+
+ /* sanity check */
+ if (layer < 0 || layer >= LAYERS)
+ {
+ error("%s: layer %d out of bounds (0..%d)", Driver, layer, LAYERS - 1);
+ return -1;
+ }
+
+ /* if no size or no image at all, do nothing */
+ if (width <= 0 || height <= 0 || Image->bitmap == NULL)
+ {
+ return 0;
+ }
int center = P2N(&Image->center);
- if (center) {
+ if (center)
+ {
int area_height = (Image->oldheight > Image->height) ? Image->oldheight : Image->height;
if (center > area_height)
area_height = center;
// flush area
drv_generic_graphic_blit(row, 0, area_height, LCOLS);
// fill it black or transparent
- for (y = 0; y < area_height; y++) {
- for (x = 0; x < LCOLS; x++) {
+ for (y = 0; y < area_height; y++)
+ {
+ for (x = 0; x < LCOLS; x++)
+ {
int i = (row + y ) * LCOLS + LCOLS + x;
drv_generic_graphic_FB[layer][i] = (Driver == "SamsungSPF") ? BG_COL : NO_COL;
}
else
col = 1;
row += (area_height - height) / 2;
- } else {
+ }
+ else
+ {
/* maybe grow layout framebuffer */
drv_generic_graphic_resizeFB(row + height, col + width);
}
- /* render image */
- visible = P2N(&Image->visible);
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- int i = (row + y) * LCOLS + col + x;
- if (visible) {
- drv_generic_graphic_FB[layer][i] = Image->bitmap[y * width + x];
- } else {
- drv_generic_graphic_FB[layer][i] = BG_COL;
- }
+ /* render image */
+ visible = P2N(&Image->visible);
+ for (y = 0; y < height; y++)
+ {
+ for (x = 0; x < width; x++)
+ {
+ int i = (row + y) * LCOLS + col + x;
+ if (visible)
+ {
+ drv_generic_graphic_FB[layer][i] = Image->bitmap[y * width + x];
+ }
+ else
+ {
+ drv_generic_graphic_FB[layer][i] = BG_COL;
+ }
+ }
}
- }
- /* flush area */
- drv_generic_graphic_blit(row, col, height, width);
+ /* flush area */
+ drv_generic_graphic_blit(row, col, height, width);
- return 0;
+ return 0;
}
int drv_generic_graphic_init(const char *section, const char *driver)
{
- int i, l;
- char *color;
- WIDGET_CLASS wc;
+ int i, l;
+ char *color;
+ WIDGET_CLASS wc;
+
+ Section = (char *) section;
+ Driver = (char *) driver;
+
+ /* init layout framebuffer */
+ LROWS = 0;
+ LCOLS = 0;
- Section = (char *) section;
- Driver = (char *) driver;
+ for (l = 0; l < LAYERS; l++)
+ drv_generic_graphic_FB[l] = NULL;
- /* init layout framebuffer */
- LROWS = 0;
- LCOLS = 0;
+ drv_generic_graphic_resizeFB(DROWS, DCOLS);
- for (l = 0; l < LAYERS; l++)
- drv_generic_graphic_FB[l] = NULL;
+ /* sanity check */
+ for (l = 0; l < LAYERS; l++)
+ {
+ if (drv_generic_graphic_FB[l] == NULL)
+ {
+ error("%s: framebuffer could not be allocated: malloc() failed", Driver);
+ return -1;
+ }
+ }
+
+ /* init generic driver & register plugins */
+ drv_generic_init();
+
+ /* set default colors */
+ color = cfg_get(Section, "foreground", "000000ff");
+ if (color2RGBA(color, &FG_COL) < 0)
+ {
+ error("%s: ignoring illegal color '%s'", Driver, color);
+ }
+ if (color)
+ free(color);
- drv_generic_graphic_resizeFB(DROWS, DCOLS);
+ color = cfg_get(Section, "background", "ffffff00");
+ if (color2RGBA(color, &BG_COL) < 0)
+ {
+ error("%s: ignoring illegal color '%s'", Driver, color);
+ }
+ if (color)
+ free(color);
- /* sanity check */
- for (l = 0; l < LAYERS; l++) {
- if (drv_generic_graphic_FB[l] == NULL) {
- error("%s: framebuffer could not be allocated: malloc() failed", Driver);
- return -1;
+ color = cfg_get(Section, "basecolor", "ffffff");
+ if (color2RGBA(color, &BL_COL) < 0)
+ {
+ error("%s: ignoring illegal color '%s'", Driver, color);
}
- }
-
- /* init generic driver & register plugins */
- drv_generic_init();
-
- /* set default colors */
- color = cfg_get(Section, "foreground", "000000ff");
- if (color2RGBA(color, &FG_COL) < 0) {
- error("%s: ignoring illegal color '%s'", Driver, color);
- }
- if (color)
- free(color);
-
- color = cfg_get(Section, "background", "ffffff00");
- if (color2RGBA(color, &BG_COL) < 0) {
- error("%s: ignoring illegal color '%s'", Driver, color);
- }
- if (color)
- free(color);
-
- color = cfg_get(Section, "basecolor", "ffffff");
- if (color2RGBA(color, &BL_COL) < 0) {
- error("%s: ignoring illegal color '%s'", Driver, color);
- }
- if (color)
- free(color);
-
- /* inverted display? */
- cfg_number(section, "inverted", 0, 0, 1, &INVERTED);
-
- /* register text widget */
- wc = Widget_Text;
- wc.draw = drv_generic_graphic_draw;
- widget_register(&wc);
-
- /* register icon widget */
- wc = Widget_Icon;
- wc.draw = drv_generic_graphic_icon_draw;
- widget_register(&wc);
-
- /* register bar widget */
- wc = Widget_Bar;
- wc.draw = drv_generic_graphic_bar_draw;
- widget_register(&wc);
-
- /* register image widget */
+ if (color)
+ free(color);
+
+ /* inverted display? */
+ cfg_number(section, "inverted", 0, 0, 1, &INVERTED);
+
+ /* register text widget */
+ wc = Widget_Text;
+ wc.draw = drv_generic_graphic_draw;
+ widget_register(&wc);
+
+ /* register icon widget */
+ wc = Widget_Icon;
+ wc.draw = drv_generic_graphic_icon_draw;
+ widget_register(&wc);
+
+ /* register bar widget */
+ wc = Widget_Bar;
+ wc.draw = drv_generic_graphic_bar_draw;
+ widget_register(&wc);
+
+ /* register image widget */
#ifdef WITH_IMAGE
- wc = Widget_Image;
- wc.draw = drv_generic_graphic_image_draw;
- widget_register(&wc);
- wc = Widget_Truetype;
- wc.draw = drv_generic_graphic_image_draw;
- widget_register(&wc);
+ wc = Widget_Image;
+ wc.draw = drv_generic_graphic_image_draw;
+ widget_register(&wc);
+ wc = Widget_Truetype;
+ wc.draw = drv_generic_graphic_image_draw;
+ widget_register(&wc);
#endif
- /* 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;
+ /* 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;
+ return 0;
}
int drv_generic_graphic_clear(void)
{
- int i, l;
+ int i, l;
- for (l = 0; l < LAYERS; l++)
- for (i = 0; i < LCOLS * LROWS; i++)
- drv_generic_graphic_FB[l][i] = NO_COL;
+ for (l = 0; l < LAYERS; l++)
+ for (i = 0; i < LCOLS * LROWS; i++)
+ drv_generic_graphic_FB[l][i] = NO_COL;
- drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
+ drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
- return 0;
+ return 0;
}
RGBA drv_generic_graphic_rgb(const int row, const int col)
{
- return drv_generic_graphic_blend(row, col);
+ return drv_generic_graphic_blend(row, col);
}
unsigned char drv_generic_graphic_gray(const int row, const int col)
{
- RGBA p = drv_generic_graphic_blend(row, col);
- return (77 * p.R + 150 * p.G + 28 * p.B) / 255;
+ RGBA p = drv_generic_graphic_blend(row, col);
+ return (77 * p.R + 150 * p.G + 28 * p.B) / 255;
}
unsigned char drv_generic_graphic_black(const int row, const int col)
{
- return drv_generic_graphic_gray(row, col) < 127;
+ return drv_generic_graphic_gray(row, col) < 127;
}
int drv_generic_graphic_quit(void)
{
- int l;
-
- for (l = 0; l < LAYERS; l++) {
- if (drv_generic_graphic_FB[l]) {
- free(drv_generic_graphic_FB[l]);
- drv_generic_graphic_FB[l] = NULL;
+ int l;
+
+ for (l = 0; l < LAYERS; l++)
+ {
+ if (drv_generic_graphic_FB[l])
+ {
+ free(drv_generic_graphic_FB[l]);
+ drv_generic_graphic_FB[l] = NULL;
+ }
}
- }
- widget_unregister();
- return (0);
+ widget_unregister();
+ return (0);
}
static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
{
- int x, y;
- int inverted;
- gdImagePtr gdImage;
+ int x, y;
+ int inverted;
+ gdImagePtr gdImage;
int scale,_width,_height;
- /* clear bitmap */
- if (Image->bitmap) {
- Image->oldheight = Image->height;
- int i;
- for (i = 0; i < Image->height * Image->width; i++) {
- RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
- Image->bitmap[i] = empty;
+ /* clear bitmap */
+ if (Image->bitmap)
+ {
+ Image->oldheight = Image->height;
+ int i;
+ for (i = 0; i < Image->height * Image->width; i++)
+ {
+ RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
+ Image->bitmap[i] = empty;
+ }
}
- }
- /* reload image only on first call or on explicit reload request */
- if (Image->gdImage == NULL || P2N(&Image->reload)) {
+ /* reload image only on first call or on explicit reload request */
+ if (Image->gdImage == NULL || P2N(&Image->reload))
+ {
- char *file;
- FILE *fd;
+ char *file;
+ FILE *fd;
- /* free previous image */
- if (Image->gdImage) {
- gdImageDestroy(Image->gdImage);
- Image->gdImage = NULL;
- }
+ /* 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;
- }
+ 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;
- }
+ 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);
+ Image->gdImage = gdImageCreateFromPng(fd);
+ fclose(fd);
- if (Image->gdImage == NULL) {
- error("Warning: Image %s: CreateFromPng(%s) failed!", Name, file);
- return;
- }
+ if (Image->gdImage == NULL)
+ {
+ error("Warning: Image %s: CreateFromPng(%s) failed!", Name, file);
+ return;
+ }
- }
+ }
_width = P2N(&Image->_width);
_height = P2N(&Image->_height);
scale = P2N(&Image->scale);
- if (((_width > 0) || (_height > 0)) && (scale == 100)) {
- gdImage = Image->gdImage;
+ if (((_width > 0) || (_height > 0)) && (scale == 100))
+ {
+ gdImage = Image->gdImage;
gdImagePtr scaled_image;
int ox = gdImageSX(gdImage);
int oy = gdImageSY(gdImage);
if (w_fac == 0) w_fac = h_fac+1;
if (h_fac == 0) h_fac = w_fac+1;
- if (w_fac > h_fac) {
- nx = h_fac * ox;
- ny = _height;
- } else {
- nx = _width;
- ny = w_fac * oy;
- }
+ if (w_fac > h_fac)
+ {
+ nx = h_fac * ox;
+ ny = _height;
+ }
+ else
+ {
+ nx = _width;
+ ny = w_fac * oy;
+ }
scaled_image = gdImageCreateTrueColor(nx,ny);
gdImageSaveAlpha(scaled_image, 1);
gdImageFill(scaled_image, 0, 0, gdImageColorAllocateAlpha(scaled_image, 0, 0, 0, 127));
gdImageCopyResized(scaled_image,Image->gdImage,0,0,0,0,nx,ny,ox,oy);
gdImageDestroy(Image->gdImage);
- Image->gdImage = scaled_image;
+ Image->gdImage = scaled_image;
}
/* Scale if needed */
- if ((scale != 100) && scale > 1) {
+ if ((scale != 100) && scale > 1)
+ {
gdImage = Image->gdImage;
gdImagePtr scaled_image;
int ox = gdImageSX(gdImage);
gdImageFill(scaled_image, 0, 0, gdImageColorAllocateAlpha(scaled_image, 0, 0, 0, 127));
gdImageCopyResized(scaled_image,Image->gdImage,0,0,0,0,nx,ny,ox,oy);
gdImageDestroy(Image->gdImage);
- Image->gdImage = scaled_image;
+ Image->gdImage = scaled_image;
}
- /* maybe resize bitmap */
- gdImage = Image->gdImage;
- if (gdImage->sx > Image->width || P2N(&Image->center)) {
- Image->width = gdImage->sx;
- free(Image->bitmap);
- Image->bitmap = NULL;
- }
- if (gdImage->sy > Image->height || P2N(&Image->center)) {
- Image->height = gdImage->sy;
- 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: %s", Name, i, strerror(errno));
- return;
+ /* maybe resize bitmap */
+ gdImage = Image->gdImage;
+ if (gdImage->sx > Image->width || P2N(&Image->center))
+ {
+ Image->width = gdImage->sx;
+ free(Image->bitmap);
+ Image->bitmap = NULL;
}
- for (i = 0; i < Image->height * Image->width; i++) {
- RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
- Image->bitmap[i] = empty;
+ if (gdImage->sy > Image->height || P2N(&Image->center))
+ {
+ Image->height = gdImage->sy;
+ free(Image->bitmap);
+ Image->bitmap = NULL;
}
- }
-
-
- /* finally really render it */
- 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);
- int a = gdTrueColorGetAlpha(p);
- int i = y * Image->width + x;
- Image->bitmap[i].R = gdTrueColorGetRed(p);
- Image->bitmap[i].G = gdTrueColorGetGreen(p);
- Image->bitmap[i].B = gdTrueColorGetBlue(p);
- /* 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 (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;
+ 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: %s", Name, i, strerror(errno));
+ return;
+ }
+ for (i = 0; i < Image->height * Image->width; i++)
+ {
+ RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
+ Image->bitmap[i] = empty;
+ }
+ }
+
+
+ /* finally really render it */
+ 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);
+ int a = gdTrueColorGetAlpha(p);
+ int i = y * Image->width + x;
+ Image->bitmap[i].R = gdTrueColorGetRed(p);
+ Image->bitmap[i].G = gdTrueColorGetGreen(p);
+ Image->bitmap[i].B = gdTrueColorGetBlue(p);
+ /* 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 (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;
+ }
+ }
}
- }
}
- }
}
static void widget_image_update(void *Self)
{
- WIDGET *W = (WIDGET *) Self;
- WIDGET_IMAGE *Image = W->data;
-
- /* process the parent only */
- if (W->parent == NULL) {
-
- /* evaluate properties */
- property_eval(&Image->file);
- property_eval(&Image->scale);
- property_eval(&Image->_width);
- property_eval(&Image->_height);
- property_eval(&Image->update);
- property_eval(&Image->reload);
- property_eval(&Image->visible);
- property_eval(&Image->inverted);
- property_eval(&Image->center);
-
- /* render image into bitmap */
- widget_image_render(W->name, Image);
-
- }
-
- /* finally, draw it! */
- if (W->class->draw)
- W->class->draw(W);
-
- /* add a new one-shot timer */
- if (P2N(&Image->update) > 0) {
- timer_add_widget(widget_image_update, Self, P2N(&Image->update), 1);
- }
+ WIDGET *W = (WIDGET *) Self;
+ WIDGET_IMAGE *Image = W->data;
+
+ /* process the parent only */
+ if (W->parent == NULL)
+ {
+
+ /* evaluate properties */
+ property_eval(&Image->file);
+ property_eval(&Image->scale);
+ property_eval(&Image->_width);
+ property_eval(&Image->_height);
+ property_eval(&Image->update);
+ property_eval(&Image->reload);
+ property_eval(&Image->visible);
+ property_eval(&Image->inverted);
+ property_eval(&Image->center);
+
+ /* render image into bitmap */
+ widget_image_render(W->name, Image);
+
+ }
+
+ /* finally, draw it! */
+ if (W->class->draw)
+ W->class->draw(W);
+
+ /* add a new one-shot timer */
+ if (P2N(&Image->update) > 0)
+ {
+ timer_add_widget(widget_image_update, Self, P2N(&Image->update), 1);
+ }
}
int widget_image_init(WIDGET * Self)
{
- char *section;
- WIDGET_IMAGE *Image;
-
- /* re-use the parent if one exists */
- if (Self->parent == NULL) {
-
- /* prepare config section */
- /* strlen("Widget:")=7 */
- section = malloc(strlen(Self->name) + 8);
- strcpy(section, "Widget:");
- strcat(section, Self->name);
-
- Image = malloc(sizeof(WIDGET_IMAGE));
- memset(Image, 0, sizeof(WIDGET_IMAGE));
-
- /* initial size */
- Image->width = 0;
- Image->height = 0;
- Image->bitmap = NULL;
-
- /* load properties */
- property_load(section, "file", NULL, &Image->file);
- property_load(section, "scale", "100", &Image->scale);
- property_load(section, "width", "0", &Image->_width);
- property_load(section, "height", "0", &Image->_height);
- 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);
- property_load(section, "center", "0", &Image->center);
-
- /* sanity checks */
- if (!property_valid(&Image->file)) {
- error("Warning: widget %s has no file", section);
- }
+ char *section;
+ WIDGET_IMAGE *Image;
+
+ /* re-use the parent if one exists */
+ if (Self->parent == NULL)
+ {
+
+ /* prepare config section */
+ /* strlen("Widget:")=7 */
+ section = malloc(strlen(Self->name) + 8);
+ strcpy(section, "Widget:");
+ strcat(section, Self->name);
+
+ Image = malloc(sizeof(WIDGET_IMAGE));
+ memset(Image, 0, sizeof(WIDGET_IMAGE));
+
+ /* initial size */
+ Image->width = 0;
+ Image->height = 0;
+ Image->bitmap = NULL;
+
+ /* load properties */
+ property_load(section, "file", NULL, &Image->file);
+ property_load(section, "scale", "100", &Image->scale);
+ property_load(section, "width", "0", &Image->_width);
+ property_load(section, "height", "0", &Image->_height);
+ 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);
+ property_load(section, "center", "0", &Image->center);
+
+ /* sanity checks */
+ if (!property_valid(&Image->file))
+ {
+ error("Warning: widget %s has no file", section);
+ }
- free(section);
- Self->data = Image;
- Self->x2 = Self->col + Image->width;
- Self->y2 = Self->row + Image->height;
+ free(section);
+ Self->data = Image;
+ Self->x2 = Self->col + Image->width;
+ Self->y2 = Self->row + Image->height;
- } else {
+ }
+ else
+ {
- /* re-use the parent */
- Self->data = Self->parent->data;
+ /* re-use the parent */
+ Self->data = Self->parent->data;
- }
+ }
- /* just do it! */
- widget_image_update(Self);
+ /* just do it! */
+ widget_image_update(Self);
- return 0;
+ return 0;
}
int widget_image_quit(WIDGET * Self)
{
- if (Self) {
- /* do not deallocate child widget! */
- if (Self->parent == NULL) {
- if (Self->data) {
- WIDGET_IMAGE *Image = Self->data;
- if (Image->gdImage) {
- gdImageDestroy(Image->gdImage);
- Image->gdImage = NULL;
+ if (Self)
+ {
+ /* do not deallocate child widget! */
+ if (Self->parent == NULL)
+ {
+ if (Self->data)
+ {
+ WIDGET_IMAGE *Image = Self->data;
+ if (Image->gdImage)
+ {
+ gdImageDestroy(Image->gdImage);
+ Image->gdImage = NULL;
+ }
+ free(Image->bitmap);
+ property_free(&Image->file);
+ property_free(&Image->scale);
+ property_free(&Image->_width);
+ property_free(&Image->_height);
+ property_free(&Image->update);
+ property_free(&Image->reload);
+ property_free(&Image->visible);
+ property_free(&Image->inverted);
+ property_free(&Image->center);
+ free(Self->data);
+ Self->data = NULL;
+ }
}
- free(Image->bitmap);
- property_free(&Image->file);
- property_free(&Image->scale);
- property_free(&Image->_width);
- property_free(&Image->_height);
- property_free(&Image->update);
- property_free(&Image->reload);
- property_free(&Image->visible);
- property_free(&Image->inverted);
- property_free(&Image->center);
- free(Self->data);
- Self->data = NULL;
- }
}
- }
- return 0;
+ return 0;
}
-WIDGET_CLASS Widget_Image = {
- .name = "image",
- .type = WIDGET_TYPE_XY,
- .init = widget_image_init,
- .draw = NULL,
- .quit = widget_image_quit,
+WIDGET_CLASS Widget_Image =
+{
+ .name = "image",
+ .type = WIDGET_TYPE_XY,
+ .init = widget_image_init,
+ .draw = NULL,
+ .quit = widget_image_quit,
};
#include "widget.h"
#include "rgb.h"
-typedef struct WIDGET_IMAGE {
- void *gdImage; /* raw gd image */
- RGBA *bitmap; /* image bitmap */
- int width, height; /* size of the image */
- int oldheight; /* height of the image before */
- PROPERTY file; /* image filename */
- PROPERTY scale; /* scale image in percent */
+typedef struct WIDGET_IMAGE
+{
+ void *gdImage; /* raw gd image */
+ RGBA *bitmap; /* image bitmap */
+ int width, height; /* size of the image */
+ int oldheight; /* height of the image before */
+ PROPERTY file; /* image filename */
+ PROPERTY scale; /* scale image in percent */
PROPERTY _width; /* scale image to witdh */
PROPERTY _height; /* scale image to height */
- PROPERTY update; /* update interval */
- PROPERTY reload; /* reload image on update? */
- PROPERTY visible; /* image visible? */
- PROPERTY inverted; /* image inverted? */
- PROPERTY center; /* image centered? */
+ PROPERTY update; /* update interval */
+ PROPERTY reload; /* reload image on update? */
+ PROPERTY visible; /* image visible? */
+ PROPERTY inverted; /* image inverted? */
+ PROPERTY center; /* image centered? */
} WIDGET_IMAGE;
extern WIDGET_CLASS Widget_Image;
static void widget_ttf_render(const char *Name, WIDGET_TTF * Image)
{
- int x, y;
- int inverted;
- gdImagePtr gdImage;
-
- int color;
- int trans;
- int brect[8];
- char *e;
- unsigned long l;
- unsigned char r,g,b;
- char *fcolor;
- char *text;
- double size;
- char *font;
- char *err;
-
-
- /* clear bitmap */
- if (Image->bitmap)
- {
- Image->oldheight = Image->height;
- int i;
- for (i = 0; i < Image->height * Image->width; i++)
- {
- RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
- Image->bitmap[i] = empty;
- }
- }
-
- /* reload image only on first call or on explicit reload request */
- if (Image->gdImage == NULL || P2N(&Image->reload))
- {
-
- /* free previous image */
- if (Image->gdImage)
- {
- gdImageDestroy(Image->gdImage);
- Image->gdImage = NULL;
- }
-
- //replace with expression and use as text
- text = P2S(&Image->value);
- font = P2S(&Image->font);
- size = P2N(&Image->size);
-
- err = gdImageStringFT(NULL,&brect[0],0,font,size,0.,0,0,text);
-
- x = brect[2]-brect[6] + 6;
- y = brect[3]-brect[7] + 6;
- Image->gdImage = gdImageCreateTrueColor(x,y);
- gdImageSaveAlpha(Image->gdImage, 1);
-
- if (Image->gdImage == NULL)
- {
- error("Warning: Image %s: Create failed!", Name);
- return;
- }
- trans = gdImageColorAllocateAlpha(Image->gdImage, 0, 0, 0, 127);
- gdImageFill(Image->gdImage, 0, 0, trans);
-
- fcolor = P2S(&Image->fcolor);
-
- l = strtoul(fcolor, &e, 16);
- r = (l >> 16) & 0xff;
- g = (l >> 8) & 0xff;
- b = l & 0xff;
-
- color = gdImageColorAllocate(Image->gdImage, r, g, b);
-
- x = 3 - brect[6];
- y = 3 - brect[7];
- err = gdImageStringFT(Image->gdImage,&brect[0],color,font,size,0.0,x,y,text);
-
- }
-
- /* maybe resize bitmap */
- gdImage = Image->gdImage;
- if (gdImage->sx > Image->width || P2N(&Image->center))
- {
- Image->width = gdImage->sx;
- free(Image->bitmap);
- Image->bitmap = NULL;
- }
- if (gdImage->sy > Image->height || P2N(&Image->center))
- {
- Image->height = gdImage->sy;
- 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: %s", Name, i, strerror(errno));
- return;
- }
- for (i = 0; i < Image->height * Image->width; i++)
- {
- RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
- Image->bitmap[i] = empty;
- }
- }
-
-
- /* finally really render it */
- 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);
- int a = gdTrueColorGetAlpha(p);
- int i = y * Image->width + x;
- Image->bitmap[i].R = gdTrueColorGetRed(p);
- Image->bitmap[i].G = gdTrueColorGetGreen(p);
- Image->bitmap[i].B = gdTrueColorGetBlue(p);
- /* 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 (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;
- }
- }
- }
- }
+ int x, y;
+ int inverted;
+ gdImagePtr gdImage;
+
+ int color;
+ int trans;
+ int brect[8];
+ char *e;
+ unsigned long l;
+ unsigned char r,g,b;
+ char *fcolor;
+ char *text;
+ double size;
+ char *font;
+ char *err;
+
+
+ /* clear bitmap */
+ if (Image->bitmap)
+ {
+ Image->oldheight = Image->height;
+ int i;
+ for (i = 0; i < Image->height * Image->width; i++)
+ {
+ RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
+ Image->bitmap[i] = empty;
+ }
+ }
+
+ /* reload image only on first call or on explicit reload request */
+ if (Image->gdImage == NULL || P2N(&Image->reload))
+ {
+
+ /* free previous image */
+ if (Image->gdImage)
+ {
+ gdImageDestroy(Image->gdImage);
+ Image->gdImage = NULL;
+ }
+
+ //replace with expression and use as text
+ text = P2S(&Image->value);
+ font = P2S(&Image->font);
+ size = P2N(&Image->size);
+
+ err = gdImageStringFT(NULL,&brect[0],0,font,size,0.,0,0,text);
+
+ x = brect[2]-brect[6] + 6;
+ y = brect[3]-brect[7] + 6;
+ Image->gdImage = gdImageCreateTrueColor(x,y);
+ gdImageSaveAlpha(Image->gdImage, 1);
+
+ if (Image->gdImage == NULL)
+ {
+ error("Warning: Image %s: Create failed!", Name);
+ return;
+ }
+ trans = gdImageColorAllocateAlpha(Image->gdImage, 0, 0, 0, 127);
+ gdImageFill(Image->gdImage, 0, 0, trans);
+
+ fcolor = P2S(&Image->fcolor);
+
+ l = strtoul(fcolor, &e, 16);
+ r = (l >> 16) & 0xff;
+ g = (l >> 8) & 0xff;
+ b = l & 0xff;
+
+ color = gdImageColorAllocate(Image->gdImage, r, g, b);
+
+ x = 3 - brect[6];
+ y = 3 - brect[7];
+ err = gdImageStringFT(Image->gdImage,&brect[0],color,font,size,0.0,x,y,text);
+
+ }
+
+ /* maybe resize bitmap */
+ gdImage = Image->gdImage;
+ if (gdImage->sx > Image->width || P2N(&Image->center))
+ {
+ Image->width = gdImage->sx;
+ free(Image->bitmap);
+ Image->bitmap = NULL;
+ }
+ if (gdImage->sy > Image->height || P2N(&Image->center))
+ {
+ Image->height = gdImage->sy;
+ 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: %s", Name, i, strerror(errno));
+ return;
+ }
+ for (i = 0; i < Image->height * Image->width; i++)
+ {
+ RGBA empty = {.R = 0x00,.G = 0x00,.B = 0x00,.A = 0x00 };
+ Image->bitmap[i] = empty;
+ }
+ }
+
+
+ /* finally really render it */
+ 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);
+ int a = gdTrueColorGetAlpha(p);
+ int i = y * Image->width + x;
+ Image->bitmap[i].R = gdTrueColorGetRed(p);
+ Image->bitmap[i].G = gdTrueColorGetGreen(p);
+ Image->bitmap[i].B = gdTrueColorGetBlue(p);
+ /* 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 (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;
+ }
+ }
+ }
+ }
}
static void widget_ttf_update(void *Self)
{
- WIDGET *W = (WIDGET *) Self;
- WIDGET_TTF *Image = W->data;
-
- /* process the parent only */
- if (W->parent == NULL)
- {
-
- /* evaluate properties */
- property_eval(&Image->value);
- property_eval(&Image->size);
- property_eval(&Image->font);
- property_eval(&Image->fcolor);
- property_eval(&Image->update);
- property_eval(&Image->reload);
- property_eval(&Image->visible);
- property_eval(&Image->inverted);
- property_eval(&Image->center);
-
- /* render image into bitmap */
- widget_ttf_render(W->name, Image);
-
- }
-
- /* finally, draw it! */
- if (W->class->draw)
- W->class->draw(W);
-
- /* add a new one-shot timer */
- if (P2N(&Image->update) > 0)
- {
- timer_add_widget(widget_ttf_update, Self, P2N(&Image->update), 1);
- }
+ WIDGET *W = (WIDGET *) Self;
+ WIDGET_TTF *Image = W->data;
+
+ /* process the parent only */
+ if (W->parent == NULL)
+ {
+
+ /* evaluate properties */
+ property_eval(&Image->value);
+ property_eval(&Image->size);
+ property_eval(&Image->font);
+ property_eval(&Image->fcolor);
+ property_eval(&Image->update);
+ property_eval(&Image->reload);
+ property_eval(&Image->visible);
+ property_eval(&Image->inverted);
+ property_eval(&Image->center);
+
+ /* render image into bitmap */
+ widget_ttf_render(W->name, Image);
+
+ }
+
+ /* finally, draw it! */
+ if (W->class->draw)
+ W->class->draw(W);
+
+ /* add a new one-shot timer */
+ if (P2N(&Image->update) > 0)
+ {
+ timer_add_widget(widget_ttf_update, Self, P2N(&Image->update), 1);
+ }
}
int widget_ttf_init(WIDGET * Self)
{
- char *section;
- WIDGET_TTF *Image;
-
- /* re-use the parent if one exists */
- if (Self->parent == NULL)
- {
-
- /* prepare config section */
- /* strlen("Widget:")=7 */
- section = malloc(strlen(Self->name) + 8);
- strcpy(section, "Widget:");
- strcat(section, Self->name);
-
- Image = malloc(sizeof(WIDGET_TTF));
- memset(Image, 0, sizeof(WIDGET_TTF));
-
- /* initial size */
- Image->width = 0;
- Image->height = 0;
- Image->bitmap = NULL;
-
- /* load properties */
- property_load(section, "expression", "Samsung", &Image->value);
- property_load(section, "size", "40", &Image->size);
- property_load(section, "font", NULL, &Image->font);
- property_load(section, "fcolor", "ff0000", &Image->fcolor);
- 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);
- property_load(section, "center", "0", &Image->center);
-
- /* sanity checks */
- if (!property_valid(&Image->font))
- {
- error("Warning: widget %s has no font", section);
- }
-
- free(section);
- Self->data = Image;
- Self->x2 = Self->col + Image->width;
- Self->y2 = Self->row + Image->height;
-
- }
- else
- {
-
- /* re-use the parent */
- Self->data = Self->parent->data;
-
- }
-
- /* just do it! */
- widget_ttf_update(Self);
-
- return 0;
+ char *section;
+ WIDGET_TTF *Image;
+
+ /* re-use the parent if one exists */
+ if (Self->parent == NULL)
+ {
+
+ /* prepare config section */
+ /* strlen("Widget:")=7 */
+ section = malloc(strlen(Self->name) + 8);
+ strcpy(section, "Widget:");
+ strcat(section, Self->name);
+
+ Image = malloc(sizeof(WIDGET_TTF));
+ memset(Image, 0, sizeof(WIDGET_TTF));
+
+ /* initial size */
+ Image->width = 0;
+ Image->height = 0;
+ Image->bitmap = NULL;
+
+ /* load properties */
+ property_load(section, "expression", "Samsung", &Image->value);
+ property_load(section, "size", "40", &Image->size);
+ property_load(section, "font", NULL, &Image->font);
+ property_load(section, "fcolor", "ff0000", &Image->fcolor);
+ 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);
+ property_load(section, "center", "0", &Image->center);
+
+ /* sanity checks */
+ if (!property_valid(&Image->font))
+ {
+ error("Warning: widget %s has no font", section);
+ }
+
+ free(section);
+ Self->data = Image;
+ Self->x2 = Self->col + Image->width;
+ Self->y2 = Self->row + Image->height;
+
+ }
+ else
+ {
+
+ /* re-use the parent */
+ Self->data = Self->parent->data;
+
+ }
+
+ /* just do it! */
+ widget_ttf_update(Self);
+
+ return 0;
}
int widget_ttf_quit(WIDGET * Self)
{
- if (Self)
- {
- /* do not deallocate child widget! */
- if (Self->parent == NULL)
- {
- if (Self->data)
- {
- WIDGET_TTF *Image = Self->data;
- if (Image->gdImage)
- {
- gdImageDestroy(Image->gdImage);
- Image->gdImage = NULL;
- }
- free(Image->bitmap);
- property_free(&Image->value);
- property_free(&Image->size);
- property_free(&Image->font);
- property_free(&Image->fcolor);
- property_free(&Image->update);
- property_free(&Image->reload);
- property_free(&Image->visible);
- property_free(&Image->inverted);
- property_free(&Image->center);
- free(Self->data);
- Self->data = NULL;
- }
- }
- }
-
- return 0;
+ if (Self)
+ {
+ /* do not deallocate child widget! */
+ if (Self->parent == NULL)
+ {
+ if (Self->data)
+ {
+ WIDGET_TTF *Image = Self->data;
+ if (Image->gdImage)
+ {
+ gdImageDestroy(Image->gdImage);
+ Image->gdImage = NULL;
+ }
+ free(Image->bitmap);
+ property_free(&Image->value);
+ property_free(&Image->size);
+ property_free(&Image->font);
+ property_free(&Image->fcolor);
+ property_free(&Image->update);
+ property_free(&Image->reload);
+ property_free(&Image->visible);
+ property_free(&Image->inverted);
+ property_free(&Image->center);
+ free(Self->data);
+ Self->data = NULL;
+ }
+ }
+ }
+
+ return 0;
}
WIDGET_CLASS Widget_Truetype =
{
- .name = "Truetype",
- .type = WIDGET_TYPE_XY,
- .init = widget_ttf_init,
- .draw = NULL,
- .quit = widget_ttf_quit,
+ .name = "Truetype",
+ .type = WIDGET_TYPE_XY,
+ .init = widget_ttf_init,
+ .draw = NULL,
+ .quit = widget_ttf_quit,
};
typedef struct WIDGET_TTF
{
- void *gdImage; /* raw gd image */
- RGBA *bitmap; /* image bitmap */
- int width, height; /* size of the image */
- int oldheight; /* height of the image before */
- PROPERTY value; /* text to render */
- PROPERTY size; /* fontsize */
- PROPERTY font; /* path to font */
- PROPERTY fcolor; /* font color */
- PROPERTY update; /* update interval */
- PROPERTY reload; /* reload image on update? */
- PROPERTY visible; /* image visible? */
- PROPERTY inverted; /* image inverted? */
- PROPERTY center; /* image centered? */
+ void *gdImage; /* raw gd image */
+ RGBA *bitmap; /* image bitmap */
+ int width, height; /* size of the image */
+ int oldheight; /* height of the image before */
+ PROPERTY value; /* text to render */
+ PROPERTY size; /* fontsize */
+ PROPERTY font; /* path to font */
+ PROPERTY fcolor; /* font color */
+ PROPERTY update; /* update interval */
+ PROPERTY reload; /* reload image on update? */
+ PROPERTY visible; /* image visible? */
+ PROPERTY inverted; /* image inverted? */
+ PROPERTY center; /* image centered? */
} WIDGET_TTF;
extern WIDGET_CLASS Widget_Truetype;