]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/PreviewLoader.cpp
Correct the mess introduced in r33250.
[lyx.git] / src / graphics / PreviewLoader.cpp
index 4c668120ebcf57fe69e769c3906fa202559b8cc7..f54fb6bc92ed3d1789ec3ebe3933f365c771c6af 100644 (file)
 
 #include "support/convert.h"
 #include "support/debug.h"
+#include "support/FileName.h"
 #include "support/filetools.h"
 #include "support/ForkedCalls.h"
 #include "support/lstrings.h"
-#include "support/lyxlib.h"
 
 #include <boost/bind.hpp>
 
@@ -63,17 +63,15 @@ string const unique_filename(string const & bufferpath)
 {
        static int theCounter = 0;
        string const filename = lyx::convert<string>(theCounter++) + "lyxpreview";
-       return lyx::support::addName(bufferpath, filename);
+       return addName(bufferpath, filename);
 }
 
 
-lyx::Converter const * setConverter()
+lyx::Converter const * setConverter(string const from)
 {
-       string const from = "lyxpreview";
-
        typedef vector<string> FmtList;
        typedef lyx::graphics::Cache GCache;
-       FmtList const loadableFormats = GCache::get().loadableFormats();
+       FmtList const loadableFormats = GCache::get().loadableFormats();
        FmtList::const_iterator it = loadableFormats.begin();
        FmtList::const_iterator const end = loadableFormats.end();
 
@@ -245,8 +243,6 @@ private:
        PreviewLoader & parent_;
        ///
        Buffer const & buffer_;
-       ///
-       double font_scaling_factor_;
 
        /// We don't own this
        static lyx::Converter const * pconverter_;
@@ -354,7 +350,7 @@ InProgress::InProgress(string const & filename_base,
                       PendingSnippets const & pending,
                       string const & to_format)
        : pid(0),
-         metrics_file(FileName(filename_base + ".metrics")),
+         metrics_file(filename_base + ".metrics"),
          snippets(pending.size())
 {
        PendingSnippets::const_iterator pit  = pending.begin();
@@ -369,7 +365,7 @@ InProgress::InProgress(string const & filename_base,
 void InProgress::stop() const
 {
        if (pid)
-               lyx::support::ForkedCallsController::kill(pid, 0);
+               ForkedCallsController::kill(pid, 0);
 
        if (!metrics_file.empty())
                metrics_file.removeFile();
@@ -389,16 +385,14 @@ namespace lyx {
 namespace graphics {
 
 PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b)
-       : parent_(p), buffer_(b), font_scaling_factor_(0.0)
+       : parent_(p), buffer_(b)
 {
-       font_scaling_factor_ = 0.01 * lyxrc.dpi * lyxrc.zoom *
-               convert<double>(lyxrc.preview_scale_factor);
-
-       LYXERR(Debug::GRAPHICS, "The font scaling factor is "
-                               << font_scaling_factor_);
-
-       if (!pconverter_)
-               pconverter_ = setConverter();
+       if (!pconverter_){
+               if (b.params().encoding().package() == Encoding::japanese)
+                       pconverter_ = setConverter("lyxpreview-platex");
+               else
+                       pconverter_ = setConverter("lyxpreview");
+       }
 }
 
 
@@ -469,7 +463,7 @@ void PreviewLoader::Impl::add(string const & latex_snippet)
        if (!pconverter_ || status(latex_snippet) != NotFound)
                return;
 
-       string const snippet = support::trim(latex_snippet);
+       string const snippet = trim(latex_snippet);
        if (snippet.empty())
                return;
 
@@ -554,7 +548,14 @@ void PreviewLoader::Impl::startLoading()
 
        // we use the encoding of the buffer
        Encoding const & enc = buffer_.params().encoding();
-       odocfstream of(enc.iconvName());
+       ofdocstream of;
+       try { of.reset(enc.iconvName()); }
+       catch (iconv_codecvt_facet_exception & e) {
+               LYXERR0("Caught iconv exception: " << e.what()
+                       << "\nUnable to create LaTeX file: " << latexfile);
+               return;
+       }
+
        TexRow texrow;
        OutputParams runparams(&enc);
        LaTeXFeatures features(buffer_, buffer_.params(), runparams);
@@ -581,22 +582,25 @@ void PreviewLoader::Impl::startLoading()
                return;
        }
 
+       double font_scaling_factor = 0.01 * lyxrc.dpi * lyxrc.zoom
+               * lyxrc.preview_scale_factor;
+
        // The conversion command.
        ostringstream cs;
        cs << pconverter_->command << ' ' << pconverter_->to << ' '
-          << support::quoteName(latexfile.toFilesystemEncoding()) << ' '
-          << int(font_scaling_factor_) << ' '
-          << theApp()->hexName(Color_preview) << ' '
-          << theApp()->hexName(Color_background);
+          << quoteName(latexfile.toFilesystemEncoding()) << ' '
+          << int(font_scaling_factor) << ' '
+          << theApp()->hexName(PreviewLoader::foregroundColor()) << ' '
+          << theApp()->hexName(PreviewLoader::backgroundColor());
 
-       string const command = support::libScriptSearch(cs.str());
+       string const command = libScriptSearch(cs.str());
 
        // Initiate the conversion from LaTeX to bitmap images files.
-       support::ForkedCall::SignalTypePtr
-               convert_ptr(new support::ForkedCall::SignalType);
+       ForkedCall::SignalTypePtr
+               convert_ptr(new ForkedCall::SignalType);
        convert_ptr->connect(bind(&Impl::finishedGenerating, this, _1, _2));
 
-       support::ForkedCall call;
+       ForkedCall call;
        int ret = call.startScript(command, convert_ptr);
 
        if (ret != 0) {
@@ -669,8 +673,6 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
 
 void PreviewLoader::Impl::dumpPreamble(odocstream & os) const
 {
-       // Why on earth is Buffer::makeLaTeXFile a non-const method?
-       Buffer & tmp = const_cast<Buffer &>(buffer_);
        // Dump the preamble only.
        // We don't need an encoding for runparams since it is not used by
        // the preamble.
@@ -679,7 +681,7 @@ void PreviewLoader::Impl::dumpPreamble(odocstream & os) const
        runparams.nice = true;
        runparams.moving_arg = true;
        runparams.free_spacing = true;
-       tmp.writeLaTeXSource(os, buffer_.filePath(), runparams, true, false);
+       buffer_.writeLaTeXSource(os, buffer_.filePath(), runparams, true, false);
 
        // FIXME! This is a HACK! The proper fix is to control the 'true'
        // passed to WriteStream below:
@@ -694,15 +696,6 @@ void PreviewLoader::Impl::dumpPreamble(odocstream & os) const
           << "\\def\\lyxlock{}\n"
           << "\n";
 
-       // Loop over the insets in the buffer and dump all the math-macros.
-       Inset & inset = buffer_.inset();
-       InsetIterator it = inset_iterator_begin(inset);
-       InsetIterator const end = inset_iterator_end(inset);
-
-       for (; it != end; ++it)
-               if (it->lyxCode() == MATHMACRO_CODE)
-                       it->latex(buffer_, os, runparams);
-
        // All equation labels appear as "(#)" + preview.sty's rendering of
        // the label name
        if (lyxrc.preview_hashed_labels)
@@ -710,8 +703,19 @@ void PreviewLoader::Impl::dumpPreamble(odocstream & os) const
 
        // Use the preview style file to ensure that each snippet appears on a
        // fresh page.
+       // Also support PDF output (automatically generated e.g. when
+       // \usepackage[pdftex]{hyperref} is used.
        os << "\n"
-          << "\\usepackage[active,delayed,dvips,showlabels,lyx]{preview}\n"
+          << "\\newif\\ifpdf\n"
+          << "\\ifx\\pdfoutput\\undefined\n"
+          << "\\else\\ifx\\pdfoutput\\relax\n"
+          << "\\else\\ifnum0=\\pdfoutput\n"
+          << "\\else\\pdftrue\\fi\\fi\\fi\n"
+          << "\\ifpdf\n"
+          << "  \\usepackage[active,delayed,tightpage,showlabels,lyx,pdftex]{preview}\n"
+          << "\\else\n"
+          << "  \\usepackage[active,delayed,showlabels,lyx,dvips]{preview}\n"
+          << "\\fi\n"
           << "\n";
 }