This patch join the common code of RGetImageFromXPMData() and RLoadXPM()
functions.

Now, these functions load the XPM file in a unsigned char pointer, then call
the new function RDrawXPM(). This function do the common code of RLoadXPM()
and RGetImageFromXPMData() functions.

Note: In this patch the xpm is used as pointer, not as struct, so there are
a lot of changes of "xpm.xyz" to "xpm->xyz" and "xpm" to "&xpm".

Signed-off-by: Rodolfo García Peñas (kix) <[email protected]>
---
 wrlib/xpm.c | 208 +++++++++++++++++++++++-------------------------------------
 1 file changed, 81 insertions(+), 127 deletions(-)

diff --git a/wrlib/xpm.c b/wrlib/xpm.c
index 12aadc6..ca4c600 100644
--- a/wrlib/xpm.c
+++ b/wrlib/xpm.c
@@ -33,81 +33,63 @@
 #include "wraster.h"
 #include "imgformat.h"
 
-RImage *RGetImageFromXPMData(RContext * context, char **xpmData)
+RImage *RDrawXPM(RContext *context, RImage *image, unsigned char *srcdata)
 {
        Display *dpy = context->dpy;
        Colormap cmap = context->cmap;
-       RImage *image;
-       XpmImage xpm;
        unsigned char *color_table[4];
        unsigned char *data;
+       XpmImage *xpm;
        int *p;
        int i;
 
-       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);
+       if ((context == NULL) || (image == NULL) || (srcdata == NULL)) {
+               if (image)
+                       RReleaseImage(image);
+
+               if (srcdata)
+                       free(srcdata);
+
                return NULL;
        }
 
-       if (xpm.colorTable == NULL) {
+       xpm = (XpmImage *) srcdata;
+
+       if (xpm->colorTable == NULL) {
                RErrorCode = RERR_BADIMAGEFILE;
-               XpmFreeXpmImage(&xpm);
-               return NULL;
-       }
-       image = RCreateImage(xpm.width, xpm.height, True);
-       if (!image) {
-               XpmFreeXpmImage(&xpm);
+               XpmFreeXpmImage(xpm);
                return NULL;
        }
 
        /* make color table */
        for (i = 0; i < 4; i++) {
-               color_table[i] = malloc(xpm.ncolors * sizeof(char));
+               color_table[i] = malloc(xpm->ncolors * sizeof(char));
                if (!color_table[i]) {
-                       for (i = i - 1; i >= 0; i--) {
+                       for (i = i - 1; i >= 0; i--)
                                if (color_table[i])
                                        free(color_table[i]);
-                       }
+
                        RReleaseImage(image);
                        RErrorCode = RERR_NOMEMORY;
-                       XpmFreeXpmImage(&xpm);
+                       XpmFreeXpmImage(xpm);
                        return NULL;
                }
        }
 
-       for (i = 0; i < xpm.ncolors; i++) {
+       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 (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;
@@ -136,35 +118,32 @@ RImage *RGetImageFromXPMData(RContext * context, char 
**xpmData)
                        color_table[3][i] = 0xff;
                }
        }
+
        /* convert pixmap to RImage */
-       p = (int *)xpm.data;
+       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);
+
+       XpmFreeXpmImage(xpm);
        return image;
 }
 
-RImage *RLoadXPM(RContext * context, const char *file)
+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;
+       unsigned char *srcdata;
        int i;
 
-       i = XpmReadFileToXpmImage((char *)file, &xpm, (XpmInfo *) NULL);
+       i = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *) NULL);
        if (i != XpmSuccess) {
                switch (i) {
                case XpmOpenFailed:
@@ -182,93 +161,68 @@ RImage *RLoadXPM(RContext * context, const char *file)
                }
                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(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;
+       srcdata = (unsigned char *) malloc(sizeof(xpm));
+       memcpy(srcdata, &xpm, sizeof(xpm));
+       image = RDrawXPM(context, image, srcdata);
 
-               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;
+       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;
+       unsigned char *srcdata;
+       int i;
 
-               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;
+       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;
        }
-       /* 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];
+       if (xpm.height < 1 || xpm.width < 1) {
+               RErrorCode = RERR_BADIMAGEFILE;
+               XpmFreeXpmImage(&xpm);
+               return NULL;
        }
-       for (i = 0; i < 4; i++) {
-               free(color_table[i]);
+
+       image = RCreateImage(xpm.width, xpm.height, True);
+       if (!image) {
+               XpmFreeXpmImage(&xpm);
+               return NULL;
        }
-       XpmFreeXpmImage(&xpm);
+
+       /* Add the XpmImage xpm as srcdata */
+       srcdata = (unsigned char *) malloc(sizeof(xpm));
+       memcpy(srcdata, &xpm, sizeof(xpm));
+       image = RDrawXPM(context, image, srcdata);
+
        return image;
 }
 
-- 
1.8.4.rc3


-- 
To unsubscribe, send mail to [email protected].

Reply via email to