X-Git-Url: https://sfsrealm.hopto.org/projects/gitweb.cgi?a=blobdiff_plain;f=grpapi%2Fgrpapi.cpp;h=d2066146df5dfa569cdef9d405c6015d83a213a0;hb=a215f7bed5ba1784c1efd0f24db33e64f7d52360;hp=0ce1b296b0fa2a59114226de0343a47c998f17b6;hpb=9492b9e609e5b7aaabd76022b65a7363a189bc72;p=grpapi.git diff --git a/grpapi/grpapi.cpp b/grpapi/grpapi.cpp index 0ce1b29..d206614 100644 --- a/grpapi/grpapi.cpp +++ b/grpapi/grpapi.cpp @@ -79,6 +79,23 @@ void GRPAPI WINAPI FreeGrpApi() { } +/* +HANDLE hProcessHeap = NULL; + +void * SFAlloc(size_t nSize) +{ + if (!hProcessHeap) hProcessHeap = GetProcessHeap(); + if (hProcessHeap) return HeapAlloc(hProcessHeap, 0, nSize); + else return NULL; +} + +void SFFree(void *lpMem) +{ + if (!hProcessHeap) hProcessHeap = GetProcessHeap(); + if (hProcessHeap) HeapFree(hProcessHeap, 0, lpMem); +} +*/ + BOOL GRPAPI WINAPI SetMpqDll(LPCSTR lpDllFileName) { if (LoadStorm((char *)lpDllFileName)) return TRUE; @@ -216,7 +233,8 @@ BOOL GRPAPI WINAPI DrawGrp(HANDLE hGrp, HDC hdcDest, int nXDest, int nYDest, WOR FrameSize = j; } } - if (FrameSize == 0xFFFFFF) { + if (FrameSize == 0xFFFFFF || FrameSize == GrpFrame->Width * GrpFrame->Height) { + FrameSize = 0xFFFFFF; for (i = 0; i + 1 < GrpFile->nFrames; i++) { j = GrpFrames[i].Offset - GrpFrames[0].Offset; if (j > 0 && j < FrameSize) @@ -383,6 +401,19 @@ BOOL GRPAPI WINAPI GetGrpInfo(HANDLE hGrp, GRPHEADER *GrpInfo) return TRUE; } +BOOL GRPAPI WINAPI GetGrpFrameInfo(HANDLE hGrp, WORD nFrame, DWORD *nLeft, DWORD *nTop, DWORD *nWidth, DWORD *nHeight) +{ + if (!hGrp || hGrp==INVALID_HANDLE_VALUE) return FALSE; + FRAMEHEADER *GrpFrame = &((FRAMEHEADER *)(((char *)hGrp)+6))[nFrame]; + + if (nLeft) *nLeft = GrpFrame->Left; + if (nTop) *nTop = GrpFrame->Top; + if (nWidth) *nWidth = GrpFrame->Width; + if (nHeight) *nHeight = GrpFrame->Height; + + return TRUE; +} + void GRPAPI WINAPI SetFunctionGetPixel(GETPIXELPROC lpGetPixelProc) { if (!lpGetPixelProc) @@ -455,6 +486,7 @@ HANDLE GRPAPI WINAPI CreateGrp(signed short *lpImageData, WORD nFrames, WORD wMa GrpHeader.wMaxHeight = wMaxHeight; lpFrameHeaders = (FRAMEHEADER *)malloc(nFrames * sizeof(FRAMEHEADER)); lpFrameData = (FRAMEDATA *)malloc(nFrames * sizeof(FRAMEDATA)); + nLastOffset = sizeof(GRPHEADER) + nFrames * sizeof(FRAMEHEADER); for (i = 0; i < nFrames; i++) { // Search for duplicate frames @@ -569,6 +601,7 @@ void EncodeFrameData(signed short *lpImageData, WORD nFrame, GRPHEADER *lpGrpHea lpFrameData->lpRowSizes = (WORD *)malloc(lpFrameHeader->Height * sizeof(WORD)); lpFrameData->lpRowData = (LPBYTE *)malloc(lpFrameHeader->Height * sizeof(LPBYTE)); lpRowBuf = (LPBYTE)malloc(lpFrameHeader->Width * 2); + nLastOffset = lpFrameHeader->Height * sizeof(WORD); for (y = 0; y < lpFrameHeader->Height; y++) { i = nFrame * lpGrpHeader->wMaxWidth * lpGrpHeader->wMaxHeight + (lpFrameHeader->Top + y) * lpGrpHeader->wMaxWidth; @@ -608,7 +641,8 @@ void EncodeFrameData(signed short *lpImageData, WORD nFrame, GRPHEADER *lpGrpHea lpRowBuf[nBufPos]++; } x--; - nBufPos++; + if (nLastOffset + nBufPos + 1 <= 0xFFFF) + nBufPos++; continue; } @@ -619,7 +653,8 @@ void EncodeFrameData(signed short *lpImageData, WORD nFrame, GRPHEADER *lpGrpHea lpRowBuf[nBufPos] = 0x41 + nRepeat; lpRowBuf[nBufPos+1] = (BYTE)lpImageData[i+x]; x += nRepeat; - nBufPos += 2; + if (nLastOffset + nBufPos + 2 <= 0xFFFF) + nBufPos += 2; } else { lpRowBuf[nBufPos] = 0; @@ -636,18 +671,21 @@ void EncodeFrameData(signed short *lpImageData, WORD nFrame, GRPHEADER *lpGrpHea lpRowBuf[nBufPos+lpRowBuf[nBufPos]] = (BYTE)lpImageData[i+x]; } x--; - nBufPos += 1 + lpRowBuf[nBufPos]; + if (nLastOffset + nBufPos + 1 + lpRowBuf[nBufPos] <= 0xFFFF) + nBufPos += 1 + lpRowBuf[nBufPos]; } } else { if (lpImageData[i+x] < 0) { lpRowBuf[nBufPos] = 0x81; - nBufPos++; + if (nLastOffset + nBufPos + 1 <= 0xFFFF) + nBufPos++; } else { lpRowBuf[nBufPos] = 1; lpRowBuf[nBufPos+1] = (BYTE)lpImageData[i+x]; - nBufPos += 2; + if (nLastOffset + nBufPos + 2 <= 0xFFFF) + nBufPos += 2; } } }