diff --git a/src/Gui/ViewProviderImagePlane.cpp b/src/Gui/ViewProviderImagePlane.cpp index 0f16a3afc2..7ed4e9c00f 100644 --- a/src/Gui/ViewProviderImagePlane.cpp +++ b/src/Gui/ViewProviderImagePlane.cpp @@ -28,6 +28,7 @@ # include # include # include +# include # include # include # include @@ -179,44 +180,39 @@ void ViewProviderImagePlane::loadImage() std::string fileName = imagePlane->ImageFile.getValue(); if (!fileName.empty()) { - double xsize = imagePlane->XSize.getValue(); - double ysize = imagePlane->YSize.getValue(); - QImage impQ; - if (!loadSvg(fileName.c_str(), xsize, ysize, impQ)) { - QSizeF size = loadRaster(fileName.c_str(), impQ); - if (!impQ.isNull()) { - if (!isRestoring()) { - imagePlane->XSize.setValue(size.width()); - imagePlane->YSize.setValue(size.height()); - } - - imagePlane->XPixelsPerMeter = impQ.dotsPerMeterX(); - imagePlane->YPixelsPerMeter = impQ.dotsPerMeterY(); - } + if (isSvgFile(fileName.c_str())) { + impQ = loadSvg(fileName.c_str()); + } + else { + impQ = loadRaster(fileName.c_str()); } + QSizeF size = getSizeInMM(impQ); + setPlaneSize(size, impQ); convertToSFImage(impQ); } } -QSizeF ViewProviderImagePlane::loadRaster(const char* fileName, QImage& img) +void ViewProviderImagePlane::setPlaneSize(const QSizeF& size, const QImage& img) { - QSizeF sizef; - if (img.load(QString::fromUtf8(fileName))) { - double xPixelsPerM = img.dotsPerMeterX(); - double width = img.width(); - width = width * 1000 / xPixelsPerM; + if (!img.isNull()) { + Image::ImagePlane* imagePlane = static_cast(pcObject); + if (!isRestoring()) { + imagePlane->XSize.setValue(size.width()); + imagePlane->YSize.setValue(size.height()); + } - double yPixelsPerM = img.dotsPerMeterY(); - double height = img.height(); - height = height * 1000 / yPixelsPerM; - - sizef.setWidth(width); - sizef.setHeight(height); + imagePlane->XPixelsPerMeter = img.dotsPerMeterX(); + imagePlane->YPixelsPerMeter = img.dotsPerMeterY(); } +} - return sizef; +QImage ViewProviderImagePlane::loadRaster(const char* fileName) const +{ + QImage img; + img.load(QString::fromUtf8(fileName)); + return img; } void ViewProviderImagePlane::reloadIfSvg() @@ -224,32 +220,75 @@ void ViewProviderImagePlane::reloadIfSvg() Image::ImagePlane* imagePlane = static_cast(pcObject); std::string fileName = imagePlane->ImageFile.getValue(); - double xsize = imagePlane->XSize.getValue(); - double ysize = imagePlane->YSize.getValue(); + if (isSvgFile(fileName.c_str())) { + double xsize = imagePlane->XSize.getValue(); + double ysize = imagePlane->YSize.getValue(); - QImage impQ; - loadSvg(fileName.c_str(), xsize, ysize, impQ); - convertToSFImage(impQ); + QImage impQ = loadSvgOfSize(fileName.c_str(), QSizeF(xsize, ysize)); + convertToSFImage(impQ); + } } -bool ViewProviderImagePlane::loadSvg(const char* filename, double width, double height, QImage& img) +QImage ViewProviderImagePlane::loadSvg(const char* filename) const +{ + QSizeF defaultSize = defaultSizeOfSvg(filename); + QPixmap px = BitmapFactory().pixmapFromSvg(filename, defaultSize); + return px.toImage(); +} + +QImage ViewProviderImagePlane::loadSvgOfSize(const char* filename, const QSizeF& size) const +{ + QSizeF psize = pixelSize(filename, size); + QPixmap px = BitmapFactory().pixmapFromSvg(filename, psize); + return px.toImage(); +} + +bool ViewProviderImagePlane::isSvgFile(const char* filename) const { QFileInfo fi(QString::fromUtf8(filename)); - if (fi.suffix().toLower() == QLatin1String("svg")) { - QImage tmp; - if (tmp.load(QString::fromUtf8(filename))) { - double xPixelsPerM = tmp.dotsPerMeterX(); - double yPixelsPerM = tmp.dotsPerMeterY(); - width = width * xPixelsPerM / 1000; - height = height * yPixelsPerM / 1000; - } + return (fi.suffix().toLower() == QLatin1String("svg")); +} - QPixmap px = BitmapFactory().pixmapFromSvg(filename, QSizeF(width, height)); - img = px.toImage(); - return true; +QSizeF ViewProviderImagePlane::defaultSizeOfSvg(const char* filename) const +{ + QSvgRenderer svg; + svg.load(QString::fromUtf8(filename)); + return svg.defaultSize(); +} + +QSizeF ViewProviderImagePlane::getSizeInMM(const QImage& img) const +{ + double xPixelsPerM = img.dotsPerMeterX(); + double width = img.width(); + width = width * 1000 / xPixelsPerM; + + double yPixelsPerM = img.dotsPerMeterY(); + double height = img.height(); + height = height * 1000 / yPixelsPerM; + + QSizeF sizef; + sizef.setWidth(width); + sizef.setHeight(height); + return sizef; +} + +QSizeF ViewProviderImagePlane::pixelSize(const char* filename, const QSizeF& size) const +{ + QImage tmp; + if (tmp.load(QString::fromUtf8(filename))) { + double xPixelsPerM = tmp.dotsPerMeterX(); + double yPixelsPerM = tmp.dotsPerMeterY(); + + double width = size.width(); + double height = size.height(); + + width = width * xPixelsPerM / 1000; + height = height * yPixelsPerM / 1000; + + return {width, height}; } - return false; + return size; } void ViewProviderImagePlane::convertToSFImage(const QImage& img) diff --git a/src/Gui/ViewProviderImagePlane.h b/src/Gui/ViewProviderImagePlane.h index b0f4bec6fa..00316bfee8 100644 --- a/src/Gui/ViewProviderImagePlane.h +++ b/src/Gui/ViewProviderImagePlane.h @@ -56,9 +56,15 @@ public: private: void resizePlane(float xsize, float ysize); void loadImage(); + void setPlaneSize(const QSizeF& size, const QImage& img); void reloadIfSvg(); - bool loadSvg(const char*, double x, double y, QImage& img); - QSizeF loadRaster(const char*, QImage& img); + bool isSvgFile(const char*) const; + QSizeF getSizeInMM(const QImage&) const; + QSizeF defaultSizeOfSvg(const char*) const; + QSizeF pixelSize(const char*, const QSizeF&) const; + QImage loadSvg(const char*) const; + QImage loadSvgOfSize(const char*, const QSizeF&) const; + QImage loadRaster(const char*) const; void convertToSFImage(const QImage& img); void manipulateImage();