home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / lib / str-to-bit.c < prev    next >
C/C++ Source or Header  |  1992-06-21  |  4KB  |  111 lines

  1. /* str-to-bit.c: typeset a text string in some font, producing a bitmap.
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #include "config.h"
  20.  
  21. #include <ctype.h>
  22. #include "font.h"
  23.  
  24.  
  25. /* Turn the C string TEXT into a bitmap, taking the characters from the
  26.    font FONT_NAME at resolution DPI.  Any space characters in TEXT turn
  27.    into the natural interword space for this font.  No escapes are
  28.    recognized in TEXT.  We don't close FONT_NAME when we're done, since
  29.    the most common case is to be called multiple times on a single font.  */
  30.  
  31. bitmap_type
  32. string_to_bitmap (string text, string font_name, unsigned dpi)
  33. {
  34.   bitmap_type b;
  35.   unsigned this_char;
  36.   char_info_type *chars[strlen (text)];
  37.   font_info_type font = get_font (font_name, dpi);
  38.   int width = 0, height = 0, depth = 0;
  39.   int x = 0, y = 0;  /* Our current position.  */
  40.   real tfm_space
  41.     = TFM_SAFE_FONTDIMEN (FONT_TFM_FONT (font), TFM_SPACE_PARAMETER, 0);
  42.   int font_space = POINTS_TO_PIXELS (tfm_space, dpi);
  43.  
  44.   for (this_char = 0; this_char < strlen (text); this_char++)
  45.     {
  46.       /* Turn any kind of space character into a normal interword space.  */
  47.       if (isspace (text[this_char]))
  48.         width += font_space;
  49.       else
  50.         {
  51.       chars[this_char] = get_char (font_name, text[this_char]);
  52.           
  53.           /* If the character doesn't exist in this font, just keep
  54.              going.  */
  55.           if (chars[this_char] == NULL)
  56.             continue;
  57.             
  58.           /* The set width should be equal to the left side bearing plus
  59.              the bitmap width plus the right side bearing.  */
  60.       width += CHAR_SET_WIDTH (*chars[this_char]);
  61.       height = MAX (height, CHAR_HEIGHT (*chars[this_char]));
  62.       depth = MAX (depth, CHAR_DEPTH (*chars[this_char]));
  63.         }
  64.     }
  65.  
  66.   /* Unless the image is nonnegative both horizontally and vertically,
  67.      it is invisible.  */
  68.   if (width <= 0 || (height + depth <= 0))
  69.     {
  70.       BITMAP_WIDTH (b) = 0;
  71.       BITMAP_HEIGHT (b) = 0;
  72.       BITMAP_BITS (b) = NULL;
  73.       return b;
  74.     }
  75.  
  76.   /* The image is going to be visible.  */
  77.   b = new_bitmap ((dimensions_type) { height + depth, width });
  78.   
  79.   for (this_char = 0; this_char < strlen (text); this_char++)
  80.     {
  81.       if (isspace (text[this_char]))
  82.         x += font_space;
  83.       else
  84.         {
  85.           int char_x, char_y;
  86.           char_info_type c;
  87.           
  88.           if (chars[this_char] == NULL)
  89.             continue;
  90.           
  91.           c = *chars[this_char];
  92.  
  93.           x += CHAR_LSB (c);
  94.           x = MAX (x, 0);  /* In case the lsb was negative.  */
  95.  
  96.           /* Copy the character image to the bitmap we are building, one
  97.              column at a time, from top to bottom.  */
  98.           for (char_x = 0; char_x < CHAR_BITMAP_WIDTH (c); char_x++, x++)
  99.             for (char_y = 0, y = height - CHAR_HEIGHT (c);
  100.                  char_y < CHAR_BITMAP_HEIGHT (c);
  101.                  char_y++, y++)
  102.               BITMAP_PIXEL (b, y, x)
  103.                 = BITMAP_PIXEL (CHAR_BITMAP (c), char_y, char_x);
  104.           
  105.           x += CHAR_RSB (c);
  106.         }
  107.     }
  108.  
  109.   return b;
  110. }
  111.