Fix misaligned selection region with text when centered
If the text is centered, the x/y position in the selection QRectF may be a multiple of 0.5 which is rounded up. This rounding causes misalignment of the selection region with the text. The alignment is fixed by using qFloor on the x and y components. Task-number: QTBUG-34218 Task-number: QTBUG-34234 Change-Id: I4f2fadeb38602f62a93773c6e5faecf03b28069f Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
parent
aa7fa09312
commit
5d8a882c11
@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
#include <qthread.h>
|
#include <qthread.h>
|
||||||
#include <qfont.h>
|
#include <qfont.h>
|
||||||
|
#include <qmath.h>
|
||||||
#include <qpainter.h>
|
#include <qpainter.h>
|
||||||
#include <qvarlengtharray.h>
|
#include <qvarlengtharray.h>
|
||||||
#include <qtextformat.h>
|
#include <qtextformat.h>
|
||||||
@ -946,15 +947,23 @@ static void addSelectedRegionsToPath(QTextEngine *eng, int lineNumber, const QPo
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastSelectionWidth > 0)
|
if (lastSelectionWidth > 0) {
|
||||||
region->addRect(boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight));
|
QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight);
|
||||||
|
rect.moveLeft(qFloor(rect.left()));
|
||||||
|
rect.moveTop(qFloor(rect.top()));
|
||||||
|
region->addRect(rect);
|
||||||
|
}
|
||||||
|
|
||||||
lastSelectionX = selectionX;
|
lastSelectionX = selectionX;
|
||||||
lastSelectionWidth = selectionWidth;
|
lastSelectionWidth = selectionWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lastSelectionWidth > 0)
|
if (lastSelectionWidth > 0) {
|
||||||
region->addRect(boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight));
|
QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight);
|
||||||
|
rect.moveLeft(qFloor(rect.left()));
|
||||||
|
rect.moveTop(qFloor(rect.top()));
|
||||||
|
region->addRect(rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline QRectF clipIfValid(const QRectF &rect, const QRectF &clip)
|
static inline QRectF clipIfValid(const QRectF &rect, const QRectF &clip)
|
||||||
@ -2077,7 +2086,7 @@ static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const Q
|
|||||||
|
|
||||||
QBrush bg = chf.background();
|
QBrush bg = chf.background();
|
||||||
if (bg.style() != Qt::NoBrush && !chf.property(SuppressBackground).toBool())
|
if (bg.style() != Qt::NoBrush && !chf.property(SuppressBackground).toBool())
|
||||||
p->fillRect(r, bg);
|
p->fillRect(QRectF(qFloor(r.x()), qFloor(r.y()), r.width(), r.height()), bg);
|
||||||
if (c.style() != Qt::NoBrush) {
|
if (c.style() != Qt::NoBrush) {
|
||||||
p->setPen(QPen(c, 0));
|
p->setPen(QPen(c, 0));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user