Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

662 lines
20 KiB

/******************************Module*Header*******************************\
* Module Name: engine.h
*
* This is the common include file for all GDI
*
* Copyright (c) 1993-1995 Microsoft Corporation
\**************************************************************************/
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <ntos.h>
#include <zwapi.h>
#include "w32p.h"
#include <windef.h>
#if defined(_MIPS_)
typedef
__cdecl
void *
(*PCOPY_MEM_FN) (void *, const void *, size_t);
typedef
__cdecl
void *
(*PFILL_MEM_FN) (void *, int, size_t);
typedef
__cdecl
void
(*PFILL_MEM_ULONG_FN) (PVOID, ULONG, ULONG);
extern ULONG Gdip64bitDisabled;
extern PCOPY_MEM_FN CopyMemFn;
extern PFILL_MEM_FN FillMemFn;
extern PFILL_MEM_ULONG_FN FillMemUlongFn;
#define memcpy (CopyMemFn)
#define memmove (CopyMemFn)
#define memset (FillMemFn)
#define RtlFillMemoryUlong (FillMemUlongFn)
PVOID
RtlMoveMemory32(
IN void * Destination,
IN const void * Source,
IN size_t Length
);
PVOID
memset32(
IN void * Destination,
IN int Fill,
IN size_t Length
);
VOID
RtlFillMemoryUlong32(
IN PVOID Destination,
IN ULONG Length,
IN ULONG Pattern
);
#endif
#include <winerror.h>
#include <wingdi.h>
#include <wingdip.h>
#define _NO_COM // Avoid COM conflicts width ddrawp.h
#include <ddrawp.h>
#include <winddi.h>
#include "ntgdistr.h"
#include "ntgdi.h"
// gre.h should completely replace greold.h
#include "greold.h"
#include "gre.h"
#include "usergdi.h"
#include "hmgshare.h"
// temporary typedef
typedef ULONG SIZE_T;
#include "hmgr.h"
#include "mapfile.h"
#include "gdisplp.h"
#include "ntgdispl.h"
// temporary typedef
typedef LPWSTR PWSZ;
#include "ldev.h"
/**************************************************************************\
*
* GLOBALS
*
* These are the extern definitions for all the globals defined in globals.c
*
\**************************************************************************/
// The gpsemDriverMgmt semaphore is used to protect the head of the
// list of drivers. We can get away with this
// AS LONG AS: 1) new drivers are always inserted at the head of the list
// and 2) a driver is never removed from the list. If these two
// conditions are met, then other processes can grab (make a local copy
// of) the list head under semaphore protection. This list can be parsed
// without regard to any new drivers that may be pre-pended to the list.
extern PDEVCAPS gpGdiDevCaps;
extern PERESOURCE gpsemDriverMgmt;
extern PERESOURCE gpsemRFONTList;
extern PERESOURCE gpsemPalette;
extern PERESOURCE gpsemPublicPFT;
extern PERESOURCE gpsemIcmMgmt;
extern PERESOURCE gpsemGdiSpool;
extern PERESOURCE gpsemWndobj;
#if DBG
extern PERESOURCE gpsemDEBUG; // for serializing debug output
#endif
extern PLDEV gpldevDrivers;
extern ULONG gcTrueTypeFonts;
#define VACQUIRESEM(hsem) \
KeEnterCriticalRegion(); \
ExAcquireResourceExclusiveLite(hsem, TRUE);
#define VRELEASESEM(hsem) \
ExReleaseResource(hsem); \
KeLeaveCriticalRegion();
#define VACQUIREDEVLOCK(lock) \
KeEnterCriticalRegion(); \
ExAcquireResourceExclusiveLite(lock, TRUE);
#define VRELEASEDEVLOCK(lock) \
ExReleaseResource(lock); \
KeLeaveCriticalRegion();
#if DBG
//
// Variable defined in USER\server\server.c
// set to 1 on DBG build trace through display driver loading
//
extern ULONG GreTraceDisplayDriverLoad;
extern ULONG GreTraceFontLoad;
VOID WINAPI DoRip(PSZ);
VOID WINAPI DoWarning(PSZ,LONG);
#define RIP(x) DoRip((PSZ) x)
#define ASSERTGDI(x,y) if(!(x)) DoRip((PSZ) y)
#define WARNING(x) DoWarning(x,0)
#define WARNING1(x) DoWarning(x,1)
#define TRACE_FONT(str) { \
if (GreTraceFontLoad) { \
TEB *pteb = NtCurrentTeb(); \
CLIENT_ID *pId = &pteb->ClientId; \
VACQUIRESEM(gpsemDEBUG); \
KdPrint(("TRACE_FONT: p=%u t=%u\n", \
pId->UniqueProcess, \
pId->UniqueThread)); \
KdPrint((" ")); \
KdPrint(str); \
KdPrint(("\n")); \
VRELEASESEM(gpsemDEBUG) \
} \
}
#define TRACE_INIT(str) { if (GreTraceDisplayDriverLoad) { KdPrint(str); } }
#define TRACE_CACHE(str) { if (gflFontDebug & DEBUG_CACHE){ KdPrint(str); } }
#define TRACE_INSERT(str) { if (gflFontDebug & DEBUG_INSERT){ KdPrint(str); } }
#define TRACE_INIT_WARNING(str) \
{ KdPrint(str); \
if (GreTraceDisplayDriverLoad) { RIP("TRACE_WARNING\n"); } \
}
#else
#define RIP(x)
#define ASSERTGDI(x,y)
#define WARNING(x)
#define WARNING1(x)
#define TRACE_FONT(str)
#define TRACE_INIT(str)
#define TRACE_INIT_WARNING(str)
#define TRACE_CACHE(str)
#define TRACE_INSERT(str)
#endif
/**************************************************************************\
*
* The following defines print messages or break in if we hit an exception
* in a try/except. if bWarnExcept is set, a message will get displayed. If
* bStopExcept is also set, we will break into the debugger on such an exception.
*
\**************************************************************************/
#if DBG
#define DBGEXCEPT 1
#endif
#ifdef DBGEXCEPT
extern int bStopExcept;
extern int bWarnExcept;
#define WARNINGX(n) \
if (bWarnExcept) \
{ \
DbgPrint("GDI exception hit WARNINGX(%d)\n",n); \
if (bStopExcept) \
DbgBreakPoint(); \
}
#else
#define WARNINGX(n)
#endif
#define RETURN(x,y) {WARNING((x)); return(y);}
#define DONTUSE(x) x=x
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#define ABS(A) ((A) < 0 ? -(A) : (A))
#define SIGNUM(A) ((A > 0) - (A < 0))
#define MAX4(a, b, c, d) max(max(max(a,b),c),d)
#define MIN4(a, b, c, d) min(min(min(a,b),c),d)
#define HOBJ_INVALID ((HOBJ) 0)
DECLARE_HANDLE(HDSURF);
DECLARE_HANDLE(HDDB);
DECLARE_HANDLE(HDIB);
DECLARE_HANDLE(HDBRUSH);
DECLARE_HANDLE(HPATH);
DECLARE_HANDLE(HXFB);
DECLARE_HANDLE(HPAL);
DECLARE_HANDLE(HXLATE);
DECLARE_HANDLE(HFDEV);
DECLARE_HANDLE(HRFONT);
DECLARE_HANDLE(HPFT);
DECLARE_HANDLE(HPFE);
DECLARE_HANDLE(HIDB);
DECLARE_HANDLE(HCACHE);
DECLARE_HANDLE(HEFS);
DECLARE_HANDLE(HPDEV);
#define HSURF_INVALID ((HSURF) HOBJ_INVALID)
#define HDSURF_INVALID ((HDSURF) HOBJ_INVALID)
#define HDDB_INVALID ((HDDB) HOBJ_INVALID)
#define HDIB_INVALID ((HDIB) HOBJ_INVALID)
#define HDBRUSH_INVALID ((HDBRUSH) HOBJ_INVALID)
#define HPATH_INVALID ((HPATH) HOBJ_INVALID)
#define HXFB_INVALID ((HXFB) HOBJ_INVALID)
#define HPAL_INVALID ((HPAL) HOBJ_INVALID)
#define HXLATE_INVALID ((HXLATE) HOBJ_INVALID)
#define HFDEV_INVALID ((HFDEV) HOBJ_INVALID)
#define HLFONT_INVALID ((HLFONT) HOBJ_INVALID)
#define HRFONT_INVALID ((HRFONT) HOBJ_INVALID)
#define HPFE_INVALID ((HPFE) HOBJ_INVALID)
#define HPFT_INVALID ((HPFT) HOBJ_INVALID)
#define HIDB_INVALID ((HIDB) HOBJ_INVALID)
#define HBRUSH_INVALID ((HBRUSH) HOBJ_INVALID)
#define HCACHE_INVALID ((HCACHE) HOBJ_INVALID)
#define HPEN_INVALID ((HCACHE) HOBJ_INVALID)
#define HEFS_INVALID ((HEFS) HOBJ_INVALID)
//
// Get engine constants. ENGINE_VERSION must equal DDI_DRIVER_VERSION for
// any release.
//
// Engine
// Version Changes
// ------- -------
// 10 Final release, Windows NT 3.1
// 10A Beta DDK release, Windows NT 3.5
// - ulVRefresh added to GDIINFO, and multiple desktops
// implemented for the Display Applet
// 10B Final release, Windows NT 3.5
// - ulDesktop resolutions and ulBltAlignment added to
// GDIINFO
// SUR First BETA, Windows NT SUR
//
#define ENGINE_VERSION10 0x00010000
#define ENGINE_VERSION10A 0x00010001
#define ENGINE_VERSION10B 0x00010002
#define ENGINE_VERSIONSUR 0x00020000
#define ENGINE_VERSION 0x00020000
#ifdef R4000
#undef InterlockedExchange
#define InterlockedExchange GDIInterlockedExchange
LONG WINAPI GDIInterlockedExchange(LPLONG Target,LONG Value);
#endif
//
// Memory allocation
//
VOID FreeObject(PVOID pvFree, ULONG ulType);
PVOID AllocateObject(ULONG cBytes, ULONG ulType, BOOL bZero);
#define ALLOCOBJ(size,objt,b) AllocateObject((size), objt, b)
#define FREEOBJ(pv,objt) FreeObject((pv),objt)
//
// os.cxx
//
PERESOURCE hsemCreate();
VOID hsemDestroy(PERESOURCE);
//
// BUGBUG we must implement TAGS !
//
__inline
PVOID
PALLOCMEM(
ULONG size,
ULONG objt)
{
PVOID _pv;
_pv = ExAllocatePoolWithTag(PagedPool, (size), (ULONG) objt);
if (_pv)
{
RtlZeroMemory(_pv, (size));
}
return _pv;
objt;
}
#define PALLOCNOZ(size,objt) ExAllocatePoolWithTag(PagedPool, (size), (ULONG) objt)
#define VFREEMEM(pv) ExFreePool((PVOID)pv)
#define PVALLOCTEMPBUFFER(size) AllocFreeTmpBuffer(size)
#define FREEALLOCTEMPBUFFER(pv) FreeTmpBuffer(pv)
PVOID
AllocFreeTmpBuffer(
ULONG size);
VOID
FreeTmpBuffer(
PVOID pv);
//
// Error messages
//
#define SAVE_ERROR_CODE(x) EngSetLastError((x))
//
// BUGBUG remove the undef when the define is removed from mapfile.h
//
#undef vToUNICODEN
#define vToUNICODEN( pwszDst, cwch, pszSrc, cch ) \
{ \
RtlMultiByteToUnicodeN((LPWSTR)(pwszDst),(ULONG)((cwch)*sizeof(WCHAR)), \
(PULONG)NULL,(PSZ)(pszSrc),(ULONG)(cch)); \
(pwszDst)[(cwch)-1] = 0; \
}
#define vToASCIIN( pszDst, cch, pwszSrc, cwch) \
{ \
RtlUnicodeToMultiByteN((PCH)(pszDst), (ULONG)(cch), (PULONG)NULL, \
(LPWSTR)(pwszSrc), (ULONG)((cwch)*sizeof(WCHAR))); \
(pszDst)[(cch)-1] = 0; \
}
// SIZEOF_STROBJ_BUFFER(cwc)
//
// Calculates the dword-multiple size of the temporary buffer needed by
// the STROBJ vInit and vInitSimple routines, based on the count of
// characters.
#ifdef FE_SB
// for fontlinking we will also allocate room for the partitioning info
#define SIZEOF_STROBJ_BUFFER(cwc) \
((((cwc) * (sizeof(GLYPHPOS)+sizeof(LONG)+sizeof(WCHAR)))+3)&~3)
#else
#define SIZEOF_STROBJ_BUFFER(cwc) \
((cwc) * sizeof(GLYPHPOS))
#endif
#define TEXT_CAPTURE_BUFFER_SIZE 192 // Between 17 and 22 bytes per glyph are
// required for capturing a string, so
// this will allow strings of up to about
// size 8 to require no heap allocation
//
// FIX point numbers must be 27.4
// The following macro checks that a FIX point number is valid
//
#define FIX_SHIFT 4L
#define FIX_FROM_LONG(x) ((x) << FIX_SHIFT)
#define LONG_FLOOR_OF_FIX(x) ((x) >> FIX_SHIFT)
#define LONG_CEIL_OF_FIX(x) LONG_FLOOR_OF_FIX(FIX_CEIL((x)))
#define FIX_ONE FIX_FROM_LONG(1L)
#define FIX_HALF (FIX_ONE/2)
#define FIX_FLOOR(x) ((x) & ~(FIX_ONE - 1L))
#define FIX_CEIL(x) FIX_FLOOR((x) + FIX_ONE - 1L)
typedef struct _VECTORL
{
LONG x;
LONG y;
} VECTORL, *PVECTORL; /* vecl, pvecl */
typedef struct _VECTORFX
{
FIX x;
FIX y;
} VECTORFX, *PVECTORFX; /* vec, pvec */
extern BYTE gajRop3[];
extern BYTE gaMix[];
extern POINTL gptl00;
#define AVEC_NOT 0x01
#define AVEC_D 0x02
#define AVEC_S 0x04
#define AVEC_P 0x08
#define AVEC_DS 0x10
#define AVEC_DP 0x20
#define AVEC_SP 0x40
#define AVEC_DSP 0x80
#define AVEC_NEED_SOURCE (AVEC_S | AVEC_DS | AVEC_SP | AVEC_DSP)
#define AVEC_NEED_PATTERN (AVEC_P | AVEC_DP | AVEC_SP | AVEC_DSP)
typedef BOOL (*PFN_DrvEnableDriver)(ULONG,ULONG,PDRVENABLEDATA);
typedef DHPDEV (*PFN_DrvEnablePDEV)
(PDEVMODEW,LPWSTR,ULONG,HSURF *,ULONG,PGDIINFO,ULONG,PDEVINFO,HDEV,LPWSTR,HANDLE);
typedef VOID (*PFN_DrvCompletePDEV)(DHPDEV,HDEV);
typedef VOID (*PFN_DrvDisablePDEV)(DHPDEV);
typedef VOID (*PFN_DrvSynchronize)(DHPDEV,RECTL *);
typedef HSURF (*PFN_DrvEnableSurface)(DHPDEV);
typedef VOID (*PFN_DrvDisableSurface)(DHPDEV);
typedef BOOL (*PFN_DrvAssertMode)(DHPDEV, BOOL);
typedef BOOL (*PFN_DrvTextOut)(SURFOBJ *,STROBJ *,FONTOBJ *,CLIPOBJ *,RECTL *,
RECTL *,BRUSHOBJ *,BRUSHOBJ *,POINTL *,MIX);
typedef BOOL (*PFN_DrvStretchBlt)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,
COLORADJUSTMENT *,POINTL *,RECTL *,RECTL *,POINTL *,ULONG);
typedef BOOL (*PFN_DrvBitBlt)(SURFOBJ *,SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,
RECTL *,POINTL *,POINTL *,BRUSHOBJ *,POINTL *,ROP4);
typedef BOOL (*PFN_DrvRealizeBrush)(BRUSHOBJ *,SURFOBJ *,SURFOBJ *,SURFOBJ *,XLATEOBJ *,ULONG);
typedef BOOL (*PFN_DrvCopyBits)(SURFOBJ *,SURFOBJ *,CLIPOBJ *,XLATEOBJ *,RECTL *,POINTL *);
typedef ULONG (*PFN_DrvDitherColor)(DHPDEV, ULONG, ULONG, ULONG *);
typedef HSURF (*PFN_DrvCreateDeviceBitmap)(DHPDEV dhpdev, SIZEL sizl, ULONG iFormat);
typedef VOID (*PFN_DrvDeleteDeviceBitmap)(DHSURF dhsurf);
typedef BOOL (*PFN_DrvSetPalette)(DHPDEV, PALOBJ *, FLONG, ULONG, ULONG);
typedef ULONG (*PFN_DrvEscape)(SURFOBJ *, ULONG, ULONG,
PVOID, ULONG, PVOID);
typedef ULONG (*PFN_DrvDrawEscape)(SURFOBJ *, ULONG, CLIPOBJ *, RECTL *,
ULONG, PVOID);
typedef PIFIMETRICS (*PFN_DrvQueryFont)(DHPDEV, ULONG, ULONG, ULONG *);
typedef PVOID (*PFN_DrvQueryFontTree)(DHPDEV, ULONG, ULONG, ULONG, ULONG *);
typedef LONG (*PFN_DrvQueryFontData)(DHPDEV, FONTOBJ *, ULONG, HGLYPH,
GLYPHDATA *, PVOID, ULONG);
typedef VOID (*PFN_DrvFree)(PVOID, ULONG);
typedef VOID (*PFN_DrvDestroyFont)(FONTOBJ *);
typedef LONG (*PFN_DrvQueryFontCaps)(ULONG, ULONG *);
typedef ULONG (*PFN_DrvLoadFontFile)(ULONG, ULONG *, PVOID *, ULONG *, ULONG);
typedef BOOL (*PFN_DrvUnloadFontFile)(ULONG);
typedef ULONG (*PFN_DrvSetPointerShape)(SURFOBJ *, SURFOBJ *, SURFOBJ *,XLATEOBJ *,LONG,LONG,LONG,LONG,RECTL *,FLONG);
typedef VOID (*PFN_DrvMovePointer)(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl);
typedef VOID (*PFN_DrvExcludePointer)(DHPDEV, RECTL *);
typedef BOOL (*PFN_DrvSendPage)(SURFOBJ *);
typedef BOOL (*PFN_DrvStartPage)(SURFOBJ *pso);
typedef BOOL (*PFN_DrvStartDoc)(SURFOBJ *pso, LPWSTR pwszDocName, DWORD dwJobId);
typedef BOOL (*PFN_DrvEndDoc)(SURFOBJ *pso, FLONG fl);
typedef BOOL (*PFN_DrvQuerySpoolType)(DHPDEV dhpdev, LPWSTR pwchType);
typedef BOOL (*PFN_DrvLineTo)(SURFOBJ *,CLIPOBJ *,BRUSHOBJ *,LONG,LONG,
LONG,LONG,RECTL *,MIX);
typedef BOOL (*PFN_DrvStrokePath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *,
BRUSHOBJ *,POINTL *,LINEATTRS *,MIX);
typedef BOOL (*PFN_DrvFillPath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,BRUSHOBJ *,
POINTL *,MIX,FLONG);
typedef BOOL (*PFN_DrvStrokeAndFillPath)(SURFOBJ *,PATHOBJ *,CLIPOBJ *,XFORMOBJ *,
BRUSHOBJ *,LINEATTRS *,BRUSHOBJ *,
POINTL *,MIX,FLONG);
typedef BOOL (*PFN_DrvPaint)(SURFOBJ *,CLIPOBJ *,BRUSHOBJ *,POINTL *,MIX);
typedef ULONG (*PFN_DrvGetGlyphMode)(DHPDEV dhpdev,FONTOBJ *pfo);
typedef BOOL (*PFN_DrvResetPDEV)(DHPDEV dhpdevOld, DHPDEV dhpdevNew);
typedef ULONG (*PFN_DrvSaveScreenBits)(SURFOBJ *, ULONG, ULONG, RECTL *);
typedef ULONG (*PFN_DrvGetModes)(HANDLE, ULONG, DEVMODEW *);
typedef LONG (*PFN_DrvQueryTrueTypeTable)(ULONG, ULONG, ULONG, PTRDIFF, ULONG, BYTE *);
typedef LONG (*PFN_DrvQueryTrueTypeSection)(ULONG, ULONG, ULONG, HANDLE *, PTRDIFF *);
typedef LONG (*PFN_DrvQueryTrueTypeOutline)(DHPDEV, FONTOBJ *, HGLYPH, BOOL, GLYPHDATA *, ULONG, TTPOLYGONHEADER *);
typedef PVOID (*PFN_DrvGetTrueTypeFile)(ULONG, ULONG *);
typedef LONG (*PFN_DrvQueryFontFile)(ULONG, ULONG, ULONG, ULONG *);
typedef BOOL (*PFN_DrvQueryAdvanceWidths)(DHPDEV,FONTOBJ *,ULONG,HGLYPH *,PVOID,ULONG);
typedef ULONG (*PFN_DrvFontManagement)(SURFOBJ *,FONTOBJ *,ULONG,ULONG,PVOID,ULONG,PVOID);
typedef BOOL (*PFN_DrvSetPixelFormat)(SURFOBJ *,LONG,HWND);
typedef LONG (*PFN_DrvDescribePixelFormat)(DHPDEV,LONG,ULONG,PIXELFORMATDESCRIPTOR *);
typedef BOOL (*PFN_DrvSwapBuffers)(SURFOBJ *, WNDOBJ *);
typedef BOOL (*PFN_DrvStartBanding)(SURFOBJ *, POINTL *ppointl);
typedef BOOL (*PFN_DrvNextBand)(SURFOBJ *, POINTL *ppointl);
typedef BOOL (*PFN_DrvEnableDirectDraw)(DHPDEV, DD_CALLBACKS *,
DD_SURFACECALLBACKS *, DD_PALETTECALLBACKS *);
typedef VOID (*PFN_DrvDisableDirectDraw)(DHPDEV);
typedef BOOL (*PFN_DrvGetDirectDrawInfo)(DHPDEV, DD_HALINFO *, DWORD *,
VIDEOMEMORY *, DWORD *, DWORD *);
/**************************************************************************\
*
* random prototypes internal to gdisrv
*
\**************************************************************************/
// Functions private to engine.
HFONT hfontCreate(LPEXTLOGFONTW pelfw, LFTYPE lft, FLONG fl, PVOID pvCliData);
extern PGDI_SHARED_MEMORY gpGdiSharedMemory;
BOOL SimBitBlt(SURFOBJ *,SURFOBJ *,SURFOBJ *,
CLIPOBJ *,XLATEOBJ *,
RECTL *,POINTL *,POINTL *,
BRUSHOBJ *,POINTL *,ROP4);
BOOL
bDeleteDCInternal(
HDC hdc,
BOOL bForce,
BOOL bProcessCleanup);
ULONG ulGetFontData(HDC, DWORD, DWORD, PVOID, ULONG);
VOID vCleanupSpool();
BOOL
EngPlgBlt(
SURFOBJ *psoTrg,
SURFOBJ *psoSrc,
SURFOBJ *psoMsk,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
COLORADJUSTMENT *pca,
POINTL *pptlBrushOrg,
POINTFIX *pptfx,
RECTL *prcl,
POINTL *pptl,
ULONG iMode);
// remote Type1 stuff
typedef struct tagDOWNLOADFONTHEADER
{
ULONG Type1ID; // if non-zero then this is a remote Type1 font
ULONG NumFiles;
ULONG FileOffsets[1];
}DOWNLOADFONTHEADER,*PDOWNLOADFONTHEADER;
typedef struct tagREMOTETYPEONENODE REMOTETYPEONENODE;
typedef struct tagREMOTETYPEONENODE
{
PDOWNLOADFONTHEADER pDownloadHeader;
FONTFILEVIEW fvPFB;
FONTFILEVIEW fvPFM;
REMOTETYPEONENODE *pNext;
} REMOTETYPEONDENODE,*PREMOTETYPEONENODE;
// used to keep track of the Type1 rasterizer installed
extern UNIVERSAL_FONT_ID gufiLocalType1Rasterizer;
extern BOOL gbType1RasterizerInstaled;
ULONG
cParseFontResources(
HANDLE hFontFile,
PVOID **ppvResourceBases
);
BOOL
MakeSystemRelativePath(
LPWSTR pOriginalPath,
PUNICODE_STRING pUnicode,
BOOL bAppendDLL
);
BOOL
GreExtTextOutRect(
HDC hdc,
LPRECT prcl
);
#define HTBLT_SUCCESS 1
#define HTBLT_NOTSUPPORTED 0
#define HTBLT_ERROR -1
int EngHTBlt
(
IN SURFOBJ *psoDst,
IN SURFOBJ *psoSrc,
IN SURFOBJ *psoMask,
IN CLIPOBJ *pco,
IN XLATEOBJ *pxlo,
IN COLORADJUSTMENT *pca,
IN PPOINTL pptlBrushOrg,
IN PRECTL prclDest,
IN PRECTL prclSrc,
IN PPOINTL pptlMask);
extern BOOL gbDBCSCodePage; // Is the system code page DBCS?
BOOL GreExtTextOutWInternal(
HDC hdc,
int x,
int y,
UINT flOpts,
LPRECT prcl,
LPWSTR pwsz,
int cwc,
LPINT pdx,
PVOID pvBuffer,
DWORD dwCodePage
);