23 assert( srcImage.width == destImage.width );
24 assert( srcImage.height == destImage.height );
26 ScopedAlignedArrayXMVECTOR scanline( reinterpret_cast<XMVECTOR*>( _aligned_malloc( (
sizeof(XMVECTOR)*srcImage.width), 16 ) ) );
30 const uint8_t *pSrc = srcImage.pixels;
31 uint8_t *pDest = destImage.pixels;
32 if ( !pSrc || !pDest )
35 for(
size_t h = 0; h < srcImage.height; ++h )
37 if ( !
_LoadScanline( scanline.get(), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format ) )
40 XMVECTOR* ptr = scanline.get();
41 for(
size_t w = 0; w < srcImage.width; ++w )
44 XMVECTOR alpha = XMVectorSplatW( *ptr );
45 alpha = XMVectorMultiply( v, alpha );
46 *(ptr++) = XMVectorSelect( v, alpha, g_XMSelect1110 );
49 if ( !
_StoreScanline( pDest, destImage.rowPitch, destImage.format, scanline.get(), srcImage.width ) )
52 pSrc += srcImage.rowPitch;
53 pDest += destImage.rowPitch;
61 assert( srcImage.width == destImage.width );
62 assert( srcImage.height == destImage.height );
69 ScopedAlignedArrayXMVECTOR scanline( reinterpret_cast<XMVECTOR*>( _aligned_malloc( (
sizeof(XMVECTOR)*srcImage.width), 16 ) ) );
73 const uint8_t *pSrc = srcImage.pixels;
74 uint8_t *pDest = destImage.pixels;
75 if ( !pSrc || !pDest )
78 for(
size_t h = 0; h < srcImage.height; ++h )
83 XMVECTOR* ptr = scanline.get();
84 for(
size_t w = 0; w < srcImage.width; ++w )
87 XMVECTOR alpha = XMVectorSplatW( *ptr );
88 alpha = XMVectorMultiply( v, alpha );
89 *(ptr++) = XMVectorSelect( v, alpha, g_XMSelect1110 );
95 pSrc += srcImage.rowPitch;
96 pDest += destImage.rowPitch;
110 _Use_decl_annotations_
121 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
124 if ( (srcImage.
width > 0xFFFFFFFF) || (srcImage.
height > 0xFFFFFFFF) )
153 _Use_decl_annotations_
156 if ( !srcImages || !nimages )
164 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
167 if ( (metadata.
width > 0xFFFFFFFF) || (metadata.
height > 0xFFFFFFFF) )
196 for(
size_t index=0; index < nimages; ++index )
198 const Image& src = srcImages[ index ];
206 if ( (src.
width > 0xFFFFFFFF) || (src.
height > 0xFFFFFFFF) )
209 const Image& dst = dest[ index ];
std::unique_ptr< DirectX::XMVECTOR, aligned_deleter > ScopedAlignedArrayXMVECTOR
const Image * GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const
bool HasAlpha(_In_ DXGI_FORMAT fmt)
bool IsPlanar(_In_ DXGI_FORMAT fmt)
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT _In_ DWORD flags assert(pDestination &&outSize > 0)
HRESULT Initialize(_In_ const TexMetadata &mdata, _In_ DWORD flags=CP_FLAGS_NONE)
static HRESULT _PremultiplyAlphaLinear(_In_ const Image &srcImage, _In_ DWORD flags, _In_ const Image &destImage)
HRESULT Initialize2D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ DWORD flags=CP_FLAGS_NONE)
_Use_decl_annotations_ bool _LoadScanline(XMVECTOR *pDestination, size_t count, LPCVOID pSource, size_t size, DXGI_FORMAT format)
bool IsCompressed(_In_ DXGI_FORMAT fmt)
size_t GetImageCount() const
_In_ size_t _In_ const TexMetadata & metadata
bool IsPalettized(_In_ DXGI_FORMAT fmt)
_Use_decl_annotations_ bool _LoadScanlineLinear(XMVECTOR *pDestination, size_t count, LPCVOID pSource, size_t size, DXGI_FORMAT format, DWORD flags)
_Use_decl_annotations_ bool _StoreScanlineLinear(LPVOID pDestination, size_t size, DXGI_FORMAT format, XMVECTOR *pSource, size_t count, DWORD flags)
bool IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless=true)
static HRESULT _PremultiplyAlpha(_In_ const Image &srcImage, _In_ const Image &destImage)
const Image * GetImages() const
_Use_decl_annotations_ bool _StoreScanline(LPVOID pDestination, size_t size, DXGI_FORMAT format, const XMVECTOR *pSource, size_t count, float threshold)
HRESULT PremultiplyAlpha(_In_ const Image &srcImage, _In_ DWORD flags, _Out_ ScratchImage &image)