1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-14 15:36:34 +00:00
Interlisp.maiko/src/imagefile2.c
Bruce Mitchener 999851e60c
Use SEEK_SET for third arg to *seek() functions. (#139)
Instead of sometimes passing `0` to `lseek` and friends, we should
use the standard symbolic constant `SEEK_SET`.
2020-12-28 00:18:41 -08:00

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 */