]> git.gir.st - ttxd.git/blob - src/vtx2ascii-src/vtxdecode.c
update to dvb-t2 (new hardware, software)
[ttxd.git] / src / vtx2ascii-src / vtxdecode.c
1 /*
2 * vtxdecode.c: Routines to decode VTX-pages & convert from magic-cookie-VTX-attributes to
3 * 'normal' attributes usable by x_vtx_redraw()
4 *
5 * $Id: vtxdecode.c,v 1.2 1997/03/26 00:16:54 mb Exp mb $
6 *
7 * Copyright (c) 1994-96 Martin Buck <martin-2.buck@student.uni-ulm.de>
8 * Read COPYING for more information
9 *
10 */
11
12 #include <stdio.h>
13 #include "vtx_assert.h"
14 #include "cct.h"
15 #include "vtxtools.h"
16 #include "misc.h"
17 #include "vtxdecode.h"
18
19
20 /* Translation tables to convert VTX font-layout (with different national charsets) to
21 * X-Window font layout
22 */
23 const chr_t cct2vtx_table[8][96] = {
24 /* English */
25 { 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
26 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
27 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
28 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
29 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
30 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f },
31 /* French */
32 { 0x20,0x21,0x22,0Xc0,0Xc1,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
33 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
34 0Xc2,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
35 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0Xc3,0Xc4,0Xc5,0Xc6,0x5f,
36 0Xc7,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
37 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0Xc8,0Xc9,0Xca,0Xcb,0x7f },
38 /* Swedish */
39 { 0x20,0x21,0x22,0X5f,0Xcc,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
40 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
41 0Xcd,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
42 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0Xce,0Xcf,0Xd0,0Xd1,0Xd2,
43 0Xc0,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
44 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0Xd3,0Xd4,0Xd5,0Xd6,0x7f },
45 /* Unknown */
46 { 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
47 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
48 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
49 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
50 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
51 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f },
52 /* German */
53 { 0x20,0x21,0x22,0X5f,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
54 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
55 0Xd7,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
56 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0Xce,0Xcf,0Xd1,0Xd8,0Xd2,
57 0Xd9,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
58 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0Xd3,0Xd4,0Xd6,0Xda,0x7f },
59 /* Spanish */
60 { 0x20,0x21,0x22,0Xcb,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
61 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
62 0Xcb,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
63 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0Xde,0Xc0,0Xdf,0Xe2,0Xe3,
64 0Xdc,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
65 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0Xd6,0Xdd,0Xc7,0Xc2,0x7f },
66 /* Italian */
67 { 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
68 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
69 0Xc0,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
70 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0Xd9,0Xcb,0x5d,0x5e,0x5f,
71 0Xc5,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
72 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0Xc2,0Xe0,0Xc7,0Xe1,0x7f },
73 /* Unknown */
74 { 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
75 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
76 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
77 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
78 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
79 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f }
80 };
81
82
83 /* Translation table to convert VideoteXt-X-Window font-layout to ISO 8859-1.
84 * You should have a complete ISO-Font when editing the following table!
85 */
86 const char vtx2iso_table[256] =
87 " "
88 " !\"#$%&'()*+,-./0123456789:;<=>?" //" !\"£$%&'()*+,-./0123456789:;<=>?"
89 "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" //"@ABCDEFGHIJKLMNOPQRSTUVWXYZ<½>^#"
90 "`abcdefghijklmnopqrstuvwxyz{|}~ " //"-abcdefghijklmnopqrstuvwxyz¼|¾÷#"
91 " "
92 " " //TODO: completely wrong
93 "éïàëêùîèâôûç¤ÉÄÖÅÜ_äöåü§^°ß¡¿ñáí" //TODO: completely wrong
94 "òìóú ? ";//TODO: completely wrong
95 /* The same table with all characters mapped to lowercase */
96 const char vtx2iso_lc_table[256] =
97 " "
98 " !\"#$%&'()*+,-./0123456789:;<=>?" //" !\"£$%&'()*+,-./0123456789:;<=>?"
99 "@abcdefghijklmnopqrstuvwxyz[\\]^_" //"@abcdefghijklmnopqrstuvwxyz<½>^#"
100 "`abcdefghijklmnopqrstuvwxyz{|}~ " //"-abcdefghijklmnopqrstuvwxyz¼|¾÷#"
101 " "
102 " " //TODO: completely wrong
103 "éïàëêùîèâôûç¤Éäöåü_äöåü§^°ß¡¿ñáí" //TODO: completely wrong
104 "òìóú ? ";//TODO: completely wrong
105 /* All word delimiters in videotext's subset of ISO 8859-1 */
106 //const char vtxiso_worddelim[] = " !\"£$%&'()*+,-./:;<=>?@<½>^#-¼|¾÷¤_§^°¡¿";
107 const char vtxiso_worddelim[] = " !\"#$%&'()*+,-./:;<=>?@<\\>^_`{|}~¤_§^°¡¿";
108
109
110 /* Decode lines y1 - y2 of original VTX-page in pgbuf to vtxpage usable by VideoteXt using
111 * national charset lang
112 * Return VTXOK if OK, VTXEINVAL if start-/end-line invalid
113 */
114 int
115 decode_page(const byte_t *pgbuf, vtxpage_t *page, int y1, int y2) {
116 int line, col, pos, graphics, grhold, doubleht, nextattr = 0;
117 static int lang;
118 attrib_t *lastattr, default_attrib = 7, next_attrib;
119 chr_t chr, *lastchr, default_chr = ' ';
120
121 if (y1 > y2 || y1 < 0 || y2 > 23)
122 return VTXEINVAL;
123
124 if (!page->info.hamming)
125 lang = page->info.charset;
126
127 pos = y1 * 40;
128 doubleht = 0;
129 for (line = y1; line <= y2; line++) {
130 lastchr = &default_chr;
131 lastattr = &default_attrib;
132 graphics = grhold = 0;
133 if (doubleht) {
134 for (col = 0; col <= 39; col++) {
135 if (page->attrib[pos - 40] & VTX_DOUBLE1) {
136 page->chr[pos] = page->chr[pos - 40];
137 page->chr[pos - 40] = ' ';
138 page->attrib[pos] = (page->attrib[pos - 40] & ~VTX_DOUBLE1) | VTX_DOUBLE2;
139 } else {
140 page->chr[pos] = ' ';
141 page->attrib[pos] = page->attrib[pos - 40];
142 }
143 pos++;
144 }
145 doubleht = 0;
146 } else {
147 for (col = 0; col <= 39; col++) {
148 chr = pgbuf[pos];
149 if (!vtx_chkparity(&chr)) {
150 page->chr[pos] = 254; /* Parity error */
151 page->attrib[pos] = 7;
152 } else if (chr >= 32 && chr <= 127) { /* Normal character */
153 page->attrib[pos] = *lastattr;
154 if (!graphics || (chr >= 64 && chr <= 95)) {
155 page->chr[pos] = cct2vtx_table[lang][chr - 32];
156 } else {
157 page->chr[pos] = chr + (chr >= 96 ? 64 : 96);
158 }
159 } else {
160 page->chr[pos] = ((grhold && graphics ) ? *lastchr : ' ');
161 if (chr <= 7) { /* Set alphanumerics-color */
162 page->attrib[pos] = *lastattr;
163 next_attrib = (*lastattr & ~(VTX_COLMASK | VTX_HIDDEN)) + chr;
164 nextattr = 1;
165 graphics = 0;
166 } else if (chr == 8 || chr == 9) { /* Flash on/off */
167 page->attrib[pos] = (*lastattr & ~VTX_FLASH) + VTX_FLASH * (chr == 8);
168 } else if (chr == 10 || chr == 11) { /* End/start box */
169 page->attrib[pos] = (*lastattr & ~VTX_BOX) + VTX_BOX * (chr == 11);
170 } else if (chr == 12 || chr == 13) { /* Normal/double height */
171 page->attrib[pos] = (*lastattr & ~VTX_DOUBLE1) + VTX_DOUBLE1 * (chr == 13);
172 if (chr == 13)
173 doubleht = 1;
174 } else if (chr == 14 || chr == 15 || chr == 27) { /* SO, SI, ESC (ignored) */
175 page->attrib[pos] = *lastattr;
176 } else if (chr >= 16 && chr <= 23) { /* Set graphics-color */
177 page->attrib[pos] = *lastattr;
178 next_attrib = (*lastattr & ~(VTX_COLMASK | VTX_HIDDEN)) + chr - 16;
179 nextattr = 1;
180 graphics = 1;
181 } else if (chr == 24) { /* Conceal display */
182 page->attrib[pos] = *lastattr | VTX_HIDDEN;
183 } else if (chr == 25 || chr == 26) { /* Contiguous/separated graphics */
184 page->attrib[pos] = (*lastattr & ~VTX_GRSEP) + VTX_GRSEP * (chr == 26);
185 } else if (chr == 28) { /* Black background */
186 page->attrib[pos] = *lastattr & ~VTX_BGMASK;
187 } else if (chr == 29) { /* Set background */
188 page->attrib[pos] = (*lastattr & ~VTX_BGMASK) + ((*lastattr & VTX_COLMASK) << 3);
189 } else if (chr == 30 || chr == 31) { /* Hold/release graphics */
190 page->attrib[pos] = *lastattr;
191 grhold = (chr == 30);
192 if (grhold && graphics)
193 page->chr[pos] = *lastchr;
194 } else {
195 assert(0);
196 }
197 }
198 lastchr = page->chr + pos;
199 if (nextattr) {
200 lastattr = &next_attrib;
201 nextattr = 0;
202 } else {
203 lastattr = page->attrib + pos;
204 }
205 pos++;
206 }
207 }
208 }
209 return VTXOK;
210 }
Imprint / Impressum