X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FGraphicsLoader.cpp;h=b375c0ec38534e9fd9acd73c24b1e0fb6b2f6ef6;hb=4f0981e7bbbb8d9d00490856daa3d35e170845d7;hp=36f2839446bbd12f5e0e4cc4b9cf9860f217e438;hpb=a756403301ff8fb78df4dc1e131e4cd50cd976e1;p=lyx.git diff --git a/src/graphics/GraphicsLoader.cpp b/src/graphics/GraphicsLoader.cpp index 36f2839446..b375c0ec38 100644 --- a/src/graphics/GraphicsLoader.cpp +++ b/src/graphics/GraphicsLoader.cpp @@ -18,17 +18,19 @@ #include "GraphicsCache.h" #include "support/debug.h" +#include "support/lassert.h" #include "support/Timeout.h" -#include "support/bind.h" - -#include +#include #include +#include +#include using namespace std; using namespace lyx::support; namespace lyx { + namespace graphics { @@ -71,11 +73,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,32 +91,32 @@ 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_.empty()) { + if (!cache_queue_.empty()) startLoader(); - } else { + else stopLoader(); - } } LoaderQueue::LoaderQueue() : timer(s_millisecs_, Timeout::ONETIME), - running_(false) + running_(false) { - timer.timeout.connect(bind(&LoaderQueue::loadNext, this)); + // Disconnected when this is destroyed + timer.timeout.connect([this](){ loadNext(); }); } void LoaderQueue::startLoader() { LYXERR(Debug::GRAPHICS, "LoaderQueue: waking up"); - running_ = true ; + running_ = true; timer.setTimeout(s_millisecs_); timer.start(); } @@ -159,12 +161,13 @@ void LoaderQueue::touch(Cache::ItemPtr const & item) // ///////////////////////////////////////////////////////////////////// -typedef shared_ptr ImagePtr; +typedef std::shared_ptr ImagePtr; -class Loader::Impl : public boost::signals::trackable { +class Loader::Impl { + friend class Loader; public: /// - Impl(); + Impl(FileName const & doc_file); /// ~Impl(); /// @@ -178,6 +181,8 @@ public: /// Params const & params() const { return params_; } + /// + FileName doc_file_; /// The loading status of the image. ImageStatus status_; /** Must store a copy of the cached item to ensure that it is not @@ -187,9 +192,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_; - /// The connection of the signal StatusChanged - boost::signals::connection sc_; + signal signal_; + /// The connection of the signal statusChanged + scoped_connection connection_; + + double displayPixelRatio() const + { + return params_.pixel_ratio; + } + void setDisplayPixelRatio(double scale) + { + params_.pixel_ratio = scale; + } private: /// @@ -202,27 +216,35 @@ private: }; -Loader::Loader() - : pimpl_(new Impl) +Loader::Loader(FileName const & doc_file) + : pimpl_(new Impl(doc_file)) {} -Loader::Loader(FileName const & file, bool display) - : pimpl_(new Impl) +Loader::Loader(FileName const & doc_file, FileName const & file, bool display) + : pimpl_(new Impl(doc_file)) { reset(file, display); } -Loader::Loader(FileName const & file, Params const & params) - : pimpl_(new Impl) +Loader::Loader(FileName const & doc_file, FileName const & file, Params const & params) + : pimpl_(new Impl(doc_file)) { reset(file, params); } +Loader::Loader(FileName const & doc_file, Loader const & other) + : pimpl_(new Impl(doc_file)) +{ + Params const & params = other.pimpl_->params(); + reset(params.filename, params); +} + + Loader::Loader(Loader const & other) - : pimpl_(new Impl) + : pimpl_(new Impl(other.pimpl_->doc_file_)) { Params const & params = other.pimpl_->params(); reset(params.filename, params); @@ -237,7 +259,10 @@ Loader::~Loader() Loader & Loader::operator=(Loader const & other) { + LASSERT(false, /**/); if (this != &other) { + delete pimpl_; + pimpl_ = new Impl(other.pimpl_->doc_file_); Params const & params = other.pimpl_->params(); reset(params.filename, params); } @@ -273,13 +298,14 @@ 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_ + || pimpl_->cached_item_->status() == Converting) return; pimpl_->startLoading(); } -void Loader::reload() const +void Loader::reload() const { pimpl_->cached_item_->startLoading(); } @@ -287,7 +313,7 @@ void Loader::reload() const void Loader::startMonitoring() const { - if (!pimpl_->cached_item_.get()) + if (!pimpl_->cached_item_) return; pimpl_->cached_item_->startMonitoring(); @@ -296,26 +322,26 @@ void Loader::startMonitoring() const bool Loader::monitoring() const { - if (!pimpl_->cached_item_.get()) + if (!pimpl_->cached_item_) return false; return pimpl_->cached_item_->monitoring(); } -unsigned long Loader::checksum() const +void Loader::checkModifiedAsync() const { - if (!pimpl_->cached_item_.get()) - return 0; + if (!pimpl_->cached_item_) + return; - return pimpl_->cached_item_->checksum(); + pimpl_->cached_item_->checkModifiedAsync(); } FileName const & Loader::filename() const { static FileName const empty; - return pimpl_->cached_item_.get() ? + return pimpl_->cached_item_ ? pimpl_->cached_item_->filename() : empty; } @@ -326,7 +352,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); +} + + +connection Loader::connect(slot const & slot) const { return pimpl_->signal_.connect(slot); } @@ -338,8 +376,8 @@ Image const * Loader::image() const } -Loader::Impl::Impl() - : status_(WaitingToLoad) +Loader::Impl::Impl(FileName const & doc_file) + : doc_file_(doc_file), status_(WaitingToLoad) { } @@ -352,7 +390,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) @@ -366,7 +404,12 @@ void Loader::Impl::resetFile(FileName const & file) continue_monitoring = cached_item_->monitoring(); // cached_item_ is going to be reset, so the connected // signal needs to be disconnected. - sc_.disconnect(); + try { + // This can in theory throw a BufferException + connection_.disconnect(); + } catch (...) { + LYXERR(Debug::GRAPHICS, "Unable to disconnect signal."); + } cached_item_.reset(); if (status_ != Converting) { Cache::get().remove(old_file); @@ -375,15 +418,15 @@ void Loader::Impl::resetFile(FileName const & file) } } - 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(); if (!gc.inCache(file)) - gc.add(file); + gc.add(file, doc_file_); // We /must/ make a local copy of this. cached_item_ = gc.item(file); @@ -392,7 +435,8 @@ void Loader::Impl::resetFile(FileName const & file) if (continue_monitoring && !cached_item_->monitoring()) cached_item_->startMonitoring(); - sc_ = cached_item_->connect(bind(&Impl::statusChanged, this)); + // This is a scoped connection + connection_ = cached_item_->connect([this](){ statusChanged(); }); } @@ -402,14 +446,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_(); } @@ -420,7 +464,7 @@ void Loader::Impl::createPixmap() if (!params_.display || status_ != Loaded) return; - if (!cached_item_.get()) { + if (!cached_item_) { LYXERR(Debug::GRAPHICS, "pixmap not cached yet"); return; } @@ -433,6 +477,16 @@ void Loader::Impl::createPixmap() image_.reset(cached_item_->image()->clone()); + 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_); if (success) {