Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/image_load_save.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/image_load_save.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,91 @@ +#include "StdAfx.h" +#include "image_load_save.h" +#include <memory> +#include <SDK/imageLoaderLite.h> +#include <SDK/popup_message.h> +#include <SDK/album_art_helpers.h> + +namespace fb2k { + bool imageSaveDialog(album_art_data_ptr content, HWND wndParent, const char* initDir, bool bAsync) { + pfc::string8 fileTypes = "All files|*.*"; + pfc::string8 ext; + + try { + auto info = fb2k::imageLoaderLite::get()->getInfo(content); + if (info.formatName) { + pfc::string8 nameCapitalized = pfc::stringToUpper( info.formatName ); + ext = pfc::stringToLower( info.formatName ); + if (nameCapitalized == "WEBP") nameCapitalized = "WebP"; + pfc::string8 extmask; + if (ext == "jpeg-xl") ext = "jxl"; + if (ext == "jpeg") { + ext = "jpg"; + extmask = "*.jpg;*.jpeg"; + } else { + extmask << "*." << ext; + } + fileTypes.reset(); + fileTypes << nameCapitalized << " files|" << extmask; + } + } catch (...) {} + pfc::string8 fn; + + if (!uGetOpenFileName(wndParent, fileTypes, 0, ext.length() > 0 ? ext.c_str() : nullptr, "Export picture file", initDir, fn, TRUE)) return false; + + auto bErrord = std::make_shared<bool>(false); + auto work = [content, fn, bErrord] { + try { + auto f = fileOpenWriteNew(fn, fb2k::noAbort, 0.5); + f->write(content->get_ptr(), content->get_size(), fb2k::noAbort); + } catch(std::exception const & e) { + * bErrord = true; + pfc::string8 msg; + msg << "Image file could not be written: " << e; + fb2k::inMainThread([msg] { + popup_message::g_show(msg, "Information"); + }); + } + }; + if (bAsync) { + fb2k::splitTask(work); + return true; + } else { + work(); + return ! *bErrord; + } + } + + bool imageLoadDialog(pfc::string_base& outFN, HWND wndParent, const char* initDir) { + return !!uGetOpenFileName(wndParent, FB2K_GETOPENFILENAME_PICTUREFILES_ALL, 0, nullptr, "Import picture file", initDir, outFN, FALSE); + } + album_art_data::ptr imageLoadDialog(HWND wndParent, const char* initDir) { + album_art_data::ptr ret; + pfc::string8 fn; + if (imageLoadDialog(fn, wndParent, initDir)) { + try { + ret = readPictureFile(fn, fb2k::noAbort); + } catch (std::exception const& e) { + popup_message::g_show(PFC_string_formatter() << "Image file could not be read: " << e, "Information"); + } + } + return ret; + } + + album_art_data_ptr readPictureFile(const char* p_path, abort_callback& p_abort) { + PFC_ASSERT(p_path != nullptr); + PFC_ASSERT(*p_path != 0); + p_abort.check(); + + // Pointless, not a media file, path often from openfiledialog and not canonical + // file_lock_ptr lock = file_lock_manager::get()->acquire_read(p_path, p_abort); + + file_ptr l_file; + filesystem::g_open_timeout(l_file, p_path, filesystem::open_mode_read, 0.5, p_abort); + service_ptr_t<album_art_data_impl> instance = new service_impl_t<album_art_data_impl>(); + t_filesize size = l_file->get_size_ex(p_abort); + if (size > 1024 * 1024 * 64) throw std::runtime_error("File too large"); + instance->from_stream(l_file.get_ptr(), (t_size)size, p_abort); + return instance; + } + +} \ No newline at end of file
