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.
 
 
 
 
 
 

310 lines
9.2 KiB

#include "rgb_pch.h"
#pragma hdrstop
namespace RGB_RAST_LIB_NAMESPACE
{
void CR5G6B5Surface::Clear( const D3DHAL_DP2CLEAR& DP2Clear, const RECT& RC) throw()
{
// Check for empty RECT.
if((RC.left>= RC.right) || (RC.top>= RC.bottom))
return;
if((DP2Clear.dwFlags& D3DCLEAR_TARGET)== 0)
return;
RECTL RectL;
RectL.top= RC.top;
RectL.left= RC.left;
RectL.bottom= RC.bottom;
RectL.right= RC.right;
unsigned int iRow( RC.bottom- RC.top);
const unsigned int iCols( RC.right- RC.left);
// New scope for SurfaceLocker.
{
CSurfaceLocker< CR5G6B5Surface*> MySLocker( this, 0, &RectL);
UINT8* pSData= reinterpret_cast<UINT8*>( MySLocker.GetData());
UINT32 uiRColor( DP2Clear.dwFillColor& 0xF80000);
UINT32 uiGColor( DP2Clear.dwFillColor& 0xFC00);
UINT32 uiBColor( DP2Clear.dwFillColor& 0xF8);
uiRColor>>= 8;
uiGColor>>= 5;
uiBColor>>= 3;
UINT32 uiColor= uiRColor| uiGColor| uiBColor;
uiColor|= (uiColor<< 16);
if( RC.left== 0 && RC.right== m_wWidth)
MemFill( uiColor, pSData, iRow* m_lPitch);
else do
{
MemFill( uiColor, pSData, iCols* sizeof(UINT16));
pSData+= m_lPitch;
} while( --iRow);
}
}
void CA8R8G8B8Surface::Clear( const D3DHAL_DP2CLEAR& DP2Clear, const RECT& RC) throw()
{
// Check for empty RECT.
if((RC.left>= RC.right) || (RC.top>= RC.bottom))
return;
if((DP2Clear.dwFlags& D3DCLEAR_TARGET)== 0)
return;
RECTL RectL;
RectL.top= RC.top;
RectL.left= RC.left;
RectL.bottom= RC.bottom;
RectL.right= RC.right;
unsigned int iRow( RC.bottom- RC.top);
const unsigned int iCols( RC.right- RC.left);
// New scope for SurfaceLocker.
{
CSurfaceLocker< CA8R8G8B8Surface*> MySLocker( this, 0, &RectL);
UINT8* pSData= reinterpret_cast<UINT8*>( MySLocker.GetData());
if( RC.left== 0 && RC.right== m_wWidth)
MemFill( DP2Clear.dwFillColor, pSData, iRow* m_lPitch);
else do
{
MemFill( DP2Clear.dwFillColor, pSData, iCols* sizeof(UINT32));
pSData+= m_lPitch;
} while( --iRow);
}
}
void CX8R8G8B8Surface::Clear( const D3DHAL_DP2CLEAR& DP2Clear, const RECT& RC) throw()
{
// Check for empty RECT.
if((RC.left>= RC.right) || (RC.top>= RC.bottom))
return;
if((DP2Clear.dwFlags& D3DCLEAR_TARGET)== 0)
return;
RECTL RectL;
RectL.top= RC.top;
RectL.left= RC.left;
RectL.bottom= RC.bottom;
RectL.right= RC.right;
unsigned int iRow( RC.bottom- RC.top);
const unsigned int iCols( RC.right- RC.left);
// New scope for SurfaceLocker.
{
CSurfaceLocker< CX8R8G8B8Surface*> MySLocker( this, 0, &RectL);
UINT8* pSData= reinterpret_cast<UINT8*>( MySLocker.GetData());
if( RC.left== 0 && RC.right== m_wWidth)
MemFill( DP2Clear.dwFillColor, pSData, iRow* m_lPitch);
else do
{
MemFill( DP2Clear.dwFillColor, pSData, iCols* sizeof(UINT32));
pSData+= m_lPitch;
} while( --iRow);
}
}
void CD16Surface::Clear( const D3DHAL_DP2CLEAR& DP2Clear, const RECT& RC) throw()
{
// Check for empty RECT.
if((RC.left>= RC.right) || (RC.top>= RC.bottom))
return;
if((DP2Clear.dwFlags& D3DCLEAR_ZBUFFER)== 0)
return;
RECTL RectL;
RectL.top= RC.top;
RectL.left= RC.left;
RectL.bottom= RC.bottom;
RectL.right= RC.right;
unsigned int iRow( RC.bottom- RC.top);
const unsigned int iCols( RC.right- RC.left);
// New scope for SurfaceLocker.
{
CSurfaceLocker< CD16Surface*> MySLocker( this, 0, &RectL);
UINT8* pSData= reinterpret_cast<UINT8*>( MySLocker.GetData());
// Warning, this operation is happening with the FPU mode set to
// single precision, which is acceptable for 16 bit.
D3DVALUE Z( DP2Clear.dvFillDepth);
clamp( Z, 0.0f, 1.0f);
Z= Z* 0xFFFF+ 0.5f;
UINT32 uiZVal= static_cast<UINT32>( Z);
uiZVal|= (uiZVal<< 16);
if( RC.left== 0 && RC.right== m_wWidth)
MemFill( uiZVal, pSData, iRow* m_lPitch);
else do
{
MemFill( uiZVal, pSData, iCols* sizeof(UINT16));
pSData+= m_lPitch;
} while( --iRow);
}
}
void CD24S8Surface::Clear( const D3DHAL_DP2CLEAR& DP2Clear, const RECT& RC) throw()
{
// Check for empty RECT.
if((RC.left>= RC.right) || (RC.top>= RC.bottom))
return;
if((DP2Clear.dwFlags& (D3DCLEAR_ZBUFFER| D3DCLEAR_STENCIL))== 0)
return;
RECTL RectL;
RectL.top= RC.top;
RectL.left= RC.left;
RectL.bottom= RC.bottom;
RectL.right= RC.right;
unsigned int iRow( RC.bottom- RC.top);
const unsigned int iCols( RC.right- RC.left);
// New scope for SurfaceLocker.
{
CSurfaceLocker< CD24S8Surface*> MySLocker( this, 0, &RectL);
UINT8* pSData= reinterpret_cast<UINT8*>( MySLocker.GetData());
UINT32 uiMask( 0);
UINT32 uiVal( 0);
if((DP2Clear.dwFlags& D3DCLEAR_ZBUFFER)!= 0)
{
// Need C compatable FPU Mode here.
CEnsureFPUModeForC FPUMode;
double Z( DP2Clear.dvFillDepth);
clamp( Z, 0.0, 1.0);
Z= Z* 0xFFFFFF+ 0.5;
uiVal= static_cast<UINT32>( Z);
uiVal<<= 8;
uiMask= 0xFFFFFF00;
}
if((DP2Clear.dwFlags& D3DCLEAR_STENCIL)!= 0)
{
uiVal|= (DP2Clear.dwFillStencil& 0xFF);
uiMask|= 0xFF;
}
if( 0xFFFFFFFF== uiMask)
{
if( RC.left== 0 && RC.right== m_wWidth)
MemFill( uiVal, pSData, iRow* m_lPitch);
else do
{
MemFill( uiVal, pSData, iCols* sizeof(UINT32));
pSData+= m_lPitch;
} while( --iRow);
}
else
{
if( RC.left== 0 && RC.right== m_wWidth)
MemMask( uiVal, uiMask, pSData, iRow* m_lPitch);
else do
{
MemMask( uiVal, uiMask, pSData, iCols* sizeof(UINT32));
pSData+= m_lPitch;
} while( --iRow);
}
}
}
void MemFill( UINT32 uiData, void* pData, UINT32 uiBytes) throw()
{
unsigned int uiBytesLeft( uiBytes);
UINT32* p32Data= reinterpret_cast<UINT32*>(pData);
// Unroll.
unsigned int uiSpans( uiBytesLeft>> 6);
uiBytesLeft= uiBytesLeft& 0x3F;
if( uiSpans!= 0) do
{
p32Data[ 0]= uiData;
p32Data[ 1]= uiData;
p32Data[ 2]= uiData;
p32Data[ 3]= uiData;
p32Data[ 4]= uiData;
p32Data[ 5]= uiData;
p32Data[ 6]= uiData;
p32Data[ 7]= uiData;
p32Data[ 8]= uiData;
p32Data[ 9]= uiData;
p32Data[10]= uiData;
p32Data[11]= uiData;
p32Data[12]= uiData;
p32Data[13]= uiData;
p32Data[14]= uiData;
p32Data[15]= uiData;
p32Data+= 16;
} while( --uiSpans!= 0);
uiSpans= uiBytesLeft>> 2;
uiBytesLeft= uiBytesLeft& 0x3;
if( uiSpans!= 0) do
{
p32Data[0]= uiData;
p32Data++;
} while( --uiSpans!= 0);
if( uiBytesLeft!= 0)
{
assert( 2== uiBytesLeft);
UINT16* p16Data= reinterpret_cast<UINT16*>(p32Data);
p16Data[0]= static_cast<UINT16>( uiData& 0xFFFF);
}
}
void MemMask( UINT32 uiData, UINT32 uiMask, void* pData, UINT32 uiBytes) throw()
{
uiMask= ~uiMask;
unsigned int uiBytesLeft( uiBytes);
UINT32* p32Data= reinterpret_cast<UINT32*>(pData);
// Unroll.
unsigned int uiSpans( uiBytesLeft>> 6);
uiBytesLeft= uiBytesLeft& 0x3F;
if( uiSpans!= 0) do
{
p32Data[ 0]= (p32Data[ 0]& uiMask)| uiData;
p32Data[ 1]= (p32Data[ 1]& uiMask)| uiData;
p32Data[ 2]= (p32Data[ 2]& uiMask)| uiData;
p32Data[ 3]= (p32Data[ 3]& uiMask)| uiData;
p32Data[ 4]= (p32Data[ 4]& uiMask)| uiData;
p32Data[ 5]= (p32Data[ 5]& uiMask)| uiData;
p32Data[ 6]= (p32Data[ 6]& uiMask)| uiData;
p32Data[ 7]= (p32Data[ 7]& uiMask)| uiData;
p32Data[ 8]= (p32Data[ 8]& uiMask)| uiData;
p32Data[ 9]= (p32Data[ 9]& uiMask)| uiData;
p32Data[10]= (p32Data[10]& uiMask)| uiData;
p32Data[11]= (p32Data[11]& uiMask)| uiData;
p32Data[12]= (p32Data[12]& uiMask)| uiData;
p32Data[13]= (p32Data[13]& uiMask)| uiData;
p32Data[14]= (p32Data[14]& uiMask)| uiData;
p32Data[15]= (p32Data[15]& uiMask)| uiData;
p32Data+= 16;
} while( --uiSpans!= 0);
uiSpans= uiBytesLeft>> 2;
uiBytesLeft= uiBytesLeft& 0x3;
if( uiSpans!= 0) do
{
p32Data[0]= (p32Data[0]& uiMask)| uiData;
p32Data++;
} while( --uiSpans!= 0);
if( uiBytesLeft!= 0)
{
assert( 2== uiBytesLeft);
UINT16* p16Data= reinterpret_cast<UINT16*>(p32Data);
p16Data[0]= (p16Data[0]& static_cast<UINT16>( uiMask& 0xFFFF))|
static_cast<UINT16>( uiData& 0xFFFF);
}
}
}