]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsLoader.cpp
Work around crash on command line export
[lyx.git] / src / graphics / GraphicsLoader.cpp
index d37be92e6581615a724544ebb645c749890226f7..498394e421f09a9a7bb9aec16f45945d4270d8e9 100644 (file)
@@ -71,12 +71,13 @@ 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;
 
+
+// FIXME THREAD
 LoaderQueue & LoaderQueue::get()
 {
        static LoaderQueue singleton;
@@ -89,18 +90,17 @@ 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();
-       }
 }
 
 
@@ -191,6 +191,15 @@ public:
        /// The connection of the signal StatusChanged  
        boost::signals::connection sc_;
 
+       double displayPixelRatio() const
+       {
+               return params_.pixel_ratio;
+       }
+       void setDisplayPixelRatio(double scale)
+       {
+               params_.pixel_ratio = scale;
+       }
+
 private:
        ///
        void statusChanged();
@@ -273,7 +282,7 @@ 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();
 }
@@ -287,7 +296,7 @@ void Loader::reload() const
 
 void Loader::startMonitoring() const
 {
-       if (!pimpl_->cached_item_.get())
+       if (!pimpl_->cached_item_)
                return;
 
        pimpl_->cached_item_->startMonitoring();
@@ -296,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();
@@ -305,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();
@@ -315,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;
 }
 
@@ -326,6 +335,18 @@ ImageStatus Loader::status() const
 }
 
 
+double Loader::displayPixelRatio() const
+{
+       return pimpl_->displayPixelRatio();
+}
+
+
+void Loader::setDisplayPixelRatio(double scale)
+{
+       pimpl_->setDisplayPixelRatio(scale);
+}
+
+
 boost::signals::connection Loader::connect(slot_type const & slot) const
 {
        return pimpl_->signal_.connect(slot);
@@ -352,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)
@@ -371,14 +392,14 @@ void Loader::Impl::resetFile(FileName const & file)
                if (status_ != Converting) {
                        Cache::get().remove(old_file);
                } else {
-                       //TODO remove cache item when it is not busy any more
+                       //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();
@@ -402,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_();
 }
@@ -420,7 +441,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 +454,20 @@ 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;
+                       } else if (cached_item_->filename().extension() == "svgz") {
+                               params_.pixel_ratio = 4.0;
+                       } else if (cached_item_->filename().extension() == "svg") {
+                               params_.pixel_ratio = 4.0;
+                       }
+               }
+       }
+
        bool const success = image_->setPixmap(params_);
 
        if (success) {