summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Bache-Wiig <jbache@trolltech.com>2010-09-29 13:25:43 +0200
committerJens Bache-Wiig <jbache@trolltech.com>2010-09-29 13:25:43 +0200
commit33bb2924cd2a8ed3a98554f9ca79507ff83b9653 (patch)
treea507c14ce06cb0dc2931fa58227ee66e6d5b9a64
parent2d3aa1c2c272ab4e1050daa666c41f5f9e09c5ad (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.cpp65
-rw-r--r--src/context2d.h1
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;