Windows2000/private/windows/shell/accesory/ole2pbsh/unpkbuff.c
2020-09-30 17:12:32 +02:00

113 lines
2.5 KiB
C

/****************************Module*Header******************************\
* Module Name: unpkbuff.c *
* Created: 1989 *
* Copyright (c) 1987 - 1991 Microsoft Corporation *
* A general description of how the module is used goes here. *
* Additional information such as restrictions, limitations, or special *
* algorithms used if they are externally visible or effect proper use of the module.
*/
#include <windows.h>
#include <port1632.h>
#include <memory.h>
#include "pbrush.h"
#define BUFFER_SIZE 1024
/* file buffer vars. */
static HANDLE hBuf;
static LPBYTE pBuf;
static int iBuf;
BOOL InitFileBuffer(void)
{
if (!(hBuf = LocalAlloc(LHND, BUFFER_SIZE)))
goto error1;
if (!(pBuf = LocalLock(hBuf)))
goto error2;
iBuf = BUFFER_SIZE;
return TRUE;
error2:
LocalFree(hBuf);
hBuf = NULL;
error1:
return FALSE;
}
void DeleteFileBuffer(void)
{
if (hBuf) {
LocalUnlock(hBuf);
LocalFree(hBuf);
hBuf = NULL;
pBuf = NULL;
}
}
BYTE bgetc(HANDLE fh)
{
if (iBuf == BUFFER_SIZE) {
MyByteReadFile(fh, pBuf, BUFFER_SIZE);
iBuf = 0;
}
return pBuf[iBuf++];
}
BOOL UnpkBuff(BYTE *buff, int row, DHDR hdr, int nPlanes, HANDLE fh)
{
unsigned cntr;
int i;
BYTE runChar, runCount;
BYTE *buffPtr, *endPtr;
/* upack scan lines and transfer to fileBuff */
runCount = 0;
for (i = 0; i < nPlanes; ++i) {
buffPtr = buff + i * hdr.bplin;
endPtr = buffPtr + hdr.bplin;
while (buffPtr < endPtr) {
if (runCount == 1) {
*buffPtr++ = runChar;
runCount--;
} else {
cntr = min((unsigned)runCount, (unsigned)(endPtr - buffPtr));
RepeatFill(buffPtr, runChar, cntr);
runCount -= (BYTE) cntr;
buffPtr += cntr;
}
if (buffPtr == endPtr)
break;
runCount = bgetc(fh);
if ((runCount & ESCbits) != ESCbits) {
*buffPtr++ = runCount;
runCount = 0;
} else {
runCount &= ~ESCbits;
runChar = bgetc(fh);
}
}
}
/* fill in intensity plane with 1s if we are reading 3 plane file */
if (nPlanes != hdr.nPlanes)
RepeatFill(buffPtr, 0xff, hdr.bplin);
return TRUE;
}