X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgui%2Fepixmap.cpp;h=176868517055307a9d5e7b50ffdfa27d6405db94;hb=d7ab294b7c6543df3eb4d59748e5fb71357ab3b1;hp=4e15b4eb5ba85c956b149348c0596be040381ced;hpb=6c2d3fc303542b7f77f4350974acf781a1b91c30;p=vuplus_dvbapp diff --git a/lib/gui/epixmap.cpp b/lib/gui/epixmap.cpp index 4e15b4e..1768685 100644 --- a/lib/gui/epixmap.cpp +++ b/lib/gui/epixmap.cpp @@ -3,22 +3,37 @@ #include ePixmap::ePixmap(eWidget *parent) - :eWidget(parent), m_alphatest(false) + :eWidget(parent), m_alphatest(false), m_scale(false), m_have_border_color(false), m_border_width(0) { } -void ePixmap::setAlphatest(bool alphatest) +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); @@ -31,7 +46,31 @@ void ePixmap::setPixmapFromFile(const char *filename) // TODO: This only works for desktop 0 getDesktop(0)->makeCompatiblePixmap(*m_pixmap); - event(evtChangedPixmap); + event(evtChangedPixmap); +} + +void ePixmap::setBorderWidth(int pixel) +{ + m_border_width=pixel; + invalidate(); +} + +void ePixmap::setBorderColor(const gRGB &color) +{ + m_border_color=color; + m_have_border_color=true; + invalidate(); +} + +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) @@ -39,22 +78,50 @@ int ePixmap::event(int event, void *data, void *data2) switch (event) { case evtPaint: - { - ePtr style; - - getStyle(style); - -// eWidget::event(event, data, data2); - + { + ePtr style; + + eSize s(size()); + getStyle(style); + +// 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), eRect(), m_alphatest?gPainter::BT_ALPHATEST:0); - - return 0; - } - case evtChangedPixmap: + { + 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); + } + +// border + if (m_have_border_color) + painter.setForegroundColor(m_border_color); + painter.fill(eRect(0, 0, s.width(), m_border_width)); + painter.fill(eRect(0, m_border_width, m_border_width, s.height()-m_border_width)); + painter.fill(eRect(m_border_width, s.height()-m_border_width, s.width()-m_border_width, m_border_width)); + painter.fill(eRect(s.width()-m_border_width, m_border_width, m_border_width, s.height()-m_border_width)); + + return 0; + } + case evtChangedPixmap: + checkSize(); invalidate(); return 0; + case evtChangedSize: + checkSize(); + /* fall trough. */ default: return eWidget::event(event, data, data2); }