⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddhsurf.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "precomp.h"

 
static void DumpDDSCAPS( DDSCAPS ddsCaps )
{
	if( ddsCaps.dwCaps & DDSCAPS_OVERLAY )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_OVERLAY; ")));
	if( ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_FRONTBUFFER; ")));
	if( ddsCaps.dwCaps & DDSCAPS_BACKBUFFER )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_BACKBUFFER; ")));
	if( ddsCaps.dwCaps & DDSCAPS_COMPLEX )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_COMPLEX; ")));
	if( ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_PRIMARYSURFACE; ")));
	if( ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_OFFSCREENPLAIN; ")));
	if( ddsCaps.dwCaps & DDSCAPS_ZBUFFER )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ZBUFFER; ")));
	if( ddsCaps.dwCaps & DDSCAPS_MIPMAP )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_MIPMAP; ")));
	if( ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ALLOCONLOAD; ")));
	if( ddsCaps.dwCaps & DDSCAPS_TEXTURE )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_TEXTURE; ")));
	if( ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_VIDEOMEMORY; ")));
	if( ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_SYSTEMMEMORY; ")));
	if( ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ALLOCONLOAD; ")));
	if( ddsCaps.dwCaps & DDSCAPS_TEXTURE )
		DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_TEXTURE; ")));
	DEBUGMSG(HAL_ZONE_CREATE,((TEXT("\r\n"))));
}



EXTERN_C DWORD WINAPI DDGPEFlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA pd )
{
	/*
	typedef struct _DDHAL_FLIPTOGDISURFACEDATA
	{
		LPDDRAWI_DIRECTDRAW_GBL    lpDD;             // driver struct
		DWORD                      dwToGDI;          // TRUE if flipping to the GDI surface, FALSE if flipping away
		DWORD                      dwReserved;       // reserved for future use
		HRESULT                    ddRVal;           // return value
		LPDDHAL_FLIPTOGDISURFACE   FlipToGDISurface; // PRIVATE: ptr to callback
	} DDHAL_FLIPTOGDISURFACEDATA;
	*/

	HRESULT	sc = S_OK;

	pd->ddRVal = DD_OK;

	DEBUGENTER(DDGPEFlipToGDISurface);

	/*if (DDGPEGDIHasSplitFromDDraw())
	{
		DEBUGMSG(HAL_ZONE_INIT | HAL_ZONE_FLIP, (TEXT("DDGPEGDIHasSplitFromDDraw\r\n") ));
		return DDHAL_DRIVER_HANDLED;
	}
	else*/
	if (pd->dwToGDI == TRUE)
	{
		DDGPESurf* pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
		g_pGPE->SetVisibleSurface( pPrimary, NULL, TRUE );
		
		g_pDDrawPrimarySurface = pPrimary; //reconfirm when non-gdi primary's gone - hi, TCI!


		// restore the mode if it has changed
		DWORD dwDDrawModeID = g_pGPE->GetModeId();
		if (dwDDrawModeID != (DWORD)g_pGPE->GetPhysicalModeId())
		{
			HRESULT sc = S_OK;
			
			DEBUGMSG(HAL_ZONE_INFO, (TEXT("Restoring GDI Primary mode to id %d\r\n"), dwDDrawModeID));

			sc = g_pGPE->SetMode(dwDDrawModeID, NULL, FALSE); // don't change GDI mode (just HW)

			// update HAL info
			UpdateHALInit(pd->lpDD, dwDDrawModeID);

			if (FAILED(sc))
			{
				DEBUGMSG(HAL_ZONE_ERROR, (TEXT("Failed to set the physical mode 0x%08x\r\n"), sc));
			}
		}
	}

	DEBUGMSG(HAL_ZONE_INFO, (TEXT("Done flipping to GDI Surface\r\n")));
	DEBUGLEAVE(DDGPEFlipToGDISurface);

	return DDHAL_DRIVER_HANDLED;
}

EXTERN_C DWORD WINAPI DDGPEDestroyDriver( LPDDHAL_DESTROYDRIVERDATA pd )
{
	DEBUGENTER( DDGPEDestroyDriver );
	/*
	typedef struct _DDHAL_DESTROYDRIVERDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;   		// driver struct
	    HRESULT                     ddRVal; 		// return value
	    LPDDHAL_DESTROYDRIVER       DestroyDriver;  // PRIVATE: ptr to callback
	} DDHAL_DESTROYDRIVERDATA;
	*/
	DDHAL_FLIPTOGDISURFACEDATA d;

	memset(&d, 0, sizeof(d));

	DEBUGMSG(HAL_ZONE_INFO, (TEXT("Destroying Driver\r\n") ));

	//if (!DDGPEGDIHasSplitFromDDraw())
	//{
		d.lpDD = pd->lpDD;
		d.dwToGDI = TRUE;
	
		DDGPEFlipToGDISurface( &d );
	/*}
	else
	{
		DDGPESurf* pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
		g_pGPE->SetVisibleSurface( pPrimary, NULL, TRUE );
		
		g_pDDrawPrimarySurface = pPrimary; //reconfirm when non-gdi primary's gone - hi, TCI!

		// restore the mode if it has changed
		DWORD dwDDrawModeID = g_pGPE->GetModeId();
		if (dwDDrawModeID != (DWORD)g_pGPE->GetPhysicalModeId())
		{
			DEBUGMSG(HAL_ZONE_INIT, (TEXT("Restoring GDI Primary mode to id %d\r\n"), dwDDrawModeID));

			HRESULT sc = g_pGPE->SetMode(dwDDrawModeID, NULL, FALSE); // don't change GDI mode (just HW)

			if (FAILED(sc))
			{
				DEBUGMSG(HAL_ZONE_ERROR, (TEXT("Failed to set the physical mode 0x%08x\r\n"), sc));
			}
		}
	}*/

	DEBUGMSG(HAL_ZONE_INFO, (TEXT("Done Destroying Driver\r\n") ));

	pd->ddRVal = DD_OK;
	DEBUGLEAVE( DDGPEDestroyDriver );
	return DDHAL_DRIVER_HANDLED;
}



#ifdef D_MISCELLANEOUSCECALLBACKS
EXTERN_C DWORD WINAPI DDGPEGetGDISurface( LPDDHAL_GETGDISURFACEDATA pd )
{
	DEBUGENTER( HalGetGDISurface );
	/*
	typedef struct _DDHAL_GETGDISURFACEDATA
	{
		LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
		LPDDRAWI_DDRAWSURFACE_LCL   lpGDISurface;   // gdi surface object
		HRESULT                     ddRVal;         // return value
		LPDDHAL_CREATESURFACE       GetGDISurface;  // PRIVATE: ptr to callback
	} DDHAL_GETGDISURFACEDATA;
	*/

	// Implementation

	DDGPESurf*					pPrimary	= NULL;		// Pointer to our primary surface
	LPDDRAWI_DDRAWSURFACE_GBL	pSurf		= NULL;		// Pointer to surface data

	if (pd == NULL)
	{
		return DD_OK; // TODO: return some error code here
	}

	// GPE::PrimarySurface() will always return the DDGPESurf for the GDI primary surface,
	// regardless of whether or not the DDraw primary surface is a separate surface.
	pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
	if (pPrimary == NULL)
	{
		return DD_OK; // TODO: return some error code here
	}

	pSurf = pd->lpGDISurface->lpGbl;
	if (pSurf == NULL)
	{
		return DD_OK; // TODO: return some error code here
	}
	
	pSurf->fpVidMem = (unsigned long)(g_pVideoMemory) + pPrimary->OffsetInVideoMemory();
	pSurf->lPitch = pPrimary->Stride();
	//pPrimary->SetDDGPESurf(pSurf); // don't do this... pSurf might get destroyed sometime.
	DEBUGMSG(GPE_ZONE_CREATE,(TEXT("Create Primary GDI Surface! (&GPESurf = 0x%08x, fpvidmem=0x%08x)\r\n"),
		(unsigned long)pPrimary,
		pSurf->fpVidMem));

	pd->ddRVal = DD_OK;
	DEBUGLEAVE( HalGetGDISurface );
	return DDHAL_DRIVER_HANDLED;
}
#endif //D_MISCELLANEOUSCECALLBACKS


EXTERN_C DWORD WINAPI DDGPESetColorKeyDrv( LPDDHAL_DRVSETCOLORKEYDATA pd )
{
	DEBUGENTER( DDGPESetColorKey );
	/*
	typedef struct _DDHAL_DRVSETCOLORKEYDATA
	{
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    DWORD                       dwFlags;        // flags
	    DDCOLORKEY                  ckNew;          // new color key
	    HRESULT                     ddRVal;         // return value
	    LPDDHAL_SETCOLORKEY         SetColorKey;    // PRIVATE: ptr to callback
	} DDHAL_DRVSETCOLORKEYDATA;
	*/
	
	pd->ddRVal = DD_OK;

	DDGPESurf* pSurf = DDGPESurf::GetDDGPESurf(pd->lpDDSurface);
	if (pSurf != NULL)
	{
		pSurf->SetColorKeyLow(pd->ckNew.dwColorSpaceLowValue);
		pSurf->SetColorKeyHigh(pd->ckNew.dwColorSpaceHighValue);
	}
	else
	{
		// TODO error code
	}

	DEBUGLEAVE( DDGPESetColorKey );
	
	return DDHAL_DRIVER_HANDLED;
}

EXTERN_C DWORD WINAPI DDGPESetColorKey( LPDDHAL_SETCOLORKEYDATA pd )
{
	DEBUGENTER( HalSetColorKey );
	/*
	typedef struct _DDHAL_SETCOLORKEYDATA
	{
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    DWORD                       dwFlags;        // flags
	    DDCOLORKEY                  ckNew;          // new color key
	    HRESULT                     ddRVal;         // return value
	    LPDDHAL_SETCOLORKEY         SetColorKey;    // PRIVATE: ptr to callback
	} DDHAL_SETCOLORKEYDATA;
	*/

	pd->ddRVal = DD_OK;

	DDGPESurf* pSurf = DDGPESurf::GetDDGPESurf(pd->lpDDSurface);
	if (pSurf != NULL)
	{
		pSurf->SetColorKeyLow(pd->ckNew.dwColorSpaceLowValue);
		pSurf->SetColorKeyHigh(pd->ckNew.dwColorSpaceHighValue);
	}
	else
	{
		// TODO error code
	}

	DEBUGLEAVE( DDGPESetColorKey );
	
	return DDHAL_DRIVER_HANDLED;
}


EXTERN_C DWORD WINAPI DDGPECanCreateSurface( LPDDHAL_CANCREATESURFACEDATA pd )
{
	SCODE				sc;
    LPDDSURFACEDESC		lpDDSurfaceDesc;
    LPDDPIXELFORMAT		lpDPF;
    DWORD				dwCaps;
	unsigned int		nWidth;			// Width in pixels
	unsigned int		nHeight;		// Height
	EDDGPEPixelFormat	pixelFormat;	// Pixel format of surface(s) being created
	EGPEFormat			format;

	DEBUGENTER( HalCanCreateSurface );
	/*
	typedef struct _DDHAL_CANCREATESURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL	lpDD;				// driver struct
	    LPDDSURFACEDESC			lpDDSurfaceDesc;	// description of surface being created
	    DWORD					bIsDifferentPixelFormat;
	    											// pixel format differs from primary surface
	    HRESULT					ddRVal;				// return value
	    LPDDHAL_CANCREATESURFACE	CanCreateSurface;
	    											// PRIVATE: ptr to callback
	} DDHAL_CANCREATESURFACEDATA;
	*/

	// Implementation

    lpDDSurfaceDesc	= pd->lpDDSurfaceDesc;
    dwCaps			= lpDDSurfaceDesc->ddsCaps.dwCaps;
	lpDPF			= &(pd->lpDDSurfaceDesc->ddpfPixelFormat);

	nWidth = (pd->lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) ?
		( pd->lpDDSurfaceDesc->dwWidth ) : DDRAW_SCREEN_WIDTH;		// resolves to a call to
																	//  g_pDDrawPrimarySurface or a GPE query

	nHeight = (pd->lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT) ?
		( pd->lpDDSurfaceDesc->dwHeight ) : DDRAW_SCREEN_HEIGHT;	// resolves to a call to
																	//  g_pDDrawPrimarySurface or a GPE query
	
	sc = DDGPEGetPixelFormatFromSurfaceDesc(
				lpDDSurfaceDesc,
				&pixelFormat,
				&format
				);

	if (FAILED(sc))
	{
		DEBUGMSG(HAL_ZONE_WARNING,(TEXT("DDGPECanCreateSurface ERROR - DDERR_UNSUPPORTEDFORMAT (0x%08x)\r\n"),
											sc ));
		pd->ddRVal = sc;
		return DDHAL_DRIVER_HANDLED;
	}

#if 0
	if ( pSurf->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE )
	{
		// checking this is not necessary, as we need to prevent any primary
		// from being created if it isn't supported
		//if ( (pSurf->lpSurfMore->ddsCapsEx.dwCaps4 & DDSCAPS4_NONGDIPRIMARY) )
		//{
		//}

		sc = S_OK;

		if ( (pd->lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) )
		{
			DEBUGMSG(HAL_ZONE_INFO, (TEXT("Using pixel format to check valid mode\r\n") ));
			sc = g_pGPE->DetectMode(&dwModeID, nWidth, nHeight, format, pixelFormat, &pd->lpDDSurfaceDesc->ddpfPixelFormat);
		}
		else
		{
			DEBUGMSG(HAL_ZONE_INFO, (TEXT("NOT using pixel format to check valid mode\r\n") ));
			sc = g_pGPE->DetectMode(&dwModeID, nWidth, nHeight, format, pixelFormat);
		}

		if (FAILED(sc))
		{
			DEBUGMSG(HAL_ZONE_WARNING, (TEXT("valid primary surface check failed 0x%08x\r\n"), sc ));

			pccsd->ddRVal = DDERR_INVALIDPIXELFORMAT;
			return DDHAL_DRIVER_HANDLED;
		}
	}
	else
#endif
	{
		if( !pd->bIsDifferentPixelFormat )
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -