From 2ed3838699772fe708b79637f044ccd397775538 Mon Sep 17 00:00:00 2001
From: even <philippe.even@loria.fr>
Date: Mon, 14 Jan 2019 22:30:58 +0100
Subject: [PATCH] Large images processed

---
 Code/FBSD/BSTools/bsdetectionwidget.cpp | 83 +++++++++++++++++++++++--
 Code/FBSD/BSTools/bsdetectionwidget.h   | 15 +++++
 2 files changed, 93 insertions(+), 5 deletions(-)

diff --git a/Code/FBSD/BSTools/bsdetectionwidget.cpp b/Code/FBSD/BSTools/bsdetectionwidget.cpp
index 511c432..130ddbc 100755
--- a/Code/FBSD/BSTools/bsdetectionwidget.cpp
+++ b/Code/FBSD/BSTools/bsdetectionwidget.cpp
@@ -52,6 +52,14 @@ BSDetectionWidget::BSDetectionWidget (QWidget *parent)
   bsPointsVisible = true;
   boundColor = Qt::green;
   boundHighColor = Qt::magenta;
+
+  maxWidth = 768;
+  maxHeight = 512;
+  xMaxShift = 0;
+  yMaxShift = 0;
+  xShift = 0;
+  yShift = 0;
+  zoom = 1;
 }
 
 
@@ -83,7 +91,13 @@ QSize BSDetectionWidget::openImage (const QString &fileName, int type)
   if (profileview != NULL) profileview->setImage (&loadedImage, gMap);
   if (strucview != NULL) strucview->setGradientImage (&gradImage);
 
-  return newSize.boundedTo (QSize (768, 512));
+  xMaxShift = (width > maxWidth ? maxWidth - width : 0);
+  yMaxShift = (height > maxHeight ? maxHeight - height : 0);
+  xShift = xMaxShift / 2;
+  if (xShift > 0) xShift = 0;
+  yShift = yMaxShift / 2;
+  if (yShift > 0) yShift = 0;
+  return newSize.boundedTo (QSize (maxWidth, maxHeight));
 }
 
 
@@ -178,7 +192,8 @@ void BSDetectionWidget::buildGradientImage (int dir)
 void BSDetectionWidget::paintEvent (QPaintEvent *)
 {
   QPainter painter (this);
-  painter.drawImage (QPoint (0, 0), augmentedImage);
+  QImage zoomImage = augmentedImage.scaled (width / zoom, height / zoom);
+  painter.drawImage (QPoint (xShift, yShift), zoomImage);
 }
 
 
@@ -326,7 +341,9 @@ void BSDetectionWidget::mousePressEvent (QMouseEvent *event)
   oldp1.set (p1);
   oldp2.set (p2);
   oldudef = udef;
-  p1 = Pt2i (event->pos().x (), height - 1 - event->pos().y());
+  int ex = zoom * (event->pos().x () - xShift);
+  int ey = zoom * (event->pos().y () - yShift);
+  p1 = Pt2i (ex, height - 1 - ey);
   if (p1.manhattan (p2) < 10) p1.set (oldp1);
   else if (p1.manhattan (oldp1) < 10) p1.set (p2);
   udef = true;
@@ -335,7 +352,9 @@ void BSDetectionWidget::mousePressEvent (QMouseEvent *event)
 
 void BSDetectionWidget::mouseReleaseEvent (QMouseEvent *event)
 {
-  p2 = Pt2i (event->pos().x (), height - 1 - event->pos().y());
+  int ex = zoom * (event->pos().x () - xShift);
+  int ey = zoom * (event->pos().y () - yShift);
+  p2 = Pt2i (ex, height - 1 - ey);
   if (p1.equals (p2))
   {
     p1.set (oldp1);
@@ -354,7 +373,9 @@ void BSDetectionWidget::mouseReleaseEvent (QMouseEvent *event)
 
 void BSDetectionWidget::mouseMoveEvent (QMouseEvent *event)
 {
-  p2 = Pt2i (event->pos().x (), height - 1 - event->pos().y ());
+  int ex = zoom * (event->pos().x () - xShift);
+  int ey = zoom * (event->pos().y () - yShift);
+  p2 = Pt2i (ex, height - 1 - ey);
   if (verbose) cerr << "(" << p1.x () << ", " << p1.y () << ") ("
                     << p2.x () << ", " << p2.y () << ")" << endl;
   if (p1.manhattan (p2) > 5
@@ -808,6 +829,58 @@ void BSDetectionWidget::keyPressEvent (QKeyEvent *event)
       writeTest ();
       break;
 
+    case Qt::Key_Plus :
+      if (zoom > 1)
+      {
+        zoom /= 2;
+        xShift = xShift * 2 - maxWidth / 2;
+        yShift = yShift * 2 - maxHeight / 2;
+        displayDetectionResult ();
+      }
+      break;
+
+    case Qt::Key_Minus :
+      if (width / zoom > maxWidth || height / zoom > maxHeight)
+      {
+        zoom *= 2;
+        xShift = xShift / 2 + maxWidth / 4;
+        if (xShift > 0) xShift = 0;
+        if ((maxWidth - xShift) * zoom > width)
+          xShift = maxWidth - width / zoom;
+        yShift = yShift / 2 + maxHeight / 4;
+        if (yShift > 0) yShift = 0;
+        if ((maxHeight - yShift) * zoom > height)
+          yShift = maxHeight - height / zoom;
+        displayDetectionResult ();
+      }
+      break;
+
+    case Qt::Key_Left :
+      xShift += 50;
+      if (xShift > 0) xShift = 0;
+      displayDetectionResult ();
+      break;
+
+    case Qt::Key_Right :
+      xShift -= 50;
+      if ((maxWidth - xShift) * zoom > width)
+        xShift = maxWidth - width / zoom;
+      displayDetectionResult ();
+      break;
+
+    case Qt::Key_Up :
+      yShift += 50;
+      if (yShift > 0) yShift = 0;
+      displayDetectionResult ();
+      break;
+
+    case Qt::Key_Down :
+      yShift -= 50;
+      if ((maxHeight - yShift) * zoom > height)
+        yShift = maxHeight - height / zoom;
+      displayDetectionResult ();
+      break;
+
     case Qt::Key_1 :
       switchPixelAnalyzer ();
       break;
diff --git a/Code/FBSD/BSTools/bsdetectionwidget.h b/Code/FBSD/BSTools/bsdetectionwidget.h
index bdc1521..c5b2775 100755
--- a/Code/FBSD/BSTools/bsdetectionwidget.h
+++ b/Code/FBSD/BSTools/bsdetectionwidget.h
@@ -263,6 +263,21 @@ private:
   /** Height of the present image. */
   int height;
 
+  /** Maximal window width. */
+  int maxWidth;
+  /** Maximal window height. */
+  int maxHeight;
+  /** Maximal value of x-scroll shift. */
+  int xMaxShift;
+  /** Maximal value of y-scroll shift. */
+  int yMaxShift;
+  /** X-scroll shift. */
+  int xShift;
+  /** Y-scroll shift. */
+  int yShift;
+  /** Window zoom. */
+  int zoom;
+
   /** Blurred segment detector. */
   BSDetector detector;
   /** Initial detection graphics view. */
-- 
GitLab