]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetgraphics.C
* In the process of fixing the math background color bug, this commit transfer backgr...
[lyx.git] / src / insets / insetgraphics.C
index 16d12a20944f0c29b124557edffb7a71fd79517b..beac36cdcf40a697859cf97c677ef6a2b1c62528 100644 (file)
@@ -64,7 +64,6 @@ TODO
 #include "FuncStatus.h"
 #include "gettext.h"
 #include "LaTeXFeatures.h"
-#include "lyx_main.h"
 #include "lyxlength.h"
 #include "lyxlex.h"
 #include "metricsinfo.h"
@@ -90,11 +89,11 @@ TODO
 
 namespace lyx {
 
-using support::absolutePath;
 using support::bformat;
 using support::changeExtension;
 using support::compare_timestamps;
 using support::contains;
+using support::DocFileName;
 using support::FileName;
 using support::float_equal;
 using support::getExtension;
@@ -124,7 +123,7 @@ string findTargetFormat(string const & format, OutputParams const & runparams)
 {
        // Are we using latex or pdflatex?
        if (runparams.flavor == OutputParams::PDFLATEX) {
-               lyxerr[Debug::GRAPHICS] << "findTargetFormat: PDF mode" << endl;
+               LYXERR(Debug::GRAPHICS) << "findTargetFormat: PDF mode" << endl;
                Format const * const f = formats.getFormat(format);
                // Convert vector graphics to pdf
                if (f && f->vectorFormat())
@@ -136,7 +135,7 @@ string findTargetFormat(string const & format, OutputParams const & runparams)
                return "png";
        }
        // If it's postscript, we always do eps.
-       lyxerr[Debug::GRAPHICS] << "findTargetFormat: PostScript mode" << endl;
+       LYXERR(Debug::GRAPHICS) << "findTargetFormat: PostScript mode" << endl;
        if (format != "ps")
                // any other than ps is changed to eps
                return "eps";
@@ -234,10 +233,12 @@ void InsetGraphics::edit(LCursor & cur, bool)
 }
 
 
-void InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const
+bool InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        graphic_->metrics(mi, dim);
+       bool const changed = dim_ != dim;
        dim_ = dim;
+       return changed;
 }
 
 
@@ -268,7 +269,7 @@ void InsetGraphics::read(Buffer const & buf, LyXLex & lex)
        if (token == "Graphics")
                readInsetGraphics(lex, buf.filePath());
        else
-               lyxerr[Debug::GRAPHICS] << "Not a Graphics inset!" << endl;
+               LYXERR(Debug::GRAPHICS) << "Not a Graphics inset!" << endl;
 
        graphic_->update(params().as_grfxParams());
 }
@@ -282,7 +283,7 @@ void InsetGraphics::readInsetGraphics(LyXLex & lex, string const & bufpath)
                lex.next();
 
                string const token = lex.getString();
-               lyxerr[Debug::GRAPHICS] << "Token: '" << token << '\''
+               LYXERR(Debug::GRAPHICS) << "Token: '" << token << '\''
                                    << endl;
 
                if (token.empty()) {
@@ -453,12 +454,9 @@ enum CopyStatus {
 };
 
 
-std::pair<CopyStatus, string> const
-copyFileIfNeeded(string const & file_in, string const & file_out)
+std::pair<CopyStatus, FileName> const
+copyFileIfNeeded(FileName const & file_in, FileName const & file_out)
 {
-       BOOST_ASSERT(absolutePath(file_in));
-       BOOST_ASSERT(absolutePath(file_out));
-
        unsigned long const checksum_in  = support::sum(file_in);
        unsigned long const checksum_out = support::sum(file_out);
 
@@ -466,14 +464,14 @@ copyFileIfNeeded(string const & file_in, string const & file_out)
                // Nothing to do...
                return std::make_pair(IDENTICAL_CONTENTS, file_out);
 
-       Mover const & mover = movers(formats.getFormatFromFile(file_in));
+       Mover const & mover = getMover(formats.getFormatFromFile(file_in));
        bool const success = mover.copy(file_in, file_out);
        if (!success) {
                // FIXME UNICODE
-               lyxerr[Debug::GRAPHICS]
+               LYXERR(Debug::GRAPHICS)
                        << to_utf8(support::bformat(_("Could not copy the file\n%1$s\n"
                                                           "into the temporary directory."),
-                                           from_utf8(file_in)))
+                                               from_utf8(file_in.absFilename())))
                        << std::endl;
        }
 
@@ -482,8 +480,8 @@ copyFileIfNeeded(string const & file_in, string const & file_out)
 }
 
 
-std::pair<CopyStatus, string> const
-copyToDirIfNeeded(FileName const & file, string const & dir)
+std::pair<CopyStatus, FileName> const
+copyToDirIfNeeded(DocFileName const & file, string const & dir)
 {
        using support::rtrim;
 
@@ -504,17 +502,20 @@ copyToDirIfNeeded(FileName const & file, string const & dir)
                string::size_type const ext_len = file_in.length() - base.length();
                mangled[mangled.length() - ext_len] = '.';
        }
-       string const file_out = support::makeAbsPath(mangled, dir);
+       FileName const file_out(support::makeAbsPath(mangled, dir));
 
-       return copyFileIfNeeded(file_in, file_out);
+       return copyFileIfNeeded(file, file_out);
 }
 
 
-string const stripExtensionIfPossible(string const & file)
+string const stripExtensionIfPossible(string const & file, bool nice)
 {
-       // Remove the extension so the LaTeX will use whatever
-       // is appropriate (when there are several versions in
-       // different formats)
+       // Remove the extension so the LaTeX compiler will use whatever
+       // is appropriate (when there are several versions in different
+       // formats).
+       // Do this only if we are not exporting for internal usage, because
+       // pdflatex prefers png over pdf and it would pick up the png images
+       // that we generate for preview.
        // This works only if the filename contains no dots besides
        // the just removed one. We can fool here by replacing all
        // dots with a macro whose definition is just a dot ;-)
@@ -522,7 +523,7 @@ string const stripExtensionIfPossible(string const & file)
        // name is escaped.
        string const latex_name = latex_path(file,
                                             support::EXCLUDE_EXTENSION);
-       if (contains(latex_name, '"'))
+       if (!nice || contains(latex_name, '"'))
                return latex_name;
        return latex_path(removeExtension(file),
                          support::PROTECT_EXTENSION,
@@ -530,7 +531,7 @@ string const stripExtensionIfPossible(string const & file)
 }
 
 
-string const stripExtensionIfPossible(string const & file, string const & to)
+string const stripExtensionIfPossible(string const & file, string const & to, bool nice)
 {
        // No conversion is needed. LaTeX can handle the graphic file as is.
        // This is true even if the orig_file is compressed.
@@ -540,7 +541,7 @@ string const stripExtensionIfPossible(string const & file, string const & to)
        if (to_format == file_format ||
            (to_format == "eps" && file_format ==  "ps") ||
            (to_format ==  "ps" && file_format == "eps"))
-               return stripExtensionIfPossible(file);
+               return stripExtensionIfPossible(file, nice);
        return latex_path(file, support::EXCLUDE_EXTENSION);
 }
 
@@ -559,11 +560,11 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
 
        // previewing source code, no file copying or file format conversion
        if (runparams.dryrun)
-               return stripExtensionIfPossible(rel_file);
+               return stripExtensionIfPossible(rel_file, runparams.nice);
 
        // temp_file will contain the file for LaTeX to act on if, for example,
        // we move it to a temp dir or uncompress it.
-       string temp_file = orig_file;
+       FileName temp_file = params().filename;
 
        // The master buffer. This is useful when there are multiple levels
        // of include files
@@ -573,7 +574,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
        // not exist.
        // We are not going to change the extension or using the name of the
        // temporary file, the code is already complicated enough.
-       if (runparams.inComment || !isFileReadable(orig_file))
+       if (runparams.inComment || !isFileReadable(params().filename))
                return params().filename.outputFilename(m_buffer->filePath());
 
        // We place all temporary files in the master buffer's temp dir.
@@ -594,8 +595,8 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
        //        run through the LaTeX compiler.
        string output_file = support::os::external_path(runparams.nice ?
                params().filename.outputFilename(m_buffer->filePath()) :
-               onlyFilename(temp_file));
-       string source_file = runparams.nice ? orig_file : temp_file;
+               onlyFilename(temp_file.absFilename()));
+       FileName source_file = runparams.nice ? FileName(params().filename) : temp_file;
        string const tex_format = (runparams.flavor == OutputParams::LATEX) ?
                        "latex" : "pdflatex";
 
@@ -608,10 +609,10 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                        // this file, but we can't check, because that would
                        // mean to unzip the file and thereby making the
                        // noUnzip parameter meaningless.
-                       lyxerr[Debug::GRAPHICS]
+                       LYXERR(Debug::GRAPHICS)
                                << "\tpass zipped file to LaTeX.\n";
 
-                       string const bb_orig_file = changeExtension(orig_file, "bb");
+                       FileName const bb_orig_file = FileName(changeExtension(orig_file, "bb"));
                        if (runparams.nice) {
                                runparams.exportdata->addExternalFile(tex_format,
                                                bb_orig_file,
@@ -619,7 +620,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                        } else {
                                // LaTeX needs the bounding box file in the
                                // tmp dir
-                               string bb_file = changeExtension(temp_file, "bb");
+                               FileName bb_file = FileName(changeExtension(temp_file.absFilename(), "bb"));
                                boost::tie(status, bb_file) =
                                        copyFileIfNeeded(bb_orig_file, bb_file);
                                if (status == FAILURE)
@@ -637,53 +638,54 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                                          support::EXCLUDE_EXTENSION);
                }
 
-               string const unzipped_temp_file = unzippedFileName(temp_file);
+               FileName const unzipped_temp_file =
+                       FileName(unzippedFileName(temp_file.absFilename()));
                output_file = unzippedFileName(output_file);
-               source_file = unzippedFileName(source_file);
+               source_file = FileName(unzippedFileName(source_file.absFilename()));
                if (compare_timestamps(unzipped_temp_file, temp_file) > 0) {
                        // temp_file has been unzipped already and
                        // orig_file has not changed in the meantime.
                        temp_file = unzipped_temp_file;
-                       lyxerr[Debug::GRAPHICS]
+                       LYXERR(Debug::GRAPHICS)
                                << "\twas already unzipped to " << temp_file
                                << endl;
                } else {
                        // unzipped_temp_file does not exist or is too old
                        temp_file = unzipFile(temp_file);
-                       lyxerr[Debug::GRAPHICS]
+                       LYXERR(Debug::GRAPHICS)
                                << "\tunzipped to " << temp_file << endl;
                }
        }
 
        string const from = formats.getFormatFromFile(temp_file);
        if (from.empty()) {
-               lyxerr[Debug::GRAPHICS]
+               LYXERR(Debug::GRAPHICS)
                        << "\tCould not get file format." << endl;
        }
        string const to   = findTargetFormat(from, runparams);
        string const ext  = formats.extension(to);
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "\t we have: from " << from << " to " << to << '\n';
 
        // We're going to be running the exported buffer through the LaTeX
        // compiler, so must ensure that LaTeX can cope with the graphics
        // file format.
 
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "\tthe orig file is: " << orig_file << endl;
 
        if (from == to) {
-               if (!runparams.nice && getExtension(temp_file) != ext) {
+               if (!runparams.nice && getExtension(temp_file.absFilename()) != ext) {
                        // The LaTeX compiler will not be able to determine
                        // the file format from the extension, so we must
                        // change it.
-                       string const new_file = changeExtension(temp_file, ext);
+                       FileName const new_file = FileName(changeExtension(temp_file.absFilename(), ext));
                        if (support::rename(temp_file, new_file)) {
                                temp_file = new_file;
                                output_file = changeExtension(output_file, ext);
-                               source_file = changeExtension(source_file, ext);
+                               source_file = FileName(changeExtension(source_file.absFilename(), ext));
                        } else
-                               lyxerr[Debug::GRAPHICS]
+                               LYXERR(Debug::GRAPHICS)
                                        << "Could not rename file `"
                                        << temp_file << "' to `" << new_file
                                        << "'." << endl;
@@ -693,17 +695,17 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                                                      output_file);
                runparams.exportdata->addExternalFile("dvi", source_file,
                                                      output_file);
-               return stripExtensionIfPossible(output_file, to);
+               return stripExtensionIfPossible(output_file, to, runparams.nice);
        }
 
-       string const to_file = changeExtension(temp_file, ext);
+       FileName const to_file = FileName(changeExtension(temp_file.absFilename(), 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
        if (compare_timestamps(temp_file, to_file) < 0) {
                // FIXME UNICODE
-               lyxerr[Debug::GRAPHICS]
+               LYXERR(Debug::GRAPHICS)
                        << to_utf8(bformat(_("No conversion of %1$s is needed after all"),
                                   from_utf8(rel_file)))
                        << std::endl;
@@ -711,10 +713,10 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                                                      output_to_file);
                runparams.exportdata->addExternalFile("dvi", to_file,
                                                      output_to_file);
-               return stripExtensionIfPossible(output_file);
+               return stripExtensionIfPossible(output_to_file, runparams.nice);
        }
 
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "\tThe original file is " << orig_file << "\n"
                << "\tA copy has been made and convert is to be called with:\n"
                << "\tfile to convert = " << temp_file << '\n'
@@ -722,7 +724,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
 
        // FIXME (Abdel 12/08/06): Is there a need to show these errors?
        ErrorList el;
-       if (converters.convert(&buf, temp_file, to_file, orig_file,
+       if (theConverters().convert(&buf, temp_file, to_file, params().filename,
                               from, to, el,
                               Converters::try_default | Converters::try_cache)) {
                runparams.exportdata->addExternalFile(tex_format,
@@ -731,31 +733,31 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
                                to_file, output_to_file);
        }
 
-       return stripExtensionIfPossible(output_file);
+       return stripExtensionIfPossible(output_to_file, runparams.nice);
 }
 
 
 int InsetGraphics::latex(Buffer const & buf, odocstream & os,
-                        OutputParams const & runparams) const
+                         OutputParams const & runparams) const
 {
        // If there is no file specified or not existing,
        // just output a message about it in the latex output.
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "insetgraphics::latex: Filename = "
                << params().filename.absFilename() << endl;
 
        string const relative_file =
                params().filename.relFilename(buf.filePath());
 
-       string const file_ = params().filename.absFilename();
-       bool const file_exists = !file_.empty() && isFileReadable(file_);
+       bool const file_exists = !params().filename.empty() &&
+                                isFileReadable(params().filename);
        string const message = file_exists ?
                string() : string("bb = 0 0 200 100, draft, type=eps");
        // if !message.empty() then there was no existing file
        // "filename" found. In this case LaTeX
        // draws only a rectangle with the above bb and the
        // not found filename in it.
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "\tMessage = \"" << message << '\"' << endl;
 
        // These variables collect all the latex code that should be before and
@@ -778,14 +780,14 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os,
 
        // Write the options if there are any.
        string const opts = createLatexOptions();
-       lyxerr[Debug::GRAPHICS] << "\tOpts = " << opts << endl;
+       LYXERR(Debug::GRAPHICS) << "\tOpts = " << opts << endl;
 
        if (!opts.empty() && !message.empty())
                before += ('[' + opts + ',' + message + ']');
        else if (!opts.empty() || !message.empty())
                before += ('[' + opts + message + ']');
 
-       lyxerr[Debug::GRAPHICS]
+       LYXERR(Debug::GRAPHICS)
                << "\tBefore = " << before
                << "\n\tafter = " << after << endl;
 
@@ -798,7 +800,7 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os,
        // FIXME UNICODE
        os << from_utf8(latex_str);
 
-       lyxerr[Debug::GRAPHICS] << "InsetGraphics::latex outputting:\n"
+       LYXERR(Debug::GRAPHICS) << "InsetGraphics::latex outputting:\n"
                                << latex_str << endl;
        // Return how many newlines we issued.
        return int(lyx::count(latex_str.begin(), latex_str.end(),'\n'));
@@ -806,7 +808,7 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os,
 
 
 int InsetGraphics::plaintext(Buffer const &, odocstream & os,
-                        OutputParams const &) const
+                             OutputParams const &) const
 {
        // No graphics in ascii output. Possible to use gifscii to convert
        // images to ascii approximation.
@@ -815,10 +817,12 @@ int InsetGraphics::plaintext(Buffer const &, odocstream & os,
        // at least we send the filename
        // FIXME UNICODE
        // FIXME: We have no idea what the encoding of the filename is
-       os << '<' << bformat(_("Graphics file: %1$s"),
-                            from_utf8(params().filename.absFilename()))
-          << ">\n";
-       return 0;
+
+       docstring const str = bformat(_("Graphics file: %1$s"),
+                                     from_utf8(params().filename.absFilename()));
+       os << '<' << str << '>';
+
+       return 2 + str.size();
 }
 
 
@@ -866,10 +870,10 @@ int InsetGraphics::docbook(Buffer const &, odocstream & os,
        // easier to use.
        if (runparams.flavor == OutputParams::XML) {
                runparams.exportdata->addExternalFile("docbook-xml",
-                                                     params().filename.absFilename());
+                                                     params().filename);
        } else {
                runparams.exportdata->addExternalFile("docbook",
-                                                     params().filename.absFilename());
+                                                     params().filename);
        }
        os << "<inlinemediaobject>";
 
@@ -934,9 +938,8 @@ InsetGraphicsParams const & InsetGraphics::params() 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,
-                    formats.getFormatFromFile(file_with_path));
+       formats.edit(buffer, p.filename,
+                    formats.getFormatFromFile(p.filename));
 }