lyx_mirror/src/graphics/epstools.cpp
Vincent van Ravesteijn f0754582b8 Fix bug #8114: LyX does not retrieve negative bbox parameters
LyX fails to read the bounding box from an EPS file if it has
negative values. Adjusting the regex will overcome this problem.
Negative values do not pose big problems later on, but the GUI
doesn't handle it correctly yet (see bug #5718).
2012-04-08 23:20:01 +02:00

91 lines
2.4 KiB
C++

/**
* \file epstools.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* parts Copyright 1985, 1990, 1993 Free Software Foundation, Inc.
*
* \author Ivan Schreter
* \author Dirk Niggemann
* \author Asger Alstrup
* \author Lars Gullik Bjønnes
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
* \author John Levon
* \author Herbert Voß
*
* Full author contact details are available in file CREDITS.
*
* Utilities for manipulation of Encapsulated Postscript files
*/
#include <config.h>
#include "graphics/epstools.h"
#include "Format.h"
#include "support/debug.h"
#include "support/filetools.h"
#include "support/FileName.h"
#include "support/regex.h"
using namespace std;
using namespace lyx::support;
namespace lyx {
namespace graphics {
string const readBB_from_PSFile(FileName const & file)
{
// in a (e)ps-file it's an entry like %%BoundingBox:23 45 321 345
// It seems that every command in the header has an own line,
// getline() should work for all files.
// On the other hand some plot programs write the bb at the
// end of the file. Than we have in the header:
// %%BoundingBox: (atend)
// In this case we must check the end.
bool const zipped = formats.isZippedFile(file);
FileName const file_ = zipped ? unzipFile(file) : file;
string const format = formats.getFormatFromFile(file_);
if (!Formats::isPostScriptFileFormat(format)) {
LYXERR(Debug::GRAPHICS, "[readBB_from_PSFile] no(e)ps-format");
if (zipped)
file_.removeFile();
return string();
}
static lyx::regex bbox_re("^%%BoundingBox:\\s*([-]*[[:digit:]]+)"
"\\s+([-]*[[:digit:]]+)\\s+([-]*[[:digit:]]+)\\s+([-]*[[:digit:]]+)");
ifstream is(file_.toFilesystemEncoding().c_str());
while (is) {
string s;
getline(is,s);
lyx::smatch what;
if (regex_match(s, what, bbox_re)) {
// Our callers expect the tokens in the string
// separated by single spaces.
// FIXME: change return type from string to something
// sensible
ostringstream os;
os << what.str(1) << ' ' << what.str(2) << ' '
<< what.str(3) << ' ' << what.str(4);
string const bb = os.str();
LYXERR(Debug::GRAPHICS, "[readBB_from_PSFile] " << bb);
if (zipped)
file_.removeFile();
return bb;
}
}
LYXERR(Debug::GRAPHICS, "[readBB_from_PSFile] no bb found");
if (zipped)
file_.removeFile();
return string();
}
} // namespace graphics
} // namespace lyx