home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
310.lha
/
Icon2c_v1.0
/
icon2c.c
< prev
next >
Wrap
C/C++ Source or Header
|
1980-12-06
|
8KB
|
298 lines
;/*
FailAt 1
LC -v -iINCLUDE:CompactH/ icon2c.c
Blink FROM lib:c.o icon2c.o TO Icon2c LIB lib:lc.lib SC SD ND
Quit
Icon2c - created by Ray Lambert on 10-23-89
Purpose: read an icon file (Workbench DiskObject) and convert it to
c labguage constant data statements for inclusion in programs
that would like to save an icon with data files.
Usage (CLI only): Icon2c <iconfile[.info]> <cfile[.c]>
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <dos.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h> /* for RASSIZE macro definition */
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <proto/exec.h>
#include <proto/icon.h>
struct Library *IconBase = NULL;
struct DiskObject *dO = NULL;
FILE *file = NULL;
struct DrawerData *dd;
struct Gadget *g;
char *c;
char **cp;
int i;
void bustit(void)
{
if (file) fclose(file);
if (dO) FreeDiskObject(dO);
if (IconBase) CloseLibrary(IconBase);
exit(0);
}
#define WORDSPERROW 10
void dumpimg(struct Image *img, char *namepfx)
{
int imgwords = ( RASSIZE(img->Width,img->Height) * img->Depth );
int rows, last, cnt;
USHORT *s = img->ImageData;
/* dump the image data array */
fprintf(file,"USHORT %sImageData[] =\n\t{\n",namepfx);
rows = (imgwords / WORDSPERROW); /* number of rows of hex words to dump */
last = (imgwords % WORDSPERROW); /* number of hex words on the last line*/
for(; rows>0; rows--)
{
fprintf(file,"\t\t");
for(cnt = 0; cnt < WORDSPERROW; cnt++)
{
if (cnt > 0) fprintf(file,",");
fprintf(file,"0x%04X", *s);
s++;
}
if (rows > 1)
{
fprintf(file,",\n");
}
else
{
if (last != 0) fprintf(file,",");
fprintf(file,"\n");
}
}
if (last > 0)
{
fprintf(file,"\t\t");
for(; last>0; last--, s++)
{
fprintf(file,"0x%04X", *s);
if (last > 1) fprintf(file,",");
}
fprintf(file,"\n");
}
fprintf(file,"\t};\n\n");
/* dump the struct Image */
fprintf(file,"struct Image %sImage =\n\t{\n", namepfx);
fprintf(file,"\t\t%hd, %hd, %hd, %hd, %hd,\n",
img->LeftEdge, img->TopEdge, img->Width, img->Height, img->Depth );
fprintf(file,"\t\t%sImageData,\n", namepfx);
fprintf(file,"\t\t%hd, %hd,\n", (USHORT)img->PlanePick,
(USHORT)img->PlaneOnOff );
fprintf(file,"\t\tNULL\n\t};\n\n");
}
void main(int argc, char *argv[])
{
/* check for Workbench */
if (argc == 0) /* Workbench! */
{
printf("\nCLI ONLY!!\n"); /* just in case someone's listening */
exit(0);
}
printf("\n33;40mIcon2c Version 1.0 - Created by Ray Lambert0m\n\n");
/* check args */
if (argc != 3)
{
printf("Usage: Icon2c <iconfile[.info]> <c file>\n\n");
exit(5);
}
/* open icon library */
IconBase = (struct Library *)OpenLibrary("icon.library",0);
if (!IconBase)
{
printf("\"icon.library\" is on vacation!\n\n");
exit(20);
}
/* read the icon */
/* check for & remove file extension (.info) */
c = (char *)(argv[1] + strlen(argv[1]) - 5);
if (stricmp(c,".info") == 0) *c = '\0';
/* ok now, go get it */
dO = GetDiskObject(argv[1]);
if (!dO)
{
printf("Sorry, that icon (\"%s\") isn't around...\n\n",argv[1]);
bustit();
}
/* open the output file */
file = fopen(argv[2],"wt");
if (!file)
{
printf("Can't open your c file (\"%s\")\n\n",argv[2]);
bustit();
}
/* ok, got everything at our fingertips now */
printf("Working...");
/* say hello... */
fprintf(file,"/*\n");
fprintf(file,"** \"%s.info\" - dumped by Icon2c!\n",argv[1]);
fprintf(file,"*/\n\n");
/* some headers they may need... */
fprintf(file,"#include <workbench/workbench.h>\n");
fprintf(file,"#include <intuition/intuition.h>\n\n");
/* start with the loose stuff... */
/* Render imagery */
g = &dO->do_Gadget;
if (g->GadgetRender)
{
dumpimg((struct Image *)g->GadgetRender,"Render");
}
/* Select imagery */
if (g->SelectRender)
{
dumpimg((struct Image *)g->SelectRender,"Select");
}
/* the ToolTypes array */
cp = dO->do_ToolTypes;
if ( (cp) && (*cp) )
{
fprintf(file,"char *ToolTypes[] = \n\t{\n");
while(*cp)
{
fprintf(file,"\t\t\"%s\",\n",*cp);
cp++;
}
fprintf(file,"\t\tNULL\n\t};\n\n");
}
/* the DrawerData structure (for drawers only) */
dd = dO->do_DrawerData;
if (dd)
{
register struct NewWindow *nw = &dd->dd_NewWindow;
fprintf(file,"struct DrawerData drawerData =\n\t{\n");
fprintf(file,"\t\t{ /* struct NewWindow */\n");
fprintf(file,"\t\t\t%hd, %hd, %hd, %hd,\n", nw->LeftEdge, nw->TopEdge,
nw->Width, nw->Height );
fprintf(file,"\t\t\t%hd, %hd,\n", (USHORT)nw->DetailPen,
(USHORT)nw->BlockPen );
fprintf(file,"\t\t\t0x%08X,\n", nw->IDCMPFlags );
fprintf(file,"\t\t\t0x%08X,\n", nw->Flags );
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\t%hd, %hd, %hd, %hd,\n",
nw->MinWidth, nw->MinHeight,
nw->MaxWidth, nw->MaxHeight );
fprintf(file,"\t\t\t%hd\n\t\t},\n", nw->Type);
fprintf(file,"\t\t%ld,\n", dd->dd_CurrentX);
fprintf(file,"\t\t%ld\n\t};\n\n", dd->dd_CurrentY);
}
/* ok, on to the big guy! */
/* figure a name for the struct based on icon's name */
c = (char *)(argv[1] + strlen(argv[1]) - 1);
while( (c > argv[1]) && (*c != '/') && (*c != ':') )
{
if (*c == '.') *c = '_';
c--;
}
if ( (*c == '/') || (*c == ':') ) c++;
fprintf(file,"struct DiskObject do_%s =\n\t{\n", c);
fprintf(file,"\t\t0x%04X,\n", (ULONG)dO->do_Magic);
fprintf(file,"\t\t0x%04X,\n", (ULONG)dO->do_Version);
fprintf(file,"\t\t{ /* struct Gadget */\n");
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\t%hd, %hd, %hd, %hd,\n", g->LeftEdge, g->TopEdge,
g->Width, g->Height );
fprintf(file,"\t\t\t0x%04X,\n", (ULONG)g->Flags);
fprintf(file,"\t\t\t0x%04X,\n", (ULONG)g->Activation);
fprintf(file,"\t\t\t0x%04X,\n", (ULONG)g->GadgetType);
fprintf(file,"\t\t\t");
if (g->GadgetRender != NULL)
{
fprintf(file,"(APTR)&RenderImage,\n");
}
else
{
fprintf(file,"NULL,\n");
}
fprintf(file,"\t\t\t");
if (g->SelectRender != NULL)
{
fprintf(file,"(APTR)&SelectImage,\n");
}
else
{
fprintf(file,"NULL,\n");
}
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\t0x%08X,\n", g->MutualExclude);
fprintf(file,"\t\t\tNULL,\n");
fprintf(file,"\t\t\t0x%04X,\n", (ULONG)g->GadgetID);
fprintf(file,"\t\t\tNULL\n\t\t},\n");
fprintf(file,"\t\t%d,\n", dO->do_Type);
fprintf(file,"\t\t\"%s\",\n", dO->do_DefaultTool);
fprintf(file,"\t\t");
if ( (dO->do_ToolTypes != NULL) && (*dO->do_ToolTypes != NULL) )
{
fprintf(file,"ToolTypes,\n");
}
else
{
fprintf(file,"NULL,\n");
}
fprintf(file,"\t\t%ld,\n", dO->do_CurrentX);
fprintf(file,"\t\t%ld,\n", dO->do_CurrentY);
fprintf(file,"\t\t");
if (dO->do_DrawerData != NULL)
{
fprintf(file,"&drawerData,\n");
}
else
{
fprintf(file,"NULL,\n");
}
fprintf(file,"\t\t\"%s\",\n", dO->do_ToolWindow);
fprintf(file,"\t\t%ld\n\t};\n\n", dO->do_StackSize);
/* welp, guess that's it! */
printf(" ok dude! you got it...\n\n");
bustit();
}