]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Introducing dumpContents() method
authorouv <ouv@opencascade.com>
Wed, 18 Aug 2010 07:48:32 +0000 (07:48 +0000)
committerouv <ouv@opencascade.com>
Wed, 18 Aug 2010 07:48:32 +0000 (07:48 +0000)
src/GLViewer/GLViewer_ViewFrame.cxx
src/GLViewer/GLViewer_ViewPort2d.cxx
src/GLViewer/GLViewer_ViewPort2d.h

index b3a2cbfcd0f65c1f9e8d4d86356d4592cc82f356..5a6035c5d3595d81a2d14b0ad86d90aa15e37246 100644 (file)
@@ -26,7 +26,6 @@
 #include "GLViewer_ViewFrame.h"
 #include "GLViewer_Viewer.h"
 #include "GLViewer_ViewPort2d.h"
-#include "GLViewer_FrameBuffer.h"
 
 #include <QtxToolBar.h>
 #include <QtxMultiAction.h>
@@ -272,36 +271,10 @@ void GLViewer_ViewFrame::onUpdate( int )
 QImage GLViewer_ViewFrame::dumpView()
 {
   GLViewer_ViewPort2d* aViewPort = ((GLViewer_ViewPort2d*)myVP);
-  int aWidth = aViewPort->getWidth();
-  int aHeight = aViewPort->getHeight();
-   
-  GLViewer_FrameBuffer aFrameBuffer;
-  if( aFrameBuffer.init( aWidth, aHeight ) )
-  {
-    glPushAttrib( GL_VIEWPORT_BIT );
-    glViewport( 0, 0, aWidth, aHeight );
-    aFrameBuffer.bind();
-
-    // draw scene
-    aViewPort->getGLWidget()->updateGL();
-    
-    aFrameBuffer.unbind();
-    glPopAttrib();
-
-    QImage anImage( aWidth, aHeight, QImage::Format_RGB32 );
-
-    aFrameBuffer.bind();
-
-    glReadPixels( 0, 0, aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, anImage.bits() );
-
-    aFrameBuffer.unbind();
-
-    anImage = anImage.rgbSwapped();
-    anImage = anImage.mirrored();
+  QImage anImage = aViewPort->dumpContents( false );
+  if( !anImage.isNull() )
     return anImage;
-  }
 
-  QImage anImage;
   GLViewer_Widget* aWidget = aViewPort->getGLWidget();
   if ( aWidget )
     anImage = aWidget->grabFrameBuffer();
index 78b79e2c826ea783bb99741038f2371055f262b2..669df64dc2bc98a7dcf8cc575fc684119ada379d 100644 (file)
@@ -33,6 +33,7 @@
 #include "GLViewer_Compass.h"
 #include "GLViewer_Grid.h"
 #include "GLViewer_Drawer.h"
+#include "GLViewer_FrameBuffer.h"
 
 #include <QtxToolTip.h>
 
@@ -1435,3 +1436,81 @@ void GLViewer_ViewPort2d::onMaybeTip( QPoint thePoint, QString& theText, QFont&
     }
   }
 }
+
+/*!
+  Dumps contents of the scene
+  \param theWholeScene - flag, allowing to dump the whole scene,
+         not only its visible regeion
+  \return image with the scene contents
+*/
+QImage GLViewer_ViewPort2d::dumpContents( bool theWholeScene )
+{
+  QImage aResult;
+
+  int aWidth = theWholeScene ? myBorder->width() : myWidth;
+  int aHeight = theWholeScene ? myBorder->height() : myHeight;
+
+  // try to initialize framebuffer
+  GLViewer_FrameBuffer aFrameBuffer;
+  if( !aFrameBuffer.init( aWidth, aHeight ) )
+    return aResult;
+
+  if( theWholeScene )
+  {
+    glMatrixMode( GL_PROJECTION );
+    glPushMatrix();
+    glLoadIdentity();
+    glOrtho( -aWidth/2, aWidth/2, -aHeight/2, aHeight/2, -100, 100 );
+
+    glPushAttrib( GL_VIEWPORT_BIT );
+    glViewport( 0, 0, aWidth, aHeight );
+  }
+
+  // bind the framebuffer
+  aFrameBuffer.bind();
+
+  if( theWholeScene )
+  {
+    // centre the scene and reset the scale
+    int aXOffset = myBorder->left();
+    int aYOffset = myBorder->bottom();
+    myGLWidget->setPan( -aWidth/2 - aXOffset, -aHeight/2 - aYOffset, 0.0 );
+    myGLWidget->setScale( 1.0, 1.0, 1.0 );
+  }
+
+  // draw the scene to the framebuffer
+  myGLWidget->updateGL();
+
+  // unbind the framebuffer
+  aFrameBuffer.unbind();
+
+  if( theWholeScene )
+  {
+    glPopAttrib(); // GL_VIEWPORT_BIT
+
+    glMatrixMode( GL_PROJECTION );
+    glPopMatrix();
+    glMatrixMode( GL_MODELVIEW );
+    glPopMatrix();
+  }
+
+  // get an image by reading pixels from the framebuffer
+  QImage anImage( aWidth, aHeight, QImage::Format_RGB32 );
+
+  aFrameBuffer.bind();
+  glReadPixels( 0, 0, aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, anImage.bits() );
+  aFrameBuffer.unbind();
+
+  if( theWholeScene )
+  {
+    // restore the scene parameters
+    myGLWidget->setPan( myXPan, myYPan, 0.0 );
+    myGLWidget->setScale( myXScale, myYScale, 1.0 );
+    myGLWidget->updateGL();
+  }
+
+  anImage = anImage.rgbSwapped();
+  anImage = anImage.mirrored();
+
+  return anImage;
+}
index 3812e62a4e193bb7524b1dcf7e260d852fb560cf..fed5967d47001a802aa20fcf4c94e574471ffd63 100644 (file)
@@ -59,7 +59,7 @@ class QRubberBand;
  * Class GLViewer_ViewPort
  * 2D visualisation canvas of GLViewer
  */
-class GLViewer_ViewPort2d: public GLViewer_ViewPort
+class GLVIEWER_API GLViewer_ViewPort2d: public GLViewer_ViewPort
 {
   Q_OBJECT
   friend class GLViewer_Widget;
@@ -167,6 +167,9 @@ public:
   //! Transforms global rect to window rect
   QRect                  GLV2win( const GLViewer_Rect& ) const;
 
+  //! Dumps contents of the scene
+  QImage                 dumpContents( bool theWholeScene = false );
+
 signals:
   //! Emits after any transformation
   void                   vpUpdateValues();