 BGIFONT.INC v1.0 beta for MenuetOS
 Модуль для работы с векторными шрифтами формата BGI

 Написан на чистом ассемблере Ивушкиным Андреем aka Willow

  В настоящее время операционная система Menuet обладает скудными средствами
отображения символов. В дистрибутиве имеются 2 растровых шрифта (файлы CHAR.MT и
CHAR2.MT). Работа с ними жестко зашита в ядре. Определенные усилия по внедрению
масштабируемых шрифтов TTF-подобного формата предпринимает Jarek Pelczar, однако
громоздкая MenuetOS C Library не получила до сих пор большой популярности в
ассемблерной ОС. Болгарской командой Menuet делались попытки встроить в ядро
третий масштабируемый шрифт, но, насколько мне известно, его символы находятся в
стадии дизайна. Таким образом, разработка болгар пока не представляет ценности
для рядовых пользователей. Очевидно, что масштабируемые шрифты помогут
разработке таких важных категорий программных продуктов, как браузеры и
текстовые процессоры, где большую роль играет форматирование символов.
  Представляю в общественное пользование включаемый файл BGIFONT.INC для работы с
векторными шрифтами *.CHR, разработанные знаменитой фирмой Borland для
использования в компиляторах Turbo Pascal, Turbo C и Borland C++ еще в среде MS-
DOS. К сожалению, пока что мне не удается обеспечить поддержку BGI-шрифтов на
уровне ядра - нужно глубже изучать нюансы распределения памяти и вызова
системных функций. Я надеюсь, что системщики Menuet с готовностью мне помогут.
Компиляция модуля в составе ядра предполагается с использованием константы
BGI_LEVEL equ KERNEL. Благодаря условной компиляции модуль можно будет
использовать с незначительными изменениями на уровне как ядра, так и приложения.
Нижеизложенное касается работы модуля на уровне приложения.

  BGI-шрифты могут располагаться в любом каталоге HD или RD. Их поиск
осуществляется по значению константы BGI_PATH. Если константа BGI_WINDOW_CLIP
установлена в 1, процедурами модуля в процессе вывода векторов шрифта
осуществляется проверка выхода за границы окна, чтобы избежать артефактов.
Используйте это, если вы не уверены, что надписи будут помещаться в окне. В
этом случае необходимо дополнительно определить константу BGI_PRC_INFO - адрес
в памяти (1024 байта), куда приложение может получать информацию о своем окне
через 9-ю системную функцию. Все процедуры модуля BGIFONT.INC объявлены как
макросы, т.е. вызываются без call. Для загрузки 11 шрифтов в адресное
пространство приложения необходим непрерывный участок размером около 120 кб.
При загрузке осуществляется перемещение данных с целью экономии памяти. Схема
размещения шрифтов:

| Счетчик |  | Структура|  |Данные|   |Структура|  | Данные|  |Структура|
| шрифтов |  |  BGIrec  |  |шрифта|   | BGIrec  |  | шрифта|  | BGIrec  |   ...
| (1 байт)|          |                  |    |                  |    |
     |               ------------->------    -------------->-----    ----------
     - сюда ссылается [BGIfont_Ptr]

  Поля структуры BGIrec имеют следующее назначение:

 +00 dword .FontName     четырехбуквенное имя шрифта
 +04 byte  .CharsCount   количество символов в шрифте
 +05 byte  .FirstChar    код первого реализованного символа
 +06 byte  .UpperMargin  верхняя граница символа
 +07 byte  .LowerMargin  нижняя граница символа
 +08 dword .Widths       смещение массива ширин символов
 +12 dword .FirstData    смещение таблицы векторов
 +16 dword .EOF	         указатель на следующий BGIrec
 +20 dword .font_data    здесь начинаются данные шрифта

  Собственно загрузку и верификацию шрифта осуществляет процедура
BGIfont_Prepare.

  BGIfont_Prepare
     вход:  EDX - четырехбуквенное имя шрифта, подлежащего загрузке. Должно
            совпадать с именем файла шрифта (без расширения)
            EDI - адрес участка памяти, куда следует поместить данные шрифта.
            Используется только при загрузке первого шрифта. Это значение
            заносится в [BGIfont_Ptr]
     выход: EAX=0, если произошла ошибка, иначе в EAX - идентификатор (ID)
            загруженного шрифта. Впоследствии ID можно получить функциями
            BGIfont_GetID и BGIfont_GetName.

  Для единовременной загрузки нескольких шрифтов можно использовать процедуру
BGIfont_Init.

  BGIfont_Init
     вход:  ESI - указатель на список имен шрифтов (например db 'TRIPSIMPEURO')
            ECX - количество шрифтов для загрузки
            EDI - см. BGIfont_Prepare
     выход: ничего.

  Для загрузки 10 стандартных шрифтов в модуле определен массив BGIfont_names
(использование см. в BGITEST).

  В целях совместимости и последующего внедрения в ядро модуль предлагает 2
процедуры для вывода символов векторными шрифтами. Одна из них использует
регистры (подобно 4-й системной функции), другая - структуру.

  BGIfont_Outtext
     вход:  EAX - "точка отсчета" при выводе строки [x] shl 16+[y]
            ECX - цвет текста и размер шрифта 0xXYRRGGBB,
              где X - ID векторного шрифта (4..F),
                  Y - величина символов/4, например 0x1 - 1/4 обычного размера,
                      0xC - тройной размер.
            EDX - указатель на строку
            ESI - длина строки + флаги форматирования (см. ниже). Флаги
              BGI_ITALIC и BGI_NODRAW игнорируются.
     выход: EAX - координаты конца надписи [x] shl 16+[y].

  Как видим, BGIfont_Outtext по своим параметрам схожа с 4-й системной функцией,
но допускает расширенное управление выводом символов.

  Наиболее полное использование векторных шрифтов обеспечивает функция
BGIfont_Freetext. Параметры вывода строки передаются в структуре BGIfree.

  Поля структуры BGIfree имеют следующее назначение:

 +00 dword   четырехбуквенное имя шрифта
 +04 dword   "точка отсчета" при выводе строки [x] shl 16+[y]
 +08 dword   угол поворота (0 - горизонталь, отсчет по часовой стрелке)
 +12 dword   масштаб по оси X (значение с плавающей точкой!)
 +16 dword   масштаб по оси Y (значение с плавающей точкой!)
 +20 dword   указатель на строку
 +24 dword   длина строки БЕЗ флагов форматирования
 +28 dword   цвет текста 0x00RRGGBB
 +32 dword   флаги форматирования

  Модуль определяет следующие флаги форматирования:
BGI_NODRAW     - не рисовать символы
BGI_ITALIC     - курсив
BGI_BOLD       - полужирный шрифт
BGI_HALEFT     - выровнять по левому краю
BGI_HARIGHT    - выровнять по правому краю
BGI_HACENTER   - выровнять по центру
BGI_VABOTTOM   - выровнять по нижнему краю
BGI_VATOP      - выровнять по верхнему краю
BGI_VACENTER   - выровнять по середине

  Комбинация флагов образуется их сложением или операцией OR.

  BGIfont_Freetext
     вход:  EBX - указатель на структуру BGIfree
     выход: EAX - координаты конца надписи [x] shl 16+[y].

  Функция BGIfont_GetID возвращает ID шрифта по заданному имени.

  BGIfont_GetID
     вход:  EDX - четырехбуквенное имя шрифта
     выход: EAX - ID шрифта
            EDI - указатель на BGIrec шрифта.

  Использование функций модуля BGIFONT.INC демонстрирует программа BGITEST.

  Что еще нужно сделать:
1. При множественной загрузке шрифтов (как в BGITEST) иногда проявляется
   коварный баг, портящий несколько символов. При изменении порядка загрузки
   шрифтов он исчезает... :-(
2. Исправить трудовоспроизводимый баг при движении по списку шрифтов.
3. Усовершенствовать прорисовку полужирных шрифтов.
4. Добавить функции вывода чисел.
