fix subtitle clipping
[enigma2.git] / lib / gui / esubtitle.cpp
1 #include <lib/gui/esubtitle.h>
2 #include <lib/gdi/grc.h>
3
4         /*
5                 ok, here's much room for improvements.
6         
7                 first, the placing of the individual elements is sub-optimal.
8                 then maybe a colored background would be an option.
9                 ....
10         */      
11
12 eSubtitleWidget::eSubtitleWidget(eWidget *parent)
13         : eWidget(parent), m_hide_subtitles_timer(eApp)
14 {
15         setBackgroundColor(gRGB(0,0,0,255));
16         m_page_ok = 0;
17         m_dvb_page_ok = 0;
18         CONNECT(m_hide_subtitles_timer.timeout, eSubtitleWidget::clearPage);
19 }
20
21 void eSubtitleWidget::setPage(const eDVBTeletextSubtitlePage &p)
22 {
23         m_page = p;
24         m_page_ok = 1;
25         m_hide_subtitles_timer.start(5000, true);
26         invalidate();  // FIXME
27 }
28
29 void eSubtitleWidget::setPage(const eDVBSubtitlePage &p)
30 {
31         m_dvb_page = p;
32         invalidate(m_visible_region);  // invalidate old visible regions
33         m_visible_region.rects.clear();
34         for (std::list<eDVBSubtitleRegion>::iterator it(m_dvb_page.m_regions.begin()); it != m_dvb_page.m_regions.end(); ++it)
35                 m_visible_region.rects.push_back(eRect(it->m_position, it->m_pixmap->size()));
36         m_dvb_page_ok = 1;
37         m_hide_subtitles_timer.start(5000, true);
38         invalidate(m_visible_region);  // invalidate new regions
39 }
40
41 void eSubtitleWidget::clearPage()
42 {
43         eDebug("subtitle timeout... hide");
44         m_page_ok = 0;
45         m_dvb_page_ok = 0;
46         invalidate(m_visible_region);
47         m_visible_region.rects.clear();
48 }
49
50 int eSubtitleWidget::event(int event, void *data, void *data2)
51 {
52         switch (event)
53         {
54         case evtPaint:
55         {
56                 ePtr<eWindowStyle> style;
57                 gPainter &painter = *(gPainter*)data2;
58
59                 getStyle(style);
60                 
61                 eWidget::event(event, data, data2);
62                 ePtr<gFont> font = new gFont("Regular", 30);
63                 painter.setFont(font);
64                 
65 /*              if (!m_page_ok && !m_dvb_page_ok)
66                         painter.renderText(eRect(ePoint(0, 0), size()), "waiting for subtitles...", gPainter::RT_WRAP);
67                 else */if (m_page_ok)
68                 {
69                         int elements = m_page.m_elements.size();
70                         int height = size().height();
71                         int size_per_element = height / (elements ? elements : 1);
72                         for (int i=0; i<elements; ++i)
73                         {
74                                 painter.setForegroundColor(gRGB(0,0,0));
75                                 painter.renderText(eRect(2, size_per_element * i + 2, size().width(), size_per_element), m_page.m_elements[i].m_text, gPainter::RT_WRAP|gPainter::RT_VALIGN_CENTER|gPainter::RT_HALIGN_CENTER);
76                                 painter.setForegroundColor(m_page.m_elements[i].m_color);
77                                 painter.renderText(eRect(0, size_per_element * i, size().width(), size_per_element), m_page.m_elements[i].m_text, gPainter::RT_WRAP|gPainter::RT_VALIGN_CENTER|gPainter::RT_HALIGN_CENTER);
78                         }
79                 }
80                 else if (m_dvb_page_ok)
81                 {
82                         for (std::list<eDVBSubtitleRegion>::iterator it(m_dvb_page.m_regions.begin()); it != m_dvb_page.m_regions.end(); ++it)
83                                 painter.blit(it->m_pixmap, it->m_position);
84                 }
85                 return 0;
86         }
87         default:
88                 return eWidget::event(event, data, data2);
89         }
90 }