X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e5bbd02558ad3f44606cf4ae790b57c682ce5ce0..34d336d2c8e99b15045cd1ef7d40cbee4c0f18bb:/lib/gui/epixmap.cpp diff --git a/lib/gui/epixmap.cpp b/lib/gui/epixmap.cpp index e4e4acc3..f20c1a9f 100644 --- a/lib/gui/epixmap.cpp +++ b/lib/gui/epixmap.cpp @@ -2,25 +2,64 @@ #include #include -ePixmap::ePixmap(eWidget *parent): eWidget(parent) +ePixmap::ePixmap(eWidget *parent) + :eWidget(parent), m_alphatest(false), m_scale(false) { } +void ePixmap::setAlphatest(int alphatest) +{ + m_alphatest = alphatest; + setTransparent(alphatest); +} + +void ePixmap::setScale(int scale) +{ + if (m_scale != scale) + { + m_scale = scale; + invalidate(); + } +} + void ePixmap::setPixmap(gPixmap *pixmap) { m_pixmap = pixmap; event(evtChangedPixmap); } +void ePixmap::setPixmap(ePtr &pixmap) +{ + m_pixmap = pixmap; + event(evtChangedPixmap); +} + void ePixmap::setPixmapFromFile(const char *filename) { loadPNG(m_pixmap, filename); - - // TODO - getDesktop()->makeCompatiblePixmap(*m_pixmap); + + if (!m_pixmap) + { + eDebug("ePixmap::setPixmapFromFile: loadPNG failed"); + return; + } + + // TODO: This only works for desktop 0 + getDesktop(0)->makeCompatiblePixmap(*m_pixmap); event(evtChangedPixmap); } +void ePixmap::checkSize() +{ + /* when we have no pixmap, or a pixmap of different size, we need + to enable transparency in any case. */ + if (m_pixmap && m_pixmap->size() == size() && !m_alphatest) + setTransparent(0); + else + setTransparent(1); + /* fall trough. */ +} + int ePixmap::event(int event, void *data, void *data2) { switch (event) @@ -30,18 +69,37 @@ int ePixmap::event(int event, void *data, void *data2) ePtr style; getStyle(style); - -// eWidget::event(event, data, data2); - + +// we don't clear the background before because of performance reasons. +// when the pixmap is too small to fit the whole widget area, the widget is +// transparent anyway, so the background is already painted. +// eWidget::event(event, data, data2); + gPainter &painter = *(gPainter*)data2; if (m_pixmap) - painter.blit(m_pixmap, ePoint(0, 0)); - + { + int flags = 0; + if (m_alphatest == 0) + flags = 0; + else if (m_alphatest == 1) + flags = gPainter::BT_ALPHATEST; + else if (m_alphatest == 2) + flags = gPainter::BT_ALPHABLEND; + if (m_scale) + painter.blitScale(m_pixmap, eRect(ePoint(0, 0), size()), eRect(), flags); + else + painter.blit(m_pixmap, ePoint(0, 0), eRect(), flags); + } + return 0; } case evtChangedPixmap: + checkSize(); invalidate(); return 0; + case evtChangedSize: + checkSize(); + /* fall trough. */ default: return eWidget::event(event, data, data2); }