X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FGraphicsCacheItem.cpp;h=4939874ab3b8512f9d6282a5595e17fe0b0628af;hb=f887efedf11c198d9b6cc19911fa0a32a93496f3;hp=e0cf41209554db4323e067f65994a02e6bfb541c;hpb=d6ee64599cc0a46d3d2d1345e0bf17135e96adba;p=lyx.git diff --git a/src/graphics/GraphicsCacheItem.cpp b/src/graphics/GraphicsCacheItem.cpp index e0cf412095..4939874ab3 100644 --- a/src/graphics/GraphicsCacheItem.cpp +++ b/src/graphics/GraphicsCacheItem.cpp @@ -4,7 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Baruch Even - * \author Herbert Voß + * \author Herbert Voß * \author Angus Leeming * * Full author contact details are available in file CREDITS. @@ -25,8 +25,9 @@ #include "support/FileName.h" #include "support/filetools.h" #include "support/FileMonitor.h" +#include "support/lassert.h" -#include +#include "support/bind.h" using namespace std; using namespace lyx::support; @@ -44,7 +45,7 @@ public: /** * If no file conversion is needed, then tryDisplayFormat() calls * loadImage() directly. - * \return true if a conversion is necessary. + * \return true if a conversion is necessary and no error occurred. */ bool tryDisplayFormat(FileName & filename, string & from); @@ -107,7 +108,7 @@ public: bool remove_loaded_file_; /// The image and its loading status. - boost::shared_ptr image_; + shared_ptr image_; /// ImageStatus status_; @@ -145,7 +146,8 @@ bool CacheItem::tryDisplayFormat() const pimpl_->reset(); FileName filename; string from; - bool const success = pimpl_->tryDisplayFormat(filename, from); + bool const conversion_needed = pimpl_->tryDisplayFormat(filename, from); + bool const success = status() == Loaded && !conversion_needed; if (!success) pimpl_->reset(); return success; @@ -207,7 +209,7 @@ CacheItem::Impl::Impl(FileName const & file) remove_loaded_file_(false), status_(WaitingToLoad) { - monitor_.connect(boost::bind(&Impl::startLoading, this)); + monitor_.connect(bind(&Impl::startLoading, this)); } @@ -233,7 +235,7 @@ void CacheItem::Impl::reset() file_to_load_.erase(); to_.erase(); - if (image_.get()) + if (image_) image_.reset(); status_ = WaitingToLoad; @@ -291,7 +293,7 @@ bool CacheItem::Impl::loadImage() { LYXERR(Debug::GRAPHICS, "Loading image."); - image_.reset(Image::newImage()); + image_.reset(newImage()); bool success = image_->load(file_to_load_); string const text = success ? "succeeded" : "failed"; @@ -314,12 +316,12 @@ static string const findTargetFormat(string const & from) FormatList const & formats = Cache::get().loadableFormats(); // There must be a format to load from. - LASSERT(!formats.empty(), /**/); + LASSERT(!formats.empty(), return string()); // Use the standard converter if we don't know the format to load // from. if (from.empty()) - return string("png"); + return string("ppm"); // First ascertain if we can load directly with no conversion FormatList::const_iterator it = formats.begin(); @@ -339,38 +341,39 @@ static string const findTargetFormat(string const & from) << " to " << *it); } - // Failed! so we have to try to convert it to PNG format + // Failed! so we have to try to convert it to PPM format // with the standard converter - return string("png"); + return string("ppm"); } bool CacheItem::Impl::tryDisplayFormat(FileName & filename, string & from) { // First, check that the file exists! + filename_.refresh(); if (!filename_.isReadableFile()) { if (status_ != ErrorNoFile) { status_ = ErrorNoFile; LYXERR(Debug::GRAPHICS, "\tThe file is not readable"); } - return true; + return false; } - zipped_ = filename_.isZippedFile(); + zipped_ = formats.isZippedFile(filename_); if (zipped_) { unzipped_filename_ = FileName::tempName( filename_.toFilesystemEncoding()); if (unzipped_filename_.empty()) { status_ = ErrorConverting; LYXERR(Debug::GRAPHICS, "\tCould not create temporary file."); - return true; + return false; } filename = unzipFile(filename_, unzipped_filename_.toFilesystemEncoding()); } else { filename = filename_; } - docstring const displayed_filename = makeDisplayPath(filename_.absFilename()); + docstring const displayed_filename = makeDisplayPath(filename_.absFileName()); LYXERR(Debug::GRAPHICS, "[CacheItem::Impl::convertToDisplayFormat]\n" << "\tAttempting to convert image file: " << filename << "\n\twith displayed filename: " << to_utf8(displayed_filename)); @@ -388,16 +391,16 @@ bool CacheItem::Impl::tryDisplayFormat(FileName & filename, string & from) LYXERR(Debug::GRAPHICS, "\tNo conversion needed (from == to)!"); file_to_load_ = filename; status_ = loadImage() ? Loaded : ErrorLoading; - return true; + return false; } if (ConverterCache::get().inCache(filename, to_)) { LYXERR(Debug::GRAPHICS, "\tNo conversion needed (file in file cache)!"); file_to_load_ = ConverterCache::get().cacheName(filename, to_); status_ = loadImage() ? Loaded : ErrorLoading; - return true; + return false; } - return false; + return true; } @@ -408,7 +411,7 @@ void CacheItem::Impl::convertToDisplayFormat() // Make a local copy in case we unzip it FileName filename; string from; - if (tryDisplayFormat(filename, from)) { + if (!tryDisplayFormat(filename, from)) { // The image status has changed, tell it to the outside world. statusChanged(); return; @@ -422,15 +425,11 @@ void CacheItem::Impl::convertToDisplayFormat() FileName const to_file_base = FileName::tempName("CacheItem"); remove_loaded_file_ = true; - // Remove the temp file, we only want the name... - // FIXME: This is unsafe! - to_file_base.removeFile(); - // Connect a signal to this->imageConverted and pass this signal to // the graphics converter so that we can load the modified file // on completion of the conversion process. - converter_.reset(new Converter(filename, to_file_base.absFilename(), from, to_)); - converter_->connect(boost::bind(&Impl::imageConverted, this, _1)); + converter_.reset(new Converter(filename, to_file_base.absFileName(), from, to_)); + converter_->connect(bind(&Impl::imageConverted, this, _1)); converter_->startConversion(); }