ANIDEFS.H

/* 
* Common includes
*
*/
#include "anicur.h"
#include "anidlgs.h"
#include "animsg.h"

/*
* Constants
*
*/
#define CMS_WAIT_FOR_PROCESS (60 * 1000) // one minute

#define AIM_PROCESSTERM (WM_USER + 0x0FFF)
#define AIM_SETCHILDAPP (AIM_PROCESSTERM + 1)

#define CCH_TITLE 80
#define CCH_CREATOR 80
#define CCH_JIF 10 /* Numbers are small even in German! */

#define CTRL_C (TEXT(('C' - 'A') + 1))
#define CTRL_V (TEXT(('V' - 'A') + 1))
#define CTRL_X (TEXT(('X' - 'A') + 1))

#define TITL_ERROR (DWORD)(-1)
#define szPREVIEW TEXT("AniEditPreviewClass")
#define szBNTBAR TEXT("AniEditBtnBarClass")


#define PM_NEWCURSOR (WM_USER + 0x4a50)
#define PM_PAUSEANIMATION (PM_NEWCURSOR + 1)
#define PM_UNPAUSEANIMATION (PM_NEWCURSOR + 2)
#define PM_SETSTEP (PM_NEWCURSOR + 3)

#define ID_PREVIEWTIMER (0x0050)

#define MULTISEL 1 /* listbox is mutliple selction */

/*
* Structure defintions
*
*/
typedef struct _FRAME *PFRAME;

typedef struct _FRAME {
int cRef; /* refrence count */
int iFrame;
PFRAME pfrmNext;
DWORD dwCheckSum; /* checksum of the icon data. Used to
* compare new imported icons against existing
* ones to see if we can sequence them.
*/
HICON hcur; /* icon representation of raw data below */
WORD xHotSpot;
WORD yHotSpot;
RTAG rtag; /* icon chunk as it appears in file */
BYTE abIcon[1];
} FRAME;


typedef struct _STEP *PSTEP;

typedef struct _STEP {
JIF jif;
PFRAME pfrmFrame;
} STEP;

typedef struct _THDDATA {
HWND hwndCaller;
HWND hwndMonitor;
HANDLE hprocMonitor;
} THDDATA, *PTHDDATA;

typedef struct _ANICUR {
ANIHEADER anih;
BOOL fDirty;
CHAR azTitle[CCH_TITLE];
CHAR azCreator[CCH_CREATOR];
TCHAR szFile[MAX_PATH];
} ANICUR;


typedef struct _CLPBRDDAT *PCLPBRDDAT;

typedef struct _CLPBRDDAT {
PCLPBRDDAT pcbdNext;
STEP stp;
} CLPBRDDAT;

//
// Structure that contains data used within a preview window. This
// data is unique for each preview window, and is used to optimize
// the painting.
//
typedef struct
{
HDC hdcMem;
HBITMAP hbmMem;
HBITMAP hbmOld;
HICON hcur;
DWORD iFrame;
WORD xHot;
WORD yHot;
} PREVIEWDATA, *PPREVIEWDATA;

typedef struct {
int id;
int idSys;
} RADIOCOLOR;

/*
* Header of the resource file in the new format
*/
#pragma pack(2)
typedef struct tagNEWHEADER {
WORD reserved;
WORD rt;
WORD cResources;
} NEWHEADER, *LPNEWHEADER;

typedef struct tagICONDIR {
BYTE Width; /* 16, 32, 64 */
BYTE Height; /* 16, 32, 64 */
BYTE ColorCount; /* 2, 8, 16 */
BYTE reserved;
} ICONDIR;

typedef struct tagCURSORDIR {
WORD Width;
WORD Height;
} CURSORDIR;

typedef struct tagRESDIR {
union {
ICONDIR Icon;
CURSORDIR Cursor;
} ResInfo;

WORD Planes;
WORD BitCount;
DWORD BytesInRes;
WORD idIcon;
} RESDIR;
typedef RESDIR *LPRESDIR;

typedef struct _ICONFILERESDIR { // ird
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD xHotspot;
WORD yHotspot;
DWORD dwDIBSize;
DWORD dwDIBOffset;
} ICONFILERESDIR;

typedef struct tagCURSORRESOURCE {
WORD xHotspot;
WORD yHotspot;
BITMAPINFOHEADER bih;
} CURSORRESOURCE, *PCURSORRESOURCE;
#pragma pack()


/*
* Globals
*
*/
extern HANDLE hInst;
extern HWND ghwndMain;
extern HWND ghwndLB;
extern int gcyCursor, gcxCursor;
extern HBRUSH ghbrHighlight, ghbrWindow, ghbrPrevBackgnd;
extern COLORREF gcrHighlightText;
extern ANICUR ganiAcon;
extern TCHAR gszTempFile[];
extern BOOL gfEditFrame;
extern TCHAR gszWindowTitle[];
extern TCHAR gszDots[];
extern PFRAME gpfrmFrames;
extern PCLPBRDDAT gpbdClipBoard;
extern TCHAR gszCursorEditor[MAX_PATH];
extern int giradColor;
RADIOCOLOR garadColor[];

/*
* String table pointers
*/
extern LPTSTR gpszAniFilter;
extern LPTSTR gpszImagEdit;
extern LPTSTR gpszCUR;
extern LPTSTR gpszANI;
extern LPTSTR gpszUnknownError;
extern LPTSTR gpszCurFilter;
extern LPTSTR gpszUntitled;
extern LPTSTR gpszImport;

/*
* Macros
*
*/
#if 0
# include <stdio.h>
# define DPRINT(p) if(1){ printf p; fflush(stdout); } else
#else
# define DPRINT(p)
#endif


#define WRITEME(hwnd) \
MessageBox(hwnd, "This function is not yet implemented", \
NULL, MB_OK | MB_ICONSTOP)

#define FALLTHRU(label)

#define COUNTOF(sz) (sizeof(sz) / sizeof((sz)[0]))

#define FreeMem(pv) LocalFree((HLOCAL)pv)

#define IsValidPS(ps) (((ps) != (PSTEP)LB_ERR) && ((ps) != NULL))


#define PADUP(cb) (((cb) + 1) & ~1)
#define RET_CLOSE_IF_ERR( func, hf ) \
if( !func ) {CloseHandle(hf); return FALSE;} else

#define GetStep(hwnd, iSel) (PSTEP)SendDlgItemMessage(hwnd, \
DLG_MAIN_FRAMELIST, LB_GETITEMDATA, iSel, 0)

#define GetStepCount(hwnd) SendDlgItemMessage(hwnd, \
DLG_MAIN_FRAMELIST, LB_GETCOUNT, 0, 0)

#define GetSelStepCount(hwnd) SendDlgItemMessage(hwnd, \
DLG_MAIN_FRAMELIST, LB_GETSELCOUNT, 0, 0)

#define ResumePreview(hwnd, id) \
SendDlgItemMessage(hwnd, id, PM_UNPAUSEANIMATION, 0, 0)

#define PausePreview(hwnd, id) \
SendDlgItemMessage(hwnd, id, PM_PAUSEANIMATION, 0, 0)

#define SetPreviewStep(hwnd, id, iStep) \
SendDlgItemMessage(hwnd, id, PM_SETSTEP, iStep, 0)

#define PreviewCursor(hwnd, id) \
SendDlgItemMessage(hwnd, id, PM_NEWCURSOR, 0, 0)

#define FmtFree( psz ) if((psz) != gszDots) LocalFree(psz); else

#define UpdateStepSel( hWnd ) \
SendMessage(hWnd, WM_COMMAND, MAKEWPARAM( DLG_MAIN_FRAMELIST, \
LBN_SELCHANGE), (LPARAM)(GetDlgItem(hWnd, \
DLG_MAIN_FRAMELIST)))

#define SetStepSel(hWnd, iMin, iMax) ( \
SendDlgItemMessage(hWnd, DLG_MAIN_FRAMELIST, \
LB_SELITEMRANGE, TRUE, MAKELPARAM((iMin), (iMax))), \
UpdateStepSel(hWnd) \
)


/*
* Function Prototypes
*
*/

/*
* In aniedit.c
*/
BOOL InitApplication(HANDLE);
BOOL InitInstance(HANDLE, int);
INT APIENTRY GetHeightFromPoints( int pts);
BOOL APIENTRY MainWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam);
void DrawCursorListItem( DRAWITEMSTRUCT *pdis );
int FmtMessageBox( HWND hwnd, DWORD dwTitleID, LPTSTR pszTitleStr,
UINT fuStyle, BOOL fSound, DWORD dwTextID, ... );
LPTSTR FmtSprintf( DWORD id, ... );
PVOID AllocMem( DWORD cb );
LRESULT CALLBACK PreviewWndProc( HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam );
VOID NextFrame( HWND hwnd, BOOL fRun );
VOID SetWindowFileTitle(HWND hWnd, LPTSTR szFileTitle);
void AniAddFontModule(HINSTANCE hInst);
VOID ReadRegistry( VOID );
VOID WriteRegistry( VOID );
LRESULT CALLBACK BtnBarWndProc( HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam);
#ifdef DBCS
BOOL LoadResourceStr( VOID );
#endif


/*
* In anicmd.c
*/
void LoadAniFile(HWND hWnd, HANDLE hfCursor, LPTSTR szFileTitle, LPTSTR szFile);
BOOL DoCommand( HWND hWnd, UINT wParam, LONG lParam );
VOID ExitCommand(HWND hWnd);
BOOL CheckDirty(HWND hWnd);
void NewAniCursor( HWND hwnd );
BOOL ExecProgram( HWND hwndCaller, LPTSTR pszCmdLine );
BOOL GetCurrentSel( HWND hwnd, int id, int *paiSel, int ciSel, int *pcSel );
VOID SetCurrentSel( HWND hwnd, int id, BOOL fExtend, int iSel);
VOID EditFrame(HWND hWnd, BOOL fEditFrame);
PSTEP NewStep( void );
VOID DestroyStep( PSTEP ps );
VOID CopyStep( PSTEP psDst, PSTEP psSrc );
VOID LinkStepFrame(PSTEP ps, PFRAME pf );
VOID DestroyFrame( PFRAME pf );
PCLPBRDDAT NewClpBrdDat( void );
VOID DestroyClpBrdDat(PCLPBRDDAT pcbd);
int __cdecl RevCompInts(const void *elm1, const void *elm2);
BOOL APIENTRY About(HWND, UINT, UINT, LONG);
BOOL APIENTRY OptionsProc( HWND hDlg, UINT message, UINT wParam, LONG lParam);
void ClearStepSel( HWND hWnd );



/*
* In anifile.c
*/
BOOL CreateFrameFromCursorFile(HWND hwnd, LPTSTR pszFile, BOOL fEdit);
HANDLE PromptAndOpenFile( HWND hwnd, DWORD cchFileTitle, LPTSTR pszFileTitle,
DWORD cchFileName, LPTSTR pszFileName, LPTSTR pszFilter);
BOOL PromptForFile( HWND hwnd, DWORD cchFileTitle, LPTSTR pszFileTitle,
DWORD cchFileName, LPTSTR pszFile, LPTSTR pszFilter, LPTSTR pszDlgTitle,
BOOL fSave );
BOOL ReadAniFile( HWND hwnd, HANDLE hf );
PFRAME ReadIconFromFile(HWND hwnd, HANDLE hf, DWORD ckSize);
BOOL ReadTag( HANDLE hf, PRTAG ptag);
BOOL ReadChunk( HANDLE hf, PRTAG ptag, PVOID pv);
BOOL ReadChunkN( HANDLE hf, PRTAG ptag, PVOID pv, DWORD cbMax);
BOOL SkipChunk( HANDLE hf, PRTAG ptag);
DWORD CalcCheckSum( PBYTE pb, DWORD cb );
HICON ConvertDataToIcon( PFRAME pf, WORD *pxHotSave, WORD *pyHotSave );
BOOL GetTempCursorFileName( LPTSTR pszName );
BOOL SaveAniFile( HWND hwnd, HANDLE hf );
BOOL WriteTag(HANDLE hf, PRTAG prtag);
BOOL WriteType(HANDLE hf, FOURCC ckID );
BOOL WriteTagData(HANDLE hf, PRTAG prtag, VOID *pvData );
VOID SaveFile(HWND hwnd, BOOL fPrompt);