 BGIFONT.INC v1.0 beta

 Written in pure assembler by Ivushkin Andrey aka Willow

  At present Menuet operation system has poor means to draw charaters. Its
distro contains 2 raster fonts (CHAR.MT & CHAR2.MT files). The kernel supports
them internally. That is Jarek Pelczar who makes certain efforts to develop
scalable TTF-like fonts but huge Menuet C Library does not become widespread
inside our assembly-written OS. Bulgarian MenuetOS team also tries to include
third scalable font into the kernel, though, as far as I know, its characters
are still under design and are incomplete. Therefore Bulgarian developing is
not valuable for ordinary users. It is obvious that scalable fonts will help
to develop such products as browsers and word processors where character
formatting is of great importance.
  Let me introduce for public domain an include file BGIFONT.INC to process
vector fonts (*.CHR) worked out by famous Borland Corporation to use in Turbo
Pascal, Turbo C and Borland C++ compilers under MS-DOS. Sorry, I still fail to
add BGI font support into kernel - deeper knowledge on memory allocation and
system calls needed. I hope that Menuet system programmers will be glad to help
me. Module compiling within kernel is supposed using constant BGI_LEVEL equ
KERNEL. By means of conditional compiling it will be possible to use the module
at both kernel and application levels. Following is concerned using the include
file while programming an application.

  BGI fonts may reside in any folder on HD or RD. They are searched using value
of constant BGI_PATH. If constant BGI_WINDOW_CLIP is equal to 1, module routines
perform window bounds check to avoid artifacts while drawing. Use this if you
aren't sure that strings are fit in window. All BGIFONT.INC routines are
declared as macros, that is they are used without "call". To load 11 fonts into
application's memory a contiguous free space up to 120 kb is needed. When
loading, font data relocation is performed to save memory. Let us see a chart:

|  Font   |  |  BGIrec  |  | Font |   |  BGIrec  |  | Font |  |  BGIrec  |
| counter |  | structure|  | data |   | structure|  | data |  | structure|   ...
| (1 byte)|          |                  |    |                  |    |
     |               ------------->------    -------------->-----    ----------
     - referenced by [BGIfont_Ptr]

  BGIrec structure fields have following meaning:

 +00 dword .FontName     font name (4 characters)
 +04 byte  .CharsCount   amount of font characters
 +05 byte  .FirstChar    code of the first character present
 +06 byte  .UpperMargin  high bound of characters
 +07 byte  .LowerMargin  low bound of characters
 +08 dword .Widths       offset to width array
 +12 dword .FirstData    offset to vector table
 +16 dword .EOF	         pointer to the following BGIrec
 +20 dword .font_data    here font data begin

  Font loading and verification are carried out by BGIfont_Prepare procedure.

  BGIfont_Prepare
     in:  EDX - font name (4 characters) to be loaded. It must to be the same as
            the font filename (without extension)
          EDI - address to where font have to be loaded. Used only for the
            first time. Then you may find this value in [BGIfont_Ptr]
     out: EAX=0, if an error occured, otherwise EAX is identifier (ID) of the
            loaded font. Later it is possible to get font ID with BGIfont_GetID
            function.

  For the simultaneous loading of few fonts you may use BGIfont_Init routine.

  BGIfont_Init
     in:  ESI - pointer to array of font names (for example db 'TRIPSIMPEURO')
          ECX is amount of fonts to load
          EDI - see BGIfont_Prepare
     out: nothing.

  To load 10 standard fonts the module defines an array BGIfont_names (see in
BGITEST for usage demonstration).

  For compatibility and subsequent kernel introduction, the module offers 2
routines for drawing vector characters. One of them uses registers (like sysfunc
4), another uses a structure.

  BGIfont_Outtext
     in:  EAX - "pivot point" of a string [x] shl 16+[y]
          ECX - text color and font size 0xXYRRGGBB,
              where X - vector font ID(4..F),
                    Y - size of caracters divided by 4, e.g. 0x1 - 1/4 of
                      ordinary size, 0xC - triple size.
            EDX - pointer to the string
            ESI - string length + formatting flags (see below). BGI_ITALIC and
              BGI_NODRAW flags are ignored.
     out: EAX - coords at the end of the string drawn [x] shl 16+[y].

  As you can see, BGIfont_Outtext is similar to the 4th system function,
but provides an extended management of drawing symbols.

  The most complete use of vector fonts is provided by BGIfont_Freetext routine.
Parameters are passed in a BGIfree structure.

  BGIfree structure fields have following meaning:

 +00 dword   font name (4 characters)
 +04 dword   "pivot point" of a string [x] shl 16+[y]
 +08 dword   turn angle (clockwise, 0 is horizontal)
 +12 dword   X scale (floating point value!)
 +16 dword   Y scale (floating point value!)
 +20 dword   pointer to the string
 +24 dword   string length WITHOUT formatting flags
 +28 dword   text color 0x00RRGGBB
 +32 dword   formatting flags

  The module defines following formatting flags:
BGI_NODRAW     - do not draw
BGI_ITALIC     - italic
BGI_BOLD       - bold
BGI_HALEFT     - left alignment
BGI_HARIGHT    - right alignment
BGI_HACENTER   - center alignment
BGI_VABOTTOM   - bottom alignment
BGI_VATOP      - top alignment
BGI_VACENTER   - middle vertical alignment

  Combination of flags can be performed by addition or the OR operation.

  BGIfont_Freetext
     in:  EBX - pointer to BGIfree structure
     out: EAX coords at the end of the string drawn [x] shl 16+[y].

  BGIfont_GetID routine returns font ID by its name.

  BGIfont_GetID
     in:  EDX - font name (4 characters)
     out: EAX - ID of the font
          EDI - pointer on font's BGIrec structure.

  Using functions of BGIFONT.INC module is demonstrated by BGITEST app.

  Todo list:
1. An insidious bug sometimes shows up while loading multiple fonts (as in
   BGITEST), that corrupts some characters. It disappears when font loading
   order is changed... :-(
2. To correct a hardly reproduceable bug when moving along the font list.
3. To perfect drawing of bold fonts.
4. To add number drawing routines.


