Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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