From dec6f2c393dfed18ff9179756f92722d9a95870f Mon Sep 17 00:00:00 2001
From: Yannick Verdie <no@email>
Date: Sat, 14 Aug 2010 18:36:53 +0000
Subject: [PATCH] Qt fixed bug with OpenGL, and save issue reported in #520

---
 CMakeLists.txt                    |  4 ++-
 modules/highgui/src/window_QT.cpp | 49 +++++++++++++++++++++++--------
 2 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a84cfc8658..a752b2d378 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -532,12 +532,14 @@ if (WITH_QT)
 
 
 		#if (NOT WIN32)
+		if (WITH_QT_OPENGL)
 			if (QT_QTOPENGL_FOUND AND OPENGL_FOUND)
 				set(HAVE_QT_OPENGL 1)
 				add_definitions(-DHAVE_QT_OPENGL)
-				link_directories("${OPENGL_LIBRARIES}")
+				#link_directories("${OPENGL_LIBRARIES}")
 				set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})
 		 	endif()
+		 endif()
         #endif()
         
     endif()
diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp
index 75af80cafe..864f46ede8 100755
--- a/modules/highgui/src/window_QT.cpp
+++ b/modules/highgui/src/window_QT.cpp
@@ -804,10 +804,12 @@ void GuiReceiver::setPropWindow(QString name, double arg2 )
 	case  CV_WINDOW_NORMAL:
 		w->myGlobalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
 		w->param_flags = flags;
+
 		break;
 	case  CV_WINDOW_AUTOSIZE:
 		w->myGlobalLayout->setSizeConstraint(QLayout::SetFixedSize);
 		w->param_flags = flags;
+
 		break;
 	default:;
 	}
@@ -1584,6 +1586,9 @@ void CvWindow::createGlobalLayout()
 
 	if (param_flags == CV_WINDOW_AUTOSIZE)
 		myGlobalLayout->setSizeConstraint(QLayout::SetFixedSize);
+
+	if (param_flags == CV_WINDOW_NORMAL)
+		myGlobalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
 }
 
 void CvWindow::createBarLayout()
@@ -1625,6 +1630,7 @@ void CvWindow::createShortcuts()
 void CvWindow::createView(int mode, int ratio)
 {
 	//mode = CV_MODE_NORMAL or CV_MODE_OPENGL
+	//ratio = CV_WINDOW_KEEPRATIO or CV_WINDOW_FREERATIO
 	myview = new ViewPort(this, mode,ratio);//parent, mode_display, keep_aspect_ratio
 	myview->setAlignment(Qt::AlignHCenter);
 }
@@ -1947,11 +1953,12 @@ void CvWindow::icvSaveTrackbars(QSettings *settings)
 ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 {
 	centralWidget = arg,
-		setParent(centralWidget);
+	setParent(centralWidget);
 	mode_display = arg2;
 	param_keepRatio = arg3;
 
-	setupViewport(centralWidget);
+
+	//setAlignment(Qt::AlignLeft | Qt::AlignTop);
 	setContentsMargins(0,0,0,0);
 
 	setObjectName(QString::fromUtf8("graphicsView"));
@@ -1965,6 +1972,8 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 	mouseCoordinate = QPoint(-1,-1);
 	on_openGL_draw3D = NULL;
 
+	//no border
+	setStyleSheet( "QGraphicsView { border-style: none; }" ); 
 
 #if defined( HAVE_QT_OPENGL )
 	
@@ -1994,12 +2003,16 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 		zmax = DEFAULT_ZMAX;
 		initGL();
 	}
-	
+#else
+	setViewport(centralWidget);
 #endif
 
-	image2Draw_ipl=cvCreateImage(cvSize(centralWidget->width(),centralWidget->height()),IPL_DEPTH_8U,3);
-	image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
-	image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+	image2Draw_ipl=cvCreateImage(cvSize(viewport()->width(),viewport()->height()),IPL_DEPTH_8U,3);
+	//image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
+	//image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+	
+	//setupViewport(viewport());//centralWidget
+	//setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
 
 	nbChannelOriginImage = 0;
 	cvZero(image2Draw_ipl);
@@ -2044,9 +2057,13 @@ void ViewPort::saveView()
 	{
 		QString extension = fileName.right(3);
 
+
 #if defined( HAVE_QT_OPENGL )
 		image2Draw_qt_resized = ((QGLWidget*)viewport())->grabFrameBuffer();
 #else
+		//   (no need anymore) create the image resized to receive the 'screenshot'
+		//    image2Draw_qt_resized = QImage(viewport()->width(), viewport()->height(),QImage::Format_RGB888);
+		
 		QPainter saveimage(&image2Draw_qt_resized);
 		this->render(&saveimage);
 #endif
@@ -2169,21 +2186,25 @@ void ViewPort::updateImage(void* arr)
 	//CV_Error(CV_StsNullPtr, "NULL arr pointer (in showImage)" );
 	CV_Assert(arr)
 
-		IplImage* tempImage = (IplImage*)arr;
+	IplImage* tempImage = (IplImage*)arr;
 
 	if (!isSameSize(image2Draw_ipl,tempImage))
 	{
 		cvReleaseImage(&image2Draw_ipl);
+
+		//the image in ipl (to do a deep copy with cvCvtColor)
 		image2Draw_ipl=cvCreateImage(cvGetSize(tempImage),IPL_DEPTH_8U,3);
-		image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
-		image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
 
+		//the ipl image in qt format (with shared memory)
+		//image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
 
 		nbChannelOriginImage = tempImage->nChannels;
+
 		updateGeometry();
 	}
 
-	cvConvertImage(tempImage,image2Draw_ipl,CV_CVTIMG_SWAP_RB );
+	cvCvtColor(tempImage,image2Draw_ipl,CV_BGR2RGB);
+	//cvConvertImage(tempImage,image2Draw_ipl,CV_CVTIMG_SWAP_RB );
 
 	viewport()->update();
 }
@@ -2445,6 +2466,7 @@ QSize ViewPort::sizeHint() const
 {
 	if(image2Draw_ipl)
 	{
+		//qDebug()<<centralWidget->param_name<<" "<<image2Draw_ipl->width<<" "<<image2Draw_ipl->height;
 		return QSize(image2Draw_ipl->width,image2Draw_ipl->height);
 	} else {
 		return QGraphicsView::sizeHint();
@@ -2458,6 +2480,7 @@ void ViewPort::resizeEvent ( QResizeEvent *event)
 	ratioX=width()/float(image2Draw_ipl->width);
 	ratioY=height()/float(image2Draw_ipl->height);
 
+	
 	if(param_keepRatio == CV_WINDOW_KEEPRATIO)//to keep the same aspect ratio
 	{
 		QSize newSize = QSize(image2Draw_ipl->width,image2Draw_ipl->height);
@@ -2519,7 +2542,7 @@ void ViewPort::paintEvent(QPaintEvent* event)
 		if (param_matrixWorld.m11()>=threshold_zoom_img_region)
 		{
 			if (centralWidget->param_flags == CV_WINDOW_NORMAL)
-				startDisplayInfo("WARNING: The values displayed are the resized image's values. If you want the original image's values, use CV_WINDOW_AUTORESIZE", 1000);
+				startDisplayInfo("WARNING: The values displayed are the resized image's values. If you want the original image's values, use CV_WINDOW_AUTOSIZE", 1000);
 
 			drawImgRegion(&myPainter);
 		}
@@ -2540,8 +2563,10 @@ void ViewPort::paintEvent(QPaintEvent* event)
 
 void ViewPort::draw2D(QPainter *painter)
 {
-	image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+	image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
+	image2Draw_qt_resized = image2Draw_qt.scaled(viewport()->width(),viewport()->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
 	painter->drawImage(0,0,image2Draw_qt_resized);
+	//painter->drawImage(0,0,image2Draw_qt_resized);
 }
 
 void ViewPort::drawStatusBar()
-- 
2.18.0