From ce385f6b5abf6b55fdaee8ab2f378da276c8c38d Mon Sep 17 00:00:00 2001 From: TangoCash Date: Tue, 3 May 2016 22:37:48 +0200 Subject: [PATCH] format source code - no code changes --- drv_SamsungSPF.c | 904 +++++++++++++++++++----------------- drv_generic_graphic.c | 1021 ++++++++++++++++++++++------------------- widget_image.c | 428 +++++++++-------- widget_image.h | 25 +- widget_ttf.c | 510 ++++++++++---------- widget_ttf.h | 26 +- 6 files changed, 1536 insertions(+), 1378 deletions(-) diff --git a/drv_SamsungSPF.c b/drv_SamsungSPF.c index c70694e..1e94cd2 100644 --- a/drv_SamsungSPF.c +++ b/drv_SamsungSPF.c @@ -7,7 +7,7 @@ * Copyright (C) 2005, 2006, 2007 The LCD4Linux Team * * 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: * @@ -60,130 +60,133 @@ // 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, }; diff --git a/drv_generic_graphic.c b/drv_generic_graphic.c index ecd5e33..c56d032 100644 --- a/drv_generic_graphic.c +++ b/drv_generic_graphic.c @@ -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); } diff --git a/widget_image.c b/widget_image.c index b87688f..8b1b532 100644 --- a/widget_image.c +++ b/widget_image.c @@ -71,61 +71,69 @@ 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, }; diff --git a/widget_image.h b/widget_image.h index 964ce4b..d31cefe 100644 --- a/widget_image.h +++ b/widget_image.h @@ -32,20 +32,21 @@ #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; diff --git a/widget_ttf.c b/widget_ttf.c index d9d2cf5..47438a1 100644 --- a/widget_ttf.c +++ b/widget_ttf.c @@ -67,272 +67,272 @@ 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, }; diff --git a/widget_ttf.h b/widget_ttf.h index b56ba12..dc30d73 100644 --- a/widget_ttf.h +++ b/widget_ttf.h @@ -30,19 +30,19 @@ 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; -- 2.39.5