home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
580b.lha
/
Wasp_v1.23
/
src.LZH
/
src
/
wasp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-15
|
9KB
|
440 lines
/* wasp - convert a picture from GIF, IFF, Sun rasterfile,
* PPM or SRGR to IFF or SRGR,
* optionally scaling it and performing various operations on it.
* copyright Steven Reiz 1990, 1991, see the COPYING file for more info.
* 1/12/90 - 2/6/91, 23/6/91, 30/6/91, 3/7/91 - 8/7/91,
* 24/7/91, 22/10/91
* usage: see the usage routine below
*/
#define MAIN
#include "wasp.h"
#ifndef NOSH
#include "wasp.sh"
#endif
static short zap_option=0;
#ifdef __STDC__
main(int argc, char **argv)
#else
main(argc, argv)
int argc;
char **argv;
#endif
{
#ifdef DEBUG
resetsecs();
#endif
initvars();
do_options(argc, argv);
if ((infd=open(infilename, O_RDONLY))<0)
error1(E0_FATAL, E1_IO, E2_OPEN, E3_ERRNO, infilename);
if (!read_srgr() && !read_iff() && !read_gif() && !read_ras() && !read_ppm()) {
printe("%s is not in IFF, GIF87a, Sun rasterfile, ppm or SRGR format\n", infilename);
exit(1);
}
close(infd);
if ((outfd=open(outfilename, O_WRONLY|O_CREAT|O_TRUNC, 0644))<0)
error1(E0_FATAL, E1_IO, E2_CREAT, E3_ERRNO, outfilename);
if (zap_option)
unlink(infilename);
scaley(yc, yd);
scalex(xa, xb);
do_operations(argc, argv);
switch (outputformat) {
case IFF:
write_iff();
break;
case SRGR:
write_srgr();
break;
case PPM:
write_ppm();
break;
default:
printe("unknown output format\n");
exit(1);
break;
}
exit(0);
}
char *usagestr[]=
{
"usage: wasp [options] [operations] [parameters] infile [outfile]",
"options:",
"-zap : delete infile after it has been read",
"-gifmaptrunc: truncate gif colormap entries to 4 bits i.s.o. rounding them",
"-iff|srgr|ppm: the output format, IFF ILBM, SRGR or ppm",
"-rgb n : ilbm output mode, direct RGB with n bitplanes",
"-nocompr : ilbm output will not be compressed",
"-asc : autoscale, scales to fit the entire picture on the screen",
"-nohires : asc hint, no hires output mode for pictures with more than 16 colors",
"-nohires! : asc hint, no hires output mode",
"-scrw n : asc hint, screen width in lores pixels",
"-scrh n : asc hint, screen height in nolace pixels",
"-sliced : ilbm output mode, SHAM aka sliced HAM",
"-dyn : ilbm output mode, CTBL aka dynamic ham/hires",
"-lace|nolace: ilbm output interlace, on or off",
"-hires|lores|ham|ehb: ilbm output mode",
"operations:",
"-x a/b : scale horizontal, producing a columns out of every b input columns",
"-y c/d : scale vertical, producing c rows out of every d input rows",
"-clip : cut a rectangle out of the picture and drop the rest",
"-xaverage : same as -x 1/2, but averaging the two input columns",
"-xmirror : mirror the picture in a vertical mirror",
"-ymirror : mirror the picture in a horizontal mirror",
"-transpose : mirror the picture diagonally, in mirror y=x",
"parameters:",
"-cmeth m : counting method, all1|alldif|allfdif|j1|j21|jdif|jdifsh|jfdif|jfdifsh|hmgs|hmcubic",
"-dmeth m : distribution method, mu|wf|ehb|mue|hs|con",
"-dmeth2 m : iterative ham second distribution method",
"-threshold n: counting threshold",
NULL
};
#ifdef __STDC__
usage(void)
#else
usage()
#endif
{
char **p;
printe("wasp %s, %s %s, copyright 1990, 1991 by Steven Reiz\n",
version, __DATE__, __TIME__);
for (p=usagestr; *p; ++p)
printe("%s\n", *p);
exit(1);
}
#ifdef __STDC__
initvars(void)
#else
initvars()
#endif
{
outputformat=IFF;
directrgb= -1;
compression=COMPR_RLE;
asc=0;
hires=HIRES_OK;
sliced=SLICED_NOT;
scrw=DEF_SCRW;
scrh=DEF_SCRH;
ymode=UNSET;
xmode=UNSET;
xa=1; xb=1; yc=1; yd=1;
countmeth=COUNTMETH_UNSET;
distrmeth=DISTRMETH_UNSET;
distrmeth2=DISTRMETH_UNSET;
curdistrmeth=DISTRMETH_UNSET;
threshold=1;
inoperation=0;
gifmaptrunc=0;
#ifdef AMIGA
get_scr_size();
#endif
}
#ifdef __STDC__
void *cmalloc(unsigned int n)
#else
void *cmalloc(n)
unsigned int n;
#endif
{
void *p;
if (!(p=malloc(n)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
#ifdef __STDC__
void *ccalloc(unsigned int n)
#else
void *ccalloc(n)
unsigned int n;
#endif
{
void *p;
if (!(p=calloc(n, 1)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
#ifdef __STDC__
void *crealloc(void *q, unsigned int n)
#else
void *crealloc(q, n)
void *q;
unsigned int n;
#endif
{
void *p;
if (!(p=realloc(q, n)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
#ifdef __STDC__
lowcase(char *s)
#else
lowcase(s)
char *s;
#endif
{
char c;
while (c= *s) {
if (c>='A' && c<='Z')
*s=c-'A'+'a';
++s;
}
}
#ifdef __STDC__
u_long ceillog2(u_long a)
#else
u_long ceillog2(a)
u_long a;
#endif
{
u_long b;
short i;
assert(a);
b=a;
for (i= -1; b; ++i)
b>>=1;
b=1L<<i;
return (u_long)(a>b ? i+1 : i);
}
#ifdef DEBUG
#ifndef AMIGA
#ifdef __STDC__
resetsecs(void)
#else
resetsecs()
#endif
{
}
#ifdef __STDC__
long centisecs(void)
#else
long centisecs()
#endif
{
return 0;
}
#endif
#endif
static char *sc[]={
#define S_IFF 0
"iff",
#define S_SRGR 1
"srgr",
#define S_RGB 2
"rgb",
#define S_NOCOMPR 3
"nocompr",
#define S_ASC 4
"asc",
#define S_NOHIRES 5
"nohires",
#define S_NOHIRES2 6
"nohires!",
#define S_SCRW 7
"scrw",
#define S_SCRH 8
"scrh",
#define S_SLICED 9
"sliced",
#define S_DYN 10
"dyn",
#define S_LACE 11
"lace",
#define S_NOLACE 12
"nolace",
#define S_HIRES 13
"hires",
#define S_LORES 14
"lores",
#define S_HAM 15
"ham",
#define S_EHB 16
"ehb",
#define S_X 17
"x",
#define S_Y 18
"y",
#define S_CLIP 19
"clip",
#define S_XAVERAGE 20
"xaverage",
#define S_XMIRROR 21
"xmirror",
#define S_YMIRROR 22
"ymirror",
#define S_TRANSPOSE 23
"transpose",
#define S_COUNTMETH 24
"cmeth",
#define S_DISTRMETH 25
"dmeth",
#define S_DISTRMETH2 26
"dmeth2",
#define S_THRESHOLD 27
"threshold",
#define S_ZAP 28
"zap",
#define S_GIFMAPTRUNC 29
"gifmaptrunc",
#define S_PPM 30
"ppm",
#define S_UNKNOWN 31
NULL
};
#ifdef __STDC__
int stringcode(char *s)
#else
int stringcode(s)
char *s;
#endif
{
char **p;
if (!s || *s!='-')
return S_UNKNOWN;
++s;
for (p=sc; *p; ++p)
if (!strcmp(s, *p))
break;
return p-sc;
}
#ifdef __STDC__
do_options(int argc, char **argv)
#else
do_options(argc, argv)
int argc;
char **argv;
#endif
{
int i, j;
if (argc<2)
usage();
for (i=1; i<argc && argv[i][0]=='-'; ++i) {
lowcase(argv[i]);
switch (stringcode(argv[i])) {
case S_IFF: outputformat=IFF; break;
case S_SRGR: outputformat=SRGR; break;
case S_RGB: directrgb=atol(argv[++i]); break;
case S_NOCOMPR: compression=COMPR_NONE; break;
case S_ASC: asc=1; break;
case S_NOHIRES: hires=HIRES_MAYBE; break;
case S_NOHIRES2: hires=HIRES_NOT; break;
case S_SCRW: scrw=atol(argv[++i]); break;
case S_SCRH: scrh=atol(argv[++i]); break;
case S_SLICED: sliced=SLICED_SHAM; break;
case S_DYN: sliced=SLICED_DYN; break;
case S_LACE: ymode=LACE; break;
case S_NOLACE: ymode=NOLACE; break;
case S_HIRES: xmode=HIRES; break;
case S_LORES: xmode=LORES; break;
case S_HAM: xmode=HAM; break;
case S_EHB: xmode=EHB; break;
case S_X:
xa=atol(argv[++i]);
xb=atol(strchr(argv[i], '/')+1);
break;
case S_Y:
yc=atol(argv[++i]);
yd=atol(strchr(argv[i], '/')+1);
break;
case S_CLIP: /* these operations are handled below */
case S_XAVERAGE:
case S_XMIRROR:
case S_YMIRROR:
case S_TRANSPOSE:
break;
case S_COUNTMETH:
if ((j=cmethnum(argv[++i]))== -1)
usage();
countmeth=j;
break;
case S_DISTRMETH:
if ((j=dmethnum(argv[++i]))== -1)
usage();
distrmeth=j;
break;
case S_THRESHOLD: threshold=atol(argv[++i]); break;
case S_DISTRMETH2:
xmode=HAM;
if ((j=dmethnum(argv[++i]))== -1)
usage();
distrmeth2=j;
break;
case S_ZAP: zap_option=1; break;
case S_GIFMAPTRUNC: gifmaptrunc=1; break;
case S_PPM: outputformat=PPM; break;
default:
usage();
break;
}
}
if (argc>i+2)
usage();
infilename=argv[i];
if (argc>i+1)
outfilename=argv[i+1];
else
outfilename=NULL;
}
#ifdef __STDC__
do_operations(int argc, char **argv)
#else
do_operations(argc, argv)
int argc;
char **argv;
#endif
{
int i;
inoperation=1;
for (i=1; i<argc; ++i) {
switch (stringcode(argv[i])) {
case S_CLIP: do_clipping(); break;
case S_XAVERAGE: xaverage(); break;
case S_XMIRROR: xmirror(); break;
case S_YMIRROR: ymirror(); break;
case S_TRANSPOSE: transpose(); break;
}
}
inoperation=0;
}