(* CVT2FNT.PAS -- dump GEOS fonts
** Copyright (c) 1995,1996 Jochen Metzinger
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2, or (at your option)
** any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*)

PROGRAM cvt2fnt;

USES global, errors, geos, coding, fonts, cvt;

CONST
 MAX_LINE = 80;

VAR
 out_file: TEXT;
 height: BYTE;
 x0: WORD;
 lines: ARRAY [0..125] OF STRING;

PROCEDURE usage;
BEGIN
 WriteLn('CVT2FNT  Version 0.3',country,'  Convert GEOS font files');
 WriteLn('Copyright (c) 1995,1996 Jochen Metzinger ');
 WriteLn;
 WriteLn(short_usage);
 WriteLn;
 WriteLn('  filename  GEOS file');
 WriteLn('  output    output file');
 WriteLn('    /F        create output file');
 Write('    /G        german');
 IF default_code = ge_coding THEN Write(' [default]');
 WriteLn;
 Write('    /E        english');
 IF default_code = uk_coding THEN Write(' [default]');
 WriteLn;
 HALT(1);
END; (* usage *)

PROCEDURE Init;
 VAR i, j: WORD; par: STRING;
  in_name, out_name: STRING;
  force_file: BOOLEAN;
BEGIN
 short_usage := 'CVT2FNT [/?] filename [output] [options]';
 in_name := ''; out_name := '';
 force_file := FALSE;
 IF ParamCount = 0 THEN
  usage;
 FOR i := 1 TO ParamCount DO BEGIN
  par := ParamStr(i);
  IF (par[1] = '/') OR (par[1] = '-') THEN
   BEGIN
    IF Length(par) = 1 THEN
     FATAL('unknown option '+par);
    FOR j := 2 TO Length(par) DO
     CASE UpCase(par[j]) OF
      '?', 'H': usage;
      'F': force_file := TRUE;
      'G': SetCoding(ge_coding);
      'E': SetCoding(uk_coding);
      ELSE FATAL('unknown option '+par);
     END; (* case *)
   END
  ELSE IF in_name = '' THEN
   in_name := AddExt(par, CVT_EXT)
  ELSE IF out_name = '' THEN
   out_name := AddExt(par, '.FNT')
  ELSE
   FATAL('too many arguments');
 END; (* for *)
 IF in_name = '' THEN usage;
 IF force_file THEN BEGIN
  IF out_name <> '' THEN FATAL('too many arguments');
  out_name := GetFileName(in_name) + '.FNT';
 END; (* if *)
 cvt_open(in_name);
 IF NOT is_font THEN FATAL('not a font');
 open_fonts;
 FOR i := 0 TO 125 DO lines[i] := '';
 x0 := 0;
 (*$I-*)
 Assign(out_file, out_name);
 ReWrite(out_file);
 IF IOResult <> 0 THEN
  FATAL('unable to open output');
 (*$I+*)
 short_usage := '';
END; (* init *)

PROCEDURE PrintLines;
 VAR i: INTEGER;
BEGIN
 FOR i := 0 TO height-1 DO BEGIN
  WriteLn(out_file, lines[i]);
  lines[i] := '';
 END; (* for *)
 WriteLn(out_file);
 x0 := 0;
END; (* PrintLines *)

CONST
 background: ARRAY [0..3] OF CHAR = ('ù', '-', '|', '+');

PROCEDURE OutChar(ch: CHAR);
 VAR wd, underline, x, y: WORD; i0, i: BYTE;
BEGIN
 IF NOT select_char(ch, wd, underline) THEN
  EXIT;
 IF x0 + wd + 1 >= MAX_LINE THEN
  PrintLines;
 FOR y := 0 TO height-1 DO BEGIN
  i0 := ORD((y = 0) OR (y = underline) OR (y = height-1));
  FOR x := 0 TO wd-1 DO
   IF get_dot(x,y) THEN
    lines[y] := lines[y] + '²'
   ELSE BEGIN
    i := i0 OR ORD((x = 0) OR (x = wd-1)) SHL 1;
    lines[y] := lines[y] + background[i];
   END; (* else *)
  lines[y] := lines[y] + ' ';
 END; (* for *)
 Inc(x0, wd+1);
END; (* OutChar *)

PROCEDURE OutputFont;
 VAR ch: CHAR;
BEGIN
 WriteLn(out_file, '#');
 WriteLn(out_file, '# ', font_id, '  ', height, ':', get_underline);
 WriteLn(out_file, '#');
 WriteLn(out_file);
 FOR ch := #32 TO #126 DO OutChar(ch);
 PrintLines;
 WriteLn(out_file);
END; (* OutputFont *)

BEGIN
 Init;
 height := 0;
 WHILE open_font(height) DO BEGIN
  OutputFont;
  close_font;
  Inc(height);
 END; (* while *)
 err_stop;
 close_fonts;
 cvt_close;
 Close(out_file);
END. (* cvt2fnt *)
