This commit is contained in:
2025-12-13 22:32:33 -05:00
parent 4fc004dbe0
commit c23179c134

View File

@@ -1,7 +1,6 @@
#include "texture.h" #include "texture.h"
#include <filesystem> #include <filesystem>
#include <fstream>
#include <lunasvg.h> #include <lunasvg.h>
#include <memory> #include <memory>
#include <utility> #include <utility>
@@ -22,30 +21,13 @@
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif
#include "filesystem_.h"
#include "math_.h" #include "math_.h"
using namespace anm2ed::resource::texture; using namespace anm2ed::resource::texture;
using namespace anm2ed::util::math; using namespace anm2ed::util::math;
using namespace glm; using namespace glm;
namespace filesystem = anm2ed::util::filesystem;
namespace
{
std::vector<uint8_t> 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<uint8_t> buffer(static_cast<std::size_t>(size));
file.seekg(0, std::ios::beg);
if (!file.read(reinterpret_cast<char*>(buffer.data()), static_cast<std::streamsize>(size))) return {};
return buffer;
}
}
namespace anm2ed::resource namespace anm2ed::resource
{ {
@@ -136,13 +118,8 @@ namespace anm2ed::resource
Texture::Texture(const std::filesystem::path& pngPath) Texture::Texture(const std::filesystem::path& pngPath)
{ {
auto fileData = file_read_all(pngPath); auto pngPathUtf8 = filesystem::path_to_utf8(pngPath);
if (fileData.empty()) return; if (const uint8_t* data = stbi_load(pngPathUtf8.c_str(), &size.x, &size.y, nullptr, CHANNELS); data)
if (const uint8_t* data =
stbi_load_from_memory(fileData.data(), static_cast<int>(fileData.size()), &size.x, &size.y, nullptr,
CHANNELS);
data)
{ {
upload(data); upload(data);
stbi_image_free((void*)data); stbi_image_free((void*)data);
@@ -151,20 +128,8 @@ namespace anm2ed::resource
bool Texture::write_png(const std::filesystem::path& path) bool Texture::write_png(const std::filesystem::path& path)
{ {
if (pixels.empty()) return false; 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);
std::ofstream file(path, std::ios::binary);
if (!file) return false;
auto write_func = [](void* context, void* data, int size) {
auto* stream = static_cast<std::ofstream*>(context);
stream->write(static_cast<char*>(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 vec4 Texture::pixel_read(vec2 position) const