Category : Files from Magazines
Archive   : VOL10N06.ZIP
Filename : ICO.C
/* */
/* File : ICO.C */
/* */
/* Purpose : Main routine for the IKE icon editor. */
/* */
/* History : */
/* */
/* (C) Copyright 1991 Marc Adler/Magma Systems All Rights Reserved */
/*===========================================================================*/
#include
#include
#include
#include "ico.h"
HWND hWndMain;
HWND hWndEdit;
HWND hWndDebug;
HWND hWndActualImage;
HANDLE hInst = 0;
HANDLE hAccTable;
ICONHEADER IconHeader;
ICONDIRECTORY IconDir;
ICONINFO IconInfo =
{
NULL, NULL, 0, '\0'
};
BYTE rgb[16][3] =
{ /* B G R */
{ 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x80 },
{ 0x00, 0x80, 0x00 },
{ 0x00, 0x80, 0x80 },
{ 0x80, 0x00, 0x00 },
{ 0x80, 0x00, 0x80 },
{ 0x80, 0x80, 0x00 },
{ 0x80, 0x80, 0x80 },
{ 0xC0, 0xC0, 0xC0 },
{ 0x00, 0x00, 0xFF },
{ 0x00, 0xFF, 0x00 },
{ 0x00, 0xFF, 0xFF },
{ 0xFF, 0x00, 0x00 },
{ 0xFF, 0x00, 0xFF },
{ 0xFF, 0xFF, 0x00 },
{ 0xFF, 0xFF, 0xFF }
};
/****************************************************************************/
/* */
/* Function : WinMain() */
/* */
/* Purpose : Entry point for a Windows app. */
/* */
/* Returns : */
/* */
/****************************************************************************/
int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
HANDLE hInstance;
HANDLE hPrevInstance;
LPSTR lpCmdLine;
int nCmdShow;
{
HWND hWnd;
MSG msg;
char szFileName[80];
if (!hPrevInstance) /* Has application been initialized? */
if (!ICOViewInit(hInstance))
return (NULL); /* Exits if unable to initialize */
hInst = hInstance; /* Saves the current instance */
/*
Create the main window.
*/
hWnd = CreateWindow("ICOView",
"ICOView",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
#ifdef DEBUG
600,
#else
520,
#endif
424,
NULL,
NULL,
hInstance,
NULL);
if (!(hWndMain = hWnd))
return (NULL);
#ifdef DEBUG
/*
Create a debugging window.
*/
hWndDebug = CreateWindow("ICODbg",
"ICODbg",
WS_OVERLAPPEDWINDOW | WS_CHILD |
WS_VISIBLE | WS_CLIPSIBLINGS,
280, 0, 400, 400,
hWnd,
16,
hInstance,
NULL);
#endif
/*
Create the icon editing window
*/
hWndEdit = CreateWindow("IconEdit",
(LPSTR) "Edit",
WS_CHILD | WS_BORDER | WS_VISIBLE,
5, 2,
32*8 + 2*GetSystemMetrics(SM_CXBORDER),
32*8 + 2*GetSystemMetrics(SM_CYBORDER),
hWnd,
1,
hInstance,
(LPSTR) NULL);
if (!hWndEdit)
{
MessageBox(hWnd, "Can't create hWndEdit", NULL, MB_OK);
return NULL;
}
/*
Create the window which will hold the actual icom image (32x32)
*/
hWndActualImage = CreateWindow("IconImage",
(LPSTR) NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE,
300, 100,
32 + 2*GetSystemMetrics(SM_CXBORDER),
32 + 2*GetSystemMetrics(SM_CYBORDER),
hWnd,
2,
hInstance,
(LPSTR) NULL);
if (!hWndActualImage)
{
MessageBox(hWnd, "Can't create hWndActualImage", NULL, MB_OK);
return NULL;
}
/*
Initialize the toolbox
*/
ToolboxInit(hWndMain);
/*
The Paste option is initially disabled since there is nothing in
the paste buffer. (An enhancement would be to make the paste buffer
shared between instances.)
*/
EnableMenuItem(GetMenu(hWndMain), IDM_PASTE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
/*
Create a blank icon to start off with.
*/
NewIcon();
/*
Read in any icon file which may have been passed on the command line.
*/
if (lpCmdLine && *lpCmdLine)
{
lstrcpy(szFileName, lpCmdLine);
if (strchr(szFileName, '.') == NULL)
strcat(szFileName, ".ico");
ICORead(hWndEdit, szFileName);
}
/*
Main message loop...
*/
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
/****************************************************************************/
/* */
/* Function : ICOViewInit() */
/* */
/* Purpose : Registers all of the classes used by the icon editor. */
/* */
/* Returns : TRUE if successful, FALSE if not. */
/* */
/****************************************************************************/
BOOL ICOViewInit(hInstance)
HANDLE hInstance;
{
HANDLE hMemory;
WNDCLASS *pWndClass;
BOOL bSuccess;
hMemory = LocalAlloc(LPTR, sizeof(WNDCLASS));
pWndClass = (PWNDCLASS) LocalLock(hMemory);
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(hInstance, "IKE");
pWndClass->lpszMenuName = (LPSTR) "IconEdit";
pWndClass->lpszClassName = (LPSTR) "ICOView";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOViewWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = (HICON) NULL;
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IconEdit";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOEditWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IconImage";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICOImageWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "ToolBox";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ToolBoxWndProc;
pWndClass->cbWndExtra = sizeof(HANDLE);
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
#ifdef DEBUG
pWndClass->hCursor = (HICON) NULL;
pWndClass->hIcon = LoadIcon(NULL, IDI_APPLICATION);
pWndClass->lpszMenuName = (LPSTR) NULL;
pWndClass->lpszClassName = (LPSTR) "IcoDbg";
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ICODebugWndProc;
bSuccess = RegisterClass(pWndClass);
if (!bSuccess)
return FALSE;
#endif
LocalUnlock(hMemory);
LocalFree(hMemory);
return bSuccess;
}
/****************************************************************************/
/* */
/* Function : NewIcon() */
/* */
/* Purpose : Initializes a brand new icon. */
/* */
/* Returns : Nothing. */
/* */
/****************************************************************************/
VOID PASCAL NewIcon(void)
{
LPSTR lpBits;
LPBITMAPINFO lpbmi;
/*
Set up the icon header
*/
IconHeader.icoReserved = 0;
IconHeader.icoResourceType = 1;
IconHeader.icoResourceCount = 1;
/*
Set up a directory entry for a single icon
*/
IconDir.Width = 32;
IconDir.Height = 32;
IconDir.ColorCount = 16;
IconDir.bReserved1 = 0;
IconDir.bReserved2 = 0;
IconDir.bReserved3 = 0;
IconDir.icoDIBSize = 744;
IconDir.icoDIBOffset = 22;
/*
Set up the icon info structure
*/
if (IconInfo.hBitmapBits)
GlobalFree(IconInfo.hBitmapBits);
if (IconInfo.hBitmapInfo)
GlobalFree(IconInfo.hBitmapInfo);
IconInfo.hIcon = NULL;
IconInfo.hBitmapBits = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 32L*32L);
IconInfo.fFlags = 0;
IconInfo.szFilename[0] = '\0';
/*
The initial pixmap contains all FF's (ie - it's all white)
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
_fmemset(lpBits, 0xFF, 32*32);
GlobalUnlock(IconInfo.hBitmapBits);
IconInfo.hBitmapInfo = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
(DWORD) sizeof(BITMAPINFOHEADER) + 16*sizeof(RGBQUAD));
lpbmi = (LPBITMAPINFO) GlobalLock(IconInfo.hBitmapInfo);
lpbmi->bmiHeader.biSize = (long) sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biWidth = IconDir.Width;
lpbmi->bmiHeader.biHeight = IconDir.Height;
lpbmi->bmiHeader.biPlanes = 1;
lpbmi->bmiHeader.biBitCount = ColorCountToPlanes(IconDir.ColorCount);
lpbmi->bmiHeader.biCompression = BI_RGB;
lpbmi->bmiHeader.biSizeImage = 0L;
lpbmi->bmiHeader.biXPelsPerMeter = 0;
lpbmi->bmiHeader.biYPelsPerMeter = 0;
lpbmi->bmiHeader.biClrUsed = 0;
lpbmi->bmiHeader.biClrImportant = 0;
/*
Initialize the colors
*/
if (IconDir.ColorCount == 2)
{
_fmemcpy((LPSTR) &lpbmi->bmiColors[0], rgb[0], 3);
_fmemcpy((LPSTR) &lpbmi->bmiColors[1], rgb[7], 3);
}
else
{
int i;
for (i = 0; i < 16; i++)
_fmemcpy((LPSTR) &lpbmi->bmiColors[i], rgb[i], 3);
}
GlobalUnlock(IconInfo.hBitmapInfo);
/*
No undo info yet...
*/
EnableMenuItem(GetMenu(hWndMain), IDM_UNDO,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
/****************************************************************************/
/* */
/* UTILITY ROUTINES */
/* */
/* */
/****************************************************************************/
/****************************************************************************/
/* */
/* Function : ColorCountToPlanes() */
/* */
/* Purpose : Given a number of colors, returns the number of color planes */
/* needed to represent those colors (log2(Colors)) */
/* */
/* Returns : The number of planes in the pixmap. */
/* */
/****************************************************************************/
int PASCAL ColorCountToPlanes(int nClr)
{
switch (nClr)
{
case 2 : return 1;
case 8 : return 3;
case 16: return 4;
default: return 1;
}
}
/****************************************************************************/
/* */
/* Function : SetIconPixel() */
/* */
/* Purpose : Sets the nibble in the pixmap which corresponds to location */
/* (x,y) to the passed color. */
/* */
/* Returns : Zippo. */
/* */
/****************************************************************************/
VOID PASCAL SetIconPixel(int x, int y, int iColor)
{
LPSTR lpBits, lpByte;
int nPixelsPerByte = 2;
if (IconInfo.hBitmapBits == NULL)
return;
/*
Dereference the pixmap and point to the proper location
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
lpByte = lpBits + ((31-y) * IconDir.Width / nPixelsPerByte) +
(x / nPixelsPerByte);
/*
Set the left or right nibble, depending if the x value is odd or even.
*/
if (x & 1)
*lpByte = (*lpByte & 0xF0) | (BYTE) iColor;
else
*lpByte = (*lpByte & 0x0F) | ((BYTE) iColor << 4);
GlobalUnlock(IconInfo.hBitmapBits);
}
/****************************************************************************/
/* */
/* Function : GetIconPixel() */
/* */
/* Purpose : Reads the pixel at location [x,y]. */
/* */
/* Returns : The color of the pixel at location [x,y]. */
/* */
/****************************************************************************/
int PASCAL GetIconPixel(int x, int y)
{
LPSTR lpBits, lpByte;
int nPixelsPerByte = 2;
if (IconInfo.hBitmapBits == NULL)
return 0;
/*
Dereference the pixmap and point to the proper location
*/
lpBits = GlobalLock(IconInfo.hBitmapBits);
lpByte = lpBits + ((31-y) * IconDir.Width / nPixelsPerByte) +
(x / nPixelsPerByte);
/*
If it's an odd column, get the left nibble, else the right one.
*/
if (x & 1)
x = (*lpByte & 0xF0) >> 4;
else
x = (*lpByte & 0x0F);
GlobalUnlock(IconInfo.hBitmapBits);
return x;
}
/****************************************************************************/
/* */
/* Function : IconPlotLine() */
/* */
/* Purpose : This is a callback for the LineDDA(). We can set the */
/* pixel at (x,y) to the passed color. */
/* */
/* Returns : Zilch. */
/* */
/****************************************************************************/
VOID FAR PASCAL IconPlotLine(int x, int y, LPSTR lpData)
{
if ((x /= 8) > 31)
x = 31;
if ((y /= 8) > 31)
y = 31;
SetIconPixel(x, y, LOWORD(((LONG) lpData)));
}
/****************************************************************************/
/* */
/* Function : DebugBitmap() */
/* */
/* Purpose : Dumps a hex representation of the pixmap to the debugging */
/* window. */
/* */
/* Returns : Nada. */
/* */
/****************************************************************************/
#ifdef DEBUG
DebugBitmap(HWND hWnd, HANDLE hBits)
{
int x, y;
LPSTR p;
char buf[8];
HDC hDC;
TEXTMETRIC tm;
p = GlobalLock(hBits);
hDC = GetDC(hWnd);
GetTextMetrics(hDC, (LPTEXTMETRIC) &tm);
for (y = 0; y < 32; y++)
{
for (x = 0; x < 16; x++)
{
sprintf(buf, "%02x ", (unsigned char) *p++);
TextOut(hDC, x*3 * tm.tmAveCharWidth, y * (tm.tmHeight),
(LPSTR) buf, 3);
}
}
GlobalUnlock(hBits);
ReleaseDC(hWnd, hDC);
}
#endif
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/