X-Git-Url: https://sfsrealm.hopto.org/projects/?a=blobdiff_plain;f=grpapi%2Fgrpapi.cpp;h=b286741e272fa4b8b33f8b5f28733509f3d4b645;hb=8531f378333f02b781a0dc8d28014b89729e100a;hp=f74612066775a9cf114db3814c9f51cd96905d82;hpb=14362b19599627313cd243bdbc404dc2087d4422;p=grpapi.git diff --git a/grpapi/grpapi.cpp b/grpapi/grpapi.cpp index f746120..b286741 100644 --- a/grpapi/grpapi.cpp +++ b/grpapi/grpapi.cpp @@ -1,5 +1,5 @@ #include "grpapi.h" -#include "..\\LoadStorm\\storm.h" +#include "../LoadStorm/storm.h" #include #ifdef GRPAPI_STATIC @@ -34,6 +34,9 @@ typedef struct { DWORD Offset; } FRAMEHEADER; +GETPIXELPROC MyGetPixel = GetPixel; +SETPIXELPROC MySetPixel = (SETPIXELPROC)SetPixelV; + void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha); extern HINSTANCE hStorm; @@ -60,7 +63,7 @@ BOOL APIENTRY DllMain( HINSTANCE hInstDLL, BOOL GRPAPI WINAPI LoadGrpApi() { - if (hStorm==0) return FALSE; + if (!hStorm) return FALSE; else return TRUE; } @@ -68,14 +71,20 @@ void GRPAPI WINAPI FreeGrpApi() { } +BOOL GRPAPI WINAPI SetMpqDll(LPCSTR lpDllFileName) +{ + if (LoadStorm((char *)lpDllFileName)) return TRUE; + else return FALSE; +} + BOOL GRPAPI WINAPI LoadPalette(LPCSTR lpFileName, DWORD *dwPaletteBuffer) { - if (lpFileName==0 || dwPaletteBuffer==0) return FALSE; + if (!lpFileName || !dwPaletteBuffer) return FALSE; HANDLE hFile; - if (SFileOpenFileEx!=0 && SFileGetFileSize!=0 - && SFileSetFilePointer!=0 && SFileReadFile!=0 - && SFileCloseFile!=0) { - if (SFileOpenFileEx(0,lpFileName,1,&hFile)==0) return FALSE; + if (SFileOpenFileEx && SFileGetFileSize + && SFileSetFilePointer && SFileReadFile + && SFileCloseFile) { + if (!SFileOpenFileEx(0,lpFileName,1,&hFile)) return FALSE; DWORD fsz = SFileGetFileSize(hFile,0); SFileSetFilePointer(hFile,0,0,FILE_BEGIN); if (fsz>=1024) { @@ -126,20 +135,20 @@ BOOL GRPAPI WINAPI LoadPalette(LPCSTR lpFileName, DWORD *dwPaletteBuffer) HANDLE GRPAPI WINAPI LoadGrp(LPCSTR lpFileName) { - if (lpFileName==0) return (HANDLE)-1; + if (!lpFileName) return (HANDLE)-1; HANDLE hFile; char *GrpFile; - if (SFileOpenFileEx!=0 && SFileGetFileSize!=0 - && SFileSetFilePointer!=0 && SFileReadFile!=0 - && SFileCloseFile!=0) { - if (SFileOpenFileEx(0,lpFileName,1,&hFile)==0) return (HANDLE)-1; + if (SFileOpenFileEx && SFileGetFileSize + && SFileSetFilePointer && SFileReadFile + && SFileCloseFile) { + if (!SFileOpenFileEx(0,lpFileName,1,&hFile)) return (HANDLE)-1; DWORD fsz = SFileGetFileSize(hFile,0); if (fsz<6) { SFileCloseFile(hFile); return (HANDLE)-1; } GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE); - if (GrpFile!=0) { + if (GrpFile) { SFileSetFilePointer(hFile,0,0,FILE_BEGIN); SFileReadFile(hFile,GrpFile,fsz,0,0); } @@ -155,7 +164,7 @@ HANDLE GRPAPI WINAPI LoadGrp(LPCSTR lpFileName) return (HANDLE)-1; } GrpFile = (char *)VirtualAlloc(0,fsz,MEM_COMMIT,PAGE_READWRITE); - if (GrpFile!=0) { + if (GrpFile) { SetFilePointer(hFile,0,0,FILE_BEGIN); ReadFile(hFile,GrpFile,fsz,&tsz,0); } @@ -167,84 +176,192 @@ HANDLE GRPAPI WINAPI LoadGrp(LPCSTR lpFileName) BOOL GRPAPI WINAPI DestroyGrp(HANDLE hGrp) { - if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE) return FALSE; + if (!hGrp || hGrp==INVALID_HANDLE_VALUE) return FALSE; VirtualFree(hGrp,0,MEM_RELEASE); return TRUE; } BOOL GRPAPI WINAPI DrawGrp(HANDLE hGrp, HDC hdcDest, int nXDest, int nYDest, WORD nFrame, DWORD *dwPalette, DWORD dwFlags, DWORD dwAlpha) { - if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE || hdcDest==0 || dwPalette==0) return FALSE; + if (!hGrp || hGrp==INVALID_HANDLE_VALUE || hdcDest==0 || !dwPalette) return FALSE; GRPHEADER *GrpFile = (GRPHEADER *)hGrp; nFrame %= GrpFile->nFrames; FRAMEHEADER *GrpFrame = &((FRAMEHEADER *)(((char *)GrpFile)+6))[nFrame]; + FRAMEHEADER *GrpFrames = &((FRAMEHEADER *)(((char *)GrpFile)+6))[0]; + int FrameSize = 0xFFFFFF; DWORD Right,Bottom; if (dwFlags&HORIZONTAL_FLIP) Right = nXDest+GrpFile->wMaxWidth-1-GrpFrame->Left; if (dwFlags&VERTICAL_FLIP) Bottom = nYDest+GrpFile->wMaxHeight-1-GrpFrame->Top; nXDest += GrpFrame->Left; nYDest += GrpFrame->Top; WORD *GrpOffsets = ((WORD *)(((char *)GrpFile)+GrpFrame->Offset)); - for (DWORD y=0;yHeight;y++) { - BYTE *RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y])); - WORD x=0,ofs=0; - while (xWidth) { - if (RowData[ofs]<=64) { - if ((dwFlags&HORIZONTAL_FLIP)==0 && (dwFlags&VERTICAL_FLIP)==0) { - for (WORD i=1;i<=RowData[ofs] && xWidth;i++) { - SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); - x++; + BYTE *GrpRaw = (BYTE *)GrpOffsets; + BYTE *RowData; + WORD x,ofs; + DWORD y; + WORD i; + int j; + if (nFrame + 1 < GrpFile->nFrames) { + for (i = 0; i + 1 < GrpFile->nFrames; i++) { + j = GrpFrames[i].Offset - GrpFrame->Offset; + if (j > 0 && j < FrameSize) + FrameSize = j; + } + } + if (FrameSize == 0xFFFFFF) { + for (i = 0; i + 1 < GrpFile->nFrames; i++) { + j = GrpFrames[i].Offset - GrpFrames[0].Offset; + if (j > 0 && j < FrameSize) + FrameSize = j; + } + if (FrameSize == GrpFrames[0].Width * GrpFrames[0].Height) + FrameSize = GrpFrame->Width * GrpFrame->Height; + } + if (!(dwFlags&HORIZONTAL_FLIP) && !(dwFlags&VERTICAL_FLIP)) { + if (FrameSize != GrpFrame->Width * GrpFrame->Height) { + for (y=0;yHeight;y++) { + RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y])); + x=0; ofs=0; + while (xWidth) { + if (!(RowData[ofs] & 0x80)) { + if (!(RowData[ofs] & 0x40)) { + for (i=1;i<=RowData[ofs] && xWidth;i++) { + SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); + x++; + } + ofs+=RowData[ofs]+1; + } + else { + for (i=0;iWidth;i++) { + SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); + x++; + } + ofs+=2; + } } - } - else if (dwFlags&HORIZONTAL_FLIP && (dwFlags&VERTICAL_FLIP)==0) { - for (WORD i=1;i<=RowData[ofs] && xWidth;i++) { - SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); - x++; + else { + x+=RowData[ofs]-128; + ofs++; } } - else if ((dwFlags&HORIZONTAL_FLIP)==0 && dwFlags&VERTICAL_FLIP) { - for (WORD i=1;i<=RowData[ofs] && xWidth;i++) { - SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); - x++; - } + } + } + else { + for (y=0;yHeight;y++) { + for (x=0;xWidth;x++) { + SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[GrpRaw[y * GrpFrame->Width + x]],dwFlags,dwAlpha); } - else { - for (WORD i=1;i<=RowData[ofs] && xWidth;i++) { - SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); - x++; + } + } + } + else if (dwFlags&HORIZONTAL_FLIP && !(dwFlags&VERTICAL_FLIP)) { + if (FrameSize != GrpFrame->Width * GrpFrame->Height) { + for (y=0;yHeight;y++) { + RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y])); + x=0; ofs=0; + while (xWidth) { + if (!(RowData[ofs] & 0x80)) { + if (!(RowData[ofs] & 0x40)) { + for (i=1;i<=RowData[ofs] && xWidth;i++) { + SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); + x++; + } + ofs+=RowData[ofs]+1; + } + else { + for (i=0;iWidth;i++) { + SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); + x++; + } + ofs+=2; + } + } + else { + x+=RowData[ofs]-128; + ofs++; } } - ofs+=RowData[ofs]+1; } - else if (RowData[ofs]<=128) { - if ((dwFlags&HORIZONTAL_FLIP)==0 && (dwFlags&VERTICAL_FLIP)==0) { - for (WORD i=0;iWidth;i++) { - SetPix(hdcDest,nXDest+x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); - x++; - } + } + else { + for (y=0;yHeight;y++) { + for (x=0;xWidth;x++) { + SetPix(hdcDest,Right-x,nYDest+y,dwPalette[GrpRaw[y * GrpFrame->Width + x]],dwFlags,dwAlpha); } - else if (dwFlags&HORIZONTAL_FLIP && (dwFlags&VERTICAL_FLIP)==0) { - for (WORD i=0;iWidth;i++) { - SetPix(hdcDest,Right-x,nYDest+y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); - x++; + } + } + } + else if (!(dwFlags&HORIZONTAL_FLIP) && dwFlags&VERTICAL_FLIP) { + if (FrameSize != GrpFrame->Width * GrpFrame->Height) { + for (y=0;yHeight;y++) { + RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y])); + x=0; ofs=0; + while (xWidth) { + if (!(RowData[ofs] & 0x80)) { + if (!(RowData[ofs] & 0x40)) { + for (i=1;i<=RowData[ofs] && xWidth;i++) { + SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); + x++; + } + ofs+=RowData[ofs]+1; + } + else { + for (i=0;iWidth;i++) { + SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); + x++; + } + ofs+=2; + } } - } - else if ((dwFlags&HORIZONTAL_FLIP)==0 && dwFlags&VERTICAL_FLIP) { - for (WORD i=0;iWidth;i++) { - SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); - x++; + else { + x+=RowData[ofs]-128; + ofs++; } } - else { - for (WORD i=0;iWidth;i++) { - SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); - x++; + } + } + else { + for (y=0;yHeight;y++) { + for (x=0;xWidth;x++) { + SetPix(hdcDest,nXDest+x,Bottom-y,dwPalette[GrpRaw[y * GrpFrame->Width + x]],dwFlags,dwAlpha); + } + } + } + } + else { + if (FrameSize != GrpFrame->Width * GrpFrame->Height) { + for (y=0;yHeight;y++) { + RowData = ((BYTE *)(((char *)GrpOffsets)+GrpOffsets[y])); + x=0; ofs=0; + while (xWidth) { + if (!(RowData[ofs] & 0x80)) { + if (!(RowData[ofs] & 0x40)) { + for (i=1;i<=RowData[ofs] && xWidth;i++) { + SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+i]],dwFlags,dwAlpha); + x++; + } + ofs+=RowData[ofs]+1; + } + else { + for (i=0;iWidth;i++) { + SetPix(hdcDest,Right-x,Bottom-y,dwPalette[RowData[ofs+1]],dwFlags,dwAlpha); + x++; + } + ofs+=2; + } + } + else { + x+=RowData[ofs]-128; + ofs++; } } - ofs+=2; } - else { - x+=RowData[ofs]-128; - ofs++; + } + else { + for (y=0;yHeight;y++) { + for (x=0;xWidth;x++) { + SetPix(hdcDest,Right-x,Bottom-y,dwPalette[GrpRaw[y * GrpFrame->Width + x]],dwFlags,dwAlpha); + } } } } @@ -253,21 +370,28 @@ BOOL GRPAPI WINAPI DrawGrp(HANDLE hGrp, HDC hdcDest, int nXDest, int nYDest, WOR BOOL GRPAPI WINAPI GetGrpInfo(HANDLE hGrp, GRPHEADER *GrpInfo) { - if (hGrp==0 || hGrp==INVALID_HANDLE_VALUE || GrpInfo==0) return FALSE; + if (!hGrp || hGrp==INVALID_HANDLE_VALUE || !GrpInfo) return FALSE; memcpy(GrpInfo,hGrp,6); return TRUE; } +void GRPAPI WINAPI SetFunctionGetPixel(GETPIXELPROC lpGetPixelProc) +{ + MyGetPixel = lpGetPixelProc; +} + +void GRPAPI WINAPI SetFunctionSetPixel(SETPIXELPROC lpSetPixelProc) +{ + MySetPixel = lpSetPixelProc; +} + void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DWORD dwAlpha) { if (dwFlags&SHADOW_COLOR) { - ((BYTE *)&clrColor)[0] = ((BYTE *)&dwFlags)[1]; - ((BYTE *)&clrColor)[1] = ((BYTE *)&dwFlags)[2]; - ((BYTE *)&clrColor)[2] = ((BYTE *)&dwFlags)[3]; - ((BYTE *)&clrColor)[3] = 0; + clrColor = (dwFlags >> 8) & 0x00FFFFFF; } if (dwFlags&ALPHA_BLEND) { - DWORD dwColor = GetPixel(hDC,X,Y); + DWORD dwColor = MyGetPixel(hDC,X,Y); // Old alpha /*((BYTE *)&dwColor)[0]*=1-((float)((BYTE *)&dwAlpha)[0]/256); @@ -293,6 +417,5 @@ void __inline SetPix(HDC hDC, int X, int Y, COLORREF clrColor, DWORD dwFlags, DW ( ( ((BYTE *)&clrColor)[2] * ( ((BYTE *)&dwAlpha)[2] + 1 ) ) >> 8 ) + ( ( ((BYTE *)&dwColor)[2] * ( 256 - ((BYTE *)&dwAlpha)[2] ) ) >> 8 ); } - SetPixelV(hDC,X,Y,clrColor); + MySetPixel(hDC,X,Y,clrColor); } -