@@ -159,6 +159,27 @@ namespace {
159
159
const uint32 D3DFMT_A32B32G32R32F = 116 ;
160
160
}
161
161
162
+ // ---------------------------------------------------------------------
163
+ // Force the DXT stream decompression
164
+ // ---------------------------------------------------------------------
165
+ int DDSDecodeEnforcer::mCount = 0 ;
166
+
167
+ DDSDecodeEnforcer::DDSDecodeEnforcer ()
168
+ {
169
+ ++mCount ;
170
+ }
171
+
172
+ DDSDecodeEnforcer::~DDSDecodeEnforcer ()
173
+ {
174
+ --mCount ;
175
+ assert (mCount >= 0 );
176
+ }
177
+
178
+ bool DDSDecodeEnforcer::isEnabled ()
179
+ {
180
+ return mCount > 0 ;
181
+ }
182
+
162
183
// ---------------------------------------------------------------------
163
184
DDSCodec* DDSCodec::msInstance = 0 ;
164
185
// ---------------------------------------------------------------------
@@ -193,7 +214,7 @@ namespace {
193
214
{
194
215
}
195
216
// ---------------------------------------------------------------------
196
- void DDSCodec::encodeToFile (const Any& input, const String& outFileName ) const
217
+ DataStreamPtr DDSCodec::encode (const Any& input) const
197
218
{
198
219
Image* image = any_cast<Image*>(input);
199
220
@@ -402,21 +423,42 @@ namespace {
402
423
dataPtr = tmpData;
403
424
}
404
425
405
- try
406
- {
407
- // Write the file
408
- std::ofstream of;
409
- of.open (outFileName.c_str (), std::ios_base::binary|std::ios_base::out);
410
- of.write ((const char *)&ddsMagic, sizeof (uint32));
411
- of.write ((const char *)&ddsHeader, DDS_HEADER_SIZE);
412
- // XXX flipEndian on each pixel chunk written unless isFloat32r ?
413
- of.write (dataPtr, image->getSize ());
414
- of.close ();
415
- }
416
- catch (...)
417
- {
418
- }
426
+ size_t totalSize = sizeof (uint32) + DDS_HEADER_SIZE + image->getSize ();
427
+ auto pMemStream = OGRE_NEW Ogre::MemoryDataStream (totalSize);
428
+
429
+ pMemStream->write (&ddsMagic, sizeof (uint32));
430
+ pMemStream->write (&ddsHeader, DDS_HEADER_SIZE);
431
+ pMemStream->write (dataPtr, image->getSize ());
432
+ pMemStream->seek (0 );
433
+
419
434
delete [] tmpData;
435
+
436
+ return Ogre::DataStreamPtr (pMemStream);
437
+ }
438
+ }
439
+ // ---------------------------------------------------------------------
440
+ void DDSCodec::encodeToFile (const Any& input, const String& outFileName) const
441
+ {
442
+ DataStreamPtr strm = encode (input);
443
+
444
+ try
445
+ {
446
+ // Write the file
447
+ std::ofstream of;
448
+ of.open (outFileName.c_str (), std::ios_base::binary | std::ios_base::out);
449
+
450
+ const size_t buffSize = 4096 ;
451
+ char buffer[buffSize];
452
+
453
+ while (!strm->eof ()) {
454
+ size_t bytesRead = strm->read (buffer, buffSize);
455
+ of.write (buffer, bytesRead);
456
+ }
457
+
458
+ of.close ();
459
+ }
460
+ catch (...)
461
+ {
420
462
}
421
463
}
422
464
// ---------------------------------------------------------------------
@@ -824,7 +866,8 @@ namespace {
824
866
if (PixelUtil::isCompressed (sourceFormat))
825
867
{
826
868
if (Root::getSingleton ().getRenderSystem () == NULL ||
827
- !Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (RSC_TEXTURE_COMPRESSION_DXT))
869
+ !Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (RSC_TEXTURE_COMPRESSION_DXT) ||
870
+ DDSDecodeEnforcer::isEnabled ())
828
871
{
829
872
// We'll need to decompress
830
873
decompressDXT = true ;
0 commit comments