/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    faxdrv.h

Abstract:

    Fax driver graphics DLL header file

[Environment:]

    Fax driver, kernel mode

Revision History:

    01/09/96 -davidx-
        Created it.

    dd-mm-yy -author-
        description

--*/


#ifndef _FAXDRV_H_
#define _FAXDRV_H_

#include "faxlib.h"

//
// Data structure maintained by the fax driver graphics DLL
//

typedef struct {

    PVOID       startDevData;   // data structure signature

    HANDLE      hPrinter;       // handle to printer
    HDEV        hdev;           // handle to GDI device
    HANDLE      hpal;           // handle to default palette
    DWORD       flags;          // flag bits
    DRVDEVMODE  dm;             // devmode information
    INT         pageCount;      // number of pages printed
    SIZEL       paperSize;      // paper size measured in pixels
    SIZEL       imageSize;      // image size measured in pixels
    RECTL       imageArea;      // imageable area measured in pixels
    LONG        xres, yres;     // x- and y-resolution
    HSURF       hbitmap;        // handle to bitmap surface
    LONG        lineOffset;     // bitmap scanline byte offset
    DWORD       jobId;          // job ID

    DWORD       fileOffset;     // output byte count for current document
    PBYTE       pCompBits;      // buffer to hold G4 compressed bitmap data
    PBYTE       pCompBufPtr;    // pointer to next free byte in the buffer
    PBYTE       pCompBufMark;   // high-water mark
    DWORD       compBufSize;    // size of compressed bitmap data buffer
    DWORD       compBufInc;     // increment to enlarge the buffer when necessary
    PBYTE       prefline;       // raster data for the reference line
    INT         bitcnt;         // these two fields are used for assembling variable-length
    DWORD       bitdata;        // compressed bits into byte stream
    PVOID       pFaxIFD;        // IFD entries for each page

    PVOID       endDevData;     // data structure signature

} DEVDATA, *PDEVDATA;

//
// Constants for DEVDATA.flags field
//

#define PDEV_CANCELLED  0x0001  // current job has been cancelled
#define PDEV_RESETPDEV  0x0002  // DrvResetPDEV has been called
#define PDEV_WITHINPAGE 0x0004  // drawing on a page

//
// Check if a DEVDATA structure is valid
//

#define ValidDevData(pdev)  \
        ((pdev) && (pdev)->startDevData == (pdev) && (pdev)->endDevData == (pdev))

//
// Color values and indices
//

#define RGB_BLACK   RGB(0, 0, 0)
#define RGB_WHITE   RGB(255, 255, 255)

#define BLACK_INDEX 0
#define WHITE_INDEX 1

//
// Number of bits consisting a BYTE and a DWORD
//

#define BYTEBITS    8
#define DWORDBITS   (sizeof(DWORD) * BYTEBITS)

//
// Pad bit scanline data to N-byte boundary
//

#define PadBitsToBytes(bits, N) \
        ((((bits) + ((N) * BYTEBITS - 1)) / ((N) * BYTEBITS)) * (N))

//
// Macros for manipulating ROP4s and ROP3s
//

#define GetForegroundRop3(rop4) ((rop4) & 0xFF)
#define GetBackgroundRop3(rop4) (((rop4) >> 8) & 0xFF)
#define Rop3NeedPattern(rop3)   (((rop3 >> 4) & 0x0F) != (rop3 & 0x0F))
#define Rop3NeedSource(rop3)    (((rop3 >> 2) & 0x33) != (rop3 & 0x33))
#define Rop3NeedDest(rop3)      (((rop3 >> 1) & 0x55) != (rop3 & 0x55))

//
// Determine whether the page is in landscape mode
//

#define IsLandscapeMode(pdev)   ((pdev)->dm.dmPublic.dmOrientation == DMORIENT_LANDSCAPE)

//
// Returns the length of the hypotenouse of a right triangle
//

LONG
CalcHypot(
    LONG    x,
    LONG    y
    );

//
// Output a completed page bitmap to the spooler
//

BOOL
OutputPageBitmap(
    PDEVDATA    pdev,
    PBYTE       pBitmapData
    );

//
// Output document trailer information to the spooler
//

BOOL
OutputDocTrailer(
    PDEVDATA    pdev
    );

#endif // !_FAXDRV_H_