Mercurial > love-experiments
diff src/modules/image/devil/Image.cpp @ 1420:2a5ef265e040 image-CompressedData
Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
- added a new CompressedData type to love.image
- added love.image.isCompressed(file or data)
- love.graphics.newImage automatically tests for compression when loading a file
- added love.graphics.isSupported strings for DXT, BC5, and BC7
Compressed textures meant to be used on the GPU offer huge performance gains when
- loading the texture from a file
- loading the texture from RAM to VRAM
- loading mipmaps
- rendering
| author | Alex Szpakowski <slime73@gmail.com> |
|---|---|
| date | Thu, 04 Apr 2013 19:09:18 -0300 |
| parents | b7f097053d74 |
| children | aa603d1b03bc |
line wrap: on
line diff
--- a/src/modules/image/devil/Image.cpp Mon Apr 01 16:47:45 2013 -0300 +++ b/src/modules/image/devil/Image.cpp Thu Apr 04 19:09:18 2013 -0300 @@ -21,6 +21,7 @@ #include "Image.h" #include "ImageData.h" +#include "CompressedData.h" // DevIL #include <IL/il.h> @@ -32,6 +33,11 @@ namespace devil { +const std::string Image::compressedExts[] = +{ + ".dds", "" +}; + Image::Image() { ilInit(); @@ -69,6 +75,47 @@ return new ImageData(width, height, data); } +love::image::CompressedData *Image::newCompressedData(love::filesystem::File *file) +{ + return new CompressedData(file); +} + +love::image::CompressedData *Image::newCompressedData(love::Data *data) +{ + return new CompressedData(data); +} + +bool Image::isCompressed(love::filesystem::File *file) +{ + bool hasExt = false; + + // Check whether the file has an extension known to contain compressed data. + const std::string &ext = file->getExtension(); + for (int i = 0; !(compressedExts[i].empty()); i++) + { + if (compressedExts[i].compare(ext)) + { + hasExt = true; + break; + } + } + + if (!hasExt) + return false; + + // Check whether the actual data is compressed. + Data *data = file->read(); + bool compressed = CompressedData::isCompressed(data); + data->release(); + + return compressed; +} + +bool Image::isCompressed(love::Data *data) +{ + return CompressedData::isCompressed(data); +} + } // devil } // image } // love
