| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // ================================================================================
- // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
- // == See tb_core.h for more information. ==
- // ================================================================================
- #include "tb_bitmap_fragment.h"
- #include "tb_system.h"
- #ifdef TB_IMAGE_LOADER_STB
- namespace tb {
- // Configure stb image and remove some features we don't use to reduce binary size.
- #define STB_IMAGE_STATIC
- #define STB_IMAGE_IMPLEMENTATION
- //#define STBI_SIMD
- #define STBI_NO_STDIO
- #define STBI_NO_FAILURE_STRINGS
- #define STBI_NO_HDR
- // Disable unused function warnings for stb_image.h. Since STB_IMAGE_STATIC is
- // defined, it will contain a couple of unused static functions.
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-function"
- // Include stb image - Tiny portable and reasonable fast image loader from http://nothings.org/
- // Should not be used for content not distributed with your app (May not be secure and doesn't
- // support all formats fully)
- #include "thirdparty/stb_image.h"
- #pragma GCC diagnostic pop
- class STBI_Loader : public TBImageLoader
- {
- public:
- int width, height;
- unsigned char *data;
- STBI_Loader() : width(0), height(0), data(nullptr) {}
- ~STBI_Loader() { stbi_image_free(data); }
- virtual int Width() { return width; }
- virtual int Height() { return height; }
- virtual uint32 *Data() { return (uint32*)data; }
- };
- TBImageLoader *TBImageLoader::CreateFromFile(const char *filename)
- {
- // Load directly from file
- /*int w, h, comp;
- if (unsigned char *data = stbi_load(filename, &w, &h, &comp, 4))
- {
- if (STBI_Loader *img = new STBI_Loader())
- {
- img->width = w;
- img->height = h;
- img->data = data;
- return img;
- }
- else
- stbi_image_free(data);
- }
- return nullptr;*/
- if (TBFile *file = TBFile::Open(filename, TBFile::MODE_READ))
- {
- long size = file->Size();
- if (unsigned char *data = new unsigned char[size])
- {
- size = file->Read(data, 1, size);
- int w, h, comp;
- if (unsigned char *img_data = stbi_load_from_memory(data, size, &w, &h, &comp, 4))
- {
- if (STBI_Loader *img = new STBI_Loader())
- {
- img->width = w;
- img->height = h;
- img->data = img_data;
- delete [] data;
- delete file;
- return img;
- }
- else
- stbi_image_free(img_data);
- }
- delete data;
- }
- delete file;
- }
- return nullptr;
- }
- }; // namespace tb
- #endif // TB_IMAGE_LOADER_STB
|