rendered paste bodyIndex: imageplugins/perspective/perspectivewidget.h===================================================================--- imageplugins/perspective/perspectivewidget.h (Revision 925640)+++ imageplugins/perspective/perspectivewidget.h (Arbeitskopie)@@ -85,6 +85,7 @@ void slotChangeGuideColor(const QColor &color); void slotChangeGuideSize(int size);+ void slotInverseTransformationChanged(bool isEnabled); signals: @@ -126,6 +127,7 @@ bool m_antiAlias; bool m_drawWhileMoving; bool m_drawGrid;+ bool m_inverseTransformation; uint *m_data; int m_w;Index: imageplugins/perspective/perspectivetool.cpp===================================================================--- imageplugins/perspective/perspectivetool.cpp (Revision 925640)+++ imageplugins/perspective/perspectivetool.cpp (Arbeitskopie)@@ -125,6 +125,7 @@ KSeparator *line2 = new KSeparator (Qt::Horizontal, m_gboxSettings->plainPage()); m_drawWhileMovingCheckBox = new QCheckBox(i18n("Draw preview while moving"), m_gboxSettings->plainPage()); m_drawGridCheckBox = new QCheckBox(i18n("Draw grid"), m_gboxSettings->plainPage());+ m_inverseTransformation = new QCheckBox(i18n("Inverse transformation"), m_gboxSettings->plainPage()); // ------------------------------------------------------------- @@ -160,13 +161,14 @@ gridLayout->addWidget(line2, 8, 0, 1, 3); gridLayout->addWidget(m_drawWhileMovingCheckBox, 9, 0, 1, 3); gridLayout->addWidget(m_drawGridCheckBox, 10, 0, 1, 3);- gridLayout->addWidget(label7, 11, 0, 1, 1);- gridLayout->addWidget(m_guideColorBt, 11, 2, 1, 1);- gridLayout->addWidget(space, 12, 0, 1, 3);- gridLayout->addWidget(label8, 13, 0, 1, 1);- gridLayout->addWidget(m_guideSize, 13, 2, 1, 1);+ gridLayout->addWidget(m_inverseTransformation, 11, 0, 1, 3);+ gridLayout->addWidget(label7, 12, 0, 1, 1);+ gridLayout->addWidget(m_guideColorBt, 12, 2, 1, 1);+ gridLayout->addWidget(space, 13, 0, 1, 3);+ gridLayout->addWidget(label8, 14, 0, 1, 1);+ gridLayout->addWidget(m_guideSize, 14, 2, 1, 1); gridLayout->setColumnStretch(1, 10);- gridLayout->setRowStretch(14, 10);+ gridLayout->setRowStretch(15, 10); setToolSettings(m_gboxSettings); init();@@ -187,6 +189,7 @@ connect(m_guideSize, SIGNAL(valueChanged(int)), m_previewWidget, SLOT(slotChangeGuideSize(int)));+ connect(m_inverseTransformation, SIGNAL(toggled(bool)), m_previewWidget, SLOT(slotInverseTransformationChanged(bool))); } PerspectiveTool::~PerspectiveTool()@@ -202,6 +205,7 @@ m_drawGridCheckBox->setChecked(group.readEntry("Draw Grid", false)); m_guideColorBt->setColor(group.readEntry("Guide Color", defaultGuideColor)); m_guideSize->setValue(group.readEntry("Guide Width", 1));+ m_inverseTransformation->setChecked(group.readEntry("Inverse Transformation", false)); m_previewWidget->slotToggleDrawWhileMoving(m_drawWhileMovingCheckBox->isChecked()); m_previewWidget->slotToggleDrawGrid(m_drawGridCheckBox->isChecked()); m_previewWidget->slotChangeGuideColor(m_guideColorBt->color());@@ -216,6 +220,7 @@ group.writeEntry("Draw Grid", m_drawGridCheckBox->isChecked()); group.writeEntry("Guide Color", m_guideColorBt->color()); group.writeEntry("Guide Width", m_guideSize->value());+ group.writeEntry("Inverse Transformation", m_inverseTransformation->isChecked()); config->sync(); } Index: imageplugins/perspective/perspectivetool.h===================================================================--- imageplugins/perspective/perspectivetool.h (Revision 925640)+++ imageplugins/perspective/perspectivetool.h (Arbeitskopie)@@ -80,6 +80,7 @@ QCheckBox *m_drawWhileMovingCheckBox; QCheckBox *m_drawGridCheckBox;+ QCheckBox *m_inverseTransformation; QSpinBox *m_guideSize; Index: imageplugins/perspective/perspectivewidget.cpp===================================================================--- imageplugins/perspective/perspectivewidget.cpp (Revision 925640)+++ imageplugins/perspective/perspectivewidget.cpp (Arbeitskopie)@@ -73,6 +73,7 @@ m_drawGrid = false; m_drawWhileMoving = true;+ m_inverseTransformation = false; m_currentResizing = ResizingNone; m_guideColor = Qt::red; m_guideSize = 1;@@ -210,6 +211,12 @@ targetImg.bits(), targetImg.width(), targetImg.height()); } +void PerspectiveWidget::slotInverseTransformationChanged(bool isEnabled) {+ m_inverseTransformation = isEnabled;+ updatePixmap();+ repaint();+}+ void PerspectiveWidget::slotToggleAntiAliasing(bool a) { m_antiAlias = a;@@ -276,8 +283,17 @@ m_pixmap->fill(palette().color(QPalette::Background)); + if(m_inverseTransformation) {+ m_transformedCenter = buildPerspective(QPoint(0, 0), QPoint(m_w, m_h),+ m_topLeftPoint, m_topRightPoint,+ m_bottomLeftPoint, m_bottomRightPoint);+ + m_iface->putPreviewImage(m_previewImage.bits());+ m_iface->paint(m_pixmap, m_rect.x(), m_rect.y(),+ m_rect.width(), m_rect.height()); // if we are resizing with the mouse, compute and draw only if drawWhileMoving is set- if (m_currentResizing == ResizingNone || m_drawWhileMoving)+ }+ else if ((m_currentResizing == ResizingNone || m_drawWhileMoving)) { // Create preview image @@ -456,9 +472,22 @@ transform.scale (scalex, scaley); transform.multiply (matrix); - // Compute perspective transformation to image if image data containers exist.- if (orgImage && destImage)+ if(orgImage && destImage) {+ if(m_inverseTransformation) {+ Matrix inverseTransform = transform;+ inverseTransform.invert();+ + //Transform the matrix so it puts the result into the getTargetSize() rectangle+ Matrix transformIntoBounds;+ transformIntoBounds.scale(double(getTargetSize().width()) / double(orgImage->width()), double(getTargetSize().height()) / double(orgImage->height()));+ transformIntoBounds.translate(getTargetSize().left(), getTargetSize().top());+ inverseTransform.multiply(transformIntoBounds);+ transformAffine(orgImage, destImage, inverseTransform, background);+ }else{+ // Compute perspective transformation to image if image data containers exist. transformAffine(orgImage, destImage, transform, background);+ }+ } // Calculate the grid array points. double newX, newY;@@ -757,7 +786,7 @@ m_w-1, 0 ); QRegion unsableArea(unsablePoints); - if ( unsableArea.contains(pm) ) return;+ if ( unsableArea.contains(pm) && !m_inverseTransformation ) return; m_topLeftPoint = pm - m_rect.topLeft(); setCursor( Qt::SizeFDiagCursor );@@ -775,7 +804,7 @@ m_w-1, m_h-1); QRegion unsableArea(unsablePoints); - if ( unsableArea.contains(pm) ) return;+ if ( unsableArea.contains(pm) && !m_inverseTransformation ) return; m_topRightPoint = pm - m_rect.topLeft(); setCursor( Qt::SizeBDiagCursor );@@ -793,7 +822,7 @@ 0, 0); QRegion unsableArea(unsablePoints); - if ( unsableArea.contains(pm) ) return;+ if ( unsableArea.contains(pm) && !m_inverseTransformation ) return; m_bottomLeftPoint = pm - m_rect.topLeft(); setCursor( Qt::SizeBDiagCursor );@@ -811,7 +840,7 @@ 0, m_w-1); QRegion unsableArea(unsablePoints); - if ( unsableArea.contains(pm) ) return;+ if ( unsableArea.contains(pm) && !m_inverseTransformation ) return; m_bottomRightPoint = pm - m_rect.topLeft(); setCursor( Qt::SizeFDiagCursor );