Leaked source code of windows server 2003
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.
 
 
 
 
 
 

214 lines
7.5 KiB

//-----------------------------------------------------------------------------
//
// This file contains the output buffer color writing routines.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//-----------------------------------------------------------------------------
#include "rgb_pch.h"
#pragma hdrstop
#include "cbufwrt.h"
// Names are read LSB to MSB, so B5G6R5 means five bits of blue starting
// at the LSB, then six bits of green, then five bits of red.
extern UINT16 g_uDitherTable[16];
//-----------------------------------------------------------------------------
//
// Write_B8G8R8X8_NoDither
//
// Writes output in BGR-888 format, aligned to 32 bits.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B8G8R8X8_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
// Must write 0 for the unspecified alpha channel to be compatible with DX5
// for destination color keying
UINT32 uARGB = RGBA_MAKE(pCtx->SI.uBR>>8, pCtx->SI.uBG>>8,
pCtx->SI.uBB>>8, 0x00);
PUINT32 pSurface = (PUINT32)pS->pSurface;
*pSurface = uARGB;
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B8G8R8A8_NoDither
//
// Writes output in BGRA-8888 format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B8G8R8A8_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
UINT32 uARGB = RGBA_MAKE(pCtx->SI.uBR>>8, pCtx->SI.uBG>>8,
pCtx->SI.uBB>>8, pCtx->SI.uBA>>8);
PUINT32 pSurface = (PUINT32)pS->pSurface;
*pSurface = uARGB;
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G6R5_NoDither
//
// Writes output in BGR-565 format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G6R5_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
*(PUINT16)pS->pSurface =
((pCtx->SI.uBR >> 0) & 0xf800) |
((pCtx->SI.uBG >> 5) & 0x07e0) |
((pCtx->SI.uBB >> 11) & 0x001f);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G6R5_Dither
//
// Writes output in BGR-565 format, dithered.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G6R5_Dither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
UINT16 uDither = g_uDitherTable[pCtx->SI.uDitherOffset];
UINT16 uB = pCtx->SI.uBB >> 3; // 8.8 >> 3 = 8.5
UINT16 uG = pCtx->SI.uBG >> 2;
UINT16 uR = pCtx->SI.uBR >> 3;
uB = min< UINT16>((uB >> 8) + ((uB & 0xff) > uDither), 0x1f);
uG = min< UINT16>((uG >> 8) + ((uG & 0xff) > uDither), 0x3f);
uR = min< UINT16>((uR >> 8) + ((uR & 0xff) > uDither), 0x1f);
*(PUINT16)pS->pSurface = uB | (uG << 5) | (uR << 11);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G5R5_NoDither
//
// Writes output in BGR-555 format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G5R5_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
// Must write 0 for the unspecified alpha channel to be compatible with DX5
// for destination color keying
*(PUINT16)pS->pSurface =
((pCtx->SI.uBR >> 1) & 0x7c00) |
((pCtx->SI.uBG >> 6) & 0x03e0) |
((pCtx->SI.uBB >> 11) & 0x001f);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G5R5_Dither
//
// Writes output in BGR-555 format, dithered.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G5R5_Dither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
UINT16 uDither = g_uDitherTable[pCtx->SI.uDitherOffset];
UINT16 uB = pCtx->SI.uBB >> 3; // 8.8 >> 3 = 8.5
UINT16 uG = pCtx->SI.uBG >> 3;
UINT16 uR = pCtx->SI.uBR >> 3;
uB = min< UINT16>((uB >> 8) + ((uB & 0xff) > uDither), 0x1f);
uG = min< UINT16>((uG >> 8) + ((uG & 0xff) > uDither), 0x1f);
uR = min< UINT16>((uR >> 8) + ((uR & 0xff) > uDither), 0x1f);
// Must write 0 for the unspecified alpha channel to be compatible with DX5
// for destination color keying
*(PUINT16)pS->pSurface = uB | (uG << 5) | (uR << 10);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G5R5A1_NoDither
//
// Writes output in BGRA-1555 format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G5R5A1_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
*(PUINT16)pS->pSurface =
((pCtx->SI.uBR >> 1) & 0x7c00) |
((pCtx->SI.uBG >> 6) & 0x03e0) |
((pCtx->SI.uBB >> 11) & 0x001f) |
((pCtx->SI.uBA >> 0) & 0x8000);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B5G5R5A1_Dither
//
// Writes output in BGRA-1555 format, dithered.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B5G5R5A1_Dither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
UINT16 uDither = g_uDitherTable[pCtx->SI.uDitherOffset];
UINT16 uB = pCtx->SI.uBB >> 3; // 8.8 >> 3 = 8.5
UINT16 uG = pCtx->SI.uBG >> 3;
UINT16 uR = pCtx->SI.uBR >> 3;
uB = min< UINT16>((uB >> 8) + ((uB & 0xff) > uDither), 0x1f);
uG = min< UINT16>((uG >> 8) + ((uG & 0xff) > uDither), 0x1f);
uR = min< UINT16>((uR >> 8) + ((uR & 0xff) > uDither), 0x1f);
*(PUINT16)pS->pSurface = uB | (uG << 5) | (uR << 10) | (pCtx->SI.uBA & 0x8000);
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_B8G8R8_NoDither
//
// Writes output in BGR-888 format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_B8G8R8_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
PUINT8 pSurface = (PUINT8)pS->pSurface;
*pSurface++ = pCtx->SI.uBB>>8;
*pSurface++ = pCtx->SI.uBG>>8;
*pSurface++ = pCtx->SI.uBR>>8;
// just returns for C, since we really can't loop with function calls
}
//-----------------------------------------------------------------------------
//
// Write_Palette8_NoDither
//
// Writes output to the RGB8 palette format.
//
//-----------------------------------------------------------------------------
void C_BufWrite_Palette8_NoDither(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP, PD3DI_RASTSPAN pS)
{
UINT16 uMapIdx = MAKE_RGB8(pCtx->SI.uBR>>8, pCtx->SI.uBG>>8, pCtx->SI.uBB>>8);
*(PUINT8)pS->pSurface = (UINT8)(pCtx->pRampMap[uMapIdx]);
// just returns for C, since we really can't loop with function calls
}