diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-03 18:49:22 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-03 18:49:22 -0400 |
commit | bbe36a8246041544d6ebe420dfa1b695b6c74521 (patch) | |
tree | aa2c607b812c04afd2ef4a240489e7c8adec7c3b /imgmanager.cpp | |
parent | c7a958a3bb241b28c766faa3db6f4ff1876bd065 (diff) | |
download | abaddon-portaudio-bbe36a8246041544d6ebe420dfa1b695b6c74521.tar.gz abaddon-portaudio-bbe36a8246041544d6ebe420dfa1b695b6c74521.zip |
maybe slightly better image loading maybe hopefully
Diffstat (limited to 'imgmanager.cpp')
-rw-r--r-- | imgmanager.cpp | 52 |
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"); |