home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
icon
/
Tool
/
IconTools-2.01
/
im.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-06
|
19KB
|
627 lines
/* -*- C -*-
* IM.C
*
* (c)Copyright 1995 by Tobias Ferber, ukjg@rz.uni-karlsruhe.de
*
* This file is part of the IconTools distribution
*
* IconMaker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 1 of the License,
* or (at your option) any later version.
*
* IconMaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "version.h"
static char versiontag[]= "$VER: $Id: im.c,v 1.6 1995/07/22 16:41:12 tf Exp $";
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include "iffp/ilbm.h"
#include "iffp/ilbmapp.h"
#ifndef IFFPARSENAME
#define IFFPARSENAME "iffparse.library"
#endif
extern BOOL PutDiskObject(char *, struct DiskObject *);
void display_version_information(void)
{
static char license[]=
"IconMaker is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published\n"
"by the Free Software Foundation; either version 1 of the License,\n"
"or (at your option) any later version.\n"
"\n"
"IconMaker is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License for more details.\n"
"\n"
"You should have received a copy of the GNU General Public License\n"
"along with this program; see the file COPYING. If not, write to the\n"
"Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
;
puts("\nIconMaker/IM Version " VERSION " (compiled " __DATE__ ", " __TIME__ ")\n"
"(c)Copyright 1995 by Tobias Ferber, ukjg@rz.uni-karlsruhe.de\n");
puts(license);
}
UWORD *ImageDataFromBitMap(struct BitMap *bm, WORD width, WORD height);
/* System */
struct Library *GfxBase = NULL;
struct Library *IFFParseBase = NULL;
struct Library *IconBase = NULL;
/*
* These are the default values
*/
static struct Image gr = { 0, 0, 0, 0, 0, NULL, 0, 0, NULL }; /* GadgetRender */
static struct Image sr = { 0, 0, 0, 0, 0, NULL, 0, 0, NULL }; /* SelectRender */
static char *tt[] = { "FILETYPE=ILBM", NULL };
static struct DrawerData dd = {
{ 60, /* dd_NewWindow.LeftEdge */
50, /* dd_NewWindow.TopEdge */
330, /* dd_NewWindow.Width */
140, /* dd_NewWindow.Height */
255, /* dd_NewWindow.DetailPen */
255, /* dd_NewWindow.BlockPen */
NULL, /* dd_NewWindow.IDCMPFlags */
WFLG_SIZEGADGET
| WFLG_DRAGBAR
| WFLG_DEPTHGADGET
| WFLG_CLOSEGADGET
| WFLG_SIZEBRIGHT
| WFLG_SIZEBBOTTOM
| WFLG_SIMPLE_REFRESH
| WFLG_REPORTMOUSE
| WFLG_ACTIVATE
| WFLG_NEWLOOKMENUS
| WFLG_WBENCHWINDOW, /* dd_NewWindow.Flags */
NULL, /* dd_NewWindow.FirstGadget */
NULL, /* dd_NewWindow.CheckMark */
NULL, /* dd_NewWindow.Title */
NULL, /* dd_NewWindow.Screen */
NULL, /* dd_NewWindow.BitMap */
0, /* dd_NewWindow.MinWidth */
0, /* dd_NewWindow.MinHeight */
65535, /* dd_NewWindow.MaxWidth */
65535, /* dd_NewWindow.MaxHeight */
WBENCHSCREEN }, /* dd_NewWindow.Type */
0, /* dd_CurrentX */
0, /* dd_CurrentY */
3, /* dd_Flags */
0, /* dd_ViewModes */
};
static struct DiskObject icon = {
WB_DISKMAGIC, /* do_Magic */
WB_DISKVERSION, /* do_Version */
{ NULL, /* do_Gadget.NextGadget */
0, /* do_Gadget.LeftEdge */
0, /* do_Gadget.TopEdge */
0, /* do_Gadget.Width */
0, /* do_Gadget.Height */
GFLG_GADGHIMAGE|GFLG_GADGIMAGE, /* do_Gadget.Flags */
GACT_RELVERIFY|GACT_IMMEDIATE, /* do_Gadget.Activation */
GTYP_BOOLGADGET, /* do_Gadget.GadgetType */
(APTR)&gr, /* do_Gadget.GadgetRender */
(APTR)&sr, /* do_Gadget.SelectRender */
NULL, /* do_Gadget.GadgetText */
0, /* do_Gadget.MutualExclude */
NULL, /* do_Gadget.SpecialInfo */
0, /* do_Gadget.GadgetID */
WB_DISKREVISION }, /* do_Gadget.UserData */
WBPROJECT, /* do_Type */
"MultiView", /* do_DefaultTool */
&tt[0], /* do_ToolTypes */
NO_ICON_POSITION, /* do_CurrentX */
NO_ICON_POSITION, /* do_CurrentY */
&dd, /* do_DrawerData */
NULL, /* do_ToolWindow */
8192, /* do_StackSize */
};
/*
* The global error function
*/
static char *whoami; /* global copy of argv[0] */
static void echo(const char *fmt, ...)
{
va_list argp;
va_start(argp,fmt);
fprintf(stderr,"%s: ",whoami);
vfprintf(stderr,(char *)fmt,argp);
fprintf(stderr,"\n");
fflush(stderr);
va_end(argp);
}
/*
* Some top-level functions for ILBM loading
*/
static struct ILBMInfo *myloadbrush(char *fname)
{
int err= 0;
struct ILBMInfo *ilbm= (struct ILBMInfo *)AllocVec( sizeof(struct ILBMInfo), MEMF_CLEAR );
if(ilbm)
{
/* ILBM Property chunks to be grabbed - only BMHD needed for this app */
static LONG ilbmprops[] = { ID_ILBM, ID_BMHD, TAG_DONE };
/* ILBM Collection chunks (more than one in file) to be gathered */
static LONG *ilbmcollects = NULL; /* none needed for this app */
/* ILBM Chunk to stop on */
static LONG ilbmstops[] = { ID_ILBM, ID_BODY, TAG_DONE };
ilbm->ParseInfo.propchks = ilbmprops;
ilbm->ParseInfo.collectchks = ilbmcollects;
ilbm->ParseInfo.stopchks = ilbmstops;
/* Alloc IFF handle for frame */
if( (ilbm->ParseInfo.iff= AllocIFF()) )
{
if( (err= loadbrush(ilbm,fname)) )
{
/*fprintf(stderr,IFFerr(err));*/
echo("Can't load ILBM `%s'",fname);
++err;
}
}
else /* !AllocIFF() */
{
echo("AllocIFF() failed -- not enough memory!?");
++err;
}
}
if(err && ilbm)
{
if(ilbm->ParseInfo.iff)
FreeIFF(ilbm->ParseInfo.iff);
FreeVec(ilbm);
ilbm= (struct ILBMInfo *)NULL;
}
return ilbm;
}
static struct ILBMInfo *myunloadbrush(struct ILBMInfo *ilbm)
{
if(ilbm)
{
unloadbrush(ilbm);
if(ilbm->ParseInfo.iff)
FreeIFF(ilbm->ParseInfo.iff);
FreeVec(ilbm);
}
return (struct ILBMInfo *)0;
}
/**/
int main(int argc, char **argv)
{
struct RDArgs *a;
LONG args[17] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
int rc= RETURN_OK;
whoami= argv[0]; /* needed by echo() */
if( (a= ReadArgs( /* 0 */ "FROM=NORMAL/K/A,"
/* 1 */ "SELECTED/K,"
/* 2 */ "IW=ICONWIDTH/K/N,"
/* 3 */ "IH=ICONHEIGHT/K/N,"
/* 4 */ "MINSIZE/S,"
/* 5 */ "TYPE/K,"
/* 6 */ "HIGHLIGHT/K,"
/* 7 */ "IX=ICONX/K/N,"
/* 8 */ "IY=ICONY/K/N,"
/* 9 */ "TOOLTYPES/K/M,"
/* 10 */ "STACKSIZE/K/N,"
/* 11 */ "DEFAULTTOOL/K,"
/* 12 */ "WX=WINDOWX/K/N,"
/* 13 */ "WY=WINDOWY/K/N,"
/* 14 */ "WW=WINDOWWIDTH/K/N,"
/* 15 */ "WH=WINDOWHEIGHT/K/N,"
/* 16 */ "TO/K/A", args, NULL )) )
{
#if 0
printf("NORMAL \"%s\"\n"
"SELECTED \"%s\"\n"
"ICONWIDTH=%ld ICONHEIGHT=%ld MINSIZE=%ld\n"
"TYPE \"%s\"\n"
"HIGHLIGHT \"%s\"\n"
"ICONX=%ld ICONY=%ld\n"
"STACKSIZE=%ld\n"
"DEFAULTTOOL \"%s\"\n"
"WINDOWX=%ld WINDOWY=%ld WINDOWWIDTH=%ld WINDOWHEIGHT=%ld\n"
"TO \"%s\"\n"
,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]
,args[10],args[11],args[12],args[13],args[14],args[15],args[16]);
{
char **t= (char **)(args[9]);
printf("TOOLTYPES"); while(t && *t) printf(" \"%s\"",*t++); printf("\n");
}
#endif
/* Open Libraries */
if( (GfxBase = OpenLibrary(GRAPHICSNAME,0)) )
{
if( (IconBase= OpenLibrary(ICONNAME,36)) )
{
if( (IFFParseBase = OpenLibrary(IFFPARSENAME,0)) )
{
struct ILBMInfo *ilbm_normal, *ilbm_selected= (struct ILBMInfo *)NULL;
if( (ilbm_normal= myloadbrush( (char *)(args[0]) )) )
{
if(args[1])
{
if(!(ilbm_selected= myloadbrush( (char *)(args[1]) )) )
rc= RETURN_FAIL;
}
}
else rc= RETURN_FAIL;
/* IW=ICONWIDTH */
if( rc == RETURN_OK )
{
WORD width;
if(args[2])
width= (WORD)(*((LONG *)(args[2])));
else
{
if(ilbm_selected)
width= args[4] ? MIN(ilbm_normal->Bmhd.w, ilbm_selected->Bmhd.w)
: MAX(ilbm_normal->Bmhd.w, ilbm_selected->Bmhd.w);
else
width= ilbm_normal->Bmhd.w;
}
icon.do_Gadget.Width = gr.Width = sr.Width = width;
}
/* IH=ICONHEIGHT */
if( rc == RETURN_OK )
{
WORD height;
if(args[3])
height= (WORD)(*((LONG *)(args[3])));
else
{
if(ilbm_selected)
height= args[4] ? MIN(ilbm_normal->Bmhd.h, ilbm_selected->Bmhd.h)
: MAX(ilbm_normal->Bmhd.h, ilbm_selected->Bmhd.h);
else
height= ilbm_normal->Bmhd.h;
}
icon.do_Gadget.Height = gr.Height = sr.Height = height;
}
/* TYPE */
if( rc == RETURN_OK && args[5] )
{
int n= -1;
char *s= (char *)args[5];
if( !stricmp(s,"DISK") ) n= WBDISK;
else if( !stricmp(s,"DRAWER") ) n= WBDRAWER;
else if( !stricmp(s,"TOOL") ) n= WBTOOL;
else if( !stricmp(s,"PROJECT") ) n= WBPROJECT;
else if( !stricmp(s,"GARBAGE") ) n= WBGARBAGE;
else if( !stricmp(s,"DEVICE") ) n= WBDEVICE;
else if( !stricmp(s,"KICK") ) n= WBKICK;
else if( !stricmp(s,"APPICON") ) n= WBAPPICON;
if( n < 1 || n > 8 )
{
echo("Bad TYPE \"%s\" for template DISK/S,DRAWER/S,TOOL/S,PROJECT/S,GARBAGE/S",s);
rc= RETURN_ERROR;
}
else icon.do_Type= (UBYTE)n;
}
/* HIGHLIGHT */
if( rc == RETURN_OK && args[6] )
{
int n= -1;
char *s= (char *)args[6];
if( !stricmp(s,"COMPLEMENT") ) n= GFLG_GADGHCOMP;
else if( !stricmp(s,"BACKFILL") ) n= GFLG_GADGHBOX;
else if( !stricmp(s,"IMAGE") ) n= GFLG_GADGHIMAGE;
else if( !stricmp(s,"NONE") ) n= GFLG_GADGHNONE;
if( n < 0 )
{
echo("Bad HIGHLIGHT method \"%s\" for template COMPLEMENT/S,BACKFILL/S,IMAGE/S",s);
rc= RETURN_ERROR;
}
else icon.do_Gadget.Flags= GFLG_GADGIMAGE | (UBYTE)n;
if( ilbm_selected && n != GFLG_GADGHIMAGE )
{
echo("SELECTED image `%s' ignored for HIGHLIGHT medthod `%s'",args[1],s);
ilbm_selected= myunloadbrush(ilbm_selected);
}
else if( !ilbm_selected && n == GFLG_GADGHIMAGE )
{
echo("You must specify a SELECTED image for HIGHLIGHT method `%s'",s);
rc= RETURN_ERROR;
}
}
/* IX=ICONX */
if( rc == RETURN_OK && args[7] )
{
icon.do_Gadget.LeftEdge= (WORD)(*((LONG *)(args[7])));
}
/* IY=ICONY */
if( rc == RETURN_OK && args[8] )
{
icon.do_Gadget.TopEdge= (WORD)(*((LONG *)(args[8])));
}
/* TOOLTYPES */
if( rc == RETURN_OK && args[9] )
{
icon.do_ToolTypes= (char **)(args[9]);
}
/* STACKSIZE */
if( rc == RETURN_OK && args[10] )
{
icon.do_StackSize= (*((LONG *)(args[10])));
}
/* DEFAULTTOOL */
if( rc == RETURN_OK && args[11] )
{
icon.do_DefaultTool= (char *)(args[11]);
}
/* WX=WINDOWX */
if( rc == RETURN_OK && args[12] )
{
dd.dd_NewWindow.LeftEdge= (WORD)(*((LONG *)(args[12])));
}
/* WY=WINDOWY */
if( rc == RETURN_OK && args[13] )
{
dd.dd_NewWindow.TopEdge= (WORD)(*((LONG *)(args[13])));
}
/* WW=WINDOWWIDTH */
if( rc == RETURN_OK && args[14] )
{
dd.dd_NewWindow.Width= (WORD)(*((LONG *)(args[14])));
}
/* WH=WINDOWHEIGHT */
if( rc == RETURN_OK && args[15] )
{
dd.dd_NewWindow.Height= (WORD)(*((LONG *)(args[15])));
}
/*
* Postwork
*/
if( rc == RETURN_OK )
{
if(icon.do_Type != WBDRAWER && icon.do_Type != WBDISK)
icon.do_DrawerData= (struct DrawerData *)NULL;
if(!(icon.do_Gadget.Flags &~ GFLG_GADGHIMAGE))
{
icon.do_Gadget.SelectRender= (struct Image *)NULL;
if(ilbm_selected)
ilbm_selected= myunloadbrush(ilbm_selected);
}
else if(!ilbm_selected)
{
icon.do_Gadget.SelectRender= (struct Image *)NULL;
icon.do_Gadget.Flags= (icon.do_Gadget.Flags & ~GFLG_GADGHIMAGE) | GFLG_GADGHCOMP;
}
}
/*
* Create the icon and save it
*/
if( rc == RETURN_OK )
{
WORD width = icon.do_Gadget.Width;
WORD height = icon.do_Gadget.Height;
UWORD *gr_data, *sr_data= (UWORD *)NULL;
if( (gr_data= ImageDataFromBitMap(ilbm_normal->brbitmap, width, height)) )
{
UBYTE pp[]= { 0,1,3,7,15,31,63,127,255 }; /* PlanePick lookup table */
gr.ImageData = gr_data;
gr.Depth = ilbm_normal->brbitmap->Depth;
gr.PlanePick = pp[ilbm_normal->brbitmap->Depth];
if(ilbm_selected)
{
if( (sr_data= ImageDataFromBitMap(ilbm_selected->brbitmap, width, height)) )
{
sr.ImageData = sr_data;
sr.Depth = ilbm_selected->brbitmap->Depth;
sr.PlanePick = pp[ilbm_selected->brbitmap->Depth];
}
else /* !sr_data */
{
echo("ImageDataFromBitMap() failed -- not enough memory!?");
rc= ERROR_NO_FREE_STORE;
}
}
if( rc == RETURN_OK )
{
if( !PutDiskObject((char *)(args[16]),&icon) )
PrintFault(rc= IoErr(),(char *)(args[16]));
}
if(sr_data)
FreeVec(sr_data);
FreeVec(gr_data);
}
else /* !gr_data */
{
echo("ImageDataFromBitMap() failed -- not enough memory!");
rc= ERROR_NO_FREE_STORE;
}
}
ilbm_normal = myunloadbrush( ilbm_normal );
ilbm_selected = myunloadbrush( ilbm_selected );
CloseLibrary(IFFParseBase);
}
else
{
echo("No %s",IFFPARSENAME);
rc= RETURN_FAIL;
}
CloseLibrary(IconBase);
}
else
{
echo("No %s",ICONNAME);
rc= RETURN_FAIL;
}
CloseLibrary(GfxBase);
}
else
{
echo("No %s",GRAPHICSNAME);
rc= RETURN_FAIL;
}
FreeArgs(a);
}
else /* !ReadArgs */
{
if(argc == 1)
display_version_information();
else
PrintFault(rc= IoErr(), NULL);
}
return rc;
}
/* written 1993 by Tobias Ferber, All Rights Reserved */
UWORD *ImageDataFromBitMap(struct BitMap *bm, WORD width, WORD height)
{
ULONG bpr = ((width+15)/16) * 2;
UBYTE *idata= (UBYTE *)AllocVec( bpr * height * bm->Depth, MEMF_CHIP|MEMF_CLEAR );
/*printf("ImageDataFromBitMap(): width=%d,height=%d,depth=%d,bpr=%ld\n",width,height,bm->Depth,bpr);*/
if(idata)
{
int p,b,r;
int P= bm->Depth;
int B= MIN(bm->BytesPerRow, bpr);
int R= MIN(bm->Rows, height);
for(p=0; p<P; p++)
{
UBYTE *src= (UBYTE *)(bm->Planes[p]);
UBYTE *dst= (UBYTE *)&idata[p*bpr*height];
for(r=0; r<R; r++)
{
/* save "beginning of line" values */
UBYTE *_src= src;
UBYTE *_dst= dst;
for(b=0; b<B; b++)
*dst++ = *src++;
/* jump to the next line */
src= &_src[ bm->BytesPerRow ];
dst= &_dst[ bpr ];
}
}
}
return (UWORD *)idata;
}