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].
