mirror of
https://github.com/ctm/executor.git
synced 2024-11-27 01:49:33 +00:00
232 lines
4.3 KiB
C
232 lines
4.3 KiB
C
#include "ico.h"
|
|
|
|
static void
|
|
init_ctab (ICONFILE *ifp)
|
|
{
|
|
CTabHandle ctab;
|
|
int n_entries, i;
|
|
|
|
ctab = GetCTable (72);
|
|
n_entries = (*ctab)->ctSize + 1;
|
|
for (i = 0; i < n_entries; ++i)
|
|
{
|
|
RGBColor rgb;
|
|
unsigned char xor_value;
|
|
|
|
xor_value = (i == 0 || i == 255) ? 255 : 0;
|
|
xor_value = 0;
|
|
rgb = (*ctab)->ctTable[i^xor_value].rgb;
|
|
ifp->IconData.Palette[i].rgbRed = rgb.red >> 8;
|
|
ifp->IconData.Palette[i].rgbGreen = rgb.green >> 8;
|
|
ifp->IconData.Palette[i].rgbBlue = rgb.blue >> 8;
|
|
}
|
|
}
|
|
|
|
typedef short INTEGER;
|
|
typedef long LONGINT;
|
|
|
|
static void
|
|
write_file (const ICONFILE *ifp, short i)
|
|
{
|
|
Str255 name;
|
|
unsigned char *p;
|
|
INTEGER rn;
|
|
|
|
NumToString (i, name);
|
|
p = name + name[0] + 1;
|
|
p[0] = '.';
|
|
p[1] = 'i';
|
|
p[2] = 'c';
|
|
p[3] = 'o';
|
|
name[0] += 4;
|
|
if (Create (name, 0, 'UNIX', 'TEXT') == noErr && FSOpen (name, 0, &rn) == noErr)
|
|
{
|
|
LONGINT count;
|
|
|
|
count = sizeof *ifp;
|
|
FSWrite (rn, &count, (Ptr) ifp);
|
|
FSClose (rn);
|
|
}
|
|
}
|
|
|
|
static void
|
|
write_an_ico (ICONFILE *ifp, short n, Handle icn_h, Handle icl8_h)
|
|
{
|
|
int mask_offset;
|
|
|
|
mask_offset = 32 * 32 / 8;
|
|
LoadResource (icn_h);
|
|
LoadResource (icl8_h);
|
|
HLock (icn_h);
|
|
HLock (icl8_h);
|
|
{
|
|
int i;
|
|
unsigned char *ip;
|
|
unsigned char *op;
|
|
|
|
ip = (unsigned char *) *icl8_h;
|
|
for (i = 31; i >= 0; --i)
|
|
{
|
|
int j;
|
|
|
|
op = (unsigned char *) ifp->IconData.XorMap[i];
|
|
for (j = 0; j < 32; ++j)
|
|
{
|
|
unsigned char c;
|
|
|
|
c = *ip++;
|
|
/*
|
|
if (c == 0 || c == 255)
|
|
c ^= 255; */
|
|
*op++ = c;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
unsigned char *ip, *op;
|
|
int i, j;
|
|
|
|
ip = (unsigned char *)*icn_h + mask_offset;
|
|
op = (unsigned char *)ifp->IconData.AndMap[31];
|
|
for (i = 0; i < 32; ++i)
|
|
{
|
|
for (j = 0; j < 4; ++j)
|
|
{
|
|
unsigned char c;
|
|
|
|
c = ~*ip++;
|
|
*op++ = c;
|
|
if (c & 128)
|
|
ifp->IconData.XorMap[31-i][j*8+0] = 255;
|
|
if (c & 64)
|
|
ifp->IconData.XorMap[31-i][j*8+1] = 255;
|
|
if (c & 32)
|
|
ifp->IconData.XorMap[31-i][j*8+2] = 255;
|
|
if (c & 16)
|
|
ifp->IconData.XorMap[31-i][j*8+3] = 255;
|
|
if (c & 8)
|
|
ifp->IconData.XorMap[31-i][j*8+4] = 255;
|
|
if (c & 4)
|
|
ifp->IconData.XorMap[31-i][j*8+5] = 255;
|
|
if (c & 2)
|
|
ifp->IconData.XorMap[31-i][j*8+6] = 255;
|
|
if (c & 1)
|
|
ifp->IconData.XorMap[31-i][j*8+7] = 255;
|
|
}
|
|
op -= 8;
|
|
}
|
|
}
|
|
|
|
write_file (ifp, n);
|
|
|
|
HUnlock (icl8_h);
|
|
HUnlock (icn_h);
|
|
}
|
|
|
|
static void
|
|
capture_icos (ICONFILE *ifp, INTEGER rn)
|
|
{
|
|
int nres, n;
|
|
INTEGER cur_rn;
|
|
|
|
cur_rn = CurResFile ();
|
|
|
|
UseResFile (rn);
|
|
nres = Count1Resources('ICN#');
|
|
for (n = 1; n <= nres; n++)
|
|
{
|
|
Handle icn_h;
|
|
short i;
|
|
ResType t;
|
|
Str255 resname;
|
|
|
|
icn_h = Get1IndResource('ICN#', n);
|
|
if (icn_h)
|
|
{
|
|
Handle icl8_h;
|
|
|
|
GetResInfo(icn_h, &i, &t, resname);
|
|
icl8_h = GetResource ('icl8', i);
|
|
UseResFile (cur_rn);
|
|
if (icl8_h)
|
|
write_an_ico (ifp, i, icn_h, icl8_h);
|
|
UseResFile (rn);
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
static ICONFILE ofile =
|
|
{
|
|
CWC (0),
|
|
CWC (1),
|
|
CWC (1),
|
|
{
|
|
CBC (32),
|
|
CBC (32),
|
|
CBC (0),
|
|
CBC (0),
|
|
CWC (0),
|
|
CWC (0),
|
|
CLC (2216),
|
|
CLC (22),
|
|
},
|
|
{
|
|
{
|
|
CLC (40),
|
|
CLC (32),
|
|
CLC (64),
|
|
CWC (1),
|
|
CWC (8),
|
|
CLC (0),
|
|
CLC (1152),
|
|
CLC (0),
|
|
CLC (0),
|
|
CWC (0),
|
|
CWC (0),
|
|
},
|
|
},
|
|
};
|
|
|
|
int size = sizeof ofile;
|
|
int iconDirSize = sizeof ofile.IconDir;
|
|
int iconDataSize = sizeof ofile.IconData;
|
|
INTEGER rn;
|
|
|
|
InitGraf(&qd.thePort);
|
|
InitFonts();
|
|
InitWindows();
|
|
InitMenus();
|
|
TEInit();
|
|
InitDialogs(nil);
|
|
InitCursor();
|
|
|
|
init_ctab (&ofile);
|
|
|
|
{
|
|
Point p;
|
|
/* SFTypeList sft; */
|
|
SFReply sfp;
|
|
INTEGER cur_rn;
|
|
|
|
p.h = 0; p.v = 0;
|
|
SFGetFile (p, "\p", NULL, -1, (const unsigned long *) 0, NULL, &sfp);
|
|
#if 1
|
|
cur_rn = CurResFile ();
|
|
SetResLoad (false);
|
|
rn = HOpenResFile (sfp.vRefNum, 0, sfp.fName, fsCurPerm);
|
|
UseResFile (cur_rn);
|
|
SetResLoad (true);
|
|
#endif
|
|
}
|
|
|
|
capture_icos (&ofile, rn);
|
|
CloseResFile (rn);
|
|
|
|
return 0;
|
|
}
|