ftp.nice.ch/pub/next/unix/graphics/video/videotext.s.tar.gz#/10.1992.Seite170ff/decode.c

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.