X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b926666447f1ceef18873cdd80966402a3ece222..a81258bee4e20d3fa9b3d2f6bf3bcd1200d1e5e0:/src/gdk_imlib/load.c diff --git a/src/gdk_imlib/load.c b/src/gdk_imlib/load.c deleted file mode 100644 index ef5913da87..0000000000 --- a/src/gdk_imlib/load.c +++ /dev/null @@ -1,1498 +0,0 @@ - -#define _GNU_SOURCE -#include "../gdk_imlib/config.h" - -#include "../gdk_imlib/gdk_imlib.h" -#include "../gdk_imlib/gdk_imlib_private.h" - -/* Split the ID - damages input */ - -static char * -g_SplitID(char *file) -{ - char *p = strrchr(file, ':'); - - if (p == NULL) - return ""; - else - { - *p++ = 0; - return p; - } -} - -/* - * Doesn't damage the input - */ - -char * -g_GetExtension(char *file) -{ - char *p = strrchr(file, '.'); - - if (p == NULL) - return ""; - else - return p + 1; -} - -#ifdef HAVE_LIBJPEG -unsigned char * -g_LoadJPEG(FILE * f, int *w, int *h) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - unsigned char *data, *line[16], *ptr; - int x, y, i; - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, f); - jpeg_read_header(&cinfo, TRUE); - cinfo.do_fancy_upsampling = FALSE; - cinfo.do_block_smoothing = FALSE; - jpeg_start_decompress(&cinfo); - *w = cinfo.output_width; - *h = cinfo.output_height; - data = malloc(*w ** h * 3); - if (!data) - { - jpeg_destroy_decompress(&cinfo); - return NULL; - } - ptr = data; - - if (cinfo.rec_outbuf_height > 16) - { - fprintf(stderr, "gdk_imlib ERROR: JPEG uses line buffers > 16. Cannot load.\n"); - return NULL; - } - if (cinfo.output_components == 3) - { - for (y = 0; y < *h; y += cinfo.rec_outbuf_height) - { - for (i = 0; i < cinfo.rec_outbuf_height; i++) - { - line[i] = ptr; - ptr += *w * 3; - } - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - } - } - else if (cinfo.output_components == 1) - { - for (i = 0; i < cinfo.rec_outbuf_height; i++) - { - if ((line[i] = malloc(*w)) == NULL) - { - int t = 0; - - for (t = 0; t < i; t++) - free(line[t]); - jpeg_destroy_decompress(&cinfo); - return NULL; - } - } - for (y = 0; y < *h; y += cinfo.rec_outbuf_height) - { - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - for (i = 0; i < cinfo.rec_outbuf_height; i++) - { - for (x = 0; x < *w; x++) - { - *ptr++ = line[i][x]; - *ptr++ = line[i][x]; - *ptr++ = line[i][x]; - } - } - } - for (i = 0; i < cinfo.rec_outbuf_height; i++) - free(line[i]); - } - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - return data; -} -#endif /* HAVE_LIBJPEG */ - -#ifdef HAVE_LIBPNG -unsigned char * -g_LoadPNG(FILE * f, int *w, int *h, int *t) -{ - png_structp png_ptr; - png_infop info_ptr; - unsigned char *data, *ptr, **lines, *ptr2, r, g, b, a; - int i, x, y, transp, bit_depth, color_type, interlace_type; - png_uint_32 *ww, *hh; - - /* Init PNG Reader */ - transp = 0; - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - return NULL; - - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { - png_destroy_read_struct(&png_ptr, NULL, NULL); - return NULL; - } - - if (setjmp(png_ptr->jmpbuf)) - { - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - png_init_io(png_ptr, f); - /* Read Header */ - png_read_info(png_ptr, info_ptr); - ww = (png_uint_32 *) w; - hh = (png_uint_32 *) h; - png_get_IHDR(png_ptr, info_ptr, ww, hh, &bit_depth, &color_type, &interlace_type, - NULL, NULL); - /* Setup Translators */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - png_set_expand(png_ptr); - png_set_strip_16(png_ptr); - png_set_packing(png_ptr); - if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_expand(png_ptr); - png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); - *w = info_ptr->width; - *h = info_ptr->height; - data = malloc(*w ** h * 3); - if (!data) - { - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - lines = (unsigned char **)malloc(*h * sizeof(unsigned char *)); - - if (lines == NULL) - { - free(data); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - for (i = 0; i < *h; i++) - { - if ((lines[i] = malloc(*w * (sizeof(unsigned char) * 4))) == NULL) - { - int n; - - free(data); - for (n = 0; n < i; n++) - free(lines[n]); - free(lines); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - } - png_read_image(png_ptr, lines); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - ptr = data; - if (color_type == PNG_COLOR_TYPE_GRAY) - { - for (y = 0; y < *h; y++) - { - ptr2 = lines[y]; - for (x = 0; x < *w; x++) - { - r = *ptr2++; - *ptr++ = r; - *ptr++ = r; - *ptr++ = r; - } - } - } - else - { - for (y = 0; y < *h; y++) - { - ptr2 = lines[y]; - for (x = 0; x < *w; x++) - { - r = *ptr2++; - g = *ptr2++; - b = *ptr2++; - a = *ptr2++; - if (a < 128) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - transp = 1; - } - else - { - if ((r == 255) && (g == 0) && (b == 255)) - r = 254; - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - } - } - } - } - for (i = 0; i < *h; i++) - free(lines[i]); - free(lines); - *t = transp; - return data; -} -#endif /* HAVE_LIBPNG */ - -#ifdef HAVE_LIBTIFF -unsigned char * -g_LoadTIFF(char *f, int *w, int *h, int *t) -{ - TIFF *tif; - unsigned char *data, *ptr, r, g, b, a; - int x, y; - uint32 ww, hh, *rast, *tptr; - size_t npix; - int istransp; - - istransp = 0; - if (!f) - return NULL; - - tif = TIFFOpen(f, "r"); - if (!tif) - return NULL; - - TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &ww); - TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &hh); - npix = ww * hh; - *w = (int)ww; - *h = (int)hh; - rast = (uint32 *) _TIFFmalloc(npix * sizeof(uint32)); - if (!rast) - { - TIFFClose(tif); - return NULL; - } - data = NULL; - if (TIFFReadRGBAImage(tif, ww, hh, rast, 0)) - { - data = (unsigned char *)malloc(*w ** h * 3); - if (!data) - { - _TIFFfree(rast); - TIFFClose(tif); - return NULL; - } - ptr = data; - for (y = 0; y < *h; y++) - { - tptr = rast; - tptr += ((*h - y - 1) ** w); - for (x = 0; x < *w; x++) - { - a = TIFFGetA(*tptr); - b = TIFFGetB(*tptr); - g = TIFFGetG(*tptr); - r = TIFFGetR(*tptr); - tptr++; - if (a < 128) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - istransp = 1; - } - else - { - if ((r == 255) && (g == 0) && (b == 255)) - r = 254; - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - } - } - } - } - _TIFFfree(rast); - TIFFClose(tif); - *t = istransp; - return data; -} - -#endif /* HAVE_LIBTIFF */ - -#ifdef HAVE_LIBGIF -unsigned char * -g_LoadGIF(char *f, int *w, int *h, int *t) -{ - unsigned char *data, *ptr; - GifFileType *gif; - GifRowType *rows; - GifRecordType rec; - ColorMapObject *cmap; - int i, j, done, bg, csize, r, g, b; - int intoffset[] = - {0, 4, 2, 1}; - int intjump[] = - {8, 8, 4, 2}; - int istransp, transp; - - done = 0; - istransp = 0; - gif = DGifOpenFileName(f); - if (!gif) - return NULL; - - do - { - DGifGetRecordType(gif, &rec); - if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done)) - { - DGifGetImageDesc(gif); - *w = gif->Image.Width; - *h = gif->Image.Height; - rows = malloc(*h * sizeof(GifRowType *)); - if (!rows) - { - DGifCloseFile(gif); - return NULL; - } - data = malloc(*w ** h * 3); - if (!data) - { - DGifCloseFile(gif); - free(rows); - return NULL; - } - for (i = 0; i < *h; i++) - rows[i] = NULL; - for (i = 0; i < *h; i++) - { - rows[i] = malloc(*w * sizeof(GifPixelType)); - if (!rows[i]) - { - DGifCloseFile(gif); - for (i = 0; i < *h; i++) - if (rows[i]) - free(rows[i]); - free(rows); - free(data); - return NULL; - } - } - if (gif->Image.Interlace) - { - for (i = 0; i < 4; i++) - { - for (j = intoffset[i]; j < *h; j += intjump[i]) - DGifGetLine(gif, rows[j], *w); - } - } - else - { - for (i = 0; i < *h; i++) - DGifGetLine(gif, rows[i], *w); - } - done = 1; - } - else if (rec == EXTENSION_RECORD_TYPE) - { - int ext_code; - GifByteType *ext; - - DGifGetExtension(gif, &ext_code, &ext); - if (ext) - { - if ((ext[1] & 1)) - { - istransp = 1; - transp = (int)ext[4]; - } - } - do - { - DGifGetExtensionNext(gif, &ext); - } - while (ext); - } - } - while (rec != TERMINATE_RECORD_TYPE); - bg = gif->SBackGroundColor; - cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap); - csize = cmap->ColorCount; - ptr = data; - if (!istransp) - { - for (i = 0; i < *h; i++) - { - for (j = 0; j < *w; j++) - { - r = cmap->Colors[rows[i][j]].Red; - g = cmap->Colors[rows[i][j]].Green; - b = cmap->Colors[rows[i][j]].Blue; - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - } - } - } - else - { - for (i = 0; i < *h; i++) - { - for (j = 0; j < *w; j++) - { - if (rows[i][j] == transp) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - } - else - { - r = cmap->Colors[rows[i][j]].Red; - g = cmap->Colors[rows[i][j]].Green; - b = cmap->Colors[rows[i][j]].Blue; - if (r == 255 && g == 0 && b == 255) - r = 254; - *ptr++ = r; - *ptr++ = g; - *ptr++ = b; - } - } - } - } - DGifCloseFile(gif); - for (i = 0; i < *h; i++) - free(rows[i]); - free(rows); - *t = istransp; - return data; -} - -#endif /* HAVE_LIBGIF */ - -unsigned char * -g_LoadXPM(char *f, int *w, int *h, int *t) -{ - FILE *file; - unsigned char *data, *ptr; - int pc, c, i, j, k, ncolors, cpp, comment, transp, quote, - context, len, /*token,*/ done; - char line[65536], s[65536], tok[65536], col[65536]; - XColor xcol; - struct _cmap - { - char str[8]; - char transp; - int r, g, b; - } - *cmap; - int lookup[128][128]; - - i = 0; - j = 0; - - transp = 0; - done = 0; - cmap = NULL; - - file = fopen(f, "r"); - if (!file) - return NULL; - - *w = 10; - *h = 10; - - ptr = NULL; - data = NULL; - c = ' '; - comment = 0; - quote = 0; - context = 0; - - while (!done) - { - pc = c; - c = fgetc(file); - if (c == EOF) - break; - if (!quote) - { - if (pc == '/' && c == '*') - comment = 1; - else if (pc == '*' && c == '/' && comment) - comment = 0; - } - if (!comment) - { - if (!quote && c == '"') - { - quote = 1; - i = 0; - } - else if (quote && c == '"') - { - line[i] = 0; - quote = 0; - if (context == 0) - { - /* Header */ - sscanf(line, "%i %i %i %i", w, h, &ncolors, &cpp); - if (cpp > 7) - { - fprintf(stderr, "gdk_imlib ERROR: XPM files with characters per pixel > 7 not supported\n"); - return NULL; - } - if (*w > 32767) - { - fprintf(stderr, "gdk_imlib ERROR: Image width > 32767 pixels for file\n"); - return NULL; - } - if (*h > 32767) - { - fprintf(stderr, "gdk_imlib ERROR: Image height > 32767 pixels for file\n"); - return NULL; - } - cmap = malloc(sizeof(struct _cmap) * ncolors); - - if (!cmap) - return NULL; - data = malloc(*w ** h * 3); - if (!data) - { - free(cmap); - return NULL; - } - ptr = data; - j = 0; - context++; - } - else if (context == 1) - { - /* Color Table */ - if (j < ncolors) - { - /* int colptr = 0; not used */ - int slen; - - tok[0] = 0; - col[0] = 0; - s[0] = 0; - len = strlen(line); - strncpy(cmap[j].str, line, cpp); - cmap[j].str[cpp] = 0; - cmap[j].r = -1; - cmap[j].transp = 0; - for (k = cpp; k < len; k++) - { - if (line[k] != ' ') - { - s[0] = 0; - sscanf(&line[k], "%65535s", s); - slen = strlen(s); - k += slen; - if ((!strcmp(s, "m")) || (!strcmp(s, "s")) || - (!strcmp(s, "g4")) || (!strcmp(s, "g")) || - (!strcmp(s, "c")) || (k >= len)) - { - if (k >= len) - { - if (col[0]) - strcat(col, " "); - strcat(col, s); - } - if (col[0]) - { - if (!strcasecmp(col, "none")) - { - transp = 1; - cmap[j].transp = 1; - } - else - { - if ((cmap[j].r < 0) || - (!strcmp(tok, "c"))) - { - XParseColor(id->x.disp, - id->x.root_cmap, - col, &xcol); - cmap[j].r = xcol.red >> 8; - cmap[j].g = xcol.green >> 8; - cmap[j].b = xcol.blue >> 8; - if ((cmap[j].r == 255) && - (cmap[j].g == 0) && - (cmap[j].b == 255)) - cmap[j].r = 254; - } - } - } - strcpy(tok, s); - col[0] = 0; - } - else - { - if (col[0]) - strcat(col, " "); - strcat(col, s); - } - } - } - } - j++; - if (j >= ncolors) - { - if (cpp == 1) - for (i = 0; i < ncolors; i++) - lookup[(int)cmap[i].str[0]][(int)cmap[i].str[1]] = i; - if (cpp == 2) - for (i = 0; i < ncolors; i++) - lookup[(int)cmap[i].str[0]][(int)cmap[i].str[1]] = i; - context++; - } - } - else - { - /* Image Data */ - i = 0; - if (cpp == 0) - { - /* Chars per pixel = 0? well u never know */ - } - if (cpp == 1) - { - if (transp) - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - col[0] = line[i]; - if (cmap[lookup[(int)col[0]][0]].transp) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - } - else - { - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].r; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].g; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].b; - } - } - } - else - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - col[0] = line[i]; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].r; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].g; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][0]].b; - } - } - } - else if (cpp == 2) - { - if (transp) - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - col[0] = line[i++]; - col[1] = line[i]; - if (cmap[lookup[(int)col[0]][(int)col[1]]].transp) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - } - else - { - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].r; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].g; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].b; - } - } - } - else - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - col[0] = line[i++]; - col[1] = line[i]; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].r; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].g; - *ptr++ = (unsigned char)cmap[lookup[(int)col[0]][(int)col[1]]].b; - } - } - } - else - { - if (transp) - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - for (j = 0; j < cpp; j++, i++) - { - col[j] = line[i]; - } - col[j] = 0; - i--; - for (j = 0; j < ncolors; j++) - { - if (!strcmp(col, cmap[j].str)) - { - if (cmap[j].transp) - { - *ptr++ = 255; - *ptr++ = 0; - *ptr++ = 255; - } - else - { - *ptr++ = (unsigned char)cmap[j].r; - *ptr++ = (unsigned char)cmap[j].g; - *ptr++ = (unsigned char)cmap[j].b; - } - j = ncolors; - } - } - } - } - else - { - for (i = 0; ((i < 65536) && (line[i])); i++) - { - for (j = 0; j < cpp; j++, i++) - { - col[j] = line[i]; - } - col[j] = 0; - i--; - for (j = 0; j < ncolors; j++) - { - if (!strcmp(col, cmap[j].str)) - { - *ptr++ = (unsigned char)cmap[j].r; - *ptr++ = (unsigned char)cmap[j].g; - *ptr++ = (unsigned char)cmap[j].b; - j = ncolors; - } - } - } - } - } - } - } - } - /* Scan in line from XPM file (limit line length 65k) */ - if (i < 65536) - { - if ((!comment) && (quote) && (c != '"')) - { - line[i++] = c; - } - } - if ((ptr) && ((ptr - data) >= *w ** h * 3)) - done = 1; - } - fclose(file); - if (transp) - *t = 1; - else - *t = 0; - free(cmap); - return data; -} - -unsigned char * -g_LoadPPM(FILE * f, int *w, int *h) -{ - int done; - unsigned char *ptr; - unsigned char chr; - char s[256]; - int a, b; - int color, scale; - - a = b = scale = 0; - fgets(s, 256, f); - s[strlen(s) - 1] = 0; - - if (!strcmp(s, "P6")) - color = 1; - else if (!strcmp(s, "P5")) - color = 0; - else - return NULL; - - done = 1; - ptr = NULL; - while (done) - { - if (fgets(s, 256, f) == NULL) - break; - - s[strlen(s) - 1] = 0; - if (s[0] != '#') - { - done = 0; - sscanf(s, "%i %i", w, h); - a = *w; - b = *h; - if (a > 32767) - { - fprintf(stderr, "gdk_imlib ERROR: Image width > 32767 pixels for file\n"); - return NULL; - } - if (b > 32767) - { - fprintf(stderr, "gdk_imlib ERROR: Image height > 32767 pixels for file\n"); - return NULL; - } - fgets(s, 256, f); - sscanf(s, "%i", &scale); - s[strlen(s) - 1] = 0; - ptr = (unsigned char *)malloc(a * b * 3); - if (!ptr) - { - fprintf(stderr, "gdk_imlib ERROR: Cannot allocate RAM for RGB data in file"); - return ptr; - } - if (color) - { - if (!fread(ptr, a * b * 3, 1, f)) - { - free(ptr); - return NULL; - } - } - else - { - b = (a * b * 3); - a = 0; - while ((fread(&chr, 1, 1, f)) && (a < b)) - { - ptr[a++] = chr; - ptr[a++] = chr; - ptr[a++] = chr; - } - } - } - } - if (scale == 0) - { - free(ptr); - return NULL; - } - if (scale < 255) - { - int rot; - unsigned char *po; - - if (scale <= 1) - rot = 7; - else if (scale <= 3) - rot = 6; - else if (scale <= 7) - rot = 5; - else if (scale <= 15) - rot = 4; - else if (scale <= 31) - rot = 3; - else if (scale <= 63) - rot = 2; - else - rot = 1; - - if (rot > 0) - { - po = ptr; - while (po < (ptr + (*w ** h * 3))) - { - *po++ <<= rot; - *po++ <<= rot; - *po++ <<= rot; - } - } - } - return ptr; -} - -static int -gispnm(char *file) -{ - FILE *f; - char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fgets(buf, 8, f); - fclose(f); - if (!strcmp("P6\n", buf)) - return 1; - if (!strcmp("P5\n", buf)) - return 1; - return 0; -} - -static int -gisjpeg(char *file) -{ - FILE *f; - unsigned char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fread(buf, 1, 2, f); - fclose(f); - if ((buf[0] == 0xff) && (buf[1] == 0xd8)) - return 1; - return 0; -} - -static int -gispng(char *file) -{ -#ifdef HAVE_LIBPNG - FILE *f; - unsigned char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fread(buf, 1, 8, f); - fclose(f); - return (int)png_check_sig(buf, 8); -#else - return 0; -#endif -} - -static int -gistiff(char *file) -{ - FILE *f; - char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fgets(buf, 5, f); - fclose(f); - if ((buf[0] == 'M') && (buf[1] == 'M') && (buf[2] == 0x00) && (buf[3] == 0x2a)) - return 1; - if ((buf[0] == 'I') && (buf[1] == 'I') && (buf[2] == 0x2a) && (buf[3] == 0x00)) - return 1; - return 0; -} - -static int -giseim(char *file) -{ - FILE *f; - char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fread(buf, 1, 4, f); - fclose(f); - if (!strncmp("EIM ", buf, 4)) - return 1; - return 0; -} - -static int -gisgif(char *file) -{ - FILE *f; - char buf[8]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fread(buf, 1, 4, f); - fclose(f); - buf[4] = 0; - if (!strcmp("GIF8", buf)) - return 1; - return 0; -} - -static int -gisxpm(char *file) -{ - FILE *f; - char buf[11]; - - f = fopen(file, "rb"); - if (!f) - return 0; - fread(buf, 1, 9, f); - fclose(f); - buf[9] = 0; - if (!strcmp("/* XPM */", buf)) - return 1; - return 0; -} - -GdkImlibImage * -gdk_imlib_load_image(char *file) -{ - int w, h; - int needs_conv = 1; - unsigned char *data; - GdkImlibImage *im; - char s[4096]; - char fil[4096]; - char *iden; - char *e; - char cmd[4096]; - FILE *p; - int eim; - int fmt; - int trans; - - eim = 0; - fmt = 0; - p = NULL; - data = NULL; - - if (!file) - return NULL; - if (id->cache.on_image) - if ((im = gfind_image(file))) - return im; - - strncpy(fil, file, sizeof(fil)); - iden = g_SplitID(fil); - e = g_GetExtension(fil); - - if (gispnm(fil)) - { - needs_conv = 0; - fmt = 0; - } - else if (gisjpeg(fil)) - { -#ifdef HAVE_LIBJPEG - needs_conv = 0; - fmt = 2; -#else - needs_conv = 1; - fmt = 0; -#endif - } - else if (gistiff(fil)) - { -#ifdef HAVE_LIBTIFF - needs_conv = 0; - fmt = 3; -#else - needs_conv = 1; - fmt = 0; -#endif - } - else if (giseim(fil)) - { - needs_conv = 0; - eim = 1; - fmt = 9999; - } - else if (gisxpm(fil)) - { - needs_conv = 0; - fmt = 5; - } - else if (gispng(fil)) - { -#ifdef HAVE_LIBPNG - needs_conv = 0; - fmt = 1; -#else - needs_conv = 1; - fmt = 0; -#endif - } - else if (gisgif(fil)) - { -#ifdef HAVE_LIBGIF - needs_conv = 0; - fmt = 4; -#else - needs_conv = 1; - fmt = 0; -#endif - } - if (needs_conv && id->fallback) - { - p = open_helper("%C/convert %s pnm:-", fil, "rb"); - } - else if ((fmt == 2) || (fmt == 1) || (fmt == 0)) - p = fopen(fil, "rb"); - - trans = 0; - if (!eim && !data) - { - switch (fmt) - { - case 5: - data = g_LoadXPM(fil, &w, &h, &trans); - break; -#ifdef HAVE_LIBGIF - case 4: - data = g_LoadGIF(fil, &w, &h, &trans); - break; -#endif -#ifdef HAVE_LIBTIFF - case 3: - data = g_LoadTIFF(fil, &w, &h, &trans); - break; -#endif -#ifdef HAVE_LIBJPEG - case 2: - if (p) - data = g_LoadJPEG(p, &w, &h); - break; -#endif -#ifdef HAVE_LIBPNG - case 1: - if (p) - data = g_LoadPNG(p, &w, &h, &trans); - break; -#endif - default: - if (p) - data = g_LoadPPM(p, &w, &h); - break; - } - } - - if (p && !needs_conv) - fclose(p); - else if (p) - close_helper(p); - - if ((!data) && (id->fallback)) - { - p = open_helper("%C/convert %s pnm:-", fil, "rb"); - if (p) - { - data = g_LoadPPM(p, &w, &h); - close_helper(p); - } - } - if ((!eim) && (!data) && (id->fallback)) - { - if (!strcasecmp(s, "jpeg")) - strcpy(cmd, "%J %s"); - else if (!strcasecmp(s, "jpg")) - strcpy(cmd, "%J %s"); - else if (!strcasecmp(s, "bmp")) - strcpy(cmd, "%P/bmptoppm %s"); - else if (!strcasecmp(s, "ilbm")) - strcpy(cmd, "%P/ilbmtoppm %s"); - else if (!strcasecmp(s, "ilb")) - strcpy(cmd, "%P/ilbmtoppm %s"); - else if (!strcasecmp(s, "iff")) - strcpy(cmd, "%P/ilbmtoppm %s"); - else if (!strcasecmp(s, "img")) - strcpy(cmd, "%P/imgtoppm %s"); - else if (!strcasecmp(s, "mtv")) - strcpy(cmd, "%P/mtvtoppm %s"); - else if (!strcasecmp(s, "pcx")) - strcpy(cmd, "%P/pcxtoppm %s"); - else if (!strcasecmp(s, "pgm")) - strcpy(cmd, "%P/pgmtoppm rgb:ffff/ffff/ffff %s"); - else if (!strcasecmp(s, "pi1")) - strcpy(cmd, "%P/pi1toppm %s"); - else if (!strcasecmp(s, "pict")) - strcpy(cmd, "%P/picttoppm %s"); - else if (!strcasecmp(s, "pic")) - strcpy(cmd, "%P/picttoppm %s"); - else if (!strcasecmp(s, "pj")) - strcpy(cmd, "%P/pjtoppm %s"); - else if (!strcasecmp(s, "qrt")) - strcpy(cmd, "%P/qrttoppm %s"); - else if (!strcasecmp(s, "sld")) - strcpy(cmd, "%P/sldtoppm %s"); - else if (!strcasecmp(s, "spc")) - strcpy(cmd, "%P/spctoppm %s"); - else if (!strcasecmp(s, "spu")) - strcpy(cmd, "%P/sputoppm %s"); - else if (!strcasecmp(s, "tga")) - strcpy(cmd, "%P/tgatoppm %s"); - else if (!strcasecmp(s, "xim")) - strcpy(cmd, "%P/ximtoppm %s"); - else if (!strcasecmp(s, "xpm")) - strcpy(cmd, "%P/xpmtoppm %s"); - else if (!strcasecmp(s, "gif")) - strcpy(cmd, "%P/giftopnm %s"); - else if (!strcasecmp(s, "rast")) - strcpy(cmd, "%P/rasttopnm %s"); - else if (!strcasecmp(s, "ras")) - strcpy(cmd, "%P/rasttopnm %s"); - else if (!strcasecmp(s, "sgi")) - strcpy(cmd, "%P/sgitopnm %s"); - else if (!strcasecmp(s, "sir")) - strcpy(cmd, "%P/sirtopnm %s"); - else if (!strcasecmp(s, "tiff")) - strcpy(cmd, "%P/tifftopnm %s"); - else if (!strcasecmp(s, "tif")) - strcpy(cmd, "%P/tifftopnm %s"); - else if (!strcasecmp(s, "wxd")) - strcpy(cmd, "%P/wxdtopnm %s"); - else if (!strcasecmp(s, "zeiss")) - strcpy(cmd, "%P/zeisstopnm -ppm %s"); - else if (!strcasecmp(s, "zei")) - strcpy(cmd, "%P/zeisstopnm -ppm %s"); - else if (!strcasecmp(s, "zis")) - strcpy(cmd, "%P/zeisstopnm -ppm %s"); - else - strcpy(cmd, "%P/anytopnm %s"); - p = open_helper(cmd, fil, "rb"); - if (p) - { - data = g_LoadPPM(p, &w, &h); - close_helper(p); - } - } - - if (!eim && !data) - { - fprintf(stderr, "gdk_imlib ERROR: Cannot load image: %s\nAll fallbacks failed.\n", fil); - return NULL; - } - - im = (GdkImlibImage *) malloc(sizeof(GdkImlibImage)); - if (!im) - { - fprintf(stderr, "gdk_imlib ERROR: Cannot allocate RAM for image data\n"); - if (data) - free(data); - return NULL; - } - im->alpha_data = NULL; - if (trans) - { - im->shape_color.r = 255; - im->shape_color.g = 0; - im->shape_color.b = 255; - } - else - { - im->shape_color.r = -1; - im->shape_color.g = -1; - im->shape_color.b = -1; - } - im->border.left = 0; - im->border.right = 0; - im->border.top = 0; - im->border.bottom = 0; - im->cache = 1; - im->rgb_data = data; - im->rgb_width = w; - im->rgb_height = h; - im->pixmap = NULL; - im->shape_mask = NULL; - if (eim) - { - char s1[256], s2[256]; - int num, size; - int r, g, b; - int br, bl, bt, bb; - - /* Load Native-as-can-be EIM format (Enlightenment IMlib format) */ - p = fopen(fil, "r"); - if (!p) - { - free(im); - return NULL; - } - fgets(s, 4096, p); - if ((s[0] != 'E') && (s[1] != 'I') && (s[2] != 'M') && (s[3] != ' ')) - { - fclose(p); - free(im); - return NULL; - } - sscanf(s, "%256s %i", s1, &num); - if (num <= 0) - { - fclose(p); - free(im); - return NULL; - } - while (fgets(s, 4096, p)) - { - sscanf(s, "%256s", s1); - if (!strcmp("IMAGE", s1)) - { - sscanf(s, "%256s %i %256s %i %i %i %i %i %i %i %i %i", s1, &size, s2, &w, &h, &r, &g, &b, &bl, &br, &bt, &bb); - if (!iden[0]) - break; - else if (!strcmp(iden, s2)) - break; - if (size > 0) - fseek(p, size, SEEK_CUR); - } - } - im->rgb_data = malloc(w * h * 3); - if (!im->rgb_data) - { - fclose(p); - free(im); - return NULL; - } - im->shape_color.r = r; - im->shape_color.g = g; - im->shape_color.b = b; - im->rgb_width = w; - im->rgb_height = h; - im->border.left = bl; - im->border.right = br; - im->border.top = bt; - im->border.bottom = bb; - fread(im->rgb_data, 1, w * h * 3, p); - fclose(p); - if (iden[0]) - { - strncat(fil, ":", sizeof(fil) - strlen(fil)); - strncat(fil, iden, sizeof(fil) - strlen(fil)); - } - } - im->mod.gamma = id->mod.gamma; - im->mod.brightness = id->mod.brightness; - im->mod.contrast = id->mod.contrast; - im->rmod.gamma = id->rmod.gamma; - im->rmod.brightness = id->rmod.brightness; - im->rmod.contrast = id->rmod.contrast; - im->gmod.gamma = id->gmod.gamma; - im->gmod.brightness = id->gmod.brightness; - im->gmod.contrast = id->gmod.contrast; - im->bmod.gamma = id->bmod.gamma; - im->bmod.brightness = id->bmod.brightness; - im->bmod.contrast = id->bmod.contrast; - im->filename = malloc(strlen(file) + 1); - if (im->filename) - strcpy(im->filename, file); - if ((id->cache.on_image && im)) - gadd_image(im, fil); - gcalc_map_tables(im); - return im; -} - -gint -gdk_imlib_save_image_to_eim(GdkImlibImage * im, char *file) -{ - char fil[4096]; - char *iden; - FILE *f; - int size; - - if ((!id) || (!im) || (!file)) - return 0; - strncpy(fil, file, sizeof(fil)); - iden = g_SplitID(fil); - if (!iden[0]) - iden = "default"; - f = fopen(fil, "w"); - if (!f) - return 0; - - size = im->rgb_width * im->rgb_height * 3; - fprintf(f, "EIM 1\n"); - fprintf(f, "IMAGE %i %s %i %i %i %i %i %i %i %i %i\n", - size, - iden, - im->rgb_width, - im->rgb_height, - im->shape_color.r, - im->shape_color.g, - im->shape_color.b, - im->border.left, - im->border.right, - im->border.top, - im->border.bottom); - if (fwrite(im->rgb_data, size, 1, f) != 1) - { - fclose(f); - return 0; - } - fclose(f); - return 1; -} - -gint -gdk_imlib_add_image_to_eim(GdkImlibImage * im, char *file) -{ - char fil[4096]; - char *iden; - FILE *f; - int size; - - if ((!id) || (!im) || (!file)) - return 0; - strncpy(fil, file, sizeof(fil)); - - iden = g_SplitID(file); - if (!iden[0]) - strcpy(iden, "default"); - - f = fopen(fil, "a"); - if (!f) - return 0; - - size = im->rgb_width * im->rgb_height * 3; - fprintf(f, "IMAGE %i %s %i %i %i %i %i %i %i %i %i\n", - size, - iden, - im->rgb_width, - im->rgb_height, - im->shape_color.r, - im->shape_color.g, - im->shape_color.b, - im->border.left, - im->border.right, - im->border.top, - im->border.bottom); - - if (fwrite(im->rgb_data, size, 1, f) != 1) - { - fclose(f); - return 0; - } - fclose(f); - return 1; -} - -gint -gdk_imlib_save_image_to_ppm(GdkImlibImage * im, char *file) -{ - FILE *f; - - if ((!id) || (!im) || (!file)) - return 0; - f = fopen(file, "w"); - if (!f) - return 0; - - fprintf(f, "P6\n"); - fprintf(f, "%i %i\n255\n", - im->rgb_width, - im->rgb_height); - if (fwrite(im->rgb_data, im->rgb_width * im->rgb_height * 3, 1, f) != 1) - { - fclose(f); - return 0; - } - fclose(f); - return 1; -}