home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / desktop / newbar / Source / NewBar / c / font next >
Text File  |  1998-07-22  |  3KB  |  109 lines

  1.  
  2. /* font.c */
  3.  
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "OS:font.h"
  7. #include "OS:wimpreadsysinfo.h"
  8.  
  9. #include "font.h"
  10. #include "options.h"
  11.  
  12.  
  13. /* Private structures */
  14.  
  15. struct font_object {
  16.   int handle;
  17. };
  18.  
  19.  
  20. /* Returns a font handle for the font specified by options.  May return 0
  21.    if malloc failed. */
  22. font_object *font_open(void)
  23. {
  24.   font_object *obj;
  25.   const char *font = options->font;
  26.   char *desktop_font_name = 0;
  27.   int y_size = (int) (options->font_size * 16),
  28.       x_size = (int) (options->font_width * 16);
  29.   obj = malloc(sizeof(font_object));
  30.   if(!obj) return 0;
  31.  
  32.   /* Default to desktop font. */
  33.   obj->handle = 0;
  34.   if(!font && !y_size && !x_size) return obj;
  35.  
  36.   /* Read separate defaults from desktop font. */
  37.   if(!font || !y_size) {
  38.     font_f desktop_font;
  39.     /* Desktop font could be the system font. */
  40.     if(xwimpreadsysinfo_font(&desktop_font, 0)) desktop_font = 0;
  41.     /* Read the desktop font sizes. */
  42.     if(!y_size) {
  43.       int new_x_size, new_y_size;
  44.       if(desktop_font)
  45.         font_read_defn(desktop_font, &new_x_size, &new_y_size, 0, 0, 0, 0);
  46.         else { new_x_size = new_y_size = 12*16; }
  47.       y_size = new_y_size;
  48.       if(!x_size) x_size = new_x_size;
  49.     }
  50.     /* Read the desktop font name. */
  51.     if(!font) {
  52.       int size;
  53.       /* May have to use the system font. */
  54.       if(!desktop_font) return obj;
  55.       size = font_read_identifier(desktop_font, 0);
  56.       font = desktop_font_name = malloc(size + 1);
  57.       if(!desktop_font_name) return obj;
  58.       /* I wish the docs would say how this is terminated.  Never mind
  59.          though, since the Font manager should cope with its own strings. */
  60.       font_read_identifier(desktop_font, (byte *) desktop_font_name);
  61.     }
  62.   }
  63.  
  64.   /* Width defaults to height. */
  65.   if(!x_size) x_size = y_size;
  66.  
  67.   /* Open font. */
  68.   obj->handle = font_find_font(font, x_size, y_size, 0, 0, 0, 0);
  69.   free(desktop_font_name);
  70.  
  71.   return obj;
  72. }
  73.  
  74. void font_close(font_object *obj)
  75. {
  76.   if(!obj) return;
  77.   if(obj->handle) font_lose_font(obj->handle);
  78.   free(obj);
  79. }
  80.  
  81. int font_text_width(const font_object *obj, const char *text)
  82. {
  83.   if(!obj) return 0;
  84.   if(obj->handle) {
  85.     /* Font manager. */
  86.     /* I hate the Font Manager.  Horrible API, horrible documentation. */
  87.     font_scan_block b;
  88.     b.space.x = b.space.y = 0;
  89.     b.letter.x = b.letter.y = 0;
  90.     b.split_char = -1;
  91.     font_scan_string(obj->handle, text, font_GIVEN_BLOCK |
  92.     font_GIVEN_LENGTH | font_GIVEN_FONT | font_KERN | font_RETURN_BBOX,
  93.     1<<30, 1<<30, &b, 0, strlen(text), 0, 0, 0, 0);
  94.     /* Convert from millipoints. */
  95.     return (b.bbox.x1 - b.bbox.x0) / font_OS_UNIT;
  96.   }
  97.   else /* Desktop font. */
  98.     return wimpreadsysinfo_version() >= wimp_VERSION_RO35 ?
  99.     wimptextop_string_width(text, strlen(text)) :
  100.     strlen(text) * 16; /* System font. */
  101. }
  102.  
  103. /* Return the font handle for this font.  0 means the desktop font. */
  104. int font_get_handle(font_object *obj)
  105. {
  106.   if(!obj) return 0;
  107.   return obj->handle;
  108. }
  109.