|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
faxtiff.h
Abstract:
Declarations for Group3 2D compression and generating TIFF files
Environment:
Windows XP Fax driver, kernel mode
Revision History:
01/23/96 -davidx- Created it.
dd-mm-yy -author- description
NOTE:
Structure of the TIFF output file from the driver:
4949 II 002a 42 00000008 Offset to the first IFD
IFD for the first page
Number of directory entries NEWSUBFILETYPE LONG 1 2 - Page in a multi-page document PAGENUMBER SHORT 2 PageNumber 0000 IMAGEWIDTH LONG 1 ImageWidth IMAGEHEIGHT LONG 1 ImageHeight BITSPERSAMPLE SHORT 1 1 SAMPLESPERPIXEL SHORT 1 1 COMPRESSION SHORT 1 4 - G4Fax GROUP4OPTIONS SHORT 1 0 CLEANFAXDATA SHORT 1 0 FILLORDER SHORT 1 2 PHOTOMETRIC SHORT 1 0 - WhiteIsZero RESOLUTIONUNIT SHORT 1 2 - Inch XRESOLUTION RATIONAL 1 Xdpi YRESOLUTION RATIONAL 1 Ydpi ROWSPERSTRIP LONG 1 ImageHeight STRIPBYTECOUNTS LONG 1 Compressed data byte count STRIPOFFSETS LONG 1 Offset to compressed data Next IFD offset Compressed data for the first page
IFD for the second page Compressed data for the second page ...
Last IFD
0001 SOFTWARE ASCII n "Microsoft Shared Fax Driver" 00000000 00000000
--*/
#ifndef _FAXTIFF_H_
#define _FAXTIFF_H_
//
// TIFF field tag and type constants
//
#define TIFFTYPE_ASCII 2
#define TIFFTYPE_SHORT 3
#define TIFFTYPE_LONG 4
#define TIFFTYPE_RATIONAL 5
#define TIFFTAG_NEWSUBFILETYPE 254
#define SUBFILETYPE_PAGE 2
#define TIFFTAG_IMAGEWIDTH 256
#define TIFFTAG_IMAGEHEIGHT 257
#define TIFFTAG_BITSPERSAMPLE 258
#define TIFFTAG_COMPRESSION 259
#define COMPRESSION_G3FAX 3
#define COMPRESSION_G4FAX 4
#define TIFFTAG_PHOTOMETRIC 262
#define PHOTOMETRIC_WHITEIS0 0
#define PHOTOMETRIC_BLACKIS0 1
#define TIFFTAG_FILLORDER 266
#define FILLORDER_MSB 1
#define FILLORDER_LSB 2
#define TIFFTAG_STRIPOFFSETS 273
#define TIFFTAG_SAMPLESPERPIXEL 277
#define TIFFTAG_ROWSPERSTRIP 278
#define TIFFTAG_STRIPBYTECOUNTS 279
#define TIFFTAG_XRESOLUTION 282
#define TIFFF_RES_X 204
#define TIFFTAG_YRESOLUTION 283
#define TIFFF_RES_Y 196
#define TIFFF_RES_Y_DRAFT 98
#define TIFFTAG_G3OPTIONS 292
#define G3_2D 1
#define G3_ALIGNEOL 4
#define TIFFTAG_G4OPTIONS 293
#define TIFFTAG_RESUNIT 296
#define RESUNIT_INCH 2
#define TIFFTAG_PAGENUMBER 297
#define TIFFTAG_SOFTWARE 305
#define TIFFTAG_CLEANFAXDATA 327
//
// Data structure for representing our TIFF output file header information
//
typedef struct {
WORD magic1; // II
WORD magic2; // 42
LONG firstIFD; // offset to first IFD
DWORD signature; // driver private signature
} TIFFFILEHEADER;
#define TIFF_MAGIC1 'II'
#define TIFF_MAGIC2 42
//
// Data structure for representing a single IFD entry
//
typedef struct {
WORD tag; // field tag
WORD type; // field type
DWORD count; // number of values
DWORD value; // value or value offset
} IFDENTRY, *PIFDENTRY;
//
// IFD entries we generate for each page
//
enum {
IFD_NEWSUBFILETYPE, IFD_IMAGEWIDTH, IFD_IMAGEHEIGHT, IFD_BITSPERSAMPLE, IFD_COMPRESSION, IFD_PHOTOMETRIC, IFD_FILLORDER, IFD_STRIPOFFSETS, IFD_SAMPLESPERPIXEL, IFD_ROWSPERSTRIP, IFD_STRIPBYTECOUNTS, IFD_XRESOLUTION, IFD_YRESOLUTION, IFD_G3G4OPTIONS, IFD_RESUNIT, IFD_PAGENUMBER, IFD_SOFTWARE, IFD_CLEANFAXDATA,
NUM_IFD_ENTRIES };
typedef struct {
WORD reserved; WORD wIFDEntries; IFDENTRY ifd[NUM_IFD_ENTRIES]; DWORD nextIFDOffset; DWORD filler; DWORD xresNum; DWORD xresDenom; DWORD yresNum; DWORD yresDenom; CHAR software[32];
} FAXIFD, *PFAXIFD;
//
// Output compressed data bytes in correct fill order
//
#ifdef USELSB
#define OutputByte(n) BitReverseTable[(BYTE) (n)]
#else
#define OutputByte(n) ((BYTE) (n))
#endif
//
// Output a sequence of compressed bits
//
#define OutputBits(pdev, length, code) { \
(pdev)->bitdata |= (code) << ((pdev)->bitcnt - (length)); \ if (((pdev)->bitcnt -= (length)) <= 2*BYTEBITS) { \ *(pdev)->pCompBufPtr++ = OutputByte(((pdev)->bitdata >> 3*BYTEBITS)); \ *(pdev)->pCompBufPtr++ = OutputByte(((pdev)->bitdata >> 2*BYTEBITS)); \ (pdev)->bitdata <<= 2*BYTEBITS; \ (pdev)->bitcnt += 2*BYTEBITS; \ } \ }
//
// Flush any leftover bits into the compressed bitmap buffer
//
#define FlushBits(pdev) { \
while ((pdev)->bitcnt < DWORDBITS) { \ (pdev)->bitcnt += BYTEBITS; \ *(pdev)->pCompBufPtr++ = OutputByte(((pdev)->bitdata >> 3*BYTEBITS)); \ (pdev)->bitdata <<= BYTEBITS; \ } \ (pdev)->bitdata = 0; \ (pdev)->bitcnt = DWORDBITS; \ }
//
// Find the next pixel on the scanline whose color is opposite of
// the specified color, starting from the specified starting point
//
#define NextChangingElement(pbuf, startBit, stopBit, isBlack) \
((startBit) + ((isBlack) ? FindBlackRun((pbuf), (startBit), (stopBit)) : \ FindWhiteRun((pbuf), (startBit), (stopBit))))
//
// Check if the specified pixel on the scanline is black or white
// 1 - the specified pixel is black
// 0 - the specified pixel is white
//
#define GetBit(pbuf, bit) (((pbuf)[(bit) >> 3] >> (((bit) ^ 7) & 7)) & 1)
//
// Compress the specified number of scanlines
//
BOOL EncodeFaxData( PDEVDATA pdev, PBYTE plinebuf, INT lineWidth, INT lineCount );
//
// Output TIFF IFD for the current page
//
BOOL WriteTiffIFD( PDEVDATA pdev, LONG bmpWidth, LONG bmpHeight, DWORD compressedBits );
//
// Output the compressed bitmap data for the current page
//
BOOL WriteTiffBits( PDEVDATA pdev, PBYTE pCompBits, DWORD compressedBits );
//
// Enlarge the buffer for holding the compressed bitmap data
//
BOOL GrowCompBitsBuffer( PDEVDATA pdev, LONG scanlineSize );
//
// Free the buffer for holding the compressed bitmap data
//
VOID FreeCompBitsBuffer( PDEVDATA pdev );
//
// Initialize the fax encoder
//
BOOL InitFaxEncoder( PDEVDATA pdev, LONG bmpWidth, LONG bmpHeight );
#endif // !_FAXTIFF_H_
|