Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




CommitLineData
14362b19 1#include "grpapi.h"\r
2#include "..\\LoadStorm\\storm.h"\r
3#include <malloc.h>\r
4\r
5#ifdef GRPAPI_STATIC\r
6#define DllMain GrpMain\r
7\r
8#include "grp_static.h"\r
9\r
10struct GRPLIBMODULE {\r
11 GRPLIBMODULE();\r
12 ~GRPLIBMODULE();\r
13} GrpLib;\r
14\r
15BOOL APIENTRY DllMain(HINSTANCE hInstDLL, DWORD ul_reason_for_call, LPVOID lpReserved);\r
16\r
17GRPLIBMODULE::GRPLIBMODULE()\r
18{\r
19 GrpMain(0,DLL_PROCESS_ATTACH,0);\r
20}\r
21\r
22GRPLIBMODULE::~GRPLIBMODULE()\r
23{\r
24 GrpMain(0,DLL_PROCESS_DETACH,0);\r
25}\r
26\r
27#endif\r
28\r
29typedef struct {\r
30 BYTE Left;\r
31 BYTE Top;\r
32 BYTE Width;\r
33 BYTE Height;\r
34 DWORD Offset;\r
35} FRAMEHEADER;\r
36\r
37void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha);\r
38\r
39extern HINSTANCE hStorm;\r
40\r
41BOOL APIENTRY DllMain( HINSTANCE hInstDLL, \r
42 DWORD ul_reason_for_call, \r
43 LPVOID lpReserved\r
44 )\r
45{\r
46 switch (ul_reason_for_call)\r
47 {\r
48 case DLL_PROCESS_ATTACH:\r
49 break;\r
50 case DLL_THREAD_ATTACH:\r
51 break;\r
52 case DLL_THREAD_DETACH:\r
53 break;\r
54 case DLL_PROCESS_DETACH:\r
55 break;\r
56 }\r
57\r
58 return TRUE;\r
59}\r
60\r
61BOOL GRPAPI WINAPI LoadGrpApi()\r
62{\r
63 if (hStorm==0) return FALSE;\r
64 else return TRUE;\r
65}\r
66\r
67void GRPAPI WINAPI FreeGrpApi()\r
68{\r
69}\r
70\r
71BOOL GRPAPI WINAPI LoadPalette(LPCSTR lpFileName, DWORD *dwPaletteBuffer)\r
72{\r
73 if (lpFileName==0 || dwPaletteBuffer==0) return FALSE;\r
74 HANDLE hFile;\r
75 if (SFileOpenFileEx!=0 && SFileGetFileSize!=0\r
76 && SFileSetFilePointer!=0 && SFileReadFile!=0\r
77 && SFileCloseFile!=0) {\r
78 if (SFileOpenFileEx(0,lpFileName,1,&hFile)==0) return FALSE;\r
79 DWORD fsz = SFileGetFileSize(hFile,0);\r
80 SFileSetFilePointer(hFile,0,0,FILE_BEGIN);\r
81 if (fsz>=1024) {\r
82 memset(dwPaletteBuffer,0,1024);\r
83 SFileReadFile(hFile,dwPaletteBuffer,1024,0,0);\r
84 }\r
85 else if (fsz==768) {\r
86 char *buffer = (char *)_alloca(768);\r
87 memset(buffer,0,768);\r
88 SFileReadFile(hFile,buffer,768,0,0);\r
89 for (DWORD i=0;i<256;i++) {\r
90 memcpy(&dwPaletteBuffer[i],buffer+i*3,3);\r
91 *(((char *)&dwPaletteBuffer[i])+3) = 0;\r
92 }\r
93 }\r
94 else {\r
95 memset(dwPaletteBuffer,0,1024);\r
96 SFileReadFile(hFile,dwPaletteBuffer,fsz,0,0);\r
97 }\r
98 SFileCloseFile(hFile);\r
99 }\r
100 else {\r
101 hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);\r
102 if (hFile==INVALID_HANDLE_VALUE) return FALSE;\r
103 DWORD fsz = GetFileSize(hFile,0),tsz;\r
104 SetFilePointer(hFile,0,0,FILE_BEGIN);\r
105 if (fsz>=1024) {\r
106 memset(dwPaletteBuffer,0,1024);\r
107 ReadFile(hFile,dwPaletteBuffer,1024,&tsz,0);\r
108 }\r
109 else if (fsz==768) {\r
110 char *buffer = (char *)_alloca(768);\r
111 memset(buffer,0,768);\r
112 ReadFile(hFile,buffer,768,&tsz,0);\r
113 for (DWORD i=0;i<256;i++) {\r
114 memcpy(&dwPaletteBuffer[i],buffer+i*3,3);\r
115 *(((char *)&dwPaletteBuffer[i])+3) = 0;\r
116 }\r
117 }\r
118 else {\r
119 memset(dwPaletteBuffer,0,1024);\r
120 ReadFile(hFile,dwPaletteBuffer,fsz,&tsz,0);\r
121 }\r
122 CloseHandle(hFile);\r
123 }\r
124 return TRUE;\r
125}\r
126\r
127HANDLE GRPAPI WINAPI LoadGrp(LPCSTR lpFileName)\r
128{\r
129 if (lpFileName==0) return (HANDLE)-1;\r
130 HANDLE hFile;\r
131 char *GrpFile;\r
132 if (SFileOpenFileEx!=0 && SFileGetFileSize!=0\r
133 && SFileSetFilePointer!=0 && SFileReadFile!=0\r
134 && SFileCloseFile!=0) {\r
135 if (SFileOpenFileEx(0,lpFileName,1,&hFile)==0) return (HANDLE)-1;\r
136 DWORD fsz = SFileGetFileSize(hFile,0);\r
137 if (fsz<6) {\r
138 SFileCloseFile(hFile);\r
139 return (HANDLE)-1;\r
140 }\r
141 GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE);\r
142 if (GrpFile!=0) {\r
143 SFileSetFilePointer(hFile,0,0,FILE_BEGIN);\r
144 SFileReadFile(hFile,GrpFile,fsz,0,0);\r
145 }\r
146 else GrpFile=(char *)-1;\r
147 SFileCloseFile(hFile);\r
148 }\r
149 else {\r
150 hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);\r
151 if (hFile==INVALID_HANDLE_VALUE) return (HANDLE)-1;\r
152 DWORD fsz = GetFileSize(hFile,0),tsz;\r
153 if (fsz<6) {\r
154 CloseHandle(hFile);\r
155 return (HANDLE)-1;\r
156 }\r
157 GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE);\r
158 if (GrpFile!=0) {\r
159 SetFilePointer(hFile,0,0,FILE_BEGIN);\r
160 ReadFile(hFile,GrpFile,fsz,&tsz,0);\r
161 }\r
162 else GrpFile=(char *)-1;\r
163 CloseHandle(hFile);\r
164 }\r
165 return (HANDLE)GrpFile;\r
166}\r
167\r
168BOOL GRPAPI WINAPI DestroyGrp(HANDLE hGrp)\r
169{\r
170 if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE) return FALSE;\r
171 VirtualFree(hGrp,0,MEM_RELEASE);\r
172 return TRUE;\r
173}\r
174\r
175BOOL GRPAPI WINAPI DrawGrp(HANDLE hGrp, HDC hdcDest, int nXDest, int nYDest, WORD nFrame, DWORD *dwPalette, DWORD dwFlags, DWORD dwAlpha)\r
176{\r
177 if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE || hdcDest==0 || dwPalette==0) return FALSE;\r
178 GRPHEADER *GrpFile = (GRPHEADER *)hGrp;\r
179 nFrame %= GrpFile->nFrames;\r
180 FRAMEHEADER *GrpFrame = &((FRAMEHEADER *)(((char *)GrpFile)+6))[nFrame];\r
181 DWORD Right,Bottom;\r
182 if (dwFlags&HORIZONTAL_FLIP) Right = nXDest+GrpFile->wMaxWidth-1-GrpFrame->Left;\r
183 if (dwFlags&VERTICAL_FLIP) Bottom = nYDest+GrpFile->wMaxHeight-1-GrpFrame->Top;\r
184 nXDest += GrpFrame->Left;\r
185 nYDest += GrpFrame->Top;\r
186 WORD *GrpOffsets = ((WORD *)(((char *)GrpFile)+GrpFrame->Offset));\r
187 for (DWORD y=0;y<GrpFrame->Height;y++) {\r
188 BYTE *RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y]));\r
189 WORD x=0,ofs=0;\r
190 while (x<GrpFrame->Width) {\r
191 if (RowData[ofs]<=64) {\r
192 if ((dwFlags&HORIZONTAL_FLIP)==0 && (dwFlags&VERTICAL_FLIP)==0) {\r
193 for (WORD i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
194 SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
195 x++;\r
196 }\r
197 }\r
198 else if (dwFlags&HORIZONTAL_FLIP && (dwFlags&VERTICAL_FLIP)==0) {\r
199 for (WORD i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
200 SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
201 x++;\r
202 }\r
203 }\r
204 else if ((dwFlags&HORIZONTAL_FLIP)==0 && dwFlags&VERTICAL_FLIP) {\r
205 for (WORD i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
206 SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
207 x++;\r
208 }\r
209 }\r
210 else {\r
211 for (WORD i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
212 SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
213 x++;\r
214 }\r
215 }\r
216 ofs+=RowData[ofs]+1;\r
217 }\r
218 else if (RowData[ofs]<=128) {\r
219 if ((dwFlags&HORIZONTAL_FLIP)==0 && (dwFlags&VERTICAL_FLIP)==0) {\r
220 for (WORD i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
221 SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
222 x++;\r
223 }\r
224 }\r
225 else if (dwFlags&HORIZONTAL_FLIP && (dwFlags&VERTICAL_FLIP)==0) {\r
226 for (WORD i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
227 SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
228 x++;\r
229 }\r
230 }\r
231 else if ((dwFlags&HORIZONTAL_FLIP)==0 && dwFlags&VERTICAL_FLIP) {\r
232 for (WORD i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
233 SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
234 x++;\r
235 }\r
236 }\r
237 else {\r
238 for (WORD i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
239 SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
240 x++;\r
241 }\r
242 }\r
243 ofs+=2;\r
244 }\r
245 else {\r
246 x+=RowData[ofs]-128;\r
247 ofs++;\r
248 }\r
249 }\r
250 }\r
251 return TRUE;\r
252}\r
253\r
254BOOL GRPAPI WINAPI GetGrpInfo(HANDLE hGrp, GRPHEADER *GrpInfo)\r
255{\r
256 if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE || GrpInfo==0) return FALSE;\r
257 memcpy(GrpInfo,hGrp,6);\r
258 return TRUE;\r
259}\r
260\r
261void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha)\r
262{\r
263 if (dwFlags&SHADOW_COLOR) {\r
264 ((BYTE *)&clrColor)[0] = ((BYTE *)&dwFlags)[1];\r
265 ((BYTE *)&clrColor)[1] = ((BYTE *)&dwFlags)[2];\r
266 ((BYTE *)&clrColor)[2] = ((BYTE *)&dwFlags)[3];\r
267 ((BYTE *)&clrColor)[3] = 0;\r
268 }\r
269 if (dwFlags&ALPHA_BLEND) {\r
270 DWORD dwColor = GetPixel(hDC,X,Y);\r
271\r
272 // Old alpha\r
273 /*((BYTE *)&dwColor)[0]*=1-((float)((BYTE *)&dwAlpha)[0]/256);\r
274 ((BYTE *)&dwColor)[1]*=1-((float)((BYTE *)&dwAlpha)[1]/256);\r
275 ((BYTE *)&dwColor)[2]*=1-((float)((BYTE *)&dwAlpha)[2]/256);\r
276 ((BYTE *)&clrColor)[0]*=(float)((BYTE *)&dwAlpha)[0]/256;\r
277 ((BYTE *)&clrColor)[1]*=(float)((BYTE *)&dwAlpha)[1]/256;\r
278 ((BYTE *)&clrColor)[2]*=(float)((BYTE *)&dwAlpha)[2]/256;\r
279 ((BYTE *)&clrColor)[0]+=((BYTE *)&dwColor)[0];\r
280 ((BYTE *)&clrColor)[1]+=((BYTE *)&dwColor)[1];\r
281 ((BYTE *)&clrColor)[2]+=((BYTE *)&dwColor)[2];*/\r
282\r
283 /* blendedcolor =\r
284 ( ( forecolor * ( 1 - alpha ) ) >> 8 )\r
285 + ( ( backcolor * ( 256 - alpha ) ) >> 8 ) */\r
286 ((BYTE *)&clrColor)[0] =\r
287 ( ( ((BYTE *)&clrColor)[0] * ( ((BYTE *)&dwAlpha)[0] + 1 ) ) >> 8 )\r
288 + ( ( ((BYTE *)&dwColor)[0] * ( 256 - ((BYTE *)&dwAlpha)[0] ) ) >> 8 );\r
289 ((BYTE *)&clrColor)[1] =\r
290 ( ( ((BYTE *)&clrColor)[1] * ( ((BYTE *)&dwAlpha)[1] + 1 ) ) >> 8 )\r
291 + ( ( ((BYTE *)&dwColor)[1] * ( 256 - ((BYTE *)&dwAlpha)[1] ) ) >> 8 );\r
292 ((BYTE *)&clrColor)[2] =\r
293 ( ( ((BYTE *)&clrColor)[2] * ( ((BYTE *)&dwAlpha)[2] + 1 ) ) >> 8 )\r
294 + ( ( ((BYTE *)&dwColor)[2] * ( 256 - ((BYTE *)&dwAlpha)[2] ) ) >> 8 );\r
295 }\r
296 SetPixelV(hDC,X,Y,clrColor);\r
297}\r
298\r