returns a handle to a loaded font.
| 273 | |
| 274 | // returns a handle to a loaded font. |
| 275 | int grfont_Load(const char *fname) { |
| 276 | FONTFILE ff; |
| 277 | tFontFileInfo fnt; |
| 278 | char fontname[32]; |
| 279 | int num_char, i, handle = -1; |
| 280 | |
| 281 | ASSERT(Font_init); |
| 282 | |
| 283 | // check if font is in list. if so, just return the handle. |
| 284 | |
| 285 | // find free slot in font list. |
| 286 | for (i = 0; i < MAX_FONTS; i++) { |
| 287 | if (Fonts[i].references == 0) |
| 288 | break; |
| 289 | } |
| 290 | ASSERT(i < MAX_FONTS); |
| 291 | |
| 292 | handle = i; |
| 293 | |
| 294 | // open file. |
| 295 | ff = OPEN_FONT(fname); |
| 296 | if (!ff) { |
| 297 | return false; |
| 298 | } else if (ff == (FONTFILE)0xffffffff) { |
| 299 | mprintf(0, "Illegal font file: %s.\n", fname); |
| 300 | return false; |
| 301 | } |
| 302 | |
| 303 | // read header information |
| 304 | fnt.width = READ_FONT_SHORT(ff); |
| 305 | fnt.height = READ_FONT_SHORT(ff); |
| 306 | fnt.flags = READ_FONT_SHORT(ff); |
| 307 | fnt.baseline = READ_FONT_SHORT(ff); |
| 308 | fnt.min_ascii = READ_FONT_BYTE(ff); |
| 309 | fnt.max_ascii = READ_FONT_BYTE(ff); |
| 310 | READ_FONT_DATA(ff, fontname, 32, 1); |
| 311 | |
| 312 | // read new info |
| 313 | if (fnt.flags & FT_FFI2) { |
| 314 | fnt.ffi2.tracking = READ_FONT_SHORT(ff); |
| 315 | READ_FONT_DATA(ff, fnt.ffi2.reserved, sizeof(fnt.ffi2.reserved), 1); |
| 316 | } else { |
| 317 | fnt.ffi2.tracking = 0; |
| 318 | } |
| 319 | |
| 320 | fnt.brightness = ((fnt.baseline >> 8) / 10.0f); |
| 321 | /* |
| 322 | mprintf(0, "%s font.\n", fname); |
| 323 | mprintf(0, " <ht %d>::<min %d>::<max %d>::<base %d>", fnt.height, fnt.min_ascii, fnt.max_ascii, fnt.baseline); |
| 324 | */ |
| 325 | num_char = fnt.max_ascii - fnt.min_ascii + 1; |
| 326 | |
| 327 | if (fnt.max_ascii < 'a') { |
| 328 | fnt.flags |= FT_UPPERCASE; |
| 329 | } |
| 330 | |
| 331 | // Read in all widths |
| 332 | if (fnt.flags & FT_PROPORTIONAL) { |
no test coverage detected