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

📄 ddhsurf.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	return DDHAL_DRIVER_HANDLED;
}

//////////////////////////// DDHAL_DDSURFACECALLBACKS ////////////////////////////

EXTERN_C DWORD WINAPI DDGPEDestroySurface( LPDDHAL_DESTROYSURFACEDATA pd )
{
	DEBUGENTER( DDGPEDestroySurface );
	/*
	typedef struct _DDHAL_DESTROYSURFACEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_DESTROYSURFACE DestroySurface;// PRIVATE: ptr to callback
		BOOL						fDestroyGlobal;
	} DDHAL_DESTROYSURFACEDATA;
	*/

	DEBUGMSG(GPE_ZONE_CREATE,(TEXT("Destroy GPESurf *:0x%08x\r\n"), DDGPESurf::GetDDGPESurf(pd->lpDDSurface) ));

	// Make sure we're not destroying the GDI surface.
	if( (DDGPESurf*)(g_pGPE->PrimarySurface()) != DDGPESurf::GetDDGPESurf(pd->lpDDSurface) )
	{
		DDGPESurf::DeleteSurface(pd->lpDDSurface);
		pd->lpDDSurface = NULL;
	}

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

int flipcount;

EXTERN_C DWORD WINAPI DDGPEFlip( LPDDHAL_FLIPDATA pd )
{
	DEBUGENTER( DDGPEFlip );
	/*
	typedef struct _DDHAL_FLIPDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpSurfCurr;     // current surface
	    LPDDRAWI_DDRAWSURFACE_LCL   lpSurfTarg;     // target surface (to flip to)
	    DWORD                       dwFlags;        // flags
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_FLIP          Flip;           // PRIVATE: ptr to callback
	} DDHAL_FLIPDATA;
	*/

	//DEBUGMSG(HAL_ZONE_INFO, (TEXT("Flip\r\n") ));

	//DDGPESurf* s1 = DDGPESurf::GetDDGPESurf(pd->lpSurfCurr);
	DDGPESurf* s2 = DDGPESurf::GetDDGPESurf(pd->lpSurfTarg);

	DEBUGMSG(GPE_ZONE_FLIP,
		(TEXT("Flipping from GPESurf 0x%08x to 0x%08x\r\n"),
		DDGPESurf::GetDDGPESurf(pd->lpSurfCurr), DDGPESurf::GetDDGPESurf(pd->lpSurfTarg) 
		));

	DEBUGMSG(GPE_ZONE_FLIP,
		(TEXT("fpVidmem            is 0x%08x 0x%08x\r\n"),
		(int)(pd->lpSurfCurr->lpGbl->fpVidMem),
		(int)(pd->lpSurfTarg->lpGbl->fpVidMem)	 
		));
	DEBUGMSG(GPE_ZONE_FLIP,
		(TEXT("OffsetInVideoMemory is 0x%08x 0x%08x\r\n"),
		(int)(DDGPESurf::GetDDGPESurf(pd->lpSurfCurr)->OffsetInVideoMemory()),	 
		(int)(s2->OffsetInVideoMemory())	 
		));

	/*
	Done in Hal Implementation
	
	if( g_pGPE->IsBusy() )
	{
		if( pd->dwFlags & DDFLIP_WAIT )
		{
			g_pGPE->WaitForNotBusy();
		}
		else
		{
			DEBUGMSG(GPE_ZONE_FLIP,(TEXT("Graphics engine busy\r\n")));
			pd->ddRVal = DDERR_WASSTILLDRAWING;
			return DDHAL_DRIVER_HANDLED;
		}
	}
	*/

//	if( g_pGPE->FlipInProgress() )
//	{
//		if( pd->dwFlags & DDFLIP_WAIT )
//			g_pGPE->WaitForVBlank();
//		else
//		{
//			DEBUGMSG(GPE_ZONE_FLIP,(TEXT("Flip still in progress\r\n")));
//			pd->ddRVal = DDERR_WASSTILLDRAWING;
//			return DDHAL_DRIVER_HANDLED;
//		}
//	}

	g_pGPE->SetVisibleSurface(s2, (DWORD)pd, pd->dwFlags & DDFLIP_WAIT);

	
        // Not necessary when dealing with surface gbls. The reserved
        // member is moved along with everything else...

	// Swap the surfaces - DDraw swaps the fpVidmem values itself
	//DDGPESurf::Swap(pd->lpSurfCurr, pd->lpSurfTarg);


	DEBUGMSG(GPE_ZONE_FLIP,(TEXT("Flip done\r\n")));

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

EXTERN_C DWORD WINAPI DDGPEBlt( LPDDHAL_BLTDATA pd )
{
	DEBUGENTER( DDGPEBlt );
	/*
	typedef struct _DDHAL_BLTDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDDestSurface;// dest surface
	    RECTL                       rDest;          // dest rect
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSrcSurface; // src surface
	    RECTL                       rSrc;           // src rect
	    DWORD                       dwFlags;        // blt flags
	    DWORD                       dwROPFlags;     // ROP flags (valid for ROPS only)
	    DDBLTFX                     bltFX;          // blt FX
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_BLT           Blt;            // PRIVATE: ptr to callback
	} DDHAL_BLTDATA;
	*/
	DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("BLT (dwflags=%08x) rDest= %d,%d - %d,%d\n"),
		pd->dwFlags,
		pd->rDest.left,
		pd->rDest.top,
		pd->rDest.right,
		pd->rDest.bottom
		)); 

	//DebugBreak();

	DDGPESurf* pDst = DDGPESurf::GetDDGPESurf(pd->lpDDDestSurface);
	DDGPESurf* pSrc = (DDGPESurf* )NULL;
	DDGPESurf* pPattern = (DDGPESurf* )NULL;
	RECT *prclDst = (RECT *)&(pd->rDest);
	RECT *prclSrc = (RECT *)&(pd->rSrc);
	ULONG solidColor;
	ULONG bltFlags = (pd->dwFlags & DDBLT_WAIT)?0x100:0;
	ULONG rop4;

	//DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("Blit 0x%x, 0x%x\r\n"), pDst, pDst->OffsetInVideoMemory()));

	if( pd->lpDDSrcSurface )
		pSrc = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface);
	else
		pSrc = (DDGPESurf*)NULL;

	if ( ( pd->dwFlags & DDBLT_COLORFILL ) ||
		( ( pd->dwFlags & DDBLT_ROP ) &&
			( pd->bltFX.dwROP == BLACKNESS || pd->bltFX.dwROP == WHITENESS ) ) )
	{
		/*
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("DDRAW Dest Info:\n\r") ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    left    = %d\n\r"),  pd->rDest.left ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    top     = %d\n\r"),  pd->rDest.top ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    right   = %d\n\r"),  pd->rDest.right ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    bottom  = %d\n\r"),  pd->rDest.bottom ));

		if (pSrc != NULL)
		{
			DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("DDRAW Src Info:\n\r") ));
			DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    left    = %d\n\r"),  pd->rSrc.left ));
			DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    top     = %d\n\r"),  pd->rSrc.top ));
			DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    right   = %d\n\r"),  pd->rSrc.right ));
			DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    bottom  = %d\n\r"),  pd->rSrc.bottom ));
		}
		*/

		// FILL BLT
		DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("FILL BLT\n")));

		if( ( pd->dwFlags & DDBLT_ROP ) && ( pd->bltFX.dwROP == BLACKNESS ) )
			rop4 = 0x0000;
		else if( ( pd->dwFlags & DDBLT_ROP ) && ( pd->bltFX.dwROP == WHITENESS ) )
			rop4 = 0xffff;
		else
		{
			rop4 = 0xf0f0;	// PATCOPY
			solidColor = pd->bltFX.dwFillColor;
                        switch (pDst->Bpp()) {
                        case 1:
                        case 2:
                        case 4:
                        case 8:
                          solidColor &= 0x000000FF;
                          break;
                        case 15:
                        case 16:
                          solidColor &= 0x0000FFFF;
                          break;
                        case 24:
                          solidColor &= 0x00FFFFFF;
                          break;
                        case 32:
                          solidColor &= 0xFFFFFFFF;
                          break;
                        }
		}
	}
	else if ( ( pd->dwFlags & DDBLT_ROP ) && ( pd->bltFX.dwROP == PATCOPY ) )
	{
		// PAT BLT
		DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("PAT BLT\n")));
		rop4 = 0xf0f0;	// PATCOPY;
		solidColor = 0xffffffff;	// i.e. not a solid color blt
		pPattern = DDGPESurf::GetDDGPESurf((LPDDRAWI_DDRAWSURFACE_LCL)(pd->bltFX.lpDDSPattern));
	}
	else if ( pd->dwFlags & ( DDBLT_KEYSRCOVERRIDE | DDBLT_KEYSRC ) )
	{
		// TRANSPARENT BLT
		DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("TRANSPARENT BLT\n")));

		if ( pd->dwFlags & DDBLT_KEYSRCOVERRIDE )
		{
			DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("DDBLT_KEYSRCOVERRIDE, xparent = 0x%x\n"),pd->bltFX.ddckSrcColorkey.dwColorSpaceLowValue));
			solidColor = pd->bltFX.ddckSrcColorkey.dwColorSpaceLowValue;
		}
		else
		{
			DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("DDBLT_KEYSRC, xparent = 0x%x\n"),pd->lpDDSrcSurface->ddckCKSrcBlt.dwColorSpaceLowValue));
			solidColor = pd->lpDDSrcSurface->ddckCKSrcBlt.dwColorSpaceLowValue;
		}

		rop4 = 0xCCCC;	// SRCCOPY
		bltFlags |= BLT_TRANSPARENT;

		// BLT_STRETCH?
		if ((prclDst != NULL) && (prclSrc != NULL))
		{
			if (( (prclDst->bottom - prclDst->top) != (prclSrc->bottom - prclSrc->top))
				|| ((prclDst->right - prclDst->left)  != (prclSrc->right - prclSrc->left) ))
			{
				bltFlags |= BLT_STRETCH;
			}
		}
	}
	else
	{
		// SIMPLE BLT
		DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("SIMPLE BLT\n")));

		// BLT_STRETCH?
		if ((prclDst != NULL) && (prclSrc != NULL))
		{
			if (( (prclDst->bottom - prclDst->top) != (prclSrc->bottom - prclSrc->top))
				|| ((prclDst->right - prclDst->left)  != (prclSrc->right - prclSrc->left) ))
			{
				bltFlags |= BLT_STRETCH;
			}
		}

		rop4 = 0xCCCC;	// SRCCOPY

	}

	/*
	DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("DDRAW Dest Info:\n\r") ));
	DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    left    = %d\n\r"),  prclDst->left ));
	DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    top     = %d\n\r"),  prclDst->top ));
	DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    right   = %d\n\r"),  prclDst->right ));
	DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    bottom  = %d\n\r"),  prclDst->bottom ));

	if (pSrc != NULL)
	{
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("DDRAW Src Info:\n\r") ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    left    = %d\n\r"),  prclSrc->left ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    top     = %d\n\r"),  prclSrc->top ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    right   = %d\n\r"),  prclSrc->right ));
		DEBUGMSG(GPE_ZONE_BLT_HI, (TEXT("    bottom  = %d\n\r"),  prclSrc->bottom ));
	}
	*/
		
	pd->ddRVal = g_pGPE->BltExpanded(
					pDst,
					pSrc,
					pPattern,
					NULL, // pMask
					NULL, // pco
					NULL, // pxlo
					prclDst,
					prclSrc,
					solidColor,
					bltFlags,
					rop4
					);

	DEBUGLEAVE( DDGPEBlt );
	return DDHAL_DRIVER_HANDLED;
}

EXTERN_C DWORD WINAPI DDGPEGetFlipStatus( LPDDHAL_GETFLIPSTATUSDATA pd )
{
	DEBUGENTER( DDGPEGetFlipStatus );
	/*
	typedef struct _DDHAL_GETFLIPSTATUSDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    DWORD                       dwFlags;        // flags
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_GETFLIPSTATUS GetFlipStatus;  // PRIVATE: ptr to callback
	} DDHAL_GETFLIPSTATUSDATA;
	*/
//	gpS3Trio64->m_pDCE->WaitForVBlank();	// TBD: Return true status
	pd->ddRVal = DD_OK;
	if( g_pGPE->FlipInProgress() )
		pd->ddRVal = DDERR_WASSTILLDRAWING;
	else if( pd->dwFlags & DDGFS_CANFLIP )
		if( g_pGPE->IsBusy() )
			pd->ddRVal = DDERR_WASSTILLDRAWING;

	DEBUGLEAVE( DDGPEGetFlipStatus );
	return DDHAL_DRIVER_HANDLED;
}

EXTERN_C DWORD WINAPI DDGPESetPalette( LPDDHAL_SETPALETTEDATA pd )
{
	DEBUGENTER( DDGPESetPalette );
	/*
	typedef struct _DDHAL_SETPALETTEDATA
	{
	    LPDDRAWI_DIRECTDRAW_GBL     lpDD;           // driver struct
	    LPDDRAWI_DDRAWSURFACE_LCL   lpDDSurface;    // surface struct
	    LPDDRAWI_DDRAWPALETTE_GBL   lpDDPalette;    // palette to set to surface
	    HRESULT                     ddRVal;         // return value
	    LPDDHALSURFCB_SETPALETTE    SetPalette;     // PRIVATE: ptr to callback
	    BOOL                        Attach;         // attach this palette?
	} DDHAL_SETPALETTEDATA;
	*/

	g_pGPE->SetPalette((PALETTEENTRY *)(pd->lpDDPalette->lpColorTable),0,256);
	
	pd->ddRVal = DD_OK;
	DEBUGLEAVE( DDGPESetPalette );
	return DDHAL_DRIVER_HANDLED;
}


⌨️ 快捷键说明

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