DirectXTex: /analyze cleanup

This commit is contained in:
walbourn_cp 2013-06-27 16:21:01 -07:00
parent 61a0a1a19c
commit 887d87bf91
3 changed files with 278 additions and 218 deletions

View File

@ -73,6 +73,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
case DXGI_FORMAT_R32G32B32A32_FLOAT:
case DXGI_FORMAT_R32G32B32A32_UINT:
case DXGI_FORMAT_R32G32B32A32_SINT:
if ( inSize >= 16 && outSize >= 16 )
{
uint32_t alpha;
if ( format == DXGI_FORMAT_R32G32B32A32_FLOAT )
@ -84,8 +85,8 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
if ( pDestination == pSource )
{
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 16 )
uint32_t *dPtr = reinterpret_cast<uint32_t*> (pDestination);
for( size_t count = 0; count < ( outSize - 15 ); count += 16 )
{
dPtr += 3;
*(dPtr++) = alpha;
@ -96,7 +97,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 16 )
for( size_t count = 0; count < ( size - 15 ); count += 16 )
{
*(dPtr++) = *(sPtr++);
*(dPtr++) = *(sPtr++);
@ -115,6 +116,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
case DXGI_FORMAT_R16G16B16A16_UINT:
case DXGI_FORMAT_R16G16B16A16_SNORM:
case DXGI_FORMAT_R16G16B16A16_SINT:
if ( inSize >= 8 && outSize >= 8 )
{
uint16_t alpha;
if ( format == DXGI_FORMAT_R16G16B16A16_FLOAT )
@ -127,7 +129,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
if ( pDestination == pSource )
{
uint16_t *dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 8 )
for( size_t count = 0; count < ( outSize - 7 ); count += 8 )
{
dPtr += 3;
*(dPtr++) = alpha;
@ -138,7 +140,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 8 )
for( size_t count = 0; count < ( size - 7 ); count += 8 )
{
*(dPtr++) = *(sPtr++);
*(dPtr++) = *(sPtr++);
@ -155,24 +157,26 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
case DXGI_FORMAT_R10G10B10A2_UNORM:
case DXGI_FORMAT_R10G10B10A2_UINT:
case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
if ( pDestination == pSource )
if ( inSize >= 4 && outSize >= 4 )
{
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 4 )
if ( pDestination == pSource )
{
#pragma warning(suppress: 6001 6101) // PREFast doesn't properly understand the aliasing here.
*dPtr |= 0xC0000000;
++dPtr;
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < ( outSize - 3 ); count += 4 )
{
*dPtr |= 0xC0000000;
++dPtr;
}
}
}
else
{
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 4 )
else
{
*(dPtr++) = *(sPtr++) | 0xC0000000;
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < ( size - 3 ); count += 4 )
{
*(dPtr++) = *(sPtr++) | 0xC0000000;
}
}
}
return;
@ -187,13 +191,14 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
if ( inSize >= 4 && outSize >= 4 )
{
const uint32_t alpha = ( format == DXGI_FORMAT_R8G8B8A8_SNORM || format == DXGI_FORMAT_R8G8B8A8_SINT ) ? 0x7f000000 : 0xff000000;
if ( pDestination == pSource )
{
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 4 )
for( size_t count = 0; count < ( outSize - 3 ); count += 4 )
{
uint32_t t = *dPtr & 0xFFFFFF;
t |= alpha;
@ -205,7 +210,7 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 4 )
for( size_t count = 0; count < ( size - 3 ); count += 4 )
{
uint32_t t = *(sPtr++) & 0xFFFFFF;
t |= alpha;
@ -217,22 +222,25 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
//-----------------------------------------------------------------------------
case DXGI_FORMAT_B5G5R5A1_UNORM:
if ( pDestination == pSource )
if ( inSize >= 2 && outSize >= 2 )
{
uint16_t *dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 2 )
if ( pDestination == pSource )
{
*(dPtr++) |= 0x8000;
uint16_t *dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t count = 0; count < ( outSize - 1 ); count += 2 )
{
*(dPtr++) |= 0x8000;
}
}
}
else
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 2 )
else
{
*(dPtr++) = *(sPtr++) | 0x8000;
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < ( size - 1 ); count += 2 )
{
*(dPtr++) = *(sPtr++) | 0x8000;
}
}
}
return;
@ -245,22 +253,25 @@ void _CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize
#ifdef DXGI_1_2_FORMATS
//-----------------------------------------------------------------------------
case DXGI_FORMAT_B4G4R4A4_UNORM:
if ( pDestination == pSource )
if ( inSize >= 2 && outSize >= 2 )
{
uint16_t *dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 2 )
if ( pDestination == pSource )
{
*(dPtr++) |= 0xF000;
uint16_t *dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t count = 0; count < ( outSize - 1 ); count += 2 )
{
*(dPtr++) |= 0xF000;
}
}
}
else
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 2 )
else
{
*(dPtr++) = *(sPtr++) | 0xF000;
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < ( size - 1 ); count += 2 )
{
*(dPtr++) = *(sPtr++) | 0xF000;
}
}
}
return;
@ -295,45 +306,46 @@ void _SwizzleScanline( LPVOID pDestination, size_t outSize, LPCVOID pSource, siz
case DXGI_FORMAT_R10G10B10A2_UNORM:
case DXGI_FORMAT_R10G10B10A2_UINT:
case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
if ( flags & TEXP_SCANLINE_LEGACY )
if ( inSize >= 4 && outSize >= 4 )
{
// Swap Red (R) and Blue (B) channel (used for D3DFMT_A2R10G10B10 legacy sources)
if ( pDestination == pSource )
if ( flags & TEXP_SCANLINE_LEGACY )
{
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 4 )
// Swap Red (R) and Blue (B) channel (used for D3DFMT_A2R10G10B10 legacy sources)
if ( pDestination == pSource )
{
#pragma warning(suppress: 6001 6101) // PREFast doesn't properly understand the aliasing here.
uint32_t t = *dPtr;
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < ( outSize - 3 ); count += 4 )
{
uint32_t t = *dPtr;
uint32_t t1 = (t & 0x3ff00000) >> 20;
uint32_t t2 = (t & 0x000003ff) << 20;
uint32_t t3 = (t & 0x000ffc00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xC0000000 : (t & 0xC0000000);
uint32_t t1 = (t & 0x3ff00000) >> 20;
uint32_t t2 = (t & 0x000003ff) << 20;
uint32_t t3 = (t & 0x000ffc00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xC0000000 : (t & 0xC0000000);
*(dPtr++) = t1 | t2 | t3 | ta;
*(dPtr++) = t1 | t2 | t3 | ta;
}
}
else
{
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < ( size - 3 ); count += 4 )
{
uint32_t t = *(sPtr++);
uint32_t t1 = (t & 0x3ff00000) >> 20;
uint32_t t2 = (t & 0x000003ff) << 20;
uint32_t t3 = (t & 0x000ffc00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xC0000000 : (t & 0xC0000000);
*(dPtr++) = t1 | t2 | t3 | ta;
}
}
}
else
{
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 4 )
{
uint32_t t = *(sPtr++);
uint32_t t1 = (t & 0x3ff00000) >> 20;
uint32_t t2 = (t & 0x000003ff) << 20;
uint32_t t3 = (t & 0x000ffc00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xC0000000 : (t & 0xC0000000);
*(dPtr++) = t1 | t2 | t3 | ta;
}
}
return;
}
break;
return;
//---------------------------------------------------------------------------------
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
@ -345,37 +357,40 @@ void _SwizzleScanline( LPVOID pDestination, size_t outSize, LPCVOID pSource, siz
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
// Swap Red (R) and Blue (B) channels (used to convert from DXGI 1.1 BGR formats to DXGI 1.0 RGB)
if ( pDestination == pSource )
if ( inSize >= 4 && outSize >= 4 )
{
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < outSize; count += 4 )
// Swap Red (R) and Blue (B) channels (used to convert from DXGI 1.1 BGR formats to DXGI 1.0 RGB)
if ( pDestination == pSource )
{
uint32_t t = *dPtr;
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t count = 0; count < ( outSize - 3 ); count += 4 )
{
uint32_t t = *dPtr;
uint32_t t1 = (t & 0x00ff0000) >> 16;
uint32_t t2 = (t & 0x000000ff) << 16;
uint32_t t3 = (t & 0x0000ff00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xff000000 : (t & 0xFF000000);
uint32_t t1 = (t & 0x00ff0000) >> 16;
uint32_t t2 = (t & 0x000000ff) << 16;
uint32_t t3 = (t & 0x0000ff00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xff000000 : (t & 0xFF000000);
*(dPtr++) = t1 | t2 | t3 | ta;
*(dPtr++) = t1 | t2 | t3 | ta;
}
}
}
else
{
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < size; count += 4 )
else
{
uint32_t t = *(sPtr++);
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
size_t size = std::min<size_t>( outSize, inSize );
for( size_t count = 0; count < ( size - 3 ); count += 4 )
{
uint32_t t = *(sPtr++);
uint32_t t1 = (t & 0x00ff0000) >> 16;
uint32_t t2 = (t & 0x000000ff) << 16;
uint32_t t3 = (t & 0x0000ff00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xff000000 : (t & 0xFF000000);
uint32_t t1 = (t & 0x00ff0000) >> 16;
uint32_t t2 = (t & 0x000000ff) << 16;
uint32_t t3 = (t & 0x0000ff00);
uint32_t ta = ( flags & TEXP_SCANLINE_SETALPHA ) ? 0xff000000 : (t & 0xFF000000);
*(dPtr++) = t1 | t2 | t3 | ta;
*(dPtr++) = t1 | t2 | t3 | ta;
}
}
}
return;
@ -410,11 +425,12 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
return false;
// DXGI_FORMAT_B5G6R5_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -424,19 +440,21 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
*(dPtr++) = t1 | t2 | t3 | 0xff000000;
}
return true;
}
return true;
return false;
case DXGI_FORMAT_B5G5R5A1_UNORM:
if ( outFormat != DXGI_FORMAT_R8G8B8A8_UNORM )
return false;
// DXGI_FORMAT_B5G5R5A1_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -447,8 +465,9 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
*(dPtr++) = t1 | t2 | t3 | ta;
}
return true;
}
return true;
return false;
#ifdef DXGI_1_2_FORMATS
case DXGI_FORMAT_B4G4R4A4_UNORM:
@ -456,11 +475,12 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
return false;
// DXGI_FORMAT_B4G4R4A4_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -471,8 +491,9 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
*(dPtr++) = t1 | t2 | t3 | ta;
}
return true;
}
return true;
return false;
#endif // DXGI_1_2_FORMATS
}
@ -487,7 +508,7 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
if ( size >= sizeof(type) )\
{\
const type * __restrict sPtr = reinterpret_cast<const type*>(pSource);\
for( size_t icount = 0; icount < size; icount += sizeof(type) )\
for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\
{\
if ( dPtr >= ePtr ) break;\
*(dPtr++) = func( sPtr++ );\
@ -500,7 +521,7 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
if ( size >= sizeof(type) )\
{\
const type * __restrict sPtr = reinterpret_cast<const type*>(pSource);\
for( size_t icount = 0; icount < size; icount += sizeof(type) )\
for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\
{\
XMVECTOR v = func( sPtr++ );\
if ( dPtr >= ePtr ) break;\
@ -514,7 +535,7 @@ bool _ExpandScanline( LPVOID pDestination, size_t outSize, DXGI_FORMAT outFormat
if ( size >= sizeof(type) )\
{\
const type * __restrict sPtr = reinterpret_cast<const type*>(pSource);\
for( size_t icount = 0; icount < size; icount += sizeof(type) )\
for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\
{\
XMVECTOR v = func( sPtr++ );\
if ( dPtr >= ePtr ) break;\
@ -587,46 +608,55 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
LOAD_SCANLINE2( XMINT2, XMLoadSInt2, g_XMIdentityR3 )
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
{
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
const size_t psize = sizeof(float)+sizeof(uint32_t);
if ( size >= psize )
{
const uint8_t* ps8 = reinterpret_cast<const uint8_t*>( &sPtr[1] );
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( sPtr[0], static_cast<float>( *ps8 ), 0.f, 1.f );
sPtr += 2;
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < ( size - psize + 1 ); icount += psize )
{
const uint8_t* ps8 = reinterpret_cast<const uint8_t*>( &sPtr[1] );
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( sPtr[0], static_cast<float>( *ps8 ), 0.f, 1.f );
sPtr += 2;
}
return true;
}
return true;
}
return false;
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
{
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
const size_t psize = sizeof(float)+sizeof(uint32_t);
if ( size >= psize )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( sPtr[0], 0.f /* typeless component assumed zero */, 0.f, 1.f );
sPtr += 2;
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < ( size - psize + 1 ); icount += psize )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( sPtr[0], 0.f /* typeless component assumed zero */, 0.f, 1.f );
sPtr += 2;
}
return true;
}
return true;
}
return false;
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
{
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
const size_t psize = sizeof(float)+sizeof(uint32_t);
if ( size >= psize )
{
const uint8_t* pg8 = reinterpret_cast<const uint8_t*>( &sPtr[1] );
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( 0.f /* typeless component assumed zero */, static_cast<float>( *pg8 ), 0.f, 1.f );
sPtr += 2;
const float * sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < ( size - psize + 1 ); icount += psize )
{
const uint8_t* pg8 = reinterpret_cast<const uint8_t*>( &sPtr[1] );
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( 0.f /* typeless component assumed zero */, static_cast<float>( *pg8 ), 0.f, 1.f );
sPtr += 2;
}
return true;
}
return true;
}
return false;
@ -637,7 +667,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMUDECN4) )
{
const XMUDECN4 * __restrict sPtr = reinterpret_cast<const XMUDECN4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUDECN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUDECN4) + 1 ); icount += sizeof(XMUDECN4) )
{
if ( dPtr >= ePtr ) break;
@ -699,7 +729,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(float) )
{
const float* __restrict sPtr = reinterpret_cast<const float*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(float) )
for( size_t icount = 0; icount < ( size - sizeof(float) + 1 ); icount += sizeof(float) )
{
XMVECTOR v = XMLoadFloat( sPtr++ );
if ( dPtr >= ePtr ) break;
@ -713,7 +743,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint32_t) )
{
const uint32_t* __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
XMVECTOR v = XMLoadInt( sPtr++ );
v = XMConvertVectorUIntToFloat( v, 0 );
@ -728,7 +758,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(int32_t) )
{
const int32_t * __restrict sPtr = reinterpret_cast<const int32_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(int32_t) )
for( size_t icount = 0; icount < ( size - sizeof(int32_t) + 1 ); icount += sizeof(int32_t) )
{
XMVECTOR v = XMLoadInt( reinterpret_cast<const uint32_t*> (sPtr++) );
v = XMConvertVectorIntToFloat( v, 0 );
@ -743,7 +773,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint32_t) )
{
const uint32_t * sPtr = reinterpret_cast<const uint32_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
float d = static_cast<float>( *sPtr & 0xFFFFFF ) / 16777215.f;
float s = static_cast<float>( ( *sPtr & 0xFF000000 ) >> 24 );
@ -759,7 +789,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint32_t) )
{
const uint32_t * sPtr = reinterpret_cast<const uint32_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
float r = static_cast<float>( *sPtr & 0xFFFFFF ) / 16777215.f;
++sPtr;
@ -774,7 +804,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint32_t) )
{
const uint32_t * sPtr = reinterpret_cast<const uint32_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
float g = static_cast<float>( ( *sPtr & 0xFF000000 ) >> 24 );
++sPtr;
@ -801,7 +831,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(HALF) )
{
const HALF * __restrict sPtr = reinterpret_cast<const HALF*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(HALF) )
for( size_t icount = 0; icount < ( size - sizeof(HALF) + 1 ); icount += sizeof(HALF) )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( XMConvertHalfToFloat(*sPtr++), 0.f, 0.f, 1.f );
@ -815,7 +845,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint16_t) )
{
const uint16_t* __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint16_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint16_t) + 1 ); icount += sizeof(uint16_t) )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( static_cast<float>(*sPtr++) / 65535.f, 0.f, 0.f, 1.f );
@ -828,7 +858,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(uint16_t) )
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(uint16_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint16_t) + 1 ); icount += sizeof(uint16_t) )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( static_cast<float>(*sPtr++), 0.f, 0.f, 1.f );
@ -841,7 +871,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(int16_t) )
{
const int16_t * __restrict sPtr = reinterpret_cast<const int16_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(int16_t) )
for( size_t icount = 0; icount < ( size - sizeof(int16_t) + 1 ); icount += sizeof(int16_t) )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( static_cast<float>(*sPtr++) / 32767.f, 0.f, 0.f, 1.f );
@ -854,7 +884,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(int16_t) )
{
const int16_t * __restrict sPtr = reinterpret_cast<const int16_t*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(int16_t) )
for( size_t icount = 0; icount < ( size - sizeof(int16_t) + 1 ); icount += sizeof(int16_t) )
{
if ( dPtr >= ePtr ) break;
*(dPtr++) = XMVectorSet( static_cast<float>(*sPtr++), 0.f, 0.f, 1.f );
@ -950,7 +980,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMFLOAT3SE) )
{
const XMFLOAT3SE * __restrict sPtr = reinterpret_cast<const XMFLOAT3SE*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMFLOAT3SE) )
for( size_t icount = 0; icount < ( size - sizeof(XMFLOAT3SE) + 1 ); icount += sizeof(XMFLOAT3SE) )
{
union { float f; int32_t i; } fi;
fi.i = 0x33800000 + (sPtr->e << 23);
@ -973,7 +1003,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMUBYTEN4) )
{
const XMUBYTEN4 * __restrict sPtr = reinterpret_cast<const XMUBYTEN4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
XMVECTOR v = XMLoadUByteN4( sPtr++ );
XMVECTOR v1 = XMVectorSwizzle<0, 3, 2, 1>( v );
@ -990,7 +1020,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMUBYTEN4) )
{
const XMUBYTEN4 * __restrict sPtr = reinterpret_cast<const XMUBYTEN4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
XMVECTOR v = XMLoadUByteN4( sPtr++ );
XMVECTOR v0 = XMVectorSwizzle<1, 0, 3, 2>( v );
@ -1009,7 +1039,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
{
static XMVECTORF32 s_Scale = { 1.f/31.f, 1.f/63.f, 1.f/31.f, 1.f };
const XMU565 * __restrict sPtr = reinterpret_cast<const XMU565*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMU565) )
for( size_t icount = 0; icount < ( size - sizeof(XMU565) + 1 ); icount += sizeof(XMU565) )
{
XMVECTOR v = XMLoadU565( sPtr++ );
v = XMVectorMultiply( v, s_Scale );
@ -1026,7 +1056,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
{
static XMVECTORF32 s_Scale = { 1.f/31.f, 1.f/31.f, 1.f/31.f, 1.f };
const XMU555 * __restrict sPtr = reinterpret_cast<const XMU555*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMU555) )
for( size_t icount = 0; icount < ( size - sizeof(XMU555) + 1 ); icount += sizeof(XMU555) )
{
XMVECTOR v = XMLoadU555( sPtr++ );
v = XMVectorMultiply( v, s_Scale );
@ -1042,7 +1072,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMUBYTEN4) )
{
const XMUBYTEN4 * __restrict sPtr = reinterpret_cast<const XMUBYTEN4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
XMVECTOR v = XMLoadUByteN4( sPtr++ );
if ( dPtr >= ePtr ) break;
@ -1057,7 +1087,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(XMUBYTEN4) )
{
const XMUBYTEN4 * __restrict sPtr = reinterpret_cast<const XMUBYTEN4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
XMVECTOR v = XMLoadUByteN4( sPtr++ );
v = XMVectorSwizzle<2, 1, 0, 3>( v );
@ -1074,7 +1104,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
{
static XMVECTORF32 s_Scale = { 1.f/15.f, 1.f/15.f, 1.f/15.f, 1.f/15.f };
const XMUNIBBLE4 * __restrict sPtr = reinterpret_cast<const XMUNIBBLE4*>(pSource);
for( size_t icount = 0; icount < size; icount += sizeof(XMUNIBBLE4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUNIBBLE4) + 1 ); icount += sizeof(XMUNIBBLE4) )
{
XMVECTOR v = XMLoadUNibble4( sPtr++ );
v = XMVectorMultiply( v, s_Scale );
@ -1105,7 +1135,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
if ( size >= sizeof(type) )\
{\
type * __restrict dPtr = reinterpret_cast<type*>(pDestination);\
for( size_t icount = 0; icount < size; icount += sizeof(type) )\
for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\
{\
if ( sPtr >= ePtr ) break;\
func( dPtr++, *sPtr++ );\
@ -1173,21 +1203,24 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
STORE_SCANLINE( XMINT2, XMStoreSInt2 )
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
{
float *dPtr = reinterpret_cast<float*>(pDestination);
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
const size_t psize = sizeof(float)+sizeof(uint32_t);
if ( size >= psize )
{
if ( sPtr >= ePtr ) break;
XMFLOAT4 f;
XMStoreFloat4( &f, *sPtr++ );
dPtr[0] = f.x;
uint8_t* ps8 = reinterpret_cast<uint8_t*>( &dPtr[1] );
ps8[0] = static_cast<uint8_t>( std::min<float>( 255.f, std::max<float>( 0.f, f.y ) ) );
ps8[1] = ps8[2] = ps8[3] = 0;
dPtr += 2;
float *dPtr = reinterpret_cast<float*>(pDestination);
for( size_t icount = 0; icount < ( size - psize + 1 ); icount += psize )
{
if ( sPtr >= ePtr ) break;
XMFLOAT4 f;
XMStoreFloat4( &f, *sPtr++ );
dPtr[0] = f.x;
uint8_t* ps8 = reinterpret_cast<uint8_t*>( &dPtr[1] );
ps8[0] = static_cast<uint8_t>( std::min<float>( 255.f, std::max<float>( 0.f, f.y ) ) );
ps8[1] = ps8[2] = ps8[3] = 0;
dPtr += 2;
}
return true;
}
return true;
}
return false;
@ -1202,7 +1235,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
static const XMVECTORF32 C = { 1023.f, 1023.f, 1023.f, 3.f };
XMUDECN4 * __restrict dPtr = reinterpret_cast<XMUDECN4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUDECN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUDECN4) + 1 ); icount += sizeof(XMUDECN4) )
{
if ( sPtr >= ePtr ) break;
@ -1261,7 +1294,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(float) )
{
float * __restrict dPtr = reinterpret_cast<float*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(float) )
for( size_t icount = 0; icount < ( size - sizeof(float) + 1 ); icount += sizeof(float) )
{
if ( sPtr >= ePtr ) break;
XMStoreFloat( dPtr++, *(sPtr++) );
@ -1274,7 +1307,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(uint32_t) )
{
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMConvertVectorFloatToUInt( *(sPtr++), 0 );
@ -1285,10 +1318,10 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
return false;
case DXGI_FORMAT_R32_SINT:
if ( size >= sizeof(uint32_t) )
if ( size >= sizeof(int32_t) )
{
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(int32_t) + 1 ); icount += sizeof(int32_t) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMConvertVectorFloatToInt( *(sPtr++), 0 );
@ -1304,7 +1337,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
static const XMVECTORF32 clamp = { 1.f, 255.f, 0.f, 0.f };
XMVECTOR zero = XMVectorZero();
uint32_t *dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint32_t) + 1 ); icount += sizeof(uint32_t) )
{
if ( sPtr >= ePtr ) break;
XMFLOAT4 f;
@ -1332,7 +1365,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(HALF) )
{
HALF * __restrict dPtr = reinterpret_cast<HALF*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(HALF) )
for( size_t icount = 0; icount < ( size - sizeof(HALF) + 1 ); icount += sizeof(HALF) )
{
if ( sPtr >= ePtr ) break;
float v = XMVectorGetX( *sPtr++ );
@ -1347,7 +1380,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(uint16_t) )
{
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(uint16_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint16_t) + 1 ); icount += sizeof(uint16_t) )
{
if ( sPtr >= ePtr ) break;
float v = XMVectorGetX( *sPtr++ );
@ -1362,7 +1395,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(uint16_t) )
{
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(uint16_t) )
for( size_t icount = 0; icount < ( size - sizeof(uint16_t) + 1 ); icount += sizeof(uint16_t) )
{
if ( sPtr >= ePtr ) break;
float v = XMVectorGetX( *sPtr++ );
@ -1377,7 +1410,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(int16_t) )
{
int16_t * __restrict dPtr = reinterpret_cast<int16_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(int16_t) )
for( size_t icount = 0; icount < ( size - sizeof(int16_t) + 1 ); icount += sizeof(int16_t) )
{
if ( sPtr >= ePtr ) break;
float v = XMVectorGetX( *sPtr++ );
@ -1392,7 +1425,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(int16_t) )
{
int16_t * __restrict dPtr = reinterpret_cast<int16_t*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(int16_t) )
for( size_t icount = 0; icount < ( size - sizeof(int16_t) + 1 ); icount += sizeof(int16_t) )
{
if ( sPtr >= ePtr ) break;
float v = XMVectorGetX( *sPtr++ );
@ -1509,7 +1542,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
static const float minf9 = float(1.f / (1 << 16));
XMFLOAT3SE * __restrict dPtr = reinterpret_cast<XMFLOAT3SE*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMFLOAT3SE) )
for( size_t icount = 0; icount < ( size - sizeof(XMFLOAT3SE) + 1 ); icount += sizeof(XMFLOAT3SE) )
{
if ( sPtr >= ePtr ) break;
@ -1547,7 +1580,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(XMUBYTEN4) )
{
XMUBYTEN4 * __restrict dPtr = reinterpret_cast<XMUBYTEN4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v0 = *sPtr++;
@ -1565,7 +1598,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
static XMVECTORI32 select1101 = {XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1};
XMUBYTEN4 * __restrict dPtr = reinterpret_cast<XMUBYTEN4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v0 = XMVectorSwizzle<1, 0, 3, 2>( *sPtr++ );
@ -1582,7 +1615,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
{
static XMVECTORF32 s_Scale = { 31.f, 63.f, 31.f, 1.f };
XMU565 * __restrict dPtr = reinterpret_cast<XMU565*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMU565) )
for( size_t icount = 0; icount < ( size - sizeof(XMU565) + 1 ); icount += sizeof(XMU565) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>( *sPtr++ );
@ -1598,7 +1631,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
{
static XMVECTORF32 s_Scale = { 31.f, 31.f, 31.f, 1.f };
XMU555 * __restrict dPtr = reinterpret_cast<XMU555*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMU555) )
for( size_t icount = 0; icount < ( size - sizeof(XMU555) + 1 ); icount += sizeof(XMU555) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>( *sPtr++ );
@ -1616,7 +1649,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(XMUBYTEN4) )
{
XMUBYTEN4 * __restrict dPtr = reinterpret_cast<XMUBYTEN4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>( *sPtr++ );
@ -1631,7 +1664,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
if ( size >= sizeof(XMUBYTEN4) )
{
XMUBYTEN4 * __restrict dPtr = reinterpret_cast<XMUBYTEN4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUBYTEN4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUBYTEN4) + 1 ); icount += sizeof(XMUBYTEN4) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMVectorPermute<2, 1, 0, 7>( *sPtr++, g_XMIdentityR3 );
@ -1647,7 +1680,7 @@ bool _StoreScanline( LPVOID pDestination, size_t size, DXGI_FORMAT format,
{
static XMVECTORF32 s_Scale = { 15.f, 15.f, 15.f, 15.f };
XMUNIBBLE4 * __restrict dPtr = reinterpret_cast<XMUNIBBLE4*>(pDestination);
for( size_t icount = 0; icount < size; icount += sizeof(XMUNIBBLE4) )
for( size_t icount = 0; icount < ( size - sizeof(XMUNIBBLE4) + 1 ); icount += sizeof(XMUNIBBLE4) )
{
if ( sPtr >= ePtr ) break;
XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>( *sPtr++ );
@ -1901,7 +1934,7 @@ bool _StoreScanlineLinear( LPVOID pDestination, size_t size, DXGI_FORMAT format,
default:
// can't treat A8, XR, Depth, SNORM, UINT, or SINT as sRGB
flags &= ~TEX_FILTER_SRGB;
flags &= ~TEX_FILTER_SRGB;
break;
}

View File

@ -748,11 +748,12 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
return false;
// D3DFMT_R8G8B8 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 3 && outSize >= 4 )
{
const uint8_t * __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 3, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 2 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 3, ocount += 4 )
{
// 24bpp Direct3D 9 files are actually BGR, so need to swizzle as well
uint32_t t1 = ( *(sPtr) << 16 );
@ -762,19 +763,21 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | 0xff000000;
sPtr += 3;
}
return true;
}
return true;
return false;
case TEXP_LEGACY_R3G3B2:
switch( outFormat )
{
case DXGI_FORMAT_R8G8B8A8_UNORM:
// D3DFMT_R3G3B2 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 1 && outSize >= 4 )
{
const uint8_t* __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 3 ) ) ); ++icount, ocount += 4 )
{
uint8_t t = *(sPtr++);
@ -784,16 +787,18 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | 0xff000000;
}
return true;
}
return true;
return false;
case DXGI_FORMAT_B5G6R5_UNORM:
// D3DFMT_R3G3B2 -> DXGI_FORMAT_B5G6R5_UNORM
if ( inSize >= 1 && outSize >= 2 )
{
const uint8_t* __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 2 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 1 ) ) ); ++icount, ocount += 2 )
{
uint8_t t = *(sPtr++);
@ -803,8 +808,9 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3;
}
return true;
}
return true;
return false;
}
break;
@ -813,11 +819,12 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
return false;
// D3DFMT_A8R3G3B2 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t* __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -828,37 +835,41 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | ta;
}
return true;
}
return true;
return false;
case TEXP_LEGACY_P8:
if ( (outFormat != DXGI_FORMAT_R8G8B8A8_UNORM) || !pal8 )
return false;
// D3DFMT_P8 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 1 && outSize >= 4 )
{
const uint8_t* __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 3 ) ) ); ++icount, ocount += 4 )
{
uint8_t t = *(sPtr++);
*(dPtr++) = pal8[ t ];
}
return true;
}
return true;
return false;
case TEXP_LEGACY_A8P8:
if ( (outFormat != DXGI_FORMAT_R8G8B8A8_UNORM) || !pal8 )
return false;
// D3DFMT_A8P8 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t* __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -867,8 +878,9 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | ta;
}
return true;
}
return true;
return false;
case TEXP_LEGACY_A4L4:
switch( outFormat )
@ -876,11 +888,12 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
#ifdef DXGI_1_2_FORMATS
case DXGI_FORMAT_B4G4R4A4_UNORM :
// D3DFMT_A4L4 -> DXGI_FORMAT_B4G4R4A4_UNORM
if ( inSize >= 1 && outSize >= 2 )
{
const uint8_t * __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint16_t * __restrict dPtr = reinterpret_cast<uint16_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 2 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 1 ) ) ); ++icount, ocount += 2 )
{
uint8_t t = *(sPtr++);
@ -889,17 +902,19 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | (t1 << 4) | (t1 << 8) | ta;
}
return true;
}
return true;
return false;
#endif // DXGI_1_2_FORMATS
case DXGI_FORMAT_R8G8B8A8_UNORM:
// D3DFMT_A4L4 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 1 && outSize >= 4 )
{
const uint8_t * __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 3 ) ) ); ++icount, ocount += 4 )
{
uint8_t t = *(sPtr++);
@ -908,8 +923,9 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | (t1 << 8) | (t1 << 16) | ta;
}
return true;
}
return true;
return false;
}
break;
@ -919,11 +935,12 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
return false;
// D3DFMT_A4R4G4B4 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t * __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -934,20 +951,22 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | ta;
}
return true;
}
return true;
#endif
return false;
#endif // DXGI_1_2_FORMATS
case TEXP_LEGACY_L8:
if (outFormat != DXGI_FORMAT_R8G8B8A8_UNORM)
return false;
// D3DFMT_L8 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 1 && outSize >= 4 )
{
const uint8_t * __restrict sPtr = reinterpret_cast<const uint8_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); ++icount, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < inSize ) && ( ocount < ( outSize - 3 ) ) ); ++icount, ocount += 4 )
{
uint32_t t1 = *(sPtr++);
uint32_t t2 = (t1 << 8);
@ -955,19 +974,21 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | 0xff000000;
}
return true;
}
return true;
return false;
case TEXP_LEGACY_L16:
if (outFormat != DXGI_FORMAT_R16G16B16A16_UNORM)
return false;
// D3DFMT_L16 -> DXGI_FORMAT_R16G16B16A16_UNORM
if ( inSize >= 2 && outSize >= 8 )
{
const uint16_t* __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint64_t * __restrict dPtr = reinterpret_cast<uint64_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 8 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 7 ) ) ); icount += 2, ocount += 8 )
{
uint16_t t = *(sPtr++);
@ -977,19 +998,21 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | 0xffff000000000000;
}
return true;
}
return true;
return false;
case TEXP_LEGACY_A8L8:
if (outFormat != DXGI_FORMAT_R8G8B8A8_UNORM)
return false;
// D3DFMT_A8L8 -> DXGI_FORMAT_R8G8B8A8_UNORM
if ( inSize >= 2 && outSize >= 4 )
{
const uint16_t* __restrict sPtr = reinterpret_cast<const uint16_t*>(pSource);
uint32_t * __restrict dPtr = reinterpret_cast<uint32_t*>(pDestination);
for( size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < outSize)); icount += 2, ocount += 4 )
for( size_t ocount = 0, icount = 0; ( ( icount < ( inSize - 1 ) ) && ( ocount < ( outSize - 3 ) ) ); icount += 2, ocount += 4 )
{
uint16_t t = *(sPtr++);
@ -1000,8 +1023,9 @@ static bool _LegacyExpandScanline( _Out_writes_bytes_(outSize) LPVOID pDestinati
*(dPtr++) = t1 | t2 | t3 | ta;
}
return true;
}
return true;
return false;
}
return false;

View File

@ -812,18 +812,21 @@ static void _Copy24bppScanline( _Out_writes_bytes_(outSize) LPVOID pDestination,
const uint32_t * __restrict sPtr = reinterpret_cast<const uint32_t*>(pSource);
uint8_t * __restrict dPtr = reinterpret_cast<uint8_t*>(pDestination);
const uint8_t* endPtr = dPtr + outSize;
for( size_t count = 0; count < inSize; count += 4 )
if ( inSize >= 4 && outSize >= 3 )
{
uint32_t t = *(sPtr++);
const uint8_t* endPtr = dPtr + outSize;
if ( dPtr+2 > endPtr )
return;
for( size_t count = 0; count < ( inSize - 3 ); count += 4 )
{
uint32_t t = *(sPtr++);
*(dPtr++) = uint8_t(t & 0xFF); // Blue
*(dPtr++) = uint8_t((t & 0xFF00) >> 8); // Green
*(dPtr++) = uint8_t((t & 0xFF0000) >> 16); // Red
if ( dPtr+3 > endPtr )
return;
*(dPtr++) = uint8_t(t & 0xFF); // Blue
*(dPtr++) = uint8_t((t & 0xFF00) >> 8); // Green
*(dPtr++) = uint8_t((t & 0xFF0000) >> 16); // Red
}
}
}