summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/apps/calibrate/calibrate.cpp52
1 files changed, 42 insertions, 10 deletions
diff --git a/core/apps/calibrate/calibrate.cpp b/core/apps/calibrate/calibrate.cpp
index 54fa8ec..1f4fb1b 100644
--- a/core/apps/calibrate/calibrate.cpp
+++ b/core/apps/calibrate/calibrate.cpp
@@ -84,40 +84,72 @@ void Calibrate::hide()
}
void Calibrate::reset()
{
penPos = QPoint();
location = QWSPointerCalibrationData::TopLeft;
crossPos = fromDevice( cd.screenPoints[ location ] );
}
QPoint Calibrate::fromDevice( const QPoint &p )
{
return qt_screen->mapFromDevice ( p, QSize( qt_screen->deviceWidth ( ), qt_screen->deviceHeight() ) );
}
bool Calibrate::sanityCheck()
{
- QRect r ( cd.devPoints[ QWSPointerCalibrationData::TopLeft ], cd.devPoints[ QWSPointerCalibrationData::BottomRight ] );
- r = r. normalize ( ); // This should also handle rotated TS controllers
-
- cd. devPoints [QWSPointerCalibrationData::TopRight] = r. topRight ( );
- cd. devPoints [QWSPointerCalibrationData::BottomLeft] = r. bottomLeft ( );
- cd. devPoints [QWSPointerCalibrationData::Center] = r. center ( );
-
- return true;
+ QPoint tl = cd.devPoints[QWSPointerCalibrationData::TopLeft];
+ QPoint tr = cd.devPoints[QWSPointerCalibrationData::TopRight];
+ QPoint bl = cd.devPoints[QWSPointerCalibrationData::BottomLeft];
+ QPoint br = cd.devPoints[QWSPointerCalibrationData::BottomRight];
+
+ // not needed anywhere .. just calculate it, so it's there
+ cd. devPoints [QWSPointerCalibrationData::Center] = QRect ( tl, br ). normalize ( ). center ( );
+
+ int dlx = QABS( bl. x ( ) - tl. x ( ));
+ int dly = QABS( bl. y ( ) - tl. y ( ));
+ int drx = QABS( br. x ( ) - tr. x ( ));
+ int dry = QABS( br. y ( ) - tr. y ( ));
+ int dtx = QABS( tr. x ( ) - tl. x ( ));
+ int dty = QABS( tr. y ( ) - tl. y ( ));
+ int dbx = QABS( br. x ( ) - bl. x ( ));
+ int dby = QABS( br. y ( ) - bl. y ( ));
+
+ int dl = (int) ::sqrt (( dlx * dlx ) + ( dly * dly )); // calculate vector lengths for all sides
+ int dr = (int) ::sqrt (( drx * drx ) + ( dry * dry ));
+ int dt = (int) ::sqrt (( dtx * dtx ) + ( dty * dty ));
+ int db = (int) ::sqrt (( dbx * dbx ) + ( dby * dby ));
+
+ // Calculate leeway for x/y (we do not care if diff1/diff2 is for x or y here !)
+ int diff1 = QABS( dl - dr );
+ int avg1 = ( dl + dr ) / 2;
+ int diff2 = QABS( dt - db );
+ int avg2 = ( dt + db ) / 2;
+
+ // Calculate leeway for "real" vector length against "manhattan" vector length
+ // This is a check, if the rect is rotated (other then 0/90/180/270)
+ // It needs to be performed only for the triange (bl, tl, tr)
+ int diff3 = QABS(( dlx + dly + dtx + dty ) - ( dl + dt ));
+ int avg3 = (( dlx + dly + dtx + dty ) + ( dl + dt )) / 2;
+
+ if (( diff1 > ( avg1 / 20 )) || // 5% leeway
+ ( diff2 > ( avg2 / 20 )) ||
+ ( diff3 > ( avg3 / 20 )))
+ return false;
+ else
+ return true;
}
void Calibrate::moveCrosshair( QPoint pt )
{
showCross = FALSE;
repaint( crossPos.x() - 8, crossPos.y() - 8, 16, 16 );
showCross = TRUE;
crossPos = pt;
repaint( crossPos.x() - 8, crossPos.y() - 8, 16, 16 );
}
void Calibrate::paintEvent( QPaintEvent * )
{
QPainter p( this );
int y;
@@ -153,34 +185,34 @@ void Calibrate::mousePressEvent( QMouseEvent *e )
QPoint devPos = qt_screen->mapToDevice( e->pos(), QSize( qt_screen->width(), qt_screen->height() ) );
if ( penPos.isNull() )
penPos = devPos;
else
penPos = QPoint( ( penPos.x() + devPos.x() ) / 2,
( penPos.y() + devPos.y() ) / 2 );
}
void Calibrate::mouseReleaseEvent( QMouseEvent * )
{
if ( timer->isActive() )
return ;
bool doMove = TRUE;
cd.devPoints[ location ] = penPos;
- if ( location == QWSPointerCalibrationData::TopLeft ) {
- location = QWSPointerCalibrationData::BottomRight;
+ if ( location < QWSPointerCalibrationData::TopRight ) {
+ location = (QWSPointerCalibrationData::Location) ( int( location ) + 1 );
}
else {
if ( sanityCheck() ) {
reset();
goodcd = cd;
hide();
emit accept();
doMove = FALSE;
}
else {
location = QWSPointerCalibrationData::TopLeft;
}
}
if ( doMove ) {
QPoint target = fromDevice( cd.screenPoints[ location ] );