/***************************************************************** * flrdfb.c: FBM Release 1.0 25-Feb-90 Michael Mauldin * * Copyright (C) 1989,1990 by Michael Mauldin. Permission is granted * to use this file in whole or in part for any purpose, educational, * recreational or commercial, provided that this copyright notice * is retained unchanged. This software is available to all free of * charge by anonymous FTP and in the UUNET archives. * * flrdfb.c: * * CONTENTS * read_fbm (image, rfile, mstr, mlen) * read_hdr_fbm (image, rfile, mstr, mlen) * * EDITLOG * LastEditDate = Mon Jun 25 00:17:51 1990 - Michael Mauldin * LastFileName = /usr2/mlm/src/misc/fbm/flrdfb.c * * HISTORY * 25-Jun-90 Michael Mauldin (mlm@cs.cmu.edu) Carnegie Mellon * Package for Release 1.0 * * 07-Mar-89 Michael Mauldin (mlm) at Carnegie Mellon University * Beta release (version 0.9) mlm@cs.cmu.edu * * 12-Nov-88 Michael Mauldin (mlm) at Carnegie-Mellon University * Created. *****************************************************************/ # include # include # include # include "fbm.h" /**************************************************************** * read_fbm: Read an FBM format bitmap into memory ****************************************************************/ #ifndef lint static char *fbmid = "$FBM flrdfb.c <1.0> 25-Jun-90 (C) 1989,1990 by Michael Mauldin, source \ code available free from MLM@CS.CMU.EDU and from UUNET archives$"; #endif read_fbm (image, rfile, mstr, mlen) register FBM *image; register FILE *rfile; char *mstr; int mlen; { register int j, k, rowlen, plnlen; register unsigned char *bmptr; if (!read_hdr_fbm (image, rfile, mstr, mlen)) { return (0); } alloc_fbm (image); rowlen = image->hdr.rowlen; plnlen = image->hdr.plnlen; if (image->hdr.clrlen > 0) { if (! fread (image->cm, image->hdr.clrlen, 1, rfile)) { fprintf (stderr, "can't read colormap (%d bytes)\n", image->hdr.clrlen); return (0); } } for (k=0; khdr.planes; k++) { bmptr = &(image->bm[k*plnlen]); for (j=0; j < image->hdr.rows; j++, bmptr += rowlen) { if (fread (bmptr, 1, rowlen, rfile) != rowlen) { fprintf (stderr, "premature EOF on input\n"); return (0); } } } return (1); } /**************************************************************** * read_hdr_fbm: Read an FBM format bitmap header into memory ****************************************************************/ read_hdr_fbm (image, rfile, mstr, mlen) register FBM *image; register FILE *rfile; char *mstr; int mlen; { FBMFILEHDR file_hdr; register char *hp; hp = (char *) &file_hdr; if (mlen > 0) strncpy (hp, mstr, mlen); if (! fread (hp+mlen, sizeof (file_hdr) - mlen, 1, rfile)) { perror ("read_fbm (header)"); return (0); } if (strncmp (FBM_MAGIC, file_hdr.magic, 2) != 0) { fprintf (stderr, "Bad magic number, input is not an FBM image\n"); return (0); } image->hdr.cols = atoi (file_hdr.cols); image->hdr.rows = atoi (file_hdr.rows); image->hdr.planes = atoi (file_hdr.planes); image->hdr.bits = atoi (file_hdr.bits); image->hdr.physbits = atoi (file_hdr.physbits); image->hdr.rowlen = atoi (file_hdr.rowlen); image->hdr.plnlen = atoi (file_hdr.plnlen); image->hdr.clrlen = atoi (file_hdr.clrlen); image->hdr.aspect = atof (file_hdr.aspect); strncpy (image->hdr.title, file_hdr.title, FBM_MAX_TITLE); strncpy (image->hdr.credits, file_hdr.credits, FBM_MAX_TITLE); if (image->hdr.cols < 1 || image->hdr.cols > 32767) { fprintf (stderr, "Invalid number of cols (%d) on input\n", image->hdr.cols); return (0); } if (image->hdr.rows < 1 || image->hdr.rows > 32767) { fprintf (stderr, "Invalid number of rows (%d) on input\n", image->hdr.rows); return (0); } if (image->hdr.planes != 1 && image->hdr.planes != 3) { fprintf (stderr, "Invalid number of planes (%d) on input %s\n", image->hdr.planes, "(must be 1 or 3)"); return (0); } if (image->hdr.bits < 1 || image->hdr.bits > 8) { fprintf (stderr, "Invalid number of bits (%d) on input %s\n", image->hdr.bits, "(must be [1..8])"); return (0); } if (image->hdr.physbits != 1 && image->hdr.physbits != 8) { fprintf (stderr, "Invalid number of physbits (%d) on input %s\n", image->hdr.physbits, "(must be 1 or 8)"); return (0); } if (image->hdr.rowlen < 1 || image->hdr.rowlen > 32767) { fprintf (stderr, "Invalid row length (%d) on input\n", image->hdr.rowlen); return (0); } if (image->hdr.planes > 1 && image->hdr.plnlen < 1) { fprintf (stderr, "Invalid plane length (%d) on input\n", image->hdr.plnlen); return (0); } if (image->hdr.aspect < 0.01 || image->hdr.aspect > 100.0) { fprintf (stderr, "Invalid aspect ratio %lg on input\n", image->hdr.aspect); return (0); } return (1); }