#pragma once #include #include #include #include #include "./image_loader.hpp" #include "./texture_cache.hpp" struct SendImagePopup { TextureUploaderI& _tu; // private std::vector> _image_loaders; // copy of the original data, dont touch! std::vector original_data; bool original_raw {false}; std::string original_file_ext; // if !original_raw ImageLoaderI::ImageResult original_image; struct Rect { uint32_t x {0}; uint32_t y {0}; uint32_t w {0}; uint32_t h {0}; }; Rect crop_rect; // texture to render (orig img) TextureEntry preview_image; bool compress {false}; uint32_t quality {80u}; bool _open_popup {false}; std::function&, std::string_view)> _on_send = [](const auto&, auto){}; std::function _on_cancel = [](){}; void reset(void); // loads the image in original_data // fills in original_image, preview_image and crop_rect // returns if loaded successfully bool load(void); static std::vector compressWebp(const ImageLoaderI::ImageResult& input_image, uint32_t quality = 80u); static ImageLoaderI::ImageResult crop(const ImageLoaderI::ImageResult& input_image, const Rect& crop_rect); static Rect sanitizeCrop(Rect crop_rect, uint32_t image_width, uint32_t image_height); public: SendImagePopup(TextureUploaderI& tu); void sendMemory( const uint8_t* data, size_t data_size, std::function&, std::string_view)>&& on_send, std::function&& on_cancel ); // from memory_raw // from file_path // call this each frame void render(void); };