This is xvxbm.c in view mode; [Download] [Up]
/*
* xvxbm.c - load routine for X11 Bitmap format pictures
*
* LoadXBM(fname) - loads an X11 Bitmap file\
* WriteXBM(fp, pic, w, h)
*/
/* Copyright Notice
* ================
* Copyright 1989, 1990, 1991, 1992, 1993 by John Bradley
*
* Permission to use, copy, and distribute XV in its entirety, for
* non-commercial purposes, is hereby granted without fee, provided that
* this license information and copyright notice appear in all copies.
*
* Note that distributing XV 'bundled' in with ANY product is considered
* to be a 'commercial purpose'.
*
* Also note that any copies of XV that are distributed MUST be built
* and/or configured to be in their 'unregistered copy' mode, so that it
* is made obvious to the user that XV is shareware, and that they should
* consider donating, or at least reading this License Info.
*
* The software may be modified for your own purposes, but modified
* versions may NOT be distributed without prior consent of the author.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the author be held liable for any damages
* arising from the use of this software.
*
* If you would like to do something with XV that this copyright
* prohibits (such as distributing it with a commercial product,
* using portions of the source in some other program, etc.), please
* contact the author (preferably via email). Arrangements can
* probably be worked out.
*
* XV is shareware for PERSONAL USE only. You may use XV for your own
* amusement, and if you find it nifty, useful, generally cool, or of
* some value to you, your non-deductable donation would be greatly
* appreciated. $25 is the suggested donation, though, of course,
* larger donations are quite welcome. Folks who donate $25 or more
* can receive a Real Nice bound copy of the XV manual for no extra
* charge.
*
* Commercial, government, and institutional users MUST register their
* copies of XV, for the exceedingly REASONABLE price of just $25 per
* workstation/X terminal. Site licenses are available for those who
* wish to run XV on a large number of machines. Contact the author
* for more details.
*
* The author may be contacted via:
* US Mail: John Bradley
* 1053 Floyd Terrace
* Bryn Mawr, PA 19010
*
* Phone: (215) 898-8813
* EMail: bradley@cis.upenn.edu
*/
#include "xv.h"
/*
* File Format:
* (format identifier: "#define" as first couple chars in file)
*
* looks for first line beginning with '#define'
* reads "#define identifier width" (identifier is ignored)
* looks for next line beginning with '#define'
* reads "#define identifier height" (identifier is ignored)
* looks for next occurence of characters '0x'
* read next two chars as two hex digits
* move forward to next occurence of '0x'
* repeat
*/
static int xbmError();
/*******************************************/
int LoadXBM(fname, pinfo)
char *fname;
PICINFO *pinfo;
{
/* returns '1' on success */
FILE *fp;
int c, c1;
int i, j, k, bit, w, h;
byte *pix, *pic8;
long filesize;
char line[256];
byte hex[256];
char *bname;
k = 0;
bname = BaseName(fname);
fp=fopen(fname,"r");
if (!fp) return (xbmError(bname, "couldn't open file"));
fseek(fp, 0L, 2);
filesize = ftell(fp);
fseek(fp, 0L, 0);
/* read width: skip lines until we hit a #define */
while (1) {
if (!fgets(line,256,fp))
return(xbmError(bname, "EOF reached in header info."));
if (strncmp(line,"#define",7)==0) {
if (sscanf(line,"#define %*s %d", &w) != 1)
return(xbmError(bname, "Unable to read 'width'"));
else break;
}
}
/* read height: skip lines until we hit another #define */
while (1) {
if (!fgets(line,256,fp))
return(xbmError(bname, "EOF reached in header info."));
if (strncmp(line,"#define",7)==0) {
if (sscanf(line,"#define %*s %d", &h) != 1)
return(xbmError(bname, "Unable to read 'height'"));
else break;
}
}
/* scan forward until we see the first '0x' */
c = getc(fp); c1 = getc(fp);
while (c1!=EOF && !(c=='0' && c1=='x') ) { c = c1; c1 = getc(fp); }
if (c1==EOF)
return(xbmError(bname, "No bitmap data found"));
pic8 = (byte *) calloc(w*h,1);
if (!pic8) return(xbmError(bname, "couldn't malloc 'pic8'"));
/* load up the pinfo structure */
pinfo->pic = pic8;
pinfo->w = w;
pinfo->h = h;
pinfo->type = PIC8;
pinfo->frmType = F_XBM;
pinfo->colType = F_BWDITHER;
sprintf(pinfo->fullInfo, "X11 Bitmap (%ld bytes)", filesize);
sprintf(pinfo->shrtInfo, "%dx%d X11 Bitmap.",w,h);
pinfo->comment = (char *) NULL;
/* B/W bitmaps have a two entry colormap */
pinfo->r[0] = pinfo->g[0] = pinfo->b[0] = 255; /* 0 = white */
pinfo->r[1] = pinfo->g[1] = pinfo->b[1] = 0; /* 1 = black */
/* initialize the 'hex' array for zippy ASCII-hex -> int conversion */
for (i=0; i<256; i++) hex[i]=0;
for (i='0'; i<='9'; i++) hex[i] = i - '0';
for (i='a'; i<='f'; i++) hex[i] = i + 10 - 'a';
for (i='A'; i<='F'; i++) hex[i] = i + 10 - 'A';
/* read/convert the image data */
for (i=0, pix=pic8; i<h; i++)
for (j=0,bit=0; j<w; j++, pix++, bit = (++bit)&7) {
if (!bit) {
/* get next byte from file. we're already positioned at it */
c = getc(fp); c1 = getc(fp);
if (c<0 || c1<0) {
/* EOF: break out of loop */
c=c1='0'; i=h; j=w;
xbmError(bname, "The file would appear to be truncated.");
}
k = (hex[c] << 4) + hex[c1];
/* advance to next '0x' */
c = getc(fp); c1 = getc(fp);
while (c1!=EOF && !(c=='0' && c1=='x') ) { c = c1; c1 = getc(fp); }
}
*pix = (k&1) ? 1 : 0;
k = k >> 1;
}
fclose(fp);
return 1;
}
/*******************************************/
static int xbmError(fname, st)
char *fname, *st;
{
SetISTR(ISTR_WARNING,"%s: %s", fname, st);
return 0;
}
/*******************************************/
int WriteXBM(fp, pic, w, h, rmap, gmap, bmap, fname)
FILE *fp;
byte *pic;
int w,h;
byte *rmap, *gmap, *bmap;
char *fname;
{
/* pic is expected to be an array of w*h bytes, each of which is either
'0' or '1'.
The 'darker' of {rmap,gmap,bmap}[0] and {rmap,gmap,bmap}[1] is
considered black, and the other one, white.
Some sort of stippling algorithm should've
been called already to produce pic, otherwise the output won't be at all
useful */
int i,j,k,bit,len,nbytes,flipbw;
byte *pix;
char name[256], *foo;
foo = BaseName(fname);
strcpy(name, foo);
foo = (char *) strchr(name,'.');
if (foo) *foo='\0'; /* truncated name at first '.' */
fprintf(fp,"#define %s_width %d\n",name,w);
fprintf(fp,"#define %s_height %d\n",name,h);
fprintf(fp,"static char %s_bits[] = {\n",name);
fprintf(fp," ");
/* set flipbw if color#0 is black */
flipbw = (MONO(rmap[0],gmap[0],bmap[0]) < MONO(rmap[1],gmap[1],bmap[1]));
nbytes = h * ((w+7)/8); /* # of bytes to write */
for (i=0, len=1, pix=pic; i<h; i++) {
for (j=bit=k=0; j<w; j++,pix++) {
k = (k>>1);
if (*pix) k |= 0x80;
bit++;
if (bit==8) {
if (flipbw) k = ~k;
fprintf(fp,"0x%02x",(byte) k&0xff);
nbytes--; len += 4;
if (nbytes) { fprintf(fp,","); len++; }
if (len>72) { fprintf(fp,"\n "); len=1; }
bit = k = 0;
}
}
if (bit) {
k = k >> (8-bit);
if (flipbw) k = ~k;
fprintf(fp,"0x%02x",(byte) k&0xff);
nbytes--; len += 4;
if (nbytes) { fprintf(fp,","); len++; }
if (len>72) { fprintf(fp,"\n "); len=1; }
}
}
fprintf(fp,"};\n");
if (ferror(fp)) return -1;
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.