From 4fc004dbe0a0fd568fbfe588ac1bedbe62686a57 Mon Sep 17 00:00:00 2001 From: shweet Date: Sat, 13 Dec 2025 22:23:18 -0500 Subject: [PATCH] ummmm --- src/resource/texture.cpp | 47 +++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/resource/texture.cpp b/src/resource/texture.cpp index f667b41..d7f896b 100644 --- a/src/resource/texture.cpp +++ b/src/resource/texture.cpp @@ -1,6 +1,7 @@ #include "texture.h" #include +#include #include #include #include @@ -21,13 +22,30 @@ #pragma GCC diagnostic pop #endif -#include "filesystem_.h" #include "math_.h" using namespace anm2ed::resource::texture; using namespace anm2ed::util::math; using namespace glm; -namespace filesystem = anm2ed::util::filesystem; + +namespace +{ + std::vector file_read_all(const std::filesystem::path& path) + { + std::ifstream file(path, std::ios::binary); + if (!file) return {}; + + file.seekg(0, std::ios::end); + auto size = file.tellg(); + if (size <= 0) return {}; + + std::vector buffer(static_cast(size)); + file.seekg(0, std::ios::beg); + if (!file.read(reinterpret_cast(buffer.data()), static_cast(size))) return {}; + + return buffer; + } +} namespace anm2ed::resource { @@ -118,8 +136,13 @@ namespace anm2ed::resource Texture::Texture(const std::filesystem::path& pngPath) { - auto pngPathUtf8 = filesystem::path_to_utf8(pngPath); - if (const uint8_t* data = stbi_load(pngPathUtf8.c_str(), &size.x, &size.y, nullptr, CHANNELS); data) + auto fileData = file_read_all(pngPath); + if (fileData.empty()) return; + + if (const uint8_t* data = + stbi_load_from_memory(fileData.data(), static_cast(fileData.size()), &size.x, &size.y, nullptr, + CHANNELS); + data) { upload(data); stbi_image_free((void*)data); @@ -128,8 +151,20 @@ namespace anm2ed::resource bool Texture::write_png(const std::filesystem::path& path) { - auto pathUtf8 = filesystem::path_to_utf8(path); - return stbi_write_png(pathUtf8.c_str(), size.x, size.y, CHANNELS, this->pixels.data(), size.x * CHANNELS); + if (pixels.empty()) return false; + + std::ofstream file(path, std::ios::binary); + if (!file) return false; + + auto write_func = [](void* context, void* data, int size) { + auto* stream = static_cast(context); + stream->write(static_cast(data), size); + }; + + auto result = stbi_write_png_to_func(write_func, &file, size.x, size.y, CHANNELS, this->pixels.data(), + size.x * CHANNELS); + file.flush(); + return result != 0; } vec4 Texture::pixel_read(vec2 position) const