//----------------------------------------------------------------------------- // // 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 }