mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.4 KiB
140 lines
3.4 KiB
/*****************************************************************************
|
|
* *
|
|
* EXPAND.C *
|
|
* *
|
|
* Copyright (C) Microsoft Corporation 1989. *
|
|
* All Rights reserved. *
|
|
* *
|
|
******************************************************************************
|
|
* *
|
|
* Module Intent *
|
|
* This code compresses and decompresses bitmap bits, as well as the code *
|
|
* to expand Help 3.0 format bitmaps from disk image to the memory structure.*
|
|
* *
|
|
*****************************************************************************/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "skip.h"
|
|
|
|
#define fRLEBit 0x80
|
|
const int MAX_RUN = 127;
|
|
|
|
/***************************************************************************
|
|
*
|
|
- Name: FreeHbmh
|
|
-
|
|
* Purpose:
|
|
* This function frees a bitmap handle, whether it was created in
|
|
* FWritePbitmap() or HbmhExpandQv(). In the first case, metafile
|
|
* bits will be stored at the end of the bitmap handle, while in
|
|
* the second case, they will be stored in a separate handle.
|
|
*
|
|
* Arguments:
|
|
* hbmh -- handle to a bitmap.
|
|
*
|
|
* Returns:
|
|
* nothing.
|
|
*
|
|
***************************************************************************/
|
|
|
|
void STDCALL FreeHbmh(PBMH qbmh)
|
|
{
|
|
if (qbmh && qbmh != hbmhInvalid) {
|
|
|
|
// The bmh has not been discarded.
|
|
|
|
if (qbmh->bmFormat == bmWmetafile && qbmh->cbOffsetBits == 0) {
|
|
|
|
// Get rid of the current description of the metafile.
|
|
|
|
if (qbmh->w.mf.hMF != NULL)
|
|
lcFree(qbmh->w.mf.hMF);
|
|
}
|
|
lcFree(qbmh);
|
|
}
|
|
}
|
|
|
|
/***************************************************************************
|
|
*
|
|
- Name RleCompress
|
|
-
|
|
* Purpose
|
|
* Compresses bitmap bits using RLE -- used when zeck compression is off
|
|
*
|
|
* Arguments
|
|
* pbSrc: pointer to source bits.
|
|
* pbDest: pointer to destination bits.
|
|
* cbSrc: Number of bytes in source.
|
|
*
|
|
* Returns
|
|
* Number of bytes in the destination. Guaranteed not to be
|
|
* more than 128/127 times cbSrc.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#define GRIND_UPDATE 1024 // when to update grinder
|
|
|
|
/***************************************************************************
|
|
*
|
|
- Name LcbOldUncompressHb
|
|
-
|
|
* Purpose
|
|
* This function is used only to decompress Help 2.5 bitmaps.
|
|
*
|
|
* Arguments
|
|
* pbSrc: Huge pointer to source bits.
|
|
* pbDest: Huge pointer to beginning of destination buffer.
|
|
* cbSrc: Number of compressed bytes in source.
|
|
* cbDest: Size of destination buffer.
|
|
*
|
|
* Returns
|
|
* Actual number of bytes copied to destination buffer, or -1 if
|
|
* buffer is too small.
|
|
*
|
|
* +++
|
|
*
|
|
* Notes
|
|
*
|
|
***************************************************************************/
|
|
|
|
int pascal LcbOldUncompressHb(PBYTE pbSrc, PBYTE pbDest,
|
|
int cbSrc, int cbDest)
|
|
{
|
|
PBYTE pbStart;
|
|
WORD cbRun;
|
|
BYTE ch;
|
|
|
|
// Move pointers to the end of the buffers:
|
|
|
|
pbSrc += cbSrc;
|
|
pbDest += cbDest;
|
|
pbStart = pbDest;
|
|
|
|
while (cbSrc-- > 0) {
|
|
cbRun = *(--pbSrc);
|
|
cbDest -= (cbRun & ~fRLEBit);
|
|
if (cbDest < 0)
|
|
return -1;
|
|
|
|
if (cbRun & fRLEBit) {
|
|
cbRun -= fRLEBit;
|
|
cbSrc -= cbRun;
|
|
while (cbRun-- > 0)
|
|
*(--pbDest) = *(--pbSrc);
|
|
}
|
|
else {
|
|
ch = *(--pbSrc);
|
|
while (cbRun-- > 0)
|
|
*(--pbDest) = ch;
|
|
cbSrc--;
|
|
}
|
|
}
|
|
|
|
return (int) pbStart - (int) pbDest;
|
|
}
|