QPainter on QBitmap: make setBrush(NoBrush) work as expected.

It had no effect because of an explicit check for NoBrush.
However the default in QBitmap is (unfortunately) QBrush(color0), rather
than NoBrush, so the brush must be updated when calling setBrush(NoBrush).

I suppose the real issue is that lastBrush is default-constructed in
QRasterPaintEngine, rather than starting with the brush from QPainter,
which is QBrush(color0) for the case of the bitmap. But no reason to
special case NoBrush here anyway.

Task-Number: QTBUG-38781
Change-Id: I9996ac12bf628920cfaf0de9c886f637a336028b
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
This commit is contained in:
David Faure 2014-05-05 19:02:46 +02:00 committed by The Qt Project
parent 4689a9b3f0
commit 1aede2d7fc
2 changed files with 23 additions and 1 deletions

View File

@ -250,7 +250,7 @@ private:
QRect toNormalizedFillRect(const QRectF &rect);
inline void ensureBrush(const QBrush &brush) {
if (!qbrush_fast_equals(state()->lastBrush, brush) || (brush.style() != Qt::NoBrush && state()->fillFlags))
if (!qbrush_fast_equals(state()->lastBrush, brush) || state()->fillFlags)
updateBrush(brush);
}
inline void ensureBrush() { ensureBrush(state()->brush); }

View File

@ -282,6 +282,8 @@ private slots:
void QTBUG17053_zeroDashPattern();
void QTBUG38781_NoBrushAndQBitmap();
void drawTextOutsideGuiThread();
void drawTextWithComplexBrush();
@ -4473,6 +4475,26 @@ void tst_QPainter::QTBUG17053_zeroDashPattern()
QCOMPARE(image, original);
}
void tst_QPainter::QTBUG38781_NoBrushAndQBitmap()
{
QBitmap bitmap(10, 10);
bitmap.fill(Qt::color0);
QPainter p(&bitmap);
p.setPen(Qt::color1);
p.drawLine(0, 1, 9, 1); // at horizontal line at y=1
p.setBrush(Qt::NoBrush);
p.drawRect(0, 0, 9, 9); // a rect all around
QRgb white = qRgb(0xff, 0xff, 0xff);
QRgb black = qRgb(0, 0, 0);
QImage image = bitmap.toImage();
QCOMPARE(image.pixel(0, 0), black);
QCOMPARE(image.pixel(5, 5), white);
// Check that the rect didn't overwrite the line
QCOMPARE(image.pixel(5, 1), black);
}
class TextDrawerThread : public QThread
{
public: