mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-14 15:36:34 +00:00
Instead of sometimes passing `0` to `lseek` and friends, we should use the standard symbolic constant `SEEK_SET`.
146 lines
3.8 KiB
C
146 lines
3.8 KiB
C
/* $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 <stdio.h>
|
|
#include <unistd.h>
|
|
#include <pixrect/pixrect_hs.h>
|
|
|
|
#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 */
|