]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsLoader.cpp
Remove obsolete (and false) comment.
[lyx.git] / src / graphics / GraphicsLoader.cpp
index 9f873baf3db09e56c4fccd14b28e2c06b264d015..c38761c85b7d8b95a693b3e95e205c8d17990369 100644 (file)
 #include "GraphicsCache.h"
 
 #include "support/debug.h"
+#include "support/lassert.h"
 #include "support/Timeout.h"
 
 #include "support/bind.h"
 
-#include <set>
 #include <queue>
+#include <memory>
+#include <set>
 
 using namespace std;
 using namespace lyx::support;
 
 namespace lyx {
+
 namespace graphics {
 
 
@@ -71,11 +74,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()
 {
@@ -104,16 +107,17 @@ void LoaderQueue::loadNext()
 
 
 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();
 }
@@ -158,12 +162,13 @@ void LoaderQueue::touch(Cache::ItemPtr const & item)
 //
 /////////////////////////////////////////////////////////////////////
 
-typedef shared_ptr<Image> ImagePtr;
+typedef std::shared_ptr<Image> ImagePtr;
 
-class Loader::Impl : public boost::signals::trackable {
+class Loader::Impl {
+       friend class Loader;
 public:
        ///
-       Impl();
+       Impl(FileName const & doc_file);
        ///
        ~Impl();
        ///
@@ -177,6 +182,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
@@ -186,9 +193,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<void()> signal_;
-       /// The connection of the signal StatusChanged  
-       boost::signals::connection sc_;
+       signals2::signal<void()> signal_;
+       /// The connection of the signal statusChanged
+       signals2::scoped_connection connection_;
+
+       double displayPixelRatio() const
+       {
+               return params_.pixel_ratio;
+       }
+       void setDisplayPixelRatio(double scale)
+       {
+               params_.pixel_ratio = scale;
+       }
 
 private:
        ///
@@ -201,27 +217,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);
@@ -236,7 +260,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);
        }
@@ -272,13 +299,14 @@ void Loader::reset(Params const & params) const
 
 void Loader::startLoading() const
 {
-       if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_)
+       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();
 }
@@ -302,12 +330,12 @@ bool Loader::monitoring() const
 }
 
 
-unsigned long Loader::checksum() const
+void Loader::checkModifiedAsync() const
 {
        if (!pimpl_->cached_item_)
-               return 0;
+               return;
 
-       return pimpl_->cached_item_->checksum();
+       pimpl_->cached_item_->checkModifiedAsync();
 }
 
 
@@ -325,7 +353,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);
+}
+
+
+signals2::connection Loader::connect(slot const & slot) const
 {
        return pimpl_->signal_.connect(slot);
 }
@@ -337,8 +377,8 @@ Image const * Loader::image() const
 }
 
 
-Loader::Impl::Impl()
-       : status_(WaitingToLoad)
+Loader::Impl::Impl(FileName const & doc_file)
+       : doc_file_(doc_file), status_(WaitingToLoad)
 {
 }
 
@@ -365,7 +405,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);
@@ -382,7 +427,7 @@ void Loader::Impl::resetFile(FileName const & file)
 
        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);
@@ -391,7 +436,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(); });
 }
 
 
@@ -432,6 +478,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) {