X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FPreviewLoader.cpp;h=e3daaa770415d24a563f650cc3fd2819b8b3ec24;hb=110f8f67ac1afe9892dad5566d1c697044427cf0;hp=93ea6b79b652bb7d8a3d39ad560d3d26f32d3376;hpb=74f774d6cf18a897deb533d3afc697abb31f824e;p=lyx.git diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp index 93ea6b79b6..e3daaa7704 100644 --- a/src/graphics/PreviewLoader.cpp +++ b/src/graphics/PreviewLoader.cpp @@ -38,7 +38,6 @@ #include "support/ForkedCalls.h" #include "support/lstrings.h" -#include "support/bind.h" #include "support/TempFile.h" #include @@ -125,14 +124,10 @@ void setAscentFractions(vector & ascent_fractions, } -class FindFirst +std::function FindFirst(string const & comp) { -public: - FindFirst(string const & comp) : comp_(comp) {} - bool operator()(SnippetPair const & sp) const { return sp.first == comp_; } -private: - string const comp_; -}; + return [&comp](SnippetPair const & sp) { return sp.first == comp; }; +} /// Store info on a currently executing, forked process. @@ -147,28 +142,27 @@ public: /// Remove any files left lying around and kill the forked process. void stop() const; - /// - pid_t pid; /// string command; /// FileName metrics_file; /// BitmapFile snippets; + /// + pid_t pid; }; typedef map InProgressProcesses; typedef InProgressProcesses::value_type InProgressProcess; -} // namespace anon - +} // namespace namespace lyx { namespace graphics { -class PreviewLoader::Impl : public boost::signals2::trackable { +class PreviewLoader::Impl { public: /// Impl(PreviewLoader & p, Buffer const & b); @@ -189,7 +183,7 @@ public: void refreshPreviews(); /// Emit this signal when an image is ready for display. - boost::signals2::signal imageReady; + signals2::signal imageReady; Buffer const & buffer() const { return buffer_; } @@ -219,7 +213,6 @@ private: /** in_progress_ stores all forked processes so that we can proceed * thereafter. - The map uses the conversion commands as its identifiers. */ InProgressProcesses in_progress_; @@ -236,10 +229,13 @@ private: /// QTimer * delay_refresh_; /// + Trackable trackable_; + /// bool finished_generating_; /// We don't own this static lyx::Converter const * pconverter_; + }; @@ -297,7 +293,7 @@ void PreviewLoader::refreshPreviews() } -boost::signals2::connection PreviewLoader::connect(slot_type const & slot) const +signals2::connection PreviewLoader::connect(slot const & slot) const { return pimpl_->imageReady.connect(slot); } @@ -334,11 +330,10 @@ public: { ostringstream os; os << base_ << counter_++ << '.' << to_format_; - string const file = os.str(); - - return make_pair(snippet, FileName(file)); + string const file_name = os.str(); + return make_pair(snippet, FileName(file_name)); } - + private: string const & to_format_; string const & base_; @@ -349,9 +344,8 @@ private: InProgress::InProgress(string const & filename_base, PendingSnippets const & pending, string const & to_format) - : pid(0), - metrics_file(filename_base + ".metrics"), - snippets(pending.size()) + : metrics_file(filename_base + ".metrics"), + snippets(pending.size()), pid(0) { PendingSnippets::const_iterator pit = pending.begin(); PendingSnippets::const_iterator pend = pending.end(); @@ -378,7 +372,7 @@ void InProgress::stop() const } } -} // namespace anon +} // namespace namespace lyx { @@ -389,8 +383,8 @@ PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b) { font_scaling_factor_ = int(buffer_.fontScalingFactor()); if (theApp()) { - fg_color_ = strtol(theApp()->hexName(foregroundColor()).c_str(), 0, 16); - bg_color_ = strtol(theApp()->hexName(backgroundColor()).c_str(), 0, 16); + fg_color_ = convert(theApp()->hexName(foregroundColor()).c_str(), 16); + bg_color_ = convert(theApp()->hexName(backgroundColor()).c_str(), 16); } else { fg_color_ = 0x0; bg_color_ = 0xffffff; @@ -453,8 +447,8 @@ PreviewLoader::Impl::preview(string const & latex_snippet) const int fg = 0x0; int bg = 0xffffff; if (theApp()) { - fg = strtol(theApp()->hexName(foregroundColor()).c_str(), 0, 16); - bg = strtol(theApp()->hexName(backgroundColor()).c_str(), 0, 16); + fg = convert(theApp()->hexName(foregroundColor()).c_str(), 16); + bg = convert(theApp()->hexName(backgroundColor()).c_str(), 16); } if (font_scaling_factor_ != fs || fg_color_ != fg || bg_color_ != bg) { // Schedule refresh of all previews on zoom or color changes. @@ -466,9 +460,10 @@ PreviewLoader::Impl::preview(string const & latex_snippet) const } // Don't try to access the cache until we are done. if (delay_refresh_->isActive() || !finished_generating_) - return 0; + return nullptr; + Cache::const_iterator it = cache_.find(latex_snippet); - return (it == cache_.end()) ? 0 : it->second.get(); + return (it == cache_.end()) ? nullptr : it->second.get(); } @@ -491,22 +486,17 @@ void PreviewLoader::Impl::refreshPreviews() namespace { -class FindSnippet { -public: - FindSnippet(string const & s) : snippet_(s) {} - bool operator()(InProgressProcess const & process) const - { +std::function FindSnippet(string const & s) +{ + return [&s](InProgressProcess const & process) { BitmapFile const & snippets = process.second.snippets; BitmapFile::const_iterator beg = snippets.begin(); BitmapFile::const_iterator end = snippets.end(); - return find_if(beg, end, FindFirst(snippet_)) != end; - } - -private: - string const snippet_; -}; + return find_if(beg, end, FindFirst(s)) != end; + }; +} -} // namespace anon +} // namespace PreviewLoader::Status PreviewLoader::Impl::status(string const & latex_snippet) const @@ -550,25 +540,19 @@ void PreviewLoader::Impl::add(string const & latex_snippet) namespace { -class EraseSnippet { -public: - EraseSnippet(string const & s) : snippet_(s) {} - void operator()(InProgressProcess & process) - { +std::function EraseSnippet(string const & s) { + return [&s](InProgressProcess & process) { BitmapFile & snippets = process.second.snippets; BitmapFile::iterator it = snippets.begin(); BitmapFile::iterator end = snippets.end(); - it = find_if(it, end, FindFirst(snippet_)); + it = find_if(it, end, FindFirst(s)); if (it != end) snippets.erase(it, it+1); - } - -private: - string const & snippet_; + }; }; -} // namespace anon +} // namespace void PreviewLoader::Impl::remove(string const & latex_snippet) @@ -690,7 +674,7 @@ void PreviewLoader::Impl::startLoading(bool wait) } dumpPreamble(os, flavor); // handle inputenc etc. - // I think, this is already hadled by dumpPreamble(): Kornel + // I think this is already handled by dumpPreamble(): Kornel // buffer_.params().writeEncodingPreamble(os, features); of << "\n\\begin{document}\n"; dumpData(of, inprogress.snippets); @@ -708,12 +692,12 @@ void PreviewLoader::Impl::startLoading(bool wait) << " " << quoteName(latexfile.toFilesystemEncoding()) << " --dpi " << font_scaling_factor_; - // FIXME XHTML + // FIXME XHTML // The colors should be customizable. if (!buffer_.isExporting()) { ColorCode const fg = PreviewLoader::foregroundColor(); ColorCode const bg = PreviewLoader::backgroundColor(); - cs << " --fg " << theApp()->hexName(fg) + cs << " --fg " << theApp()->hexName(fg) << " --bg " << theApp()->hexName(bg); } @@ -727,7 +711,8 @@ void PreviewLoader::Impl::startLoading(bool wait) if (wait) { ForkedCall call(buffer_.filePath(), buffer_.layoutPos()); int ret = call.startScript(ForkedProcess::Wait, command); - static atomic_int fake((2^20) + 1); + // PID_MAX_LIMIT is 2^22 so we start one after that + static atomic_int fake((1 << 22) + 1); int pid = fake++; inprogress.pid = pid; inprogress.command = command; @@ -737,9 +722,10 @@ void PreviewLoader::Impl::startLoading(bool wait) } // Initiate the conversion from LaTeX to bitmap images files. - ForkedCall::SignalTypePtr - convert_ptr(new ForkedCall::SignalType); - convert_ptr->connect(bind(&Impl::finishedGenerating, this, _1, _2)); + ForkedCall::sigPtr convert_ptr = make_shared(); + convert_ptr->connect(ForkedProcess::slot([this](pid_t pid, int retval){ + finishedGenerating(pid, retval); + }).track_foreign(trackable_.p())); ForkedCall call(buffer_.filePath()); int ret = call.startScript(command, convert_ptr); @@ -795,7 +781,7 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval) list newimages; - int metrics_counter = 0; + size_t metrics_counter = 0; for (; it != end; ++it, ++metrics_counter) { string const & snip = it->first; FileName const & file = it->second;