This patch is saving about 80 lines of code by creating 2 new static fcts: create_rimage_from_xpm and is_xpm_error.
---
wrlib/load_xpm.c | 183 ++++++++++++++-----------------------------------------
1 file changed, 45 insertions(+), 138 deletions(-)
diff --git a/wrlib/load_xpm.c b/wrlib/load_xpm.c
index 35adbb1..8f3592d 100644
--- a/wrlib/load_xpm.c
+++ b/wrlib/load_xpm.c
@@ -3,6 +3,7 @@
* Raster graphics library
*
* Copyright (c) 1997-2003 Alfredo K. Kojima
+ * Copyright (c) 2014 Window Maker Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -31,51 +32,28 @@
#include "wraster.h"
#include "imgformat.h"
-RImage *RGetImageFromXPMData(RContext * context, char **xpmData)
+static RImage *create_rimage_from_xpm(RContext *context, XpmImage xpm)
{
Display *dpy = context->dpy;
Colormap cmap = context->cmap;
RImage *image;
- XpmImage xpm;
unsigned char *color_table[4];
unsigned char *data;
- int *p;
int i;
+ int *p;
- i = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *) NULL);
- if (i != XpmSuccess) {
- switch (i) {
- case XpmOpenFailed:
- RErrorCode = RERR_OPEN;
- break;
- case XpmFileInvalid:
- RErrorCode = RERR_BADIMAGEFILE;
- break;
- case XpmNoMemory:
- RErrorCode = RERR_NOMEMORY;
- break;
- default:
- RErrorCode = RERR_BADIMAGEFILE;
- break;
- }
- return NULL;
- }
if (xpm.height < 1 || xpm.width < 1) {
RErrorCode = RERR_BADIMAGEFILE;
- XpmFreeXpmImage(&xpm);
return NULL;
}
if (xpm.colorTable == NULL) {
RErrorCode = RERR_BADIMAGEFILE;
- XpmFreeXpmImage(&xpm);
return NULL;
}
image = RCreateImage(xpm.width, xpm.height, True);
- if (!image) {
- XpmFreeXpmImage(&xpm);
+ if (!image)
return NULL;
- }
/* make color table */
for (i = 0; i < 4; i++) {
@@ -87,7 +65,6 @@ RImage *RGetImageFromXPMData(RContext * context,
char **xpmData)
}
RReleaseImage(image);
RErrorCode = RERR_NOMEMORY;
- XpmFreeXpmImage(&xpm);
return NULL;
}
}
@@ -137,135 +114,65 @@ RImage *RGetImageFromXPMData(RContext *
context, char **xpmData)
/* convert pixmap to RImage */
p = (int *)xpm.data;
data = image->data;
- for (i = 0; i < xpm.width * xpm.height; i++) {
+ for (i = 0; i < xpm.width * xpm.height; i++, p++) {
*(data++) = color_table[0][*p];
*(data++) = color_table[1][*p];
*(data++) = color_table[2][*p];
*(data++) = color_table[3][*p];
- p++;
}
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 4; i++)
free(color_table[i]);
- }
- XpmFreeXpmImage(&xpm);
return image;
}
-RImage *RLoadXPM(RContext * context, const char *file)
+static int is_xpm_error(int status)
{
- Display *dpy = context->dpy;
- Colormap cmap = context->cmap;
- RImage *image;
- XpmImage xpm;
- unsigned char *color_table[4];
- unsigned char *data;
- int *p;
- int i;
-
- i = XpmReadFileToXpmImage((char *)file, &xpm, (XpmInfo *) NULL);
- if (i != XpmSuccess) {
- switch (i) {
- case XpmOpenFailed:
- RErrorCode = RERR_OPEN;
- break;
- case XpmFileInvalid:
- RErrorCode = RERR_BADIMAGEFILE;
- break;
- case XpmNoMemory:
- RErrorCode = RERR_NOMEMORY;
- break;
- default:
- RErrorCode = RERR_BADIMAGEFILE;
- break;
- }
- return NULL;
- }
- if (xpm.height < 1 || xpm.width < 1) {
+ if (status == XpmSuccess)
+ return 0;
+
+ switch (status) {
+ case XpmOpenFailed:
+ RErrorCode = RERR_OPEN;
+ break;
+ case XpmFileInvalid:
RErrorCode = RERR_BADIMAGEFILE;
- XpmFreeXpmImage(&xpm);
- return NULL;
- }
-
- if (xpm.colorTable == NULL) {
+ break;
+ case XpmNoMemory:
+ RErrorCode = RERR_NOMEMORY;
+ break;
+ default:
RErrorCode = RERR_BADIMAGEFILE;
- XpmFreeXpmImage(&xpm);
- return NULL;
- }
- image = RCreateImage(xpm.width, xpm.height, True);
- if (!image) {
- XpmFreeXpmImage(&xpm);
- return NULL;
+ break;
}
+ return 1;
+}
- /* make color table */
- for (i = 0; i < 4; i++) {
- color_table[i] = malloc(xpm.ncolors * sizeof(unsigned char));
- if (!color_table[i]) {
- for (i = i - 1; i >= 0; i--) {
- if (color_table[i])
- free(color_table[i]);
- }
- RReleaseImage(image);
- RErrorCode = RERR_NOMEMORY;
- XpmFreeXpmImage(&xpm);
- return NULL;
- }
- }
+RImage *RGetImageFromXPMData(RContext *context, char **xpmData)
+{
+ RImage *image;
+ XpmImage xpm;
+ int status;
- for (i = 0; i < xpm.ncolors; i++) {
- XColor xcolor;
- char *color = NULL;
+ status = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *) NULL);
+ if (is_xpm_error(status))
+ return NULL;
- if (xpm.colorTable[i].c_color)
- color = xpm.colorTable[i].c_color;
- else if (xpm.colorTable[i].g_color)
- color = xpm.colorTable[i].g_color;
- else if (xpm.colorTable[i].g4_color)
- color = xpm.colorTable[i].g4_color;
- else if (xpm.colorTable[i].m_color)
- color = xpm.colorTable[i].m_color;
- else if (xpm.colorTable[i].symbolic)
- color = xpm.colorTable[i].symbolic;
+ image = create_rimage_from_xpm(context, xpm);
+ XpmFreeXpmImage(&xpm);
+ return image;
+}
- if (!color) {
- color_table[0][i] = 0xbe;
- color_table[1][i] = 0xbe;
- color_table[2][i] = 0xbe;
- color_table[3][i] = 0xff;
- continue;
- }
+RImage *RLoadXPM(RContext *context, const char *file)
+{
+ RImage *image;
+ XpmImage xpm;
+ int status;
- if (strncmp(color, "None", 4) == 0) {
- color_table[0][i] = 0;
- color_table[1][i] = 0;
- color_table[2][i] = 0;
- color_table[3][i] = 0;
- continue;
- }
- if (XParseColor(dpy, cmap, color, &xcolor)) {
- color_table[0][i] = xcolor.red >> 8;
- color_table[1][i] = xcolor.green >> 8;
- color_table[2][i] = xcolor.blue >> 8;
- color_table[3][i] = 0xff;
- } else {
- color_table[0][i] = 0xbe;
- color_table[1][i] = 0xbe;
- color_table[2][i] = 0xbe;
- color_table[3][i] = 0xff;
- }
- }
- /* convert pixmap to RImage */
- p = (int *)xpm.data;
- data = image->data;
- for (i = 0; i < xpm.width * xpm.height; i++, p++) {
- *(data++) = color_table[0][*p];
- *(data++) = color_table[1][*p];
- *(data++) = color_table[2][*p];
- *(data++) = color_table[3][*p];
- }
- for (i = 0; i < 4; i++) {
- free(color_table[i]);
- }
+ status = XpmReadFileToXpmImage((char *)file, &xpm, (XpmInfo *) NULL);
+ if (is_xpm_error(status))
+ return NULL;
+
+ image = create_rimage_from_xpm(context, xpm);
XpmFreeXpmImage(&xpm);
return image;
}
0001-wrlib-merge-duplicate-code-from-xpm-support.patch
Description: Binary data
