From 4fae8a7405b39cbad27e991a9a6f194c9172ae6e Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sat, 16 Apr 2022 17:53:55 +0200 Subject: [PATCH] Signature plugin: Text box draw fix --- Pdf4QtLib/sources/pdfpagecontentelements.cpp | 59 +++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/Pdf4QtLib/sources/pdfpagecontentelements.cpp b/Pdf4QtLib/sources/pdfpagecontentelements.cpp index c79f92f..1b27681 100644 --- a/Pdf4QtLib/sources/pdfpagecontentelements.cpp +++ b/Pdf4QtLib/sources/pdfpagecontentelements.cpp @@ -2355,12 +2355,67 @@ void PDFPageContentElementTextBox::drawPage(QPainter* painter, painter->setClipRect(rect, Qt::IntersectClip); painter->translate(rect.center()); painter->scale(1.0, -1.0); - painter->rotate(getAngle()); QTextOption option; option.setAlignment(getAlignment()); + QRectF textRect(-rect.width() * 0.5, -rect.height() * 0.5, rect.width(), rect.height()); - painter->drawText(textRect, getText(), option); + if (qFuzzyIsNull(getAngle())) + { + painter->drawText(textRect, getText(), option); + } + else + { + QRectF textBoundingRect = painter->boundingRect(textRect, getText(), option); + + QMatrix matrix; + matrix.rotate(getAngle()); + QRectF mappedTextBoundingRect = matrix.mapRect(textBoundingRect); + + switch (getAlignment() & Qt::AlignHorizontal_Mask) + { + case Qt::AlignLeft: + mappedTextBoundingRect.moveLeft(textRect.left()); + break; + + case Qt::AlignHCenter: + mappedTextBoundingRect.moveLeft(textRect.left() + textRect.width() * 0.5 - mappedTextBoundingRect.width() * 0.5); + break; + + case Qt::AlignRight: + mappedTextBoundingRect.moveRight(textRect.right()); + break; + + default: + Q_ASSERT(false); + break; + } + + switch (getAlignment() & Qt::AlignVertical_Mask) + { + case Qt::AlignTop: + mappedTextBoundingRect.moveTop(textRect.top()); + break; + + case Qt::AlignVCenter: + mappedTextBoundingRect.moveTop(textRect.top() + textRect.height() * 0.5 - mappedTextBoundingRect.height() * 0.5); + break; + + case Qt::AlignBottom: + mappedTextBoundingRect.moveBottom(textRect.bottom()); + break; + + default: + Q_ASSERT(false); + break; + } + + painter->translate(mappedTextBoundingRect.center()); + painter->rotate(getAngle()); + + textBoundingRect.moveCenter(QPointF(0, 0)); + painter->drawText(textBoundingRect, getText(), option); + } } uint PDFPageContentElementTextBox::getManipulationMode(const QPointF& point,