MythTV  master
teletextscreen.cpp
Go to the documentation of this file.
1 #include <QFontMetrics>
2 #include <QPainter>
3 
4 #include "mythlogging.h"
5 #include "mythfontproperties.h"
6 #include "mythuitext.h"
7 #include "mythuishape.h"
8 #include "vbilut.h"
9 #include "mythimage.h"
10 #include "mythuiimage.h"
11 #include "mythpainter.h"
12 #include "teletextscreen.h"
13 #include "subtitlescreen.h"
14 
15 #define LOC QString("TeletextScreen: ")
16 
17 const QColor TeletextScreen::kColorBlack = QColor( 0, 0, 0,255);
18 const QColor TeletextScreen::kColorRed = QColor(255, 0, 0,255);
19 const QColor TeletextScreen::kColorGreen = QColor( 0,255, 0,255);
20 const QColor TeletextScreen::kColorYellow = QColor(255,255, 0,255);
21 const QColor TeletextScreen::kColorBlue = QColor( 0, 0,255,255);
22 const QColor TeletextScreen::kColorMagenta = QColor(255, 0,255,255);
23 const QColor TeletextScreen::kColorCyan = QColor( 0,255,255,255);
24 const QColor TeletextScreen::kColorWhite = QColor(255,255,255,255);
26 const int TeletextScreen::kTeletextRows = 26;
27 
29 static int gTTBackgroundAlpha;
30 
31 static QChar cvt_char(char ch, int lang)
32 {
33  for (int j = 0; j < 14; j++)
34  {
35  int c = ch & 0x7F;
36  if (c == lang_chars[0][j])
37  ch = lang_chars[lang + 1][j];
38  }
39  return QLatin1Char(ch);
40 }
41 
43  int fontStretch) :
45  m_player(player),
46  m_fontStretch(fontStretch)
47 {
48 }
49 
51 {
52  ClearScreen();
53 }
54 
56 {
57  if (m_player)
59  return m_player && m_teletextReader;
60 }
61 
63 {
65  QHash<int, QImage*>::iterator it = m_rowImages.begin();
66  for (; it != m_rowImages.end(); ++it)
67  {
68  if (*it)
69  delete (*it);
70  }
71  m_rowImages.clear();
72  SetRedraw();
73 }
74 
75 QImage* TeletextScreen::GetRowImage(int row, QRect &rect)
76 {
77  int y = row & ~1;
78  rect.translate(0, -(y * m_rowHeight));
79  if (!m_rowImages.contains(y))
80  {
81  QImage* img = new QImage(m_safeArea.width(), m_rowHeight * 2,
82  QImage::Format_ARGB32);
83  if (img)
84  {
85  img->fill(0);
86  m_rowImages.insert(y, img);
87  }
88  else
89  return nullptr;
90  }
91  return m_rowImages.value(y);
92 }
93 
95 {
97  if (!vo)
98  return;
99  MythPainter *osd_painter = vo->GetOSDPainter();
100  if (!osd_painter)
101  return;
102 
103  QHashIterator<int, QImage*> it(m_rowImages);
104  while (it.hasNext())
105  {
106  it.next();
107  MythImage *image = osd_painter->GetFormatImage();
108  if (!image || !it.value())
109  continue;
110 
111  int row = it.key();
112  image->Assign(*(it.value()));
113  MythUIImage *uiimage = new MythUIImage(this, QString("ttrow%1")
114  .arg(row));
115  if (uiimage)
116  {
117  uiimage->SetImage(image);
118  uiimage->SetArea(MythRect(0, row * m_rowHeight,
119  m_safeArea.width(), m_rowHeight * 2));
120  }
121  image->DecrRef();
122  }
123 
124  QRegion visible;
125  QListIterator<MythUIType *> i(m_ChildrenList);
126  while (i.hasNext())
127  {
128  MythUIType *img = i.next();
129  visible = visible.united(img->GetArea());
130  }
131 
132  if (visible.isEmpty())
133  return;
134 
135  QRect bounding = visible.boundingRect();
136  bounding = bounding.translated(m_safeArea.topLeft());
137  bounding = m_safeArea.intersected(bounding);
138  int left = m_safeArea.left() - bounding.left();
139  int top = m_safeArea.top() - bounding.top();
140  SetArea(MythRect(bounding));
141 
142  i.toFront();;
143  while (i.hasNext())
144  {
145  MythUIType *img = i.next();
146  img->SetArea(img->GetArea().translated(left, top));
147  }
148 }
149 
151 {
152  if (!InitialiseFont() || !m_displaying)
153  return;
154 
155  if (m_player && m_player->GetVideoOutput())
156  {
157  static const float kTextPadding = 0.96F;
158  QRect oldsafe = m_safeArea;
160  m_colWidth = (int)((float)m_safeArea.width() / (float)kTeletextColumns);
161  m_rowHeight = (int)((float)m_safeArea.height() / (float)kTeletextRows);
162 
163  if (oldsafe != m_safeArea)
164  {
166 
167  int max_width = (int)((float)m_colWidth * kTextPadding);
168  m_fontHeight = (int)((float)m_rowHeight * kTextPadding);
169  if (max_width > (m_colWidth - 2))
170  max_width = m_colWidth -2;
171  if (m_fontHeight > (m_rowHeight - 2))
173  gTTFont->GetFace()->setPixelSize(m_fontHeight);
174 
175  m_fontStretch = 200;
176  bool ok = false;
177  while (!ok && m_fontStretch > 50)
178  {
179  gTTFont->GetFace()->setStretch(m_fontStretch);
180  QFontMetrics font(*(gTTFont->GetFace()));
181  if (font.averageCharWidth() <= max_width || m_fontStretch < 50)
182  ok = true;
183  else
184  m_fontStretch -= 10;
185  }
186  }
187  }
188  else
189  {
190  return;
191  }
192 
194  return;
195 
196  ClearScreen();
197 
198  const TeletextSubPage *ttpage = m_teletextReader->FindSubPage();
199 
200  if (!ttpage)
201  {
202  // no page selected so show the header and a list of available pages
203  DrawHeader(nullptr, 0);
206  return;
207  }
208 
210 
211  int a = 0;
212  if ((ttpage->subtitle) ||
214  {
215  a = 1; // when showing subtitles we don't want to see the teletext
216  // header line, so we skip that line...
219  }
220  else
221  {
226  }
227 
228  for (int y = kTeletextRows - a; y >= 2; y--)
229  DrawLine(ttpage->data[y-1], y, ttpage->lang);
230 
233 }
234 
235 bool TeletextScreen::KeyPress(const QString &key)
236 {
237  if (m_teletextReader)
238  return m_teletextReader->KeyPress(key);
239  return false;
240 }
241 
242 void TeletextScreen::SetPage(int page, int subpage)
243 {
244  if (m_teletextReader)
245  m_teletextReader->SetPage(page, subpage);
246 }
247 
249 {
250  m_displaying = display;
251  if (!m_displaying)
252  ClearScreen();
253 }
254 
256 {
257  if (m_teletextReader)
259 }
260 
261 void TeletextScreen::DrawHeader(const uint8_t *page, int lang)
262 {
263  if (!m_displaying)
264  return;
265 
266  if (page != nullptr)
267  DrawLine(page, 1, lang);
268 
269  DrawStatus();
270 }
271 
272 static QColor ttcolortoqcolor(int ttcolor)
273 {
274  QColor color;
275 
276  switch (ttcolor & ~kTTColorTransparent)
277  {
278  case kTTColorBlack: color = TeletextScreen::kColorBlack; break;
279  case kTTColorRed: color = TeletextScreen::kColorRed; break;
280  case kTTColorGreen: color = TeletextScreen::kColorGreen; break;
281  case kTTColorYellow: color = TeletextScreen::kColorYellow; break;
282  case kTTColorBlue: color = TeletextScreen::kColorBlue; break;
283  case kTTColorMagenta: color = TeletextScreen::kColorMagenta; break;
284  case kTTColorCyan: color = TeletextScreen::kColorCyan; break;
285  case kTTColorWhite: color = TeletextScreen::kColorWhite; break;
286  }
287 
288  return color;
289 }
290 
291 static QString TTColorToString(int ttcolor)
292 {
293  switch (ttcolor & ~kTTColorTransparent)
294  {
295  case kTTColorBlack: return "Black";
296  case kTTColorRed: return "Red";
297  case kTTColorGreen: return "Green";
298  case kTTColorYellow: return "Yellow";
299  case kTTColorBlue: return "Blue";
300  case kTTColorMagenta: return "Magenta";
301  case kTTColorCyan: return "Cyan";
302  case kTTColorWhite: return "White";
303  default: return "Unknown";
304  }
305 }
306 
308 {
309  LOG(VB_VBI, LOG_DEBUG, QString("SetForegroundColor(%1)")
310  .arg(TTColorToString(ttcolor)));
311 
312  gTTFont->SetColor(ttcolortoqcolor(ttcolor));
313 }
314 
316 {
317  LOG(VB_VBI, LOG_DEBUG, QString("SetBackgroundColor(%1)")
318  .arg(TTColorToString(ttcolor)));
319 
320  m_bgColor = ttcolortoqcolor(ttcolor);
321  m_bgColor.setAlpha((ttcolor & kTTColorTransparent) ?
322  0x00 : gTTBackgroundAlpha);
323 }
324 
325 void TeletextScreen::DrawLine(const uint8_t *page, uint row, int lang)
326 {
327  bool mosaic;
328  bool conceal;
329  bool seperation;
330  bool flash;
331  bool doubleheight;
332  bool blink;
333  bool hold;
334  bool endbox;
335  bool startbox;
336  bool withinbox;
337 
338  unsigned char last_ch = ' ';
339  unsigned char ch;
340 
341  uint fgcolor = kTTColorWhite;
342  uint bgcolor = kTTColorBlack;
343 
345  {
346  bgcolor = kTTColorTransparent;
347 
348  bool isBlank = true;
349  for (uint i = (row == 1 ? 8 : 0); i < (uint) kTeletextColumns; i++)
350  {
351  ch = page[i] & 0x7F;
352  if (ch != ' ')
353  {
354  isBlank = false;
355  break;
356  }
357  }
358 
359  if (isBlank)
360  return;
361  }
362 
363  SetForegroundColor(fgcolor);
364  SetBackgroundColor(bgcolor);
365 
366  mosaic = false;
367  seperation = false;
368  conceal = false;
369  flash = false;
370  doubleheight = false;
371  blink = false;
372  hold = false;
373  endbox = false;
374  startbox = false;
375  withinbox = false;
376  uint flof_link_count = 0;
377  uint old_bgcolor = bgcolor;
378 
379  if (row == 1)
380  {
381  for (uint x = 0; x < 8; x++)
382  DrawBackground(x, 1);
383  }
384 
385  for (uint x = (row == 1 ? 8 : 0); x < (uint)kTeletextColumns; ++x)
386  {
387  if (startbox)
388  {
389  old_bgcolor = bgcolor;
390  if (kTTColorTransparent & bgcolor)
391  bgcolor = bgcolor & ~kTTColorTransparent;
392  startbox = false;
393  withinbox = true;
394  }
395 
396  if (endbox)
397  {
398  bgcolor = old_bgcolor;
399  endbox = false;
400  withinbox = false;
401  }
402 
403  SetForegroundColor(fgcolor);
404  SetBackgroundColor(bgcolor);
405 
406  ch = page[x] & 0x7F;
407  switch (ch)
408  {
409  case 0x00: case 0x01: case 0x02: case 0x03:
410  case 0x04: case 0x05: case 0x06: case 0x07: // alpha + foreground color
411  fgcolor = ch & 7;
412  mosaic = false;
413  conceal = false;
414  // increment FLOF/FastText count if menu item detected
415  flof_link_count += (row == 25) ? 1 : 0;
416  goto ctrl;
417  case 0x08: // flash
418  // XXX
419  goto ctrl;
420  case 0x09: // steady
421  flash = false;
422  goto ctrl;
423  case 0x0a: // end box
424  endbox = true;
425  goto ctrl;
426  case 0x0b: // start box
427  if (x < kTeletextColumns - 1 && ((page[x + 1] & 0x7F) == 0x0b))
428  startbox = true;
429  goto ctrl;
430  case 0x0c: // normal height
431  doubleheight = false;
432  goto ctrl;
433  case 0x0d: // double height
434  doubleheight = (row < (kTeletextRows-1)) && (x < (kTeletextColumns - 1));
435  goto ctrl;
436 
437  case 0x10: case 0x11: case 0x12: case 0x13:
438  case 0x14: case 0x15: case 0x16: case 0x17: // graphics + foreground color
439  fgcolor = ch & 7;
440  mosaic = true;
441  conceal = false;
442  goto ctrl;
443  case 0x18: // conceal display
444  conceal = true;
445  goto ctrl;
446  case 0x19: // contiguous graphics
447  seperation = false;
448  goto ctrl;
449  case 0x1a: // separate graphics
450  seperation = true;
451  goto ctrl;
452  case 0x1c: // black background
453  bgcolor = kTTColorBlack;
454  goto ctrl;
455  case 0x1d: // new background
456  bgcolor = fgcolor;
457  goto ctrl;
458  case 0x1e: // hold graphics
459  hold = true;
460  goto ctrl;
461  case 0x1f: // release graphics
462  hold = false;
463  goto ctrl;
464  case 0x0e: // SO (reserved, double width)
465  case 0x0f: // SI (reserved, double size)
466  case 0x1b: // ESC (reserved)
467  ch = ' ';
468  break;
469  ctrl:
470  ch = ' ';
471  if (hold && mosaic)
472  ch = last_ch;
473  break;
474 
475  default:
476  if ((ch >= 0x80) && (ch <=0x9f)) // these aren't used
477  ch = ' '; // BAD_CHAR;
478  else
479  {
480  if (conceal && !m_teletextReader->RevealHidden())
481  ch = ' ';
482  }
483  break;
484  }
485 
486  // Hide FastText/FLOF menu characters if not available
487  if (flof_link_count && (flof_link_count <= 6))
488  {
489  const TeletextSubPage *ttpage = m_teletextReader->FindSubPage();
490 
491  if (ttpage)
492  {
493  bool has_flof = ttpage->floflink[flof_link_count - 1] != 0;
494  ch = (has_flof) ? ch : ' ';
495  }
496  }
497 
498  uint newfgcolor = fgcolor;
499  uint newbgcolor = bgcolor;
500 
501  SetForegroundColor(newfgcolor);
502  SetBackgroundColor(newbgcolor);
503  if ((row != 0) || (x > 7))
504  {
507 
508  if (withinbox || !m_teletextReader->IsSubtitle())
509  {
510  DrawBackground(x, row);
511  if (doubleheight && row < (uint)kTeletextRows)
512  DrawBackground(x, row + 1);
513 
514  if ((mosaic) && (ch < 0x40 || ch > 0x5F))
515  {
516  SetBackgroundColor(newfgcolor);
517  DrawMosaic(x, row, ch, doubleheight);
518  }
519  else
520  {
521  QChar c2 = cvt_char(ch, lang);
522  DrawCharacter(x, row, c2, doubleheight);
523  }
524  }
525  }
526  }
527  Q_UNUSED(seperation);
528  Q_UNUSED(flash);
529  Q_UNUSED(blink);
530 }
531 
532 void TeletextScreen::DrawCharacter(int x, int y, QChar ch, bool doubleheight)
533 {
534  QString line = ch;
535  if (line == " ")
536  return;
537 
538  int row = y;
539  x *= m_colWidth;
540  y *= m_rowHeight;
541  int height = m_rowHeight * (doubleheight ? 2 : 1);
542  QRect rect(x, y, m_colWidth, height);
543 
544  if (doubleheight)
545  {
546  gTTFont->GetFace()->setPixelSize(m_fontHeight * 2);
547  gTTFont->GetFace()->setStretch(m_fontStretch / 2);
548  }
549 
550  QImage* image = GetRowImage(row, rect);
551  if (image)
552  {
553  QPainter painter(image);
554  painter.setFont(gTTFont->face());
555  painter.setPen(gTTFont->color());
556  painter.drawText(rect, Qt::AlignCenter, line);
557  painter.end();
558  }
559 
560  if (row & 1)
561  {
562  row++;
563  rect = QRect(x, y + m_rowHeight, m_colWidth, height);
564  rect.translate(0, -m_rowHeight);
565  image = GetRowImage(row, rect);
566  if (image)
567  {
568  QPainter painter(image);
569  painter.setFont(gTTFont->face());
570  painter.setPen(gTTFont->color());
571  painter.drawText(rect, Qt::AlignCenter, line);
572  painter.end();
573  }
574  }
575 
576  if (doubleheight)
577  {
578  gTTFont->GetFace()->setPixelSize(m_fontHeight);
579  gTTFont->GetFace()->setStretch(m_fontStretch);
580  }
581 }
582 
584 {
585  int row = y;
586  x *= m_colWidth;
587  y *= m_rowHeight;
588  DrawRect(row, QRect(x, y, m_colWidth, m_rowHeight));
589 }
590 
591 void TeletextScreen::DrawRect(int row, QRect rect)
592 {
593  QImage* image = GetRowImage(row, rect);
594  if (!image)
595  return;
596 
597  QBrush bgfill = QBrush(m_bgColor, Qt::SolidPattern);
598  QPainter painter(image);
599  painter.setBrush(bgfill);
600  painter.setPen(QPen(Qt::NoPen));
601  painter.drawRect(rect);
602  painter.end();
603 }
604 
605 void TeletextScreen::DrawMosaic(int x, int y, int code, bool doubleheight)
606 {
607  int row = y;
608  x *= m_colWidth;
609  y *= m_rowHeight;
610 
611  int dx = (int)round((double)m_colWidth / 2) + 1;
612  int dy = (int)round((double)m_rowHeight / 3) + 1;
613  dy = (doubleheight) ? (2 * dy) : dy;
614 
615  if (code & 0x10)
616  DrawRect(row, QRect(x, y + 2*dy, dx, dy));
617  if (code & 0x40)
618  DrawRect(row, QRect(x + dx, y + 2*dy, dx, dy));
619  if (code & 0x01)
620  DrawRect(row, QRect(x, y, dx, dy));
621  if (code & 0x02)
622  DrawRect(row, QRect(x + dx, y, dx, dy));
623  if (code & 0x04)
624  DrawRect(row, QRect(x, y + dy, dx, dy));
625  if (code & 0x08)
626  DrawRect(row, QRect(x + dx, y + dy, dx, dy));
627 }
628 
630 {
633 
635  for (int i = 0; i < 40; ++i)
636  DrawBackground(i, 0);
637 
638  DrawCharacter(1, 0, 'P', false);
639  DrawCharacter(2, 0, m_teletextReader->GetPageInput(0), false);
640  DrawCharacter(3, 0, m_teletextReader->GetPageInput(1), false);
641  DrawCharacter(4, 0, m_teletextReader->GetPageInput(2), false);
642 
643  const TeletextSubPage *ttpage = m_teletextReader->FindSubPage();
644 
645  if (!ttpage)
646  {
647  QString str = QObject::tr("Page Not Available",
648  "Requested Teletext page not available");
649  for (int i = 0; (i < 30) && i < str.length(); i++)
650  DrawCharacter(i+10, 0, str[i], false);
651 
652  return;
653  }
654 
655  QString str = m_teletextReader->GetPage();
656  if (str.isEmpty())
657  return;
658 
660  for (int x = 0; x < 11; x++)
661  {
664  else
666 
667  DrawBackground(x * 3 + 7, 0);
668 
669  if (str[x * 3] == '*')
670  {
671  str[x * 3] = ' ';
673  }
674 
675  DrawBackground(x * 3 + 8, 0);
676  DrawBackground(x * 3 + 9, 0);
677 
678  DrawCharacter(x * 3 + 7, 0, str[x * 3], false);
679  DrawCharacter(x * 3 + 8, 0, str[x * 3 + 1], false);
680  DrawCharacter(x * 3 + 9, 0, str[x * 3 + 2], false);
681  }
682 }
683 
685 {
686  static bool initialised = false;
687  //QString font = gCoreContext->GetSetting("DefaultSubtitleFont", "FreeMono");
688  if (initialised)
689  {
690  return true;
691 #if 0
692  if (gTTFont->face().family() == font)
693  return true;
694  delete gTTFont;
695 #endif // 0
696  }
697 
698  MythFontProperties *mythfont = new MythFontProperties();
699  QString font = SubtitleScreen::GetTeletextFontName();
700  if (mythfont)
701  {
702  QFont newfont(font);
703  mythfont->SetFace(newfont);
704  gTTFont = mythfont;
705  }
706  else
707  return false;
708 
710 
711  initialised = true;
712  LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Loaded main subtitle font '%1'")
713  .arg(font));
714  return true;
715 }
QColor color(void) const
void DrawRect(int row, const QRect)
bool IsTransparent(void) const
bool KeyPress(const QString &key)
void SetImage(MythImage *img)
Should not be used unless absolutely necessary since it bypasses the image caching and threaded loade...
static const int kTeletextColumns
VideoOutput * GetVideoOutput(void)
Definition: mythplayer.h:244
void SetPage(int page, int subpage)
static QColor ttcolortoqcolor(int ttcolor)
#define round(x)
Definition: mythplayer.cpp:66
void SetRedraw(void)
Definition: mythuitype.cpp:295
int DecrRef(void) override
Decrements reference count and deletes on 0.
Definition: mythimage.cpp:55
bool IsSubtitle(void) const
void SetHeaderChanged(bool changed)
Image widget, displays a single image or multiple images in sequence.
Definition: mythuiimage.h:97
void SetForegroundColor(int color)
TeletextScreen(MythPlayer *player, const char *name, int fontStretch)
bool RevealHidden(void) const
void SetDisplaying(bool display)
virtual ~TeletextScreen()
int GetPageInput(uint num) const
unsigned int uint
Definition: compat.h:140
void SetColor(const QColor &color)
void DeleteAllChildren(void)
Delete all child widgets.
Definition: mythuitype.cpp:204
uint8_t data[25][40]
page data
void OptimiseDisplayedArea(void)
static const int kTeletextRows
void SetShowHeader(bool show)
static QChar cvt_char(char ch, int lang)
QRect GetSafeRect(void)
Returns a QRect describing an area of the screen on which it is 'safe' to render the On Screen Displa...
virtual TeletextReader * GetTeletextReader(uint=0)
Definition: mythplayer.h:298
int floflink[6]
FastText links (FLOF)
The base class on which all widgets and screens are based.
Definition: mythuitype.h:63
TeletextSubPage * FindSubPage(void)
int flags
misc flags
This class serves as the base class for all video output methods.
Definition: videooutbase.h:46
QFont face(void) const
static MythFontProperties * gTTFont
QString GetPage(void)
void Pulse(void) override
Pulse is called 70 times a second to trigger a single frame of an animation.
virtual MythRect GetArea(void) const
If the object has a minimum area defined, return it, other wise return the default area.
Definition: mythuitype.cpp:863
void SetBackgroundColor(int color)
QHash< int, QImage * > m_rowImages
static int GetTeletextBackgroundAlpha(void)
void DrawLine(const uint8_t *page, uint row, int lang)
bool subtitle
page is subtitle page
uint8_t * GetHeader(void)
static const QColor kColorRed
MythPlayer * m_player
#define TP_SUBTITLE
Wrapper around QRect allowing us to handle percentage and other relative values for areas in mythui.
Definition: mythrect.h:17
static QString GetTeletextFontName(void)
bool PageChanged(void) const
static int gTTBackgroundAlpha
void SetPage(int page, int subpage)
const char * name
Definition: ParseText.cpp:328
static const QColor kColorCyan
void SetPageChanged(bool changed)
void DrawStatus(void)
void SetIsSubtitle(bool sub)
#define TP_SUPPRESS_HEADER
static bool InitialiseFont(void)
static const QColor kColorWhite
QImage * GetRowImage(int row, QRect &rect)
void SetSubPage(int subpage)
void ClearScreen(void)
virtual void SetArea(const MythRect &rect)
Definition: mythuitype.cpp:591
bool Create(void) override
#define LOG(_MASK_, _LEVEL_, _STRING_)
Definition: mythlogging.h:41
#define TP_NEWSFLASH
void SetFace(const QFont &face)
static const QColor kColorYellow
static const QColor kColorMagenta
static const QColor kColorBlue
static QString TTColorToString(int ttcolor)
void DrawBackground(int x, int y)
int subpagenum
the wanted subpage
static const QColor kColorGreen
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
#define LOC
const char lang_chars[][16]
Definition: vbilut.cpp:4
Screen in which all other widgets are contained and rendered.
void Assign(const QImage &img)
Definition: mythimage.cpp:80
virtual MythPainter * GetOSDPainter(void)
Definition: videooutbase.h:268
bool KeyPress(const QString &key)
MythImage * GetFormatImage()
Returns a blank reference counted image in the format required for the Draw functions for this painte...
TeletextReader * m_teletextReader
QList< MythUIType * > m_ChildrenList
Definition: mythuitype.h:228
int lang
language code
static const QColor kColorBlack
void DrawHeader(const uint8_t *page, int lang)
void DrawMosaic(int x, int y, int code, bool doubleheight)
void DrawCharacter(int x, int y, QChar ch, bool doubleheight=false)