#include "gettext.h"
#include "LaTeXFeatures.h"
#include "lyx_main.h"
+#include "lyxlength.h"
#include "lyxlex.h"
#include "metricsinfo.h"
+#include "mover.h"
#include "outputparams.h"
+#include "sgml.h"
#include "frontends/Alert.h"
#include "frontends/LyXView.h"
+#include "support/convert.h"
#include "support/filetools.h"
#include "support/lyxalgo.h" // lyx::count
-#include "support/lyxlib.h" // float_equal
+#include "support/lyxlib.h" // lyx::sum
+#include "support/lstrings.h"
#include "support/os.h"
#include "support/systemcall.h"
-#include "support/tostr.h"
#include <boost/bind.hpp>
#include <boost/tuple/tuple.hpp>
using lyx::support::FileName;
using lyx::support::float_equal;
using lyx::support::GetExtension;
-using lyx::support::getExtFromContents;
using lyx::support::IsFileReadable;
-using lyx::support::LibFileSearch;
using lyx::support::OnlyFilename;
using lyx::support::rtrim;
using lyx::support::subst;
}
-string const uniqueID()
+string findTargetFormat(string const & format, OutputParams const & runparams)
{
- static unsigned int seed = 1000;
- return "graph" + tostr(++seed);
-}
-
-
-string findTargetFormat(string const & suffix, OutputParams const & runparams)
-{
- // Are we using latex or pdflatex).
+ // Are we using latex or pdflatex?
if (runparams.flavor == OutputParams::PDFLATEX) {
lyxerr[Debug::GRAPHICS] << "findTargetFormat: PDF mode" << endl;
- if (contains(suffix, "ps") || suffix == "pdf")
+ // Convert postscript to pdf
+ if (format == "eps" || format == "ps")
return "pdf";
- if (suffix == "jpg") // pdflatex can use jpeg
- return suffix;
- return "png"; // and also png
+ // pdflatex can use jpeg, png and pdf directly
+ if (format == "jpg" || format == "pdf")
+ return format;
+ // Convert everything else to png
+ return "png";
}
// If it's postscript, we always do eps.
lyxerr[Debug::GRAPHICS] << "findTargetFormat: PostScript mode" << endl;
- if (suffix != "ps") // any other than ps
- return "eps"; // is changed to eps
- return suffix; // let ps untouched
+ if (format != "ps")
+ // any other than ps is changed to eps
+ return "eps";
+ // let ps untouched
+ return format;
}
} // namespace anon
InsetGraphics::InsetGraphics()
- : graphic_label(uniqueID()),
+ : graphic_label(sgml::uniqueID("graph")),
graphic_(new RenderGraphic(this))
{}
InsetGraphics::InsetGraphics(InsetGraphics const & ig)
: InsetOld(ig),
boost::signals::trackable(),
- graphic_label(uniqueID()),
+ graphic_label(sgml::uniqueID("graph")),
graphic_(new RenderGraphic(*ig.graphic_, this))
{
setParams(ig.params());
}
-auto_ptr<InsetBase> InsetGraphics::clone() const
+auto_ptr<InsetBase> InsetGraphics::doClone() const
{
return auto_ptr<InsetBase>(new InsetGraphics(*this));
}
}
-void InsetGraphics::priv_dispatch(LCursor & cur, FuncRequest & cmd)
+void InsetGraphics::doDispatch(LCursor & cur, FuncRequest & cmd)
{
switch (cmd.action) {
- case LFUN_GRAPHICS_EDIT: {
+ case LFUN_GRAPHICS_EDIT: {
Buffer const & buffer = *cur.bv().buffer();
InsetGraphicsParams p;
InsetGraphicsMailer::string2params(cmd.argument, buffer, p);
break;
default:
- InsetOld::priv_dispatch(cur, cmd);
+ InsetBase::doDispatch(cur, cmd);
break;
}
}
}
-InsetOld::EDITABLE InsetGraphics::editable() const
+InsetBase::EDITABLE InsetGraphics::editable() const
{
return IS_EDITABLE;
}
// before writing it to the output stream.
ostringstream options;
if (!params().bb.empty())
- options << " bb=" << rtrim(params().bb) << ",\n";
+ options << " bb=" << rtrim(params().bb) << ",\n";
if (params().draft)
- options << " draft,\n";
+ options << " draft,\n";
if (params().clip)
- options << " clip,\n";
- if (!float_equal(params().scale, 0.0, 0.05)) {
- if (!float_equal(params().scale, 100.0, 0.05))
- options << " scale=" << params().scale / 100.0
+ options << " clip,\n";
+ double const scl = convert<double>(params().scale);
+ if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) {
+ if (!float_equal(scl, 100.0, 0.05))
+ options << " scale=" << scl / 100.0
<< ",\n";
} else {
if (!params().width.zero())
- options << " width=" << params().width.asLatexString() << ",\n";
+ options << " width=" << params().width.asLatexString() << ",\n";
if (!params().height.zero())
- options << " height=" << params().height.asLatexString() << ",\n";
+ options << " height=" << params().height.asLatexString() << ",\n";
if (params().keepAspectRatio)
- options << " keepaspectratio,\n";
+ options << " keepaspectratio,\n";
}
// Make sure rotation angle is not very close to zero;
// a float can be effectively zero but not exactly zero.
- if (!float_equal(params().rotateAngle, 0, 0.001)) {
+ if (!params().rotateAngle.empty()
+ && !float_equal(convert<double>(params().rotateAngle), 0.0, 0.001)) {
options << " angle=" << params().rotateAngle << ",\n";
if (!params().rotateOrigin.empty()) {
options << " origin=" << params().rotateOrigin[0];
}
+string const InsetGraphics::toDocbookLength(LyXLength const & len) const
+{
+ ostringstream result;
+ switch (len.unit()) {
+ case LyXLength::SP: // Scaled point (65536sp = 1pt) TeX's smallest unit.
+ result << len.value() * 65536.0 * 72 / 72.27 << "pt";
+ break;
+ case LyXLength::PT: // Point = 1/72.27in = 0.351mm
+ result << len.value() * 72 / 72.27 << "pt";
+ break;
+ case LyXLength::BP: // Big point (72bp = 1in), also PostScript point
+ result << len.value() << "pt";
+ break;
+ case LyXLength::DD: // Didot point = 1/72 of a French inch, = 0.376mm
+ result << len.value() * 0.376 << "mm";
+ break;
+ case LyXLength::MM: // Millimeter = 2.845pt
+ result << len.value() << "mm";
+ break;
+ case LyXLength::PC: // Pica = 12pt = 4.218mm
+ result << len.value() << "pc";
+ break;
+ case LyXLength::CC: // Cicero = 12dd = 4.531mm
+ result << len.value() * 4.531 << "mm";
+ break;
+ case LyXLength::CM: // Centimeter = 10mm = 2.371pc
+ result << len.value() << "cm";
+ break;
+ case LyXLength::IN: // Inch = 25.4mm = 72.27pt = 6.022pc
+ result << len.value() << "in";
+ break;
+ case LyXLength::EX: // Height of a small "x" for the current font.
+ // Obviously we have to compromise here. Any better ratio than 1.5 ?
+ result << len.value() / 1.5 << "em";
+ break;
+ case LyXLength::EM: // Width of capital "M" in current font.
+ result << len.value() << "em";
+ break;
+ case LyXLength::MU: // Math unit (18mu = 1em) for positioning in math mode
+ result << len.value() * 18 << "em";
+ break;
+ case LyXLength::PTW: // Percent of TextWidth
+ case LyXLength::PCW: // Percent of ColumnWidth
+ case LyXLength::PPW: // Percent of PageWidth
+ case LyXLength::PLW: // Percent of LineWidth
+ case LyXLength::PTH: // Percent of TextHeight
+ case LyXLength::PPH: // Percent of Paper
+ // Sigh, this will go wrong.
+ result << len.value() << "%";
+ break;
+ default:
+ result << len.asString();
+ break;
+ }
+ return result.str();
+}
+
+string const InsetGraphics::createDocBookAttributes() const
+{
+ // Calculate the options part of the command, we must do it to a string
+ // stream since we copied the code from createLatexParams() ;-)
+
+ // FIXME: av: need to translate spec -> Docbook XSL spec (http://www.sagehill.net/docbookxsl/ImageSizing.html)
+ // Right now it only works with my version of db2latex :-)
+
+ ostringstream options;
+ double const scl = convert<double>(params().scale);
+ if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) {
+ if (!float_equal(scl, 100.0, 0.05))
+ options << " scale=\""
+ << static_cast<int>( (scl) + 0.5 )
+ << "\" ";
+ } else {
+ if (!params().width.zero()) {
+ options << " width=\"" << toDocbookLength(params().width) << "\" ";
+ }
+ if (!params().height.zero()) {
+ options << " depth=\"" << toDocbookLength(params().height) << "\" ";
+ }
+ if (params().keepAspectRatio) {
+ // This will be irrelevant unless both width and height are set
+ options << "scalefit=\"1\" ";
+ }
+ }
+
+
+ if (!params().special.empty())
+ options << params().special << " ";
+
+ string opts = options.str();
+ // trailing blanks are ok ...
+ return opts;
+}
+
+
namespace {
enum CopyStatus {
// Nothing to do...
return std::make_pair(IDENTICAL_CONTENTS, file_out);
- bool const success = support::copy(file_in, file_out);
+ Mover const & mover = movers(formats.getFormatFromFile(file_in));
+ bool const success = mover.copy(file_in, file_out);
if (!success) {
lyxerr[Debug::GRAPHICS]
<< support::bformat(_("Could not copy the file\n%1$s\n"
}
}
- string const from = getExtFromContents(temp_file);
+ string const from = formats.getFormatFromFile(temp_file);
+ if (from.empty()) {
+ lyxerr[Debug::GRAPHICS]
+ << "\tCould not get file format." << endl;
+ return orig_file;
+ }
string const to = findTargetFormat(from, runparams);
+ string const ext = formats.extension(to);
lyxerr[Debug::GRAPHICS]
<< "\t we have: from " << from << " to " << to << '\n';
<< "\tthe orig file is: " << orig_file << endl;
if (from == to) {
- // The extension of temp_file might be != to!
+ // The extension of temp_file might be != ext!
runparams.exportdata->addExternalFile("latex", source_file,
output_file);
runparams.exportdata->addExternalFile("dvi", source_file,
return stripExtensionIfPossible(output_file, to);
}
- string const to_file = ChangeExtension(temp_file, to);
- string const output_to_file = ChangeExtension(output_file, to);
+ string const to_file = ChangeExtension(temp_file, ext);
+ string const output_to_file = ChangeExtension(output_file, ext);
// Do we need to perform the conversion?
// Yes if to_file does not exist or if temp_file is newer than to_file
<< "\tfile to convert = " << temp_file << '\n'
<< "\t from " << from << " to " << to << '\n';
- // if no special converter defined, then we take the default one
- // from ImageMagic: convert from:inname.from to:outname.to
- if (!converters.convert(&buf, temp_file, temp_file, from, to)) {
- string const command =
- "sh " + LibFileSearch("scripts", "convertDefault.sh") +
- ' ' + from + ':' + temp_file + ' ' +
- to + ':' + to_file;
- lyxerr[Debug::GRAPHICS]
- << "No converter defined! I use convertDefault.sh:\n\t"
- << command << endl;
- Systemcall one;
- one.startscript(Systemcall::Wait, command);
- if (IsFileReadable(to_file)) {
- runparams.exportdata->addExternalFile("latex",
- to_file, output_to_file);
- runparams.exportdata->addExternalFile("dvi",
- to_file, output_to_file);
- } else {
- string str = bformat(_("No information for converting %1$s "
- "format files to %2$s.\n"
- "Try defining a convertor in the preferences."), from, to);
- Alert::error(_("Could not convert image"), str);
- }
+ if (converters.convert(&buf, temp_file, temp_file, from, to, true)) {
+ runparams.exportdata->addExternalFile("latex",
+ to_file, output_to_file);
+ runparams.exportdata->addExternalFile("dvi",
+ to_file, output_to_file);
}
return stripExtension(output_file);
}
+namespace {
+
+int writeImageObject(char * format, ostream& os, OutputParams const & runparams,
+ string const graphic_label, string const attributes)
+{
+ if (runparams.flavor != OutputParams::XML) {
+ os << "<![ %output.print." << format << "; [" << std::endl;
+ }
+ os <<"<imageobject><imagedata fileref=\"&"
+ << graphic_label << ";." << format << "\" " << attributes ;
+ if (runparams.flavor == OutputParams::XML) {
+ os << " role=\"" << format << "\"/>" ;
+ }
+ else {
+ os << " format=\"" << format << "\">" ;
+ }
+ os << "</imageobject>";
+ if (runparams.flavor != OutputParams::XML) {
+ os << std::endl << "]]>" ;
+ }
+ return runparams.flavor == OutputParams::XML ? 0 : 2;
+}
+// end anonymous namespace
+}
+
+
// For explanation on inserting graphics into DocBook checkout:
// http://en.tldp.org/LDP/LDP-Author-Guide/html/inserting-pictures.html
// See also the docbook guide at http://www.docbook.org/
if (runparams.flavor == OutputParams::XML) {
runparams.exportdata->addExternalFile("docbook-xml",
params().filename.absFilename());
- os << "<graphic fileref=\"&" << graphic_label << ";\"/>";
} else {
runparams.exportdata->addExternalFile("docbook",
params().filename.absFilename());
- os << "<graphic fileref=\"&" << graphic_label << ";\">";
}
- return 0;
+ os << "<inlinemediaobject>";
+
+ int r = 0;
+ string attributes = createDocBookAttributes();
+ r += writeImageObject("png", os, runparams, graphic_label, attributes);
+ r += writeImageObject("pdf", os, runparams, graphic_label, attributes);
+ r += writeImageObject("eps", os, runparams, graphic_label, attributes);
+ r += writeImageObject("bmp", os, runparams, graphic_label, attributes);
+
+ os << "</inlinemediaobject>";
+ return r;
}
}
-void InsetGraphics::editGraphics(InsetGraphicsParams const & p, Buffer const & buffer) const
+void InsetGraphics::editGraphics(InsetGraphicsParams const & p,
+ Buffer const & buffer) const
{
string const file_with_path = p.filename.absFilename();
- formats.edit(buffer, file_with_path, getExtFromContents(file_with_path));
+ formats.edit(buffer, file_with_path,
+ formats.getFormatFromFile(file_with_path));
}