//-----------------------------------------------------------------------------
//
// This file contains the general ramp span routine.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//-----------------------------------------------------------------------------

include(`ramppix.mh')dnl
#include "pch.cpp"
#pragma hdrstop

void Ramp_Mono_Modulate(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP,
                        PD3DI_RASTSPAN pS)
{
    INT32 iMapIdx = 0;
    INT32 iIIdx = pS->iIdx >> INDEX_COLOR_SHIFT;
    BOOL bColorKey = FALSE;
    INT32 iIdx = pS->iIdx;
    UINT32 uZ = pS->uZ;
    PUINT8 pZ = pS->pZ;
    INT32 iDZDX = pP->iDZDX;
    d_RpZInit16

    if (pCtx->pdwRenderState[D3DRENDERSTATE_ZENABLE])
    {
        d_RpZTest16Any(`NoPixel')
    }

    // ATTENTION, carefully consolidate this at some point, making sure
    // to update the global color key flag when the render state or the texture
    // changes.

    if (pCtx->cActTex != 0)
    {
        PD3DI_SPANTEX pTex = pCtx->pTexture[0];

        // bColorKey iff there is a texture and it has transparent color AND
        // colorkey is enabled.
        bColorKey = (pCtx->pdwRenderState[D3DRENDERSTATE_COLORKEYENABLE] ||
                     pCtx->pdwRenderState[D3DRENDERSTATE_ALPHABLENDENABLE]) &&
                    (pTex->uFlags & D3DI_SPANTEX_HAS_TRANSPARENT);

        d_RpTexelAddrLOD

        iMapIdx = pCtx->pfnTexRead[0](iU00, iV00, pTex->iShiftPitch[iLOD0],
            pTex->pBits[iLOD0], pTex);
    }

    if(pCtx->pdwRenderState[D3DRENDERSTATE_DITHERENABLE])
    {
        d_RpDither
    }

    if(pCtx->pdwRenderState[D3DRENDERSTATE_ALPHABLENDENABLE] || bColorKey)
    {
        d_RpAlphaTest(`Gen', `NoPixel')
    }

    if (pCtx->pdwRenderState[D3DRENDERSTATE_ZENABLE])
    {
        d_RpZWrite16(`Gen')
    }

    iMapIdx &= 0xffffff;    // mask off texture alpha
    iMapIdx += iIIdx;

#if DBG
    if (iMapIdx < 0 || iMapIdx > 0x7fff)
    {
        D3D_WARN(0, "Ramp index out of range: 0x%X", iMapIdx);
    }
#endif
    // always put iMapIdx into range
    iMapIdx &= 0x7fff;

    switch (pCtx->iSurfaceType)
    {
    case RR_STYPE_B8G8R8X8:
    case RR_STYPE_B8G8R8A8:
        *(PUINT32)pS->pSurface = (UINT32)(pCtx->pRampMap[iMapIdx]);
        break;
    case RR_STYPE_B8G8R8:
        {
            PUINT8 pSurf = (PUINT8)pS->pSurface;
            UINT32 Color = (UINT32)(pCtx->pRampMap[iMapIdx]);
            pSurf[0] = (UINT8)(Color);
            pSurf[1] = (UINT8)(Color >> 8);
            pSurf[2] = (UINT8)(Color >> 16);
        }
        break;
    case RR_STYPE_B5G6R5:
    case RR_STYPE_B5G5R5:
    case RR_STYPE_B5G5R5A1:
        *(PUINT16)pS->pSurface = (UINT16)(pCtx->pRampMap[iMapIdx]);
        break;
    case RR_STYPE_PALETTE8:
        *(PUINT8)pS->pSurface = (UINT8)(pCtx->pRampMap[iMapIdx]);
        break;
    }

NoPixel:
    if (pCtx->pdwRenderState[D3DRENDERSTATE_ZENABLE])
    {
        pS->uZ = uZ;
    }
    if (pCtx->pdwRenderState[D3DRENDERSTATE_SHADEMODE] != D3DSHADE_FLAT)
    {
        pS->iIdx += pP->iDIdxDX;
        pS->iIdxA += pP->iDIdxADX;
    }
    if (pCtx->cActTex != 0)
    {
        if (pCtx->pdwRenderState[D3DRENDERSTATE_TEXTUREPERSPECTIVE])
        {
            d_RpSpecialWPerspStepTexLOD
        }
        else
        {
            d_RpAffineStepTexLOD
        }
    }
}