|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
winddi.h
Abstract:
Private entry points, defines and types for Windows NT GDI device driver interface.
--*/
#ifndef _WINDDI_
#define _WINDDI_
//
// GUID definitions for use with kernel-mode GDI drivers
//
#ifndef _NO_DDRAWINT_NO_COM
#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else // !defined(__cplusplus)
#define EXTERN_C extern
#endif // !defined(__cplusplus)
#endif // !defined(EXTERN_C)
#ifndef DEFINE_GUID
#ifndef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID FAR name #else // !defined(INITGUID)
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID name \ = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #endif // !defined(INITGUID)
#endif // !defined(DEFINE_GUID)
#ifndef DEFINE_GUIDEX
#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
#endif // !defined(DEFINE_GUIDEX)
#ifndef STATICGUIDOF
#define STATICGUIDOF(guid) STATIC_##guid
#endif // !defined(STATICGUIDOF)
#ifndef GUID_DEFINED
#define GUID_DEFINED
typedef struct _GUID { ULONG Data1; USHORT Data2; USHORT Data3; UCHAR Data4[8]; } GUID; #endif // !defined(GUID_DEFINED)
#ifndef IsEqualGUID
#define IsEqualGUID(guid1, guid2) \
(!memcmp((guid1), (guid2), sizeof(GUID))) #endif // !defined(IsEqualGUID)
#ifndef IsEqualIID
#define IsEqualIID IsEqualGUID
#endif // !defined(IsEqualIID)
#endif // !defined(_NO_DDRAWINT_NO_COM)
//
// Standard DirectX HAL includes
//
#include <ddrawint.h>
#include <d3dnthal.h>
#ifdef __cplusplus
extern "C" { #endif
//
// drivers and other components that include this should NOT include
// windows.h They should be system conponents that only use GDI internals
// and therefore only include wingdi.h
//
#if defined(_X86_) && !defined(USERMODE_DRIVER) && !defined(BUILD_WOW6432)
//
// x86 does not support floating-point instruction in the kernel mode,
// the floating-point data would like be handled 32bits value as double words.
//
typedef DWORD FLOATL; #else
//
// Any platform that has support for floats in the kernel
//
typedef FLOAT FLOATL; #endif // _X86_
typedef LONG PTRDIFF; typedef PTRDIFF *PPTRDIFF; typedef LONG FIX; typedef FIX *PFIX; typedef ULONG ROP4; typedef ULONG MIX; typedef ULONG HGLYPH; typedef HGLYPH *PHGLYPH; #define HGLYPH_INVALID ((HGLYPH)-1)
typedef ULONG IDENT;
//
// handles for font file and font context objects
//
typedef ULONG_PTR HFF; typedef ULONG_PTR HFC; #define HFF_INVALID ((HFF) 0)
#define HFC_INVALID ((HFC) 0)
#define FD_ERROR 0xFFFFFFFF
#define DDI_ERROR 0xFFFFFFFF
typedef struct _POINTE /* pte */ { FLOATL x; FLOATL y; } POINTE, *PPOINTE;
typedef union _FLOAT_LONG { FLOATL e; LONG l; } FLOAT_LONG, *PFLOAT_LONG;
typedef struct _POINTFIX { FIX x; FIX y; } POINTFIX, *PPOINTFIX;
typedef struct _RECTFX { FIX xLeft; FIX yTop; FIX xRight; FIX yBottom; } RECTFX, *PRECTFX;
DECLARE_HANDLE(HBM); DECLARE_HANDLE(HDEV); DECLARE_HANDLE(HSURF); DECLARE_HANDLE(DHSURF); DECLARE_HANDLE(DHPDEV); DECLARE_HANDLE(HDRVOBJ);
#define LTOFX(x) ((x)<<4)
#define FXTOL(x) ((x)>>4)
#define FXTOLFLOOR(x) ((x)>>4)
#define FXTOLCEILING(x) ((x + 0x0F)>>4)
#define FXTOLROUND(x) ((((x) >> 3) + 1) >> 1)
// context information
typedef struct _FD_XFORM { FLOATL eXX; FLOATL eXY; FLOATL eYX; FLOATL eYY; } FD_XFORM, *PFD_XFORM;
typedef struct _FD_DEVICEMETRICS { // devm
FLONG flRealizedType; POINTE pteBase; POINTE pteSide; LONG lD; FIX fxMaxAscender; FIX fxMaxDescender; POINTL ptlUnderline1; POINTL ptlStrikeOut; POINTL ptlULThickness; POINTL ptlSOThickness; ULONG cxMax; // max pel width of bitmaps
// the fields formerly in REALIZE_EXTRA as well as some new fields:
ULONG cyMax; // did not use to be here
ULONG cjGlyphMax; // (cxMax + 7)/8 * cyMax, or at least it should be
FD_XFORM fdxQuantized; LONG lNonLinearExtLeading; LONG lNonLinearIntLeading; LONG lNonLinearMaxCharWidth; LONG lNonLinearAvgCharWidth;
// some new fields
LONG lMinA; LONG lMinC; LONG lMinD;
LONG alReserved[1]; // just in case we need it.
} FD_DEVICEMETRICS, *PFD_DEVICEMETRICS;
typedef struct _LIGATURE { /* lig */ ULONG culSize; LPWSTR pwsz; ULONG chglyph; HGLYPH ahglyph[1]; } LIGATURE, *PLIGATURE;
typedef struct _FD_LIGATURE { ULONG culThis; ULONG ulType; ULONG cLigatures; LIGATURE alig[1]; } FD_LIGATURE;
// glyph handle must be 32 bit
// signed 16 bit integer type denoting number of FUnit's
typedef SHORT FWORD;
// point in the 32.32 bit precission
typedef struct _POINTQF // ptq
{ LARGE_INTEGER x; LARGE_INTEGER y; } POINTQF, *PPOINTQF;
//. Structures
// devm.flRealizedType flags
// FDM_TYPE_ZERO_BEARINGS // all glyphs have zero a and c spaces
// the following two features refer to all glyphs in this font realization
// FDM_TYPE_CHAR_INC_EQUAL_BM_BASE // base width == cx for horiz, == cy for vert.
// FDM_TYPE_MAXEXT_EQUAL_BM_SIDE // side width == cy for horiz, == cx for vert.
#define FDM_TYPE_BM_SIDE_CONST 0x00000001
#define FDM_TYPE_MAXEXT_EQUAL_BM_SIDE 0x00000002
#define FDM_TYPE_CHAR_INC_EQUAL_BM_BASE 0x00000004
#define FDM_TYPE_ZERO_BEARINGS 0x00000008
#define FDM_TYPE_CONST_BEARINGS 0x00000010
// structures for describing a supported set of glyphs in a font
typedef struct _WCRUN { WCHAR wcLow; // lowest character in run inclusive
USHORT cGlyphs; // wcHighInclusive = wcLow + cGlyphs - 1;
HGLYPH *phg; // pointer to an array of cGlyphs HGLYPH's
} WCRUN, *PWCRUN;
// If phg is set to (HGLYPH *)NULL, for all wc's in this particular run
// the handle can be computed as simple zero extension:
// HGLYPH hg = (HGLYPH) wc;
//
// If phg is not NULL, memory pointed to by phg, allocated by the driver,
// WILL NOT MOVE.
typedef struct _FD_GLYPHSET { ULONG cjThis; // size of this structure in butes
FLONG flAccel; // accel flags, bits to be explained below
ULONG cGlyphsSupported; // sum over all wcrun's of wcrun.cGlyphs
ULONG cRuns; WCRUN awcrun[1]; // an array of cRun WCRUN structures
} FD_GLYPHSET, *PFD_GLYPHSET;
typedef struct _FD_GLYPHATTR { ULONG cjThis; // size of this structure in butes
ULONG cGlyphs; ULONG iMode; BYTE aGlyphAttr[1]; // an array of byte
} FD_GLYPHATTR, *PFD_GLYPHATTR;
// If GS_UNICODE_HANDLES bit is set,
// for ALL WCRUNS in this FD_GLYPHSET the handles are
// obtained by zero extending unicode code points of
// the corresponding supported glyphs, i.e. all gs.phg's are NULL
#define GS_UNICODE_HANDLES 0x00000001
// If GS_8BIT_HANDLES bit is set, all handles are in 0-255 range.
// This is just an ansi font then and we are really making up all
// the unicode stuff about this font.
#define GS_8BIT_HANDLES 0x00000002
// all handles fit in 16 bits.
// to 8 bit handles as it should.
#define GS_16BIT_HANDLES 0x00000004
// ligatures
typedef struct _FD_KERNINGPAIR { WCHAR wcFirst; WCHAR wcSecond; FWORD fwdKern; } FD_KERNINGPAIR;
// IFIMETRICS constants
#define FM_VERSION_NUMBER 0x0
//
// IFIMETRICS::fsType flags
//
#define FM_TYPE_LICENSED 0x2
#define FM_READONLY_EMBED 0x4
#define FM_EDITABLE_EMBED 0x8
#define FM_NO_EMBEDDING FM_TYPE_LICENSED
//
// IFIMETRICS::flInfo flags
//
#define FM_INFO_TECH_TRUETYPE 0x00000001
#define FM_INFO_TECH_BITMAP 0x00000002
#define FM_INFO_TECH_STROKE 0x00000004
#define FM_INFO_TECH_OUTLINE_NOT_TRUETYPE 0x00000008
#define FM_INFO_ARB_XFORMS 0x00000010
#define FM_INFO_1BPP 0x00000020
#define FM_INFO_4BPP 0x00000040
#define FM_INFO_8BPP 0x00000080
#define FM_INFO_16BPP 0x00000100
#define FM_INFO_24BPP 0x00000200
#define FM_INFO_32BPP 0x00000400
#define FM_INFO_INTEGER_WIDTH 0x00000800
#define FM_INFO_CONSTANT_WIDTH 0x00001000
#define FM_INFO_NOT_CONTIGUOUS 0x00002000
#define FM_INFO_TECH_MM 0x00004000
#define FM_INFO_RETURNS_OUTLINES 0x00008000
#define FM_INFO_RETURNS_STROKES 0x00010000
#define FM_INFO_RETURNS_BITMAPS 0x00020000
#define FM_INFO_DSIG 0x00040000 // FM_INFO_UNICODE_COMPLIANT
#define FM_INFO_RIGHT_HANDED 0x00080000
#define FM_INFO_INTEGRAL_SCALING 0x00100000
#define FM_INFO_90DEGREE_ROTATIONS 0x00200000
#define FM_INFO_OPTICALLY_FIXED_PITCH 0x00400000
#define FM_INFO_DO_NOT_ENUMERATE 0x00800000
#define FM_INFO_ISOTROPIC_SCALING_ONLY 0x01000000
#define FM_INFO_ANISOTROPIC_SCALING_ONLY 0x02000000
#define FM_INFO_TECH_CFF 0x04000000
#define FM_INFO_FAMILY_EQUIV 0x08000000
#define FM_INFO_DBCS_FIXED_PITCH 0x10000000
#define FM_INFO_NONNEGATIVE_AC 0x20000000
#define FM_INFO_IGNORE_TC_RA_ABLE 0x40000000
#define FM_INFO_TECH_TYPE1 0x80000000
// max number of charsets supported in a tt font, 16 according to win95 guys
#define MAXCHARSETS 16
//
// IFIMETRICS::ulPanoseCulture
//
#define FM_PANOSE_CULTURE_LATIN 0x0
//
// IFMETRICS::fsSelection flags
//
#define FM_SEL_ITALIC 0x0001
#define FM_SEL_UNDERSCORE 0x0002
#define FM_SEL_NEGATIVE 0x0004
#define FM_SEL_OUTLINED 0x0008
#define FM_SEL_STRIKEOUT 0x0010
#define FM_SEL_BOLD 0x0020
#define FM_SEL_REGULAR 0x0040
//
// The FONTDIFF structure contains all of the fields that could
// possibly change under simulation
//
typedef struct _FONTDIFF { BYTE jReserved1; // 0x0
BYTE jReserved2; // 0x1
BYTE jReserved3; // 0x2
BYTE bWeight; // 0x3 Panose Weight
USHORT usWinWeight; // 0x4
FSHORT fsSelection; // 0x6
FWORD fwdAveCharWidth; // 0x8
FWORD fwdMaxCharInc; // 0xA
POINTL ptlCaret; // 0xC
} FONTDIFF;
typedef struct _FONTSIM { PTRDIFF dpBold; // offset from beginning of FONTSIM to FONTDIFF
PTRDIFF dpItalic; // offset from beginning of FONTSIM to FONTDIFF
PTRDIFF dpBoldItalic; // offset from beginning of FONTSIM to FONTDIFF
} FONTSIM;
typedef struct _IFIMETRICS { ULONG cjThis; // includes attached information
ULONG cjIfiExtra; // sizeof IFIEXTRA if any, formerly ulVersion
PTRDIFF dpwszFamilyName; PTRDIFF dpwszStyleName; PTRDIFF dpwszFaceName; PTRDIFF dpwszUniqueName; PTRDIFF dpFontSim; LONG lEmbedId; LONG lItalicAngle; LONG lCharBias;
// dpCharSet field replaced alReserved[0].
// If the 3.51 pcl minidrivers are still to work on NT 4.0 this field must not
// move because they will have 0 at this position.
PTRDIFF dpCharSets; // only used if > 1 charset supported
BYTE jWinCharSet; // as in LOGFONT::lfCharSet
BYTE jWinPitchAndFamily; // as in LOGFONT::lfPitchAndFamily
USHORT usWinWeight; // as in LOGFONT::lfWeight
ULONG flInfo; // see above
USHORT fsSelection; // see above
USHORT fsType; // see above
FWORD fwdUnitsPerEm; // em height
FWORD fwdLowestPPEm; // readable limit
FWORD fwdWinAscender; FWORD fwdWinDescender; FWORD fwdMacAscender; FWORD fwdMacDescender; FWORD fwdMacLineGap; FWORD fwdTypoAscender; FWORD fwdTypoDescender; FWORD fwdTypoLineGap; FWORD fwdAveCharWidth; FWORD fwdMaxCharInc; FWORD fwdCapHeight; FWORD fwdXHeight; FWORD fwdSubscriptXSize; FWORD fwdSubscriptYSize; FWORD fwdSubscriptXOffset; FWORD fwdSubscriptYOffset; FWORD fwdSuperscriptXSize; FWORD fwdSuperscriptYSize; FWORD fwdSuperscriptXOffset; FWORD fwdSuperscriptYOffset; FWORD fwdUnderscoreSize; FWORD fwdUnderscorePosition; FWORD fwdStrikeoutSize; FWORD fwdStrikeoutPosition; BYTE chFirstChar; // for win 3.1 compatibility
BYTE chLastChar; // for win 3.1 compatibility
BYTE chDefaultChar; // for win 3.1 compatibility
BYTE chBreakChar; // for win 3.1 compatibility
WCHAR wcFirstChar; // lowest supported code in Unicode set
WCHAR wcLastChar; // highest supported code in Unicode set
WCHAR wcDefaultChar; WCHAR wcBreakChar; POINTL ptlBaseline; //
POINTL ptlAspect; // designed aspect ratio (bitmaps)
POINTL ptlCaret; // points along caret
RECTL rclFontBox; // bounding box for all glyphs (font space)
BYTE achVendId[4]; // as per TrueType
ULONG cKerningPairs; ULONG ulPanoseCulture; PANOSE panose;
#if defined(_WIN64)
//
// IFIMETRICS must begin on a 64-bit boundary
//
PVOID Align;
#endif
} IFIMETRICS, *PIFIMETRICS;
// rather than adding the fields of IFIEXTRA to IFIMETRICS itself
// we add them as a separate structure. This structure, if present at all,
// lies below IFIMETRICS in memory.
// If IFIEXTRA is present at all, ifi.cjIfiExtra (formerly ulVersion)
// will contain size of IFIEXTRA including any reserved fields.
// That way ulVersion = 0 (NT 3.51 or less) printer minidrivers
// will work with NT 4.0.
typedef struct _IFIEXTRA { ULONG ulIdentifier; // used for Type 1 fonts only
PTRDIFF dpFontSig; // nontrivial for tt only, at least for now.
ULONG cig; // maxp->numGlyphs, # of distinct glyph indicies
PTRDIFF dpDesignVector; // offset to design vector for mm instances
PTRDIFF dpAxesInfoW; // offset to full axes info for base mm font
ULONG aulReserved[1]; // in case we need even more stuff in the future
} IFIEXTRA, *PIFIEXTRA;
#define SIZEOFDV(cAxes) (offsetof(DESIGNVECTOR,dvValues) + (cAxes)*sizeof(LONG))
#define SIZEOFAXIW(cAxes) (offsetof(AXESLISTW,axlAxisInfo) + (cAxes)*sizeof(AXISINFOW))
#define SIZEOFAXIA(cAxes) (offsetof(AXESLISTA,axlAxisInfo) + (cAxes)*sizeof(AXISINFOA))
/**************************************************************************\
* \**************************************************************************/
/* OpenGL DDI ExtEscape escape numbers (4352 - 4607) */
#define OPENGL_CMD 4352 /* for OpenGL ExtEscape */
#define OPENGL_GETINFO 4353 /* for OpenGL ExtEscape */
#define WNDOBJ_SETUP 4354 /* for live video ExtEscape */
/**************************************************************************\
* Display Driver version numbers * * Note: DDI_DRIVER_VERSION has been removed. Drivers must specify * what version of the DDI they support using one of the below * DDI_DRIVER_VERSION_Xxx macros. * DDI_DRIVER_VERSION_NT4 is equivalent to old DDI_DRIVER_VERSION. \**************************************************************************/
#define DDI_DRIVER_VERSION_NT4 0x00020000
#define DDI_DRIVER_VERSION_SP3 0x00020003
#define DDI_DRIVER_VERSION_NT5 0x00030000
#define DDI_DRIVER_VERSION_NT5_01 0x00030100
#define DDI_DRIVER_VERSION_NT5_01_SP1 0x00030101
#define GDI_DRIVER_VERSION 0x4000 /* for NT version 4.0.00 */
typedef LONG_PTR (APIENTRY *PFN)();
typedef struct _DRVFN /* drvfn */ { ULONG iFunc; PFN pfn; } DRVFN, *PDRVFN;
/* Required functions */
#define INDEX_DrvEnablePDEV 0L
#define INDEX_DrvCompletePDEV 1L
#define INDEX_DrvDisablePDEV 2L
#define INDEX_DrvEnableSurface 3L
#define INDEX_DrvDisableSurface 4L
/* Other functions */
#define INDEX_DrvAssertMode 5L
#define INDEX_DrvOffset 6L // Obsolete
#define INDEX_DrvResetPDEV 7L
#define INDEX_DrvDisableDriver 8L
#define INDEX_DrvCreateDeviceBitmap 10L
#define INDEX_DrvDeleteDeviceBitmap 11L
#define INDEX_DrvRealizeBrush 12L
#define INDEX_DrvDitherColor 13L
#define INDEX_DrvStrokePath 14L
#define INDEX_DrvFillPath 15L
#define INDEX_DrvStrokeAndFillPath 16L
#define INDEX_DrvPaint 17L
#define INDEX_DrvBitBlt 18L
#define INDEX_DrvCopyBits 19L
#define INDEX_DrvStretchBlt 20L
#define INDEX_DrvSetPalette 22L
#define INDEX_DrvTextOut 23L
#define INDEX_DrvEscape 24L
#define INDEX_DrvDrawEscape 25L
#define INDEX_DrvQueryFont 26L
#define INDEX_DrvQueryFontTree 27L
#define INDEX_DrvQueryFontData 28L
#define INDEX_DrvSetPointerShape 29L
#define INDEX_DrvMovePointer 30L
#define INDEX_DrvLineTo 31L
#define INDEX_DrvSendPage 32L
#define INDEX_DrvStartPage 33L
#define INDEX_DrvEndDoc 34L
#define INDEX_DrvStartDoc 35L
#define INDEX_DrvGetGlyphMode 37L
#define INDEX_DrvSynchronize 38L
#define INDEX_DrvSaveScreenBits 40L
#define INDEX_DrvGetModes 41L
#define INDEX_DrvFree 42L
#define INDEX_DrvDestroyFont 43L
#define INDEX_DrvQueryFontCaps 44L
#define INDEX_DrvLoadFontFile 45L
#define INDEX_DrvUnloadFontFile 46L
#define INDEX_DrvFontManagement 47L
#define INDEX_DrvQueryTrueTypeTable 48L
#define INDEX_DrvQueryTrueTypeOutline 49L
#define INDEX_DrvGetTrueTypeFile 50L
#define INDEX_DrvQueryFontFile 51L
#define INDEX_DrvMovePanning 52L
#define INDEX_DrvQueryAdvanceWidths 53L
#define INDEX_DrvSetPixelFormat 54L
#define INDEX_DrvDescribePixelFormat 55L
#define INDEX_DrvSwapBuffers 56L
#define INDEX_DrvStartBanding 57L
#define INDEX_DrvNextBand 58L
#define INDEX_DrvGetDirectDrawInfo 59L
#define INDEX_DrvEnableDirectDraw 60L
#define INDEX_DrvDisableDirectDraw 61L
#define INDEX_DrvQuerySpoolType 62L
#define INDEX_DrvIcmCreateColorTransform 64L
#define INDEX_DrvIcmDeleteColorTransform 65L
#define INDEX_DrvIcmCheckBitmapBits 66L
#define INDEX_DrvIcmSetDeviceGammaRamp 67L
#define INDEX_DrvGradientFill 68L
#define INDEX_DrvStretchBltROP 69L
#define INDEX_DrvPlgBlt 70L
#define INDEX_DrvAlphaBlend 71L
#define INDEX_DrvSynthesizeFont 72L
#define INDEX_DrvGetSynthesizedFontFiles 73L
#define INDEX_DrvTransparentBlt 74L
#define INDEX_DrvQueryPerBandInfo 75L
#define INDEX_DrvQueryDeviceSupport 76L
#define INDEX_DrvReserved1 77L
#define INDEX_DrvReserved2 78L
#define INDEX_DrvReserved3 79L
#define INDEX_DrvReserved4 80L
#define INDEX_DrvReserved5 81L
#define INDEX_DrvReserved6 82L
#define INDEX_DrvReserved7 83L
#define INDEX_DrvReserved8 84L
#define INDEX_DrvDeriveSurface 85L
#define INDEX_DrvQueryGlyphAttrs 86L
#define INDEX_DrvNotify 87L
#define INDEX_DrvSynchronizeSurface 88L
#define INDEX_DrvResetDevice 89L
#define INDEX_DrvReserved9 90L
#define INDEX_DrvReserved10 91L
#define INDEX_DrvReserved11 92L
/* The total number of dispatched functions */
#define INDEX_LAST 93L
typedef struct tagDRVENABLEDATA { ULONG iDriverVersion; ULONG c; DRVFN *pdrvfn; } DRVENABLEDATA, *PDRVENABLEDATA;
typedef struct tagDEVINFO { FLONG flGraphicsCaps; LOGFONTW lfDefaultFont; LOGFONTW lfAnsiVarFont; LOGFONTW lfAnsiFixFont; ULONG cFonts; ULONG iDitherFormat; USHORT cxDither; USHORT cyDither; HPALETTE hpalDefault; FLONG flGraphicsCaps2; } DEVINFO, *PDEVINFO;
// flGraphicsCaps flags for DEVINFO:
#define GCAPS_BEZIERS 0x00000001
#define GCAPS_GEOMETRICWIDE 0x00000002
#define GCAPS_ALTERNATEFILL 0x00000004
#define GCAPS_WINDINGFILL 0x00000008
#define GCAPS_HALFTONE 0x00000010
#define GCAPS_COLOR_DITHER 0x00000020
#define GCAPS_HORIZSTRIKE 0x00000040 // Obsolete
#define GCAPS_VERTSTRIKE 0x00000080 // Obsolete
#define GCAPS_OPAQUERECT 0x00000100
#define GCAPS_VECTORFONT 0x00000200
#define GCAPS_MONO_DITHER 0x00000400
#define GCAPS_ASYNCCHANGE 0x00000800 // Obsolete
#define GCAPS_ASYNCMOVE 0x00001000
#define GCAPS_DONTJOURNAL 0x00002000
#define GCAPS_DIRECTDRAW 0x00004000 // Obsolete
#define GCAPS_ARBRUSHOPAQUE 0x00008000
#define GCAPS_PANNING 0x00010000
#define GCAPS_HIGHRESTEXT 0x00040000
#define GCAPS_PALMANAGED 0x00080000
#define GCAPS_DITHERONREALIZE 0x00200000
#define GCAPS_NO64BITMEMACCESS 0x00400000 // Obsolete
#define GCAPS_FORCEDITHER 0x00800000
#define GCAPS_GRAY16 0x01000000
#define GCAPS_ICM 0x02000000
#define GCAPS_CMYKCOLOR 0x04000000
#define GCAPS_LAYERED 0x08000000
#define GCAPS_ARBRUSHTEXT 0x10000000
#define GCAPS_SCREENPRECISION 0x20000000
#define GCAPS_FONT_RASTERIZER 0x40000000 // the device has built in tt rasterizer
#define GCAPS_NUP 0x80000000
// flGraphicsCaps2 flags for DEVINFO:
#define GCAPS2_JPEGSRC 0x00000001
#define GCAPS2_xxxx 0x00000002
#define GCAPS2_PNGSRC 0x00000008
#define GCAPS2_CHANGEGAMMARAMP 0x00000010
#define GCAPS2_ALPHACURSOR 0x00000020
#define GCAPS2_SYNCFLUSH 0x00000040
#define GCAPS2_SYNCTIMER 0x00000080
#define GCAPS2_ICD_MULTIMON 0x00000100
#define GCAPS2_MOUSETRAILS 0x00000200
#define GCAPS2_RESERVED1 0x00000400
typedef struct _LINEATTRS { FLONG fl; ULONG iJoin; ULONG iEndCap; FLOAT_LONG elWidth; FLOATL eMiterLimit; ULONG cstyle; PFLOAT_LONG pstyle; FLOAT_LONG elStyleState; } LINEATTRS, *PLINEATTRS;
#define LA_GEOMETRIC 0x00000001
#define LA_ALTERNATE 0x00000002
#define LA_STARTGAP 0x00000004
#define LA_STYLED 0x00000008
#define JOIN_ROUND 0L
#define JOIN_BEVEL 1L
#define JOIN_MITER 2L
#define ENDCAP_ROUND 0L
#define ENDCAP_SQUARE 1L
#define ENDCAP_BUTT 2L
typedef LONG LDECI4;
typedef struct _XFORML { FLOATL eM11; FLOATL eM12; FLOATL eM21; FLOATL eM22; FLOATL eDx; FLOATL eDy; } XFORML, *PXFORML;
typedef struct _CIECHROMA { LDECI4 x; LDECI4 y; LDECI4 Y; }CIECHROMA;
typedef struct _COLORINFO { CIECHROMA Red; CIECHROMA Green; CIECHROMA Blue; CIECHROMA Cyan; CIECHROMA Magenta; CIECHROMA Yellow; CIECHROMA AlignmentWhite;
LDECI4 RedGamma; LDECI4 GreenGamma; LDECI4 BlueGamma;
LDECI4 MagentaInCyanDye; LDECI4 YellowInCyanDye; LDECI4 CyanInMagentaDye; LDECI4 YellowInMagentaDye; LDECI4 CyanInYellowDye; LDECI4 MagentaInYellowDye; }COLORINFO, *PCOLORINFO;
// Allowed values for GDIINFO.ulPrimaryOrder.
#define PRIMARY_ORDER_ABC 0
#define PRIMARY_ORDER_ACB 1
#define PRIMARY_ORDER_BAC 2
#define PRIMARY_ORDER_BCA 3
#define PRIMARY_ORDER_CBA 4
#define PRIMARY_ORDER_CAB 5
// Allowed values for GDIINFO.ulHTPatternSize.
#define HT_PATSIZE_2x2 0
#define HT_PATSIZE_2x2_M 1
#define HT_PATSIZE_4x4 2
#define HT_PATSIZE_4x4_M 3
#define HT_PATSIZE_6x6 4
#define HT_PATSIZE_6x6_M 5
#define HT_PATSIZE_8x8 6
#define HT_PATSIZE_8x8_M 7
#define HT_PATSIZE_10x10 8
#define HT_PATSIZE_10x10_M 9
#define HT_PATSIZE_12x12 10
#define HT_PATSIZE_12x12_M 11
#define HT_PATSIZE_14x14 12
#define HT_PATSIZE_14x14_M 13
#define HT_PATSIZE_16x16 14
#define HT_PATSIZE_16x16_M 15
#define HT_PATSIZE_SUPERCELL 16
#define HT_PATSIZE_SUPERCELL_M 17
#define HT_PATSIZE_USER 18
#define HT_PATSIZE_MAX_INDEX HT_PATSIZE_USER
#define HT_PATSIZE_DEFAULT HT_PATSIZE_SUPERCELL_M
#define HT_USERPAT_CX_MIN 4
#define HT_USERPAT_CX_MAX 256
#define HT_USERPAT_CY_MIN 4
#define HT_USERPAT_CY_MAX 256
// Allowed values for GDIINFO.ulHTOutputFormat.
#define HT_FORMAT_1BPP 0
#define HT_FORMAT_4BPP 2
#define HT_FORMAT_4BPP_IRGB 3
#define HT_FORMAT_8BPP 4
#define HT_FORMAT_16BPP 5
#define HT_FORMAT_24BPP 6
#define HT_FORMAT_32BPP 7
// Allowed values for GDIINFO.flHTFlags.
#define HT_FLAG_SQUARE_DEVICE_PEL 0x00000001
#define HT_FLAG_HAS_BLACK_DYE 0x00000002
#define HT_FLAG_ADDITIVE_PRIMS 0x00000004
#define HT_FLAG_USE_8BPP_BITMASK 0x00000008
#define HT_FLAG_INK_HIGH_ABSORPTION 0x00000010
#define HT_FLAG_INK_ABSORPTION_INDICES 0x00000060
#define HT_FLAG_DO_DEVCLR_XFORM 0x00000080
#define HT_FLAG_OUTPUT_CMY 0x00000100
#define HT_FLAG_PRINT_DRAFT_MODE 0x00000200
#define HT_FLAG_INVERT_8BPP_BITMASK_IDX 0x00000400
#define HT_FLAG_8BPP_CMY332_MASK 0xFF000000
#define MAKE_CMYMASK_BYTE(c,m,y) ((BYTE)(((BYTE)(c) & 0x07) << 5) | \
(BYTE)(((BYTE)(m) & 0x07) << 2) | \ (BYTE)((BYTE)(y) & 0x03))
#define MAKE_CMY332_MASK(c,m,y) ((DWORD)(((DWORD)(c) & 0x07) << 29) | \
(DWORD)(((DWORD)(m) & 0x07) << 26) | \ (DWORD)(((DWORD)(y) & 0x03) << 24))
#define HT_FLAG_INK_ABSORPTION_IDX0 0x00000000
#define HT_FLAG_INK_ABSORPTION_IDX1 0x00000020
#define HT_FLAG_INK_ABSORPTION_IDX2 0x00000040
#define HT_FLAG_INK_ABSORPTION_IDX3 0x00000060
#define HT_FLAG_HIGHEST_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION | \
HT_FLAG_INK_ABSORPTION_IDX3) #define HT_FLAG_HIGHER_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION | \
HT_FLAG_INK_ABSORPTION_IDX2) #define HT_FLAG_HIGH_INK_ABSORPTION (HT_FLAG_INK_HIGH_ABSORPTION | \
HT_FLAG_INK_ABSORPTION_IDX1) #define HT_FLAG_NORMAL_INK_ABSORPTION HT_FLAG_INK_ABSORPTION_IDX0
#define HT_FLAG_LOW_INK_ABSORPTION (HT_FLAG_INK_ABSORPTION_IDX1)
#define HT_FLAG_LOWER_INK_ABSORPTION (HT_FLAG_INK_ABSORPTION_IDX2)
#define HT_FLAG_LOWEST_INK_ABSORPTION (HT_FLAG_INK_ABSORPTION_IDX3)
// Setting/checking halftone 8bpp bitmask RGB mode
#define HT_BITMASKPALRGB (DWORD)'0BGR'
#define HT_SET_BITMASKPAL2RGB(pPal) (*((LPDWORD)(pPal)) = HT_BITMASKPALRGB)
#define HT_IS_BITMASKPALRGB(pPal) (*((LPDWORD)(pPal)) == (DWORD)0)
// Allowed values for GDIINFO.ulPhysicalPixelCharacteristics
#define PPC_DEFAULT 0x0
#define PPC_UNDEFINED 0x1
#define PPC_RGB_ORDER_VERTICAL_STRIPES 0x2
#define PPC_BGR_ORDER_VERTICAL_STRIPES 0x3
#define PPC_RGB_ORDER_HORIZONTAL_STRIPES 0x4
#define PPC_BGR_ORDER_HORIZONTAL_STRIPES 0x5
// GDIINFO.ulPhysicalPixelGamma should be set either to the scaled
// gamma (x1000) of the physical pixel or one of the following
// values. For example, a 2.2 gamma would be represented as 2200
#define PPG_DEFAULT 0
#define PPG_SRGB 1
//============================================================================
// HALFTONE INFORMATION
//============================================================================
//
// HT_FLAG_DO_DEVCLR_XFORM flag specified devices and/or drivers are required
// gdi halftone to do a device transform when ICM is off, the device transform
// take a input RGB value and map it to the device color space to produced
// perceived density same as input RGB color values. This flag only valid if
// it is a printer device surface and its format is 16bpp or 24bpp.
//
// ** If devices are additive and/or device surface is 1bpp, 4bpp or 8bpp, then
// gdi halftone will always performed device transform regardless the
// setting of HT_FLAG_DO_DEVCLR_XFORM flag.
//
// HT_FLAG_8BPP_CMY332_MASK - define the bit mask for 8-bpp format halftone
// palette, this palette only used if a HT_FORMAT_8BPP is specified in
// flHTOutputFormat and HT_FLAG_USE_8BPP_BITMASK bit is set in the flHTFlags.
// if HT_FLAG_USE_8BPP_BITMAP is not set then a standard NT4.0 8-bpp format is
// assumed. The format of 8BPP is set per PDEV, it cannot be changed after
// the pDEV is created.
//
// To set HT_FLAG_8BPP_CMY332_MASK, macro MAKE_CMY332_MASK() can be used. When
// specified, the bit mask cover total of 8 bits area which describe the
// highest of level of CYAN, MAGENTA and YELLOW primary color, the maximum of
// Cyan is 3 bits (7 levels), Magenta is 3 bits (7 levels) and Yellow is 2 bit
// (3 levels).
//
// CMYMask Meaning
// ======= =======
// 0x6F Cyan=3, Magenta=3, Yellow=3
// 0xFF Cyan=7, Magenta=7, Yellow=3
// 0x25 Cyan=1, Magenta=1, Yellow=1, is same as using CMY 4bpp
//
// SPECIAL
// CMYMask Meagning
// ======= =======
// 0x00 Gray scale 256 levels
// 0x01 5 Levels (0-4) each of Cyan, Magenta and yellow, 5^3=125 color
// 0x02 6 Levels (0-5) each of Cyan, Magenta and yellow, 6^3=216 color
//
// Any other invalid combinations (any of Cyan, Magenta, Yellow level bits is
// 0 (zero) then it will returned palette entries 0
//
// The Palette indics are arranged as CMY entries with CYAN at highest bit
// numbers and YELLOW at lowest bit number as shown below for palette indics
// bit's (8 bit) definition.
//
// Pallete Index BIT#: 7 6 5 4 3 2 1 0
// | | | | | |
// +---C---+ +---M---+ +-Y-+
// | | |
// | | 0x03
// | | +-- Yellow 0-3, Max=4 levels
// | 0x1c
// | +-- Magenta 0-7, Max=8 levels
// 0xe0
// +-- Cyan 0-7, Max=8 levels
//
//
// If a primray color level in an index is greater than the prmary color
// levels then it is eqaul to the maximum primary color level, for example
// if C=7 (0xe0), and Cyan level only 5 then level 6 and 7 are same as 5
//
// To retrieve the palette definition for 8bpp format, use
//
// LONG APIENTRY
// HT_Get8BPPMaskPalette(PPALETTEENTRY pPaletteEntry,
// BOOL Use8BPPMaskPal,
// BYTE CMYMask,
// USHORT RedGamma,
// USHORT GreenGamma,
// USHORT BlueGamma);
//
// pPaletteEntry - Pointer to the PALETTEENTRY, if NULL it return palette
// count needed,
//
// * See note below for the pPaletteEntry[0] special settings.
//
// Use8BPPmaskPal - FALSE if a NT4.0 standard 8bpp palette requested, FALSE
// if a CMYMask 8bpp mask palette is needed.
//
// CMYMask - CMY bit mask for CMY as defined above. This must be the
// same primary level as defined in GDIInfo.flHTFlags.
// It should be same as ((GDIInfo.flHTFlags >> 24) & 0xFF).
// The CMYMask also can be specified using predefined macro
// MAKS_CMYMASK_BYTE(cLevel, mLevel, yLevel)
//
// RedGamma - Red gamma if Use8BPPMaskPal is FALSE, Cyan gamma
// if Use8BPPMaskPal is TRUE
//
// GreenGamma - Green gamma if Use8BPPMaskPal is FALSE, Magenta gamma
// if Use8BPPMaskPal is TRUE
//
// BlueGamma - Blue gamma if Use8BPPMaskPal is FALSE, Yellow gamma
// if Use8BPPMaskPal is TRUE
//
//
// ***************************************************************************
// * SPECIAL NOTE for Windows NT version later than Windows 2000 Release *
// ***************************************************************************
// Current version of Window NT (Post Windows 2000) will Overloading the
// pPaletteEntry in HT_Get8BPPMaskPalette(DoUseCMYMask) API to returned a
// inverted indices palette based on additive palette entries composition.
// Because Windows GDI ROP assume index 0 always black and last index always
// white without checking the palette entries. (Indices based ROPs rather color
// based) This cause many ROPS got wrong result which has inverted output.
//
// To correct this GDI ROPs behavior, the POST windows 2000 version of GDI
// Halftone will supports a special CMY_INVERTED format. All new drivers should
// use this CMY_INVERTED method for future compabilities
//
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @ Following Steps are required for ALL POST Windows 2000 Drivers when @
// @ using Window GDI Halftone 8bpp CMY332 Mask mode @
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//
// 1. Must set HT_FLAG_INVERT_8BPP_BITMASK_IDX flags
//
// 2. Must set pPaleteEntry[0] when calling HT_Get8BPPMaskPalette() with
//
// pPaletteEntry[0].peRed = 'R';
// pPaletteEntry[0].peGreen = 'G';
// pPaletteEntry[0].peBlue = 'B';
// pPaletteEntry[0].peFlags = '0';
//
// The caller can use following supplied macro to set this for future
// compabilities
//
// HT_SET_BITMASKPAL2RGB(pPaletteEntry)
//
// where pPaletteEntry is the pointer to the PALETTEENTRY that passed to
// the HT_GET8BPPMaskPalette() fucntion call
//
// 3. Must Check the return Palette from HT_Get8BPPMaskPalette() using
// following Macro
//
// HT_IS_BITMASKPALRGB(pPaletteEntry)
//
// where pPaletteEntry is the pointer to the PALETTEENTRY that passed to the
// HT_GET8BPPMaskPalette() fucntion call,
//
// If this macro return FALSE then the current version of GDI HALFTONE does
// NOT support the CMY_INVERTED 8bpp bitmaask mode and it only supports CMY
// mode.
//
// If this macro return TRUE then the GDI HALFTONE DOES support the
// CMY_INVERTED 8bpp bitmaask mode and the caller must using a translation
// table to obtain final halftone surface bitmap 8bpp indices ink levels.
//
// 4. Behavior changes for GDI halftone that supports 8bpp CMY_INVERTED bitmask
// mode, following is a list of changes of CMYMask mode passed to
// the HT_Get8BPPMaskPalette()
//
// CMYMask CMY Mode Indices CMY_INVERTED Mode Indices
// ======= ========================= =============================
// 0 0: WHITE 0: BLACK
// 1-254: Light->Dark Gray 1-254: Dark->Light Gray
// 255: BLACK 255: WHITE
// -------------------------------------------------------------------
// 1 0: WHITE 0-65: BLACK
// 1-123: 5^3 CMY color 66-188: 5^3 RGB color
// 124-255: BLACK 189-255: WHITE
// 127-128: Duplicate for XOR ROP
// (CMY Levels 2:2:2)
// -------------------------------------------------------------------
// 2 0: WHITE 0-20: BLACK
// 1-214: 6^3 CMY color 21-234: 6^3 RGB color
// 215-255: BLACK 235-255: WHITE
// -------------------------------------------------------------------
// 3-255* 0: WHITE 0: BLACK
// 1-254: CMY Color BitMask 1-254: Centered CxMxY BitMask*
// 255: BLACK 255: WHITE
// ===================================================================
//
// * For CMYMask mode 3-255, the valid combination must NOT have any
// of Cyan, Magenta or Yellow ink level equal to 0.
//
// * The reason for CMY_INVERTED mode that pading BLACK and WHITE entires
// at both end and have all other color in the middle is to make sure
// all 256 color palette entries are even distributed so that GDI ROPs
// (raster operation) will work more correctly. This is because GDI ROPs
// are based on the indices not color
//
// * The CMY_INVERTED Mode has all non-black, non white indices centered
// and even distributed within the total 256 palette indices. For
// example; if a CMY=333 levels then it has total 3x3x3=27 indices,
// these 27 indices will be centered by packing 114 black indices at
// begining and packing 114 white indices at end to ensure that ROP
// will be correct rendered.
//
// See following sample function of for how to generate these ink levels
// and Windows 2000 CMY332 Index translation table
//
//
// 5. For CMYMask index mode 0 to 255, the caller can use following sample
// function to genrate INKLEVELS translation table
//
// The follwing structure and tables are examples of how to translate 8bpp
// bitmask halftone bitmap indices to ink levels
//
// typedef struct _INKLEVELS {
// BYTE Cyan; // Cyan level from 0 to max
// BYTE Magenta; // Magenta level from 0 to max
// BYTE Yellow; // Yellow level from 0 to max
// BYTE CMY332Idx; // Original windows 2000 CMY332 Index
// } INKLEVELS, *PINKLEVELS;
//
// To Compute a 8bpp translate table of INKLEVELS, following sample
// function show how to genrate a INKLEVELS translate table for a valid
// CMYMask range from 0 to 255. It can be use to generate either Windows
// 2000 CMY Mode or new Post Windows 2000's CMY_INVERTED mode translation
// table. It also generate a windows 2000 CMY Mode CMY332Idx so caller
// can map CMY_INVERTED new indices to old index for current existing
// indices processing function.
//
// Example Function that generate translate table for CMYMask 0 to 255,
// the pInkLevels must pointed to a valid memory location of 256 INKLEVELS
// entries, if return value is TRUE then it can be used to trnaslate 8bpp
// indices to ink levels or mapp to the older CMY332 style indices.
//
//
// BOOL
// GenerateInkLevels(
// PINKLEVELS pInkLevels, // Pointer to 256 INKLEVELS table
// BYTE CMYMask, // CMYMask mode
// BOOL CMYInverted // TRUE for CMY_INVERTED mode
// )
// {
// PINKLEVELS pILDup;
// PINKLEVELS pILEnd;
// INKLEVELS InkLevels;
// INT Count;
// INT IdxInc;
// INT cC;
// INT cM;
// INT cY;
// INT xC;
// INT xM;
// INT xY;
// INT iC;
// INT iM;
// INT iY;
// INT mC;
// INT mM;
//
//
// switch (CMYMask) {
//
// case 0:
//
// cC =
// cM =
// xC =
// xM = 0;
// cY =
// xY = 255;
// break;
//
// case 1:
// case 2:
//
// cC =
// cM =
// cY =
// xC =
// xM =
// xY = 3 + (INT)CMYMask;
// break;
//
// default:
//
// cC = (INT)((CMYMask >> 5) & 0x07);
// cM = (INT)((CMYMask >> 2) & 0x07);
// cY = (INT)( CMYMask & 0x03);
// xC = 7;
// xM = 7;
// xY = 3;
// break;
// }
//
// Count = (cC + 1) * (cM + 1) * (cY + 1);
//
// if ((Count < 1) || (Count > 256)) {
//
// return(FALSE);
// }
//
// InkLevels.Cyan =
// InkLevels.Magenta =
// InkLevels.Yellow =
// InkLevels.CMY332Idx = 0;
// mC = (xM + 1) * (xY + 1);
// mM = xY + 1;
// pILDup = NULL;
//
// if (CMYInverted) {
//
// //
// // Move the pInkLevels to the first entry which center around
// // 256 table entries, if we skip any then all entries skipped
// // will be white (CMY levels all zeros). Because this is
// // CMY_INVERTED so entries start from back of the table and
// // moving backward to the begining of the table
// //
//
// pILEnd = pInkLevels - 1;
// IdxInc = ((256 - Count - (Count & 0x01)) / 2);
// pInkLevels += 255;
//
// while (IdxInc--) {
//
// *pInkLevels-- = InkLevels;
// }
//
// if (Count & 0x01) {
//
// //
// // If we have odd number of entries then we need to
// // duplicate the center one for correct XOR ROP to
// // operated correctly. The pILDup will always be index
// // 127, the duplication are indices 127, 128
// //
//
// pILDup = pInkLevels - (Count / 2) - 1;
// }
//
// //
// // We running from end of table to the begining, because
// // when in CMYInverted mode, the index 0 is black and index
// // 255 is white. Since we only generate 'Count' of index
// // and place them at center, we will change xC, xM, xY max.
// // index to same as cC, cM and cY.
// //
//
// IdxInc = -1;
// xC = cC;
// xM = cM;
// xY = cY;
//
// } else {
//
// IdxInc = 1;
// pILEnd = pInkLevels + 256;
// }
//
// //
// // At following, the composition of ink levels, index always
// // from 0 CMY Ink levels (WHITE) to maximum ink levels (BLACK),
// // the different with CMY_INVERTED mode is we compose it from
// // index 255 to index 0 rather than from index 0 to 255
// //
//
// if (CMYMask) {
//
// INT Idx332C;
// INT Idx332M;
//
// for (iC = 0, Idx332C = -mC; iC <= xC; iC++) {
//
// if (iC <= cC) {
//
// InkLevels.Cyan = (BYTE)iC;
// Idx332C += mC;
// }
//
// for (iM = 0, Idx332M = -mM; iM <= xM; iM++) {
//
// if (iM <= cM) {
//
// InkLevels.Magenta = (BYTE)iM;
// Idx332M += mM;
// }
//
// for (iY = 0; iY <= xY; iY++) {
//
// if (iY <= cY) {
//
// InkLevels.Yellow = (BYTE)iY;
// }
//
// InkLevels.CMY332Idx = (BYTE)(Idx332C + Idx332M) +
// InkLevels.Yellow;
// *pInkLevels = InkLevels;
//
// if ((pInkLevels += IdxInc) == pILDup) {
//
// *pInkLevels = InkLevels;
// pInkLevels += IdxInc;
// }
// }
// }
// }
//
// //
// // Now if we need to pack black at other end of the
// // translation table then do it here, Notice that InkLevels
// // are at cC, cM and cY here and the CMY332Idx is at BLACK
// //
//
// while (pInkLevels != pILEnd) {
//
// *pInkLevels = InkLevels;
// pInkLevels += IdxInc;
// }
//
// } else {
//
// //
// // Gray Scale case
// //
//
// for (iC = 0; iC < 256; iC++, pInkLevels += IdxInc) {
//
// pInkLevels->Cyan =
// pInkLevels->Magenta =
// pInkLevels->Yellow =
// pInkLevels->CMY332Idx = (BYTE)iC;
// }
// }
//
// return(TRUE);
// }
//
//
// 6. For CMYMask Mode 0 (Gray scale), the gray scale table just inverted
// between CMY and CMY_INVERTED mode.
//
// CMY mode: 0 to 255 gray scale from WHITE to BLACK increment,
// CMY_INVERTED Mode: 0 to 255 gray scale from BLACK to WHITE increment.
//
//
// 7. For CMYMask Mode 1 and 2, the caller should use a translation table for
// translate indices to CMY ink levels.
//
// 8. For CMYMode mode 3 to 255,
//
// if in CMY Mode (Windows 2000) is specified then The final CMY ink levels
// indices byte has following meanings
//
// Bit 7 6 5 4 3 2 1 0
// | | | | | |
// +---+ +---+ +=+
// | | |
// | | +-- Yellow 0-3 (Max. 4 levels)
// | |
// | +-- Magenta 0-7 (Max. 8 levels)
// |
// +-- Cyan 0-7 (Max. 8 levels)
//
//
// If a CMY_INVERTED mode is specified then caller must use a translation
// table to convert a index to the ink levels, to generate this table,
// please see above #5 description.
//
//============================================================================
// END HALFTONE INFORMATION
//============================================================================
typedef struct _GDIINFO { ULONG ulVersion; ULONG ulTechnology; ULONG ulHorzSize; ULONG ulVertSize; ULONG ulHorzRes; ULONG ulVertRes; ULONG cBitsPixel; ULONG cPlanes; ULONG ulNumColors; ULONG flRaster; ULONG ulLogPixelsX; ULONG ulLogPixelsY; ULONG flTextCaps;
ULONG ulDACRed; ULONG ulDACGreen; ULONG ulDACBlue;
ULONG ulAspectX; ULONG ulAspectY; ULONG ulAspectXY;
LONG xStyleStep; LONG yStyleStep; LONG denStyleStep;
POINTL ptlPhysOffset; SIZEL szlPhysSize;
ULONG ulNumPalReg;
// These fields are for halftone initialization.
COLORINFO ciDevice; ULONG ulDevicePelsDPI; ULONG ulPrimaryOrder; ULONG ulHTPatternSize; ULONG ulHTOutputFormat; ULONG flHTFlags;
ULONG ulVRefresh; ULONG ulBltAlignment;
ULONG ulPanningHorzRes; ULONG ulPanningVertRes; ULONG xPanningAlignment; ULONG yPanningAlignment;
// The following fields are for user defined halftone dither patterns. These
// fields are only checked if ulHTPatternSize is eqaul to HT_PATSIZE_USER.
//
// The user defined pHTPatA, pHTPatB, pHTPatC pointers correspond to the primary
// color order defined in ulPrimaryOrder as PRIMARY_ORDER_xxx.
//
// The size of halftone dither pattern must range from 4 to 256. For each
// dither pattern, pHTPatA, pHTPatB, pHTPatC must point to a
// valid byte array of (cxHTPat x cyHTPat) size. pHTPatA, pHTPatB and
// pHTPatC may point to the same dither pattern array.
//
// Each byte threshold within the dither pattern defines the additive
// intensity threshold of pixels. A zero threshold value indicates the pixel
// location is ignored (always black), while 1 to 255 threshold values give the
// dither pattern 255 level of grays.
ULONG cxHTPat; // cxHTPat must range from 4-256
ULONG cyHTPat; // cyHTPat must range from 4-256
LPBYTE pHTPatA; // for Primary Color Order A
LPBYTE pHTPatB; // for Primary Color Order B
LPBYTE pHTPatC; // for Primary Color Order C
// Shade and blend caps
ULONG flShadeBlend;
ULONG ulPhysicalPixelCharacteristics; ULONG ulPhysicalPixelGamma;
} GDIINFO, *PGDIINFO;
/*
* User objects */
typedef struct _BRUSHOBJ { ULONG iSolidColor; PVOID pvRbrush; FLONG flColorType; } BRUSHOBJ;
//
// BRUSHOBJ::flColorType
//
#define BR_DEVICE_ICM 0x01
#define BR_HOST_ICM 0x02
#define BR_CMYKCOLOR 0x04
#define BR_ORIGCOLOR 0x08
typedef struct _CLIPOBJ { ULONG iUniq; RECTL rclBounds; BYTE iDComplexity; BYTE iFComplexity; BYTE iMode; BYTE fjOptions; } CLIPOBJ;
typedef struct _DRIVEROBJ DRIVEROBJ;
typedef BOOL (CALLBACK * FREEOBJPROC)(DRIVEROBJ *pDriverObj);
typedef struct _DRIVEROBJ { PVOID pvObj; FREEOBJPROC pFreeProc; HDEV hdev; DHPDEV dhpdev; } DRIVEROBJ;
typedef struct _FONTOBJ { ULONG iUniq; ULONG iFace; ULONG cxMax; FLONG flFontType; ULONG_PTR iTTUniq; ULONG_PTR iFile; SIZE sizLogResPpi; ULONG ulStyleSize; PVOID pvConsumer; PVOID pvProducer; } FONTOBJ;
typedef struct _BLENDOBJ { BLENDFUNCTION BlendFunction; }BLENDOBJ,*PBLENDOBJ;
typedef BYTE GAMMA_TABLES[2][256];
//
// FONTOBJ::flFontType
//
#define FO_TYPE_RASTER RASTER_FONTTYPE /* 0x1 */
#define FO_TYPE_DEVICE DEVICE_FONTTYPE /* 0x2 */
#define FO_TYPE_TRUETYPE TRUETYPE_FONTTYPE /* 0x4 */
#define FO_TYPE_OPENTYPE OPENTYPE_FONTTYPE /* 0X8 */
#define FO_SIM_BOLD 0x00002000
#define FO_SIM_ITALIC 0x00004000
#define FO_EM_HEIGHT 0x00008000
#define FO_GRAY16 0x00010000 /* [1] */
#define FO_NOGRAY16 0x00020000 /* [1] */
#define FO_NOHINTS 0x00040000 /* [3] */
#define FO_NO_CHOICE 0x00080000 /* [3] */
// new accelerators so that printer drivers do not need to look to ifimetrics
#define FO_CFF 0x00100000
#define FO_POSTSCRIPT 0x00200000
#define FO_MULTIPLEMASTER 0x00400000
#define FO_VERT_FACE 0x00800000
#define FO_DBCS_FONT 0X01000000
// cleartype flags for horizontally or vertically striped LCD screen
#define FO_NOCLEARTYPE 0x02000000
#define FO_CLEARTYPE_X 0x10000000
#define FO_CLEARTYPE_Y 0x20000000
#define FO_CLEARTYPENATURAL_X 0x40000000
/**************************************************************************\
* * [1] * * If the FO_GRAY16 flag is set then the bitmaps of the font * are 4-bit per pixel blending (alpha) values. A value of zero * means that the the resulting pixel should be equal to the * background color. If the value of the alpha value is k != 0 * then the resulting pixel must be: * * c0 = background color * c1 = foreground color * b = blending value = (k+1)/16 // {k = 1,2,..,15}
* b = 0 (k = 0) * d0 = gamma[c0], d1 = gamma[c1] // luminance components
* d = (1 - b)*d0 + b*d1 // blended luminance
* c = lambda[d] // blended device voltage
* * where gamma[] takes a color component from application space * to CIE space and labmda[] takes a color from CIE space to * device color space * * GDI will set this bit if it request a font be gray scaled * to 16 values then GDI will set FO_GRAY16 upon entry to * DrvQueryFontData(). If the font driver cannot (or will * not) grayscale a particular realization of a font then the * font provider will zero out FO_GRAY16 and set FO_NOGRAY16 * to inform GDI that * the gray scaling request cannot (or should not) be * satisfied. * * [2] * * The FO_NOHINTS indicates that hints were not used in the formation * of the glyph images. GDI will set this bit to request that hinting * be supressed. The font provider will set this bit accroding to the * rendering scheme that it used in generating the glyph image. * * [3] * * The FO_NO_CHOICE flag indicates that the flags FO_GRAY16 and * FO_NOHINTS must be obeyed if at all possible. * \**************************************************************************/
typedef struct _PALOBJ { ULONG ulReserved; } PALOBJ;
typedef struct _PATHOBJ { FLONG fl; ULONG cCurves; } PATHOBJ;
typedef struct _SURFOBJ { DHSURF dhsurf; HSURF hsurf; DHPDEV dhpdev; HDEV hdev; SIZEL sizlBitmap; ULONG cjBits; PVOID pvBits; PVOID pvScan0; LONG lDelta; ULONG iUniq; ULONG iBitmapFormat; USHORT iType; USHORT fjBitmap; } SURFOBJ;
typedef struct _WNDOBJ { CLIPOBJ coClient; PVOID pvConsumer; RECTL rclClient; SURFOBJ *psoOwner; } WNDOBJ, *PWNDOBJ;
typedef struct _XFORMOBJ { ULONG ulReserved; } XFORMOBJ;
typedef struct _XLATEOBJ { ULONG iUniq; FLONG flXlate; USHORT iSrcType; // Obsolete
USHORT iDstType; // Obsolete
ULONG cEntries; ULONG *pulXlate; } XLATEOBJ;
/*
* BRUSHOBJ callbacks */
PVOID APIENTRY BRUSHOBJ_pvAllocRbrush( BRUSHOBJ *pbo, ULONG cj );
PVOID APIENTRY BRUSHOBJ_pvGetRbrush( BRUSHOBJ *pbo );
ULONG APIENTRY BRUSHOBJ_ulGetBrushColor( BRUSHOBJ *pbo );
HANDLE APIENTRY BRUSHOBJ_hGetColorTransform( BRUSHOBJ *pbo );
/*
* CLIPOBJ callbacks */
#define DC_TRIVIAL 0
#define DC_RECT 1
#define DC_COMPLEX 3
#define FC_RECT 1
#define FC_RECT4 2
#define FC_COMPLEX 3
#define TC_RECTANGLES 0
#define TC_PATHOBJ 2
#define OC_BANK_CLIP 1 // Obsolete
#define CT_RECTANGLES 0L
#define CD_RIGHTDOWN 0L
#define CD_LEFTDOWN 1L
#define CD_RIGHTUP 2L
#define CD_LEFTUP 3L
#define CD_ANY 4L
#define CD_LEFTWARDS 1L
#define CD_UPWARDS 2L
typedef struct _ENUMRECTS { ULONG c; RECTL arcl[1]; } ENUMRECTS;
ULONG APIENTRY CLIPOBJ_cEnumStart( CLIPOBJ *pco, BOOL bAll, ULONG iType, ULONG iDirection, ULONG cLimit );
BOOL APIENTRY CLIPOBJ_bEnum( CLIPOBJ *pco, ULONG cj, ULONG *pul );
PATHOBJ* APIENTRY CLIPOBJ_ppoGetPath( CLIPOBJ* pco );
/*
* FONTOBJ callbacks */
typedef struct _GLYPHBITS { POINTL ptlOrigin; SIZEL sizlBitmap; BYTE aj[1]; } GLYPHBITS;
#define FO_HGLYPHS 0L
#define FO_GLYPHBITS 1L
#define FO_PATHOBJ 2L
#define FD_NEGATIVE_FONT 1L
#define FO_DEVICE_FONT 1L
#define FO_OUTLINE_CAPABLE 2L
typedef union _GLYPHDEF { GLYPHBITS *pgb; PATHOBJ *ppo; } GLYPHDEF;
typedef struct _GLYPHPOS /* gp */ { HGLYPH hg; GLYPHDEF *pgdf; POINTL ptl; } GLYPHPOS,*PGLYPHPOS;
// individual glyph data
// r is a unit vector along the baseline in device coordinates.
// s is a unit vector in the ascent direction in device coordinates.
// A, B, and C, are simple tranforms of the notional space versions into
// (28.4) device coordinates. The dot products of those vectors with r
// are recorded here. Note that the high words of ptqD are also 28.4
// device coordinates. The low words provide extra accuracy.
// THE STRUCTURE DIFFERS IN ORDERING FROM NT 3.51 VERSION OF THE STRUCTURE.
// ptqD has been moved to the bottom.
// This requires only recompile of all the drivers.
typedef struct _GLYPHDATA { GLYPHDEF gdf; // pointer to GLYPHBITS or to PATHOBJ
HGLYPH hg; // glyhp handle
FIX fxD; // Character increment amount: D*r.
FIX fxA; // Prebearing amount: A*r.
FIX fxAB; // Advancing edge of character: (A+B)*r.
FIX fxInkTop; // Baseline to inkbox top along s.
FIX fxInkBottom; // Baseline to inkbox bottom along s.
RECTL rclInk; // Ink box with sides parallel to x,y axes
POINTQF ptqD; // Character increment vector: D=A+B+C.
} GLYPHDATA;
// flAccel flags for STROBJ
// SO_FLAG_DEFAULT_PLACEMENT // defult inc vectors used to position chars
// SO_HORIZONTAL // "left to right" or "right to left"
// SO_VERTICAL // "top to bottom" or "bottom to top"
// SO_REVERSED // set if horiz & "right to left" or if vert & "bottom to top"
// SO_ZERO_BEARINGS // all glyphs have zero a and c spaces
// SO_CHAR_INC_EQUAL_BM_BASE // base == cx for horiz, == cy for vert.
// SO_MAXEXT_EQUAL_BM_SIDE // side == cy for horiz, == cx for vert.
// do not substitute device font for tt font even if device font sub table
// tells the driver this should be done
// SO_DO_NOT_SUBSTITUTE_DEVICE_FONT
#define SO_FLAG_DEFAULT_PLACEMENT 0x00000001
#define SO_HORIZONTAL 0x00000002
#define SO_VERTICAL 0x00000004
#define SO_REVERSED 0x00000008
#define SO_ZERO_BEARINGS 0x00000010
#define SO_CHAR_INC_EQUAL_BM_BASE 0x00000020
#define SO_MAXEXT_EQUAL_BM_SIDE 0x00000040
#define SO_DO_NOT_SUBSTITUTE_DEVICE_FONT 0x00000080
#define SO_GLYPHINDEX_TEXTOUT 0x00000100
#define SO_ESC_NOT_ORIENT 0x00000200
#define SO_DXDY 0x00000400
#define SO_CHARACTER_EXTRA 0x00000800
#define SO_BREAK_EXTRA 0x00001000
typedef struct _STROBJ { ULONG cGlyphs; // # of glyphs to render
FLONG flAccel; // accel flags
ULONG ulCharInc; // non-zero only if fixed pitch font, equal to advanced width.
RECTL rclBkGround; // bk ground rect of the string in device coords
GLYPHPOS *pgp; // If non-NULL then has all glyphs.
LPWSTR pwszOrg; // pointer to original unicode string.
} STROBJ;
typedef struct _FONTINFO /* fi */ { ULONG cjThis; FLONG flCaps; ULONG cGlyphsSupported; ULONG cjMaxGlyph1; ULONG cjMaxGlyph4; ULONG cjMaxGlyph8; ULONG cjMaxGlyph32; } FONTINFO, *PFONTINFO;
ULONG APIENTRY FONTOBJ_cGetAllGlyphHandles( FONTOBJ *pfo, HGLYPH *phg );
VOID APIENTRY FONTOBJ_vGetInfo( FONTOBJ *pfo, ULONG cjSize, FONTINFO *pfi );
ULONG APIENTRY FONTOBJ_cGetGlyphs( FONTOBJ *pfo, ULONG iMode, ULONG cGlyph, HGLYPH *phg, PVOID *ppvGlyph );
GAMMA_TABLES* APIENTRY FONTOBJ_pGetGammaTables( FONTOBJ *pfo );
XFORMOBJ * APIENTRY FONTOBJ_pxoGetXform( FONTOBJ *pfo );
IFIMETRICS * APIENTRY FONTOBJ_pifi( FONTOBJ *pfo );
FD_GLYPHSET * APIENTRY FONTOBJ_pfdg( FONTOBJ *pfo );
PVOID APIENTRY FONTOBJ_pvTrueTypeFontFile( FONTOBJ *pfo, ULONG *pcjFile );
PBYTE APIENTRY FONTOBJ_pjOpenTypeTablePointer ( FONTOBJ *pfo, ULONG ulTag, ULONG *pcjTable );
LPWSTR APIENTRY FONTOBJ_pwszFontFilePaths ( FONTOBJ *pfo, ULONG *pcwc );
// for now only one mode is defined for glyph attributes
#define FO_ATTR_MODE_ROTATE 1
PFD_GLYPHATTR APIENTRY FONTOBJ_pQueryGlyphAttrs( FONTOBJ *pfo, ULONG iMode );
/*
* PALOBJ callbacks */
#define PAL_INDEXED 0x00000001
#define PAL_BITFIELDS 0x00000002
#define PAL_RGB 0x00000004
#define PAL_BGR 0x00000008
#define PAL_CMYK 0x00000010
ULONG APIENTRY PALOBJ_cGetColors( PALOBJ *ppalo, ULONG iStart, ULONG cColors, ULONG *pulColors );
/*
* PATHOBJ callbacks */
#define PO_BEZIERS 0x00000001
#define PO_ELLIPSE 0x00000002
#define PO_ALL_INTEGERS 0x00000004
#define PO_ENUM_AS_INTEGERS 0x00000008
#define PD_BEGINSUBPATH 0x00000001
#define PD_ENDSUBPATH 0x00000002
#define PD_RESETSTYLE 0x00000004
#define PD_CLOSEFIGURE 0x00000008
#define PD_BEZIERS 0x00000010
#define PD_ALL (PD_BEGINSUBPATH | \
PD_ENDSUBPATH | \ PD_RESETSTYLE | \ PD_CLOSEFIGURE | \ PD_BEZIERS)
typedef struct _PATHDATA { FLONG flags; ULONG count; POINTFIX *pptfx; } PATHDATA, *PPATHDATA;
typedef struct _RUN { LONG iStart; LONG iStop; } RUN, *PRUN;
typedef struct _CLIPLINE { POINTFIX ptfxA; POINTFIX ptfxB; LONG lStyleState; ULONG c; RUN arun[1]; } CLIPLINE, *PCLIPLINE;
VOID APIENTRY PATHOBJ_vEnumStart( PATHOBJ *ppo );
BOOL APIENTRY PATHOBJ_bEnum( PATHOBJ *ppo, PATHDATA *ppd );
VOID APIENTRY PATHOBJ_vEnumStartClipLines( PATHOBJ *ppo, CLIPOBJ *pco, SURFOBJ *pso, LINEATTRS *pla );
BOOL APIENTRY PATHOBJ_bEnumClipLines( PATHOBJ *ppo, ULONG cb, CLIPLINE *pcl );
BOOL APIENTRY PATHOBJ_bMoveTo( PATHOBJ *ppo, POINTFIX ptfx );
BOOL APIENTRY PATHOBJ_bPolyLineTo( PATHOBJ *ppo, POINTFIX *pptfx, ULONG cptfx );
BOOL APIENTRY PATHOBJ_bPolyBezierTo( PATHOBJ *ppo, POINTFIX *pptfx, ULONG cptfx );
BOOL APIENTRY PATHOBJ_bCloseFigure( PATHOBJ *ppo );
VOID APIENTRY PATHOBJ_vGetBounds( PATHOBJ *ppo, PRECTFX prectfx );
/*
* STROBJ callbacks */
VOID APIENTRY STROBJ_vEnumStart( STROBJ *pstro );
BOOL APIENTRY STROBJ_bEnum( STROBJ *pstro, ULONG *pc, PGLYPHPOS *ppgpos );
BOOL APIENTRY STROBJ_bEnumPositionsOnly( STROBJ *pstro, ULONG *pc, PGLYPHPOS *ppgpos );
DWORD APIENTRY STROBJ_dwGetCodePage( STROBJ *pstro );
FIX APIENTRY STROBJ_fxCharacterExtra( STROBJ *pstro );
FIX APIENTRY STROBJ_fxBreakExtra( STROBJ *pstro );
BOOL APIENTRY STROBJ_bGetAdvanceWidths( STROBJ *pso, ULONG iFirst, ULONG c, POINTQF *pptqD );
#define SGI_EXTRASPACE 0
/*
* SURFOBJ callbacks */
#define STYPE_BITMAP 0L
#define STYPE_DEVICE 1L
#define STYPE_DEVBITMAP 3L
#define BMF_1BPP 1L
#define BMF_4BPP 2L
#define BMF_8BPP 3L
#define BMF_16BPP 4L
#define BMF_24BPP 5L
#define BMF_32BPP 6L
#define BMF_4RLE 7L
#define BMF_8RLE 8L
#define BMF_JPEG 9L
#define BMF_PNG 10L
#define BMF_TOPDOWN 0x0001
#define BMF_NOZEROINIT 0x0002
#define BMF_DONTCACHE 0x0004
#define BMF_USERMEM 0x0008
#define BMF_KMSECTION 0x0010
#define BMF_NOTSYSMEM 0x0020
#define BMF_WINDOW_BLT 0x0040
#define BMF_UMPDMEM 0x0080
#define BMF_RESERVED 0xFF00
/*
* XFORMOBJ callbacks */
#define GX_IDENTITY 0L
#define GX_OFFSET 1L
#define GX_SCALE 2L
#define GX_GENERAL 3L
#define XF_LTOL 0L
#define XF_INV_LTOL 1L
#define XF_LTOFX 2L
#define XF_INV_FXTOL 3L
ULONG APIENTRY XFORMOBJ_iGetXform( XFORMOBJ *pxo, XFORML *pxform );
BOOL APIENTRY XFORMOBJ_bApplyXform( XFORMOBJ *pxo, ULONG iMode, ULONG cPoints, PVOID pvIn, PVOID pvOut );
HANDLE APIENTRY XFORMOBJ_cmGetTransform( XFORMOBJ *pxo );
/*
* XLATEOBJ callbacks */
#define XO_TRIVIAL 0x00000001
#define XO_TABLE 0x00000002
#define XO_TO_MONO 0x00000004
#define XO_FROM_CMYK 0x00000008
#define XO_DEVICE_ICM 0x00000010 // ICM on Device
#define XO_HOST_ICM 0x00000020 // ICM on Engine/Apps
#define XO_SRCPALETTE 1
#define XO_DESTPALETTE 2
#define XO_DESTDCPALETTE 3
#define XO_SRCBITFIELDS 4
#define XO_DESTBITFIELDS 5
ULONG APIENTRY XLATEOBJ_iXlate( XLATEOBJ *pxlo, ULONG iColor );
ULONG * APIENTRY XLATEOBJ_piVector( XLATEOBJ *pxlo );
ULONG APIENTRY XLATEOBJ_cGetPalette( XLATEOBJ *pxlo, ULONG iPal, ULONG cPal, ULONG *pPal );
HANDLE APIENTRY XLATEOBJ_hGetColorTransform( XLATEOBJ *pxlo );
/*
* Engine callbacks - error logging */
#ifdef USERMODE_DRIVER
#define EngGetLastError GetLastError
#define EngSetLastError SetLastError
#else // !USERMODE_DRIVER
VOID APIENTRY EngSetLastError(ULONG); ULONG APIENTRY EngGetLastError();
#endif // !USERMODE_DRIVER
/*
* Engine callbacks - Surfaces */
#define HOOK_BITBLT 0x00000001
#define HOOK_STRETCHBLT 0x00000002
#define HOOK_PLGBLT 0x00000004
#define HOOK_TEXTOUT 0x00000008
#define HOOK_PAINT 0x00000010 // Obsolete
#define HOOK_STROKEPATH 0x00000020
#define HOOK_FILLPATH 0x00000040
#define HOOK_STROKEANDFILLPATH 0x00000080
#define HOOK_LINETO 0x00000100
#define HOOK_COPYBITS 0x00000400
#define HOOK_MOVEPANNING 0x00000800 // Obsolete
#define HOOK_SYNCHRONIZE 0x00001000
#define HOOK_STRETCHBLTROP 0x00002000
#define HOOK_SYNCHRONIZEACCESS 0x00004000 // Obsolete
#define HOOK_TRANSPARENTBLT 0x00008000
#define HOOK_ALPHABLEND 0x00010000
#define HOOK_GRADIENTFILL 0x00020000
#define HOOK_FLAGS 0x0003b5ff
HBITMAP APIENTRY EngCreateBitmap( SIZEL sizl, LONG lWidth, ULONG iFormat, FLONG fl, PVOID pvBits );
HSURF APIENTRY EngCreateDeviceSurface( DHSURF dhsurf, SIZEL sizl, ULONG iFormatCompat );
HBITMAP APIENTRY EngCreateDeviceBitmap( DHSURF dhsurf, SIZEL sizl, ULONG iFormatCompat );
BOOL APIENTRY EngDeleteSurface( HSURF hsurf );
SURFOBJ * APIENTRY EngLockSurface( HSURF hsurf );
VOID APIENTRY EngUnlockSurface( SURFOBJ *pso );
BOOL APIENTRY EngEraseSurface( SURFOBJ *pso, RECTL *prcl, ULONG iColor );
BOOL APIENTRY EngAssociateSurface( HSURF hsurf, HDEV hdev, FLONG flHooks );
#define MS_NOTSYSTEMMEMORY 0x0001
#define MS_SHAREDACCESS 0x0002
BOOL APIENTRY EngModifySurface( HSURF hsurf, HDEV hdev, FLONG flHooks, FLONG flSurface, DHSURF dhsurf, VOID* pvScan0, LONG lDelta, VOID* pvReserved );
BOOL APIENTRY EngMarkBandingSurface( HSURF hsurf );
BOOL APIENTRY EngCheckAbort( SURFOBJ *pso );
/*
* Engine callbacks - Paths */
PATHOBJ * APIENTRY EngCreatePath();
VOID APIENTRY EngDeletePath( PATHOBJ *ppo );
/*
* Engine callbacks - Palettes */
HPALETTE APIENTRY EngCreatePalette( ULONG iMode, ULONG cColors, ULONG *pulColors, FLONG flRed, FLONG flGreen, FLONG flBlue );
ULONG APIENTRY EngQueryPalette( HPALETTE hpal, ULONG *piMode, ULONG cColors, ULONG *pulColors);
BOOL APIENTRY EngDeletePalette( HPALETTE hpal );
/*
* Engine callbacks - Clipping */
CLIPOBJ * APIENTRY EngCreateClip();
VOID APIENTRY EngDeleteClip( CLIPOBJ *pco );
/*
* Function prototypes */
//
// User-mode printer driver information-query entrypoint
//
BOOL APIENTRY APIENTRY DrvQueryDriverInfo( DWORD dwMode, PVOID pBuffer, DWORD cbBuf, PDWORD pcbNeeded );
#define DRVQUERY_USERMODE 1
// These are the only EXPORTED functions for ANY driver
BOOL APIENTRY DrvEnableDriver( ULONG iEngineVersion, ULONG cj, DRVENABLEDATA *pded );
/*
* Driver functions */
VOID APIENTRY DrvDisableDriver();
DHPDEV APIENTRY DrvEnablePDEV( DEVMODEW *pdm, LPWSTR pwszLogAddress, ULONG cPat, HSURF *phsurfPatterns, ULONG cjCaps, ULONG *pdevcaps, ULONG cjDevInfo, DEVINFO *pdi, HDEV hdev, LPWSTR pwszDeviceName, HANDLE hDriver );
#define HS_DDI_MAX 6
ULONG APIENTRY DrvResetDevice( DHPDEV dhpdev, PVOID Reserved );
#define DRD_SUCCESS 0
#define DRD_ERROR 1
BOOL APIENTRY DrvResetPDEV( DHPDEV dhpdevOld, DHPDEV dhpdevNew );
VOID APIENTRY DrvCompletePDEV( DHPDEV dhpdev, HDEV hdev );
BOOL APIENTRY DrvOffset( // Obsolete
SURFOBJ* pso, LONG x, LONG y, FLONG flReserved );
HSURF APIENTRY DrvEnableSurface( DHPDEV dhpdev );
VOID APIENTRY DrvSynchronize( DHPDEV dhpdev, RECTL *prcl );
VOID APIENTRY DrvDisableSurface( DHPDEV dhpdev );
VOID APIENTRY DrvDisablePDEV( DHPDEV dhpdev );
/* DrvSaveScreenBits - iMode definitions */
#define SS_SAVE 0
#define SS_RESTORE 1
#define SS_FREE 2
ULONG_PTR APIENTRY DrvSaveScreenBits( SURFOBJ *pso, ULONG iMode, ULONG_PTR ident, RECTL *prcl );
/*
* Desktops */
BOOL APIENTRY DrvAssertMode( DHPDEV dhpdev, BOOL bEnable );
ULONG APIENTRY DrvGetModes( HANDLE hDriver, ULONG cjSize, DEVMODEW *pdm );
VOID APIENTRY DrvMovePanning( LONG x, LONG y, FLONG fl );
BOOL APIENTRY DrvPlgBlt( SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMsk, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlBrushOrg, POINTFIX *pptfx, RECTL *prcl, POINTL *pptl, ULONG iMode );
/*
* Bitmaps */
HBITMAP APIENTRY DrvCreateDeviceBitmap( DHPDEV dhpdev, SIZEL sizl, ULONG iFormat );
VOID APIENTRY DrvDeleteDeviceBitmap( DHSURF dhsurf );
/*
* Palettes */
BOOL APIENTRY DrvSetPalette( DHPDEV dhpdev, PALOBJ *ppalo, FLONG fl, ULONG iStart, ULONG cColors );
/*
* Brushes */
#define DM_DEFAULT 0x00000001
#define DM_MONOCHROME 0x00000002
#define DCR_SOLID 0
#define DCR_DRIVER 1
#define DCR_HALFTONE 2
ULONG APIENTRY DrvDitherColor( DHPDEV dhpdev, ULONG iMode, ULONG rgb, ULONG *pul );
BOOL APIENTRY DrvRealizeBrush( BRUSHOBJ *pbo, SURFOBJ *psoTarget, SURFOBJ *psoPattern, SURFOBJ *psoMask, XLATEOBJ *pxlo, ULONG iHatch );
#define RB_DITHERCOLOR 0x80000000L
/*
* Fonts */
PIFIMETRICS APIENTRY DrvQueryFont( DHPDEV dhpdev, ULONG_PTR iFile, ULONG iFace, ULONG_PTR *pid );
// #define QFT_UNICODE 0L
#define QFT_LIGATURES 1L
#define QFT_KERNPAIRS 2L
#define QFT_GLYPHSET 3L
PVOID APIENTRY DrvQueryFontTree( DHPDEV dhpdev, ULONG_PTR iFile, ULONG iFace, ULONG iMode, ULONG_PTR *pid );
#define QFD_GLYPHANDBITMAP 1L
#define QFD_GLYPHANDOUTLINE 2L
#define QFD_MAXEXTENTS 3L
#define QFD_TT_GLYPHANDBITMAP 4L
#define QFD_TT_GRAY1_BITMAP 5L
#define QFD_TT_GRAY2_BITMAP 6L
#define QFD_TT_GRAY4_BITMAP 8L
#define QFD_TT_GRAY8_BITMAP 9L
#define QFD_TT_MONO_BITMAP QFD_TT_GRAY1_BITMAP
LONG APIENTRY DrvQueryFontData( DHPDEV dhpdev, FONTOBJ *pfo, ULONG iMode, HGLYPH hg, GLYPHDATA *pgd, PVOID pv, ULONG cjSize );
VOID APIENTRY DrvFree( PVOID pv, ULONG_PTR id);
VOID APIENTRY DrvDestroyFont( FONTOBJ *pfo);
// Capability flags for DrvQueryCaps.
#define QC_OUTLINES 0x00000001
#define QC_1BIT 0x00000002
#define QC_4BIT 0x00000004
//
// This is a mask of the capabilites of a font provider that can return more
// than just glyph metrics (i.e., bitmaps and/or outlines). If a driver has
// one or more of these capabilities, then it is FONT DRIVER.
//
// Drivers should only set individual bits. GDI will check if any are turned on
// using this define.
//
#define QC_FONTDRIVERCAPS ( QC_OUTLINES | QC_1BIT | QC_4BIT )
LONG APIENTRY DrvQueryFontCaps( ULONG culCaps, ULONG *pulCaps );
// fStatus is a new flag NT 5.0
#define FF_SIGNATURE_VERIFIED 0x1
#define FF_IGNORED_SIGNATURE 0x2
ULONG_PTR APIENTRY DrvLoadFontFile( ULONG cFiles, // number of font files associated with this font
ULONG_PTR *piFile, // handles for individual files, cFiles of them
PVOID *ppvView, // array of cFiles views
ULONG *pcjView, // array of their sizes
DESIGNVECTOR *pdv, // only non null for mm instances
ULONG ulLangID, ULONG ulFastCheckSum );
BOOL APIENTRY DrvUnloadFontFile( ULONG_PTR iFile );
LONG APIENTRY DrvQueryTrueTypeTable( ULONG_PTR iFile, ULONG ulFont, ULONG ulTag, PTRDIFF dpStart, ULONG cjBuf, BYTE *pjBuf, PBYTE *ppjTable, ULONG *pcjTable );
BOOL APIENTRY DrvQueryAdvanceWidths( DHPDEV dhpdev, FONTOBJ *pfo, ULONG iMode, HGLYPH *phg, PVOID pvWidths, ULONG cGlyphs );
// Values for iMode
#define QAW_GETWIDTHS 0
#define QAW_GETEASYWIDTHS 1
// values for bMetricsOnly. even though declared as BOOL
// by adding TTO_QUBICS, this is becoming a flag field.
// For versions of NT 4.0 and earlier, this value is always
// set to zero by GDI.
#define TTO_METRICS_ONLY 1
#define TTO_QUBICS 2
#define TTO_UNHINTED 4
LONG APIENTRY DrvQueryTrueTypeOutline( DHPDEV dhpdev, FONTOBJ *pfo, HGLYPH hglyph, BOOL bMetricsOnly, GLYPHDATA *pgldt, ULONG cjBuf, TTPOLYGONHEADER *ppoly );
PVOID APIENTRY DrvGetTrueTypeFile ( ULONG_PTR iFile, ULONG *pcj );
// values for ulMode:
#define QFF_DESCRIPTION 1L
#define QFF_NUMFACES 2L
LONG APIENTRY DrvQueryFontFile( ULONG_PTR iFile, ULONG ulMode, ULONG cjBuf, ULONG *pulBuf );
/*
* BitBlt */
BOOL APIENTRY DrvBitBlt( SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclTrg, POINTL *pptlSrc, POINTL *pptlMask, BRUSHOBJ *pbo, POINTL *pptlBrush, ROP4 rop4 );
BOOL APIENTRY DrvStretchBlt( SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlHTOrg, RECTL *prclDest, RECTL *prclSrc, POINTL *pptlMask, ULONG iMode );
BOOL APIENTRY DrvStretchBltROP( SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlHTOrg, RECTL *prclDest, RECTL *prclSrc, POINTL *pptlMask, ULONG iMode, BRUSHOBJ *pbo, DWORD rop4 );
BOOL APIENTRY DrvAlphaBlend( SURFOBJ *psoDest, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDest, RECTL *prclSrc, BLENDOBJ *pBlendObj );
BOOL APIENTRY DrvGradientFill( SURFOBJ *psoDest, CLIPOBJ *pco, XLATEOBJ *pxlo, TRIVERTEX *pVertex, ULONG nVertex, PVOID pMesh, ULONG nMesh, RECTL *prclExtents, POINTL *pptlDitherOrg, ULONG ulMode );
BOOL APIENTRY DrvTransparentBlt( SURFOBJ *psoDst, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDst, RECTL *prclSrc, ULONG iTransColor, ULONG ulReserved );
BOOL APIENTRY DrvCopyBits( SURFOBJ *psoDest, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDest, POINTL *pptlSrc );
/*
* Text Output */
BOOL APIENTRY DrvTextOut( SURFOBJ *pso, STROBJ *pstro, FONTOBJ *pfo, CLIPOBJ *pco, RECTL *prclExtra, // Obsolete, always NULL
RECTL *prclOpaque, BRUSHOBJ *pboFore, BRUSHOBJ *pboOpaque, POINTL *pptlOrg, MIX mix );
/*
* Graphics Output */
BOOL APIENTRY DrvLineTo( SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, LONG x1, LONG y1, LONG x2, LONG y2, RECTL *prclBounds, MIX mix );
BOOL APIENTRY DrvStrokePath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, XFORMOBJ *pxo, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, LINEATTRS *plineattrs, MIX mix );
#define FP_ALTERNATEMODE 1L
#define FP_WINDINGMODE 2L
BOOL APIENTRY DrvFillPath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, MIX mix, FLONG flOptions );
BOOL APIENTRY DrvStrokeAndFillPath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, XFORMOBJ *pxo, BRUSHOBJ *pboStroke, LINEATTRS *plineattrs, BRUSHOBJ *pboFill, POINTL *pptlBrushOrg, MIX mixFill, FLONG flOptions );
BOOL APIENTRY DrvPaint( SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, MIX mix );
/*
* Pointers */
#define SPS_ERROR 0
#define SPS_DECLINE 1
#define SPS_ACCEPT_NOEXCLUDE 2
#define SPS_ACCEPT_EXCLUDE 3 // Obsolete
#define SPS_ACCEPT_SYNCHRONOUS 4
#define SPS_CHANGE 0x00000001L
#define SPS_ASYNCCHANGE 0x00000002L // Obsolete
#define SPS_ANIMATESTART 0x00000004L
#define SPS_ANIMATEUPDATE 0x00000008L
#define SPS_ALPHA 0x00000010L
#define SPS_LENGTHMASK 0x00000F00L
#define SPS_FREQMASK 0x000FF000L
ULONG APIENTRY DrvSetPointerShape( SURFOBJ *pso, SURFOBJ *psoMask, SURFOBJ *psoColor, XLATEOBJ *pxlo, LONG xHot, LONG yHot, LONG x, LONG y, RECTL *prcl, FLONG fl );
VOID APIENTRY DrvMovePointer( SURFOBJ *pso, LONG x, LONG y, RECTL *prcl );
/*
* Printing */
BOOL APIENTRY DrvSendPage( SURFOBJ *pso );
BOOL APIENTRY DrvStartPage( SURFOBJ *pso );
ULONG APIENTRY DrvEscape( SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut );
BOOL APIENTRY DrvStartDoc( SURFOBJ *pso, LPWSTR pwszDocName, DWORD dwJobId );
#define ED_ABORTDOC 1
BOOL APIENTRY DrvEndDoc( SURFOBJ *pso, FLONG fl );
BOOL APIENTRY DrvQuerySpoolType( DHPDEV, LPWSTR );
ULONG APIENTRY DrvDrawEscape( SURFOBJ *pso, ULONG iEsc, CLIPOBJ *pco, RECTL *prcl, ULONG cjIn, PVOID pvIn );
ULONG APIENTRY DrvGetGlyphMode( DHPDEV, FONTOBJ * );
ULONG APIENTRY DrvFontManagement( SURFOBJ *pso, FONTOBJ *pfo, ULONG iMode, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut );
BOOL APIENTRY DrvStartBanding( SURFOBJ *pso, POINTL *pptl );
BOOL APIENTRY DrvNextBand( SURFOBJ *pso, POINTL *pptl );
typedef struct _PERBANDINFO { BOOL bRepeatThisBand; SIZEL szlBand; ULONG ulHorzRes; ULONG ulVertRes; } PERBANDINFO, *PPERBANDINFO;
ULONG APIENTRY DrvQueryPerBandInfo( SURFOBJ *pso, PERBANDINFO *pbi );
/*
* DirectDraw */
BOOL APIENTRY DrvEnableDirectDraw( DHPDEV dhpdev, DD_CALLBACKS *pCallBacks, DD_SURFACECALLBACKS *pSurfaceCallBacks, DD_PALETTECALLBACKS *pPaletteCallBacks );
VOID APIENTRY DrvDisableDirectDraw( DHPDEV dhpdev );
BOOL APIENTRY DrvGetDirectDrawInfo( DHPDEV dhpdev, DD_HALINFO *pHalInfo, DWORD *pdwNumHeaps, VIDEOMEMORY *pvmList, DWORD *pdwNumFourCCCodes, DWORD *pdwFourCC );
HBITMAP APIENTRY DrvDeriveSurface( DD_DIRECTDRAW_GLOBAL *pDirectDraw, DD_SURFACE_LOCAL *pSurface );
/*
* ICM (Image Color Matching) */
HANDLE APIENTRY DrvIcmCreateColorTransform( DHPDEV dhpdev, LPLOGCOLORSPACEW pLogColorSpace, PVOID pvSourceProfile, ULONG cjSourceProfile, PVOID pvDestProfile, ULONG cjDestProfile, PVOID pvTargetProfile, ULONG cjTargetProfile, DWORD dwReserved );
BOOL APIENTRY DrvIcmDeleteColorTransform( DHPDEV dhpdev, HANDLE hcmXform );
BOOL APIENTRY DrvIcmCheckBitmapBits( DHPDEV dhpdev, HANDLE hColorTransform, SURFOBJ *pso, PBYTE paResults );
typedef struct _GAMMARAMP { WORD Red[256]; WORD Green[256]; WORD Blue[256]; } GAMMARAMP, *PGAMMARAMP;
BOOL APIENTRY DrvIcmSetDeviceGammaRamp( DHPDEV dhpdev, ULONG iFormat, LPVOID lpRamp );
#define IGRF_RGB_256BYTES 0 /* Obsolate */
#define IGRF_RGB_256WORDS 1 /* Same GammaRampArray format as Win95/98 DDI */
/*
* Query miscellaneous driver support */
BOOL APIENTRY DrvQueryDeviceSupport( SURFOBJ *pso, XLATEOBJ *pxlo, XFORMOBJ *pxo, ULONG iType, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut);
#define QDS_CHECKJPEGFORMAT 0
#define QDS_CHECKPNGFORMAT 1
VOID APIENTRY DrvSynchronizeSurface( SURFOBJ *pso, RECTL *prcl, FLONG fl );
#define DSS_TIMER_EVENT 0x0001
#define DSS_FLUSH_EVENT 0x0002
VOID APIENTRY DrvNotify( SURFOBJ *pso, ULONG iType, PVOID pvData);
#define DN_ACCELERATION_LEVEL 1
#define DN_DEVICE_ORIGIN 2
#define DN_SLEEP_MODE 3
#define DN_DRAWING_BEGIN 4
/*
* Engine callbacks - tracking clip region changes */
#define WOC_RGN_CLIENT_DELTA 0x0001
#define WOC_RGN_CLIENT 0x0002
#define WOC_RGN_SURFACE_DELTA 0x0004
#define WOC_RGN_SURFACE 0x0008
#define WOC_CHANGED 0x0010
#define WOC_DELETE 0x0020
#define WOC_DRAWN 0x0040
#define WOC_SPRITE_OVERLAP 0x0080
#define WOC_SPRITE_NO_OVERLAP 0x0100
typedef VOID (CALLBACK * WNDOBJCHANGEPROC)(WNDOBJ *pwo, FLONG fl);
#define WO_RGN_CLIENT_DELTA 0x0001
#define WO_RGN_CLIENT 0x0002
#define WO_RGN_SURFACE_DELTA 0x0004
#define WO_RGN_SURFACE 0x0008
#define WO_RGN_UPDATE_ALL 0x0010
#define WO_RGN_WINDOW 0x0020
#define WO_DRAW_NOTIFY 0x0040
#define WO_SPRITE_NOTIFY 0x0080
#define WO_RGN_DESKTOP_COORD 0x0100
WNDOBJ * APIENTRY EngCreateWnd( SURFOBJ *pso, HWND hwnd, WNDOBJCHANGEPROC pfn, FLONG fl, int iPixelFormat );
VOID APIENTRY EngDeleteWnd( WNDOBJ *pwo );
ULONG APIENTRY WNDOBJ_cEnumStart( WNDOBJ *pwo, ULONG iType, ULONG iDirection, ULONG cLimit );
BOOL APIENTRY WNDOBJ_bEnum( WNDOBJ *pwo, ULONG cj, ULONG *pul );
VOID APIENTRY WNDOBJ_vSetConsumer( WNDOBJ *pwo, PVOID pvConsumer );
/*
* Engine callback - hung device notification */
#define EHN_RESTORED 0
#define EHN_ERROR 1
ULONG APIENTRY EngHangNotification( HDEV hdev, PVOID Reserved );
/*
* Engine callbacks - tracking driver managed resources */
HDRVOBJ APIENTRY EngCreateDriverObj( PVOID pvObj, FREEOBJPROC pFreeObjProc, HDEV hdev );
BOOL APIENTRY EngDeleteDriverObj( HDRVOBJ hdo, BOOL bCallBack, BOOL bLocked );
DRIVEROBJ* APIENTRY EngLockDriverObj( HDRVOBJ hdo );
BOOL APIENTRY EngUnlockDriverObj( HDRVOBJ hdo );
/*
* Engine callback - return current process handle. */
HANDLE APIENTRY EngGetProcessHandle();
/*
* Engine callback - return current thread id */
HANDLE APIENTRY EngGetCurrentThreadId();
/*
* Engine callback - return current process id */
HANDLE APIENTRY EngGetCurrentProcessId();
/*
* Pixel formats */
BOOL APIENTRY DrvSetPixelFormat( SURFOBJ *pso, LONG iPixelFormat, HWND hwnd );
LONG APIENTRY DrvDescribePixelFormat( DHPDEV dhpdev, LONG iPixelFormat, ULONG cjpfd, PIXELFORMATDESCRIPTOR *ppfd );
/*
* Swap buffers */
BOOL APIENTRY DrvSwapBuffers( SURFOBJ *pso, WNDOBJ *pwo );
/*
* Function prototypes - Engine Simulations */
BOOL APIENTRY EngBitBlt( SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclTrg, POINTL *pptlSrc, POINTL *pptlMask, BRUSHOBJ *pbo, POINTL *pptlBrush, ROP4 rop4 );
BOOL APIENTRY EngLineTo( SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, LONG x1, LONG y1, LONG x2, LONG y2, RECTL *prclBounds, MIX mix );
BOOL APIENTRY EngStretchBlt( SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlHTOrg, RECTL *prclDest, RECTL *prclSrc, POINTL *pptlMask, ULONG iMode );
BOOL APIENTRY EngStretchBltROP( SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlHTOrg, RECTL *prclDest, RECTL *prclSrc, POINTL *pptlMask, ULONG iMode, BRUSHOBJ *pbo, DWORD rop4 );
BOOL APIENTRY EngAlphaBlend( SURFOBJ *psoDest, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDest, RECTL *prclSrc, BLENDOBJ *pBlendObj );
BOOL APIENTRY EngGradientFill( SURFOBJ *psoDest, CLIPOBJ *pco, XLATEOBJ *pxlo, TRIVERTEX *pVertex, ULONG nVertex, PVOID pMesh, ULONG nMesh, RECTL *prclExtents, POINTL *pptlDitherOrg, ULONG ulMode );
BOOL APIENTRY EngTransparentBlt( SURFOBJ *psoDst, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDst, RECTL *prclSrc, ULONG iTransColor, ULONG ulReserved );
BOOL APIENTRY EngTextOut( SURFOBJ *pso, STROBJ *pstro, FONTOBJ *pfo, CLIPOBJ *pco, RECTL *prclExtra, RECTL *prclOpaque, BRUSHOBJ *pboFore, BRUSHOBJ *pboOpaque, POINTL *pptlOrg, MIX mix );
BOOL APIENTRY EngStrokePath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, XFORMOBJ *pxo, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, LINEATTRS *plineattrs, MIX mix );
BOOL APIENTRY EngFillPath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, MIX mix, FLONG flOptions );
BOOL APIENTRY EngStrokeAndFillPath( SURFOBJ *pso, PATHOBJ *ppo, CLIPOBJ *pco, XFORMOBJ *pxo, BRUSHOBJ *pboStroke, LINEATTRS *plineattrs, BRUSHOBJ *pboFill, POINTL *pptlBrushOrg, MIX mixFill, FLONG flOptions );
BOOL APIENTRY EngPaint( SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, POINTL *pptlBrushOrg, MIX mix );
BOOL APIENTRY EngCopyBits( SURFOBJ *psoDest, SURFOBJ *psoSrc, CLIPOBJ *pco, XLATEOBJ *pxlo, RECTL *prclDest, POINTL *pptlSrc );
ULONG APIENTRY EngSetPointerShape( SURFOBJ *pso, SURFOBJ *psoMask, SURFOBJ *psoColor, XLATEOBJ *pxlo, LONG xHot, LONG yHot, LONG x, LONG y, RECTL *prcl, FLONG fl );
VOID APIENTRY EngMovePointer( SURFOBJ *pso, LONG x, LONG y, RECTL *prcl );
BOOL APIENTRY EngPlgBlt( SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMsk, CLIPOBJ *pco, XLATEOBJ *pxlo, COLORADJUSTMENT *pca, POINTL *pptlBrushOrg, POINTFIX *pptfx, RECTL *prcl, POINTL *pptl, ULONG iMode ); ULONG APIENTRY EngDitherColor( HDEV hdev, ULONG iMode, ULONG rgb, ULONG *pul );
//
// Sprite control
//
#define ECS_TEARDOWN 0x0001
#define ECS_REDRAW 0x0002
BOOL APIENTRY EngControlSprites( WNDOBJ *pwo, FLONG fl );
//
// Halftone releated APIs
//
LONG APIENTRY HT_ComputeRGBGammaTable( USHORT GammaTableEntries, USHORT GammaTableType, USHORT RedGamma, USHORT GreenGamma, USHORT BlueGamma, LPBYTE pGammaTable );
LONG APIENTRY HT_Get8BPPFormatPalette( LPPALETTEENTRY pPaletteEntry, USHORT RedGamma, USHORT GreenGamma, USHORT BlueGamma );
LONG APIENTRY HT_Get8BPPMaskPalette( LPPALETTEENTRY pPaletteEntry, BOOL Use8BPPMaskPal, BYTE CMYMask, USHORT RedGamma, USHORT GreenGamma, USHORT BlueGamma );
typedef struct _DEVHTINFO { DWORD HTFlags; DWORD HTPatternSize; DWORD DevPelsDPI; COLORINFO ColorInfo; } DEVHTINFO, *PDEVHTINFO;
#define DEVHTADJF_COLOR_DEVICE 0x00000001
#define DEVHTADJF_ADDITIVE_DEVICE 0x00000002
typedef struct _DEVHTADJDATA { DWORD DeviceFlags; DWORD DeviceXDPI; DWORD DeviceYDPI; PDEVHTINFO pDefHTInfo; PDEVHTINFO pAdjHTInfo; } DEVHTADJDATA, *PDEVHTADJDATA;
LONG APIENTRY HTUI_DeviceColorAdjustment( LPSTR pDeviceName, PDEVHTADJDATA pDevHTAdjData );
//
// General support APIS
//
VOID APIENTRY EngDebugBreak( VOID );
VOID APIENTRY EngDebugPrint( PCHAR StandardPrefix, PCHAR DebugMessage, va_list ap );
VOID APIENTRY EngQueryPerformanceCounter( LONGLONG *pPerformanceCount );
VOID APIENTRY EngQueryPerformanceFrequency( LONGLONG *pFrequency );
BOOL APIENTRY EngSetPointerTag( HDEV hdev, SURFOBJ *psoMask, SURFOBJ *psoColor, XLATEOBJ *pxlo, FLONG fl );
//
// Kernel mode memory operations
//
#define FL_ZERO_MEMORY 0x00000001
#define FL_NONPAGED_MEMORY 0x00000002
#ifdef USERMODE_DRIVER
#define EngAllocMem(flags, cj, tag) ((PVOID) GlobalAlloc(((flags) & FL_ZERO_MEMORY) ? GPTR : GMEM_FIXED, cj))
#define EngFreeMem(p) GlobalFree((HGLOBAL) (p))
#define EngAllocUserMem(cj, tag) ((PVOID) GlobalAlloc(GMEM_FIXED,cj))
#define EngFreeUserMem(p) GlobalFree((HGLOBAL) (p))
#define EngAllocPrivateUserMem( psl, cj, tag) ((PVOID) GlobalAlloc(GMEM_FIXED,cj))
#define EngFreePrivateUserMem( psl, p) GlobalFree((HGLOBAL) (p))
#define EngMulDiv MulDiv
#else // !USERMODE_DRIVER
PVOID APIENTRY EngAllocMem( ULONG Flags, ULONG MemSize, ULONG Tag );
VOID APIENTRY EngFreeMem( PVOID Mem );
PVOID APIENTRY EngAllocUserMem( SIZE_T cj, ULONG tag );
VOID APIENTRY EngFreeUserMem( PVOID pv );
PVOID APIENTRY EngAllocPrivateUserMem( PDD_SURFACE_LOCAL psl, SIZE_T cj, ULONG tag );
VOID EngFreePrivateUserMem( PDD_SURFACE_LOCAL psl, PVOID pv );
HRESULT EngDxIoctl( ULONG ulIoctl, PVOID pBuffer, ULONG ulBufferSize );
int APIENTRY EngMulDiv( int a, int b, int c );
#endif // !USERMODE_DRIVER
//
// User mode memory Operations
//
VOID APIENTRY EngProbeForRead( PVOID Address, ULONG Length, ULONG Alignment );
VOID APIENTRY EngProbeForReadAndWrite( PVOID Address, ULONG Length, ULONG Alignment );
HANDLE APIENTRY EngSecureMem( PVOID Address, ULONG Length );
VOID APIENTRY EngUnsecureMem( HANDLE hSecure );
DWORD APIENTRY EngDeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned );
//
// Loading drivers and gettings entry points from them
//
#ifdef USERMODE_DRIVER
#define EngLoadImage(filename) ((HANDLE) LoadLibraryW(filename))
#define EngFindImageProcAddress(h, procname) ((PVOID) GetProcAddress(h, procname))
#define EngUnloadImage(h) FreeLibrary((HMODULE) (h))
#else // !USERMODE_DRIVER
HANDLE APIENTRY EngLoadImage( LPWSTR pwszDriver );
PVOID APIENTRY EngFindImageProcAddress( HANDLE hModule, LPSTR lpProcName );
VOID APIENTRY EngUnloadImage( HANDLE hModule );
PVOID APIENTRY EngMapModule( HANDLE h, PULONG pSize );
#endif // !USERMODE_DRIVER
//
// callback for extra PDEV information
//
LPWSTR APIENTRY EngGetPrinterDataFileName( HDEV hdev );
LPWSTR APIENTRY EngGetDriverName( HDEV hdev );
typedef struct _TYPE1_FONT { HANDLE hPFM; HANDLE hPFB; ULONG ulIdentifier; } TYPE1_FONT;
BOOL APIENTRY EngGetType1FontList( HDEV hdev, TYPE1_FONT *pType1Buffer, ULONG cjType1Buffer, PULONG pulLocalFonts, PULONG pulRemoteFonts, LARGE_INTEGER *pLastModified );
//
// Manipulating resource sections
//
HANDLE APIENTRY EngLoadModule( LPWSTR pwsz );
PVOID APIENTRY EngFindResource( HANDLE h, int iName, int iType, PULONG pulSize );
VOID APIENTRY EngFreeModule( HANDLE h );
BOOL APIENTRY EngDeleteFile ( LPWSTR pwszFileName );
PVOID APIENTRY EngMapFile( LPWSTR pwsz, ULONG cjSize, ULONG_PTR *piFile );
BOOL APIENTRY EngUnmapFile ( ULONG_PTR iFile ); //
// FontFile Callbacks
//
VOID APIENTRY EngUnmapFontFile( ULONG_PTR iFile );
BOOL APIENTRY EngMapFontFile( ULONG_PTR iFile, PULONG *ppjBuf, ULONG *pcjBuf );
VOID APIENTRY EngUnmapFontFileFD( ULONG_PTR iFile );
BOOL APIENTRY EngMapFontFileFD( ULONG_PTR iFile, PULONG *ppjBuf, ULONG *pcjBuf );
BOOL APIENTRY EngLpkInstalled();
//
// Semaphores
//
DECLARE_HANDLE(HSEMAPHORE);
HSEMAPHORE APIENTRY EngCreateSemaphore( VOID );
VOID APIENTRY EngAcquireSemaphore( HSEMAPHORE hsem );
VOID APIENTRY EngReleaseSemaphore( HSEMAPHORE hsem );
VOID APIENTRY EngDeleteSemaphore( HSEMAPHORE hsem );
BOOL APIENTRY EngIsSemaphoreOwned( HSEMAPHORE hsem );
BOOL APIENTRY EngIsSemaphoreOwnedByCurrentThread( HSEMAPHORE hsem );
//
// Semaphore wrapper with a reference count for thread-safe creation and
// destruction. Data must be created zero-filled.
//
// Use EngAcquire/ReleaseSemaphore on hsem for access protection.
//
typedef struct _ENGSAFESEMAPHORE { HSEMAPHORE hsem; LONG lCount; } ENGSAFESEMAPHORE;
BOOL APIENTRY EngInitializeSafeSemaphore( ENGSAFESEMAPHORE *pssem );
VOID APIENTRY EngDeleteSafeSemaphore( ENGSAFESEMAPHORE *pssem );
VOID APIENTRY EngMultiByteToUnicodeN( LPWSTR UnicodeString, ULONG MaxBytesInUnicodeString, PULONG BytesInUnicodeString, PCHAR MultiByteString, ULONG BytesInMultiByteString );
VOID APIENTRY EngUnicodeToMultiByteN( PCHAR MultiByteString, ULONG MaxBytesInMultiByteString, PULONG BytesInMultiByteString, PWSTR UnicodeString, ULONG BytesInUnicodeString );
// for the spooler
#ifdef USERMODE_DRIVER
#define EngWritePrinter WritePrinter
#define EngGetPrinter GetPrinter
#define EngGetPrinterDriver GetPrinterDriver
#define EngGetPrinterData GetPrinterData
#define EngSetPrinterData SetPrinterData
#define EngEnumForms EnumForms
#define EngGetForm GetForm
#else // !USERMODE_DRIVER
BOOL APIENTRY EngGetPrinterDriver( HANDLE hPrinter, LPWSTR pEnvironment, DWORD dwLevel, BYTE *lpbDrvInfo, DWORD cbBuf, DWORD *pcbNeeded );
DWORD APIENTRY EngGetPrinterData( HANDLE hPrinter, LPWSTR pValueName, LPDWORD pType, LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded );
DWORD APIENTRY EngSetPrinterData( HANDLE hPrinter, LPWSTR pType, DWORD dwType, LPBYTE lpbPrinterData, DWORD cjPrinterData );
BOOL APIENTRY EngGetForm( HANDLE hPrinter, LPWSTR pFormName, DWORD Level, LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded );
BOOL APIENTRY EngWritePrinter( HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf, LPDWORD pcWritten );
BOOL APIENTRY EngGetPrinter( HANDLE hPrinter, DWORD dwLevel, LPBYTE pPrinter, DWORD cbBuf, LPDWORD pcbNeeded );
BOOL APIENTRY EngEnumForms( HANDLE hPrinter, DWORD Level, LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned );
#endif // !USERMODE_DRIVER
#if defined(_X86_) && !defined(USERMODE_DRIVER)
typedef struct _FLOATOBJ { ULONG ul1; ULONG ul2; } FLOATOBJ, *PFLOATOBJ;
VOID APIENTRY FLOATOBJ_SetFloat(PFLOATOBJ,FLOATL); VOID APIENTRY FLOATOBJ_SetLong(PFLOATOBJ,LONG);
LONG APIENTRY FLOATOBJ_GetFloat(PFLOATOBJ); LONG APIENTRY FLOATOBJ_GetLong(PFLOATOBJ);
VOID APIENTRY FLOATOBJ_AddFloat(PFLOATOBJ,FLOATL); VOID APIENTRY FLOATOBJ_AddLong(PFLOATOBJ,LONG); VOID APIENTRY FLOATOBJ_Add(PFLOATOBJ,PFLOATOBJ);
VOID APIENTRY FLOATOBJ_SubFloat(PFLOATOBJ,FLOATL); VOID APIENTRY FLOATOBJ_SubLong(PFLOATOBJ,LONG); VOID APIENTRY FLOATOBJ_Sub(PFLOATOBJ,PFLOATOBJ);
VOID APIENTRY FLOATOBJ_MulFloat(PFLOATOBJ,FLOATL); VOID APIENTRY FLOATOBJ_MulLong(PFLOATOBJ,LONG); VOID APIENTRY FLOATOBJ_Mul(PFLOATOBJ,PFLOATOBJ);
VOID APIENTRY FLOATOBJ_DivFloat(PFLOATOBJ,FLOATL); VOID APIENTRY FLOATOBJ_DivLong(PFLOATOBJ,LONG); VOID APIENTRY FLOATOBJ_Div(PFLOATOBJ,PFLOATOBJ);
VOID APIENTRY FLOATOBJ_Neg(PFLOATOBJ);
BOOL APIENTRY FLOATOBJ_EqualLong(PFLOATOBJ,LONG); BOOL APIENTRY FLOATOBJ_GreaterThanLong(PFLOATOBJ,LONG); BOOL APIENTRY FLOATOBJ_LessThanLong(PFLOATOBJ,LONG);
BOOL APIENTRY FLOATOBJ_Equal(PFLOATOBJ,PFLOATOBJ); BOOL APIENTRY FLOATOBJ_GreaterThan(PFLOATOBJ,PFLOATOBJ); BOOL APIENTRY FLOATOBJ_LessThan(PFLOATOBJ,PFLOATOBJ);
#else
// any platform that has support for floats in the kernel
typedef FLOAT FLOATOBJ; typedef FLOAT *PFLOATOBJ;
#define FLOATOBJ_SetFloat(pf,f) {*(pf) = (f); }
#define FLOATOBJ_SetLong(pf,l) {*(pf) = (FLOAT)(l); }
#define FLOATOBJ_GetFloat(pf) *((PULONG)pf)
#define FLOATOBJ_GetLong(pf) (LONG)*(pf)
#define FLOATOBJ_AddFloat(pf,f) {*(pf) += f; }
#define FLOATOBJ_AddLong(pf,l) {*(pf) += (LONG)(l); }
#define FLOATOBJ_Add(pf,pf1) {*(pf) += *(pf1); }
#define FLOATOBJ_SubFloat(pf,f) {*(pf) -= f; }
#define FLOATOBJ_SubLong(pf,l) {*(pf) -= (LONG)(l); }
#define FLOATOBJ_Sub(pf,pf1) {*(pf) -= *(pf1); }
#define FLOATOBJ_MulFloat(pf,f) {*(pf) *= f; }
#define FLOATOBJ_MulLong(pf,l) {*(pf) *= (LONG)(l); }
#define FLOATOBJ_Mul(pf,pf1) {*(pf) *= *(pf1); }
#define FLOATOBJ_DivFloat(pf,f) {*(pf) /= f; }
#define FLOATOBJ_DivLong(pf,l) {*(pf) /= (LONG)(l); }
#define FLOATOBJ_Div(pf,pf1) {*(pf) /= *(pf1); }
#define FLOATOBJ_Neg(pf) {*(pf) = -*(pf); }
#define FLOATOBJ_EqualLong(pf,l) (*(pf) == (FLOAT)(l))
#define FLOATOBJ_GreaterThanLong(pf,l) (*(pf) > (FLOAT)(l))
#define FLOATOBJ_LessThanLong(pf,l) (*(pf) < (FLOAT)(l))
#define FLOATOBJ_Equal(pf,pf1) (*(pf) == *(pf1))
#define FLOATOBJ_GreaterThan(pf,pf1) (*(pf) > *(pf1))
#define FLOATOBJ_LessThan(pf,pf1) (*(pf) < *(pf1))
#endif // _FLOATOBJ_
#if defined(USERMODE_DRIVER)
typedef XFORML FLOATOBJ_XFORM ; typedef XFORML *PFLOATOBJ_XFORM; typedef XFORML FAR *LPFLOATOBJ_XFORM;
#define XFORMOBJ_iGetFloatObjXform XFORMOBJ_iGetXform
#else
typedef struct tagFLOATOBJ_XFORM { FLOATOBJ eM11; FLOATOBJ eM12; FLOATOBJ eM21; FLOATOBJ eM22; FLOATOBJ eDx; FLOATOBJ eDy; } FLOATOBJ_XFORM, *PFLOATOBJ_XFORM, FAR *LPFLOATOBJ_XFORM;
ULONG APIENTRY XFORMOBJ_iGetFloatObjXform( XFORMOBJ *pxo, FLOATOBJ_XFORM * pfxo );
#endif
// SORT specific defines
typedef int (__cdecl *SORTCOMP)(const void *pv1, const void *pv2);
VOID APIENTRY EngSort( PBYTE pjBuf, ULONG c, ULONG cjElem, SORTCOMP pfnComp );
typedef struct _ENG_TIME_FIELDS { USHORT usYear; // range [1601...]
USHORT usMonth; // range [1..12]
USHORT usDay; // range [1..31]
USHORT usHour; // range [0..23]
USHORT usMinute; // range [0..59]
USHORT usSecond; // range [0..59]
USHORT usMilliseconds;// range [0..999]
USHORT usWeekday; // range [0..6] == [Sunday..Saturday]
} ENG_TIME_FIELDS, *PENG_TIME_FIELDS;
VOID APIENTRY EngQueryLocalTime( PENG_TIME_FIELDS );
FD_GLYPHSET* APIENTRY EngComputeGlyphSet( INT nCodePage, INT nFirstChar, INT cChars );
INT APIENTRY EngMultiByteToWideChar( UINT CodePage, LPWSTR WideCharString, INT BytesInWideCharString, LPSTR MultiByteString, INT BytesInMultiByteString );
INT APIENTRY EngWideCharToMultiByte( UINT CodePage, LPWSTR WideCharString, INT BytesInWideCharString, LPSTR MultiByteString, INT BytesInMultiByteString );
VOID APIENTRY EngGetCurrentCodePage( PUSHORT OemCodePage, PUSHORT AnsiCodePage );
HANDLE APIENTRY EngLoadModuleForWrite( LPWSTR pwsz, ULONG cjSizeOfModule );
LARGE_INTEGER APIENTRY EngQueryFileTimeStamp ( LPWSTR pwsz );
BOOL APIENTRY EngGetFileChangeTime( HANDLE h, LARGE_INTEGER *pChangeTime );
BOOL APIENTRY EngGetFilePath( IN HANDLE h , OUT WCHAR (*pDest)[MAX_PATH+1] );
ULONG APIENTRY EngSaveFloatingPointState( VOID *pBuffer, ULONG cjBufferSize );
BOOL APIENTRY EngRestoreFloatingPointState( VOID *pBuffer );
//
// DirectDraw surface locking
//
PDD_SURFACE_LOCAL APIENTRY EngLockDirectDrawSurface( HANDLE hSurface );
BOOL APIENTRY EngUnlockDirectDrawSurface( PDD_SURFACE_LOCAL pSurface );
//
// Engine Event support.
//
//
// Opaque type for event objects.
//
typedef struct _ENG_EVENT *PEVENT;
BOOL APIENTRY EngDeleteEvent( IN PEVENT pEvent );
BOOL APIENTRY EngCreateEvent( OUT PEVENT *ppEvent );
BOOL APIENTRY EngUnmapEvent( IN PEVENT pEvent );
PEVENT APIENTRY EngMapEvent( IN HDEV hDev, IN HANDLE hUserObject, IN PVOID Reserved1, IN PVOID Reserved2, IN PVOID Reserved3 );
BOOL APIENTRY EngWaitForSingleObject( IN PEVENT pEvent, IN PLARGE_INTEGER pTimeOut );
LONG APIENTRY EngSetEvent( IN PEVENT pEvent );
VOID APIENTRY EngClearEvent ( IN PEVENT pEvent );
LONG APIENTRY EngReadStateEvent ( IN PEVENT pEvent );
//
// Querying of system attributes.
//
typedef enum _ENG_SYSTEM_ATTRIBUTE { EngProcessorFeature = 1, EngNumberOfProcessors, EngOptimumAvailableUserMemory, EngOptimumAvailableSystemMemory, } ENG_SYSTEM_ATTRIBUTE;
#define QSA_MMX 0x00000100 // MMX
#define QSA_SSE 0x00002000 // SIMD
#define QSA_3DNOW 0x00004000 // 3DNow
BOOL APIENTRY EngQuerySystemAttribute( ENG_SYSTEM_ATTRIBUTE CapNum, PDWORD pCapability);
#define ENG_FNT_CACHE_READ_FAULT 0x1
#define ENG_FNT_CACHE_WRITE_FAULT 0x2
PVOID APIENTRY EngFntCacheLookUp(ULONG FastCheckSum, ULONG * pulSize); PVOID APIENTRY EngFntCacheAlloc(ULONG FastCheckSum, ULONG ulSize);
VOID APIENTRY EngFntCacheFault(ULONG ulFastCheckSum, ULONG iFaultMode);
typedef enum _ENG_DEVICE_ATTRIBUTE { QDA_RESERVED = 0, QDA_ACCELERATION_LEVEL = 1 } ENG_DEVICE_ATTRIBUTE;
BOOL APIENTRY EngQueryDeviceAttribute( HDEV hdev, ENG_DEVICE_ATTRIBUTE devAttr, VOID * pvIn, ULONG ulInSize, VOID * pvOUt, ULONG ulOutSize);
typedef struct { DWORD nSize; HDC hdc; PBYTE pvEMF; PBYTE pvCurrentRecord; } EMFINFO, *PEMFINFO;
BOOL APIENTRY EngQueryEMFInfo( HDEV hdev, EMFINFO *pEMFInfo);
//
// EngProcessorFeature
//
//
// EngNumberOfProcessors
//
// Number of active processors in the machine.
//
//
// EngOptimumAvailableUserMemory
//
// Optimum amount of user-mode memory available to avoid paging.
// Returns the number of bytes for the optimum allocation size
// Memory is allocated via EngAllocUserMem.
//
//
// EngOptimumAvailableSystemMemory
//
// Optimum amount of system memory available to avoid paging.
// Returns the number of bytes for the optimum allocation size.
// Memory is allocated via EngAllocMem.
//
//
// DDI entrypoint function prototypes
//
typedef BOOL (APIENTRY *PFN_DrvEnableDriver)(ULONG,ULONG,PDRVENABLEDATA); typedef DHPDEV (APIENTRY *PFN_DrvEnablePDEV) (PDEVMODEW,LPWSTR,ULONG,HSURF*,ULONG,GDIINFO*,ULONG,PDEVINFO,HDEV,LPWSTR,HANDLE); typedef VOID (APIENTRY *PFN_DrvCompletePDEV)(DHPDEV,HDEV); typedef ULONG (APIENTRY *PFN_DrvResetDevice)(DHPDEV,PVOID); typedef VOID (APIENTRY *PFN_DrvDisablePDEV)(DHPDEV); typedef VOID (APIENTRY *PFN_DrvSynchronize)(DHPDEV,RECTL *); typedef HSURF (APIENTRY *PFN_DrvEnableSurface)(DHPDEV); typedef VOID (APIENTRY *PFN_DrvDisableDriver)(VOID); typedef VOID (APIENTRY *PFN_DrvDisableSurface)(DHPDEV); typedef BOOL (APIENTRY *PFN_DrvAssertMode)(DHPDEV, BOOL); typedef BOOL (APIENTRY *PFN_DrvTextOut)(SURFOBJ *,STROBJ *,FONTOBJ *,CLIPOBJ *,RECTL *,RECTL *,BRUSHOBJ *,BRUSHOBJ *,POINTL *,MIX); typedef BOOL (APIENTRY *PFN_DrvStretchBlt)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,COLORADJUSTMENT *,POINTL *,RECTL *,RECTL *,POINTL *,ULONG); typedef BOOL (APIENTRY *PFN_DrvStretchBltROP)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,COLORADJUSTMENT *,POINTL *,RECTL *,RECTL *,POINTL *,ULONG, BRUSHOBJ *,ROP4); typedef BOOL (APIENTRY *PFN_DrvTransparentBlt)(SURFOBJ *, SURFOBJ *, CLIPOBJ *, XLATEOBJ *, RECTL *, RECTL *, ULONG, ULONG); typedef BOOL (APIENTRY *PFN_DrvPlgBlt)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,COLORADJUSTMENT *,POINTL *,POINTFIX *,RECTL *,POINTL *,ULONG); typedef BOOL (APIENTRY *PFN_DrvBitBlt)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,RECTL *,POINTL *,POINTL *,BRUSHOBJ *,POINTL *,ROP4); typedef BOOL (APIENTRY *PFN_DrvRealizeBrush)(BRUSHOBJ *,SURFOBJ *,SURFOBJ *,SURFOBJ *,XLATEOBJ *,ULONG); typedef BOOL (APIENTRY *PFN_DrvCopyBits)(SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,RECTL *,POINTL *); typedef ULONG (APIENTRY *PFN_DrvDitherColor)(DHPDEV, ULONG, ULONG, ULONG *); typedef HBITMAP (APIENTRY *PFN_DrvCreateDeviceBitmap)(DHPDEV, SIZEL, ULONG); typedef VOID (APIENTRY *PFN_DrvDeleteDeviceBitmap)(DHSURF); typedef BOOL (APIENTRY *PFN_DrvSetPalette)(DHPDEV, PALOBJ *, FLONG, ULONG, ULONG); typedef ULONG (APIENTRY *PFN_DrvEscape)(SURFOBJ *, ULONG, ULONG, PVOID, ULONG, PVOID); typedef ULONG (APIENTRY *PFN_DrvDrawEscape)(SURFOBJ *, ULONG, CLIPOBJ *, RECTL *, ULONG, PVOID); typedef PIFIMETRICS (APIENTRY *PFN_DrvQueryFont)(DHPDEV, ULONG_PTR, ULONG, ULONG_PTR *); typedef PVOID (APIENTRY *PFN_DrvQueryFontTree)(DHPDEV, ULONG_PTR, ULONG, ULONG, ULONG_PTR *); typedef LONG (APIENTRY *PFN_DrvQueryFontData)(DHPDEV, FONTOBJ *, ULONG, HGLYPH, GLYPHDATA *, PVOID, ULONG); typedef VOID (APIENTRY *PFN_DrvFree)(PVOID, ULONG_PTR); typedef VOID (APIENTRY *PFN_DrvDestroyFont)(FONTOBJ *); typedef LONG (APIENTRY *PFN_DrvQueryFontCaps)(ULONG, ULONG *); typedef HFF (APIENTRY *PFN_DrvLoadFontFile)(ULONG, ULONG_PTR *, PVOID *, ULONG *, DESIGNVECTOR *, ULONG, ULONG); typedef BOOL (APIENTRY *PFN_DrvUnloadFontFile)(ULONG_PTR); typedef ULONG (APIENTRY *PFN_DrvSetPointerShape)(SURFOBJ *, SURFOBJ *, SURFOBJ *,XLATEOBJ *,LONG,LONG,LONG,LONG,RECTL *,FLONG); typedef VOID (APIENTRY *PFN_DrvMovePointer)(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl); typedef BOOL (APIENTRY *PFN_DrvSendPage)(SURFOBJ *); typedef BOOL (APIENTRY *PFN_DrvStartPage)(SURFOBJ *pso); typedef BOOL (APIENTRY *PFN_DrvStartDoc)(SURFOBJ *pso, LPWSTR pwszDocName, DWORD dwJobId); typedef BOOL (APIENTRY *PFN_DrvEndDoc)(SURFOBJ *pso, FLONG fl); typedef BOOL (APIENTRY *PFN_DrvQuerySpoolType)(DHPDEV dhpdev, LPWSTR pwchType); typedef BOOL (APIENTRY *PFN_DrvLineTo)(SURFOBJ *,CLIPOBJ *,BRUSHOBJ *,LONG,LONG,LONG,LONG,RECTL *,MIX); typedef BOOL (APIENTRY *PFN_DrvStrokePath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *,BRUSHOBJ *,POINTL *,LINEATTRS *,MIX); typedef BOOL (APIENTRY *PFN_DrvFillPath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,BRUSHOBJ *,POINTL *,MIX,FLONG); typedef BOOL (APIENTRY *PFN_DrvStrokeAndFillPath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *,BRUSHOBJ *,LINEATTRS *,BRUSHOBJ *,POINTL *,MIX,FLONG); typedef BOOL (APIENTRY *PFN_DrvPaint)(SURFOBJ *,CLIPOBJ *,BRUSHOBJ *,POINTL *,MIX); typedef ULONG (APIENTRY *PFN_DrvGetGlyphMode)(DHPDEV dhpdev,FONTOBJ *pfo); typedef BOOL (APIENTRY *PFN_DrvResetPDEV)(DHPDEV dhpdevOld, DHPDEV dhpdevNew); typedef ULONG_PTR (APIENTRY *PFN_DrvSaveScreenBits)(SURFOBJ *, ULONG, ULONG_PTR, RECTL *); typedef ULONG (APIENTRY *PFN_DrvGetModes)(HANDLE, ULONG, DEVMODEW *); typedef LONG (APIENTRY *PFN_DrvQueryTrueTypeTable)(ULONG_PTR, ULONG, ULONG, PTRDIFF, ULONG, BYTE *, PBYTE *, ULONG *); typedef LONG (APIENTRY *PFN_DrvQueryTrueTypeSection)(ULONG, ULONG, ULONG, HANDLE *, PTRDIFF *); typedef LONG (APIENTRY *PFN_DrvQueryTrueTypeOutline)(DHPDEV, FONTOBJ *, HGLYPH, BOOL, GLYPHDATA *, ULONG, TTPOLYGONHEADER *); typedef PVOID (APIENTRY *PFN_DrvGetTrueTypeFile)(ULONG_PTR, ULONG *); typedef LONG (APIENTRY *PFN_DrvQueryFontFile)(ULONG_PTR, ULONG, ULONG, ULONG *); typedef PFD_GLYPHATTR (APIENTRY *PFN_DrvQueryGlyphAttrs)(FONTOBJ *, ULONG ); typedef BOOL (APIENTRY *PFN_DrvQueryAdvanceWidths)(DHPDEV,FONTOBJ *,ULONG,HGLYPH *,PVOID,ULONG); typedef ULONG (APIENTRY *PFN_DrvFontManagement)(SURFOBJ *,FONTOBJ *,ULONG,ULONG,PVOID,ULONG,PVOID); typedef BOOL (APIENTRY *PFN_DrvSetPixelFormat)(SURFOBJ *,LONG,HWND); typedef LONG (APIENTRY *PFN_DrvDescribePixelFormat)(DHPDEV,LONG,ULONG,PIXELFORMATDESCRIPTOR *); typedef BOOL (APIENTRY *PFN_DrvSwapBuffers)(SURFOBJ *, WNDOBJ *); typedef BOOL (APIENTRY *PFN_DrvStartBanding)(SURFOBJ *, POINTL *ppointl); typedef BOOL (APIENTRY *PFN_DrvNextBand)(SURFOBJ *, POINTL *ppointl); typedef BOOL (APIENTRY *PFN_DrvQueryPerBandInfo)(SURFOBJ *,PERBANDINFO *); typedef BOOL (APIENTRY *PFN_DrvEnableDirectDraw)(DHPDEV, DD_CALLBACKS *,DD_SURFACECALLBACKS *, DD_PALETTECALLBACKS *); typedef VOID (APIENTRY *PFN_DrvDisableDirectDraw)(DHPDEV); typedef BOOL (APIENTRY *PFN_DrvGetDirectDrawInfo)(DHPDEV, DD_HALINFO *, DWORD *, VIDEOMEMORY *, DWORD *, DWORD *); typedef HANDLE (APIENTRY *PFN_DrvIcmCreateColorTransform)(DHPDEV,LPLOGCOLORSPACEW,LPVOID,ULONG,LPVOID,ULONG,LPVOID,ULONG,DWORD); typedef BOOL (APIENTRY *PFN_DrvIcmDeleteColorTransform)(DHPDEV,HANDLE); typedef BOOL (APIENTRY *PFN_DrvIcmCheckBitmapBits)(DHPDEV,HANDLE,SURFOBJ *,PBYTE); typedef BOOL (APIENTRY *PFN_DrvIcmSetDeviceGammaRamp)(DHPDEV,ULONG,LPVOID); typedef BOOL (APIENTRY *PFN_DrvAlphaBlend)(SURFOBJ*,SURFOBJ*,CLIPOBJ*,XLATEOBJ*,PRECTL,PRECTL,BLENDOBJ *); typedef BOOL (APIENTRY *PFN_DrvGradientFill)(SURFOBJ*,CLIPOBJ*,XLATEOBJ*,TRIVERTEX*,ULONG,PVOID,ULONG,RECTL *,POINTL *,ULONG); typedef BOOL (APIENTRY *PFN_DrvQueryDeviceSupport)(SURFOBJ*,XLATEOBJ*,XFORMOBJ*,ULONG,ULONG,PVOID,ULONG,PVOID); typedef HBITMAP (APIENTRY *PFN_DrvDeriveSurface)(DD_DIRECTDRAW_GLOBAL*,DD_SURFACE_LOCAL*); typedef VOID (APIENTRY *PFN_DrvSynchronizeSurface)(SURFOBJ*, RECTL*, FLONG); typedef VOID (APIENTRY *PFN_DrvNotify)(SURFOBJ*, ULONG, PVOID);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _WINDDI_
|