From fc1a668dcce25810cdcc957e544a4aca889a7c7c Mon Sep 17 00:00:00 2001
From: passscod <passscoed@gmail.com>
Date: Sat, 1 Feb 2020 14:04:58 +0100
Subject: [PATCH] neu

---
 Implementation/GUI/Picture.cpp                |  42 ++++
 Implementation/GUI/Picture.h                  |   3 +
 Implementation/GUI/imageviewer.cpp            | 223 ++----------------
 Implementation/GUI/imageviewer.h              |  69 ------
 .../InteractionTool.o                         | Bin 4032 -> 4032 bytes
 .../Makefile                                  |   3 -
 .../Picture.o                                 | Bin 11584 -> 11952 bytes
 .../imageviewer.o                             | Bin 114288 -> 114824 bytes
 8 files changed, 65 insertions(+), 275 deletions(-)

diff --git a/Implementation/GUI/Picture.cpp b/Implementation/GUI/Picture.cpp
index 30e5a2e..a6b2b9e 100644
--- a/Implementation/GUI/Picture.cpp
+++ b/Implementation/GUI/Picture.cpp
@@ -12,6 +12,12 @@ void Picture::addLayer(layer_t *layer){
     if(maxY<layer->qImage->size().height()+layer->yOffset){
         maxY=layer->qImage->size().height()+layer->yOffset;
     }
+    if(minX>layer->xOffset||minX==-1){
+        minX=layer->xOffset;
+    }
+    if(minY>layer->yOffset||minY==-1){
+        minY=layer->yOffset;
+    }
     return;
 }
 void Picture::addLayer(QImage *qImage){
@@ -27,6 +33,8 @@ void Picture::addLayer(QImage *qImage){
     if(maxY<qImage->size().height()){
         maxY=qImage->size().height();
     }
+    minX=0;
+    minY=0;
     addLayer(layer);
     return;
 }
@@ -43,6 +51,8 @@ void Picture::addLayer(int width, int height){
     if(maxY<height){
         maxY=height;
     }
+    minX=0;
+    minY=0;
     addLayer(layer);
     return;
 }
@@ -51,6 +61,10 @@ void Picture::removeLayer(unsigned int index){
         currentLayer=nullptr;
     }
     layers.erase(layers.begin()+index);
+    maxX=0;
+    maxY=0;
+    minX=-1;
+    minY=-1;
     for (int i = 0; i < layers.size(); i++){
         if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){
             maxX=layers[i]->qImage->size().width()+layers[i]->xOffset;
@@ -58,6 +72,12 @@ void Picture::removeLayer(unsigned int index){
         if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){
             maxY=layers[i]->qImage->size().height()+layers[i]->yOffset;
         }
+        if(minX>layers[i]->xOffset||minX==-1){
+            minX=layers[i]->xOffset;
+        }
+        if(minY>layers[i]->yOffset||minY==-1){
+            minY=layers[i]->yOffset;
+        }
     }
     return;
 }
@@ -141,6 +161,9 @@ bool Picture::isVisible(unsigned int index){
 QSize Picture::getMaxSize(){
     return QSize(maxX,maxY);
 }
+QSize Picture::getMinOffset(){
+    return QSize(minX,minY);
+}
 int Picture::currentXOffset(){
     return currentLayer->xOffset;
 }
@@ -156,40 +179,56 @@ int Picture::yOffset(unsigned int index){
 void Picture::setCurrentXOffset(int offset){
     currentLayer->xOffset+=offset;
     maxX=0;
+    minX=-1;
     for (int i = 0; i < layers.size(); i++){
         if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){
             maxX=layers[i]->qImage->size().width()+layers[i]->xOffset;
         }
+        if(minX>layers[i]->xOffset||minX==-1){
+            minX=layers[i]->xOffset;
+        }
     }
     return;
 }
 void Picture::setCurrentYOffset(int offset){
     currentLayer->yOffset+=offset;
     maxY=0;
+    minY=-1;
     for (int i = 0; i < layers.size(); i++){
         if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){
             maxY=layers[i]->qImage->size().height()+layers[i]->yOffset;
         }
+        if(minY>layers[i]->yOffset||minY==-1){
+            minY=layers[i]->yOffset;
+        }
     }
     return;
 }
 void Picture::setXOffset(unsigned int index, int offset){
     layers[index]->xOffset+=offset;
     maxX=0;
+    minX=-1;
     for (int i = 0; i < layers.size(); i++){
         if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){
             maxX=layers[i]->qImage->size().width()+layers[i]->xOffset;
         }
+        if(minX>layers[i]->xOffset||minX==-1){
+            minX=layers[i]->xOffset;
+        }
     }
     return;
 }
 void Picture::setYOffset(unsigned int index, int offset){
     layers[index]->yOffset+=offset;
     maxY=0;
+    minY=-1;
     for (int i = 0; i < layers.size(); i++){
         if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){
             maxY=layers[i]->qImage->size().height()+layers[i]->yOffset;
         }
+        if(minY>layers[i]->yOffset||minY==-1){
+            minY=layers[i]->yOffset;
+        }
     }
     return;
 }
@@ -202,9 +241,12 @@ Picture::Picture(std::string name){
     layers = std::vector<layer_t*>();
     maxX=0;
     maxY=0;
+    minX=-1;
+    minY=-1;
 }
 Picture::~Picture(){
    for (unsigned int i = 0; i < layers.size(); i++){
        delete layers[i];
    }
 }
+
diff --git a/Implementation/GUI/Picture.h b/Implementation/GUI/Picture.h
index 806c0c8..edac3af 100644
--- a/Implementation/GUI/Picture.h
+++ b/Implementation/GUI/Picture.h
@@ -33,6 +33,7 @@ class Picture{
         void makeVisible(unsigned int index, bool visible);
         bool isVisible(unsigned int index);
         QSize getMaxSize();
+        QSize getMinOffset();
         unsigned int getLayerCount();
         unsigned int getCurrentLayerIndex();
         int currentXOffset();
@@ -54,6 +55,8 @@ class Picture{
         layer_t *currentLayer;
         int maxX;
         int maxY;
+        int minX;
+        int minY;
 };
 
 #endif /* !PICTURE_H */
diff --git a/Implementation/GUI/imageviewer.cpp b/Implementation/GUI/imageviewer.cpp
index 736a831..d528888 100644
--- a/Implementation/GUI/imageviewer.cpp
+++ b/Implementation/GUI/imageviewer.cpp
@@ -87,52 +87,12 @@ ImageViewer::ImageViewer(QWidget *parent)
 
     connect(drawDock,QOverload<para1>::of(&DrawDock::drawShowI),this,&ImageViewer::drawShowI);
     connect(drawDock,QOverload<para2>::of(&DrawDock::drawShowII),this,&ImageViewer::drawShowII);
-    /*
-    for(int i = 0; i <256; i++){
-        colorVect.append(QColor(255,255,255,255).rgba());
-        colorButtons.push_back(new QToolButton());
-        QString str;
-        str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
 
-        colorButtons[i]->setStyleSheet(str);
-        colorButtons[i]->setCheckable(true);
-
-        connect(colorButtons[i], SIGNAL(clicked()),this, SLOT(changeColor()));
-    }*/
-
-    //newLayerDock->setColorVect(colorVect);
-    //drawDock->setColorVect(colorVect);
-    //colorDock->setColorVect(colorVect);
 
     transLationDock = new TranslationDock(interactionTool);
     connect(transLationDock,QOverload<toolParameters_t*>::of(&TranslationDock::getParams),this,&ImageViewer::setTranslationParams);
     connect(transLationDock,&TranslationDock::update,this,&ImageViewer::updateall);
-    /*
-    addColor(QColor(255,255,255,255),0);
-    addColor(QColor(127,127,127,255),1);
-    addColor(QColor(0,0,0,255),2);
-    addColor(QColor(0,255,255,255),3);
-    addColor(QColor(0,127,127,255),4);
-    addColor(QColor(127,255,255,255),5);
-    addColor(QColor(127,0,0,255),6);
-    addColor(QColor(255,127,127,255),7);
-    addColor(QColor(255,0,0,255),8);
-    addColor(QColor(255,0,255,255),9);
-    addColor(QColor(127,0,127,255),10);
-    addColor(QColor(255,127,255,255),11);
-    addColor(QColor(0,127,0,255),12);
-    addColor(QColor(127,255,127,255),13);
-    addColor(QColor(0,255,0,255),14);
-    addColor(QColor(255,255,0,255),15);
-    addColor(QColor(127,127,0,255),16);
-    addColor(QColor(255,255,127,255),17);
-    addColor(QColor(0,0,127,255),18);
-    addColor(QColor(127,127,255,255),19);
-    addColor(QColor(0,0,255,255),20);
-
-    addColor(QColor(0,0,0,0),255);*/
-
-    //createLayerDock();
+
     colorDock = new ColorDock(interactionTool);
     connect(colorDock,&ColorDock::updateVisible,this,&ImageViewer::updateVisible);
     connect(colorDock,QOverload<QVector<QRgb>>::of(&ColorDock::updateColorVect),this,&ImageViewer::updateColorVector);
@@ -161,55 +121,6 @@ ImageViewer::ImageViewer(QWidget *parent)
     resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
 }
 
-//! [0]
-//! [2]
-/*
-void ImageViewer::createColorDock(){
-    colorButtons = std::vector<QToolButton*>();
-    //QPixmap px(20, 20);
-    for(int i = 0; i <256; i++){
-
-        colorButtons.push_back(new QToolButton());
-        //px.fill(colorVect[i]);
-        //colorButtons[i]->setIcon(px);
-        colorButtons[i]->setCheckable(true);
-        QString str;
-        //str.append(qRed(colorVect[i]));
-        //str.append(";");
-        str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-        //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-        colorButtons[i]->setStyleSheet(str);
-        //if(i==drawColorIndex){
-        //    colorButton->setStyleSheet(str);
-        //}
-        connect(colorButtons[i], SIGNAL(clicked()),this, SLOT(changeColor()));
-        //connect(colorButtons[i], SIGNAL(clicked()),colorButtons[i], SLOT(toggle()));
-    }
-
-    colorDock = new QDockWidget(tr("Colortable"), this);
-    colorDock->setAllowedAreas(Qt::BottomDockWidgetArea);
-
-    colorLayout = new QGridLayout();
-    for (int i = 0; i < 64; i++) {
-        colorLayout->addWidget(colorButtons[4*i],0,i);
-        colorLayout->addWidget(colorButtons[4*i+1],1,i);
-        colorLayout->addWidget(colorButtons[4*i+2],2,i);
-        colorLayout->addWidget(colorButtons[4*i+3],3,i);
-    }
-
-    colors = new QWidget(colorDock);
-    colors->setLayout(colorLayout);
-    ColorScrollArea = new QScrollArea();
-    ColorScrollArea->setWidget(colors);
-    colorDock->setWidget(ColorScrollArea);
-
-    addDockWidget(Qt::BottomDockWidgetArea, colorDock);
-    colorDock->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable);
-
-    //
-
-}*/
-
 bool ImageViewer::loadFile(const QString &fileName)
 {
 
@@ -580,113 +491,6 @@ void ImageViewer::mouseReleaseEvent(QMouseEvent *event)
         updateVisible();
     }
 }
-/*
-void ImageViewer::updateColors(){
-    QPixmap px(20, 20);
-    colorVect = interactionTool->getPicture()->getCurrentLayerAsQ()->colorTable();
-    for(int i = 0; i <256; i++){
-
-        px.fill(colorVect[i]);
-
-        //colorButtons[i]->setIcon(px);
-        QString str;
-        //str.append(qRed(colorVect[i]));
-        //str.append(";");
-        str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-        //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-        colorButtons[i]->setStyleSheet(str);
-
-    }
-    newLayerDock->setColorVect(colorVect);
-    drawDock->setColorVect(colorVect);
-
-    if(interactionTool->getPicture()->isShaped()){
-        addColor(QColor(255,255,255,0),255);
-        QPainter p(&px);
-        QPen pen(QColor(255,0,0,255));
-        pen.setWidth(2);
-        p.setPen(pen);
-        p.drawLine(1,1,19,1);
-        p.drawLine(19,1,19,19);
-        p.drawLine(19,19,1,19);
-        p.drawLine(1,19,1,1);
-        p.drawLine(1,19,19,1);
-        p.drawLine(19,19,1,1);
-        //colorAct[255]->setIcon(px);
-        //colorAct[255]->setEnabled(false);
-        colorButtons[255]->setStyleSheet("background-color: #FFFFFF;\n");
-        colorButtons[255]->setIcon(px);
-        colorButtons[255]->setEnabled(false);
-    } else {
-        //colorAct[255]->setEnabled(true);
-        colorButtons[255]->setEnabled(true);
-        px.fill(QColor(255,255,255,0));
-        colorButtons[255]->setIcon(px);
-    }
-    //colorButton->setMenu(colorMenu);
-}
-
-void ImageViewer::addColor(QColor col, int pos){
-    QPixmap px(20, 20);
-    colorVect[pos]=col.rgba();
-
-    px.fill(colorVect[pos]);
-    //colorButtons[i]->setIcon(px);
-    QString str;
-    //str.append(qRed(colorVect[i]));
-    //str.append(";");
-    //str.sprintf("#%02x%02x%02x",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-    str.sprintf("background-color: qlineargradient(stop:0.5 #%02x%02x%02x);",qRed(colorVect[pos]),qGreen(colorVect[pos]),qBlue(colorVect[pos]));
-    //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-    colorButtons[pos]->setStyleSheet(str);
-
-    colorButtons[pos]->setChecked(false);
-    if (hasLayer){
-        interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(pos,colorVect[pos]);
-        //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ());
-        //updateLayers();
-        layerDock->updateLayers();
-        updateVisible();
-
-    }
-    newLayerDock->setColorVect(colorVect);
-    drawDock->setColorVect(colorVect);
-}
-void ImageViewer::changeColor(){
-    for (int i = 0; i < colorButtons.size(); i++) {
-        if (colorButtons[i]->isChecked()){
-            QPixmap px(20, 20);
-            QString str2;
-            str2.sprintf("Color %d",i);
-            colorVect[i]=QColorDialog().getColor(Qt::white,nullptr,str2,QColorDialog::ShowAlphaChannel).rgba();
-            newLayerDock->setColorVect(colorVect);
-            drawDock->setColorVect(colorVect);
-            px.fill(colorVect[i]);
-            //colorButtons[i]->setIcon(px);
-            //colorAct[i]->setIcon(px);
-            QString str;
-            //str.append(qRed(colorVect[i]));
-            //str.append(";");
-            //str.sprintf("#%02x%02x%02x",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-            str.sprintf("background-color: qlineargradient(stop:0.5 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-            //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i]));
-            colorButtons[i]->setStyleSheet(str);
-            //if(i==drawColorIndex){
-            //    colorButton->setStyleSheet(str);
-            //}
-            colorButtons[i]->setChecked(false);
-            if (hasLayer){
-                interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(i,colorVect[i]);
-                //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ());
-                //updateLayers();
-                layerDock->updateLayers();
-                updateVisible();
-
-            }
-            //colorButton->setMenu(colorMenu);
-        }
-    }
-}*/
 
 void ImageViewer::newLayer(){
     //param = new toolParameters_t;
@@ -712,18 +516,32 @@ void ImageViewer::updateVisible(){
 }
 void ImageViewer::calculateVisible(){
     QPixmap *px = new QPixmap(interactionTool->getPicture()->getMaxSize());
+    px->fill(QColor(0,0,0,0));
+    QSize ms = interactionTool->getPicture()->getMinOffset();
+    int mdx=ms.width()%10;
+    int mdy=ms.height()%10;
+    bool c=true;
+    bool ug=(px->size().height()/10+1-ms.height()/10)%2==1;
     QPainter *painter= new QPainter(px);
     QBrush *br1 = new QBrush(QColor(100,100,100));
     QBrush *br2 = new QBrush(QColor(200,200,200));
-    for (int i = 0; i < px->size().width()/10+1;i++){
-        for (int j = 0; j < px->size().height()/10+1;j++){
-            if((i+j)&1){
-                painter->fillRect(i*10,j*10,10,10,*br1);
+    //QBrush *br3 = new QBrush(QColor(0,0,0,0));
+    for (int i = ms.width()/10; i < px->size().width()/10+1;i++){
+        if(!ug&&i>ms.width()/10){
+            c=!c;
+        }
+        for (int j = ms.height()/10; j < px->size().height()/10+1;j++){
+            if(c){
+                painter->fillRect(i*10+mdx,j*10+mdy,10,10,*br1);
+                c=!c;
             } else {
-                painter->fillRect(i*10,j*10,10,10,*br2);
+                painter->fillRect(i*10+mdx,j*10+mdy,10,10,*br2);
+                c=!c;
             }
         }
     }
+    //painter->fillRect(0,0,px->size().width(),ms.height(),*br3);
+    //painter->fillRect(0,0,ms.width(),px->size().height(),*br3);
     for (int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) {
         if (layerDock->isLayerCheckboxChecked(i)){
             painter->drawImage(interactionTool->getPicture()->xOffset(i),interactionTool->getPicture()->yOffset(i),*interactionTool->getPicture()->getLayerAsQ(i));
@@ -739,7 +557,6 @@ void ImageViewer::makeShaped(){
         //updateColors();
         colorDock->updateColors();
     }
-
 }
 
 bool ImageViewer::getHasLayer(){
diff --git a/Implementation/GUI/imageviewer.h b/Implementation/GUI/imageviewer.h
index 445e3bd..aca1c68 100644
--- a/Implementation/GUI/imageviewer.h
+++ b/Implementation/GUI/imageviewer.h
@@ -121,37 +121,14 @@ private slots:
     void about();
     void draw();
     void translate();
-    //void calcTranslation();
-    //void doTranslation();
     void setTranslationParams(toolParameters_t * param);
     void setMergeParams(toolParameters_t * param);
     void updateHasLayer(bool b);
     void updateall();
     void updateWithoutLayer();
     void updateVisible();
-    //void pencil();
-    //void startDraw();
-    //void lines();
-    //void notFilledRect();
-    //void filledRect();
-    //void existingColor();
-    //void newColor();
-    //void actualColorVect();
-    //void standartColorVect();
-    //void smallColorVect();
-    //void customColorVect();
-    //void setNewColor();
-    //void setDrawColor();
-    //void changeColor();
-    //void changeCurrentLayer();
-    //void updateVisible();
     void makeShaped();
     void newLayer();
-    //void addNewLayer();
-    //void setWidth(int w);
-    //void setNewLayerX(int w);
-    //void setNewLayerY(int w);
-    //void scrollAreaChanged();
     void drawShowI(para1 p);
     void drawShowII(para2 p);
     void updateLayerDock();
@@ -159,14 +136,7 @@ private slots:
 
 private:
     void createActions();
-    //void createColorDock();
-    //void createLayerDock();
-    //void createTranslateDock();
-    //void createDrawDock();
     void createMenus();
-    //void createNewLayerDock();
-    //void addColor(QColor col, int pos);
-
     void updateActions();
     bool saveFile(const QString &fileName);
     void setImage(QImage newImage);
@@ -177,43 +147,11 @@ private:
     QImage image;
     QLabel *imageLabel;
     QScrollArea *scrollArea;
-    //QScrollArea *ColorScrollArea;
-    //QScrollArea *layerScrollArea;
-    //QWidget *colors;
-    //QWidget *layers;
     QMenu *viewMenu;
     //QDockWidget *colorDock;
     QDockWidget *layerDockW;
-    //QGridLayout* colorLayout;
-    //QGridLayout* layerLayout;
-    //std::vector<QToolButton*> colorButtons;
-    //std::vector<QPushButton*> layerButtons;
-    //std::vector<QCheckBox*> layerCheckboxes;
     QVector<QRgb> colorVect;
     QVector<QRgb> newColorVect;
-    //QList<QAction*> colorAct;
-    //QPushButton *colorButton;
-    //QSlider *drawSlider;
-    //QSpinBox *drawSpinbox;
-    //QSlider *newLayerXSlider;
-    //QSpinBox *newLayerXSpinbox;
-    //QSlider *newLayerYSlider;
-    //QSpinBox *newLayerYSpinbox;
-    //QPushButton *drawStartButton;
-    //QMenu *colorMenu;
-    /*QCheckBox *mirrorCheckbox;
-    QLineEdit *zoomXInp;
-    QLineEdit *zoomYInp;
-    QLineEdit *rotInp;
-    QLabel *translationLabelA;
-    QLabel *translationLabelB;
-    QLabel *translationLabelC;
-    QLabel *translationLabelD;
-    QMatrix *transMat;*/
-    //QPushButton *newColorButton;
-    //drawModus_e actDrawModus = drawModus_e::pencil;
-    //QRgb newLayerColor;
-    //QGridLayout *newLayerLayout;
     QPixmap *pixmap;
     //QCheckBox *ignoreShaped;
     //QRadioButton *newColormap[4];
@@ -222,13 +160,6 @@ private:
     bool moveStart = false;
     //bool isNewLayerColor = false;
     double scaleFactor = 1.0;
-    //bool isDraw=false;
-    //bool isRot;
-    //int drawWidth=3;
-    //int newLayerX = 100;
-    //int newLayerY = 100;
-    //int drawColorIndex=0;
-    //bool drawStart=false;
     bool hasLayer=false;
     toolParameters_t *param = nullptr;
     InteractionTool *interactionTool;
diff --git a/Implementation/build-imageviewer-Desktop-Release/InteractionTool.o b/Implementation/build-imageviewer-Desktop-Release/InteractionTool.o
index e364580c78d6a001231fa652da472586379c2695..9aa47848e458a2bf8e83e9f11bc7a000a3894e02 100644
GIT binary patch
delta 18
ZcmX>ge?Wdh2V=m*&R2{9n@bpd_y9>@2LAv6

delta 18
ZcmX>ge?Wdh2cyTt&R2{cn@bpd_y9=Q2JZj>

diff --git a/Implementation/build-imageviewer-Desktop-Release/Makefile b/Implementation/build-imageviewer-Desktop-Release/Makefile
index d9f0fd6..16b3104 100644
--- a/Implementation/build-imageviewer-Desktop-Release/Makefile
+++ b/Implementation/build-imageviewer-Desktop-Release/Makefile
@@ -203,7 +203,6 @@ DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
 		/usr/lib/qt/mkspecs/features/qt_config.prf \
 		/usr/lib/qt/mkspecs/linux-g++/qmake.conf \
 		/usr/lib/qt/mkspecs/features/spec_post.prf \
-		../GUI/.qmake.stash \
 		/usr/lib/qt/mkspecs/features/exclusive_builds.prf \
 		/usr/lib/qt/mkspecs/features/toolchain.prf \
 		/usr/lib/qt/mkspecs/features/default_pre.prf \
@@ -374,7 +373,6 @@ Makefile: ../GUI/imageviewer.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/l
 		/usr/lib/qt/mkspecs/features/qt_config.prf \
 		/usr/lib/qt/mkspecs/linux-g++/qmake.conf \
 		/usr/lib/qt/mkspecs/features/spec_post.prf \
-		.qmake.stash \
 		/usr/lib/qt/mkspecs/features/exclusive_builds.prf \
 		/usr/lib/qt/mkspecs/features/toolchain.prf \
 		/usr/lib/qt/mkspecs/features/default_pre.prf \
@@ -502,7 +500,6 @@ Makefile: ../GUI/imageviewer.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/l
 /usr/lib/qt/mkspecs/features/qt_config.prf:
 /usr/lib/qt/mkspecs/linux-g++/qmake.conf:
 /usr/lib/qt/mkspecs/features/spec_post.prf:
-.qmake.stash:
 /usr/lib/qt/mkspecs/features/exclusive_builds.prf:
 /usr/lib/qt/mkspecs/features/toolchain.prf:
 /usr/lib/qt/mkspecs/features/default_pre.prf:
diff --git a/Implementation/build-imageviewer-Desktop-Release/Picture.o b/Implementation/build-imageviewer-Desktop-Release/Picture.o
index c997aadc9a29edb411e263022258e1b6e35c52ac..e6c591e8c58da66ec5800726c27095eef0f8a328 100644
GIT binary patch
delta 4271
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
Gx@rKBfbzru

delta 3895
zcmdlGdmw6p1`~t&M6EQYHw+UesYn>U_2?|t@UT2r>hf|G0|P^v9>07G0|Udvdy@4c
zip)*|j+RGj;yt>ZH9VS+GJ0s9@HqH`*~9WhS+++v%S)H;YzLoSmA4EG3=AIK7XL*d
zj9>+iZjo2aPCSm5M{5^(bX#FabUHh{?o5MN1=0#v;jQ3t@P~p|w}>J$r;|XZv&-ui
ze)-Ak8Ks!m|8G9cn87&Nnb|+j!#Z4}q`)!6)$mEEN9W&Q!`rWwU@iw4=c?h+e3;Qg
z^8&=RH_B{Wx>FrIx>;@^xiVD2qnqazvm=j-<%7D@9^IBOSHdMaT^(L;N}DiQfkmkv
zY-NRGh-c@YP{X$%8)f<B89cjPRM746cI?hkaY3=nvpYlu>@kRq0+ui8j>0WOmvroO
zQE_>_lwaP3fgw89G3GG8Jj3D14_VY9ZpcFMwhX_#1A|95bv+EXbwV206^@-3Ji5ab
zCU0jIgt(y!IUMA{YUmUalhfHc1i|j}>^$-kl-xi8Fj;_o2IG{;E7=Xy)jYbby0cwi
zaT%h*0ZLHJP6C!kYqUI?k4Qwvf&z510*9#05#%%jPl5<7oz5;$9TPlyLBhTD3J`-|
zW=<~T5Ucm>{Ig$zfq@}3*rWLk2Sm!TJ4VG}7Xu>$gHPvspH2;r&ZB9a0URF39e6;_
zg($K-T%!Y0=;G7)9wGvArRCuoHIL>a93GwTd^(?leCZhbUlpVat_+ko99|!R@TEZ6
z?%)pvkf6)!V`&KQOqguIIa58_r}LRd=lfX47{^%0IEYCeokzjJHUXh{@(0dp@e+pr
z{~1{n*cd=GkEjR(gC$!nL;2)pF5S)Rxu!B2$TBi8FgWoE^fI~dN%Sx~@+q{jIPz&U
zv%2#cFn#6X({SWdaO9J4;uCP<<8b3<*j&Qnz&QB?FVExyyfTw3czGtj;1#IXVPIgm
z12Tz$fuR%RvnW1+9*~J`%r1Ni%`8mud=ideBU}z2JHx;LQqRK#QpmtC5kw)>JA>6{
zV5+x)st22&fMUKI3sWSfh8(DdnIH=g8Xy*Ap{f^PU|^Ut`68b+W6fk<ehJ2m$!h#T
zj4qQa`HdMXCa>jpuQy>}U^v1IGKzuW2#9jz6KG>{<dbM-1_f0j7uY~YJ`NY|8aUgD
zo56yCf#DBS-xQEOaA3QF0^1WF*e-kqOrBhP8t$lp4N8O-EFet`lhXx6Iafe~xOH-?
zfD&ssNW<hc0uhXNCMODrZ<Y~MVPce>>?mx{s4%%vSX|Nps$3py0s{jZBLjmF0}DgK
z<c-4Ok_Av%Zm6t1RJLLALt$~r2~b%PsBA4%cEe;r5pl@_P+4oJ>^`V0!(>MhaY+Ft
zh%hIFV)zG@RhV2TA}(nFl@*4{>M%iE6)<_Bh`3||RF)qq3*v*^Trl~fh<JSiRF(rO
zI|HhB0-E?XsQ3b?I3HB~8L0RMH1S7J@dHqCa2jJ^U|?p3x(yP6^^nBMz`&pamG}UW
zfFybb1_pbmcmpKX7{F<dfq@|kDz3l^aS6E4U|?V<go+zL#cLqa3|p8P7!;X6sS+Xp
z@h~$3!-dI=V&aTqlP8LaGwuenWkGC19Ttd7(GALnif@2gP!BPWp&q15vK@!)^vMUs
z#2FbUe-smEWCxRcATm*h6>19`#29c!U|?YIhKe(=L&U)eoq>TN6Dqy{Dy|HXX6T2C
zUx13YLdBPZY~eZtl}+H-yhwZs)8qmvj?Gb0am-*Zm`zqx5@*bud{I`MaTS<63?`p~
z$!U`f<-{2UCnw5@Girg!*<f-9m~@;xQBIsO3QS&}JW)=+J_T$h1A`_51A{Rrr~Ze4
z$w=a$oc{+R{QohMxFwQ$4rqXY%t2PKh(kOJB3=)+7?jOn7BoR5FvOSQ5I>4T{56s|
zD3`*_7l(#8$e}h2li$g6G1^RSlox081Cf$BNYeI5{woE^GPZ(9!(~Wn9FWxPM-rDq
z5`RAVp}aWbR}ksR4N1sg?>Qr>@kA0wwl@ujc>Uys3gS{Lps@kUwIKh(JQ>I_IZ4rq
z(PZ*mMR7^w=um>DGm!7iCZAOlmqd<45F4ZbBKucSoY7{osFFU43H;EK52VI+a;%d6
z<QOHM$upFA7)>WHRWg=TfXWwu3}Rql067hW9VUNN5|>PX%FaNOEtssREI#>z5{KXc
zG?@vL1C_-mD=2d~en69fmBB1fGeNe1FxW~41_lW<ae>JjmBl3$z)BbxV08nC3&IAI
zA1aGa-k{7On1QA*VX~l#_~Zx59D=Yq0i+&;8zwudh;vQ=F&P*bc1&he5uaS4BEShN
zT^~#~R1vR-)dnDCARGWKG95r1q!5A?r3Gl>u%Z-JmV=~07*>?-2XUb07(v4bL|uW1
z3xUG}#D*1(cP9s`ic1PZodJ?T)@CrdQB}O&5=j=6tf9$}!2?Mgq!U)G)*y*<fozB3
z6G-A9^#-713X+4?4<IoRh83JP5OFQIqhTdy1VjQZ4l6kmCp)T%OD;!}MfS{z$%Sg-
zS{IRIL7q_nIe>wI;Q^93$Poz~n>VRtF)><CmesUpG@2Z%Y0TRU^EpV*WJY1($s05!
zm=a_rpVG8r`phv|QBZ8Mf|dr1nV_Y?`U9i|taO2v29tuq<WpL9OdOn(xwP$=EEFbt
zY1?tSLYoE}lP7AMGv#tlKBaBPG=Xz6myR9N28GF9I(AGCxF&b$*fBXMPClh$$Mk}0
zGMBC$(=RTtg$cSETnx~5%MX^xlXT6vA{0RmWMKHfJo%EY8RrjZ`=Mg8pq@Ebffz*c
RCF|rMJu@Z`)yZ9YY5=E7QB?o{

diff --git a/Implementation/build-imageviewer-Desktop-Release/imageviewer.o b/Implementation/build-imageviewer-Desktop-Release/imageviewer.o
index 50816bbdc333f4176728a9b8b89527eba6350719..baa5c16f55566968114e248f2e54f9b67c04f1b0 100644
GIT binary patch
delta 10587
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

delta 10175
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
TXwLPZ2eRadOJMq{Rg7`~J1Xo}

-- 
GitLab