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. Добавить функции вывода чисел.