You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.0 KiB

#include <config.h>
#include <setjmp.h>
#define id _gdk_imlib_data
#include "gdk_imlib.h"
#include "gdk_imlib_private.h"
#ifdef HAVE_LIBTIFF
#include <tiffio.h>
unsigned char *
loader_tiff(FILE *f, char *file, 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;
int fd;
istransp = 0;
if (!f)
return NULL;
fd = fileno(f);
/* Apparently rewind(f) isn't sufficient */
lseek(fd, (long) 0, 0);
/* So why does libtif need a filename here ??? */
tif = TIFFFdOpen(fd, file, "r");
if (!tif)
return NULL;
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &ww);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &hh);
npix = ww * hh;
*w = (int)ww;
*h = (int)hh;
if(ww > 32767 || hh > 32767)
{
TIFFClose(tif);
return NULL;
}
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;
}
gint
saver_tiff (GdkImlibImage * im, char *file, GdkImlibSaveInfo * info)
{
TIFF *tif;
unsigned char *data;
int y;
int w;
tif = TIFFOpen(file, "w");
if (tif)
{
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->rgb_width);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->rgb_height);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW);
{
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
w = TIFFScanlineSize(tif);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP,
TIFFDefaultStripSize(tif, -1));
for (y = 0; y < im->rgb_height; y++)
{
data = im->rgb_data + (y * im->rgb_width * 3);
TIFFWriteScanline(tif, data, y, 0);
}
}
TIFFClose(tif);
return 1;
}
return 0;
}
#else
unsigned char *
loader_tiff (FILE * f, int *w, int *h, int *t)
{
return NULL;
}
gint
saver_tiff (GdkImlibImage * im, char *file, GdkImlibSaveInfo * info)
{
return 0;
}
#endif