Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DirectXTexImage.cpp
Go to the documentation of this file.
1 //-------------------------------------------------------------------------------------
2 // DirectXTexImage.cpp
3 //
4 // DirectX Texture Library - Image container
5 //
6 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
7 // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
8 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
9 // PARTICULAR PURPOSE.
10 //
11 // Copyright (c) Microsoft Corporation. All rights reserved.
12 //
13 // http://go.microsoft.com/fwlink/?LinkId=248926
14 //-------------------------------------------------------------------------------------
15 
16 #include "directxtexp.h"
17 
18 namespace DirectX
19 {
20 
21 extern bool _CalculateMipLevels( _In_ size_t width, _In_ size_t height, _Inout_ size_t& mipLevels );
22 extern bool _CalculateMipLevels3D( _In_ size_t width, _In_ size_t height, _In_ size_t depth, _Inout_ size_t& mipLevels );
23 extern bool _IsAlphaAllOpaqueBC( _In_ const Image& cImage );
24 
25 //-------------------------------------------------------------------------------------
26 // Determines number of image array entries and pixel size
27 //-------------------------------------------------------------------------------------
28 _Use_decl_annotations_
30  size_t& nImages, size_t& pixelSize )
31 {
32  assert( metadata.width > 0 && metadata.height > 0 && metadata.depth > 0 );
33  assert( metadata.arraySize > 0 );
34  assert( metadata.mipLevels > 0 );
35 
36  size_t _pixelSize = 0;
37  size_t _nimages = 0;
38 
39  switch( metadata.dimension )
40  {
43  for( size_t item = 0; item < metadata.arraySize; ++item )
44  {
45  size_t w = metadata.width;
46  size_t h = metadata.height;
47 
48  for( size_t level=0; level < metadata.mipLevels; ++level )
49  {
50  size_t rowPitch, slicePitch;
51  ComputePitch( metadata.format, w, h, rowPitch, slicePitch, cpFlags );
52 
53  _pixelSize += slicePitch;
54  ++_nimages;
55 
56  if ( h > 1 )
57  h >>= 1;
58 
59  if ( w > 1 )
60  w >>= 1;
61  }
62  }
63  break;
64 
66  {
67  size_t w = metadata.width;
68  size_t h = metadata.height;
69  size_t d = metadata.depth;
70 
71  for( size_t level=0; level < metadata.mipLevels; ++level )
72  {
73  size_t rowPitch, slicePitch;
74  ComputePitch( metadata.format, w, h, rowPitch, slicePitch, cpFlags );
75 
76  for( size_t slice=0; slice < d; ++slice )
77  {
78  _pixelSize += slicePitch;
79  ++_nimages;
80  }
81 
82  if ( h > 1 )
83  h >>= 1;
84 
85  if ( w > 1 )
86  w >>= 1;
87 
88  if ( d > 1 )
89  d >>= 1;
90  }
91  }
92  break;
93 
94  default:
95  assert( false );
96  break;
97  }
98 
99  nImages = _nimages;
100  pixelSize = _pixelSize;
101 }
102 
103 
104 //-------------------------------------------------------------------------------------
105 // Fills in the image array entries
106 //-------------------------------------------------------------------------------------
107 _Use_decl_annotations_
108 bool _SetupImageArray( uint8_t *pMemory, size_t pixelSize,
109  const TexMetadata& metadata, DWORD cpFlags,
110  Image* images, size_t nImages )
111 {
112  assert( pMemory );
113  assert( pixelSize > 0 );
114  assert( nImages > 0 );
115 
116  if ( !images )
117  return false;
118 
119  size_t index = 0;
120  uint8_t* pixels = pMemory;
121  const uint8_t* pEndBits = pMemory + pixelSize;
122 
123  switch( metadata.dimension )
124  {
127  if (metadata.arraySize == 0 || metadata.mipLevels == 0)
128  {
129  return false;
130  }
131 
132  for( size_t item = 0; item < metadata.arraySize; ++item )
133  {
134  size_t w = metadata.width;
135  size_t h = metadata.height;
136 
137  for( size_t level=0; level < metadata.mipLevels; ++level )
138  {
139  if ( index >= nImages )
140  {
141  return false;
142  }
143 
144  size_t rowPitch, slicePitch;
145  ComputePitch( metadata.format, w, h, rowPitch, slicePitch, cpFlags );
146 
147  images[index].width = w;
148  images[index].height = h;
149  images[index].format = metadata.format;
150  images[index].rowPitch = rowPitch;
151  images[index].slicePitch = slicePitch;
152  images[index].pixels = pixels;
153  ++index;
154 
155  pixels += slicePitch;
156  if ( pixels > pEndBits )
157  {
158  return false;
159  }
160 
161  if ( h > 1 )
162  h >>= 1;
163 
164  if ( w > 1 )
165  w >>= 1;
166  }
167  }
168  return true;
169 
171  {
172  if (metadata.mipLevels == 0 || metadata.depth == 0)
173  {
174  return false;
175  }
176 
177  size_t w = metadata.width;
178  size_t h = metadata.height;
179  size_t d = metadata.depth;
180 
181  for( size_t level=0; level < metadata.mipLevels; ++level )
182  {
183  size_t rowPitch, slicePitch;
184  ComputePitch( metadata.format, w, h, rowPitch, slicePitch, cpFlags );
185 
186  for( size_t slice=0; slice < d; ++slice )
187  {
188  if ( index >= nImages )
189  {
190  return false;
191  }
192 
193  // We use the same memory organization that Direct3D 11 needs for D3D11_SUBRESOURCE_DATA
194  // with all slices of a given miplevel being continuous in memory
195  images[index].width = w;
196  images[index].height = h;
197  images[index].format = metadata.format;
198  images[index].rowPitch = rowPitch;
199  images[index].slicePitch = slicePitch;
200  images[index].pixels = pixels;
201  ++index;
202 
203  pixels += slicePitch;
204  if ( pixels > pEndBits )
205  {
206  return false;
207  }
208  }
209 
210  if ( h > 1 )
211  h >>= 1;
212 
213  if ( w > 1 )
214  w >>= 1;
215 
216  if ( d > 1 )
217  d >>= 1;
218  }
219  }
220  return true;
221 
222  default:
223  return false;
224  }
225 }
226 
227 
228 //=====================================================================================
229 // ScratchImage - Bitmap image container
230 //=====================================================================================
231 
233 {
234  if ( this != &moveFrom )
235  {
236  Release();
237 
238  _nimages = moveFrom._nimages;
239  _size = moveFrom._size;
240  _metadata = moveFrom._metadata;
241  _image = moveFrom._image;
242  _memory = moveFrom._memory;
243 
244  moveFrom._nimages = 0;
245  moveFrom._size = 0;
246  moveFrom._image = nullptr;
247  moveFrom._memory = nullptr;
248  }
249  return *this;
250 }
251 
252 
253 //-------------------------------------------------------------------------------------
254 // Methods
255 //-------------------------------------------------------------------------------------
256 _Use_decl_annotations_
257 HRESULT ScratchImage::Initialize( const TexMetadata& mdata, DWORD flags )
258 {
259  if ( !IsValid(mdata.format) )
260  return E_INVALIDARG;
261 
262  if ( IsPalettized(mdata.format) )
263  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
264 
265  size_t mipLevels = mdata.mipLevels;
266 
267  switch( mdata.dimension )
268  {
270  if ( !mdata.width || mdata.height != 1 || mdata.depth != 1 || !mdata.arraySize )
271  return E_INVALIDARG;
272 
273  if ( IsVideo(mdata.format) )
274  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
275 
276  if ( !_CalculateMipLevels(mdata.width,1,mipLevels) )
277  return E_INVALIDARG;
278  break;
279 
281  if ( !mdata.width || !mdata.height || mdata.depth != 1 || !mdata.arraySize )
282  return E_INVALIDARG;
283 
284  if ( mdata.IsCubemap() )
285  {
286  if ( (mdata.arraySize % 6) != 0 )
287  return E_INVALIDARG;
288 
289  if ( IsVideo(mdata.format) )
290  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
291  }
292 
293  if ( !_CalculateMipLevels(mdata.width,mdata.height,mipLevels) )
294  return E_INVALIDARG;
295  break;
296 
298  if ( !mdata.width || !mdata.height || !mdata.depth || mdata.arraySize != 1 )
299  return E_INVALIDARG;
300 
301  if ( IsVideo(mdata.format) || IsPlanar(mdata.format) || IsDepthStencil(mdata.format) )
302  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
303 
304  if ( !_CalculateMipLevels3D(mdata.width,mdata.height,mdata.depth,mipLevels) )
305  return E_INVALIDARG;
306  break;
307 
308  default:
309  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
310  }
311 
312  Release();
313 
314  _metadata.width = mdata.width;
315  _metadata.height = mdata.height;
316  _metadata.depth = mdata.depth;
317  _metadata.arraySize = mdata.arraySize;
318  _metadata.mipLevels = mipLevels;
319  _metadata.miscFlags = mdata.miscFlags;
320  _metadata.miscFlags2 = mdata.miscFlags2;
321  _metadata.format = mdata.format;
322  _metadata.dimension = mdata.dimension;
323 
324  size_t pixelSize, nimages;
325  _DetermineImageArray( _metadata, flags, nimages, pixelSize );
326 
327  _image = new (std::nothrow) Image[ nimages ];
328  if ( !_image )
329  return E_OUTOFMEMORY;
330 
331  _nimages = nimages;
332  memset( _image, 0, sizeof(Image) * nimages );
333 
334  _memory = reinterpret_cast<uint8_t*>( _aligned_malloc( pixelSize, 16 ) );
335  if ( !_memory )
336  {
337  Release();
338  return E_OUTOFMEMORY;
339  }
340  _size = pixelSize;
341  if ( !_SetupImageArray( _memory, pixelSize, _metadata, flags, _image, nimages ) )
342  {
343  Release();
344  return E_FAIL;
345  }
346 
347  return S_OK;
348 }
349 
350 _Use_decl_annotations_
351 HRESULT ScratchImage::Initialize1D( DXGI_FORMAT fmt, size_t length, size_t arraySize, size_t mipLevels, DWORD flags )
352 {
353  if ( !length || !arraySize )
354  return E_INVALIDARG;
355 
356  if ( IsVideo(fmt) )
357  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
358 
359  // 1D is a special case of the 2D case
360  HRESULT hr = Initialize2D( fmt, length, 1, arraySize, mipLevels, flags );
361  if ( FAILED(hr) )
362  return hr;
363 
365 
366  return S_OK;
367 }
368 
369 _Use_decl_annotations_
370 HRESULT ScratchImage::Initialize2D( DXGI_FORMAT fmt, size_t width, size_t height, size_t arraySize, size_t mipLevels, DWORD flags )
371 {
372  if ( !IsValid(fmt) || !width || !height || !arraySize )
373  return E_INVALIDARG;
374 
375  if ( IsPalettized(fmt) )
376  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
377 
378  if ( !_CalculateMipLevels(width,height,mipLevels) )
379  return E_INVALIDARG;
380 
381  Release();
382 
383  _metadata.width = width;
384  _metadata.height = height;
385  _metadata.depth = 1;
386  _metadata.arraySize = arraySize;
387  _metadata.mipLevels = mipLevels;
388  _metadata.miscFlags = 0;
389  _metadata.miscFlags2 = 0;
390  _metadata.format = fmt;
392 
393  size_t pixelSize, nimages;
394  _DetermineImageArray( _metadata, flags, nimages, pixelSize );
395 
396  _image = new (std::nothrow) Image[ nimages ];
397  if ( !_image )
398  return E_OUTOFMEMORY;
399 
400  _nimages = nimages;
401  memset( _image, 0, sizeof(Image) * nimages );
402 
403  _memory = reinterpret_cast<uint8_t*>( _aligned_malloc( pixelSize, 16 ) );
404  if ( !_memory )
405  {
406  Release();
407  return E_OUTOFMEMORY;
408  }
409  _size = pixelSize;
410  if ( !_SetupImageArray( _memory, pixelSize, _metadata, flags, _image, nimages ) )
411  {
412  Release();
413  return E_FAIL;
414  }
415 
416  return S_OK;
417 }
418 
419 _Use_decl_annotations_
420 HRESULT ScratchImage::Initialize3D( DXGI_FORMAT fmt, size_t width, size_t height, size_t depth, size_t mipLevels, DWORD flags )
421 {
422  if ( !IsValid(fmt) || !width || !height || !depth )
423  return E_INVALIDARG;
424 
425  if ( IsVideo(fmt) || IsPlanar(fmt) || IsDepthStencil(fmt) )
426  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
427 
428  if ( !_CalculateMipLevels3D(width,height,depth,mipLevels) )
429  return E_INVALIDARG;
430 
431  Release();
432 
433  _metadata.width = width;
434  _metadata.height = height;
435  _metadata.depth = depth;
436  _metadata.arraySize = 1; // Direct3D 10.x/11 does not support arrays of 3D textures
437  _metadata.mipLevels = mipLevels;
438  _metadata.miscFlags = 0;
439  _metadata.miscFlags2 = 0;
440  _metadata.format = fmt;
442 
443  size_t pixelSize, nimages;
444  _DetermineImageArray( _metadata, flags, nimages, pixelSize );
445 
446  _image = new (std::nothrow) Image[ nimages ];
447  if ( !_image )
448  {
449  Release();
450  return E_OUTOFMEMORY;
451  }
452  _nimages = nimages;
453  memset( _image, 0, sizeof(Image) * nimages );
454 
455  _memory = reinterpret_cast<uint8_t*>( _aligned_malloc( pixelSize, 16 ) );
456  if ( !_memory )
457  {
458  Release();
459  return E_OUTOFMEMORY;
460  }
461  _size = pixelSize;
462 
463  if ( !_SetupImageArray( _memory, pixelSize, _metadata, flags, _image, nimages ) )
464  {
465  Release();
466  return E_FAIL;
467  }
468 
469  return S_OK;
470 }
471 
472 _Use_decl_annotations_
473 HRESULT ScratchImage::InitializeCube( DXGI_FORMAT fmt, size_t width, size_t height, size_t nCubes, size_t mipLevels, DWORD flags )
474 {
475  if ( !width || !height || !nCubes )
476  return E_INVALIDARG;
477 
478  if ( IsVideo(fmt) )
479  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
480 
481  // A DirectX11 cubemap is just a 2D texture array that is a multiple of 6 for each cube
482  HRESULT hr = Initialize2D( fmt, width, height, nCubes * 6, mipLevels, flags );
483  if ( FAILED(hr) )
484  return hr;
485 
486  _metadata.miscFlags |= TEX_MISC_TEXTURECUBE;
487 
488  return S_OK;
489 }
490 
491 _Use_decl_annotations_
492 HRESULT ScratchImage::InitializeFromImage( const Image& srcImage, bool allow1D, DWORD flags )
493 {
494  HRESULT hr = ( srcImage.height > 1 || !allow1D )
495  ? Initialize2D( srcImage.format, srcImage.width, srcImage.height, 1, 1, flags )
496  : Initialize1D( srcImage.format, srcImage.width, 1, 1, flags );
497 
498  if ( FAILED(hr) )
499  return hr;
500 
501  size_t rowCount = ComputeScanlines( srcImage.format, srcImage.height );
502  if ( !rowCount )
503  return E_UNEXPECTED;
504 
505  const uint8_t* sptr = reinterpret_cast<const uint8_t*>( srcImage.pixels );
506  if ( !sptr )
507  return E_POINTER;
508 
509  auto dptr = reinterpret_cast<uint8_t*>( _image[0].pixels );
510  if ( !dptr )
511  return E_POINTER;
512 
513  size_t spitch = srcImage.rowPitch;
514  size_t dpitch = _image[0].rowPitch;
515 
516  size_t size = std::min<size_t>( dpitch, spitch );
517 
518  for( size_t y = 0; y < rowCount; ++y )
519  {
520  memcpy_s( dptr, dpitch, sptr, size );
521  sptr += spitch;
522  dptr += dpitch;
523  }
524 
525  return S_OK;
526 }
527 
528 _Use_decl_annotations_
529 HRESULT ScratchImage::InitializeArrayFromImages( const Image* images, size_t nImages, bool allow1D, DWORD flags )
530 {
531  if ( !images || !nImages )
532  return E_INVALIDARG;
533 
534  DXGI_FORMAT format = images[0].format;
535  size_t width = images[0].width;
536  size_t height = images[0].height;
537 
538  for( size_t index=0; index < nImages; ++index )
539  {
540  if ( !images[index].pixels )
541  return E_POINTER;
542 
543  if ( images[index].format != format || images[index].width != width || images[index].height != height )
544  {
545  // All images must be the same format, width, and height
546  return E_FAIL;
547  }
548  }
549 
550  HRESULT hr = ( height > 1 || !allow1D )
551  ? Initialize2D( format, width, height, nImages, 1, flags )
552  : Initialize1D( format, width, nImages, 1, flags );
553 
554  if ( FAILED(hr) )
555  return hr;
556 
557  size_t rowCount = ComputeScanlines( format, height );
558  if ( !rowCount )
559  return E_UNEXPECTED;
560 
561  for( size_t index=0; index < nImages; ++index )
562  {
563  auto sptr = reinterpret_cast<const uint8_t*>( images[index].pixels );
564  if ( !sptr )
565  return E_POINTER;
566 
567  assert( index < _nimages );
568  auto dptr = reinterpret_cast<uint8_t*>( _image[index].pixels );
569  if ( !dptr )
570  return E_POINTER;
571 
572  size_t spitch = images[index].rowPitch;
573  size_t dpitch = _image[index].rowPitch;
574 
575  size_t size = std::min<size_t>( dpitch, spitch );
576 
577  for( size_t y = 0; y < rowCount; ++y )
578  {
579  memcpy_s( dptr, dpitch, sptr, size );
580  sptr += spitch;
581  dptr += dpitch;
582  }
583  }
584 
585  return S_OK;
586 }
587 
588 _Use_decl_annotations_
589 HRESULT ScratchImage::InitializeCubeFromImages( const Image* images, size_t nImages, DWORD flags )
590 {
591  if ( !images || !nImages )
592  return E_INVALIDARG;
593 
594  // A DirectX11 cubemap is just a 2D texture array that is a multiple of 6 for each cube
595  if ( ( nImages % 6 ) != 0 )
596  return E_INVALIDARG;
597 
598  if ( IsVideo(images[0].format) || IsPalettized(images[0].format) )
599  return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
600 
601  HRESULT hr = InitializeArrayFromImages( images, nImages, false, flags );
602  if ( FAILED(hr) )
603  return hr;
604 
605  _metadata.miscFlags |= TEX_MISC_TEXTURECUBE;
606 
607  return S_OK;
608 }
609 
610 _Use_decl_annotations_
611 HRESULT ScratchImage::Initialize3DFromImages( const Image* images, size_t depth, DWORD flags )
612 {
613  if ( !images || !depth )
614  return E_INVALIDARG;
615 
616  DXGI_FORMAT format = images[0].format;
617  size_t width = images[0].width;
618  size_t height = images[0].height;
619 
620  for( size_t slice=0; slice < depth; ++slice )
621  {
622  if ( !images[slice].pixels )
623  return E_POINTER;
624 
625  if ( images[slice].format != format || images[slice].width != width || images[slice].height != height )
626  {
627  // All images must be the same format, width, and height
628  return E_FAIL;
629  }
630  }
631 
632  HRESULT hr = Initialize3D( format, width, height, depth, 1, flags );
633  if ( FAILED(hr) )
634  return hr;
635 
636  size_t rowCount = ComputeScanlines( format, height );
637  if ( !rowCount )
638  return E_UNEXPECTED;
639 
640  for( size_t slice=0; slice < depth; ++slice )
641  {
642  auto sptr = reinterpret_cast<const uint8_t*>( images[slice].pixels );
643  if ( !sptr )
644  return E_POINTER;
645 
646  assert( slice < _nimages );
647  auto dptr = reinterpret_cast<uint8_t*>( _image[slice].pixels );
648  if ( !dptr )
649  return E_POINTER;
650 
651  size_t spitch = images[slice].rowPitch;
652  size_t dpitch = _image[slice].rowPitch;
653 
654  size_t size = std::min<size_t>( dpitch, spitch );
655 
656  for( size_t y = 0; y < rowCount; ++y )
657  {
658  memcpy_s( dptr, dpitch, sptr, size );
659  sptr += spitch;
660  dptr += dpitch;
661  }
662  }
663 
664  return S_OK;
665 }
666 
668 {
669  _nimages = 0;
670  _size = 0;
671 
672  if ( _image )
673  {
674  delete [] _image;
675  _image = 0;
676  }
677 
678  if ( _memory )
679  {
680  _aligned_free( _memory );
681  _memory = 0;
682  }
683 
684  memset(&_metadata, 0, sizeof(_metadata));
685 }
686 
687 _Use_decl_annotations_
688 bool ScratchImage::OverrideFormat( DXGI_FORMAT f )
689 {
690  if ( !_image )
691  return false;
692 
693  if ( !IsValid( f ) || IsPlanar( f ) || IsPalettized( f ) )
694  return false;
695 
696  if ( ( BitsPerPixel( f ) != BitsPerPixel( _metadata.format ) )
697  || ( IsCompressed( f ) != IsCompressed( _metadata.format ) )
698  || ( IsPacked( f ) != IsPacked( _metadata.format ) )
699  || ( IsVideo( f ) != IsVideo( _metadata.format ) ) )
700  {
701  // Can't change the effective pitch of the format this way
702  return false;
703  }
704 
705  for( size_t index = 0; index < _nimages; ++index )
706  {
707  _image[ index ].format = f;
708  }
709 
710  _metadata.format = f;
711 
712  return true;
713 }
714 
715 _Use_decl_annotations_
716 const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const
717 {
718  if ( mip >= _metadata.mipLevels )
719  return nullptr;
720 
721  size_t index = 0;
722 
723  switch( _metadata.dimension )
724  {
727  if ( slice > 0 )
728  return nullptr;
729 
730  if ( item >= _metadata.arraySize )
731  return nullptr;
732 
733  index = item*( _metadata.mipLevels ) + mip;
734  break;
735 
737  if ( item > 0 )
738  {
739  // No support for arrays of volumes
740  return nullptr;
741  }
742  else
743  {
744  size_t d = _metadata.depth;
745 
746  for( size_t level = 0; level < mip; ++level )
747  {
748  index += d;
749  if ( d > 1 )
750  d >>= 1;
751  }
752 
753  if ( slice >= d )
754  return nullptr;
755 
756  index += slice;
757  }
758  break;
759 
760  default:
761  return nullptr;
762  }
763 
764  return &_image[index];
765 }
766 
768 {
769  if ( !_image )
770  return false;
771 
772  if ( !HasAlpha( _metadata.format ) )
773  return true;
774 
775  if ( IsCompressed( _metadata.format ) )
776  {
777  for( size_t index = 0; index < _nimages; ++index )
778  {
779  if ( !_IsAlphaAllOpaqueBC( _image[ index ] ) )
780  return false;
781  }
782  }
783  else
784  {
785  ScopedAlignedArrayXMVECTOR scanline( reinterpret_cast<XMVECTOR*>( _aligned_malloc( (sizeof(XMVECTOR)*_metadata.width), 16 ) ) );
786  if ( !scanline )
787  return false;
788 
789  static const XMVECTORF32 threshold = { 0.99f, 0.99f, 0.99f, 0.99f };
790 
791  for( size_t index = 0; index < _nimages; ++index )
792  {
793 #pragma warning( suppress : 6011 )
794  const Image& img = _image[ index ];
795 
796  const uint8_t *pPixels = img.pixels;
797  assert( pPixels );
798 
799  for( size_t h = 0; h < img.height; ++h )
800  {
801  if ( !_LoadScanline( scanline.get(), img.width, pPixels, img.rowPitch, img.format ) )
802  return false;
803 
804  XMVECTOR* ptr = scanline.get();
805  for( size_t w = 0; w < img.width; ++w )
806  {
807  XMVECTOR alpha = XMVectorSplatW( *ptr );
808  if ( XMVector4Less( alpha, threshold ) )
809  return false;
810  ++ptr;
811  }
812 
813  pPixels += img.rowPitch;
814  }
815  }
816  }
817 
818  return true;
819 }
820 
821 }; // namespace
bool _CalculateMipLevels3D(_In_ size_t width, _In_ size_t height, _In_ size_t depth, _Inout_ size_t &mipLevels)
bool IsCubemap() const
Definition: DirectXTex.h:131
std::unique_ptr< DirectX::XMVECTOR, aligned_deleter > ScopedAlignedArrayXMVECTOR
Definition: scoped.h:27
_In_ size_t _In_ const TexMetadata _In_ DWORD cpFlags
Definition: DirectXTexP.h:116
const Image * GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const
bool IsVideo(_In_ DXGI_FORMAT fmt)
bool _IsAlphaAllOpaqueBC(_In_ const Image &cImage)
uint8_t * pixels
Definition: DirectXTex.h:230
bool HasAlpha(_In_ DXGI_FORMAT fmt)
HRESULT InitializeCube(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t nCubes, _In_ size_t mipLevels, _In_ DWORD flags=CP_FLAGS_NONE)
bool OverrideFormat(_In_ DXGI_FORMAT f)
_In_ size_t _In_ const TexMetadata _In_ DWORD _In_ size_t nImages
Definition: DirectXTexP.h:118
bool IsPlanar(_In_ DXGI_FORMAT fmt)
HRESULT Initialize3DFromImages(_In_reads_(depth) const Image *images, _In_ size_t depth, _In_ DWORD flags=CP_FLAGS_NONE)
DXGI_FORMAT format
Definition: DirectXTex.h:125
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
Definition: DirectXTexP.h:170
bool IsPacked(_In_ DXGI_FORMAT fmt)
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT _In_ DWORD flags assert(pDestination &&outSize > 0)
bool IsAlphaAllOpaque() const
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float threshold
Definition: DirectXTexP.h:183
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
Definition: DirectXTexP.h:191
HRESULT Initialize(_In_ const TexMetadata &mdata, _In_ DWORD flags=CP_FLAGS_NONE)
_In_ size_t pixelSize
Definition: DirectXTexP.h:116
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 rowPitch
Definition: DirectXTex.h:228
HRESULT InitializeCubeFromImages(_In_reads_(nImages) const Image *images, _In_ size_t nImages, _In_ DWORD flags=CP_FLAGS_NONE)
HRESULT Initialize3D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t depth, _In_ size_t mipLevels, _In_ DWORD flags=CP_FLAGS_NONE)
_In_ size_t _In_ const TexMetadata & metadata
Definition: DirectXTexP.h:116
HRESULT InitializeFromImage(_In_ const Image &srcImage, _In_ bool allow1D=false, _In_ DWORD flags=CP_FLAGS_NONE)
void ComputePitch(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _Out_ size_t &rowPitch, _Out_ size_t &slicePitch, _In_ DWORD flags=CP_FLAGS_NONE)
bool IsDepthStencil(_In_ DXGI_FORMAT fmt)
bool IsValid(_In_ DXGI_FORMAT fmt)
bool IsPalettized(_In_ DXGI_FORMAT fmt)
_Use_decl_annotations_ void _DetermineImageArray(const TexMetadata &metadata, DWORD cpFlags, size_t &nImages, size_t &pixelSize)
HRESULT Initialize1D(_In_ DXGI_FORMAT fmt, _In_ size_t length, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ DWORD flags=CP_FLAGS_NONE)
TEX_DIMENSION dimension
Definition: DirectXTex.h:126
HRESULT InitializeArrayFromImages(_In_reads_(nImages) const Image *images, _In_ size_t nImages, _In_ bool allow1D=false, _In_ DWORD flags=CP_FLAGS_NONE)
DXGI_FORMAT format
Definition: DirectXTex.h:227
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
Definition: DirectXTexP.h:175
ScratchImage & operator=(ScratchImage &&moveFrom)
size_t BitsPerPixel(_In_ DXGI_FORMAT fmt)
_In_ size_t _In_ size_t size
Definition: DirectXTexP.h:175
_Use_decl_annotations_ bool _SetupImageArray(uint8_t *pMemory, size_t pixelSize, const TexMetadata &metadata, DWORD cpFlags, Image *images, size_t nImages)
bool _CalculateMipLevels(_In_ size_t width, _In_ size_t height, _Inout_ size_t &mipLevels)
size_t slicePitch
Definition: DirectXTex.h:229
size_t ComputeScanlines(_In_ DXGI_FORMAT fmt, _In_ size_t height)