X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FPreviewLoader.C;h=5eb37010644edb289abdabada41b42da36cc3ee2;hb=3aa7e91a827fa15b3e0906b975c4755a2dcdb76d;hp=a78005fe0a3adbda9a57998504fda23ceeaffbe4;hpb=f643df79a890ec4bc2eb05a3fd3d349ba3994f96;p=lyx.git diff --git a/src/graphics/PreviewLoader.C b/src/graphics/PreviewLoader.C index a78005fe0a..5eb3701064 100644 --- a/src/graphics/PreviewLoader.C +++ b/src/graphics/PreviewLoader.C @@ -1,9 +1,10 @@ -/* +/** * \file PreviewLoader.C - * Copyright 2002 the LyX Team * Read the file COPYING * - * \author Angus Leeming + * \author Angus Leeming + * + * Full author contact details available in file CREDITS */ #include @@ -16,11 +17,9 @@ #include "PreviewImage.h" #include "buffer.h" -#include "bufferparams.h" #include "converter.h" #include "debug.h" #include "lyxrc.h" -#include "lyxtextclasslist.h" #include "LColor.h" #include "insets/inset.h" @@ -70,9 +69,6 @@ typedef list PendingSnippets; // Each item in the vector is a pair. typedef vector BitmapFile; - -double setFontScalingFactor(Buffer &); - string const unique_filename(string const bufferpath); Converter const * setConverter(); @@ -138,6 +134,8 @@ struct PreviewLoader::Impl : public boost::signals::trackable { /// Emit this signal when an image is ready for display. boost::signal1 imageReady; + Buffer const & buffer() const { return buffer_; } + private: /// Called by the Forkedcall process that generated the bitmap files. void finishedGenerating(string const &, pid_t, int); @@ -233,6 +231,12 @@ void PreviewLoader::emitSignal(PreviewImage const & pimage) const pimpl_->imageReady(pimage); } + +Buffer const & PreviewLoader::buffer() const +{ + return pimpl_->buffer(); +} + } // namespace grfx @@ -250,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); @@ -277,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)); } @@ -306,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(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; @@ -384,7 +386,13 @@ void PreviewLoader::Impl::add(string const & latex_snippet) if (!pconverter_ || status(latex_snippet) != NotFound) return; - pending_.push_back(latex_snippet); + string const snippet = trim(latex_snippet); + if (snippet.empty()) + return; + + lyxerr[Debug::GRAPHICS] << "adding snippet:\n" << snippet << endl; + + pending_.push_back(snippet); } @@ -465,9 +473,9 @@ void PreviewLoader::Impl::startLoading() // The conversion command. ostringstream cs; cs << pconverter_->command << " " << latexfile << " " - << font_scaling_factor_; + << int(font_scaling_factor_) << " " << pconverter_->to; - string const command = 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; @@ -551,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_); // 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 @@ -571,7 +577,7 @@ void PreviewLoader::Impl::dumpPreamble(ostream & os) const // Use the preview style file to ensure that each snippet appears on a // fresh page. os << "\n" - << "\\usepackage[active,delayed,dvips,tightpage,showlabels]{preview}\n" + << "\\usepackage[active,delayed,dvips,tightpage,showlabels,lyx]{preview}\n" << "\n"; // This piece of PostScript magic ensures that the foreground and @@ -648,106 +654,81 @@ Converter const * setConverter() } -double setFontScalingFactor(Buffer & buffer) +void setAscentFractions(vector & 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::iterator it = ascent_fractions.begin(); + vector::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 = textclasslist[buffer.params.textclass]; - 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(frontStrip(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 & ascent_fractions, - string const & metrics_file) -{ - // If all else fails, then the images will have equal ascents and - // descents. - vector::iterator it = ascent_fractions.begin(); - vector::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(strip(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; } }