diff --git a/src/core/filters/deskew/ImageView.cpp b/src/core/filters/deskew/ImageView.cpp index da73a7da2..75c5fdc81 100644 --- a/src/core/filters/deskew/ImageView.cpp +++ b/src/core/filters/deskew/ImageView.cpp @@ -249,9 +249,13 @@ void ImageView::dragFinished() { * Get the point at the center of the widget content area, in widget coordinates. */ QPointF ImageView::getImageRotationOrigin() const { + const QRectF occupied(getOccupiedWidgetRect()); + if (!occupied.isEmpty()) { + return occupied.center(); + } + const QRectF contentArea(getContentAreaRect()); - return QPointF(std::floor(0.5 * contentArea.width()) + 0.5 + contentArea.x(), - std::floor(0.5 * contentArea.height()) + 0.5 + contentArea.y()); + return contentArea.center(); } QRectF ImageView::getContentAreaRect() const { @@ -285,7 +289,7 @@ QRectF ImageView::getRotationArcSquare() const { arcSize.setHeight(arcSize.width()); QRectF arcSquare(QPointF(0, 0), arcSize); - arcSquare.moveCenter(reducedScreenRect.center()); + arcSquare.moveCenter(getImageRotationOrigin()); return arcSquare; } @@ -303,6 +307,7 @@ std::pair ImageView::getRotationHandles(const QRectF& arcSquar QRectF ImageView::getObliqueArcSquare() const { const QRectF reducedScreenRect(getContentAreaRect()); + const QRectF occupied(getOccupiedWidgetRect()); const double obliqueSin = std::sin(m_maxObliqueDeg * constants::DEG2RAD); QSizeF arcSize(obliqueSin, 1.0); @@ -310,8 +315,9 @@ QRectF ImageView::getObliqueArcSquare() const { arcSize.setWidth(arcSize.height()); QRectF arcSquare(QPointF(0, 0), arcSize); - arcSquare.moveRight(reducedScreenRect.right()); - arcSquare.moveCenter(QPointF(arcSquare.center().x(), reducedScreenRect.center().y())); + const double rightEdge = occupied.isEmpty() ? reducedScreenRect.right() : occupied.right(); + arcSquare.moveRight(rightEdge); + arcSquare.moveCenter(QPointF(arcSquare.center().x(), getImageRotationOrigin().y())); return arcSquare; } diff --git a/src/core/filters/deskew/Task.cpp b/src/core/filters/deskew/Task.cpp index 1eea6cb91..20580aa77 100644 --- a/src/core/filters/deskew/Task.cpp +++ b/src/core/filters/deskew/Task.cpp @@ -121,16 +121,14 @@ FilterResultPtr Task::process(const TaskStatus& status, FilterData data) { status.throwIfCancelled(); bool autoObliqueEnabled = false; - if (priorParamsBeforeRecompute) { - autoObliqueEnabled = priorParamsBeforeRecompute->autoOblique(); - } else if (const auto pending = m_settings->takePendingAutoOblique(m_pageId)) { + if (const auto pending = m_settings->takePendingAutoOblique(m_pageId)) { autoObliqueEnabled = *pending; } else { autoObliqueEnabled = DefaultParamsProvider::getInstance().getParams().getDeskewParams().isAutoOblique(); } double preservedObliqueDeg = 0.; - if (priorParamsBeforeRecompute && !priorParamsBeforeRecompute->autoOblique()) { + if (priorParamsBeforeRecompute && priorParamsBeforeRecompute->obliqueMode() == MODE_MANUAL) { preservedObliqueDeg = priorParamsBeforeRecompute->obliqueAngle(); } diff --git a/src/core/filters/deskew/Utils.cpp b/src/core/filters/deskew/Utils.cpp index 30f092f91..fec51e570 100644 --- a/src/core/filters/deskew/Utils.cpp +++ b/src/core/filters/deskew/Utils.cpp @@ -13,6 +13,7 @@ using namespace deskew; Params Utils::buildDefaultParams() { const DefaultParams& defaultParams = DefaultParamsProvider::getInstance().getParams(); const DefaultParams::DeskewParams& deskewParams = defaultParams.getDeskewParams(); + const AutoManualMode obliqueMode = deskewParams.isAutoOblique() ? MODE_AUTO : MODE_MANUAL; - return Params(deskewParams.getDeskewAngleDeg(), 0.0, Dependencies(), deskewParams.getMode(), MODE_AUTO); + return Params(deskewParams.getDeskewAngleDeg(), 0.0, Dependencies(), deskewParams.getMode(), obliqueMode); }