📄 ddhsurf.cpp
字号:
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 + -