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