2007-08-05 10:41:55 +02:00
|
|
|
/*
|
2007-08-06 13:20:02 +02:00
|
|
|
* Copyright 2007 by Zack Rusin <zack@kde.org>
|
2007-08-05 10:41:55 +02:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Library General Public License version 2 as
|
|
|
|
* published by the Free Software Foundation
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this program; if not, write to the
|
|
|
|
* Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "shadowitem_p.h"
|
|
|
|
|
|
|
|
#include "effects/blur.cpp"
|
|
|
|
|
|
|
|
#include <QPainter>
|
|
|
|
#include <QImage>
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
ShadowItem::ShadowItem(QGraphicsItem *item)
|
|
|
|
{
|
|
|
|
setZValue(20);
|
|
|
|
m_shadowParent = 0;
|
|
|
|
m_offset = QPointF(12, 12);
|
|
|
|
setShadowParent(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShadowItem::setShadowParent(QGraphicsItem *item)
|
|
|
|
{
|
|
|
|
m_shadowParent = item;
|
|
|
|
adjustPosition();
|
|
|
|
generate();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QGraphicsItem * ShadowItem::shadowParent() const
|
|
|
|
{
|
|
|
|
return m_shadowParent;
|
|
|
|
}
|
|
|
|
|
|
|
|
QSize ShadowItem::shadowedSize() const
|
|
|
|
{
|
|
|
|
QSize s = boundingRect().size().toSize();
|
|
|
|
return s - QSize(32, 32);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShadowItem::generate()
|
|
|
|
{
|
|
|
|
if (!m_shadowParent) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPainterPath path = m_shadowParent->shape();
|
|
|
|
QRectF rect = path.boundingRect();
|
|
|
|
QSize s = rect.size().toSize() + QSize(30, 30);
|
|
|
|
QImage img(s, QImage::Format_ARGB32_Premultiplied);
|
|
|
|
img.fill(0);
|
|
|
|
QPainter p(&img);
|
|
|
|
p.translate(15, 15);
|
|
|
|
p.setRenderHint(QPainter::Antialiasing);
|
|
|
|
p.setCompositionMode(QPainter::CompositionMode_Source);
|
|
|
|
p.fillPath(path, Qt::gray);
|
|
|
|
p.end();
|
|
|
|
#ifdef DO_GLOW
|
|
|
|
QImage blurred = img;
|
|
|
|
expblur<16, 7>(img, 7);
|
|
|
|
p.begin(&img);
|
|
|
|
p.setCompositionMode(QPainter::CompositionMode_Plus);
|
|
|
|
p.drawImage(0, 0, blurred);
|
|
|
|
p.end();
|
|
|
|
#else
|
|
|
|
expblur<16, 7>(img, 7);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
setPixmap(QPixmap::fromImage(img));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ShadowItem::adjustPosition()
|
|
|
|
{
|
|
|
|
if (!m_shadowParent) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setPos(m_shadowParent->pos() - m_offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShadowItem::setOffset(const QPointF &offset)
|
|
|
|
{
|
|
|
|
m_offset = offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPointF ShadowItem::offset() const
|
|
|
|
{
|
|
|
|
return m_offset;
|
|
|
|
}
|