]> git.vomp.tv Git - vompclient.git/blob - vteletextview.cc
Preparations for dynamic mode switching
[vompclient.git] / vteletextview.cc
1 /*\r
2     Copyright 2005-2008 Chris Tallon, Marten Richter\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 #include <math.h>\r
21 #include "vteletextview.h"\r
22 #include "video.h"\r
23 #include "timers.h"\r
24 #include "boxstack.h"\r
25 #include "remote.h"\r
26 \r
27 \r
28 VTeletextView::VTeletextView(TeletextDecoderVBIEBU* TTdecoder,Boxx* playerview)\r
29 {   \r
30     ttdecoder=TTdecoder;\r
31     pv=playerview;\r
32     subtitlemode=false;\r
33     \r
34     \r
35 \r
36     if (Video::getInstance()->getFormat() == Video::PAL)\r
37     { \r
38         //setSize(680, 550);\r
39         setSize(680,22); //Only first line\r
40         setPosition(40, 26);\r
41     }\r
42     else\r
43     {\r
44         setPosition(40, 30);\r
45         //setSize(680, 450);\r
46         setSize(680,18);//only first line\r
47     }\r
48     createBuffer();\r
49     keyindigit=1;\r
50     page=0x100;\r
51     \r
52 }\r
53 \r
54 VTeletextView::~VTeletextView ()\r
55 {\r
56     // Make sure the timer is deleted\r
57         Log::getInstance()->log("VTeletextView", Log::DEBUG, "VTeletextView destruct");\r
58   pv->draw();\r
59   BoxStack::getInstance()->update(pv);\r
60   Timers::getInstance()->cancelTimer(this, 1);\r
61   ttdecoder->unRegisterTeletextView(this);\r
62     \r
63 }\r
64 \r
65 void VTeletextView::draw(bool completedraw, bool onlyfirstline)\r
66 {\r
67         //Log::getInstance()->log("VTeletextView", Log::ERR, "Start draw");\r
68     Boxx::draw();\r
69     int x,y;\r
70     \r
71     Boxx *drawtarget=NULL;\r
72     int ox,oy;\r
73     for (y=0;y<25;y++) {\r
74         if (y==0) {\r
75                 drawtarget=this;\r
76                 ox=0;\r
77                 oy=0;\r
78         } else {\r
79                 drawtarget=pv;\r
80                 ox=this->getScreenX();\r
81                 oy=this->getScreenY();\r
82         }\r
83 \r
84         for (x=0;x<40;x++) {\r
85             if (ttdecoder->isDirty(x,y) || completedraw) {\r
86                 cTeletextChar c=ttdecoder->getChar(x,y);\r
87                 c.SetDirty(false);\r
88                 //Skip Blinking and conceal\r
89                 drawtarget->drawTTChar(ox,oy,x,y,c);\r
90                 ttdecoder->setChar(x,y,c);\r
91             }\r
92         }\r
93     //    Log::getInstance()->log("VTeletextView", Log::ERR, "Line %d",y);\r
94         if (onlyfirstline) break;\r
95     }\r
96   //  Log::getInstance()->log("VTeletextView", Log::ERR, "Start end");\r
97    \r
98     \r
99 }\r
100 \r
101 \r
102 \r
103 \r
104 \r
105 int VTeletextView::handleCommand(int command) {\r
106     if (subtitlemode) return 0; //Ok we are in  subtitle mode, we are a slave of the player\r
107     switch (command) {\r
108     case Remote::OK:\r
109         return 2;\r
110     case Remote::BACK:\r
111         return 4;\r
112      case Remote::ZERO:\r
113     case Remote::ONE:\r
114     case Remote::TWO:\r
115     case Remote::THREE:\r
116     case Remote::FOUR:\r
117     case Remote::FIVE:\r
118     case Remote::SIX:\r
119     case Remote::SEVEN:\r
120     case Remote::EIGHT:\r
121     case Remote::NINE:\r
122     {\r
123       // key in teletext page\r
124       doKey(command);\r
125       return 2;\r
126     }\r
127     };\r
128 \r
129     return 0;\r
130     \r
131 }\r
132 \r
133 void VTeletextView::doKey(int command)\r
134 {\r
135     char pagenums[3];\r
136     if (keyindigit==1){\r
137         if (command==9) return; //not allowed\r
138         page=command<<8;\r
139         pagenums[0]=command+ 48;\r
140         pagenums[1]='-';\r
141         pagenums[2]='-';\r
142         keyindigit++;\r
143     } else if (keyindigit==2) {\r
144         page|=command<<4;\r
145         pagenums[0]=48+((page &0xF00)>>8);\r
146         pagenums[1]=command+ 48;\r
147         pagenums[2]='-';\r
148         keyindigit++;\r
149     } else if (keyindigit==3) {\r
150         page|=command;\r
151         pagenums[0]=48+((page &0xF00)>>8);\r
152         pagenums[1]=48+((page &0x0F0)>>4);\r
153         pagenums[2]=48+command;\r
154         keyindigit=1;\r
155         ttdecoder->setPage(page);\r
156     }\r
157     ttdecoder->setKeyinDigits(pagenums,true);\r
158     Region toupdate;\r
159     toupdate.w=16*40;\r
160     if (Video::getInstance()->getFormat() == Video::PAL) {\r
161         toupdate.h=22;\r
162         \r
163      } else {\r
164         toupdate.h=18;\r
165         \r
166       }\r
167      toupdate.x=0;\r
168      toupdate.y=0;\r
169             \r
170      draw(false,true);\r
171      BoxStack::getInstance()->update(this,&toupdate);\r
172 \r
173 }\r
174 \r
175 void VTeletextView::timercall(int clientReference)\r
176 {\r
177     \r
178 }\r
179 \r
180 void VTeletextView::processMessage(Message* m)\r
181 {\r
182     if (m->message == Message::TELETEXTUPDATE)\r
183     {\r
184         draw(false,false);\r
185         BoxStack::getInstance()->update(this);\r
186         BoxStack::getInstance()->update(pv);\r
187 \r
188     } else if (m->message == Message::TELETEXTUPDATEFIRSTLINE) \r
189     {\r
190         Region toupdate;\r
191         toupdate.w=16*40;\r
192         if (Video::getInstance()->getFormat() == Video::PAL) {\r
193             toupdate.h=22;\r
194             \r
195         } else {\r
196             toupdate.h=18;\r
197             \r
198         }\r
199         toupdate.x=0;\r
200         toupdate.y=0;\r
201 \r
202 \r
203             \r
204         draw(false,true);\r
205         BoxStack::getInstance()->update(this,&toupdate);\r
206 \r
207     }\r
208 }\r
209 \r
210 \r