From 568b6e05b5e67a3feadb1daa5b3c7c4b8daa7338 Mon Sep 17 00:00:00 2001
From: David Maciejak <david.maciejak@gmail.com>
Date: Tue, 26 Aug 2014 23:02:35 +0800
Subject: [PATCH 2/2] wrlib: remove duplicate code from xpm support

This patch is removing the duplicate code by
using functions create_rimage_xpm and is_xpm_error
previously created.
---
 wrlib/load_xpm.c | 230 +++----------------------------------------------------
 1 file changed, 11 insertions(+), 219 deletions(-)

diff --git a/wrlib/load_xpm.c b/wrlib/load_xpm.c
index 8f32bee..8f3592d 100644
--- a/wrlib/load_xpm.c
+++ b/wrlib/load_xpm.c
@@ -146,241 +146,33 @@ static int is_xpm_error(int status)
 	}
 	return 1;
 }
-RImage *RGetImageFromXPMData(RContext * context, char **xpmData)
+
+RImage *RGetImageFromXPMData(RContext *context, char **xpmData)
 {
-	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 status;
 
-	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;
-		}
+	status = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *) NULL);
+	if (is_xpm_error(status))
 		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);
-		return NULL;
-	}
-
-	/* 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;
-		}
-	}
-
-	for (i = 0; i < xpm.ncolors; i++) {
-		XColor xcolor;
-		char *color = 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;
-
-		if (!color) {
-			color_table[0][i] = 0xbe;
-			color_table[1][i] = 0xbe;
-			color_table[2][i] = 0xbe;
-			color_table[3][i] = 0xff;
-			continue;
-		}
-
-		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++) {
-		*(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++) {
-		free(color_table[i]);
-	}
+	image = create_rimage_from_xpm(context, xpm);
 	XpmFreeXpmImage(&xpm);
 	return image;
 }
 
-RImage *RLoadXPM(RContext * context, const char *file)
+RImage *RLoadXPM(RContext *context, const char *file)
 {
-	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 status;
 
-	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) {
-		RErrorCode = RERR_BADIMAGEFILE;
-		XpmFreeXpmImage(&xpm);
+	status = XpmReadFileToXpmImage((char *)file, &xpm, (XpmInfo *) NULL);
+	if (is_xpm_error(status))
 		return NULL;
-	}
 
-	if (xpm.colorTable == NULL) {
-		RErrorCode = RERR_BADIMAGEFILE;
-		XpmFreeXpmImage(&xpm);
-		return NULL;
-	}
-	image = RCreateImage(xpm.width, xpm.height, True);
-	if (!image) {
-		XpmFreeXpmImage(&xpm);
-		return NULL;
-	}
-
-	/* 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;
-		}
-	}
-
-	for (i = 0; i < xpm.ncolors; i++) {
-		XColor xcolor;
-		char *color = 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;
-
-		if (!color) {
-			color_table[0][i] = 0xbe;
-			color_table[1][i] = 0xbe;
-			color_table[2][i] = 0xbe;
-			color_table[3][i] = 0xff;
-			continue;
-		}
-
-		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]);
-	}
+	image = create_rimage_from_xpm(context, xpm);
 	XpmFreeXpmImage(&xpm);
 	return image;
 }
-- 
1.8.3.2

