Rev 5754 | Rev 5758 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5730 | pavelyakov | 1 | #ifndef INCLUDE_FONT_H |
2 | #define INCLUDE_FONT_H |
||
3 | |||
4 | #ifndef INCLUDE_MATH_H |
||
5 | #include "../lib/math.h" |
||
6 | #endif |
||
7 | |||
8 | #ifndef INCLUDE_IO_H |
||
9 | #include "../lib/io.h" |
||
10 | #endif |
||
11 | |||
5753 | leency | 12 | :struct __SIZE |
13 | { |
||
14 | word width,height; |
||
15 | signed offset_x,offset_y; |
||
5757 | pavelyakov | 16 | float offset_i,w_italic; |
5753 | leency | 17 | byte text; |
5754 | pavelyakov | 18 | byte TMP_WEIGHT; |
5753 | leency | 19 | }; |
5730 | pavelyakov | 20 | :struct FONT |
21 | { |
||
5753 | leency | 22 | __SIZE size; |
5757 | pavelyakov | 23 | byte width,height,offsetLine,r,g,b,weight,italic; |
5753 | leency | 24 | dword color; |
5736 | pavelyakov | 25 | dword file_size; |
5740 | pavelyakov | 26 | dword buffer; |
5741 | pavelyakov | 27 | dword buffer_size; |
5730 | pavelyakov | 28 | word block; |
29 | dword data; |
||
5736 | pavelyakov | 30 | dword begin; |
5730 | pavelyakov | 31 | dword size_file; |
32 | byte load(...); |
||
5740 | pavelyakov | 33 | byte symbol(word x;byte s;dword c); |
5742 | pavelyakov | 34 | byte symbol_size(byte s); |
5754 | pavelyakov | 35 | dword text(word x,y;dword text1); |
5757 | pavelyakov | 36 | byte textcenter(word x,y,w,h;dword txt); |
5753 | leency | 37 | dword getsize(dword text1); |
38 | dword textarea(word x,y;dword text,c); |
||
39 | byte changeSIZE(); |
||
5740 | pavelyakov | 40 | void PixelRGB(word x,y); |
5757 | pavelyakov | 41 | dword GetPixel(word x,y); |
5740 | pavelyakov | 42 | dword tmp_y,tmp_height,tmp_x; |
5745 | leency | 43 | byte no_bg_copy; |
44 | dword bg_color; |
||
5730 | pavelyakov | 45 | }; |
46 | FONT font = 0; |
||
5740 | pavelyakov | 47 | |
5757 | pavelyakov | 48 | :dword FONT::GetPixel(word x,y) |
49 | { |
||
50 | dword tmp; |
||
51 | tmp = y*size.width*3; |
||
52 | tmp += x*3; |
||
53 | tmp += buffer; |
||
54 | r = DSBYTE[tmp]; |
||
55 | tmp++; |
||
56 | g = DSBYTE[tmp]; |
||
57 | tmp++; |
||
58 | b = DSBYTE[tmp]; |
||
59 | } |
||
5740 | pavelyakov | 60 | :void FONT::PixelRGB(dword x,y) |
61 | { |
||
62 | dword tmp; |
||
5753 | leency | 63 | tmp = y*size.width*3; |
5740 | pavelyakov | 64 | tmp += x*3; |
65 | tmp += buffer; |
||
66 | |||
67 | DSBYTE[tmp] = r; |
||
68 | tmp++; |
||
69 | DSBYTE[tmp] = g; |
||
70 | tmp++; |
||
71 | DSBYTE[tmp] = b; |
||
72 | } |
||
5753 | leency | 73 | :byte FONT::changeSIZE() |
5730 | pavelyakov | 74 | { |
5736 | pavelyakov | 75 | dword TMP_DATA; |
76 | dword ofs; |
||
77 | byte s; |
||
5753 | leency | 78 | IF(size.text<9) size.text = 8; |
5754 | pavelyakov | 79 | s = size.text-8; |
80 | data = begin; |
||
81 | TMP_DATA = data; |
||
82 | TMP_DATA +=s*4; |
||
83 | ofs = DSDWORD[TMP_DATA]; |
||
84 | IF(ofs==-1)return false; |
||
85 | data += ofs; |
||
86 | data += 156; |
||
87 | TMP_DATA = data; |
||
88 | file_size = DSDWORD[TMP_DATA]; |
||
89 | TMP_DATA += file_size; |
||
90 | TMP_DATA--; |
||
91 | height = DSBYTE[TMP_DATA]; |
||
92 | TMP_DATA--; |
||
93 | width = DSBYTE[TMP_DATA]; |
||
94 | block = math.ceil(height*width/32); |
||
95 | return true; |
||
5736 | pavelyakov | 96 | } |
5740 | pavelyakov | 97 | :proc_info Form_SELF_FONTS; |
5757 | pavelyakov | 98 | :byte FONT::textcenter(word x,y,w,h;dword txt) |
99 | { |
||
100 | getsize(txt); |
||
101 | EDX = w/2; |
||
102 | ECX = size.width/2; |
||
103 | EDX -= ECX; |
||
104 | x += EDX; |
||
105 | return text(x,y,txt); |
||
106 | } |
||
5753 | leency | 107 | :dword FONT::getsize(dword text1) |
5736 | pavelyakov | 108 | { |
5753 | leency | 109 | size.height = size.width = 0; |
110 | size.offset_x = size.offset_y = -1; |
||
111 | IF(size.text)IF(!changeSIZE())return 0; |
||
5742 | pavelyakov | 112 | WHILE(DSBYTE[text1]) |
113 | { |
||
5753 | leency | 114 | symbol_size(DSBYTE[text1]); |
5742 | pavelyakov | 115 | text1++; |
116 | } |
||
5753 | leency | 117 | $neg size.offset_y |
118 | $neg size.offset_x |
||
119 | size.height++; |
||
120 | size.height += size.offset_y; |
||
121 | size.width += size.offset_x; |
||
122 | size.width++; |
||
5757 | pavelyakov | 123 | IF(italic) |
124 | { |
||
125 | size.w_italic = -size.height/3; |
||
126 | size.offset_i = -size.w_italic/size.height; |
||
127 | size.offset_x+=size.w_italic; |
||
128 | size.width += math.ceil(size.w_italic+4); |
||
129 | } |
||
5753 | leency | 130 | return size.width; |
5742 | pavelyakov | 131 | } |
132 | :byte FONT::symbol_size(byte s) |
||
133 | { |
||
134 | dword xi,yi; |
||
135 | dword tmp,_; |
||
136 | dword iii; |
||
137 | byte rw=0; |
||
5753 | leency | 138 | byte X; |
5754 | pavelyakov | 139 | size.TMP_WEIGHT = math.ceil(size.text/17); |
5753 | leency | 140 | IF(s==32) |
141 | { |
||
142 | size.width += width/4; |
||
5754 | pavelyakov | 143 | IF(weight) size.width+=size.TMP_WEIGHT; |
5753 | leency | 144 | return; |
145 | } |
||
146 | IF(s==9) |
||
147 | { |
||
148 | size.width += width; |
||
5754 | pavelyakov | 149 | IF(weight) size.width+=size.TMP_WEIGHT; |
5753 | leency | 150 | return; |
151 | } |
||
5742 | pavelyakov | 152 | yi = 0; |
153 | iii = 0; |
||
154 | tmp = 4*block*s; |
||
155 | tmp +=data; |
||
5753 | leency | 156 | while(yi |
5742 | pavelyakov | 157 | { |
158 | xi = 0; |
||
159 | WHILE(xi |
||
160 | { |
||
161 | IF(iii%32) _ >>= 1; |
||
162 | ELSE |
||
163 | { |
||
164 | tmp += 4; |
||
165 | _ = DSDWORD[tmp]; |
||
166 | } |
||
5753 | leency | 167 | IF(_&1) |
168 | { |
||
169 | IF(xi>rw)rw=xi; |
||
170 | IF(size.height |
||
171 | IF(size.offset_y<0)size.offset_y = yi; |
||
172 | ELSE IF(yi |
||
173 | IF(!X) X = xi; |
||
174 | ELSE IF(X>xi)X = xi; |
||
175 | } |
||
5742 | pavelyakov | 176 | xi++; |
177 | iii++; |
||
178 | } |
||
179 | yi++; |
||
180 | } |
||
5753 | leency | 181 | size.width += rw; |
5754 | pavelyakov | 182 | IF(weight) size.width+=size.TMP_WEIGHT; |
5753 | leency | 183 | IF(s=='_') size.width--; |
184 | IF(size.offset_x<0)size.offset_x = X; |
||
5742 | pavelyakov | 185 | } |
5753 | leency | 186 | :dword FONT::text(word x,y;dword text1) |
5742 | pavelyakov | 187 | { |
188 | signed len=0; |
||
5753 | leency | 189 | dword c; |
190 | word _tmp_h; |
||
191 | c = color; |
||
5754 | pavelyakov | 192 | IF(!text1)return false; |
193 | IF(size.text)IF(!changeSIZE())return false; |
||
5740 | pavelyakov | 194 | GetProcessInfo(#Form_SELF_FONTS, SelfInfo); |
5754 | pavelyakov | 195 | IF(y>Form_SELF_FONTS.cheight) return false; |
196 | IF(x>Form_SELF_FONTS.cwidth) return false; |
||
5740 | pavelyakov | 197 | AX = c; |
198 | r = AL; |
||
199 | g = AH; |
||
200 | c>>=16; |
||
201 | AX = c; |
||
202 | b = AL; |
||
5753 | leency | 203 | getsize(text1); |
5754 | pavelyakov | 204 | y -= size.offset_y; |
205 | tmp_y = y; |
||
206 | |||
207 | EDX = size.width*size.height*3; |
||
5745 | leency | 208 | IF(!buffer_size) |
209 | { |
||
5754 | pavelyakov | 210 | buffer_size = EDX; |
5745 | leency | 211 | buffer = malloc(buffer_size); |
212 | } |
||
5754 | pavelyakov | 213 | ELSE IF(buffer_size |
5745 | leency | 214 | { |
5754 | pavelyakov | 215 | buffer_size = EDX; |
5745 | leency | 216 | buffer = realloc(buffer,buffer_size); |
217 | } |
||
218 | IF (no_bg_copy) |
||
219 | { |
||
220 | EBX = bg_color; |
||
221 | EDI = buffer; |
||
5754 | pavelyakov | 222 | EAX = buffer_size+EDI; |
5745 | leency | 223 | WHILE (EDI |
224 | { |
||
225 | ESDWORD[EDI] = EBX; |
||
226 | $add edi,3 |
||
227 | } |
||
228 | } |
||
5753 | leency | 229 | ELSE CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height); |
5757 | pavelyakov | 230 | len = size.offset_x; |
5730 | pavelyakov | 231 | WHILE(DSBYTE[text1]) |
232 | { |
||
5753 | leency | 233 | IF(DSBYTE[text1]=='_') len--; |
5754 | pavelyakov | 234 | len+=symbol(len,DSBYTE[text1]); |
235 | IF(weight)len+=math.ceil(size.text/17); |
||
5730 | pavelyakov | 236 | text1++; |
237 | } |
||
5754 | pavelyakov | 238 | _PutImage(x,y,size.width,size.height,buffer); |
5730 | pavelyakov | 239 | return len; |
240 | } |
||
5736 | pavelyakov | 241 | :dword FONT::textarea(word x,y;dword text1,c;byte size) |
5730 | pavelyakov | 242 | { |
5740 | pavelyakov | 243 | |
5730 | pavelyakov | 244 | } |
5742 | pavelyakov | 245 | |
5754 | pavelyakov | 246 | :byte FONT::symbol(signed x;byte s) |
5730 | pavelyakov | 247 | { |
5736 | pavelyakov | 248 | dword xi,yi; |
249 | dword tmp,_; |
||
250 | dword iii; |
||
5757 | pavelyakov | 251 | float ital = -size.w_italic; |
5741 | pavelyakov | 252 | dword ___x; |
5754 | pavelyakov | 253 | word TMP; |
254 | byte _TMP_WEIGHT; |
||
5736 | pavelyakov | 255 | byte rw=0; |
256 | IF(s==32)return width/4; |
||
257 | IF(s==9)return width; |
||
258 | yi = 0; |
||
259 | iii = 0; |
||
260 | tmp = 4*block*s; |
||
261 | tmp +=data; |
||
5741 | pavelyakov | 262 | while(yi |
5736 | pavelyakov | 263 | { |
264 | xi = 0; |
||
5754 | pavelyakov | 265 | TMP = size.offset_y+yi; |
5753 | leency | 266 | while(xi |
5736 | pavelyakov | 267 | { |
5757 | pavelyakov | 268 | IF(iii%32) _ >>= 1; |
269 | ELSE |
||
270 | { |
||
271 | tmp += 4; |
||
272 | _ = DSDWORD[tmp]; |
||
273 | } |
||
274 | if(_&1) |
||
275 | { |
||
276 | IF(xi>rw)rw=xi; |
||
277 | ___x = x+xi; |
||
278 | IF(italic)___x+=math.ceil(ital); |
||
279 | if(___x |
||
280 | { |
||
281 | PixelRGB(___x,TMP); |
||
282 | _TMP_WEIGHT = size.TMP_WEIGHT; |
||
283 | WHILE(_TMP_WEIGHT) |
||
5753 | leency | 284 | { |
5757 | pavelyakov | 285 | IF(weight) PixelRGB(___x+_TMP_WEIGHT,TMP); |
286 | _TMP_WEIGHT--; |
||
5753 | leency | 287 | } |
5757 | pavelyakov | 288 | } |
289 | } |
||
290 | xi++; |
||
291 | iii++; |
||
5736 | pavelyakov | 292 | } |
293 | yi++; |
||
5757 | pavelyakov | 294 | IF(italic) ital-=size.offset_i; |
5736 | pavelyakov | 295 | } |
296 | return rw; |
||
5730 | pavelyakov | 297 | } |
298 | :byte FONT::load(dword path) |
||
299 | { |
||
300 | dword tmp; |
||
5745 | leency | 301 | buffer_size = 0; |
5730 | pavelyakov | 302 | IF(data)free(data); |
5757 | pavelyakov | 303 | if (!io.read(path)) |
5745 | leency | 304 | { |
305 | debug("Error while loading font: "); |
||
306 | debugln(path); |
||
5754 | pavelyakov | 307 | return false; |
5745 | leency | 308 | } |
5757 | pavelyakov | 309 | begin = tmp = data = io.buffer_data; |
5730 | pavelyakov | 310 | size_file = io.FILES_SIZE; |
311 | tmp +=size_file; |
||
312 | tmp--; |
||
313 | height = DSBYTE[tmp]; |
||
314 | tmp--; |
||
315 | width = DSBYTE[tmp]; |
||
316 | block = math.ceil(height*width/32); |
||
5754 | pavelyakov | 317 | return true; |
5730 | pavelyakov | 318 | } |
319 | |||
320 | #endif |