From 6ba2c4cfb136c38b5d5513fb99c7e8eb1cb9f064 Mon Sep 17 00:00:00 2001 From: Felix Salcher Date: Wed, 2 Jul 2025 12:57:20 +0200 Subject: [PATCH] fix stuff --- include/hyprgraphics/image/Image.hpp | 7 +++---- src/image/Image.cpp | 6 +++--- src/image/formats/Png.cpp | 24 +++++++++++------------- src/image/formats/Png.hpp | 5 ++--- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/include/hyprgraphics/image/Image.hpp b/include/hyprgraphics/image/Image.hpp index adde9cf..23a5c93 100644 --- a/include/hyprgraphics/image/Image.hpp +++ b/include/hyprgraphics/image/Image.hpp @@ -6,15 +6,14 @@ #include namespace Hyprgraphics { - enum ImageFormat { - PNG + enum EImageFormat { + IMAGE_FORMAT_PNG }; class CImage { public: - // create an image from a provided path. CImage(const std::string& path); - CImage(const unsigned char*, size_t, ImageFormat); + CImage(const std::span&, EImageFormat); ~CImage(); CImage(const CImage&) = delete; diff --git a/src/image/Image.cpp b/src/image/Image.cpp index 5e9f84e..8d5600c 100644 --- a/src/image/Image.cpp +++ b/src/image/Image.cpp @@ -12,10 +12,10 @@ using namespace Hyprgraphics; using namespace Hyprutils::Memory; -Hyprgraphics::CImage::CImage(const unsigned char* data, size_t size, ImageFormat format) { +Hyprgraphics::CImage::CImage(const std::span& data, EImageFormat format) { std::expected CAIROSURFACE; - if (format == ImageFormat::PNG) { - CAIROSURFACE = PNG::createSurfaceFromPNG(data, size); + if (format == EImageFormat::IMAGE_FORMAT_PNG) { + CAIROSURFACE = PNG::createSurfaceFromPNG(data); mime = "image/png"; } else { lastError = "Currently only PNG images are supported for embedding"; diff --git a/src/image/formats/Png.cpp b/src/image/formats/Png.cpp index 7408f07..6ee29be 100644 --- a/src/image/formats/Png.cpp +++ b/src/image/formats/Png.cpp @@ -11,7 +11,9 @@ #include using namespace Hyprutils::Utils; -std::expected PNG::createSurfaceFromPNG(const std::string& path) { +static std::expected loadPNG(png_structp, png_infop); + +std::expected PNG::createSurfaceFromPNG(const std::string& path) { if (!std::filesystem::exists(path)) return std::unexpected("loading png: file doesn't exist"); @@ -37,24 +39,23 @@ std::expected PNG::createSurfaceFromPNG(const std return loadPNG(png, info); } -struct MemoryReadState { - const unsigned char* data; - size_t size; - size_t offset; +struct ReadState { + const std::span& data; + size_t offset; }; void custom_read_function(png_structp png, png_bytep data, png_size_t length) { - MemoryReadState* state = static_cast(png_get_io_ptr(png)); - if (state->offset + length > state->size) { + ReadState* state = static_cast(png_get_io_ptr(png)); + if (state->offset + length > state->data.size()) { png_error(png, "read error"); return; } - memcpy(data, state->data + state->offset, length); + memcpy(data, state->data.data() + state->offset, length); state->offset += length; } -std::expected PNG::createSurfaceFromPNG(const unsigned char* data, size_t size) { +std::expected PNG::createSurfaceFromPNG(const std::span& data) { png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); png_infop info = png_create_info_struct(png); if (!png || !info) @@ -65,10 +66,7 @@ std::expected PNG::createSurfaceFromPNG(const uns if (setjmp(png_jmpbuf(png))) return std::unexpected("loading png: couldn't setjmp"); - MemoryReadState readState; - readState.data = reinterpret_cast(data); - readState.size = size; - readState.offset = 0; + ReadState readState = {data, 0}; png_set_read_fn(png, &readState, custom_read_function); png_set_sig_bytes(png, 0); diff --git a/src/image/formats/Png.hpp b/src/image/formats/Png.hpp index 8a496a5..9557af5 100644 --- a/src/image/formats/Png.hpp +++ b/src/image/formats/Png.hpp @@ -4,10 +4,9 @@ #include #include #include +#include namespace PNG { std::expected createSurfaceFromPNG(const std::string&); - std::expected createSurfaceFromPNG(const unsigned char*, size_t); + std::expected createSurfaceFromPNG(const std::span&); }; - -static std::expected loadPNG(png_structp, png_infop);