annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "image_load_save.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/imageLoaderLite.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <SDK/popup_message.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <SDK/album_art_helpers.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 bool imageSaveDialog(album_art_data_ptr content, HWND wndParent, const char* initDir, bool bAsync) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 pfc::string8 fileTypes = "All files|*.*";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 pfc::string8 ext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 auto info = fb2k::imageLoaderLite::get()->getInfo(content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 if (info.formatName) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 pfc::string8 nameCapitalized = pfc::stringToUpper( info.formatName );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 ext = pfc::stringToLower( info.formatName );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (nameCapitalized == "WEBP") nameCapitalized = "WebP";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 pfc::string8 extmask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 if (ext == "jpeg-xl") ext = "jxl";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (ext == "jpeg") {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 ext = "jpg";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 extmask = "*.jpg;*.jpeg";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 extmask << "*." << ext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 fileTypes.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 fileTypes << nameCapitalized << " files|" << extmask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 } catch (...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 pfc::string8 fn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 if (!uGetOpenFileName(wndParent, fileTypes, 0, ext.length() > 0 ? ext.c_str() : nullptr, "Export picture file", initDir, fn, TRUE)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 auto bErrord = std::make_shared<bool>(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 auto work = [content, fn, bErrord] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 auto f = fileOpenWriteNew(fn, fb2k::noAbort, 0.5);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 f->write(content->get_ptr(), content->get_size(), fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 * bErrord = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 pfc::string8 msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 msg << "Image file could not be written: " << e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 fb2k::inMainThread([msg] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 popup_message::g_show(msg, "Information");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 if (bAsync) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 fb2k::splitTask(work);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 work();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 return ! *bErrord;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bool imageLoadDialog(pfc::string_base& outFN, HWND wndParent, const char* initDir) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 return !!uGetOpenFileName(wndParent, FB2K_GETOPENFILENAME_PICTUREFILES_ALL, 0, nullptr, "Import picture file", initDir, outFN, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 album_art_data::ptr imageLoadDialog(HWND wndParent, const char* initDir) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 album_art_data::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 pfc::string8 fn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 if (imageLoadDialog(fn, wndParent, initDir)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 ret = readPictureFile(fn, fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 } catch (std::exception const& e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 popup_message::g_show(PFC_string_formatter() << "Image file could not be read: " << e, "Information");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 album_art_data_ptr readPictureFile(const char* p_path, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 PFC_ASSERT(p_path != nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 PFC_ASSERT(*p_path != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 // Pointless, not a media file, path often from openfiledialog and not canonical
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 // file_lock_ptr lock = file_lock_manager::get()->acquire_read(p_path, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 file_ptr l_file;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 filesystem::g_open_timeout(l_file, p_path, filesystem::open_mode_read, 0.5, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 service_ptr_t<album_art_data_impl> instance = new service_impl_t<album_art_data_impl>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 t_filesize size = l_file->get_size_ex(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (size > 1024 * 1024 * 64) throw std::runtime_error("File too large");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 instance->from_stream(l_file.get_ptr(), (t_size)size, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 return instance;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }