MODULE Fonts;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   CONST

      (** universal units **)
      mm* = 36000;
      point* = 12700;   (** 1/72 inch **)
      italic* = 0; underline* = 1; strikeout* = 2;   (** style elements **)

      normal* = 400; bold* = 700;

      
      default* = "*";
   TYPE

      Typeface* = ARRAY 64 OF CHAR;
      Font* = POINTER TO ABSTRACT RECORD

         typeface-: Typeface;
         size-: INTEGER;
         style-: SET;
         weight-: INTEGER
      END;
      TypefaceInfo* = POINTER TO RECORD

         next*: TypefaceInfo;
         typeface*: Typeface
      END;
      Directory* = POINTER TO ABSTRACT RECORD

      END;
      
   VAR dir-: Directory;
   PROCEDURE (f: Font) Init* (typeface: Typeface; size: INTEGER; style: SET; weight: INTEGER), NEW;

   BEGIN
      ASSERT(f.size = 0, 20); ASSERT(size # 0, 21);
      f.typeface := typeface$; f.size := size; f.style := style; f.weight := weight
   END Init;
   PROCEDURE (f: Font) GetBounds* (OUT asc, dsc, w: INTEGER), NEW, ABSTRACT;

   PROCEDURE (f: Font) StringWidth* (IN s: ARRAY OF CHAR): INTEGER, NEW, ABSTRACT;
   PROCEDURE (f: Font) SStringWidth* (IN s: ARRAY OF SHORTCHAR): INTEGER, NEW, ABSTRACT;
   PROCEDURE (f: Font) IsAlien* (): BOOLEAN, NEW, ABSTRACT;
   
   PROCEDURE (d: Directory) This* (typeface: Typeface; size: INTEGER; style: SET; weight: INTEGER): Font, NEW, ABSTRACT;
   PROCEDURE (d: Directory) Default* (): Font, NEW, ABSTRACT;
   PROCEDURE (d: Directory) TypefaceList* (): TypefaceInfo, NEW, ABSTRACT;
   
   PROCEDURE SetDir* (d: Directory);
   BEGIN
      ASSERT(d # NIL, 20);
      dir := d
   END SetDir;
END Fonts.