#include <boost/multi_array.hpp>#include <GL/gl.h>#include <QtGui/QMouseEvent>#include "selectRectWidget.hh"using namespace boost;using namespace mimas;SelectRectWidget::SelectRectWidget( QWidget *parent, Qt::WFlags f ):VideoWidget( parent, f ), dragging(false), haveRect(false){}void SelectRectWidget::setImage( const image< rgba< unsigned char > > &_img ){dragging = false;haveRect = false;VideoWidget::setImage( _img );emit rectDefined( isRectDefined() );update();}void SelectRectWidget::paintGL(void){VideoWidget::paintGL();if ( haveRect ) {qglColor(Qt::red);// glColor4f(1,0,0,0.5);glPushMatrix();glScalef( zoom, zoom, 1.0 );glBegin(GL_LINE_LOOP);glVertex2f( x0, y0 );glVertex2f( x1, y0 );glVertex2f( x1, y1 );glVertex2f( x0, y1 );glEnd();glPopMatrix();}}void SelectRectWidget::mousePressEvent( QMouseEvent *e ){// if left mouse-button was pressed:if ( e->button() == Qt::LeftButton ) {x0 = (int)floor( e->x() / zoom );y0 = (int)floor( e->y() / zoom );x1 = x0;y1 = y0;dragging = true;haveRect = true;update();emit rectDefined( isRectDefined() );};}void SelectRectWidget::mouseReleaseEvent( QMouseEvent *e ){if ( e->button() == Qt::LeftButton ) {x1 = (int)ceil( e->x() / zoom );y1 = (int)ceil( e->y() / zoom );if ( x0 > x1 ) {x0 ^= x1;x1 ^= x0;x0 ^= x1;};if ( y0 > y1 ) {y0 ^= y1;y1 ^= y0;y0 ^= y1;}dragging = false;update();emit rectDefined( isRectDefined() );}}void SelectRectWidget::mouseMoveEvent( QMouseEvent *e ){if ( dragging ) {x1 = (int)ceil( e->x() / zoom );y1 = (int)ceil( e->y() / zoom );update();};}void SelectRectWidget::clearSelection(void){haveRect = false;emit rectDefined( isRectDefined() );}multi_array< rgba< unsigned char >, 2 >::array_view< 2 >::typeview( multi_array_ref< rgba< unsigned char >, 2 > &in,int x, int y, int w, int h ){typedef multi_array< rgba< unsigned char >, 2 >::index_range range;typedef multi_array< rgba< unsigned char >, 2 >::array_view< 2 >::typearray_view;multi_array< rgba< unsigned char >, 2 >::index_gen indices;array_view out =in[ indices[ range( y, y + h ) ][ range( x, x + w ) ] ];return out;}image< rgba< unsigned char > > SelectRectWidget::selectedImage(){image< rgba< unsigned char > > retVal;if ( isRectDefined() ) {intw = x1 + 1 - x0,h = y1 + 1 - y0;retVal.init( w, h );multi_array_ref< rgba< unsigned char >, 2 > imgData( img.rawData(), extents[ img.getHeight() ][ img.getWidth() ] );multi_array_ref< rgba< unsigned char >, 2 >( retVal.rawData(),extents[ retVal.getHeight() ][ retVal.getWidth() ] ) =view( imgData, x0, y0, w, h );};return retVal;}