/* -*- 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 #include #include #include #include #include #include #include #include #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; pPlanes[p]); UBYTE *dst= (UBYTE *)&idata[p*bpr*height]; for(r=0; rBytesPerRow ]; dst= &_dst[ bpr ]; } } } return (UWORD *)idata; }