Store InsetGraphics bounding box in parsed form

This is like InsetExternal does it, avoids some string parsing, reduces the
amount of code and makes it more robust.
This commit is contained in:
Georg Baum 2015-07-18 17:02:54 +02:00
parent bf515425e1
commit dc6d201f8f
4 changed files with 45 additions and 68 deletions

View File

@ -525,7 +525,7 @@ void GuiGraphics::paramsToDialog(InsetGraphicsParams const & igp)
filename->setText(toqstr(name));
// set the bounding box values
if (igp.bb.empty()) {
if (igp.bbox.empty()) {
string const bb = readBoundingBox(igp.filename.absFileName());
// the values from the file always have the bigpoint-unit bp
doubleToWidget(lbX, token(bb, ' ', 0));
@ -539,39 +539,18 @@ void GuiGraphics::paramsToDialog(InsetGraphicsParams const & igp)
bbChanged = false;
} else {
// get the values from the inset
Length anyLength;
string const xl = token(igp.bb, ' ', 0);
string const yl = token(igp.bb, ' ', 1);
string const xr = token(igp.bb, ' ', 2);
string const yr = token(igp.bb, ' ', 3);
if (isValidLength(xl, &anyLength)) {
doubleToWidget(lbX, anyLength.value());
string const unit = unit_name[anyLength.unit()];
lbXunit->setCurrentIndex(lbXunit->findData(toqstr(unit)));
} else {
lbX->setText(toqstr(xl));
}
if (isValidLength(yl, &anyLength)) {
doubleToWidget(lbY, anyLength.value());
string const unit = unit_name[anyLength.unit()];
lbYunit->setCurrentIndex(lbYunit->findData(toqstr(unit)));
} else {
lbY->setText(toqstr(xl));
}
if (isValidLength(xr, &anyLength)) {
doubleToWidget(rtX, anyLength.value());
string const unit = unit_name[anyLength.unit()];
rtXunit->setCurrentIndex(rtXunit->findData(toqstr(unit)));
} else {
rtX->setText(toqstr(xl));
}
if (isValidLength(yr, &anyLength)) {
doubleToWidget(rtY, anyLength.value());
string const unit = unit_name[anyLength.unit()];
rtYunit->setCurrentIndex(rtYunit->findData(toqstr(unit)));
} else {
rtY->setText(toqstr(xl));
}
doubleToWidget(lbX, igp.bbox.xl.value());
string unit = unit_name[igp.bbox.xl.unit()];
lbXunit->setCurrentIndex(lbXunit->findData(toqstr(unit)));
doubleToWidget(lbY, igp.bbox.yb.value());
unit = unit_name[igp.bbox.yb.unit()];
lbYunit->setCurrentIndex(lbYunit->findData(toqstr(unit)));
doubleToWidget(rtX, igp.bbox.xr.value());
unit = unit_name[igp.bbox.xr.unit()];
rtXunit->setCurrentIndex(rtXunit->findData(toqstr(unit)));
doubleToWidget(rtY, igp.bbox.yt.value());
unit = unit_name[igp.bbox.yt.unit()];
rtYunit->setCurrentIndex(rtYunit->findData(toqstr(unit)));
bbChanged = true;
}
@ -673,7 +652,7 @@ void GuiGraphics::applyView()
igp.filename.set(fromqstr(filename->text()), fromqstr(bufferFilePath()));
// the bb section
igp.bb.erase();
igp.bbox = graphics::BoundingBox();
if (bbChanged) {
string bb;
string lbXs = widgetToDoubleStr(lbX);
@ -685,22 +664,17 @@ void GuiGraphics::applyView()
convert<int>(rtXs) + convert<int>(rtXs);
if (bb_sum) {
if (lbXs.empty())
bb = "0 ";
else
bb = lbXs + fromqstr(lbXunit->currentText()) + ' ';
lbXs = "0";
igp.bbox.xl = Length(lbXs + fromqstr(lbXunit->currentText()));
if (lbYs.empty())
bb += "0 ";
else
bb += (lbYs + fromqstr(lbYunit->currentText()) + ' ');
lbYs = "0";
igp.bbox.yb = Length(lbYs + fromqstr(lbYunit->currentText()));
if (rtXs.empty())
bb += "0 ";
else
bb += (rtXs + fromqstr(rtXunit->currentText()) + ' ');
rtXs = "0";
igp.bbox.xr = Length(rtXs + fromqstr(rtXunit->currentText()));
if (rtYs.empty())
bb += '0';
else
bb += (rtYs + fromqstr(rtYunit->currentText()));
igp.bb = bb;
rtYs = "0";
igp.bbox.yt = Length(rtYs + fromqstr(rtYunit->currentText()));
}
}

View File

@ -310,8 +310,11 @@ string InsetGraphics::createLatexOptions() const
// stream since we might have a trailing comma that we would like to remove
// before writing it to the output stream.
ostringstream options;
if (!params().bb.empty())
options << "bb=" << rtrim(params().bb) << ',';
if (!params().bbox.empty())
options << "bb=" << params().bbox.xl.asLatexString() << ' '
<< params().bbox.yb.asLatexString() << ' '
<< params().bbox.xr.asLatexString() << ' '
<< params().bbox.yt.asLatexString() << ',';
if (params().draft)
options << "draft,";
if (params().clip)
@ -734,7 +737,7 @@ void InsetGraphics::latex(otexstream & os,
&& params().filename.isReadableFile();
string message;
if (!file_exists) {
if (params().bb.empty())
if (params().bbox.empty())
message = "bb = 0 0 200 100";
if (!params().draft) {
if (!message.empty())

View File

@ -19,7 +19,6 @@
#include "LyXRC.h"
#include "graphics/epstools.h"
#include "graphics/GraphicsParams.h"
#include "graphics/GraphicsTypes.h"
#include "support/convert.h"
@ -72,7 +71,7 @@ void InsetGraphicsParams::init()
draft = false; // draft mode
scaleBeforeRotation = false; // scale image before rotating
bb = string(); // bounding box
bbox = graphics::BoundingBox(); // bounding box
clip = false; // clip image
rotateAngle = "0"; // angle of rotation in degrees
@ -94,7 +93,7 @@ void InsetGraphicsParams::copy(InsetGraphicsParams const & igp)
draft = igp.draft;
scaleBeforeRotation = igp.scaleBeforeRotation;
bb = igp.bb;
bbox = igp.bbox;
clip = igp.clip;
rotateAngle = igp.rotateAngle;
@ -117,7 +116,7 @@ bool operator==(InsetGraphicsParams const & left,
left.draft == right.draft &&
left.scaleBeforeRotation == right.scaleBeforeRotation &&
left.bb == right.bb &&
left.bbox == right.bbox &&
left.clip == right.clip &&
left.rotateAngle == right.rotateAngle &&
@ -160,8 +159,8 @@ void InsetGraphicsParams::Write(ostream & os, Buffer const & buffer) const
if (scaleBeforeRotation)
os << "\tscaleBeforeRotation\n";
if (!bb.empty()) // bounding box
os << "\tBoundingBox " << bb << '\n';
if (!bbox.empty()) // bounding box
os << "\tBoundingBox " << bbox << '\n';
if (clip) // clip image
os << "\tclip\n";
@ -207,13 +206,14 @@ bool InsetGraphicsParams::Read(Lexer & lex, string const & token, string const &
} else if (token == "scaleBeforeRotation") {
scaleBeforeRotation = true;
} else if (token == "BoundingBox") {
bb.erase();
for (int i = 0; i < 4; ++i) {
if (i != 0)
bb += ' ';
lex.next();
bb += lex.getString();
}
lex.next();
bbox.xl = Length(lex.getString());
lex.next();
bbox.yb = Length(lex.getString());
lex.next();
bbox.xr = Length(lex.getString());
lex.next();
bbox.yt = Length(lex.getString());
} else if (token == "clip") {
clip = true;
} else if (token == "rotateAngle") {
@ -252,7 +252,7 @@ graphics::Params InsetGraphicsParams::as_grfxParams() const
pars.angle = convert<double>(rotateAngle);
if (clip) {
pars.bb = bb;
pars.bb = bbox;
// Get the original Bounding Box from the file
string const tmp = graphics::readBB_from_PSFile(filename);

View File

@ -14,7 +14,7 @@
#define INSETGRAPHICSPARAMS_H
#include "Length.h"
#include "graphics/GraphicsParams.h"
#include "support/FileName.h"
@ -51,8 +51,8 @@ public:
/// scale image before rotating
bool scaleBeforeRotation;
/// The bounding box with "xLB yLB yRT yRT ", divided by a space!
std::string bb;
/// The bounding box
graphics::BoundingBox bbox;
/// clip image
bool clip;