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