summaryrefslogtreecommitdiff
path: root/Source/Asura.Engine/Graphics/STBDecoder.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-01 08:50:34 +0800
committerchai <chaifix@163.com>2019-03-01 08:50:34 +0800
commit64d9d7b3eb7cece81da8b2cb56eb0f50d87a5964 (patch)
tree12bde99e5415f77f60f8873a66d09bfd3b84ec48 /Source/Asura.Engine/Graphics/STBDecoder.cpp
parente28a7d48d032fe7fd4c8789e95fbc659873a0adc (diff)
*misc
Diffstat (limited to 'Source/Asura.Engine/Graphics/STBDecoder.cpp')
-rw-r--r--Source/Asura.Engine/Graphics/STBDecoder.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/Source/Asura.Engine/Graphics/STBDecoder.cpp b/Source/Asura.Engine/Graphics/STBDecoder.cpp
new file mode 100644
index 0000000..d4d578f
--- /dev/null
+++ b/Source/Asura.Engine/Graphics/STBDecoder.cpp
@@ -0,0 +1,69 @@
+#include "STBDecoder.h"
+
+#include "Exceptions/Exception.h"
+#include "stb/stb_image.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool STBDecoder::CanDecode(const Filesystem::DataBuffer* buffer)
+ {
+ int w = 0;
+ int h = 0;
+ int comp = 0;
+
+ int status = stbi_info_from_memory((const stbi_uc *)buffer->data, buffer->size, &w, &h, &comp);
+
+ return status == 1 && w > 0 && h > 0;
+ }
+
+ void STBDecoder::Decode(const Filesystem::DataBuffer* db, ImageData* imageData)
+ {
+ if (!db)
+ throw Exception("Could not decode image with stb decoder because of null databuffer.");
+ if (!imageData)
+ throw Exception("Could not decode image with stb decoder because of null output image data.");
+ const stbi_uc *buffer = (const stbi_uc *)db->data;
+ int bufferlen = db->size;
+ int width, height;
+ int comp = 0;
+ byte* data = nullptr;
+ PixelFormat format = PIXELFORMAT_UNKNOWN;
+ std::size_t size = 0;
+
+ if (stbi_is_hdr_from_memory(buffer, bufferlen))
+ {
+ // 4channelfloat
+ data = (byte*)stbi_loadf_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_RGBA32F;
+ size = width * height * 4 * sizeof(float);
+ }
+ else
+ {
+ data = (byte*)stbi_load_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_ASTC_8x5;
+ size = width * height * 4;
+ }
+ if (data)
+ {
+ // ֤ڴ汻ͷţһϲûͷŵΪimage dataһԵģimageǶεġ
+ if (imageData->pixels)
+ delete[] imageData->pixels;
+ imageData->pixels = (byte*)data;
+ imageData->format = format;
+ imageData->width = width;
+ imageData->height = height;
+ }
+ else
+ {
+ const char *err = stbi_failure_reason();
+ if (err == nullptr)
+ err = "unknown error";
+ throw Exception("Could not decode image with stb_image (%s).", err);
+ }
+ }
+
+ }
+} \ No newline at end of file