]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/PreviewLoader.cpp
Fix comparing a pointer with a char
[lyx.git] / src / graphics / PreviewLoader.cpp
index 1981a420dd77bafabd19bc9cf5ab60e66b600123..b4d78e0ab5b68503d21445c7a2b652ecda124d90 100644 (file)
@@ -203,8 +203,9 @@ public:
        void add(string const & latex_snippet);
        ///
        void remove(string const & latex_snippet);
-       ///
-       void startLoading();
+       /// \p wait whether to wait for the process to complete or, instead,
+       /// to do it in the background.
+       void startLoading(bool wait = false);
 
        /// Emit this signal when an image is ready for display.
        boost::signal<void(PreviewImage const &)> imageReady;
@@ -215,7 +216,7 @@ private:
        /// Called by the ForkedCall process that generated the bitmap files.
        void finishedGenerating(pid_t, int);
        ///
-       void dumpPreamble(odocstream &) const;
+       void dumpPreamble(otexstream &) const;
        ///
        void dumpData(odocstream &, BitmapFile const &) const;
 
@@ -291,9 +292,9 @@ void PreviewLoader::remove(string const & latex_snippet) const
 }
 
 
-void PreviewLoader::startLoading() const
+void PreviewLoader::startLoading(bool wait) const
 {
-       pimpl_->startLoading();
+       pimpl_->startLoading(wait);
 }
 
 
@@ -387,12 +388,8 @@ namespace graphics {
 PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b)
        : parent_(p), buffer_(b)
 {
-       if (!pconverter_){
-               if (b.params().encoding().package() == Encoding::japanese)
-                       pconverter_ = setConverter("lyxpreview-platex");
-               else
-                       pconverter_ = setConverter("lyxpreview");
-       }
+       if (!pconverter_)
+               pconverter_ = setConverter("lyxpreview");
 }
 
 
@@ -520,7 +517,7 @@ void PreviewLoader::Impl::remove(string const & latex_snippet)
 }
 
 
-void PreviewLoader::Impl::startLoading()
+void PreviewLoader::Impl::startLoading(bool wait)
 {
        if (pending_.empty() || !pconverter_)
                return;
@@ -550,13 +547,14 @@ void PreviewLoader::Impl::startLoading()
        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;
        }
 
        TexRow texrow;
+       otexstream os(of, texrow);
        OutputParams runparams(&enc);
        LaTeXFeatures features(buffer_, buffer_.params(), runparams);
 
@@ -569,9 +567,9 @@ void PreviewLoader::Impl::startLoading()
                return;
        }
        of << "\\batchmode\n";
-       dumpPreamble(of);
+       dumpPreamble(os);
        // handle inputenc etc.
-       buffer_.params().writeEncodingPreamble(of, features, texrow);
+       buffer_.params().writeEncodingPreamble(os, features);
        of << "\n\\begin{document}\n";
        dumpData(of, inprogress.snippets);
        of << "\n\\end{document}\n";
@@ -582,27 +580,59 @@ void PreviewLoader::Impl::startLoading()
                return;
        }
 
-       double font_scaling_factor = 0.01 * lyxrc.dpi * lyxrc.zoom
-               * lyxrc.preview_scale_factor;
-
+       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;
+       
        // The conversion command.
        ostringstream cs;
-       cs << pconverter_->command << ' ' << pconverter_->to << ' '
-          << quoteName(latexfile.toFilesystemEncoding()) << ' '
-          << int(font_scaling_factor) << ' '
-          << theApp()->hexName(PreviewLoader::foregroundColor()) << ' '
-          << theApp()->hexName(PreviewLoader::backgroundColor());
-       if (buffer_.params().useXetex)
-               cs << " xelatex";
+       cs << pconverter_->command
+          << " " << quoteName(latexfile.toFilesystemEncoding())
+          << " --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);
+       }
+
+       // FIXME what about LuaTeX?
+       if (buffer_.params().useNonTeXFonts)
+               cs << " --latex=xelatex";
+       if (buffer_.params().encoding().package() == Encoding::japanese)
+               cs << " --latex=platex";
+       if (buffer_.params().bibtex_command != "default")
+               cs << " --bibtex=" << quoteName(buffer_.params().bibtex_command);
+       else if (buffer_.params().encoding().package() == Encoding::japanese)
+               cs << " --bibtex=" << quoteName(lyxrc.jbibtex_command);
+       else
+               cs << " --bibtex=" << quoteName(lyxrc.bibtex_command);
+       if (buffer_.params().bufferFormat() == "lilypond-book")
+               cs << " --lilypond";
 
        string const command = libScriptSearch(cs.str());
 
+       if (wait) {
+               ForkedCall call(buffer_.filePath());
+               int ret = call.startScript(ForkedProcess::Wait, command);
+               static int fake = (2^20) + 1;
+               int pid = fake++;
+               inprogress.pid = pid;
+               inprogress.command = command;
+               in_progress_[pid] = inprogress;
+               finishedGenerating(pid, ret);
+               return;
+       }
+
        // 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 call;
+       ForkedCall call(buffer_.filePath());
        int ret = call.startScript(command, convert_ptr);
 
        if (ret != 0) {
@@ -653,10 +683,14 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
                FileName const & file = it->second;
                double af = ascent_fractions[metrics_counter];
 
-               PreviewImagePtr ptr(new PreviewImage(parent_, snip, file, af));
-               cache_[snip] = ptr;
+               // Add the image to the cache only if it's actually present
+               if (file.isReadableFile()) {
+                       PreviewImagePtr ptr(new PreviewImage(parent_, snip, file, af));
+                       cache_[snip] = ptr;
+
+                       newimages.push_back(ptr);
+               }
 
-               newimages.push_back(ptr);
        }
 
        // Remove the item from the list of still-executing processes.
@@ -673,17 +707,19 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
 }
 
 
-void PreviewLoader::Impl::dumpPreamble(odocstream & os) const
+void PreviewLoader::Impl::dumpPreamble(otexstream & os) const
 {
        // Dump the preamble only.
-       // We don't need an encoding for runparams since it is not used by
-       // the preamble.
-       OutputParams runparams(0);
-       runparams.flavor = OutputParams::LATEX;
+       OutputParams runparams(&buffer_.params().encoding());
+       if (buffer_.params().useNonTeXFonts)
+               runparams.flavor = OutputParams::XETEX;
+       else
+               runparams.flavor = OutputParams::LATEX;
        runparams.nice = true;
        runparams.moving_arg = true;
        runparams.free_spacing = true;
-       buffer_.writeLaTeXSource(os, buffer_.filePath(), 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:
@@ -708,26 +744,7 @@ void PreviewLoader::Impl::dumpPreamble(odocstream & 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";
 }