X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FGraphicsLoader.cpp;h=36a6c06d2c12748f2f834612d756c313e984b55d;hb=a700d657b3b06541b10ddae8cc5847bd46d06aae;hp=8a3d7bb5394c2a5e47a5e1350d35d47f918f1a05;hpb=2bf1c09376de37a3d66b79ca5f4304f29d5b4d06;p=lyx.git diff --git a/src/graphics/GraphicsLoader.cpp b/src/graphics/GraphicsLoader.cpp index 8a3d7bb539..36a6c06d2c 100644 --- a/src/graphics/GraphicsLoader.cpp +++ b/src/graphics/GraphicsLoader.cpp @@ -20,10 +20,11 @@ #include "support/debug.h" #include "support/Timeout.h" -#include +#include "support/bind.h" -#include #include +#include +#include using namespace std; using namespace lyx::support; @@ -71,11 +72,11 @@ private: }; -//static int s_numimages_ = 5; -//static int s_millisecs_ = 500; -static int s_numimages_ = 10; -static int s_millisecs_ = 500; +//static int const s_numimages_ = 5; +static int const s_numimages_ = 10; +static int const s_millisecs_ = 500; + LoaderQueue & LoaderQueue::get() { @@ -89,25 +90,24 @@ void LoaderQueue::loadNext() LYXERR(Debug::GRAPHICS, "LoaderQueue: " << cache_queue_.size() << " items in the queue"); int counter = s_numimages_; - while (cache_queue_.size() && counter--) { + while (!cache_queue_.empty() && counter--) { Cache::ItemPtr ptr = cache_queue_.front(); cache_set_.erase(ptr); cache_queue_.pop_front(); if (ptr->status() == WaitingToLoad) ptr->startLoading(); } - if (cache_queue_.size()) { + if (!cache_queue_.empty()) startLoader(); - } else { + else stopLoader(); - } } LoaderQueue::LoaderQueue() : timer(s_millisecs_, Timeout::ONETIME), running_(false) { - timer.timeout.connect(boost::bind(&LoaderQueue::loadNext, this)); + timer.timeout.connect(bind(&LoaderQueue::loadNext, this)); } @@ -159,9 +159,9 @@ void LoaderQueue::touch(Cache::ItemPtr const & item) // ///////////////////////////////////////////////////////////////////// -typedef boost::shared_ptr ImagePtr; +typedef std::shared_ptr ImagePtr; -class Loader::Impl : public boost::signals::trackable { +class Loader::Impl : public boost::signals2::trackable { public: /// Impl(); @@ -187,9 +187,18 @@ public: /// We modify a local copy of the image once it is loaded. ImagePtr image_; /// This signal is emitted when the image loading status changes. - boost::signal signal_; + boost::signals2::signal signal_; /// The connection of the signal StatusChanged - boost::signals::connection sc_; + boost::signals2::connection sc_; + + double displayPixelRatio() const + { + return params_.pixel_ratio; + } + void setDisplayPixelRatio(double scale) + { + params_.pixel_ratio = scale; + } private: /// @@ -207,10 +216,10 @@ Loader::Loader() {} -Loader::Loader(FileName const & file, DisplayType type) +Loader::Loader(FileName const & file, bool display) : pimpl_(new Impl) { - reset(file, type); + reset(file, display); } @@ -245,10 +254,10 @@ Loader & Loader::operator=(Loader const & other) } -void Loader::reset(FileName const & file, DisplayType type) const +void Loader::reset(FileName const & file, bool display) const { Params params; - params.display = type; + params.display = display; pimpl_->resetParams(params); pimpl_->resetFile(file); @@ -273,15 +282,21 @@ void Loader::reset(Params const & params) const void Loader::startLoading() const { - if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_.get()) + if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_) return; pimpl_->startLoading(); } +void Loader::reload() const +{ + pimpl_->cached_item_->startLoading(); +} + + void Loader::startMonitoring() const { - if (!pimpl_->cached_item_.get()) + if (!pimpl_->cached_item_) return; pimpl_->cached_item_->startMonitoring(); @@ -290,7 +305,7 @@ void Loader::startMonitoring() const bool Loader::monitoring() const { - if (!pimpl_->cached_item_.get()) + if (!pimpl_->cached_item_) return false; return pimpl_->cached_item_->monitoring(); @@ -299,7 +314,7 @@ bool Loader::monitoring() const unsigned long Loader::checksum() const { - if (!pimpl_->cached_item_.get()) + if (!pimpl_->cached_item_) return 0; return pimpl_->cached_item_->checksum(); @@ -309,7 +324,7 @@ unsigned long Loader::checksum() const FileName const & Loader::filename() const { static FileName const empty; - return pimpl_->cached_item_.get() ? + return pimpl_->cached_item_ ? pimpl_->cached_item_->filename() : empty; } @@ -320,7 +335,19 @@ ImageStatus Loader::status() const } -boost::signals::connection Loader::connect(slot_type const & slot) const +double Loader::displayPixelRatio() const +{ + return pimpl_->displayPixelRatio(); +} + + +void Loader::setDisplayPixelRatio(double scale) +{ + pimpl_->setDisplayPixelRatio(scale); +} + + +boost::signals2::connection Loader::connect(slot_type const & slot) const { return pimpl_->signal_.connect(slot); } @@ -346,7 +373,7 @@ Loader::Impl::~Impl() void Loader::Impl::resetFile(FileName const & file) { - FileName const old_file = cached_item_.get() ? + FileName const old_file = cached_item_ ? cached_item_->filename() : FileName(); if (file == old_file) @@ -362,13 +389,17 @@ void Loader::Impl::resetFile(FileName const & file) // signal needs to be disconnected. sc_.disconnect(); cached_item_.reset(); - Cache::get().remove(old_file); + if (status_ != Converting) { + Cache::get().remove(old_file); + } else { + //TODO remove cache item when it is not busy any more, see #7163 + } } - status_ = cached_item_.get() ? cached_item_->status() : WaitingToLoad; + status_ = cached_item_ ? cached_item_->status() : WaitingToLoad; image_.reset(); - if (cached_item_.get() || file.empty()) + if (cached_item_ || file.empty()) return; Cache & gc = Cache::get(); @@ -382,7 +413,7 @@ void Loader::Impl::resetFile(FileName const & file) if (continue_monitoring && !cached_item_->monitoring()) cached_item_->startMonitoring(); - sc_ = cached_item_->connect(boost::bind(&Impl::statusChanged, this)); + sc_ = cached_item_->connect(bind(&Impl::statusChanged, this)); } @@ -392,14 +423,14 @@ void Loader::Impl::resetParams(Params const & params) return; params_ = params; - status_ = cached_item_.get() ? cached_item_->status() : WaitingToLoad; + status_ = cached_item_ ? cached_item_->status() : WaitingToLoad; image_.reset(); } void Loader::Impl::statusChanged() { - status_ = cached_item_.get() ? cached_item_->status() : WaitingToLoad; + status_ = cached_item_ ? cached_item_->status() : WaitingToLoad; createPixmap(); signal_(); } @@ -407,16 +438,31 @@ void Loader::Impl::statusChanged() void Loader::Impl::createPixmap() { - if (!cached_item_.get() || - params_.display == NoDisplay || status_ != Loaded) + if (!params_.display || status_ != Loaded) + return; + + if (!cached_item_) { + LYXERR(Debug::GRAPHICS, "pixmap not cached yet"); return; + } + + if (!cached_item_->image()) { + // There must have been a problem reading the file. + LYXERR(Debug::GRAPHICS, "Graphics file not loaded."); + return; + } image_.reset(cached_item_->image()->clone()); - // These do nothing if there's nothing to do - image_->clip(params_); - image_->rotate(params_); - image_->scale(params_); + if (params_.pixel_ratio == 1.0) { + string filename = cached_item_->filename().absFileName(); + size_t idx = filename.find_last_of('.'); + if (idx != string::npos && idx > 3) { + if (filename.substr(idx - 3, 3) == "@2x") { + params_.pixel_ratio = 2.0; + } + } + } bool const success = image_->setPixmap(params_); @@ -433,6 +479,12 @@ void Loader::Impl::startLoading() if (status_ != WaitingToLoad) return; + if (cached_item_->tryDisplayFormat()) { + status_ = Loaded; + createPixmap(); + return; + } + LoaderQueue::get().touch(cached_item_); }