windows-nt/Source/XPSP1/NT/public/oak/inc/winddi.h

4234 lines
111 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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_