//----------------------------------------------------------------------------
//
// primfns.cpp
//
// Primitive functions for RGB.
//
// Copyright (C) Microsoft Corporation, 1998.
//
// WARNING WARNING WARNING
// This cpp file generated from mcp file.
// EDIT THE MCP FILE.
// I warned you.
// WARNING WARNING WARNING
//
//----------------------------------------------------------------------------
include(`m4hdr.mh')dnl
#include "pch.cpp"
#pragma hdrstop

void
RGB_StoreLastPixelState(LPVOID pCtx, BOOL bStore)
{
    ((D3DContext *)pCtx)->StoreLastPixelState(bStore);
}
dnl

HRESULT
RGB_Dp2SetViewport(LPVOID pCtx, LPD3DHAL_DP2COMMAND pCmd)
{
    LPD3DHAL_DP2VIEWPORTINFO pVpt;

    // Keep only the last viewport notification
    pVpt = (D3DHAL_DP2VIEWPORTINFO *)(pCmd + 1) + (pCmd->wStateCount - 1);

    return ((D3DContext *)pCtx)->SetViewport(pVpt);
    // return D3D_OK;
}

HRESULT
RGB_Dp2SetWRange(LPVOID pCtx, LPD3DHAL_DP2COMMAND pCmd)
{
    return D3D_OK;
}

HRESULT
RGB_Dp2SetRenderStates(LPVOID pCtx, DWORD dwFvf, LPD3DHAL_DP2COMMAND pCmd, LPDWORD lpdwRuntimeRStates)
{
    return ((D3DContext *)pCtx)->Dp2SetRenderStates(pCmd, lpdwRuntimeRStates);
}

HRESULT
RGB_Dp2TextureStageState(LPVOID pCtx, DWORD dwFvf, LPD3DHAL_DP2COMMAND pCmd)
{
    return ((D3DContext *)pCtx)->Dp2TextureStageState(pCmd, dwFvf);
}

dnl Call RampCheckTexMap if necessary
dnl $1 - RAMP or RGB
dnl $2 - pCtx
dnl $3 - pVtx0
define(`d_CheckRamp',`dnl
ifelse(`$1', `RAMP',`
    HRESULT hr;
    // Chekc if Rampmap has changed
    HR_RET(((D3DContext *)$2)->RampCheckTexMap((LPD3DTLVERTEX)$3));')')dnl
dnl
define(`d_PointFunc',`
HRESULT
$1_Point$2(LPVOID pCtx, PUINT8 pVtx)
{
d_CheckRamp($1, pCtx, pVtx)dnl
ifelse(`$2',`Pack',`dnl
    RAST_GENERIC_VERTEX genVtx;
    ((D3DContext *)pCtx)->PackGenVertex(pVtx, &genVtx);
    return ((D3DContext *)pCtx)->m_PrimProc.Point((LPD3DTLVERTEX)&genVtx, (LPD3DTLVERTEX)&genVtx);', `
    return ((D3DContext *)pCtx)->m_PrimProc.Point((LPD3DTLVERTEX)pVtx, (LPD3DTLVERTEX)pVtx);')
}')dnl
dnl
define(`d_LineFunc',`
HRESULT
$1_Line$2(LPVOID pCtx, PUINT8 pVtx0, PUINT8 pVtx1)
{
d_CheckRamp($1, pCtx, pVtx0)dnl
ifelse(`$2',`Pack',`dnl
    RAST_GENERIC_VERTEX genVtx0, genVtx1;
    ((D3DContext *)pCtx)->PackGenVertex(pVtx0, &genVtx0);
    ((D3DContext *)pCtx)->PackGenVertex(pVtx1, &genVtx1);
    return ((D3DContext *)pCtx)->m_PrimProc.Line((LPD3DTLVERTEX)&genVtx0,
                                        (LPD3DTLVERTEX)&genVtx1,
                                        (LPD3DTLVERTEX)&genVtx0);', `
    return ((D3DContext *)pCtx)->m_PrimProc.Line((LPD3DTLVERTEX)pVtx0,
                                        (LPD3DTLVERTEX)pVtx1,
                                        (LPD3DTLVERTEX)pVtx0);')
}')dnl
dnl
dnl Call different functions for different fill mode
dnl $1 - Point, Wireframe or Solid
dnl $2 - pCtx
dnl $3 - pVtx0
dnl $4 - pVtx1
dnl $5 - pVtx2
dnl $6 - wFlags
dnl $7 - RAMP or RGB
define(`d_CheckFillMode',`
ifelse(`$1', `Solid',`
    return ((D3DContext *)$2)->m_PrimProc.Tri($3, $4, $5);',`dnl
    ifelse(`$1', `Point',`
    ifelse(`$7', `RGB',`HRESULT hr;')
    HR_RET(((D3DContext *)$2)->m_PrimProc.Point($3, $3));
    HR_RET(((D3DContext *)$2)->m_PrimProc.Point($4, $3));
    HR_RET(((D3DContext *)$2)->m_PrimProc.Point($5, $3));
    return D3D_OK;', `
    if (((D3DContext *)$2)->NotCulled($3, $4, $5))
    {
        ifelse(`$7', `RGB',`HRESULT hr;')
        if ($6 & D3DTRIFLAG_EDGEENABLE1)
        {
            HR_RET(((D3DContext *)$2)->m_PrimProc.Line($3, $4, $3));
        }
        if ($6 & D3DTRIFLAG_EDGEENABLE2)
        {
            HR_RET(((D3DContext *)$2)->m_PrimProc.Line($4, $5, $3));
        }
        if ($6 & D3DTRIFLAG_EDGEENABLE3)
        {
            HR_RET(((D3DContext *)$2)->m_PrimProc.Line($5, $3, $3));
        }
    }
    return D3D_OK;')')')dnl
dnl
define(`d_TriFunc',`
HRESULT
$1_Tri$2$3(LPVOID pCtx, PUINT8 pVtx0, PUINT8 pVtx1, PUINT8 pVtx2, WORD wFlags)
{dnl
d_CheckRamp($1, pCtx, pVtx0)dnl
ifelse(`$2',`Pack',`
    RAST_GENERIC_VERTEX genVtx0, genVtx1, genVtx2;
    ((D3DContext *)pCtx)->PackGenVertex(pVtx0, &genVtx0);
    ((D3DContext *)pCtx)->PackGenVertex(pVtx1, &genVtx1);
    ((D3DContext *)pCtx)->PackGenVertex(pVtx2, &genVtx2);
    d_CheckFillMode($3, pCtx, (LPD3DTLVERTEX)&genVtx0,
                                        (LPD3DTLVERTEX)&genVtx1,
                                        (LPD3DTLVERTEX)&genVtx2, wFlags, $1);', `dnl
    d_CheckFillMode($3, pCtx, (LPD3DTLVERTEX)pVtx0,
                                        (LPD3DTLVERTEX)pVtx1,
                                        (LPD3DTLVERTEX)pVtx2, wFlags, $1)')
}')dnl
d_RepStr(`d_RepStr(`d_PointFunc(AA, BB)',
        `AA', `RGB')',
        `BB', `Pack', `NoPack')
d_RepStr(`d_RepStr(`d_LineFunc(AA, BB)',
        `AA', `RGB')',
        `BB', `Pack', `NoPack')
d_RepStr(`d_RepStr(`d_RepStr(`d_TriFunc(AA, BB, CC)',
         `AA', `RGB')',
         `BB', `Pack', `NoPack')',
         `CC', `Point', `Wireframe', `Solid')