/////////////////////////////////////////////////////////////////////////////// // Copyright (C) Microsoft Corporation, 2000. // // PixRef.cpp // // Direct3D Reference Device - Pixel Buffer Referencing // /////////////////////////////////////////////////////////////////////////////// #include "pch.cpp" #pragma hdrstop extern int g_DXTBlkSize[]; //----------------------------------------------------------------------------- // // PixelAddress - Form character address of locations within buffers using base // pointer, pitch and type. // //----------------------------------------------------------------------------- // // common internal version // char* PixelAddress( int iX, int iY, int iZ, int iSample, BYTE* pBits, int iYPitch, int iZPitch, int cSamples, RDSurfaceFormat SType ) { // initialize return value to start of scan line (pitch is always in bytes) BYTE* pPixAddr = pBits + iY*iYPitch + iZ*iZPitch; // bump along scan line depending on surface type to point to pixel data switch ( SType ) { default: _ASSERTf(0, ("Unknown RDSurfaceFormat value %08x", SType)); return NULL; case RD_SF_NULL: break; case RD_SF_B8G8R8A8: case RD_SF_B8G8R8X8: case RD_SF_U8V8L8X8: case RD_SF_Z24S8: case RD_SF_Z24X8: case RD_SF_S8Z24: case RD_SF_X8Z24: case RD_SF_Z24X4S4: case RD_SF_X4S4Z24: case RD_SF_Z32S0: case RD_SF_U8V8W8Q8: case RD_SF_U10V11W11: case RD_SF_U16V16: case RD_SF_R10G10B10A2: case RD_SF_R8G8B8A8: case RD_SF_R8G8B8X8: case RD_SF_R16G16: case RD_SF_U11V11W10: case RD_SF_U10V10W10A2: case RD_SF_U8V8X8A8: case RD_SF_U8V8X8L8: pPixAddr += (iX*cSamples*4 + iSample*4); break; case RD_SF_B5G6R5: case RD_SF_B5G5R5X1: case RD_SF_B5G5R5A1: case RD_SF_P8A8: case RD_SF_L8A8: case RD_SF_U8V8: case RD_SF_U5V5L6: case RD_SF_Z16S0: case RD_SF_Z15S1: case RD_SF_S1Z15: case RD_SF_B4G4R4A4: case RD_SF_B4G4R4X4: case RD_SF_YUY2: case RD_SF_UYVY: case RD_SF_B2G3R3A8: pPixAddr += (iX*cSamples*2 + iSample*2); break; case RD_SF_B8G8R8: pPixAddr += (iX*cSamples*3 + iSample*3); break; case RD_SF_PALETTE8: case RD_SF_L8: case RD_SF_A8: case RD_SF_B2G3R3: case RD_SF_L4A4: pPixAddr += (iX*cSamples*1 + iSample*1); break; case RD_SF_PALETTE4: pPixAddr += (iX>>1); break; // For the DXT texture formats, obtain the address of the // block from whih to decompress the texel from case RD_SF_DXT1: case RD_SF_DXT2: case RD_SF_DXT3: case RD_SF_DXT4: case RD_SF_DXT5: pPixAddr = pBits + iZ*iZPitch + (iY >> 2)*iYPitch + (iX>>2) * g_DXTBlkSize[(int)SType - (int)RD_SF_DXT1]; break; } return (char *)pPixAddr; } // // external versions // char* PixelAddress( int iX, int iY, int iZ, BYTE* pBits, int iYPitch, int iZPitch, RDSurfaceFormat SType ) { return PixelAddress( iX, iY, iZ, 0, pBits, iYPitch, iZPitch, 1, SType ); } char* PixelAddress( int iX, int iY, int iZ, int iSample, RDSurface2D* pRT ) { return PixelAddress( iX, iY, iZ, iSample, pRT->GetBits(), pRT->GetPitch(), 0 /* pRT->GetSlicePitch() */, pRT->GetSamples(), pRT->GetSurfaceFormat() ); } /////////////////////////////////////////////////////////////////////////////// // end