This is decode.c in view mode; [Download] [Up]
/* decode.c
ANSI-C
Diese Funktion wandelt die im Feld 'newPage' im Original-Format
vorliegenden Videotext-Daten in eine Darstellung um, die sich
besonders einfach darstellen lÙût.
(c) Dirk Schwarzhans, Matthias Braun & c't 10/92 */
#include "decode.h"
/* Diese Funktion wandelt die im Feld 'newPage' im Original-Format
vorliegenden Videotext-Daten in eine Darstellung um, die sich
besonders einfach darstellen lÙût. */
void convertPageData(const unsigned char *newPage,
VTChar decodedPage[ROWS][COLUMNS],
char doubleTab[ROWS])
{
int row, column, /* Zeilen- , Spalten- */
i; /* und SchleifenzÙhler */
VTChar current; /* enthÙlt die Daten der momentanen
Zeichenposition, bevor sie
decodedPage[][] zugewiesen werden */
BOOL graphics; /* Grafikmodus aktiv */
BOOL holdGraphics; /* öberschreibende Grafik aktiv */
BOOL separated; /* Grafikzeichensatz "separiert" aktiv */
unsigned char currentChar, /* momentan auszuwertendes
Videotext-Zeichen */
lastChar; /* Zeichencode des vorhergehenden Zeichens
för 'holdGraphics' */
unsigned char convtab[128]; /* Tabelle zur Zeichenkonvertierung */
/* Diese Tabelle enthÙlt die Zuordnung der Videotext-Zeichen
zum Zeichensatz des Computers.
Sie sollte besser global angelegt werden. */
for (i = 0; i < 128; i++)
{
convtab[i] = i;
}
convtab[0x40] = '§'; convtab[0x5B] = '…'; convtab[0x5C] = '–';
convtab[0x5D] = 'š'; convtab[0x60] = 'Ê'; convtab[0x7B] = 'Ù';
convtab[0x7C] = 'ö'; convtab[0x7D] = 'ö'; convtab[0x7E] = 'û';
convtab[0x7F] = '?';
for (row = 0; row < ROWS; row++)
{
/* Werte, die am Zeilenanfang göltig sind */
current.charColor = VT_WHITE;
current.bgndColor = VT_BLACK;
current.flashing = NO;
current.hidden = NO;
current.fontSize = NORMALSIZE;
current.font = TEXTFONT;
lastChar = ' ';
graphics = NO;
separated = NO;
holdGraphics = NO;
for (column = 0; column < COLUMNS; column++)
{
currentChar = VALIDBITS(newPage[row * COLUMNS + column]);
if (!ISCTRL(currentChar))
{
/* Auswertung von Text oder Grafikzeichen */
if (graphics && ISGRAPHICCHAR(currentChar))
{
current.charCode = currentChar;
if (separated)
current.font = SEPGRAPHFONT;
else
current.font = CONGRAPHFONT;
}
else
{
current.charCode = convtab[currentChar];
current.font = TEXTFONT;
}
}
else
{
/* Auswertung sofort wirkender Steuerzeichen */
switch((VTCtrl)currentChar)
{
case BLACKBGND:
current.bgndColor = VT_BLACK;
break;
case NEWBGND:
current.bgndColor = current.charColor;
break;
case HOLDGRAPH:
holdGraphics = YES;
break;
case STEADY:
current.flashing = NO;
break;
case NORMAL:
current.fontSize = NORMALSIZE;
break;
case HIDE:
current.hidden = YES;
break;
default:
break;
}
/* An der Zeichenposition des Steuerzeichens steht ein
Leerzeichen, es sei den 'holdGraphics' ist gesetzt. */
if (holdGraphics && graphics && ISGRAPHICCHAR(lastChar))
current.charCode = lastChar;
else
current.charCode = ' ';
}
/* Zuweisung der aktuellen Zeichendaten */
decodedPage[row][column] = current;
/* Auswertung von verzögert wirkenden Steuerzeichen. Da die
aktuellen Zeichendaten schon zugewiesen wurden (siehe Zeile
daröber), wirken diese VerÙnderungen erst auf das nÙchste
Zeichen */
if (ISCTRL(currentChar))
{
switch((VTCtrl)currentChar)
{
case ALPHABLACK:
case ALPHARED:
case ALPHAGREEN:
case ALPHAYELLOW:
case ALPHABLUE:
case ALPHAMAGENTA:
case ALPHACYAN:
case ALPHAWHITE:
current.hidden = NO;
current.charColor = CTRL2COLOR(currentChar);
graphics = NO;
break;
case GRAPHBLACK:
case GRAPHRED:
case GRAPHGREEN:
case GRAPHYELLOW:
case GRAPHBLUE:
case GRAPHMAGENTA:
case GRAPHCYAN:
case GRAPHWHITE:
current.hidden = NO;
current.charColor = CTRL2COLOR(currentChar);
graphics = YES;
break;
case FLASH:
current.flashing = YES;
break;
case DOUBLE:
if (row != 23)
current.fontSize = DOUBLESIZE;
break;
case CONGRAPH:
separated = NO;
break;
case SEPGRAPH:
separated = YES;
break;
case RELEASEGRAPH:
holdGraphics = NO;
break;
default:
break;
}
}
lastChar = current.charCode;
} /* endfor: column */
} /* endfor: row */
/* Hier wird sichergestellt, daû sich unser Programm in bezug auf
doppelt hohe Zeichen entsprechend der Videotext-Spezifikation
verhÙlt:
"Kommt in einer Zeile ein Zeichen mit doppelter Höhe vor, so hat
die nachfolgende Zeile an allen Positionen die gleiche Hintergrund-
farbe wie die aktuelle Zeile. Die Positionen, die nicht zur
Darstellung der unteren HÙlfte der doppelt hohen Zeichen benötigt
werden, enthalten Leerzeichen."
ZusÙtzlich wird noch eine Tabelle angelegt, die die Zeilen in drei
Kategorien einteilt: normale Zeile (0), obere HÙlfte doppelt hoher
Zeile (1), untere HÙlfte doppelt hoher Zeile (2)
Diese Tabelle ist nötzlich för den Fall, daû ein fortgeschrittenes
fensterorientiertes Programm Doppelklick auf Videotext-Zeilen
zulÙût (siehe z.B. das NeXT Programm: Videotext) */
for (row = 1; row < ROWS; row++)
{
doubleTab[row] = doubleTab[row - 1] = 0;
for (column = 0; column < COLUMNS; column++)
if (decodedPage[row - 1][column].fontSize == DOUBLESIZE)
{
doubleTab[row] = 2;
doubleTab[row - 1] = 1;
break;
}
if (doubleTab[row])
{
for (column = 0; column < COLUMNS; column++)
{
decodedPage[row][column].bgndColor =
decodedPage[row - 1][column].bgndColor;
decodedPage[row][column].charCode = ' ';
}
row++;
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.