]>
git.gir.st - ttxd.git/blob - src/vtx2ascii-src/vtxdecode.c
2 * vtxdecode.c: Routines to decode VTX-pages & convert from magic-cookie-VTX-attributes to
3 * 'normal' attributes usable by x_vtx_redraw()
5 * $Id: vtxdecode.c,v 1.2 1997/03/26 00:16:54 mb Exp mb $
7 * Copyright (c) 1994-96 Martin Buck <martin-2.buck@student.uni-ulm.de>
8 * Read COPYING for more information
13 #include "vtx_assert.h"
17 #include "vtxdecode.h"
20 /* Translation tables to convert VTX font-layout (with different national charsets) to
21 * X-Window font layout
23 const chr_t cct2vtx_table
[8][96] = {
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 }
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!
86 const char vtx2iso_table
[256] =
88 " !\"#$%&'()*+,-./0123456789:;<=>?" //" !\"£$%&'()*+,-./0123456789:;<=>?"
89 "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" //"@ABCDEFGHIJKLMNOPQRSTUVWXYZ<½>^#"
90 "`abcdefghijklmnopqrstuvwxyz{|}~ " //"-abcdefghijklmnopqrstuvwxyz¼|¾÷#"
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] =
98 " !\"#$%&'()*+,-./0123456789:;<=>?" //" !\"£$%&'()*+,-./0123456789:;<=>?"
99 "@abcdefghijklmnopqrstuvwxyz[\\]^_" //"@abcdefghijklmnopqrstuvwxyz<½>^#"
100 "`abcdefghijklmnopqrstuvwxyz{|}~ " //"-abcdefghijklmnopqrstuvwxyz¼|¾÷#"
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
[] = " !\"#$%&'()*+,-./:;<=>?@<\\>^_`{|}~¤_§^°¡¿";
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
115 decode_page(const byte_t
*pgbuf
, vtxpage_t
*page
, int y1
, int y2
) {
116 int line
, col
, pos
, graphics
, grhold
, doubleht
, nextattr
= 0;
118 attrib_t
*lastattr
, default_attrib
= 7, next_attrib
;
119 chr_t chr
, *lastchr
, default_chr
= ' ';
121 if (y1
> y2
|| y1
< 0 || y2
> 23)
124 if (!page
->info
.hamming
)
125 lang
= page
->info
.charset
;
129 for (line
= y1
; line
<= y2
; line
++) {
130 lastchr
= &default_chr
;
131 lastattr
= &default_attrib
;
132 graphics
= grhold
= 0;
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
;
140 page
->chr
[pos
] = ' ';
141 page
->attrib
[pos
] = page
->attrib
[pos
- 40];
147 for (col
= 0; col
<= 39; col
++) {
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];
157 page
->chr
[pos
] = chr
+ (chr
>= 96 ? 64 : 96);
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
;
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);
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;
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
;
198 lastchr
= page
->chr
+ pos
;
200 lastattr
= &next_attrib
;
203 lastattr
= page
->attrib
+ pos
;