Summary: | Strange helper lines behavior in ratio crop tool | ||
---|---|---|---|
Product: | [Applications] digikam | Reporter: | Thorsten Schnebeck <thorsten.schnebeck> |
Component: | Plugin-Editor-Crop | Assignee: | Digikam Developers <digikam-bugs-null> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | NOR | ||
Version: | 4.9.0 | ||
Target Milestone: | --- | ||
Platform: | Compiled Sources | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | 0.9.3 | |
Sentry Crash Report: | |||
Attachments: | no more jumping lines. |
Description
Thorsten Schnebeck
2006-01-19 13:13:45 UTC
Created attachment 20856 [details]
no more jumping lines.
The attached patch solves (at least for me ;-)
the jumping helper lines under flip.
The origin of the problem were a combination of several 1 pixel round-off
errors.
Best, Arnd
Patch looks fine. As its not applied can you change the bug status to confirmed (=NEW)? Bye Thorsten SVN commit 676579 by cgilles: digikam from KDE3 branch : Ratio Crop Tool : patch from Arnd Beacker about to fix round off error in helper lines computation. BUG: 120450 M +35 -22 imageselectionwidget.cpp --- branches/extragear/kde3/graphics/digikam/imageplugins/coreplugin/ratiocrop/imageselectionwidget.cpp #676578:676579 @@ -29,10 +29,10 @@ #define MINRANGE 0 -// Fibanocci irrationel Golden Number. -#define PHI 1.618033988 +// Golden number (1+sqrt(5))/2 +#define PHI 1.61803398874989479 // 1/PHI -#define INVPHI 0.61803398903633 +#define INVPHI 0.61803398874989479 // C++ includes. @@ -858,43 +858,53 @@ if (d->flipHorGoldenGuide) p.scale(-1, 1); - // Flip verical. + // Flip vertical. if (d->flipVerGoldenGuide) p.scale(1, -1); int w = d->localRegionSelection.width(); int h = d->localRegionSelection.height(); - QRect R1(-w/2, -h/2, - (int)(w/PHI), h); - QRect R2((int)(w*(INVPHI - 0.5)), (int)(h*(0.5 - INVPHI)), - (int)(w*(1 - INVPHI)), (int)(h/PHI)); - QRect R3((int)(w/2 - R2.width()/PHI), -h/2, - (int)(R2.width()/PHI), h - R2.height()); + // lengths for the golden mean and half the sizes of the region: + int w_g = (int)(w*INVPHI); + int h_g = (int)(h*INVPHI); + int w_2 = w/2; + int h_2 = h/2; + + QRect R1(-w_2, -h_2, w_g, h); + // w - 2*w_2 corrects for one-pixel difference + // so that R2.right() is really at the right end of the region + QRect R2(w_g-w_2, h_2-h_g, w-w_g+1-(w - 2*w_2), h_g); + + QRect R3((int)(w_2 - R2.width()*INVPHI), -h_2, + (int)(R2.width()*INVPHI), h - R2.height()); QRect R4(R2.x(), R1.y(), R3.x() - R2.x(), - (int)(R3.height()/PHI)); - QRect R5(R4.x(), R4.bottom(), (int)(R4.width()/PHI), + (int)(R3.height()*INVPHI)); + QRect R5(R4.x(), R4.bottom(), (int)(R4.width()*INVPHI), R3.height() - R4.height()); - QRect R6(R5.x() + R5.width(), R5.bottom() - (int)(R5.height()/PHI), - R3.x() - R5.right(), (int)(R5.height()/PHI)); - QRect R7(R6.right() - (int)(R6.width()/PHI), R4.bottom(), - (int)(R6.width()/PHI), R5.height() - R6.height()); + QRect R6(R5.x() + R5.width(), R5.bottom() - (int)(R5.height()*INVPHI), + R3.x() - R5.right(), (int)(R5.height()*INVPHI)); + QRect R7(R6.right() - (int)(R6.width()*INVPHI), R4.bottom(), + (int)(R6.width()*INVPHI), R5.height() - R6.height()); p.setPen(QPen(Qt::white, d->guideSize, Qt::SolidLine)); // Drawing Golden sections. if (d->drawGoldenSection) { + // horizontal lines: p.drawLine( R1.left(), R2.top(), R2.right(), R2.top()); p.drawLine( R1.left(), R1.top() + R2.height(), R2.right(), R1.top() + R2.height()); - p.drawLine( R2.right() - R1.width(), R1.top(), - R2.right() - R1.width(), R1.bottom() ); + // vertical lines: + p.drawLine( R1.right(), R1.top(), + R1.right(), R1.bottom() ); - p.drawLine( R1.topRight(), R1.bottomRight() ); + p.drawLine( R1.left()+R2.width(), R1.top(), + R1.left()+R2.width(), R1.bottom() ); } // Drawing Golden triangle guides. @@ -966,16 +976,19 @@ // Drawing Golden sections. if (d->drawGoldenSection) { + // horizontal lines: p.drawLine( R1.left(), R2.top(), R2.right(), R2.top()); p.drawLine( R1.left(), R1.top() + R2.height(), R2.right(), R1.top() + R2.height()); - p.drawLine( R2.right() - R1.width(), R1.top(), - R2.right() - R1.width(), R1.bottom() ); + // vertical lines: + p.drawLine( R1.right(), R1.top(), + R1.right(), R1.bottom() ); - p.drawLine( R1.topRight(), R1.bottomRight() ); + p.drawLine( R1.left()+R2.width(), R1.top(), + R1.left()+R2.width(), R1.bottom() ); } // Drawing Golden triangle guides. SVN commit 676582 by cgilles: digikam from trunk (KDE4) : Ratio crop tool : backport patch from Arnd about helper lines round off error CCBUGS: 120450 M +35 -22 imageselectionwidget.cpp --- trunk/extragear/graphics/digikam/imageplugins/coreplugin/ratiocrop/imageselectionwidget.cpp #676581:676582 @@ -29,10 +29,10 @@ #define MINRANGE 0 -// Fibanocci irrationel Golden Number. -#define PHI 1.618033988 +// Golden number (1+sqrt(5))/2 +#define PHI 1.61803398874989479 // 1/PHI -#define INVPHI 0.61803398903633 +#define INVPHI 0.61803398874989479 // C++ includes. @@ -862,43 +862,53 @@ if (d->flipHorGoldenGuide) p.scale(-1, 1); - // Flip verical. + // Flip vertical. if (d->flipVerGoldenGuide) p.scale(1, -1); int w = d->localRegionSelection.width(); int h = d->localRegionSelection.height(); - QRect R1(-w/2, -h/2, - (int)(w/PHI), h); - QRect R2((int)(w*(INVPHI - 0.5)), (int)(h*(0.5 - INVPHI)), - (int)(w*(1 - INVPHI)), (int)(h/PHI)); - QRect R3((int)(w/2 - R2.width()/PHI), -h/2, - (int)(R2.width()/PHI), h - R2.height()); + // lengths for the golden mean and half the sizes of the region: + int w_g = (int)(w*INVPHI); + int h_g = (int)(h*INVPHI); + int w_2 = w/2; + int h_2 = h/2; + + QRect R1(-w_2, -h_2, w_g, h); + // w - 2*w_2 corrects for one-pixel difference + // so that R2.right() is really at the right end of the region + QRect R2(w_g-w_2, h_2-h_g, w-w_g+1-(w - 2*w_2), h_g); + + QRect R3((int)(w_2 - R2.width()*INVPHI), -h_2, + (int)(R2.width()*INVPHI), h - R2.height()); QRect R4(R2.x(), R1.y(), R3.x() - R2.x(), - (int)(R3.height()/PHI)); - QRect R5(R4.x(), R4.bottom(), (int)(R4.width()/PHI), + (int)(R3.height()*INVPHI)); + QRect R5(R4.x(), R4.bottom(), (int)(R4.width()*INVPHI), R3.height() - R4.height()); - QRect R6(R5.x() + R5.width(), R5.bottom() - (int)(R5.height()/PHI), - R3.x() - R5.right(), (int)(R5.height()/PHI)); - QRect R7(R6.right() - (int)(R6.width()/PHI), R4.bottom(), - (int)(R6.width()/PHI), R5.height() - R6.height()); + QRect R6(R5.x() + R5.width(), R5.bottom() - (int)(R5.height()*INVPHI), + R3.x() - R5.right(), (int)(R5.height()*INVPHI)); + QRect R7(R6.right() - (int)(R6.width()*INVPHI), R4.bottom(), + (int)(R6.width()*INVPHI), R5.height() - R6.height()); p.setPen(QPen(Qt::white, d->guideSize, Qt::SolidLine)); // Drawing Golden sections. if (d->drawGoldenSection) { + // horizontal lines: p.drawLine( R1.left(), R2.top(), R2.right(), R2.top()); p.drawLine( R1.left(), R1.top() + R2.height(), R2.right(), R1.top() + R2.height()); - p.drawLine( R2.right() - R1.width(), R1.top(), - R2.right() - R1.width(), R1.bottom() ); + // vertical lines: + p.drawLine( R1.right(), R1.top(), + R1.right(), R1.bottom() ); - p.drawLine( R1.topRight(), R1.bottomRight() ); + p.drawLine( R1.left()+R2.width(), R1.top(), + R1.left()+R2.width(), R1.bottom() ); } // Drawing Golden triangle guides. @@ -970,16 +980,19 @@ // Drawing Golden sections. if (d->drawGoldenSection) { + // horizontal lines: p.drawLine( R1.left(), R2.top(), R2.right(), R2.top()); p.drawLine( R1.left(), R1.top() + R2.height(), R2.right(), R1.top() + R2.height()); - p.drawLine( R2.right() - R1.width(), R1.top(), - R2.right() - R1.width(), R1.bottom() ); + // vertical lines: + p.drawLine( R1.right(), R1.top(), + R1.right(), R1.bottom() ); - p.drawLine( R1.topRight(), R1.bottomRight() ); + p.drawLine( R1.left()+R2.width(), R1.top(), + R1.left()+R2.width(), R1.bottom() ); } // Drawing Golden triangle guides. |