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 |
2 | |||
3 | Written in pure assembler by Ivushkin Andrey aka Willow |
||
4 | |||
5 | At present Menuet operation system has poor means to draw charaters. Its |
||
6 | distro contains 2 raster fonts (CHAR.MT & CHAR2.MT files). The kernel supports |
||
7 | them internally. That is Jarek Pelczar who makes certain efforts to develop |
||
8 | scalable TTF-like fonts but huge Menuet C Library does not become widespread |
||
9 | inside our assembly-written OS. Bulgarian MenuetOS team also tries to include |
||
10 | third scalable font into the kernel, though, as far as I know, its characters |
||
11 | are still under design and are incomplete. Therefore Bulgarian developing is |
||
12 | not valuable for ordinary users. It is obvious that scalable fonts will help |
||
13 | to develop such products as browsers and word processors where character |
||
14 | formatting is of great importance. |
||
15 | Let me introduce for public domain an include file BGIFONT.INC to process |
||
16 | vector fonts (*.CHR) worked out by famous Borland Corporation to use in Turbo |
||
17 | Pascal, Turbo C and Borland C++ compilers under MS-DOS. Sorry, I still fail to |
||
18 | add BGI font support into kernel - deeper knowledge on memory allocation and |
||
19 | system calls needed. I hope that Menuet system programmers will be glad to help |
||
20 | me. Module compiling within kernel is supposed using constant BGI_LEVEL equ |
||
21 | KERNEL. By means of conditional compiling it will be possible to use the module |
||
22 | at both kernel and application levels. Following is concerned using the include |
||
23 | file while programming an application. |
||
24 | |||
25 | BGI fonts may reside in any folder on HD or RD. They are searched using value |
||
26 | of constant BGI_PATH. If constant BGI_WINDOW_CLIP is equal to 1, module routines |
||
27 | perform window bounds check to avoid artifacts while drawing. Use this if you |
||
28 | aren't sure that strings are fit in window. All BGIFONT.INC routines are |
||
29 | declared as macros, that is they are used without "call". To load 11 fonts into |
||
30 | application's memory a contiguous free space up to 120 kb is needed. When |
||
31 | loading, font data relocation is performed to save memory. Let us see a chart: |
||
32 | |||
33 | | Font | | BGIrec | | Font | | BGIrec | | Font | | BGIrec | |
||
34 | | counter | | structure| | data | | structure| | data | | structure| ... |
||
35 | | (1 byte)| | | | | | |
||
36 | | ------------->------ -------------->----- ---------- |
||
37 | - referenced by [BGIfont_Ptr] |
||
38 | |||
39 | BGIrec structure fields have following meaning: |
||
40 | |||
41 | +00 dword .FontName font name (4 characters) |
||
42 | +04 byte .CharsCount amount of font characters |
||
43 | +05 byte .FirstChar code of the first character present |
||
44 | +06 byte .UpperMargin high bound of characters |
||
45 | +07 byte .LowerMargin low bound of characters |
||
46 | +08 dword .Widths offset to width array |
||
47 | +12 dword .FirstData offset to vector table |
||
48 | +16 dword .EOF pointer to the following BGIrec |
||
49 | +20 dword .font_data here font data begin |
||
50 | |||
51 | Font loading and verification are carried out by BGIfont_Prepare procedure. |
||
52 | |||
53 | BGIfont_Prepare |
||
54 | in: EDX - font name (4 characters) to be loaded. It must to be the same as |
||
55 | the font filename (without extension) |
||
56 | EDI - address to where font have to be loaded. Used only for the |
||
57 | first time. Then you may find this value in [BGIfont_Ptr] |
||
58 | out: EAX=0, if an error occured, otherwise EAX is identifier (ID) of the |
||
59 | loaded font. Later it is possible to get font ID with BGIfont_GetID |
||
60 | function. |
||
61 | |||
62 | For the simultaneous loading of few fonts you may use BGIfont_Init routine. |
||
63 | |||
64 | BGIfont_Init |
||
65 | in: ESI - pointer to array of font names (for example db 'TRIPSIMPEURO') |
||
66 | ECX is amount of fonts to load |
||
67 | EDI - see BGIfont_Prepare |
||
68 | out: nothing. |
||
69 | |||
70 | To load 10 standard fonts the module defines an array BGIfont_names (see in |
||
71 | BGITEST for usage demonstration). |
||
72 | |||
73 | For compatibility and subsequent kernel introduction, the module offers 2 |
||
74 | routines for drawing vector characters. One of them uses registers (like sysfunc |
||
75 | 4), another uses a structure. |
||
76 | |||
77 | BGIfont_Outtext |
||
78 | in: EAX - "pivot point" of a string [x] shl 16+[y] |
||
79 | ECX - text color and font size 0xXYRRGGBB, |
||
80 | where X - vector font ID(4..F), |
||
81 | Y - size of caracters divided by 4, e.g. 0x1 - 1/4 of |
||
82 | ordinary size, 0xC - triple size. |
||
83 | EDX - pointer to the string |
||
84 | ESI - string length + formatting flags (see below). BGI_ITALIC and |
||
85 | BGI_NODRAW flags are ignored. |
||
86 | out: EAX - coords at the end of the string drawn [x] shl 16+[y]. |
||
87 | |||
88 | As you can see, BGIfont_Outtext is similar to the 4th system function, |
||
89 | but provides an extended management of drawing symbols. |
||
90 | |||
91 | The most complete use of vector fonts is provided by BGIfont_Freetext routine. |
||
92 | Parameters are passed in a BGIfree structure. |
||
93 | |||
94 | BGIfree structure fields have following meaning: |
||
95 | |||
96 | +00 dword font name (4 characters) |
||
97 | +04 dword "pivot point" of a string [x] shl 16+[y] |
||
98 | +08 dword turn angle (clockwise, 0 is horizontal) |
||
99 | +12 dword X scale (floating point value!) |
||
100 | +16 dword Y scale (floating point value!) |
||
101 | +20 dword pointer to the string |
||
102 | +24 dword string length WITHOUT formatting flags |
||
103 | +28 dword text color 0x00RRGGBB |
||
104 | +32 dword formatting flags |
||
105 | |||
106 | The module defines following formatting flags: |
||
107 | BGI_NODRAW - do not draw |
||
108 | BGI_ITALIC - italic |
||
109 | BGI_BOLD - bold |
||
110 | BGI_HALEFT - left alignment |
||
111 | BGI_HARIGHT - right alignment |
||
112 | BGI_HACENTER - center alignment |
||
113 | BGI_VABOTTOM - bottom alignment |
||
114 | BGI_VATOP - top alignment |
||
115 | BGI_VACENTER - middle vertical alignment |
||
116 | |||
117 | Combination of flags can be performed by addition or the OR operation. |
||
118 | |||
119 | BGIfont_Freetext |
||
120 | in: EBX - pointer to BGIfree structure |
||
121 | out: EAX coords at the end of the string drawn [x] shl 16+[y]. |
||
122 | |||
123 | BGIfont_GetID routine returns font ID by its name. |
||
124 | |||
125 | BGIfont_GetID |
||
126 | in: EDX - font name (4 characters) |
||
127 | out: EAX - ID of the font |
||
128 | EDI - pointer on font's BGIrec structure. |
||
129 | |||
130 | Using functions of BGIFONT.INC module is demonstrated by BGITEST app. |
||
131 | |||
132 | Todo list: |
||
133 | 1. An insidious bug sometimes shows up while loading multiple fonts (as in |
||
134 | BGITEST), that corrupts some characters. It disappears when font loading |
||
135 | order is changed... :-( |
||
136 | 2. To correct a hardly reproduceable bug when moving along the font list. |
||
137 | 3. To perfect drawing of bold fonts. |
||
138 | 4. To add number drawing routines. |
||
139 |