This fixes bug #1990

It moves targa, bmp, iris and png loading so that were not opening
2 file handles for each file, and made them like the jpeg stuff.

Also cleaned up some minor other stuff.

Kent
This commit is contained in:
Kent Mein 2004-12-09 13:09:11 +00:00
parent eae5d39899
commit bdffe196af
9 changed files with 32 additions and 122 deletions

@ -44,7 +44,7 @@ struct ImBuf;
int imb_is_a_bmp(void *buf);
struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags);
short imb_savebmp(struct ImBuf *ibuf, int outfile, int flags);
short imb_savebmp(struct ImBuf *ibuf, char *name, int flags);
#endif

@ -43,7 +43,7 @@
struct ImBuf;
struct ImBuf *imb_loadiris(unsigned char *mem, int flags);
short imb_saveiris(struct ImBuf * ibuf, int file, int flags);
short imb_saveiris(struct ImBuf * ibuf, char *name, int flags);
#endif

@ -45,7 +45,7 @@ struct ImBuf;
int imb_is_a_png(void *buf);
struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags);
short imb_savepng(struct ImBuf *ibuf, int file, int flags);
short imb_savepng(struct ImBuf *ibuf, char *name, int flags);
#endif

@ -45,7 +45,7 @@ struct ImBuf;
int imb_is_a_targa(void *buf);
struct ImBuf *imb_loadtarga(unsigned char *mem, int flags);
short imb_savetarga(struct ImBuf * ibuf, int file, int flags);
short imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
#endif

@ -44,10 +44,6 @@
#include "IMB_cmap.h"
#include "IMB_bmp.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/* some code copied from article on microsoft.com, copied
here for enhanced BMP support in the future
http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0197/mfcp1/mfcp1.htm&nav=/msj/0197/newnav.htm
@ -199,7 +195,7 @@ int putShortLSB(unsigned short us,FILE *ofile) {
}
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
short imb_savebmp(struct ImBuf *ibuf, int outfile, int flags) {
short imb_savebmp(struct ImBuf *ibuf, char *name, int flags) {
BMPINFOHEADER infoheader;
int bytesize, extrabytes, x, y, t, ptr;
@ -210,7 +206,7 @@ short imb_savebmp(struct ImBuf *ibuf, int outfile, int flags) {
bytesize = (ibuf->x * 3 + extrabytes) * ibuf->y;
data = (uchar *) ibuf->rect;
ofile = fdopen(outfile,"ab");
ofile = fopen(name,"ab");
putShortLSB(19778,ofile); /* "BM" */
putIntLSB(0,ofile); /* This can be 0 for BI_RGB bitmaps */

@ -41,10 +41,6 @@
#include "IMB_allocimbuf.h"
#include "IMB_iris.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
typedef struct {
unsigned short imagic; /* stuff saved on disk . . */
unsigned short type;
@ -115,10 +111,6 @@ static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n
static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cnt);
static void lumrow(unsigned char *rgbptr, unsigned char *lumptr, int n);
/* not used... */
/* static void copybw(int *lptr, int n); */
/* static void setalpha(unsigned char *lptr, int n); */
/*
* byte order independent read/write of shorts and ints.
*
@ -423,53 +415,6 @@ static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n
}
}
/* not used? */
/*static void copybw(int *lptr, int n) */
/* int *lptr; */
/* int n; */
/*{
while(n>=8) {
lptr[0] = 0xff000000+(0x010101*(lptr[0]&0xff));
lptr[1] = 0xff000000+(0x010101*(lptr[1]&0xff));
lptr[2] = 0xff000000+(0x010101*(lptr[2]&0xff));
lptr[3] = 0xff000000+(0x010101*(lptr[3]&0xff));
lptr[4] = 0xff000000+(0x010101*(lptr[4]&0xff));
lptr[5] = 0xff000000+(0x010101*(lptr[5]&0xff));
lptr[6] = 0xff000000+(0x010101*(lptr[6]&0xff));
lptr[7] = 0xff000000+(0x010101*(lptr[7]&0xff));
lptr += 8;
n-=8;
}
while(n--) {
*lptr = 0xff000000+(0x010101*(*lptr&0xff));
lptr++;
}
}
*/
/* not used ? */
/*static void setalpha(unsigned char *lptr, int n)*/
/* unsigned char *lptr; */
/*{
while(n>=8) {
lptr[0*4] = 0xff;
lptr[1*4] = 0xff;
lptr[2*4] = 0xff;
lptr[3*4] = 0xff;
lptr[4*4] = 0xff;
lptr[5*4] = 0xff;
lptr[6*4] = 0xff;
lptr[7*4] = 0xff;
lptr += 4*8;
n -= 8;
}
while(n--) {
*lptr = 0xff;
lptr += 4;
}
}
*/
static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
{
unsigned char pixel, count;
@ -532,7 +477,7 @@ static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
* Added: zbuf write
*/
static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, int file, int *zptr)
static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, char *name, int *zptr)
{
FILE *outf;
IMAGE *image;
@ -543,10 +488,10 @@ static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, int
int rlebuflen, goodwrite;
goodwrite = 1;
outf = fdopen(file, "wb");
outf = fopen(name, "wb");
if(!outf) {
perror("fdopen");
perror("fopen");
fprintf(stderr,"output_iris: can't open output file\n");
return 0;
}
@ -690,7 +635,7 @@ static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cn
return optr - (unsigned char *)rlebuf;
}
short imb_saveiris(struct ImBuf * ibuf, int file, int flags)
short imb_saveiris(struct ImBuf * ibuf, char *name, int flags)
{
short zsize;
int ret;
@ -701,7 +646,7 @@ short imb_saveiris(struct ImBuf * ibuf, int file, int flags)
IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect);
test_endian_zbuf(ibuf);
ret = output_iris(ibuf->rect, ibuf->x, ibuf->y, zsize, file, ibuf->zbuf);
ret = output_iris(ibuf->rect, ibuf->x, ibuf->y, zsize, name, ibuf->zbuf);
/* restore! Quite clumsy, 2 times a switch... maybe better a malloc ? */
IMB_convert_rgba_to_abgr(ibuf->x*ibuf->y, ibuf->rect);

@ -33,10 +33,6 @@
#include "png.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef WIN32
#include "BLI_winstuff.h"
#endif
@ -106,7 +102,7 @@ static void ReadData( png_structp png_ptr, png_bytep data, png_size_t length)
longjmp(png_jmpbuf(png_ptr), 1);
}
short imb_savepng(struct ImBuf *ibuf, int file, int flags)
short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
{
png_structp png_ptr;
png_infop info_ptr;
@ -198,7 +194,7 @@ short imb_savepng(struct ImBuf *ibuf, int file, int flags)
WriteData,
Flush);
} else {
fp = fdopen(file, "wb");
fp = fopen(name, "wb");
png_init_io(png_ptr, fp);
}

@ -30,10 +30,6 @@
* $Id$
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef WIN32
#include "BLI_winstuff.h"
#include <io.h>
@ -242,7 +238,7 @@ static int dumptarga(struct ImBuf * ibuf, FILE * file)
}
short imb_savetarga(struct ImBuf * ibuf, int file, int flags)
short imb_savetarga(struct ImBuf * ibuf, char *name, int flags)
{
char buf[20];
FILE *fildes;
@ -294,14 +290,16 @@ short imb_savetarga(struct ImBuf * ibuf, int file, int flags)
if (ibuf->depth==32) {
buf[17] |= 0x08;
}
fildes = fopen(name,"ab");
if (fwrite(buf, 1, 18,fildes) != 18) return (0);
if (write(file, buf, 18) != 18) return (0);
if (ibuf->cmap){
for (i = 0 ; i<ibuf->maxcol ; i++){
if (write(file,((uchar *)(ibuf->cmap + i)) + 1,3) != 3) return (0);
if (fwrite(((uchar *)(ibuf->cmap + i)) + 1,1,3,fildes) != 3) return (0);
}
}
fildes = fdopen(file,"ab");
if (ibuf->cmap && (flags & IB_cmap) == 0) IMB_converttocmap(ibuf);

@ -55,11 +55,6 @@
#include "IMB_bitplanes.h"
#include "IMB_divers.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags)
{
short ok=TRUE,delpl=FALSE;
@ -73,6 +68,18 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags)
if(imb_savejpeg(ibuf, naam, flags)) return (0);
else return (TRUE);
}
if (IS_png(ibuf)) {
return imb_savepng(ibuf,naam,flags);
}
if (IS_bmp(ibuf)) {
return imb_savebmp(ibuf,naam,flags);
}
if (IS_tga(ibuf)) {
return imb_savetarga(ibuf,naam,flags);
}
if (IS_iris(ibuf)) {
return imb_saveiris(ibuf,naam,flags);
}
file = open(naam, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666);
if (file < 0) return (FALSE);
@ -84,40 +91,8 @@ short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags)
}
/* Put formats that take a filehandle here */
if (IS_png(ibuf)) {
ok = imb_savepng(ibuf,file,flags);
if (ok) {
close (file);
return (ok);
}
}
if (IS_bmp(ibuf)) {
ok = imb_savebmp(ibuf,file,flags);
if (ok) {
close (file);
return (ok);
}
}
if (IS_tga(ibuf)) {
ok = imb_savetarga(ibuf,file,flags);
if (ok) {
close (file);
return (ok);
}
}
if (IS_iris(ibuf)) {
ok = imb_saveiris(ibuf,file,flags);
if (ok) {
close (file);
return (ok);
}
}
if (ok) ok = imb_start_iff(ibuf,file);
ok = imb_start_iff(ibuf,file);
if (IS_amiga(ibuf)){
IMB_flipy(ibuf);
if (flags & IB_rect){