diff --git a/Polyhedron/demo/Polyhedron/MainWindow.ui b/Polyhedron/demo/Polyhedron/MainWindow.ui
index 0b35485062d..b49869d2820 100644
--- a/Polyhedron/demo/Polyhedron/MainWindow.ui
+++ b/Polyhedron/demo/Polyhedron/MainWindow.ui
@@ -579,7 +579,7 @@
Re¢er Scene
- Ctrl+C
+ Ctrl+R
diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp
index 67e2fb3b668..d0a2d649256 100644
--- a/Polyhedron/demo/Polyhedron/Viewer.cpp
+++ b/Polyhedron/demo/Polyhedron/Viewer.cpp
@@ -30,6 +30,8 @@ public:
mutable std::vector shader_programs;
QMatrix4x4 projectionMatrix;
void setFrustum(double l, double r, double t, double b, double n, double f);
+ QImage* takeSnapshot(Viewer* viewer, int quality, int background_color, QSize size, double oversampling, bool expand);
+ void sendSnapshotToClibboard(Viewer*);
};
Viewer::Viewer(QWidget* parent, bool antialiasing)
: CGAL::Three::Viewer_interface(parent)
@@ -402,7 +404,19 @@ void Viewer::keyPressEvent(QKeyEvent* e)
else if(e->key() == Qt::Key_I && e->modifiers() & Qt::ControlModifier){
d->scene->printPrimitiveIds(this);
update();
- }
+ return;
+ }
+
+ else if(e->key() == Qt::Key_C && e->modifiers() & Qt::ControlModifier){
+ d->sendSnapshotToClibboard(this);
+ return;
+ }
+
+ else if(e->key() == Qt::Key_S && e->modifiers() & Qt::ControlModifier){
+ this->saveSnapshot(true,true);
+ return;
+ }
+
//forward the event to the scene (item handling of the event)
if (! d->scene->keyPressEvent(e) )
QGLViewer::keyPressEvent(e);
@@ -1522,7 +1536,6 @@ private Q_SLOTS:
void Viewer::saveSnapshot(bool, bool)
{
- GLfloat alpha = 1.0;
qreal aspectRatio = width() / static_cast(height());
static ImageInterface* imageInterface = NULL;
@@ -1531,83 +1544,86 @@ void Viewer::saveSnapshot(bool, bool)
imageInterface->imgWidth->setValue(width());
imageInterface->imgHeight->setValue(height());
-
imageInterface->imgQuality->setValue(snapshotQuality());
if (imageInterface->exec() == QDialog::Rejected)
return;
-
- setSnapshotQuality(imageInterface->imgQuality->value());
-
- QColor previousBGColor = backgroundColor();
- switch(imageInterface->color_comboBox->currentIndex())
- {
- case 0:
- break;
- case 1:
- this->setBackgroundColor(QColor(Qt::transparent));
- alpha = 0.0;
- break;
- case 2:
- QColor c = QColorDialog::getColor();
- if(c.isValid()) {
- setBackgroundColor(c);
- this->setBackgroundColor(c);
- }
- else return;
- break;
-
- }
QSize finalSize(imageInterface->imgWidth->value(), imageInterface->imgHeight->value());
-
- qreal oversampling = imageInterface->oversampling->value();
- QSize subSize(int(this->width()/oversampling), int(this->height()/oversampling));
-
-
+ bool expand = imageInterface->expandFrustum->isChecked();
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save Snapshot"), "", tr("Image Files (*.png *.jpg *.bmp)"));
if(fileName.isEmpty())
{
- setBackgroundColor(previousBGColor);
return;
}
+ QImage* image= d->takeSnapshot(this, imageInterface->imgQuality->value(), imageInterface->color_comboBox->currentIndex(),
+ finalSize, imageInterface->oversampling->value(), expand);
+ if(image)
+ {
+ image->save(fileName);
+ delete image;
+ }
- QSize size=QSize(width(), height());
+}
+//copy a snapshot with transparent background with arbitrary quality values.
+QImage* Viewer_impl::takeSnapshot(Viewer *viewer, int quality, int background_color, QSize finalSize, double oversampling, bool expand)
+{
+ qreal aspectRatio = viewer->width() / static_cast(viewer->height());
+ viewer->setSnapshotQuality(quality);
+ GLfloat alpha = 1.0f;
+ QColor previousBGColor = viewer->backgroundColor();
+ switch(background_color)
+ {
+ case 0:
+ break;
+ case 1:
+ viewer->setBackgroundColor(QColor(Qt::transparent));
+ alpha = 0.0f;
+ break;
+ case 2:
+ QColor c = QColorDialog::getColor();
+ if(c.isValid()) {
+ viewer->setBackgroundColor(c);
+ }
+ else
+ return NULL;
+ break;
+ }
+
+
+ QSize subSize(int(viewer->width()/oversampling), int(viewer->height()/oversampling));
+ QSize size=QSize(viewer->width(), viewer->height());
qreal newAspectRatio = finalSize.width() / static_cast(finalSize.height());
- qreal zNear = camera()->zNear();
- qreal zFar = camera()->zFar();
+ qreal zNear = viewer->camera()->zNear();
+ qreal zFar = viewer->camera()->zFar();
qreal xMin, yMin;
- bool expand = imageInterface->expandFrustum->isChecked();
if ((expand && (newAspectRatio>aspectRatio)) || (!expand && (newAspectRatiofieldOfView() / 2.0);
+ yMin = zNear * tan(viewer->camera()->fieldOfView() / 2.0);
xMin = newAspectRatio * yMin;
}
else
{
- xMin = zNear * tan(camera()->fieldOfView() / 2.0) * aspectRatio;
+ xMin = zNear * tan(viewer->camera()->fieldOfView() / 2.0) * aspectRatio;
yMin = xMin / newAspectRatio;
}
- QImage image(finalSize.width(), finalSize.height(), QImage::Format_ARGB32);
+ QImage *image = new QImage(finalSize.width(), finalSize.height(), QImage::Format_ARGB32);
- if (image.isNull())
+ if (image->isNull())
{
- QMessageBox::warning(this, "Image saving error",
+ QMessageBox::warning(viewer, "Image saving error",
"Unable to create resulting image",
QMessageBox::Ok, QMessageBox::NoButton);
- setBackgroundColor(previousBGColor);
- return;
+ viewer->setBackgroundColor(previousBGColor);
+ return NULL;
}
- // ProgressDialog disabled since it interfers with the screen grabing mecanism on some platforms. Too bad.
- // ProgressDialog::showProgressDialog(this);
- image.fill(qRgba(0,0,0,0));
qreal scaleX = subSize.width() / static_cast(finalSize.width());
qreal scaleY = subSize.height() / static_cast(finalSize.height());
@@ -1622,18 +1638,19 @@ void Viewer::saveSnapshot(bool, bool)
nbX++;
if (nbY * subSize.height() < finalSize.height())
nbY++;
+
QOpenGLFramebufferObject* fbo = new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::CombinedDepthStencil);
- makeCurrent();
+ viewer->makeCurrent();
int count=0;
for (int i=0; isetFrustum(-xMin + i*deltaX, -xMin + (i+1)*deltaX, yMin - j*deltaY, yMin - (j+1)*deltaY, zNear, zFar);
+ setFrustum(-xMin + i*deltaX, -xMin + (i+1)*deltaX, yMin - j*deltaY, yMin - (j+1)*deltaY, zNear, zFar);
fbo->bind();
- glClearColor(backgroundColor().redF(), backgroundColor().greenF(), backgroundColor().blueF(), alpha);
- preDraw();
- draw();
- postDraw();
+ viewer->glClearColor(viewer->backgroundColor().redF(), viewer->backgroundColor().greenF(), viewer->backgroundColor().blueF(), alpha);
+ viewer->preDraw();
+ viewer->draw();
+ viewer->postDraw();
fbo->release();
QImage snapshot = fbo->toImage();
@@ -1642,21 +1659,30 @@ void Viewer::saveSnapshot(bool, bool)
for (int ii=0; iiwidth())
break;
for (int jj=0; jjheight())
break;
- image.setPixel(fi, fj, subImage.pixel(ii,jj));
+ image->setPixel(fi, fj, subImage.pixel(ii,jj));
}
}
count++;
}
-
- image.save(fileName);
- setBackgroundColor(previousBGColor);
+ if(background_color !=0)
+ viewer->setBackgroundColor(previousBGColor);
+ return image;
+}
+void Viewer_impl::sendSnapshotToClibboard(Viewer *viewer)
+{
+ QImage * snap = takeSnapshot(viewer, 95, 1, 2*viewer->size(), 1, true);
+ if(snap)
+ {
+ QApplication::clipboard()->setImage(*snap);
+ delete snap;
+ }
}
#include "Viewer.moc"
diff --git a/Polyhedron/demo/Polyhedron/Viewer.h b/Polyhedron/demo/Polyhedron/Viewer.h
index 1491db2242e..eb6a9a4e979 100644
--- a/Polyhedron/demo/Polyhedron/Viewer.h
+++ b/Polyhedron/demo/Polyhedron/Viewer.h
@@ -161,6 +161,7 @@ protected:
bool is_d_pressed;
protected:
+ friend class Viewer_impl;
Viewer_impl* d;
double prev_radius;