1 #include "waveformrenderbackground.h"
2 #include "waveformwidgetrenderer.h"
3 
4 #include "widget/wskincolor.h"
5 #include "widget/wwidget.h"
6 #include "widget/wimagestore.h"
7 
WaveformRenderBackground(WaveformWidgetRenderer * waveformWidgetRenderer)8 WaveformRenderBackground::WaveformRenderBackground(
9     WaveformWidgetRenderer* waveformWidgetRenderer)
10         : WaveformRendererAbstract(waveformWidgetRenderer),
11           m_backgroundColor(0, 0, 0) {
12 }
13 
~WaveformRenderBackground()14 WaveformRenderBackground::~WaveformRenderBackground() {
15 }
16 
setup(const QDomNode & node,const SkinContext & context)17 void WaveformRenderBackground::setup(const QDomNode& node,
18                                      const SkinContext& context) {
19     m_backgroundColor = m_waveformRenderer->getWaveformSignalColors()->getBgColor();
20     QString backgroundPixmapPath = context.selectString(node, "BgPixmap");
21     if (!backgroundPixmapPath.isEmpty()) {
22         m_backgroundPixmapPath = context.makeSkinPath(backgroundPixmapPath);
23     }
24     setDirty(true);
25 }
26 
draw(QPainter * painter,QPaintEvent *)27 void WaveformRenderBackground::draw(QPainter* painter,
28                                     QPaintEvent* /*event*/) {
29     if (isDirty()) {
30         generateImage();
31     }
32 
33     // If there is no background image, just fill the painter with the
34     // background color.
35     if (m_backgroundImage.isNull()) {
36         painter->fillRect(0, 0, m_waveformRenderer->getWidth(),
37                           m_waveformRenderer->getHeight(), m_backgroundColor);
38         return;
39     }
40 
41     // since we use opaque widget we need to draw the background !
42     painter->drawImage(QPoint(0, 0), m_backgroundImage);
43 
44     // This produces a white back ground with Linux QT 4.6 QGlWidget and
45     // Intel i915 driver and has peroformance issues on other setups. See lp:981210
46     //painter->drawPixmap(QPoint(0, 0), m_backgroundPixmap);
47 }
48 
generateImage()49 void WaveformRenderBackground::generateImage() {
50     m_backgroundImage = QImage();
51     if (!m_backgroundPixmapPath.isEmpty()) {
52         QImage backgroundImage = *WImageStore::getImage(
53                 m_backgroundPixmapPath,
54                 scaleFactor());
55 
56         if (!backgroundImage.isNull()) {
57             if (backgroundImage.width() == m_waveformRenderer->getWidth() &&
58                     backgroundImage.height() == m_waveformRenderer->getHeight()) {
59                 m_backgroundImage = backgroundImage.convertToFormat(QImage::Format_RGB32);
60             } else {
61                 m_backgroundImage = QImage(m_waveformRenderer->getWidth(),
62                                            m_waveformRenderer->getHeight(),
63                                            QImage::Format_RGB32);
64                 QPainter painter(&m_backgroundImage);
65                 painter.setRenderHint(QPainter::SmoothPixmapTransform);
66                 painter.drawImage(m_backgroundImage.rect(),
67                                   backgroundImage, backgroundImage.rect());
68             }
69         }
70     }
71     setDirty(false);
72 }
73