/*++

Copyright (c) 1997-1999  Microsoft Corporation

--*/

//----------------------------------------------------------------------------
// Filename:    pdev.h
// This file contains definitions for KPDL mini-driver
//-----------------------------------------------------------------------------
#ifndef _PDEV_H
#define _PDEV_H


#include <minidrv.h>
#include <stdio.h>
#include <prcomoem.h>
#include <strsafe.h>

#define VALID_PDEVOBJ(pdevobj) \
        ((pdevobj) && (pdevobj)->dwSize >= sizeof(DEVOBJ) && \
         (pdevobj)->hEngine && (pdevobj)->hPrinter && \
         (pdevobj)->pPublicDM && (pdevobj)->pDrvProcs )

#define ASSERT_VALID_PDEVOBJ(pdevobj) ASSERT(VALID_PDEVOBJ(pdevobj))

// Debug text.
#define ERRORTEXT(s)    "ERROR " DLLTEXT(s)

//
// OEM Signature and version.
//
#define OEM_SIGNATURE   'KPDL'
#define DLLTEXT(s)      "KPDL: " s
#define OEM_VERSION      0x00010000L

// kpdlres mini driver device data structure
typedef struct
{
    WORD            wRes;            // resolution 600 or 400 or 240
    WORD            wCopies;         // number of multi copies
    short           sSBCSX;
    short           sDBCSX;
    short           sSBCSXMove;      // use to set address mode
    short           sSBCSYMove;      // use to set address mode
    short           sDBCSXMove;      // use to set address mode
    short           sDBCSYMove;      // use to set address mode
    short           sEscapement;     // use to set address mode
    BOOL            fVertFont;       // for TATEGAKI font
    WORD            wOldFontID;
    BOOL            fPlus;
    WORD            wScale;
    LONG            lPointsx;
    LONG            lPointsy;
    int             CursorX;
    int             CursorY;

    // Used for rect-fill operations.

    DWORD dwRectX;
    DWORD dwRectY;

    // Temp. buffer parameters.

    DWORD dwBlockX, dwBlockY, dwBlockLen;
    PBYTE pTempBuf;
    DWORD dwTempBufLen;
    DWORD dwTempDataLen;

    // Absolute address mode setting.

#define ADDR_MODE_NONE 0
#define ADDR_MODE_SBCS 1
#define ADDR_MODE_DBCS 2

    BYTE jAddrMode;

    // Color mode values.  Sam values also used
    // for the command callback IDs.

#define COLOR_24BPP_2                120
#define COLOR_24BPP_4                121
#define COLOR_24BPP_8                122
#define COLOR_3PLANE                 123
#define MONOCHROME                   124

    BYTE jColorMode;

// #308001: Garbage appear on device font
#define PLANE_CYAN              1
#define PLANE_MAGENTA           2
#define PLANE_YELLOW            3
    BYTE jCurrentPlane;

// removed #if 0 dead code

} MYDATA, *PMYDATA;

#define MINIDEV_DATA(p) \
    ((p)->pdevOEM)

#define IsColorPlanar(p) \
    ((MONOCHROME == (p)->jColorMode) \
    || (COLOR_3PLANE == (p)->jColorMode))

#define IsColorTrueColor(p) \
    (!IsColorPlanar(p))

// removed #if 0 dead code

#define ColorOutDepth(p) \
    (((p)->jColorMode == COLOR_24BPP_2)?1:\
    (((p)->jColorMode == COLOR_24BPP_4)?2:\
    (((p)->jColorMode == COLOR_24BPP_8)?3:1)))

typedef struct
{
    OEM_DMEXTRAHEADER   dmExtraHdr;
} OEMUD_EXTRADATA, *POEMUD_EXTRADATA;

// NPDL2 command
#define ESC_RESET         "\033c1"                // software reset
#define ESC_KANJIYOKO     "\033K"                 // kanji yoko mode
#define ESC_KANJITATE     "\033t"                 // kanji yoko mode
#define FS_PAGEMODE       "\034d240.",        6   // page mode
#define FS_DRAWMODE       "\034\"R.",         4   // draw mode
#define FS_ADDRMODE_ON    "\034a%d,%d,0,B."       // set address mode
#define FS_GRPMODE_ON     "\034Y",            2   // set graphic mode
#define FS_GRPMODE_OFF    "\034Z",            2   // reset graphic mode
#define FS_SETMENUNIT     "\034<1/%d,i."          // select men-mode resolution
#define FS_JIS78          "\03405F2-00",      8   // select JIS78
#define FS_JIS90          "\03405F2-02"           // select JIS90
#define FS_ENDPAGE        "\034R\034x%d.\015\014" // end page
#define FS_E              "\034e%d,%d."
#define FS_RESO           "\034&%d."
#define FS_RESO0_RESET    "\034&0.\033c1"
#define INIT_DOC          "\034<1/%d,i.\034YSU1,%d,0;\034Z"
#define RESO_PAGE_KANJI   "\034&%d.\034d240.\033K"
#define FS_I              "\034R\034i%d,%d,0,1/1,1/1,%d,%d."
#define FS_I_2            "\034R\034i%d,%d,5,1/1,1/1,%d,%d."
#define FS_I_D            "%d,%d."
#define FS_M_Y            "\034m1/1,%s."
#define FS_M_T            "\034m%s,1/1."
#define FS_12S2           "\03412S2-%04ld-%04ld"

// Command CallBack ID
#define CALLBACK_ID_MAX              255 //

// PAGECONTROL
#define PC_MULT_COPIES_N               1
#define PC_MULT_COPIES_C               2
#define PC_TYPE_F                      4
#define PC_END_F                       6
#define PC_ENDPAGE                     7
#define PC_PRN_DIRECTION               9

// FONTSIMULATION
#define FS_SINGLE_BYTE                20
#define FS_DOUBLE_BYTE                21

// RESOLUTION
#define RES_240                       30
#define RES_400                       31
#define RES_300                       35
#define RES_SENDBLOCK                 36

//CURSORMOVE
#define CM_X_ABS                     101
#define CM_Y_ABS                     102
#define CM_CR                        103
#define CM_FF                        104
#define CM_LF                        105

#define CMD_RECT_WIDTH              130
#define CMD_RECT_HEIGHT             131
#define CMD_WHITE_FILL              132
#define CMD_GRAY_FILL               133
#define CMD_BLACK_FILL              134

// #308001: Garbage appear on device font
#define CMD_SENDCYAN                141
#define CMD_SENDMAGENTA             142
#define CMD_SENDYELLOW              143

extern BOOL BInitOEMExtraData(POEMUD_EXTRADATA pOEMExtra);
extern BMergeOEMExtraData(POEMUD_EXTRADATA pdmIn, POEMUD_EXTRADATA pdmOut);

WORD Ltn1ToAnk( WORD );
static int iDwtoA_FillZero(PBYTE, long, int );

#ifdef __cplusplus
	extern "C" {
#endif
	BOOL myOEMSendFontCmd( PDEVOBJ pdevobj,PUNIFONTOBJ  pUFObj,PFINVOCATION pFInv );
	BOOL myOEMOutputCharStr( PDEVOBJ pdevobj, PUNIFONTOBJ pUFObj, DWORD dwType, DWORD dwCount, PVOID pGlyph );
#ifdef __cplusplus
	}
#endif

#endif  //PDEV_H