📄 ddi_if.cpp
字号:
/*Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved.*/#include "precomp.h"#include "swemul.h"DEFINE_GDI_ENTRY_POINTS(EMPTYPARM,LEFTENTRY,RIGHTENTRY)void RegisterDDHALAPI();extern int AllocConverters();extern void FreeConverters();EXTERN_Cint__stdcallDllMain( void * hmod, DWORD dwReason, void * lpvReserved ){ switch (dwReason) { case DLL_PROCESS_ATTACH:#ifdef DEBUG RegisterDbgZones( (HINSTANCE)hmod, &dpCurSettings );#endif RegisterDDHALAPI(); break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE;}/******************************Public*Data*********************************\* MIX translation table** Translates a mix 1-16, into an old style Rop 0-255.*\**************************************************************************/const BYTE gaMix[] ={ 0xFF, // R2_WHITE - Allow rop = gaMix[mix & 0x0F] 0x00, // R2_BLACK 0x05, // R2_NOTMERGEPEN 0x0A, // R2_MASKNOTPEN 0x0F, // R2_NOTCOPYPEN 0x50, // R2_MASKPENNOT 0x55, // R2_NOT 0x5A, // R2_XORPEN 0x5F, // R2_NOTMASKPEN 0xA0, // R2_MASKPEN 0xA5, // R2_NOTXORPEN 0xAA, // R2_NOP 0xAF, // R2_MERGENOTPEN 0xF0, // R2_COPYPEN 0xF5, // R2_MERGEPENNOT 0xFA, // R2_MERGEPEN 0xFF // R2_WHITE - Allow rop = gaMix[mix & 0xFF]};#define CLIP_LIMIT 50typedef struct _CLIPENUM { LONG c; RECTL arcl[CLIP_LIMIT]; // Space for enumerating complex clipping} CLIPENUM; /* ce, pce */inline GPE *SurfobjToGPE( SURFOBJ *pso ){ return (GPE *)(pso->dhpdev);}class TmpGPESurf{ GPESurf *m_pGPESurf; GPESurf m_GPESurf;public: operator GPESurf *() { return m_pGPESurf; } TmpGPESurf ( SURFOBJ *pso1, SURFOBJ *pso2 = (SURFOBJ *)NULL, TmpGPESurf *pTmp2 = (TmpGPESurf *)NULL ); ~TmpGPESurf() {}};TmpGPESurf::TmpGPESurf( SURFOBJ *pso1, SURFOBJ *pso2, TmpGPESurf *pTmp2){ if( !pso1 ) { m_pGPESurf = (GPESurf *)NULL; } else if( pso1 == pso2 ) { m_pGPESurf = pTmp2->m_pGPESurf; } else if( pso1->dhsurf ) { m_pGPESurf = (GPESurf *)(pso1->dhsurf); } else { m_pGPESurf = &m_GPESurf; m_pGPESurf->Init( pso1->sizlBitmap.cx, pso1->sizlBitmap.cy, pso1->pvScan0, pso1->lDelta, IFormatToEGPEFormat[pso1->iBitmapFormat] ); }}const DRVENABLEDATA pDrvFn ={ { DrvEnablePDEV }, { DrvDisablePDEV }, { DrvEnableSurface }, { DrvDisableSurface }, { DrvCreateDeviceBitmap }, { DrvDeleteDeviceBitmap }, { DrvRealizeBrush }, { DrvStrokePath }, { DrvFillPath }, { DrvPaint }, { DrvBitBlt }, { DrvCopyBits }, { DrvAnyBlt }, { DrvTransparentBlt }, { DrvSetPalette }, { DrvSetPointerShape }, { DrvMovePointer }, { DrvGetModes }, { DrvRealizeColor }, { DrvGetMasks }, { DrvUnrealizeColor }, { DrvContrastControl }, { DrvPowerHandler }, { NULL /* DrvEndDoc */ }, { NULL /* DrvStartDoc */ }, { NULL /* DrvStartPage */ }, { DrvEscape }};#ifdef FIXED_EXE_EXPORTSBOOL APIENTRY GPEEnableDriver( ULONG iEngineVersion, ULONG cj, DRVENABLEDATA *pded){// RegisterDbgZones( hmod, &dpCurSettings ); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvEnableDriver\r\n"))); if ( iEngineVersion != DDI_DRIVER_VERSION || cj != sizeof(DRVENABLEDATA) ) { DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableDriver\r\n"))); return FALSE; } *pded = pDrvFn; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableDriver\r\n"))); return TRUE;}#elseBOOL APIENTRY GPEEnableDriver( ULONG iEngineVersion, ULONG cj, DRVENABLEDATA *pded, PENGCALLBACKS pEngCallbacks){// RegisterDbgZones( hmod, &dpCurSettings ); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvEnableDriver\r\n"))); BRUSHOBJ_pvAllocRbrush = pEngCallbacks->BRUSHOBJ_pvAllocRbrush; BRUSHOBJ_pvGetRbrush = pEngCallbacks->BRUSHOBJ_pvGetRbrush; CLIPOBJ_cEnumStart = pEngCallbacks->CLIPOBJ_cEnumStart; CLIPOBJ_bEnum = pEngCallbacks->CLIPOBJ_bEnum; PALOBJ_cGetColors = pEngCallbacks->PALOBJ_cGetColors; PATHOBJ_vEnumStart = pEngCallbacks->PATHOBJ_vEnumStart; PATHOBJ_bEnum = pEngCallbacks->PATHOBJ_bEnum; PATHOBJ_vGetBounds = pEngCallbacks->PATHOBJ_vGetBounds; XLATEOBJ_cGetPalette = pEngCallbacks->XLATEOBJ_cGetPalette; EngCreateDeviceSurface = pEngCallbacks->EngCreateDeviceSurface; EngDeleteSurface = pEngCallbacks->EngDeleteSurface; EngCreateDeviceBitmap = pEngCallbacks->EngCreateDeviceBitmap; EngCreatePalette = pEngCallbacks->EngCreatePalette; if ( iEngineVersion != DDI_DRIVER_VERSION || cj != sizeof(DRVENABLEDATA) ) return FALSE; *pded = pDrvFn; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableDriver\r\n"))); return TRUE;}#endifBOOL APIENTRY DrvContrastControl( DHPDEV dhpdev, ULONG cmd, ULONG *pValue){ GPE *pGPE = (GPE *)dhpdev; return pGPE->ContrastControl(cmd, pValue);}VOID APIENTRY DrvPowerHandler( DHPDEV dhpdev, BOOL bOff){ GPE *pGPE = (GPE *)dhpdev; pGPE->PowerHandler(bOff);}ULONG APIENTRY DrvEscape( DHPDEV dhpdev, SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut){ GPE *pGPE = (GPE *)dhpdev; return pGPE->DrvEscape(pso, iEsc, cjIn, pvIn, cjOut, pvOut);}VOID DrvDisableDriver(){ // by the time this is called, the driver has already been shut down. DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvDisableDriver\r\n"))); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvDisableDriver\r\n")));}// Configuration / Intialization funtionsVOID APIENTRY DrvDisablePDEV( DHPDEV dhpdev){ DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvDisablePDEV\r\n"))); FreeConverters(); delete ((GPE *)dhpdev); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvDisablePDEV\r\n")));}VOID APIENTRY DrvDisableSurface( DHPDEV dhpdev){ DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvDisableSurface\r\n"))); EngDeleteSurface( (HSURF)(((GPE *)dhpdev)->GetHSurf()) ); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvDisableSurface\r\n")));}HSURF APIENTRY DrvEnableSurface( DHPDEV dhpdev){ HSURF hsurf; GPE *pGPE = (GPE *)dhpdev; SIZEL sizl; GPESurf *pSurf; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvEnableSurface\r\n"))); pSurf = pGPE->PrimarySurface(); sizl.cx = pGPE->ScreenWidth(); sizl.cy = pGPE->ScreenHeight(); DEBUGMSG(GPE_ZONE_INIT,(TEXT("Primary surface is at 0x%08x\r\n"), pSurf )); DEBUGMSG(GPE_ZONE_INIT,(TEXT("Format of primary surface is %d\r\n"),pSurf->Format() )); hsurf = EngCreateDeviceSurface( (DHSURF)pSurf, sizl, EGPEFormatToIFormat[pSurf->Format()]); pGPE->SetHSurf( (unsigned long)hsurf ); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableSurface\r\n"))); return hsurf;}// Surface creationHBITMAP APIENTRY DrvCreateDeviceBitmap( DHPDEV dhpdev, SIZEL sizl, ULONG iFormat){ GPE *pGPE = (GPE *)dhpdev; GPESurf *pSurf; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvCreateDeviceBitmap\r\n"))); if( FAILED( pGPE->AllocSurface( &pSurf, sizl.cx, sizl.cy, IFormatToEGPEFormat[iFormat], GPE_PREFER_VIDEO_MEMORY ) ) ) { DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableSurface\r\n"))); return (HBITMAP)0xFFFFFFFF; } HBITMAP hbm = EngCreateDeviceBitmap( (DHSURF)pSurf, sizl, iFormat ); pSurf->m_nHandle = (unsigned long)hbm; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvEnableSurface\r\n"))); if( !hbm ) return (HBITMAP)0xFFFFFFFF; else return hbm;}VOID APIENTRY DrvDeleteDeviceBitmap( DHSURF dhsurf){ DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvDeleteDeviceBitmap\r\n"))); GPESurf *pSurf = (GPESurf *)dhsurf; HBITMAP hbm = (HBITMAP)(pSurf->m_nHandle); EngDeleteSurface( (HSURF)hbm ); delete pSurf; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvDeleteDeviceBitmap\r\n")));}// Cursor control functionsVOID APIENTRY DrvMovePointer( SURFOBJ *pso, LONG x, LONG y, RECTL *prcl){// unsigned long zones = 1; // dpCurSettings.ulZoneMask;// DEBUGMSG(1,(TEXT("Zones = 0x%08x\r\n"),zones ));//dpCurSettings.ulZoneMask = 0x0000ffff; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvMovePointer\r\n"))); SurfobjToGPE(pso)->MovePointer(x,y); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvMovePointer\r\n")));}ULONG APIENTRY DrvSetPointerShape( SURFOBJ *pso, SURFOBJ *psoMask, SURFOBJ *psoColor, XLATEOBJ *pxlo, LONG xHot, LONG yHot, LONG x, LONG y, RECTL *prcl, FLONG fl){ // dpCurSettings.ulZoneMask = 0x0000ffff; DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvSetPointerShape\r\n"))); TmpGPESurf pMask(psoMask); TmpGPESurf pColor(psoColor); GPE *pGPE = SurfobjToGPE(pso); if( !pGPE ) { DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvSetPointerShape\r\n"))); return SPS_ERROR; } if( FAILED( pGPE->SetPointerShape(pMask,pColor,xHot,yHot, psoMask?(psoMask->sizlBitmap.cx):0, psoMask?(psoMask->sizlBitmap.cy>>1):0 ) ) ) { DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvSetPointerShape\r\n"))); return SPS_ERROR; } pGPE->MovePointer(x,y); DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvSetPointerShape\r\n"))); return SPS_ACCEPT_NOEXCLUDE; // It is up to GPE to avoid cursor interference}// Palette Control FunctionsBOOL APIENTRY DrvSetPalette( DHPDEV dhpdev, PALOBJ *ppalo, FLONG fl, ULONG iStart, ULONG cColors){ DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvSetPalette\r\n"))); unsigned long Colors[256]; if( cColors > 256 ) return FALSE; cColors = PALOBJ_cGetColors( ppalo, iStart, cColors, Colors ); if( !cColors || FAILED( ( (GPE *)dhpdev )->SetPalette( (PALETTEENTRY *)Colors, (unsigned short)iStart, (unsigned short)cColors ) ) ) { DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvSetPalette\r\n"))); return FALSE; } DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvSetPalette\r\n"))); return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -