X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FPreviewLoader.cpp;h=b4d78e0ab5b68503d21445c7a2b652ecda124d90;hb=99c5a46c68bd605c03d4e3a86811831ed7dd3d37;hp=54913b3aeca0b0b8beb09d2de55cd4614ec7ddc8;hpb=b8d43b05bc8411ae6dd347f40669b0c4a9a0d1ee;p=lyx.git diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp index 54913b3aec..b4d78e0ab5 100644 --- a/src/graphics/PreviewLoader.cpp +++ b/src/graphics/PreviewLoader.cpp @@ -203,7 +203,8 @@ public: void add(string const & latex_snippet); /// void remove(string const & latex_snippet); - /// + /// \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. @@ -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; @@ -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"); } @@ -550,13 +547,14 @@ void PreviewLoader::Impl::startLoading(bool wait) 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(bool wait) 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,43 @@ void PreviewLoader::Impl::startLoading(bool wait) return; } - double font_scaling_factor = 0.01 * lyxrc.dpi * lyxrc.zoom - * lyxrc.preview_scale_factor; - - // For XHTML image export, we need to control the background - // color here. - ColorCode bg = buffer_.isClone() - ? Color_white : PreviewLoader::backgroundColor(); + 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(bg); - 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; + ForkedCall call(buffer_.filePath()); int ret = call.startScript(ForkedProcess::Wait, command); static int fake = (2^20) + 1; int pid = fake++; @@ -618,7 +632,7 @@ void PreviewLoader::Impl::startLoading(bool wait) 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) { @@ -669,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. @@ -689,15 +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. OutputParams runparams(&buffer_.params().encoding()); - runparams.flavor = OutputParams::LATEX; + 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: @@ -722,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"; }