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 Small banner for links to this site: |
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
10 struct GRPLIBMODULE {\r
11 GRPLIBMODULE();\r
12 ~GRPLIBMODULE();\r
13 } GrpLib;\r
14 \r
15 BOOL APIENTRY DllMain(HINSTANCE hInstDLL, DWORD ul_reason_for_call, LPVOID lpReserved);\r
16 \r
17 GRPLIBMODULE::GRPLIBMODULE()\r
18 {\r
19 GrpMain(0,DLL_PROCESS_ATTACH,0);\r
20 }\r
21 \r
22 GRPLIBMODULE::~GRPLIBMODULE()\r
23 {\r
24 GrpMain(0,DLL_PROCESS_DETACH,0);\r
25 }\r
26 \r
27 #endif\r
28 \r
29 typedef 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
37 GETPIXELPROC MyGetPixel = GetPixel;\r
38 SETPIXELPROC MySetPixel = (SETPIXELPROC)SetPixelV;\r
39 \r
40 void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha);\r
41 \r
42 extern HINSTANCE hStorm;\r
43 \r
44 BOOL APIENTRY DllMain( HINSTANCE hInstDLL, \r
45 DWORD ul_reason_for_call, \r
46 LPVOID lpReserved\r
47 )\r
48 {\r
49 switch (ul_reason_for_call)\r
50 {\r
51 case DLL_PROCESS_ATTACH:\r
52 break;\r
53 case DLL_THREAD_ATTACH:\r
54 break;\r
55 case DLL_THREAD_DETACH:\r
56 break;\r
57 case DLL_PROCESS_DETACH:\r
58 break;\r
59 }\r
60 \r
61 return TRUE;\r
62 }\r
63 \r
64 BOOL GRPAPI WINAPI LoadGrpApi()\r
65 {\r
66 if (!hStorm) return FALSE;\r
67 else return TRUE;\r
68 }\r
69 \r
70 void GRPAPI WINAPI FreeGrpApi()\r
71 {\r
72 }\r
73 \r
74 BOOL GRPAPI WINAPI SetMpqDll(LPCSTR lpDllFileName)\r
75 {\r
76 if (LoadStorm((char *)lpDllFileName)) return TRUE;\r
77 else return FALSE;\r
78 }\r
79 \r
80 BOOL GRPAPI WINAPI LoadPalette(LPCSTR lpFileName, DWORD *dwPaletteBuffer)\r
81 {\r
82 if (!lpFileName || !dwPaletteBuffer) return FALSE;\r
83 HANDLE hFile;\r
84 if (SFileOpenFileEx && SFileGetFileSize\r
85 && SFileSetFilePointer && SFileReadFile\r
86 && SFileCloseFile) {\r
87 if (!SFileOpenFileEx(0,lpFileName,1,&hFile)) return FALSE;\r
88 DWORD fsz = SFileGetFileSize(hFile,0);\r
89 SFileSetFilePointer(hFile,0,0,FILE_BEGIN);\r
90 if (fsz>=1024) {\r
91 memset(dwPaletteBuffer,0,1024);\r
92 SFileReadFile(hFile,dwPaletteBuffer,1024,0,0);\r
93 }\r
94 else if (fsz==768) {\r
95 char *buffer = (char *)_alloca(768);\r
96 memset(buffer,0,768);\r
97 SFileReadFile(hFile,buffer,768,0,0);\r
98 for (DWORD i=0;i<256;i++) {\r
99 memcpy(&dwPaletteBuffer[i],buffer+i*3,3);\r
100 *(((char *)&dwPaletteBuffer[i])+3) = 0;\r
101 }\r
102 }\r
103 else {\r
104 memset(dwPaletteBuffer,0,1024);\r
105 SFileReadFile(hFile,dwPaletteBuffer,fsz,0,0);\r
106 }\r
107 SFileCloseFile(hFile);\r
108 }\r
109 else {\r
110 hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);\r
111 if (hFile==INVALID_HANDLE_VALUE) return FALSE;\r
112 DWORD fsz = GetFileSize(hFile,0),tsz;\r
113 SetFilePointer(hFile,0,0,FILE_BEGIN);\r
114 if (fsz>=1024) {\r
115 memset(dwPaletteBuffer,0,1024);\r
116 ReadFile(hFile,dwPaletteBuffer,1024,&tsz,0);\r
117 }\r
118 else if (fsz==768) {\r
119 char *buffer = (char *)_alloca(768);\r
120 memset(buffer,0,768);\r
121 ReadFile(hFile,buffer,768,&tsz,0);\r
122 for (DWORD i=0;i<256;i++) {\r
123 memcpy(&dwPaletteBuffer[i],buffer+i*3,3);\r
124 *(((char *)&dwPaletteBuffer[i])+3) = 0;\r
125 }\r
126 }\r
127 else {\r
128 memset(dwPaletteBuffer,0,1024);\r
129 ReadFile(hFile,dwPaletteBuffer,fsz,&tsz,0);\r
130 }\r
131 CloseHandle(hFile);\r
132 }\r
133 return TRUE;\r
134 }\r
135 \r
136 HANDLE GRPAPI WINAPI LoadGrp(LPCSTR lpFileName)\r
137 {\r
138 if (!lpFileName) return (HANDLE)-1;\r
139 HANDLE hFile;\r
140 char *GrpFile;\r
141 if (SFileOpenFileEx && SFileGetFileSize\r
142 && SFileSetFilePointer && SFileReadFile\r
143 && SFileCloseFile) {\r
144 if (!SFileOpenFileEx(0,lpFileName,1,&hFile)) return (HANDLE)-1;\r
145 DWORD fsz = SFileGetFileSize(hFile,0);\r
146 if (fsz<6) {\r
147 SFileCloseFile(hFile);\r
148 return (HANDLE)-1;\r
149 }\r
150 GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE);\r
151 if (GrpFile) {\r
152 SFileSetFilePointer(hFile,0,0,FILE_BEGIN);\r
153 SFileReadFile(hFile,GrpFile,fsz,0,0);\r
154 }\r
155 else GrpFile=(char *)-1;\r
156 SFileCloseFile(hFile);\r
157 }\r
158 else {\r
159 hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);\r
160 if (hFile==INVALID_HANDLE_VALUE) return (HANDLE)-1;\r
161 DWORD fsz = GetFileSize(hFile,0),tsz;\r
162 if (fsz<6) {\r
163 CloseHandle(hFile);\r
164 return (HANDLE)-1;\r
165 }\r
166 GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE);\r
167 if (GrpFile) {\r
168 SetFilePointer(hFile,0,0,FILE_BEGIN);\r
169 ReadFile(hFile,GrpFile,fsz,&tsz,0);\r
170 }\r
171 else GrpFile=(char *)-1;\r
172 CloseHandle(hFile);\r
173 }\r
174 return (HANDLE)GrpFile;\r
175 }\r
176 \r
177 BOOL GRPAPI WINAPI DestroyGrp(HANDLE hGrp)\r
178 {\r
179 if (!hGrp || hGrp==INVALID_HANDLE_VALUE) return FALSE;\r
180 VirtualFree(hGrp,0,MEM_RELEASE);\r
181 return TRUE;\r
182 }\r
183 \r
184 BOOL GRPAPI WINAPI DrawGrp(HANDLE hGrp, HDC hdcDest, int nXDest, int nYDest, WORD nFrame, DWORD *dwPalette, DWORD dwFlags, DWORD dwAlpha)\r
185 {\r
186 if (!hGrp || hGrp==INVALID_HANDLE_VALUE || hdcDest==0 || !dwPalette) return FALSE;\r
187 GRPHEADER *GrpFile = (GRPHEADER *)hGrp;\r
188 nFrame %= GrpFile->nFrames;\r
189 FRAMEHEADER *GrpFrame = &((FRAMEHEADER *)(((char *)GrpFile)+6))[nFrame];\r
190 DWORD Right,Bottom;\r
191 if (dwFlags&HORIZONTAL_FLIP) Right = nXDest+GrpFile->wMaxWidth-1-GrpFrame->Left;\r
192 if (dwFlags&VERTICAL_FLIP) Bottom = nYDest+GrpFile->wMaxHeight-1-GrpFrame->Top;\r
193 nXDest += GrpFrame->Left;\r
194 nYDest += GrpFrame->Top;\r
195 WORD *GrpOffsets = ((WORD *)(((char *)GrpFile)+GrpFrame->Offset));\r
196 BYTE *RowData;\r
197 WORD x,ofs;\r
198 DWORD y;\r
199 WORD i;\r
200 if (!(dwFlags&HORIZONTAL_FLIP) && !(dwFlags&VERTICAL_FLIP)) {\r
201 for (y=0;y<GrpFrame->Height;y++) {\r
202 RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y]));\r
203 x=0; ofs=0;\r
204 while (x<GrpFrame->Width) {\r
205 if (!(RowData[ofs] & 0x80)) {\r
206 if (!(RowData[ofs] & 0x40)) {\r
207 for (i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
208 SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
209 x++;\r
210 }\r
211 ofs+=RowData[ofs]+1;\r
212 }\r
213 else {\r
214 for (i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
215 SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
216 x++;\r
217 }\r
218 ofs+=2;\r
219 }\r
220 }\r
221 else {\r
222 x+=RowData[ofs]-128;\r
223 ofs++;\r
224 }\r
225 }\r
226 }\r
227 }\r
228 else if (dwFlags&HORIZONTAL_FLIP && !(dwFlags&VERTICAL_FLIP)) {\r
229 for (y=0;y<GrpFrame->Height;y++) {\r
230 RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y]));\r
231 x=0; ofs=0;\r
232 while (x<GrpFrame->Width) {\r
233 if (!(RowData[ofs] & 0x80)) {\r
234 if (!(RowData[ofs] & 0x40)) {\r
235 for (i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
236 SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
237 x++;\r
238 }\r
239 ofs+=RowData[ofs]+1;\r
240 }\r
241 else {\r
242 for (i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
243 SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
244 x++;\r
245 }\r
246 ofs+=2;\r
247 }\r
248 }\r
249 else {\r
250 x+=RowData[ofs]-128;\r
251 ofs++;\r
252 }\r
253 }\r
254 }\r
255 }\r
256 else if (!(dwFlags&HORIZONTAL_FLIP) && dwFlags&VERTICAL_FLIP) {\r
257 for (y=0;y<GrpFrame->Height;y++) {\r
258 RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y]));\r
259 x=0; ofs=0;\r
260 while (x<GrpFrame->Width) {\r
261 if (!(RowData[ofs] & 0x80)) {\r
262 if (!(RowData[ofs] & 0x40)) {\r
263 for (i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
264 SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
265 x++;\r
266 }\r
267 ofs+=RowData[ofs]+1;\r
268 }\r
269 else {\r
270 for (i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
271 SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
272 x++;\r
273 }\r
274 ofs+=2;\r
275 }\r
276 }\r
277 else {\r
278 x+=RowData[ofs]-128;\r
279 ofs++;\r
280 }\r
281 }\r
282 }\r
283 }\r
284 else {\r
285 for (y=0;y<GrpFrame->Height;y++) {\r
286 RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y]));\r
287 x=0; ofs=0;\r
288 while (x<GrpFrame->Width) {\r
289 if (!(RowData[ofs] & 0x80)) {\r
290 if (!(RowData[ofs] & 0x40)) {\r
291 for (i=1;i<=RowData[ofs] && x<GrpFrame->Width;i++) {\r
292 SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha);\r
293 x++;\r
294 }\r
295 ofs+=RowData[ofs]+1;\r
296 }\r
297 else {\r
298 for (i=0;i<RowData[ofs]-64 && x<GrpFrame->Width;i++) {\r
299 SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha);\r
300 x++;\r
301 }\r
302 ofs+=2;\r
303 }\r
304 }\r
305 else {\r
306 x+=RowData[ofs]-128;\r
307 ofs++;\r
308 }\r
309 }\r
310 }\r
311 }\r
312 return TRUE;\r
313 }\r
314 \r
315 BOOL GRPAPI WINAPI GetGrpInfo(HANDLE hGrp, GRPHEADER *GrpInfo)\r
316 {\r
317 if (!hGrp || hGrp==INVALID_HANDLE_VALUE || !GrpInfo) return FALSE;\r
318 memcpy(GrpInfo,hGrp,6);\r
319 return TRUE;\r
320 }\r
321 \r
322 void GRPAPI WINAPI SetFunctionGetPixel(GETPIXELPROC lpGetPixelProc)\r
323 {\r
324 MyGetPixel = lpGetPixelProc;\r
325 }\r
326 \r
327 void GRPAPI WINAPI SetFunctionSetPixel(SETPIXELPROC lpSetPixelProc)\r
328 {\r
329 MySetPixel = lpSetPixelProc;\r
330 }\r
331 \r
332 void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha)\r
333 {\r
334 if (dwFlags&SHADOW_COLOR) {\r
335 clrColor = (dwFlags >> 8) & 0x00FFFFFF;\r
336 }\r
337 if (dwFlags&ALPHA_BLEND) {\r
338 DWORD dwColor = MyGetPixel(hDC,X,Y);\r
339 \r
340 // Old alpha\r
341 /*((BYTE *)&dwColor)[0]*=1-((float)((BYTE *)&dwAlpha)[0]/256);\r
342 ((BYTE *)&dwColor)[1]*=1-((float)((BYTE *)&dwAlpha)[1]/256);\r
343 ((BYTE *)&dwColor)[2]*=1-((float)((BYTE *)&dwAlpha)[2]/256);\r
344 ((BYTE *)&clrColor)[0]*=(float)((BYTE *)&dwAlpha)[0]/256;\r
345 ((BYTE *)&clrColor)[1]*=(float)((BYTE *)&dwAlpha)[1]/256;\r
346 ((BYTE *)&clrColor)[2]*=(float)((BYTE *)&dwAlpha)[2]/256;\r
347 ((BYTE *)&clrColor)[0]+=((BYTE *)&dwColor)[0];\r
348 ((BYTE *)&clrColor)[1]+=((BYTE *)&dwColor)[1];\r
349 ((BYTE *)&clrColor)[2]+=((BYTE *)&dwColor)[2];*/\r
350 \r
351 /* blendedcolor =\r
352 ( ( forecolor * ( 1 - alpha ) ) >> 8 )\r
353 + ( ( backcolor * ( 256 - alpha ) ) >> 8 ) */\r
354 ((BYTE *)&clrColor)[0] =\r
355 ( ( ((BYTE *)&clrColor)[0] * ( ((BYTE *)&dwAlpha)[0] + 1 ) ) >> 8 )\r
356 + ( ( ((BYTE *)&dwColor)[0] * ( 256 - ((BYTE *)&dwAlpha)[0] ) ) >> 8 );\r
357 ((BYTE *)&clrColor)[1] =\r
358 ( ( ((BYTE *)&clrColor)[1] * ( ((BYTE *)&dwAlpha)[1] + 1 ) ) >> 8 )\r
359 + ( ( ((BYTE *)&dwColor)[1] * ( 256 - ((BYTE *)&dwAlpha)[1] ) ) >> 8 );\r
360 ((BYTE *)&clrColor)[2] =\r
361 ( ( ((BYTE *)&clrColor)[2] * ( ((BYTE *)&dwAlpha)[2] + 1 ) ) >> 8 )\r
362 + ( ( ((BYTE *)&dwColor)[2] * ( 256 - ((BYTE *)&dwAlpha)[2] ) ) >> 8 );\r
363 }\r
364 MySetPixel(hDC,X,Y,clrColor);\r
365 }\r
|