summaryrefslogtreecommitdiff
path: root/modules/squish
diff options
context:
space:
mode:
authorFerenc Arn <tagcup@yahoo.com>2017-04-29 20:14:14 -0500
committerFerenc Arn <tagcup@yahoo.com>2017-05-18 16:57:53 -0500
commit3c175115ebf54bcf5f53ab7a2d4926c6773665db (patch)
treef303e830e07a5228f4d93ff866c3c53e2a226dd8 /modules/squish
parenta75623f436c215e107ede321afa08a1897552deb (diff)
Use libsquish to decompress DXT textures.
Diffstat (limited to 'modules/squish')
-rw-r--r--modules/squish/image_compress_squish.cpp42
-rw-r--r--modules/squish/image_compress_squish.h1
-rw-r--r--modules/squish/register_types.cpp1
3 files changed, 43 insertions, 1 deletions
diff --git a/modules/squish/image_compress_squish.cpp b/modules/squish/image_compress_squish.cpp
index 3f7ad8b2c2..5c53492034 100644
--- a/modules/squish/image_compress_squish.cpp
+++ b/modules/squish/image_compress_squish.cpp
@@ -39,6 +39,46 @@
#include <squish.h>
+void image_decompress_squish(Image *p_image) {
+ int w = p_image->get_width();
+ int h = p_image->get_height();
+
+ Image::Format target_format = Image::FORMAT_RGBA8;
+ PoolVector<uint8_t> data;
+ int target_size = Image::get_image_data_size(w, h, target_format, p_image->has_mipmaps() ? -1 : 0);
+ int mm_count = p_image->get_mipmap_count();
+ data.resize(target_size);
+
+ PoolVector<uint8_t>::Read rb = p_image->get_data().read();
+ PoolVector<uint8_t>::Write wb = data.write();
+
+ int squish_flags = Image::FORMAT_MAX;
+ if (p_image->get_format() == Image::FORMAT_DXT1) {
+ squish_flags = squish::kDxt1;
+ } else if (p_image->get_format() == Image::FORMAT_DXT3) {
+ squish_flags = squish::kDxt3;
+ } else if (p_image->get_format() == Image::FORMAT_DXT5) {
+ squish_flags = squish::kDxt5;
+ } else if (p_image->get_format() == Image::FORMAT_ATI1) {
+ squish_flags = squish::kBc4;
+ } else if (p_image->get_format() == Image::FORMAT_ATI2) {
+ squish_flags = squish::kBc5;
+ } else {
+ ERR_FAIL_COND(true);
+ return;
+ }
+
+ int dst_ofs = 0;
+
+ for (int i = 0; i <= mm_count; i++) {
+ int src_ofs = 0, mipmap_size = 0, mipmap_w = 0, mipmap_h = 0;
+ p_image->get_mipmap_offset_size_and_dimensions(i, src_ofs, mipmap_size, mipmap_w, mipmap_h);
+ squish::DecompressImage(&wb[dst_ofs], mipmap_w, mipmap_h, &rb[src_ofs], squish_flags);
+ }
+
+ p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
+}
+
void image_compress_squish(Image *p_image) {
int w = p_image->get_width();
@@ -56,7 +96,7 @@ void image_compress_squish(Image *p_image) {
return; //do not compress, already compressed
int shift = 0;
- int squish_comp = squish::kColourRangeFit;
+ int squish_comp = squish::kColourRangeFit; // TODO: use lossy quality setting to determine the quality
Image::Format target_format;
if (p_image->get_format() == Image::FORMAT_LA8) {
diff --git a/modules/squish/image_compress_squish.h b/modules/squish/image_compress_squish.h
index 81f57c6822..519e3537ef 100644
--- a/modules/squish/image_compress_squish.h
+++ b/modules/squish/image_compress_squish.h
@@ -33,5 +33,6 @@
#include "image.h"
void image_compress_squish(Image *p_image);
+void image_decompress_squish(Image *p_image);
#endif // IMAGE_COMPRESS_SQUISH_H
diff --git a/modules/squish/register_types.cpp b/modules/squish/register_types.cpp
index 41341db93b..2eeea59836 100644
--- a/modules/squish/register_types.cpp
+++ b/modules/squish/register_types.cpp
@@ -36,6 +36,7 @@
void register_squish_types() {
Image::set_compress_bc_func(image_compress_squish);
+ Image::_image_decompress_bc = image_decompress_squish;
}
void unregister_squish_types() {}