]> git.webhop.me Git - lcd4linux.git/commitdiff
format source code - no code changes
authorTangoCash <eric@loxat.de>
Tue, 3 May 2016 20:37:48 +0000 (22:37 +0200)
committerTangoCash <eric@loxat.de>
Tue, 3 May 2016 20:37:48 +0000 (22:37 +0200)
drv_SamsungSPF.c
drv_generic_graphic.c
widget_image.c
widget_image.h
widget_ttf.c
widget_ttf.h

index c70694e05254d425e8a0e21e820bc703cff936ea..1e94cd23fb1fd3d65b91f0204f3a092d1f11d5a5 100644 (file)
@@ -7,7 +7,7 @@
    * 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.
@@ -28,7 +28,7 @@
    *
    */
 
-/* 
+/*
    *
    * 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]);
@@ -192,19 +195,22 @@ struct usb_device *myDev;
 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;
 
 
@@ -216,191 +222,214 @@ static struct {
 /* 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;
@@ -410,126 +439,141 @@ static int drv_SamsungSPF_send(char *data, unsigned int len)
        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;
 }
 
 
@@ -542,17 +586,18 @@ static int drv_SamsungSPF_start(const char *section)
 /* 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;
 }
 
 
@@ -560,80 +605,89 @@ int drv_SamsungSPF_list(void)
 /* 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;
 }
 
 
@@ -642,32 +696,34 @@ int drv_SamsungSPF_init(const char *section, const int quiet)
 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,
 };
index ecd5e33eca5a7f65441519e04a4eb2e02ffea286..c56d0320bfd56cfd27e3d41bc92ae09d24caab51 100644 (file)
@@ -24,7 +24,7 @@
  *
  */
 
-/* 
+/*
  *
  * exported functions:
  *
@@ -106,123 +106,134 @@ void (*drv_generic_graphic_real_blit) () = NULL;
 
 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;
 }
 
 
@@ -231,58 +242,66 @@ static RGBA drv_generic_graphic_blend(const int row, const int col)
 /****************************************/
 
 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);
 
 }
 
@@ -291,80 +310,89 @@ static void drv_generic_graphic_render(const int layer, const int row, const int
 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;
 }
 
 
@@ -374,53 +402,59 @@ int drv_generic_graphic_draw(WIDGET * W)
 
 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;
 
 }
 
@@ -431,120 +465,136 @@ int drv_generic_graphic_icon_draw(WIDGET * W)
 
 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;
 }
 
 
@@ -554,30 +604,33 @@ int drv_generic_graphic_bar_draw(WIDGET * W)
 
 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;
@@ -586,8 +639,10 @@ int drv_generic_graphic_image_draw(WIDGET * W)
                // 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;
                        }
@@ -598,28 +653,35 @@ int drv_generic_graphic_image_draw(WIDGET * W)
                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;
 
 }
 
@@ -630,135 +692,142 @@ int drv_generic_graphic_image_draw(WIDGET * W)
 
 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);
 }
index b87688f0ae5a5c0b45a4d47102143d2e7593d00a..8b1b532e83df95fa07e61e0d731b2000c5a0ea04 100644 (file)
 
 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);
@@ -139,24 +147,28 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
                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);
@@ -168,190 +180,210 @@ static void widget_image_render(const char *Name, WIDGET_IMAGE * Image)
                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,
 };
index 964ce4b8d9ae4430d54622204b76c12a3649c095..d31cefecf4ddf540f357670637c0f7d240ca51f9 100644 (file)
 #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;
index d9d2cf56ff71a5872a46def2e758be7aacdeaefb..47438a1265b129eda1c1dcb6c0e3d4626e6ca74c 100644 (file)
 
 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;
 
 }
 
@@ -340,9 +340,9 @@ int widget_ttf_quit(WIDGET * Self)
 
 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,
 };
index b56ba1255ca52c0587e8ed39fe27166b458fb1ae..dc30d73bc06ebc2c2960f0ba1548653d42ed50cb 100644 (file)
 
 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;