]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/PreviewLoader.C
Modify the headers of files in src/graphics as discussed on the list.
[lyx.git] / src / graphics / PreviewLoader.C
index 189ff2ff6dd216e41d007caa4665727524d3e4d1..5eb37010644edb289abdabada41b42da36cc3ee2 100644 (file)
@@ -1,9 +1,10 @@
-/*
+/**
  *  \file PreviewLoader.C
- *  Copyright 2002 the LyX Team
  *  Read the file COPYING
  *
- * \author Angus Leeming <leeming@lyx.org>
+ * \author Angus Leeming 
+ *
+ * Full author contact details available in file CREDITS
  */
 
 #include <config.h>
@@ -16,7 +17,6 @@
 #include "PreviewImage.h"
 
 #include "buffer.h"
-#include "bufferparams.h"
 #include "converter.h"
 #include "debug.h"
 #include "lyxrc.h"
@@ -69,9 +69,6 @@ typedef list<string> PendingSnippets;
 // Each item in the vector is a pair<snippet, image file name>.
 typedef vector<StrPair> BitmapFile;
 
-
-double setFontScalingFactor(Buffer &);
-
 string const unique_filename(string const bufferpath);
 
 Converter const * setConverter();
@@ -257,10 +254,7 @@ struct IncrementedFileName {
        StrPair const operator()(string const & snippet)
        {
                ostringstream os;
-               os << base_
-                  << setfill('0') << setw(3) << counter_++
-                  << "." << to_format_;
-
+               os << base_ << counter_++ << "." << to_format_;
                string const file = os.str().c_str();
 
                return make_pair(snippet, file);
@@ -284,7 +278,7 @@ InProgress::InProgress(string const & filename_base,
        PendingSnippets::const_iterator pend = pending.end();
        BitmapFile::iterator sit = snippets.begin();
 
-       std::transform(pit, pend, sit,
+       std::transform(pit, pend, sit, 
                       IncrementedFileName(to_format, filename_base));
 }
 
@@ -313,7 +307,8 @@ namespace grfx {
 PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b)
        : parent_(p), buffer_(b), font_scaling_factor_(0.0)
 {
-       font_scaling_factor_ = setFontScalingFactor(const_cast<Buffer &>(b));
+       font_scaling_factor_ = 0.01 * lyxrc.dpi * lyxrc.zoom *
+               lyxrc.preview_scale_factor;
 
        lyxerr[Debug::GRAPHICS] << "The font scaling factor is "
                                << font_scaling_factor_ << endl;
@@ -478,9 +473,9 @@ void PreviewLoader::Impl::startLoading()
        // The conversion command.
        ostringstream cs;
        cs << pconverter_->command << " " << latexfile << " "
-          << int(font_scaling_factor_);
+          << int(font_scaling_factor_) << " " << pconverter_->to;
 
-       string const command = LibScriptSearch(cs.str().c_str());
+       string const command = "sh " + LibScriptSearch(cs.str().c_str());
 
        // Initiate the conversion from LaTeX to bitmap images files.
        Forkedcall::SignalTypePtr convert_ptr;
@@ -564,17 +559,15 @@ void PreviewLoader::Impl::dumpPreamble(ostream & os) const
        // Why on earth is Buffer::makeLaTeXFile a non-const method?
        Buffer & tmp = const_cast<Buffer &>(buffer_);
        // Dump the preamble only.
-       tmp.makeLaTeXFile(os, string(), true, false, true);
+       tmp.makeLaTeXFile(os, buffer_.filePath(), true, false, true);
 
        // Loop over the insets in the buffer and dump all the math-macros.
        Buffer::inset_iterator it  = buffer_.inset_const_iterator_begin();
        Buffer::inset_iterator end = buffer_.inset_const_iterator_end();
 
-       for (; it != end; ++it) {
-               if ((*it)->lyxCode() == Inset::MATHMACRO_CODE) {
-                       (*it)->latex(&buffer_, os, true, true);
-               }
-       }
+       for (; it != end; ++it)
+               if (it->lyxCode() == Inset::MATHMACRO_CODE)
+                       it->latex(&buffer_, os, true, true);
 
        // All equation lables appear as "(#)" + preview.sty's rendering of
        // the label name
@@ -661,106 +654,81 @@ Converter const * setConverter()
 }
 
 
-double setFontScalingFactor(Buffer & buffer)
+void setAscentFractions(vector<double> & ascent_fractions,
+                       string const & metrics_file)
 {
-       double scale_factor = 0.01 * lyxrc.dpi * lyxrc.zoom *
-               lyxrc.preview_scale_factor;
+       // If all else fails, then the images will have equal ascents and
+       // descents.
+       vector<double>::iterator it  = ascent_fractions.begin();
+       vector<double>::iterator end = ascent_fractions.end();
+       fill(it, end, 0.5);
 
-       // Has the font size been set explicitly?
-       string const & fontsize = buffer.params.fontsize;
-       lyxerr[Debug::GRAPHICS] << "PreviewLoader::scaleToFitLyXView()\n"
-                               << "font size is " << fontsize << endl;
+       ifstream in(metrics_file.c_str());
+       if (!in.good()) {
+               lyxerr[Debug::GRAPHICS]
+                       << "setAscentFractions(" << metrics_file << ")\n"
+                       << "Unable to open file!" << endl;
+               return;
+       }
 
-       if (isStrUnsignedInt(fontsize))
-               return 10.0 * scale_factor / strToDbl(fontsize);
+       bool error = false;
 
-       // No. We must extract it from the LaTeX class file.
-       LyXTextClass const & tclass = buffer.params.getLyXTextClass();
-       string const textclass(tclass.latexname() + ".cls");
-       string const classfile(findtexfile(textclass, "cls"));
+       // Tightpage dimensions affect all subsequent dimensions
+       int tp_ascent;
+       int tp_descent;
 
-       lyxerr[Debug::GRAPHICS] << "text class is " << textclass << '\n'
-                               << "class file is " << classfile << endl;
+       int snippet_counter = 0;
+       while (!in.eof()) {
+               // Expecting lines of the form
+               // Preview: Tightpage tp_bl_x tp_bl_y tp_tr_x tp_tr_y
+               // Preview: Snippet id ascent descent width
+               string preview;
+               string type;
+               in >> preview >> type;
 
-       ifstream ifs(classfile.c_str());
-       if (!ifs.good()) {
-               lyxerr[Debug::GRAPHICS] << "Unable to open class file!" << endl;
-               return scale_factor;
-       }
+               if (!in.good())
+                       // eof after all
+                       break;
 
-       string str;
-       double scaling = scale_factor;
+               error = preview != "Preview:"
+                       || (type != "Tightpage" && type != "Snippet");
+               if (error)
+                       break;
 
-       while (ifs.good()) {
-               getline(ifs, str);
-               // To get the default font size, look for a line like
-               // "\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final}"
-               if (!prefixIs(ltrim(str), "\\ExecuteOptions"))
-                       continue;
+               if (type == "Tightpage") {
+                       int dummy;
+                       in >> dummy >> tp_descent >> dummy >> tp_ascent;
 
-               // str contains just the options of \ExecuteOptions
-               string const tmp = split(str, '{');
-               split(tmp, str, '}');
-
-               int count = 0;
-               string tok = token(str, ',', count++);
-               while (!isValidLength(tok) && !tok.empty())
-                       tok = token(str, ',', count++);
-
-               if (!tok.empty()) {
-                       lyxerr[Debug::GRAPHICS]
-                               << "Extracted default font size from "
-                               "LaTeX class file successfully!" << endl;
-                       LyXLength fsize(tok);
-                       scaling *= 10.0 / fsize.value();
-                       break;
-               }
-       }
+                       error = !in.good();
+                       if (error)
+                               break;
 
-       return scaling;
-}
+               } else {
+                       int dummy;
+                       int snippet_id;
+                       int ascent;
+                       int descent;
+                       in >> snippet_id >> ascent >> descent >> dummy;
 
+                       error = !in.good() || ++snippet_counter != snippet_id;
+                       if (error)
+                               break;
 
-void setAscentFractions(vector<double> & ascent_fractions,
-                       string const & metrics_file)
-{
-       // If all else fails, then the images will have equal ascents and
-       // descents.
-       vector<double>::iterator it  = ascent_fractions.begin();
-       vector<double>::iterator end = ascent_fractions.end();
-       fill(it, end, 0.5);
+                       double const a = ascent + tp_ascent;
+                       double const d = descent - tp_descent;
 
-       ifstream ifs(metrics_file.c_str());
-       if (!ifs.good()) {
-               lyxerr[Debug::GRAPHICS] << "setAscentFractions("
-                                       << metrics_file << ")\n"
-                                       << "Unable to open file!"
-                                       << endl;
-               return;
-       }
+                       if (!lyx::float_equal(a + d, 0, 0.1))
+                               *it = a / (a + d);
 
-       for (; it != end; ++it) {
-               string page;
-               string page_id;
-               int dummy;
-               double ascent;
-               double descent;
-
-               ifs >> page >> page_id >> dummy >> dummy >> dummy >> dummy
-                   >> ascent >> descent >> dummy;
-
-               if (!ifs.good() ||
-                   page != "%%Page" ||
-                   !isStrUnsignedInt(rtrim(page_id, ":"))) {
-                       lyxerr[Debug::GRAPHICS] << "setAscentFractions("
-                                               << metrics_file << ")\n"
-                                               << "Error reading file!"
-                                               << endl;
-                       break;
+                       if (++it == end)
+                               break;
                }
+       }
 
-               if (ascent + descent != 0)
-                       *it = ascent / (ascent + descent);
+       if (error) {
+               lyxerr[Debug::GRAPHICS]
+                       << "setAscentFractions(" << metrics_file << ")\n"
+                       << "Error reading file!\n" << endl;
        }
 }