summaryrefslogtreecommitdiff
path: root/imgmanager.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-03 18:49:22 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-03 18:49:22 -0400
commitbbe36a8246041544d6ebe420dfa1b695b6c74521 (patch)
treeaa2c607b812c04afd2ef4a240489e7c8adec7c3b /imgmanager.cpp
parentc7a958a3bb241b28c766faa3db6f4ff1876bd065 (diff)
downloadabaddon-portaudio-bbe36a8246041544d6ebe420dfa1b695b6c74521.tar.gz
abaddon-portaudio-bbe36a8246041544d6ebe420dfa1b695b6c74521.zip
maybe slightly better image loading maybe hopefully
Diffstat (limited to 'imgmanager.cpp')
-rw-r--r--imgmanager.cpp52
1 files changed, 38 insertions, 14 deletions
diff --git a/imgmanager.cpp b/imgmanager.cpp
index 2e582c3..bbfd50f 100644
--- a/imgmanager.cpp
+++ b/imgmanager.cpp
@@ -1,44 +1,68 @@
#include "imgmanager.hpp"
+#include "util.hpp"
+
+ImageManager::ImageManager() {
+ m_cb_dispatcher.connect(sigc::mem_fun(*this, &ImageManager::RunCallbacks));
+}
Cache &ImageManager::GetCache() {
return m_cache;
}
-void ImageManager::LoadFromURL(std::string url, std::function<void(Glib::RefPtr<Gdk::Pixbuf>)> cb) {
- /*if (m_pixs.find(url) != m_pixs.end()) {
- cb(m_pixs.at(url));
- return;
- }*/
+Glib::RefPtr<Gdk::Pixbuf> ImageManager::ReadFileToPixbuf(std::string path) {
+ const auto &data = ReadWholeFile(path);
+ if (data.size() == 0) return Glib::RefPtr<Gdk::Pixbuf>(nullptr);
+ auto loader = Gdk::PixbufLoader::create();
+ loader->signal_size_prepared().connect([&loader](int w, int h) {
+ int cw, ch;
+ GetImageDimensions(w, h, cw, ch); // what could go wrong
+ loader->set_size(cw, ch);
+ });
+ loader->write(static_cast<const guint8 *>(data.data()), data.size());
+ loader->close();
+ auto buf = loader->get_pixbuf();
+ return buf;
+}
+
+void ImageManager::LoadFromURL(std::string url, callback_type cb) {
m_cache.GetFileFromURL(url, [this, url, cb](std::string path) {
try {
- auto buf = Gdk::Pixbuf::create_from_file(path);
- //m_pixs[url] = buf;
- cb(buf);
+ auto buf = ReadFileToPixbuf(path);
+ m_cb_mutex.lock();
+ m_cb_queue.push(std::make_pair(buf, cb));
+ m_cb_dispatcher.emit();
+ m_cb_mutex.unlock();
} catch (std::exception &e) {
fprintf(stderr, "err loading pixbuf from %s: %s\n", path.c_str(), e.what());
}
});
}
+void ImageManager::RunCallbacks() {
+ m_cb_mutex.lock();
+ const auto &pair = m_cb_queue.front();
+ pair.second(pair.first);
+ m_cb_queue.pop();
+ m_cb_mutex.unlock();
+}
+
Glib::RefPtr<Gdk::Pixbuf> ImageManager::GetFromURLIfCached(std::string url) {
std::string path = m_cache.GetPathIfCached(url);
if (path != "")
- return Gdk::Pixbuf::create_from_file(path);
- //if (m_pixs.find(url) != m_pixs.end())
- // return m_pixs.at(url);
+ return ReadFileToPixbuf(path);
return Glib::RefPtr<Gdk::Pixbuf>(nullptr);
}
Glib::RefPtr<Gdk::Pixbuf> ImageManager::GetPlaceholder(int size) {
std::string name = "/placeholder" + std::to_string(size);
- //if (m_pixs.find(name) != m_pixs.end())
- // return m_pixs.at(name);
+ if (m_pixs.find(name) != m_pixs.end())
+ return m_pixs.at(name);
try {
auto buf = Gdk::Pixbuf::create_from_file("res/decamarks.png", size, size);
- // m_pixs[name] = buf;
+ m_pixs[name] = buf;
return buf;
} catch (std::exception &e) {
fprintf(stderr, "error loading placeholder\n");