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




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 void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha);\r
38 \r
39 extern HINSTANCE hStorm;\r
40 \r
41 BOOL 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
61 BOOL GRPAPI WINAPI LoadGrpApi()\r
62 {\r
63         if (hStorm==0) return FALSE;\r
64         else return TRUE;\r
65 }\r
66 \r
67 void GRPAPI WINAPI FreeGrpApi()\r
68 {\r
69 }\r
70 \r
71 BOOL 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
127 HANDLE 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
168 BOOL 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
175 BOOL 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
254 BOOL 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
261 void __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