Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  BGIFONT.INC v1.0 beta for MenuetOS
  2.  Модуль для работы с векторными шрифтами формата BGI
  3.  
  4.  Написан на чистом ассемблере Ивушкиным Андреем aka Willow
  5.  
  6.   В настоящее время операционная система Menuet обладает скудными средствами
  7. отображения символов. В дистрибутиве имеются 2 растровых шрифта (файлы CHAR.MT и
  8. CHAR2.MT). Работа с ними жестко зашита в ядре. Определенные усилия по внедрению
  9. масштабируемых шрифтов TTF-подобного формата предпринимает Jarek Pelczar, однако
  10. громоздкая MenuetOS C Library не получила до сих пор большой популярности в
  11. ассемблерной ОС. Болгарской командой Menuet делались попытки встроить в ядро
  12. третий масштабируемый шрифт, но, насколько мне известно, его символы находятся в
  13. стадии дизайна. Таким образом, разработка болгар пока не представляет ценности
  14. для рядовых пользователей. Очевидно, что масштабируемые шрифты помогут
  15. разработке таких важных категорий программных продуктов, как браузеры и
  16. текстовые процессоры, где большую роль играет форматирование символов.
  17.   Представляю в общественное пользование включаемый файл BGIFONT.INC для работы с
  18. векторными шрифтами *.CHR, разработанные знаменитой фирмой Borland для
  19. использования в компиляторах Turbo Pascal, Turbo C и Borland C++ еще в среде MS-
  20. DOS. К сожалению, пока что мне не удается обеспечить поддержку BGI-шрифтов на
  21. уровне ядра - нужно глубже изучать нюансы распределения памяти и вызова
  22. системных функций. Я надеюсь, что системщики Menuet с готовностью мне помогут.
  23. Компиляция модуля в составе ядра предполагается с использованием константы
  24. BGI_LEVEL equ KERNEL. Благодаря условной компиляции модуль можно будет
  25. использовать с незначительными изменениями на уровне как ядра, так и приложения.
  26. Нижеизложенное касается работы модуля на уровне приложения.
  27.  
  28.   BGI-шрифты могут располагаться в любом каталоге HD или RD. Их поиск
  29. осуществляется по значению константы BGI_PATH. Если константа BGI_WINDOW_CLIP
  30. установлена в 1, процедурами модуля в процессе вывода векторов шрифта
  31. осуществляется проверка выхода за границы окна, чтобы избежать артефактов.
  32. Используйте это, если вы не уверены, что надписи будут помещаться в окне. В
  33. этом случае необходимо дополнительно определить константу BGI_PRC_INFO - адрес
  34. в памяти (1024 байта), куда приложение может получать информацию о своем окне
  35. через 9-ю системную функцию. Все процедуры модуля BGIFONT.INC объявлены как
  36. макросы, т.е. вызываются без call. Для загрузки 11 шрифтов в адресное
  37. пространство приложения необходим непрерывный участок размером около 120 кб.
  38. При загрузке осуществляется перемещение данных с целью экономии памяти. Схема
  39. размещения шрифтов:
  40.  
  41. | Счетчик |  | Структура|  |Данные|   |Структура|  | Данные|  |Структура|
  42. | шрифтов |  |  BGIrec  |  |шрифта|   | BGIrec  |  | шрифта|  | BGIrec  |   ...
  43. | (1 байт)|          |                  |    |                  |    |
  44.      |               ------------->------    -------------->-----    ----------
  45.      - сюда ссылается [BGIfont_Ptr]
  46.  
  47.   Поля структуры BGIrec имеют следующее назначение:
  48.  
  49.  +00 dword .FontName     четырехбуквенное имя шрифта
  50.  +04 byte  .CharsCount   количество символов в шрифте
  51.  +05 byte  .FirstChar    код первого реализованного символа
  52.  +06 byte  .UpperMargin  верхняя граница символа
  53.  +07 byte  .LowerMargin  нижняя граница символа
  54.  +08 dword .Widths       смещение массива ширин символов
  55.  +12 dword .FirstData    смещение таблицы векторов
  56.  +16 dword .EOF          указатель на следующий BGIrec
  57.  +20 dword .font_data    здесь начинаются данные шрифта
  58.  
  59.   Собственно загрузку и верификацию шрифта осуществляет процедура
  60. BGIfont_Prepare.
  61.  
  62.   BGIfont_Prepare
  63.      вход:  EDX - четырехбуквенное имя шрифта, подлежащего загрузке. Должно
  64.             совпадать с именем файла шрифта (без расширения)
  65.             EDI - адрес участка памяти, куда следует поместить данные шрифта.
  66.             Используется только при загрузке первого шрифта. Это значение
  67.             заносится в [BGIfont_Ptr]
  68.      выход: EAX=0, если произошла ошибка, иначе в EAX - идентификатор (ID)
  69.             загруженного шрифта. Впоследствии ID можно получить функциями
  70.             BGIfont_GetID и BGIfont_GetName.
  71.  
  72.   Для единовременной загрузки нескольких шрифтов можно использовать процедуру
  73. BGIfont_Init.
  74.  
  75.   BGIfont_Init
  76.      вход:  ESI - указатель на список имен шрифтов (например db 'TRIPSIMPEURO')
  77.             ECX - количество шрифтов для загрузки
  78.             EDI - см. BGIfont_Prepare
  79.      выход: ничего.
  80.  
  81.   Для загрузки 10 стандартных шрифтов в модуле определен массив BGIfont_names
  82. (использование см. в BGITEST).
  83.  
  84.   В целях совместимости и последующего внедрения в ядро модуль предлагает 2
  85. процедуры для вывода символов векторными шрифтами. Одна из них использует
  86. регистры (подобно 4-й системной функции), другая - структуру.
  87.  
  88.   BGIfont_Outtext
  89.      вход:  EAX - "точка отсчета" при выводе строки [x] shl 16+[y]
  90.             ECX - цвет текста и размер шрифта 0xXYRRGGBB,
  91.               где X - ID векторного шрифта (4..F),
  92.                   Y - величина символов/4, например 0x1 - 1/4 обычного размера,
  93.                       0xC - тройной размер.
  94.             EDX - указатель на строку
  95.             ESI - длина строки + флаги форматирования (см. ниже). Флаги
  96.               BGI_ITALIC и BGI_NODRAW игнорируются.
  97.      выход: EAX - координаты конца надписи [x] shl 16+[y].
  98.  
  99.   Как видим, BGIfont_Outtext по своим параметрам схожа с 4-й системной функцией,
  100. но допускает расширенное управление выводом символов.
  101.  
  102.   Наиболее полное использование векторных шрифтов обеспечивает функция
  103. BGIfont_Freetext. Параметры вывода строки передаются в структуре BGIfree.
  104.  
  105.   Поля структуры BGIfree имеют следующее назначение:
  106.  
  107.  +00 dword   четырехбуквенное имя шрифта
  108.  +04 dword   "точка отсчета" при выводе строки [x] shl 16+[y]
  109.  +08 dword   угол поворота (0 - горизонталь, отсчет по часовой стрелке)
  110.  +12 dword   масштаб по оси X (значение с плавающей точкой!)
  111.  +16 dword   масштаб по оси Y (значение с плавающей точкой!)
  112.  +20 dword   указатель на строку
  113.  +24 dword   длина строки БЕЗ флагов форматирования
  114.  +28 dword   цвет текста 0x00RRGGBB
  115.  +32 dword   флаги форматирования
  116.  
  117.   Модуль определяет следующие флаги форматирования:
  118. BGI_NODRAW     - не рисовать символы
  119. BGI_ITALIC     - курсив
  120. BGI_BOLD       - полужирный шрифт
  121. BGI_HALEFT     - выровнять по левому краю
  122. BGI_HARIGHT    - выровнять по правому краю
  123. BGI_HACENTER   - выровнять по центру
  124. BGI_VABOTTOM   - выровнять по нижнему краю
  125. BGI_VATOP      - выровнять по верхнему краю
  126. BGI_VACENTER   - выровнять по середине
  127.  
  128.   Комбинация флагов образуется их сложением или операцией OR.
  129.  
  130.   BGIfont_Freetext
  131.      вход:  EBX - указатель на структуру BGIfree
  132.      выход: EAX - координаты конца надписи [x] shl 16+[y].
  133.  
  134.   Функция BGIfont_GetID возвращает ID шрифта по заданному имени.
  135.  
  136.   BGIfont_GetID
  137.      вход:  EDX - четырехбуквенное имя шрифта
  138.      выход: EAX - ID шрифта
  139.             EDI - указатель на BGIrec шрифта.
  140.  
  141.   Использование функций модуля BGIFONT.INC демонстрирует программа BGITEST.
  142.  
  143.   Что еще нужно сделать:
  144. 1. При множественной загрузке шрифтов (как в BGITEST) иногда проявляется
  145.    коварный баг, портящий несколько символов. При изменении порядка загрузки
  146.    шрифтов он исчезает... :-(
  147. 2. Исправить трудовоспроизводимый баг при движении по списку шрифтов.
  148. 3. Усовершенствовать прорисовку полужирных шрифтов.
  149. 4. Добавить функции вывода чисел.
  150.