windows-nt/Source/XPSP1/NT/printscan/fax/setup/win9xupg/inc/faxcodec.h
2020-09-26 16:20:57 +08:00

159 lines
5.8 KiB
C

// Copyright (c) Microsoft Corp. 1992-94
/*==============================================================================
The prototypes in this header file define an API for the Fax Codec DLL.
DATE NAME COMMENTS
25-Nov-92 RajeevD Created.
13-Apr-93 RajeevD Changed to Bring Your Own Memory (BYOM :=) API.
01-Nov-93 RajeevD Defined structure for initialization parameters.
21-Jan-94 RajeevD Split FaxCodecRevBuf into BitReverseBuf and InvertBuf.
19-Jul-94 RajeevD Added nTypeOut=NULL_DATA and FaxCodecCount.
==============================================================================*/
#ifndef _FAXCODEC_
#define _FAXCODEC_
#include <windows.h>
#include <buffers.h>
/*==============================================================================
The FC_PARAM structure specifies the conversion to be initialized.
This matrix indicates the valid combinations of nTypeIn and nTypeOut.
nTypeOut
MH MR MMR LRAW NULL
MH * * * *
MR * * * *
nTypeIn
MMR * * *
LRAW * * *
==============================================================================*/
typedef struct
#ifdef __cplusplus
FAR FC_PARAM
#endif
{
DWORD nTypeIn; // input data type: {MH|MR|MMR|LRAW}_DATA
DWORD nTypeOut; // output type type: {MH|MR|MMR|LRAW|NULL}_DATA
UINT cbLine; // scan line byte width (must be multiple of 4)
UINT nKFactor; // K factor (significant for nTypeOut==MR_DATA)
}
FC_PARAM, FAR *LPFC_PARAM;
#ifdef __cplusplus
extern "C" {
#endif
/*==============================================================================
FaxCodecInit() initializes a context for a conversion. The client may pass a
NULL context pointer to query for the exact size of the context, allocate the
context memory, and call a second time to initialize.
==============================================================================*/
UINT // size of context (0 on failure)
WINAPI FaxCodecInit
(
LPVOID lpContext, // context pointer (or NULL on query)
LPFC_PARAM lpParam // initialization parameters
);
typedef UINT (WINAPI *LPFN_FAXCODECINIT)
(LPVOID, LPFC_PARAM);
// Return codes for FaxCodecConvert
typedef UINT FC_STATUS;
#define FC_INPUT_EMPTY 0
#define FC_OUTPUT_FULL 1
#define FC_DECODE_ERR 4 // only for nTypeIn==MMR_DATA
/*==============================================================================
FaxCodecConvert() executes the conversion specified in FaxCodecInit().
In the input buffer, lpbBegData is advanced and wLengthData is decremented as
data is consumed. If the caller wants to retain the input data, both must be
saved and restored. If the input type is LRAW_DATA, wLengthData must be a
multiple of 4.
In the output buffer, wLengthData is incremented as data is appended. If the
output type is LRAW_DATA, an whole number of scan lines are produced.
To flush any output data at the end of a page, pass a NULL input buffer or a
zero length buffer with dwMetaData set to END_OF_PAGE.
Returns when the input buffer is empty or the output buffer full.
==============================================================================*/
FC_STATUS // status
WINAPI FaxCodecConvert
(
LPVOID lpContext, // context pointer
LPBUFFER lpbufIn, // input buffer (NULL at end of page)
LPBUFFER lpbufOut // output buffer
);
typedef UINT (WINAPI *LPFN_FAXCODECCONVERT)
(LPVOID, LPBUFFER, LPBUFFER);
/*==============================================================================
The FC_COUNT structure accumulates various counters during FaxCodecConvert.
==============================================================================*/
typedef struct
{
DWORD cTotalGood; // total good scan lines
DWORD cTotalBad; // total bad scan lines
DWORD cMaxRunBad; // maximum consecutive bad
}
FC_COUNT, FAR *LPFC_COUNT;
/*==============================================================================
FaxCodecCount() reports and resets the internal counters.
==============================================================================*/
void WINAPI FaxCodecCount
(
LPVOID lpContext,
LPFC_COUNT lpCount
);
typedef void (WINAPI *LPFN_FAXCODECCOUNT)
(LPVOID, LPFC_COUNT);
/*==============================================================================
BitReverseBuf() performs a bit reversal of buffer data. The dwMetaData field is
toggled between LRAW_DATA and HRAW_DATA. As with all scan lines, the length
of data (wLengthData) must be a 32-bit multiple. For best performance the start
of the data (lpbBegData) should be 32-bit aligned and the data predominantly 0.
==============================================================================*/
void WINAPI BitReverseBuf (LPBUFFER lpbuf);
/*==============================================================================
InvertBuf() inverts buffer data. As with all scan lines, the length of data
(wLengthData) must be a 32-bit multiple. For best performance, the start of
data (lpbBegData) should be 32-bit aligned.
==============================================================================*/
void WINAPI InvertBuf (LPBUFFER lpbuf);
/*==============================================================================
FaxCodecChange() produces a change vector for an LRAW scan line.
==============================================================================*/
typedef short FAR* LPSHORT;
// Slack Parameters.
#define RAWBUF_SLACK 2
#define CHANGE_SLACK 12
#define OUTBUF_SLACK 16
extern void WINAPI FaxCodecChange
(
LPBYTE lpbLine, // LRAW scan line
UINT cbLine, // scan line width
LPSHORT lpsChange // change vector
);
#ifdef __cplusplus
} // extern "C" {
#endif
#endif // _FAXCODEC_