summaryrefslogtreecommitdiff
path: root/font.c
blob: e933df230bb5957d4c3d5b980856af706aa422e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * font.c: Font handling for the DVB On Screen Display
 *
 * See the main source file 'vdr.c' for copyright information and
 * how to reach the author.
 *
 * $Id: font.c 1.5 2004/01/16 13:17:57 kls Exp $
 */

#include "font.h"
#include "tools.h"

#include "fontfix.c"
#include "fontosd.c"
#include "fontsml.c"

#include "fontfix-iso8859-5.c"
#include "fontosd-iso8859-5.c"
#include "fontsml-iso8859-5.c"

#include "fontfix-iso8859-7.c"
#include "fontosd-iso8859-7.c"
#include "fontsml-iso8859-7.c"

static void *FontData[eDvbCodeSize][eDvbFontSize] = {
  { FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
  { FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5 },
  { FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 },
  };

static const char *FontCode[eDvbCodeSize] = {
  "iso8859-1",
  "iso8859-5",
  "iso8859-7",
  };

eDvbCode cFont::code = code_iso8859_1;
cFont *cFont::fonts[eDvbFontSize] = { NULL };

cFont::cFont(void *Data)
{
  SetData(Data);
}

void cFont::SetData(void *Data)
{
  int h = ((tCharData *)Data)->height;
  for (int i = 0; i < NUMCHARS; i++)
      data[i] = (tCharData *)&((tPixelData *)Data)[(i < 32 ? 0 : i - 32) * (h + 2)];
}

int cFont::Width(const char *s) const
{
  int w = 0;
  while (s && *s)
        w += Width(*s++);
  return w;
}

int cFont::Height(const char *s) const
{
  int h = 0;
  if (s && *s)
     h = Height(*s); // all characters have the same height!
  return h;
}

bool cFont::SetCode(const char *Code)
{
  for (int i = 0; i < eDvbCodeSize; i++) {
      if (strcmp(Code, FontCode[i]) == 0) {
         SetCode(eDvbCode(i));
         return true;
         }
      }
  return false;
}

void cFont::SetCode(eDvbCode Code)
{
  if (code != Code) {
     code = Code;
     for (int i = 0; i < eDvbFontSize; i++) {
         if (fonts[i])
            fonts[i]->SetData(FontData[code][i]);
         }
     }
}

void cFont::SetFont(eDvbFont Font, void *Data)
{
  delete fonts[Font];
  fonts[Font] = new cFont(Data ? Data : FontData[code][Font]);
}

const cFont *cFont::GetFont(eDvbFont Font)
{
  if (!fonts[Font])
     SetFont(Font);
  return fonts[Font];
}