X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiImage.cpp;h=e7defe7ec585933bd5d3cb5dcd6e5230c5ecb97d;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=80cb94f9198b2482eae368bb76b409d100cf9ef2;hpb=5013a5cef9aaebf947bf2aaa9a693b1404559c71;p=lyx.git diff --git a/src/frontends/qt4/GuiImage.cpp b/src/frontends/qt4/GuiImage.cpp index 80cb94f919..e7defe7ec5 100644 --- a/src/frontends/qt4/GuiImage.cpp +++ b/src/frontends/qt4/GuiImage.cpp @@ -23,7 +23,6 @@ #include "support/lstrings.h" // ascii_lowercase #include -#include #include using namespace std; @@ -32,16 +31,21 @@ using namespace lyx::support; namespace lyx { namespace graphics { -/// Access to this class is through this static method. -Image * GuiImage::newImage() +/// Implement factory method defined in GraphicsImage.h +Image * newImage() { return new GuiImage; } +GuiImage::GuiImage() : is_transformed_(false) +{} + + GuiImage::GuiImage(GuiImage const & other) : Image(other), original_(other.original_), - transformed_(other.transformed_), is_transformed_(other.is_transformed_) + transformed_(other.transformed_), is_transformed_(other.is_transformed_), + fname_(other.fname_) {} @@ -51,6 +55,12 @@ Image * GuiImage::clone() const } +QImage const & GuiImage::image() const +{ + return is_transformed_ ? transformed_ : original_; +} + + unsigned int GuiImage::width() const { return is_transformed_ ? transformed_.width() : original_.width(); @@ -69,9 +79,13 @@ bool GuiImage::load(FileName const & filename) LYXERR(Debug::GRAPHICS, "Image is loaded already!"); return false; } - fname_ = toqstr(filename.absFilename()); + return load(); +} + +bool GuiImage::load() +{ if (!original_.load(fname_)) { LYXERR(Debug::GRAPHICS, "Unable to open image"); return false; @@ -86,7 +100,7 @@ bool GuiImage::setPixmap(Params const & params) return false; if (original_.isNull()) { - if (!original_.load(fname_)) + if (!load()) return false; } @@ -96,9 +110,9 @@ bool GuiImage::setPixmap(Params const & params) // Clear the pixmap to save some memory. if (is_transformed_) - original_ = QPixmap(); + original_ = QImage(); else - transformed_ = QPixmap(); + transformed_ = QImage(); return true; } @@ -113,22 +127,23 @@ bool GuiImage::clip(Params const & params) int const new_width = params.bb.xr - params.bb.xl; int const new_height = params.bb.yt - params.bb.yb; + QImage const & image = is_transformed_ ? transformed_ : original_; + // No need to check if the width, height are > 0 because the // Bounding Box would be empty() in this case. - if (new_width > original_.width() || new_height > original_.height()) { + if (new_width > image.width() || new_height > image.height()) { // Bounds are invalid. return false; } - if (new_width == original_.width() && new_height == original_.height()) + if (new_width == image.width() && new_height == image.height()) return false; int const xoffset_l = params.bb.xl; - int const yoffset_t = (original_.height() > int(params.bb.yt) ? - original_.height() - params.bb.yt : 0); + int const yoffset_t = (image.height() > int(params.bb.yt)) + ? image.height() - params.bb.yt : 0; - transformed_ = original_.copy(xoffset_l, yoffset_t, - new_width, new_height); + transformed_ = image.copy(xoffset_l, yoffset_t, new_width, new_height); return true; } @@ -138,30 +153,33 @@ bool GuiImage::rotate(Params const & params) if (!params.angle) return false; - if (!is_transformed_) - transformed_ = original_; - + QImage const & image = is_transformed_ ? transformed_ : original_; QMatrix m; - m.rotate(-params.angle); - transformed_ = transformed_.transformed(m); + m.rotate(- params.angle); + transformed_ = image.transformed(m); return true; } bool GuiImage::scale(Params const & params) { - Dimension dim = scaledDimension(params); + QImage const & image = is_transformed_ ? transformed_ : original_; - if (dim.width() == width() && dim.height() == height()) + if (params.scale == 100) return false; - if (!is_transformed_) - transformed_ = original_; + qreal scale = qreal(params.scale) / 100.0; - QMatrix m; - m.scale(double(dim.width()) / width(), double(dim.height()) / height()); - transformed_ = transformed_.transformed(m); +#if (QT_VERSION >= 0x040500) && (QT_VERSION <= 0x040502) + // Due to a bug in Qt, LyX will crash for certain + // scaling factors and sizes of the image. + // see bug #5957: http://www.lyx.org/trac/ticket/5957 + scale += 0.0001; +#endif + QMatrix m; + m.scale(scale, scale); + transformed_ = image.transformed(m); return true; }