From 8121e05d761550a826dfe473d3643a9e8cc192bd Mon Sep 17 00:00:00 2001
From: David Maciejak <david.maciejak@gmail.com>
Date: Tue, 26 Aug 2014 08:14:39 +0700
Subject: [PATCH] wrlib: merge duplicate code from xpm support

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;
 }
-- 
1.8.3.2

