190void QGraphicsEffectSource::draw(QPainter *painter)
192 Q_D(
const QGraphicsEffectSource);
195 if (QPixmapCache::find(d->m_cacheKey, &pm)) {
196 QTransform restoreTransform;
197 if (d->m_cachedSystem == Qt::DeviceCoordinates) {
198 restoreTransform = painter->worldTransform();
199 painter->setWorldTransform(QTransform());
202 painter->drawPixmap(d->m_cachedOffset, pm);
204 if (d->m_cachedSystem == Qt::DeviceCoordinates)
205 painter->setWorldTransform(restoreTransform);
207 d_func()->draw(painter);
282QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offset, QGraphicsEffect::PixmapPadMode mode)
const
284 Q_D(
const QGraphicsEffectSource);
287 const QGraphicsItem *item = graphicsItem();
288 if (system == Qt::LogicalCoordinates && mode == QGraphicsEffect::NoPad && item && isPixmap()) {
289 const QGraphicsPixmapItem *pixmapItem =
static_cast<
const QGraphicsPixmapItem *>(item);
291 *offset = pixmapItem->offset().toPoint();
292 return pixmapItem->pixmap();
295 if (Q_UNLIKELY(system == Qt::DeviceCoordinates && item &&
296 !
static_cast<
const QGraphicsItemEffectSourcePrivate *>(d_func())->info)) {
297 qWarning(
"QGraphicsEffectSource::pixmap: Not yet implemented, lacking device context");
302 if (item && d->m_cachedSystem == system && d->m_cachedMode == mode)
303 QPixmapCache::find(d->m_cacheKey, &pm);
306 pm = d->pixmap(system, &d->m_cachedOffset, mode);
307 d->m_cachedSystem = system;
308 d->m_cachedMode = mode;
310 d->invalidateCache();
311 d->m_cacheKey = QPixmapCache::insert(pm);
315 *offset = d->m_cachedOffset;
609void QGraphicsColorizeEffect::setColor(
const QColor &color)
611 Q_D(QGraphicsColorizeEffect);
612 if (d->filter->color() == color)
615 d->filter->setColor(color);
617 emit colorChanged(color);
633void QGraphicsColorizeEffect::setStrength(qreal strength)
635 Q_D(QGraphicsColorizeEffect);
636 if (qFuzzyCompare(d->filter->strength(), strength))
639 d->filter->setStrength(strength);
640 d->opaque = !qFuzzyIsNull(strength);
642 emit strengthChanged(strength);
661void QGraphicsColorizeEffect::draw(QPainter *painter)
663 Q_D(QGraphicsColorizeEffect);
671 if (sourceIsPixmap()) {
673 const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset, NoPad);
674 if (!pixmap.isNull())
675 d->filter->draw(painter, offset, pixmap);
681 const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset);
685 QTransform restoreTransform = painter->worldTransform();
686 painter->setWorldTransform(QTransform());
687 d->filter->draw(painter, offset, pixmap);
688 painter->setWorldTransform(restoreTransform);
737QGraphicsBlurEffect::QGraphicsBlurEffect(QObject *parent)
738 : QGraphicsEffect(*
new QGraphicsBlurEffectPrivate, parent)
740 Q_D(QGraphicsBlurEffect);
741 d->filter->setBlurHints(QGraphicsBlurEffect::PerformanceHint);
769void QGraphicsBlurEffect::setBlurRadius(qreal radius)
771 Q_D(QGraphicsBlurEffect);
772 if (qFuzzyCompare(d->filter->radius(), radius))
775 d->filter->setRadius(radius);
776 updateBoundingRect();
777 emit blurRadiusChanged(radius);
803void QGraphicsBlurEffect::setBlurHints(QGraphicsBlurEffect::BlurHints hints)
805 Q_D(QGraphicsBlurEffect);
806 if (d->filter->blurHints() == hints)
809 d->filter->setBlurHints(hints);
810 emit blurHintsChanged(hints);
832void QGraphicsBlurEffect::draw(QPainter *painter)
834 Q_D(QGraphicsBlurEffect);
835 if (d->filter->radius() < 1) {
840 PixmapPadMode mode = PadToEffectiveBoundingRect;
843 QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset, mode);
847 d->filter->draw(painter, offset, pixmap);
906void QGraphicsDropShadowEffect::setOffset(
const QPointF &offset)
908 Q_D(QGraphicsDropShadowEffect);
909 if (d->filter->offset() == offset)
912 d->filter->setOffset(offset);
913 updateBoundingRect();
914 emit offsetChanged(offset);
961void QGraphicsDropShadowEffect::setBlurRadius(qreal blurRadius)
963 Q_D(QGraphicsDropShadowEffect);
964 if (qFuzzyCompare(d->filter->blurRadius(), blurRadius))
967 d->filter->setBlurRadius(blurRadius);
968 updateBoundingRect();
969 emit blurRadiusChanged(blurRadius);
994void QGraphicsDropShadowEffect::setColor(
const QColor &color)
996 Q_D(QGraphicsDropShadowEffect);
997 if (d->filter->color() == color)
1000 d->filter->setColor(color);
1002 emit colorChanged(color);
1024void QGraphicsDropShadowEffect::draw(QPainter *painter)
1026 Q_D(QGraphicsDropShadowEffect);
1027 if (d->filter->blurRadius() <= 0 && d->filter->offset().isNull()) {
1028 drawSource(painter);
1032 PixmapPadMode mode = PadToEffectiveBoundingRect;
1036 const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset, mode);
1037 if (pixmap.isNull())
1040 QTransform restoreTransform = painter->worldTransform();
1041 painter->setWorldTransform(QTransform());
1042 d->filter->draw(painter, offset, pixmap);
1043 painter->setWorldTransform(restoreTransform);
1097void QGraphicsOpacityEffect::setOpacity(qreal opacity)
1099 Q_D(QGraphicsOpacityEffect);
1100 opacity = qBound(qreal(0.0), opacity, qreal(1.0));
1102 if (qFuzzyCompare(d->opacity, opacity))
1105 d->opacity = opacity;
1106 if ((d->isFullyTransparent = qFuzzyIsNull(d->opacity)))
1107 d->isFullyOpaque = 0;
1109 d->isFullyOpaque = qFuzzyIsNull(d->opacity - 1);
1111 emit opacityChanged(opacity);
1164void QGraphicsOpacityEffect::draw(QPainter *painter)
1166 Q_D(QGraphicsOpacityEffect);
1169 if (d->isFullyTransparent)
1173 if (d->isFullyOpaque && !d->hasOpacityMask) {
1174 drawSource(painter);
1179 Qt::CoordinateSystem system = sourceIsPixmap() ? Qt::LogicalCoordinates : Qt::DeviceCoordinates;
1180 QPixmap pixmap = sourcePixmap(system, &offset, QGraphicsEffect::NoPad);
1181 if (pixmap.isNull())
1185 painter->setOpacity(d->opacity);
1187 if (d->hasOpacityMask) {
1188 QPainter pixmapPainter(&pixmap);
1189 pixmapPainter.setRenderHints(painter->renderHints());
1190 pixmapPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
1191 if (system == Qt::DeviceCoordinates) {
1192 QTransform worldTransform = painter->worldTransform();
1193 worldTransform *= QTransform::fromTranslate(-offset.x(), -offset.y());
1194 pixmapPainter.setWorldTransform(worldTransform);
1195 pixmapPainter.fillRect(sourceBoundingRect(), d->opacityMask);
1197 pixmapPainter.translate(-offset);
1198 pixmapPainter.fillRect(pixmap.rect(), d->opacityMask);
1202 if (system == Qt::DeviceCoordinates)
1203 painter->setWorldTransform(QTransform());
1205 painter->drawPixmap(offset, pixmap);