diff options
-rw-r--r-- | src/printsupport/kernel/qpaintengine_alpha.cpp | 40 | ||||
-rw-r--r-- | src/printsupport/kernel/qpaintengine_alpha_p.h | 4 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintengine_win.cpp | 8 |
3 files changed, 35 insertions, 17 deletions
diff --git a/src/printsupport/kernel/qpaintengine_alpha.cpp b/src/printsupport/kernel/qpaintengine_alpha.cpp index ddfa918b90..ebb1b85e83 100644 --- a/src/printsupport/kernel/qpaintengine_alpha.cpp +++ b/src/printsupport/kernel/qpaintengine_alpha.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -166,11 +166,14 @@ void QAlphaPaintEngine::drawPath(const QPainterPath &path) if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + if (d->canSeeTroughBackground(d->m_hasalpha, tr) || d->m_advancedPen || d->m_advancedBrush || d->m_emulateProjectiveTransforms) { d->addAlphaRect(tr); } + + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPath(path); } else { @@ -192,12 +195,14 @@ void QAlphaPaintEngine::drawPolygon(const QPointF *points, int pointCount, Polyg if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + if (d->canSeeTroughBackground(d->m_hasalpha, tr) || d->m_advancedPen || d->m_advancedBrush || d->m_emulateProjectiveTransforms) { d->addAlphaRect(tr); } + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPolygon(points, pointCount, mode); } else { @@ -212,10 +217,12 @@ void QAlphaPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRe QRectF tr = d->m_transform.mapRect(r); if (d->m_pass == 0) { d->m_continueCall = false; - if (pm.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pm.isQBitmap()) { + if (d->canSeeTroughBackground(pm.hasAlpha() || d->m_alphaOpacity, tr) || d->m_complexTransform || pm.isQBitmap()) { d->addAlphaRect(tr); } + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPixmap(r, pm, sr); @@ -233,9 +240,12 @@ void QAlphaPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_alphaPen || d->m_alphaOpacity || d->m_advancedPen) { + if (d->canSeeTroughBackground(d->m_alphaPen || d->m_alphaOpacity, tr) || d->m_advancedPen) { d->addAlphaRect(tr); } + + d->addDirtyRect(tr); + if (d->m_picengine) { d->m_picengine->drawTextItem(p, textItem); } @@ -252,9 +262,12 @@ void QAlphaPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, if (d->m_pass == 0) { d->m_continueCall = false; - if (pixmap.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pixmap.isQBitmap()) { + if (d->canSeeTroughBackground(pixmap.hasAlpha() || d->m_alphaOpacity, brect) || d->m_complexTransform || pixmap.isQBitmap()) { d->addAlphaRect(brect); } + + d->addDirtyRect(brect); + if (d->m_picengine) d->m_picengine->drawTiledPixmap(r, pixmap, s); } else { @@ -410,19 +423,14 @@ QRectF QAlphaPaintEnginePrivate::addPenWidth(const QPainterPath &path) return (tmp.controlPointRect() * m_transform).boundingRect(); } -QRect QAlphaPaintEnginePrivate::toRect(const QRectF &rect) const +void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) { - QRect r; - r.setLeft(int(rect.left())); - r.setTop(int(rect.top())); - r.setRight(int(rect.right() + 1)); - r.setBottom(int(rect.bottom() + 1)); - return r; + m_alphargn |= rect.toAlignedRect(); } -void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) +bool QAlphaPaintEnginePrivate::canSeeTroughBackground(bool somethingInRectHasAlpha, const QRectF &rect) const { - m_alphargn |= toRect(rect); + return somethingInRectHasAlpha && m_dirtyrgn.intersects(rect.toAlignedRect()); } void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) @@ -474,7 +482,7 @@ void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) bool QAlphaPaintEnginePrivate::fullyContained(const QRectF &rect) const { - QRegion r(toRect(rect)); + QRegion r(rect.toAlignedRect()); return (m_cliprgn.intersected(r) == r); } diff --git a/src/printsupport/kernel/qpaintengine_alpha_p.h b/src/printsupport/kernel/qpaintengine_alpha_p.h index 8a0781d0d3..d3b10b3d3c 100644 --- a/src/printsupport/kernel/qpaintengine_alpha_p.h +++ b/src/printsupport/kernel/qpaintengine_alpha_p.h @@ -107,6 +107,7 @@ public: QRegion m_alphargn; QRegion m_cliprgn; + QRegion m_dirtyrgn; bool m_hasalpha; bool m_alphaPen; @@ -122,6 +123,9 @@ public: QPen m_pen; void addAlphaRect(const QRectF &rect); + void addDirtyRect(const QRectF &rect) { m_dirtyrgn |= rect.toAlignedRect(); } + bool canSeeTroughBackground(bool somethingInRectHasAlpha, const QRectF &rect) const; + QRectF addPenWidth(const QPainterPath &path); void drawAlphaImage(const QRectF &rect); QRect toRect(const QRectF &rect) const; diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 52b67d162b..8fbf20529c 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -573,7 +573,13 @@ void QWin32PrintEngine::drawPixmap(const QRectF &targetRect, width = (tw - (x * txinc)); } - QPixmap p = pixmap.copy(tileSize * x, tileSize * y, imgw, imgh); + + QImage img(QSize(imgw, imgh), QImage::Format_RGB32); + img.fill(Qt::white); + QPainter painter(&img); + painter.drawPixmap(0,0, pixmap, tileSize * x, tileSize * y, imgw, imgh); + QPixmap p = QPixmap::fromImage(img); + HBITMAP hbitmap = qt_pixmapToWinHBITMAP(p, HBitmapNoAlpha); HDC display_dc = GetDC(0); HDC hbitmap_hdc = CreateCompatibleDC(display_dc); |