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.