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.
174 lines
6.3 KiB
174 lines
6.3 KiB
//-----------------------------------------------------------------------------
|
|
//
|
|
// This file contains C span loops.
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "rgb_pch.h"
|
|
#pragma hdrstop
|
|
|
|
HRESULT
|
|
CMLRast_1(
|
|
PD3DI_RASTCTX pCtx)
|
|
{
|
|
PD3DI_RASTPRIM pP = pCtx->pPrim;
|
|
|
|
while (pP)
|
|
{
|
|
UINT16 uSpans = pP->uSpans;
|
|
PD3DI_RASTSPAN pS = (PD3DI_RASTSPAN)(pP + 1);
|
|
|
|
while (uSpans-- > 0)
|
|
{
|
|
UINT16 uPix = pS->uPix;
|
|
INT iSurfaceStep;
|
|
INT iZStep;
|
|
|
|
if (pP->uFlags & D3DI_RASTPRIM_X_DEC) {
|
|
iZStep = -pCtx->iZStep;
|
|
iSurfaceStep = -pCtx->iSurfaceStep;
|
|
pCtx->SI.iXStep = -1; // for dithering
|
|
} else {
|
|
iZStep = pCtx->iZStep;
|
|
iSurfaceStep = pCtx->iSurfaceStep;
|
|
pCtx->SI.iXStep = 1;
|
|
}
|
|
|
|
while (1) {
|
|
UINT16 uZ = (UINT16)(pS->uZ>>15);
|
|
UINT16 uZB = *((UINT16*)pS->pZ);
|
|
pS->uZ += pP->iDZDX;
|
|
if ((pCtx->iZXorMask)^(uZ > uZB)) {
|
|
*((UINT16*)pS->pZ) = uZ;
|
|
pCtx->SI.uBB = pS->uB;
|
|
pCtx->SI.uBG = pS->uG;
|
|
pCtx->SI.uBR = pS->uR;
|
|
pCtx->SI.uBA = pS->uA;
|
|
pS->uB += pP->iDBDX; pS->uG += pP->iDGDX;
|
|
pS->uR += pP->iDRDX; pS->uA += pP->iDADX;
|
|
pCtx->SI.uBB = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBB + (UINT32)pS->uBS, 0xffff);
|
|
pCtx->SI.uBG = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBG + (UINT32)pS->uGS, 0xffff);
|
|
pCtx->SI.uBR = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBR + (UINT32)pS->uRS, 0xffff);
|
|
pS->uBS += pP->iDBSDX; pS->uGS += pP->iDGSDX;
|
|
pS->uRS += pP->iDRSDX;
|
|
*(PUINT16)pS->pSurface =
|
|
((pCtx->SI.uBR >> 1) & 0x7c00) |
|
|
((pCtx->SI.uBG >> 6) & 0x03e0) |
|
|
((pCtx->SI.uBB >> 11) & 0x001f) |
|
|
0x8000;
|
|
} else {
|
|
pS->uB += pP->iDBDX; pS->uG += pP->iDGDX;
|
|
pS->uR += pP->iDRDX; pS->uA += pP->iDADX;
|
|
if (pCtx->pdwRenderState[D3DRS_SPECULARENABLE]) {
|
|
pS->uBS += pP->iDBSDX; pS->uGS += pP->iDGSDX;
|
|
pS->uRS += pP->iDRSDX;
|
|
}
|
|
if (pCtx->pdwRenderState[D3DRS_FOGENABLE]) {
|
|
pS->uFog += (INT16)pS->iDFog;
|
|
pCtx->SI.uFogB += pCtx->SI.iFogBDX;
|
|
pCtx->SI.uFogG += pCtx->SI.iFogGDX;
|
|
pCtx->SI.uFogR += pCtx->SI.iFogRDX;
|
|
}
|
|
}
|
|
if (--uPix <= 0)
|
|
break;
|
|
pS->pZ += iZStep;
|
|
pS->pSurface += iSurfaceStep;
|
|
#ifdef DBG
|
|
// handy for debug to see where we are
|
|
pS->uX += (INT16)pCtx->SI.iXStep;
|
|
#endif
|
|
}
|
|
|
|
pS++;
|
|
}
|
|
|
|
pP = pP->pNext;
|
|
}
|
|
|
|
return DD_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CMLRast_2(
|
|
PD3DI_RASTCTX pCtx)
|
|
{
|
|
PD3DI_RASTPRIM pP = pCtx->pPrim;
|
|
|
|
while (pP)
|
|
{
|
|
UINT16 uSpans = pP->uSpans;
|
|
PD3DI_RASTSPAN pS = (PD3DI_RASTSPAN)(pP + 1);
|
|
|
|
while (uSpans-- > 0)
|
|
{
|
|
UINT16 uPix = pS->uPix;
|
|
INT iSurfaceStep;
|
|
INT iZStep;
|
|
|
|
if (pP->uFlags & D3DI_RASTPRIM_X_DEC) {
|
|
iZStep = -pCtx->iZStep;
|
|
iSurfaceStep = -pCtx->iSurfaceStep;
|
|
pCtx->SI.iXStep = -1; // for dithering
|
|
} else {
|
|
iZStep = pCtx->iZStep;
|
|
iSurfaceStep = pCtx->iSurfaceStep;
|
|
pCtx->SI.iXStep = 1;
|
|
}
|
|
|
|
while (1) {
|
|
UINT16 uZ = (UINT16)(pS->uZ>>15);
|
|
UINT16 uZB = *((UINT16*)pS->pZ);
|
|
pS->uZ += pP->iDZDX;
|
|
if ((pCtx->iZXorMask)^(uZ > uZB)) {
|
|
*((UINT16*)pS->pZ) = uZ;
|
|
pCtx->SI.uBB = pS->uB;
|
|
pCtx->SI.uBG = pS->uG;
|
|
pCtx->SI.uBR = pS->uR;
|
|
pCtx->SI.uBA = pS->uA;
|
|
pS->uB += pP->iDBDX; pS->uG += pP->iDGDX;
|
|
pS->uR += pP->iDRDX; pS->uA += pP->iDADX;
|
|
pCtx->SI.uBB = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBB + (UINT32)pS->uBS, 0xffff);
|
|
pCtx->SI.uBG = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBG + (UINT32)pS->uGS, 0xffff);
|
|
pCtx->SI.uBR = (UINT16)min< UINT32>((UINT32)pCtx->SI.uBR + (UINT32)pS->uRS, 0xffff);
|
|
pS->uBS += pP->iDBSDX; pS->uGS += pP->iDGSDX;
|
|
pS->uRS += pP->iDRSDX;
|
|
UINT32 uARGB = RGBA_MAKE(pCtx->SI.uBR>>8, pCtx->SI.uBG>>8,
|
|
pCtx->SI.uBB>>8, 0xff);
|
|
PUINT32 pSurface = (PUINT32)pS->pSurface;
|
|
*pSurface = uARGB;
|
|
} else {
|
|
pS->uB += pP->iDBDX; pS->uG += pP->iDGDX;
|
|
pS->uR += pP->iDRDX; pS->uA += pP->iDADX;
|
|
if (pCtx->pdwRenderState[D3DRS_SPECULARENABLE]) {
|
|
pS->uBS += pP->iDBSDX; pS->uGS += pP->iDGSDX;
|
|
pS->uRS += pP->iDRSDX;
|
|
}
|
|
if (pCtx->pdwRenderState[D3DRS_FOGENABLE]) {
|
|
pS->uFog += (INT16)pS->iDFog;
|
|
pCtx->SI.uFogB += pCtx->SI.iFogBDX;
|
|
pCtx->SI.uFogG += pCtx->SI.iFogGDX;
|
|
pCtx->SI.uFogR += pCtx->SI.iFogRDX;
|
|
}
|
|
}
|
|
if (--uPix <= 0)
|
|
break;
|
|
pS->pZ += iZStep;
|
|
pS->pSurface += iSurfaceStep;
|
|
#ifdef DBG
|
|
// handy for debug to see where we are
|
|
pS->uX += (INT16)pCtx->SI.iXStep;
|
|
#endif
|
|
}
|
|
|
|
pS++;
|
|
}
|
|
|
|
pP = pP->pNext;
|
|
}
|
|
|
|
return DD_OK;
|
|
}
|
|
|