Skip to content

Commit fd5ac54

Browse files
committed
fix(deskew): default oblique manual and align handles to image (#145)
buildDefaultParams() always seeded oblique MODE_AUTO, so new pages ran auto oblique even when Automatic oblique correction was off. Auto deskew recompute also read prior per-page oblique mode instead of the global default. Anchor deskew/oblique overlay handles to the occupied image rect.
1 parent 5eaac18 commit fd5ac54

3 files changed

Lines changed: 15 additions & 10 deletions

File tree

src/core/filters/deskew/ImageView.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,13 @@ void ImageView::dragFinished() {
249249
* Get the point at the center of the widget content area, in widget coordinates.
250250
*/
251251
QPointF ImageView::getImageRotationOrigin() const {
252+
const QRectF occupied(getOccupiedWidgetRect());
253+
if (!occupied.isEmpty()) {
254+
return occupied.center();
255+
}
256+
252257
const QRectF contentArea(getContentAreaRect());
253-
return QPointF(std::floor(0.5 * contentArea.width()) + 0.5 + contentArea.x(),
254-
std::floor(0.5 * contentArea.height()) + 0.5 + contentArea.y());
258+
return contentArea.center();
255259
}
256260

257261
QRectF ImageView::getContentAreaRect() const {
@@ -285,7 +289,7 @@ QRectF ImageView::getRotationArcSquare() const {
285289
arcSize.setHeight(arcSize.width());
286290

287291
QRectF arcSquare(QPointF(0, 0), arcSize);
288-
arcSquare.moveCenter(reducedScreenRect.center());
292+
arcSquare.moveCenter(getImageRotationOrigin());
289293
return arcSquare;
290294
}
291295

@@ -303,15 +307,17 @@ std::pair<QPointF, QPointF> ImageView::getRotationHandles(const QRectF& arcSquar
303307

304308
QRectF ImageView::getObliqueArcSquare() const {
305309
const QRectF reducedScreenRect(getContentAreaRect());
310+
const QRectF occupied(getOccupiedWidgetRect());
306311

307312
const double obliqueSin = std::sin(m_maxObliqueDeg * constants::DEG2RAD);
308313
QSizeF arcSize(obliqueSin, 1.0);
309314
arcSize.scale(reducedScreenRect.size(), Qt::KeepAspectRatio);
310315
arcSize.setWidth(arcSize.height());
311316

312317
QRectF arcSquare(QPointF(0, 0), arcSize);
313-
arcSquare.moveRight(reducedScreenRect.right());
314-
arcSquare.moveCenter(QPointF(arcSquare.center().x(), reducedScreenRect.center().y()));
318+
const double rightEdge = occupied.isEmpty() ? reducedScreenRect.right() : occupied.right();
319+
arcSquare.moveRight(rightEdge);
320+
arcSquare.moveCenter(QPointF(arcSquare.center().x(), getImageRotationOrigin().y()));
315321
return arcSquare;
316322
}
317323

src/core/filters/deskew/Task.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,14 @@ FilterResultPtr Task::process(const TaskStatus& status, FilterData data) {
121121
status.throwIfCancelled();
122122

123123
bool autoObliqueEnabled = false;
124-
if (priorParamsBeforeRecompute) {
125-
autoObliqueEnabled = priorParamsBeforeRecompute->autoOblique();
126-
} else if (const auto pending = m_settings->takePendingAutoOblique(m_pageId)) {
124+
if (const auto pending = m_settings->takePendingAutoOblique(m_pageId)) {
127125
autoObliqueEnabled = *pending;
128126
} else {
129127
autoObliqueEnabled = DefaultParamsProvider::getInstance().getParams().getDeskewParams().isAutoOblique();
130128
}
131129

132130
double preservedObliqueDeg = 0.;
133-
if (priorParamsBeforeRecompute && !priorParamsBeforeRecompute->autoOblique()) {
131+
if (priorParamsBeforeRecompute && priorParamsBeforeRecompute->obliqueMode() == MODE_MANUAL) {
134132
preservedObliqueDeg = priorParamsBeforeRecompute->obliqueAngle();
135133
}
136134

src/core/filters/deskew/Utils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ using namespace deskew;
1313
Params Utils::buildDefaultParams() {
1414
const DefaultParams& defaultParams = DefaultParamsProvider::getInstance().getParams();
1515
const DefaultParams::DeskewParams& deskewParams = defaultParams.getDeskewParams();
16+
const AutoManualMode obliqueMode = deskewParams.isAutoOblique() ? MODE_AUTO : MODE_MANUAL;
1617

17-
return Params(deskewParams.getDeskewAngleDeg(), 0.0, Dependencies(), deskewParams.getMode(), MODE_AUTO);
18+
return Params(deskewParams.getDeskewAngleDeg(), 0.0, Dependencies(), deskewParams.getMode(), obliqueMode);
1819
}

0 commit comments

Comments
 (0)