summaryrefslogtreecommitdiff
path: root/imgmanager.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-12-21 19:08:44 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2020-12-21 19:08:44 -0500
commitd8ff05ddf898dfcd6fa0e3398cc38abcab07e2fe (patch)
tree667eb93e54d0698b62f098e911a24e70fb0448be /imgmanager.cpp
parent486d184c8306d3e8a4889a5b079cd9b3003896c2 (diff)
downloadabaddon-portaudio-d8ff05ddf898dfcd6fa0e3398cc38abcab07e2fe.tar.gz
abaddon-portaudio-d8ff05ddf898dfcd6fa0e3398cc38abcab07e2fe.zip
support animated guild icon
Diffstat (limited to 'imgmanager.cpp')
-rw-r--r--imgmanager.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/imgmanager.cpp b/imgmanager.cpp
index 218c9ca..c1c67fd 100644
--- a/imgmanager.cpp
+++ b/imgmanager.cpp
@@ -20,9 +20,19 @@ Glib::RefPtr<Gdk::Pixbuf> ImageManager::ReadFileToPixbuf(std::string path) {
});
loader->write(static_cast<const guint8 *>(data.data()), data.size());
loader->close();
- auto buf = loader->get_pixbuf();
+ return loader->get_pixbuf();
+}
- return buf;
+Glib::RefPtr<Gdk::PixbufAnimation> ImageManager::ReadFileToPixbufAnimation(std::string path, int w, int h) {
+ const auto &data = ReadWholeFile(path);
+ if (data.size() == 0) return Glib::RefPtr<Gdk::PixbufAnimation>(nullptr);
+ auto loader = Gdk::PixbufLoader::create();
+ loader->signal_size_prepared().connect([&loader, w, h](int, int) {
+ loader->set_size(w, h);
+ });
+ loader->write(static_cast<const guint8 *>(data.data()), data.size());
+ loader->close();
+ return loader->get_animation();
}
void ImageManager::LoadFromURL(std::string url, callback_type cb) {
@@ -35,12 +45,28 @@ void ImageManager::LoadFromURL(std::string url, callback_type cb) {
m_cb_queue.push([signal, buf]() { signal.emit(buf); });
m_cb_dispatcher.emit();
m_cb_mutex.unlock();
- } catch (std::exception &e) {
+ } catch (const std::exception &e) {
fprintf(stderr, "err loading pixbuf from %s: %s\n", path.c_str(), e.what());
}
});
}
+void ImageManager::LoadAnimationFromURL(std::string url, int w, int h, callback_anim_type cb) {
+ sigc::signal<void(Glib::RefPtr<Gdk::PixbufAnimation>)> signal;
+ signal.connect(cb);
+ m_cache.GetFileFromURL(url, [this, url, signal, w, h](std::string path) {
+ try {
+ auto buf = ReadFileToPixbufAnimation(path, w, h);
+ m_cb_mutex.lock();
+ m_cb_queue.push([signal, buf]() { signal.emit(buf); });
+ m_cb_dispatcher.emit();
+ m_cb_mutex.unlock();
+ } catch (const std::exception &e) {
+ fprintf(stderr, "err loading pixbuf animation from %s: %s\n", path.c_str(), e.what());
+ }
+ });
+}
+
void ImageManager::Prefetch(std::string url) {
m_cache.GetFileFromURL(url, [](const auto &) {});
}
@@ -60,6 +86,14 @@ Glib::RefPtr<Gdk::Pixbuf> ImageManager::GetFromURLIfCached(std::string url) {
return Glib::RefPtr<Gdk::Pixbuf>(nullptr);
}
+Glib::RefPtr<Gdk::PixbufAnimation> ImageManager::GetAnimationFromURLIfCached(std::string url, int w, int h) {
+ std::string path = m_cache.GetPathIfCached(url);
+ if (path != "")
+ return ReadFileToPixbufAnimation(path, w, h);
+
+ return Glib::RefPtr<Gdk::PixbufAnimation>(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())