]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/PreviewLoader.cpp
Update previews after doing a find/replace (#7242)
[lyx.git] / src / graphics / PreviewLoader.cpp
index a71fcd84d3c8570b0303a74fc8bd97485fb053b7..addc6af224497a454f057f2af799c876746ed004 100644 (file)
@@ -38,6 +38,7 @@
 #include "support/lstrings.h"
 
 #include "support/bind.h"
+#include "support/TempFile.h"
 
 #include <sstream>
 #include <fstream>
@@ -59,15 +60,15 @@ typedef list<string> PendingSnippets;
 typedef vector<SnippetPair> BitmapFile;
 
 
-string const unique_filename(string const & bufferpath)
+FileName const unique_tex_filename(FileName const & bufferpath)
 {
-       static int theCounter = 0;
-       string const filename = lyx::convert<string>(theCounter++) + "lyxpreview";
-       return addName(bufferpath, filename);
+       TempFile tempfile(bufferpath, "lyxpreviewXXXXXX.tex");
+       tempfile.setAutoRemove(false);
+       return tempfile.name();
 }
 
 
-lyx::Converter const * setConverter(string const from)
+lyx::Converter const * setConverter(string const from)
 {
        typedef vector<string> FmtList;
        typedef lyx::graphics::Cache GCache;
@@ -85,6 +86,7 @@ lyx::Converter const * setConverter(string const from)
                        return ptr;
        }
 
+       // FIXME THREAD
        static bool first = true;
        if (first) {
                first = false;
@@ -216,7 +218,7 @@ private:
        /// Called by the ForkedCall process that generated the bitmap files.
        void finishedGenerating(pid_t, int);
        ///
-       void dumpPreamble(otexstream &) const;
+       void dumpPreamble(otexstream &, OutputParams::FLAVOR) const;
        ///
        void dumpData(odocstream &, BitmapFile const &) const;
 
@@ -529,25 +531,24 @@ void PreviewLoader::Impl::startLoading(bool wait)
        LYXERR(Debug::GRAPHICS, "PreviewLoader::startLoading()");
 
        // As used by the LaTeX file and by the resulting image files
-       string const directory = buffer_.temppath();
+       FileName const directory(buffer_.temppath());
 
-       string const filename_base = unique_filename(directory);
+       FileName const latexfile = unique_tex_filename(directory);
+       string const filename_base = removeExtension(latexfile.absFileName());
 
        // Create an InProgress instance to place in the map of all
        // such processes if it starts correctly.
-       InProgress inprogress(filename_base, pending_, pconverter_->to);
+       InProgress inprogress(filename_base, pending_, pconverter_->to());
 
        // clear pending_, so we're ready to start afresh.
        pending_.clear();
 
        // Output the LaTeX file.
-       FileName const latexfile(filename_base + ".tex");
-
        // we use the encoding of the buffer
        Encoding const & enc = buffer_.params().encoding();
        ofdocstream of;
        try { of.reset(enc.iconvName()); }
-       catch (iconv_codecvt_facet_exception & e) {
+       catch (iconv_codecvt_facet_exception const & e) {
                LYXERR0("Caught iconv exception: " << e.what()
                        << "\nUnable to create LaTeX file: " << latexfile);
                return;
@@ -567,9 +568,44 @@ void PreviewLoader::Impl::startLoading(bool wait)
                return;
        }
        of << "\\batchmode\n";
-       dumpPreamble(os);
+
+       LYXERR(Debug::LATEX, "Format = " << buffer_.params().getDefaultOutputFormat());
+       string latexparam = "";
+       OutputParams::FLAVOR flavor = buffer_.params().getOutputFlavor();
+       if (buffer_.params().encoding().package() == Encoding::japanese) {
+               latexparam = " --latex=platex";
+               flavor = OutputParams::LATEX;
+       }
+       else if (buffer_.params().useNonTeXFonts) {
+               if (flavor == OutputParams::LUATEX)
+                       latexparam = " --latex=lualatex";
+               else {
+                       flavor = OutputParams::XETEX;
+                       latexparam = " --latex=xelatex";
+               }
+       }
+       else {
+               switch (flavor) {
+                       case OutputParams::PDFLATEX:
+                               latexparam = " --latex=pdflatex";
+                               break;
+                       case OutputParams::XETEX:
+                               latexparam = " --latex=xelatex";
+                               break;
+                       case OutputParams::LUATEX:
+                               latexparam = " --latex=lualatex";
+                               break;
+                       case OutputParams::DVILUATEX:
+                               latexparam = " --latex=dvilualatex";
+                               break;
+                       default:
+                               flavor = OutputParams::LATEX;
+               }
+       }
+       dumpPreamble(os, flavor);
        // handle inputenc etc.
-       buffer_.params().writeEncodingPreamble(os, features);
+       // I think, this is already hadled by dumpPreamble(): Kornel
+       // buffer_.params().writeEncodingPreamble(os, features);
        of << "\n\\begin{document}\n";
        dumpData(of, inprogress.snippets);
        of << "\n\\end{document}\n";
@@ -580,28 +616,24 @@ void PreviewLoader::Impl::startLoading(bool wait)
                return;
        }
 
-       double const font_scaling_factor = 
-               buffer_.isExporting() ? 75.0 * buffer_.params().html_math_img_scale 
-                       : 0.01 * lyxrc.dpi * lyxrc.zoom * lyxrc.preview_scale_factor;
+       double const font_scaling_factor = buffer_.fontScalingFactor();
 
-       // FIXME XHTML 
-       // The colors should be customizable.
-       ColorCode const bg = buffer_.isExporting() 
-                      ? Color_white : PreviewLoader::backgroundColor();
-       ColorCode const fg = buffer_.isExporting() 
-                      ? Color_black : PreviewLoader::foregroundColor();
        // The conversion command.
        ostringstream cs;
-       cs << pconverter_->command
+       cs << pconverter_->command()
           << " " << quoteName(latexfile.toFilesystemEncoding())
-          << " --dpi " << int(font_scaling_factor)
-          << " --fg " << theApp()->hexName(fg)
-          << " --bg " << theApp()->hexName(bg);
-       // FIXME what about LuaTeX?
-       if (buffer_.params().useNonTeXFonts)
-               cs << " --latex=xelatex";
-       if (buffer_.params().encoding().package() == Encoding::japanese)
-               cs << " --latex=platex";
+          << " --dpi " << int(font_scaling_factor);
+
+       // 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) 
+                  << " --bg " << theApp()->hexName(bg);
+       }
+
+       cs << latexparam;
        if (buffer_.params().bibtex_command != "default")
                cs << " --bibtex=" << quoteName(buffer_.params().bibtex_command);
        else if (buffer_.params().encoding().package() == Encoding::japanese)
@@ -611,11 +643,12 @@ void PreviewLoader::Impl::startLoading(bool wait)
        if (buffer_.params().bufferFormat() == "lilypond-book")
                cs << " --lilypond";
 
-       string const command = libScriptSearch(cs.str());
+       string const command = cs.str();
 
        if (wait) {
                ForkedCall call(buffer_.filePath());
                int ret = call.startScript(ForkedProcess::Wait, command);
+               // FIXME THREAD
                static int fake = (2^20) + 1;
                int pid = fake++;
                inprogress.pid = pid;
@@ -646,6 +679,11 @@ void PreviewLoader::Impl::startLoading(bool wait)
 }
 
 
+double PreviewLoader::displayPixelRatio() const
+{
+       return buffer().params().display_pixel_ratio;
+}
+
 void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
 {
        // Paranoia check!
@@ -705,18 +743,17 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
 }
 
 
-void PreviewLoader::Impl::dumpPreamble(otexstream & os) const
+void PreviewLoader::Impl::dumpPreamble(otexstream & os, OutputParams::FLAVOR flavor) const
 {
        // Dump the preamble only.
+       LYXERR(Debug::LATEX, "dumpPreamble, flavor == " << flavor);
        OutputParams runparams(&buffer_.params().encoding());
-       if (buffer_.params().useNonTeXFonts)
-               runparams.flavor = OutputParams::XETEX;
-       else
-               runparams.flavor = OutputParams::LATEX;
+       runparams.flavor = flavor;
        runparams.nice = true;
        runparams.moving_arg = true;
        runparams.free_spacing = true;
-       buffer_.writeLaTeXSource(os, runparams, true, false);
+       runparams.is_child = buffer_.parent();
+       buffer_.writeLaTeXSource(os, buffer_.filePath(), runparams, Buffer::OnlyPreamble);
 
        // FIXME! This is a HACK! The proper fix is to control the 'true'
        // passed to WriteStream below:
@@ -741,26 +778,7 @@ void PreviewLoader::Impl::dumpPreamble(otexstream & os) const
        // Also support PDF output (automatically generated e.g. when
        // \usepackage[pdftex]{hyperref} is used and XeTeX.
        os << "\n"
-          << "\\newif\\ifxetex\n"
-          << "\\expandafter\\ifx\\csname XeTeXrevision\\endcsname\\relax\n"
-          << "   \\xetexfalse\n"
-          << "\\else\n"
-          << "    \\xetextrue\n"
-          << "\\fi\n"
-          << "\\newif\\ifpdf\n"
-          << "\\ifx\\pdfoutput\\undefined\n"
-          << "\\else\\ifx\\pdfoutput\\relax\n"
-          << "\\else\\ifnum0=\\pdfoutput\n"
-          << "\\else\\pdftrue\\fi\\fi\\fi\n"
-          << "\\ifxetex\n"
-          << "  \\usepackage[active,delayed,tightpage,showlabels,lyx,xetex]{preview}\n"
-          << "\\else\n"
-          << "\\ifpdf\n"
-          << "  \\usepackage[active,delayed,tightpage,showlabels,lyx,pdftex]{preview}\n"
-          << "\\else\n"
-          << "  \\usepackage[active,delayed,showlabels,lyx,dvips]{preview}\n"
-          << "\\fi\n"
-          << "\\fi\n"
+          << "\\usepackage[active,delayed,showlabels,lyx]{preview}\n"
           << "\n";
 }