diff options
author | Jens Bache-Wiig <jbache@trolltech.com> | 2010-09-29 13:25:43 +0200 |
---|---|---|
committer | Jens Bache-Wiig <jbache@trolltech.com> | 2010-09-29 13:25:43 +0200 |
commit | 33bb2924cd2a8ed3a98554f9ca79507ff83b9653 (patch) | |
tree | a507c14ce06cb0dc2931fa58227ee66e6d5b9a64 | |
parent | 2d3aa1c2c272ab4e1050daa666c41f5f9e09c5ad (diff) |
Fixed shadow offset on edges
I now adjust the viewport and icrease the shadowbuffer size
to make it possible to draw shadows on objects outside the edge
when using offsets.
-rw-r--r-- | src/context2d.cpp | 65 | ||||
-rw-r--r-- | src/context2d.h | 1 |
2 files changed, 38 insertions, 28 deletions
diff --git a/src/context2d.cpp b/src/context2d.cpp index bc3c77b..0ae52b8 100644 --- a/src/context2d.cpp +++ b/src/context2d.cpp @@ -446,37 +446,51 @@ void Context2D::setMiterLimit(qreal m) void Context2D::setShadowOffsetX(qreal x) { + if (m_state.shadowOffsetX == x) + return; + m_state.shadowOffsetX = x; + updateShadowBuffer(); if (m_painter.device() == &m_shadowbuffer && m_state.shadowBlur>0) endPainting(); - m_state.shadowOffsetX = x; m_state.flags |= DirtyShadowOffsetX; } +void Context2D::updateShadowBuffer() { + if (m_shadowbuffer.isNull() || m_shadowbuffer.width() != m_width+m_state.shadowOffsetX || + m_shadowbuffer.height() != m_height+m_state.shadowOffsetY) { + m_shadowbuffer = QImage(m_width+m_state.shadowOffsetX, m_height+m_state.shadowOffsetY, QImage::Format_ARGB32); + m_shadowbuffer.fill(Qt::transparent); + } +} + void Context2D::setShadowOffsetY(qreal y) { + if (m_state.shadowOffsetY == y) + return; + m_state.shadowOffsetY = y; + updateShadowBuffer(); if (m_painter.device() == &m_shadowbuffer && m_state.shadowBlur>0) endPainting(); - m_state.shadowOffsetY = y; + m_state.flags |= DirtyShadowOffsetY; } void Context2D::setShadowBlur(qreal b) { - if (m_shadowbuffer.isNull() || m_shadowbuffer.width() != m_width || m_shadowbuffer.height() != m_height) { - m_shadowbuffer = QImage(m_width, m_height, QImage::Format_ARGB32); - } - + if (m_state.shadowBlur == b) + return; + m_state.shadowBlur = b; + updateShadowBuffer(); if (m_painter.device() == &m_shadowbuffer && m_state.shadowBlur>0) endPainting(); - m_state.shadowBlur = b; m_state.flags |= DirtyShadowBlur; } void Context2D::setShadowColor(const QString &str) { + m_state.shadowColor = colorFromString(str); if (m_painter.device() == &m_shadowbuffer && m_state.shadowBlur>0) endPainting(); - m_state.shadowColor = colorFromString(str); m_state.flags |= DirtyShadowColor; } @@ -921,19 +935,20 @@ void Context2D::beginPainting() m_pixmap.fill(parent()->property("color").value<QColor>()); } - if (m_state.shadowBlur > 0) { - if (m_shadowbuffer.width() != m_width || m_shadowbuffer.height() != m_height) { - m_shadowbuffer = QImage(m_width, m_height, QImage::Format_ARGB32_Premultiplied); - } + if (m_state.shadowBlur > 0 && m_painter.device() != &m_shadowbuffer) { + if (m_painter.isActive()) + m_painter.end(); + updateShadowBuffer(); + m_painter.begin(&m_shadowbuffer); + m_painter.setViewport(m_state.shadowOffsetX, + m_state.shadowOffsetY, + m_shadowbuffer.width(), + m_shadowbuffer.height()); + m_shadowbuffer.fill(Qt::transparent); } if (!m_painter.isActive()) { - if (m_state.shadowBlur == 0) { - m_painter.begin(&m_pixmap); - } else { - m_shadowbuffer.fill(Qt::transparent); - m_painter.begin(&m_shadowbuffer); - } + m_painter.begin(&m_pixmap); m_painter.setRenderHint(QPainter::Antialiasing); if (!m_state.clipPath.isEmpty()) m_painter.setClipPath(m_state.clipPath); @@ -949,13 +964,6 @@ void Context2D::beginPainting() pen.setMiterLimit(m_state.miterLimit); m_painter.setPen(pen); } else { - if (m_state.shadowBlur > 0 && m_painter.device() != &m_shadowbuffer) { - m_painter.end(); - - - m_shadowbuffer.fill(Qt::transparent); - m_painter.begin(&m_shadowbuffer); - } setupPainter(); m_state.flags = 0; } @@ -987,17 +995,18 @@ void Context2D::endPainting() m_painter.end(); m_painter.begin(&m_pixmap); - setupPainter(); // draw the blurred drop shadow... + m_painter.save(); QTransform tf = m_painter.transform(); m_painter.translate(0, imageRect.height()); m_painter.rotate(-90); - m_painter.drawImage(-m_state.shadowOffsetY, m_state.shadowOffsetX, alphaChannel); + m_painter.drawImage(0, 0, alphaChannel); m_painter.setTransform(tf); + m_painter.restore(); // draw source - m_painter.drawImage(0, 0, m_shadowbuffer.copy()); + m_painter.drawImage(-m_state.shadowOffsetX, -m_state.shadowOffsetY, m_shadowbuffer.copy()); m_painter.end(); } } diff --git a/src/context2d.h b/src/context2d.h index 57cf922..e700901 100644 --- a/src/context2d.h +++ b/src/context2d.h @@ -244,6 +244,7 @@ signals: private: void setupPainter(); void beginPainting(); + void updateShadowBuffer(); int m_changeTimerId; QPainterPath m_path; |