/* $Id: imagefile2.c,v 1.2 1999/01/03 02:07:07 sybalsky Exp $ (C) Copyright Venue, All Rights * Reserved */ /************************************************************************/ /* */ /* (C) Copyright 1989-95 Venue. All Rights Reserved. */ /* Manufactured in the United States of America. */ /* */ /************************************************************************/ #include "version.h" #include #include #include #define FALSE 0 #define TRUE !FALSE typedef struct { FILE *file; struct rasterfile rh; colormap_t colormap; } RASTERFILE_INFO; unsigned int open_rasterfile(char *filename) { FILE *file; RASTERFILE_INFO *fileinfo; int status; if ((fileinfo = (RASTERFILE_INFO *)malloc(sizeof(RASTERFILE_INFO))) == 0) { return (0); } /* end if( fileinfo ) */ if ((fileinfo->file = fopen(filename, "r")) != 0) { if ((status = pr_load_header(fileinfo->file, &(fileinfo->rh))) == 0) { if (fileinfo->rh.ras_magic == RAS_MAGIC) { /* RasterFile */ pr_load_colormap(fileinfo->file, &(fileinfo->rh), &(fileinfo->colormap)); /* normal case */ return ((unsigned int)fileinfo); } /* end if( fileinfo->rh.ras_magic ) */ fclose(fileinfo->file); } /* end if( status ) */ } /* end if( file ) */ free(fileinfo); return (0); /* error return */ } /* end open_rasterfile */ unsigned int create_rasterfile(char *filename) { RASTERFILE_INFO *fileinfo; if (!(fileinfo = (RASTERFILE_INFO *)malloc(sizeof(RASTERFILE_INFO)))) { return (0); } /* end if( fileinfo ) */ fileinfo->file = fopen(filename, "w"); fileinfo->rh.ras_magic = 0; return ((unsigned int)fileinfo); } /* end create_rasterfile */ close_rasterfile(RASTERFILE_INFO *fileinfo) { fclose(fileinfo->file); free((char *)fileinfo); } /* end close_rasterfile */ unsigned int read_rasterfile(RASTERFILE_INFO *fileinfo) { Pixrect *pict; pict = pr_load_std_image(fileinfo->file, &(fileinfo->rh), &(fileinfo->colormap)); return ((unsigned int)pict); } /* end read_rasterfile */ int write_rasterfile(RASTERFILE_INFO *fileinfo, Pixrect *pix) { int status; if (fileinfo->rh.ras_magic == RAS_MAGIC) { if ((fileinfo->rh.ras_width != pix->pr_size.x) || (fileinfo->rh.ras_height != pix->pr_size.y) || (fileinfo->rh.ras_depth != pix->pr_depth)) { return (FALSE); } /* end if( .. ) */ } else { if (!(status = init_rasterfile_header(fileinfo, pix))) { return (FALSE); } /* end if( !status ) */ } /* end if( fileinfo->rh.ras_magic ) */ if ((status = pr_dump_image(pix, fileinfo->file, &(fileinfo->rh))) == NULL) { return (TRUE); /* normal return */ } return (FALSE); } /* end write_rasterfile */ int init_rasterfile_header(RASTERFILE_INFO *fileinfo, Pixrect *pix) { Pixrect *ret_pix; int status; switch (pix->pr_depth) { case 32: if (!(ret_pix = pr_dump_init(pix, &(fileinfo->rh), NULL, 0))) { return (FALSE); } /* end if( ret_pix ) */ fileinfo->rh.ras_length = fileinfo->rh.ras_width * fileinfo->rh.ras_height * 4; fileinfo->rh.ras_type = RT_STANDARD; if ((status = pr_dump_header(fileinfo->file, &(fileinfo->rh), NULL))) { return (FALSE); } /* end if( status ) */ break; case 1: case 8: default: return (FALSE); break; } /* end switch( pix->pr_depth ) */ return (TRUE); } /* end init_rasterfile_header */ int position_rasterfile(RASTERFILE_INFO *fileinfo, int n) { long position; int status; if (n > 0) { position = sizeof(struct rasterfile) + (n - 1) * fileinfo->rh.ras_length; if ((status = fseek(fileinfo->file, position, SEEK_SET)) == 0) { /* normal return */ return (TRUE); } /* end if( status ) */ } /* end if( n ) */ /* error return */ return (FALSE); } /* end position_rasterfile */