summaryrefslogtreecommitdiff
path: root/include/font.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/font.h')
-rw-r--r--include/font.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/include/font.h b/include/font.h
new file mode 100644
index 0000000..886b3ce
--- /dev/null
+++ b/include/font.h
@@ -0,0 +1,243 @@
+/* font.h: operations on fonts independent of a particular file format.
+
+Copyright (C) 1992 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef FONT_LIBRARY_H
+#define FONT_LIBRARY_H
+
+#include "bitmap.h"
+#include "bounding-box.h"
+#include "tfm.h"
+#include <kpathsea/types.h>
+
+
+
+/* A font is a collection of characters, generally at a particular point
+ size and resolution. The `bitmap_font_type' structure holds
+ information that comes entirely from a bitmap file. */
+typedef struct
+{
+ real design_size;
+ string comment;
+ unsigned checksum;
+ string filename;
+} bitmap_font_type;
+
+/* The design size is given in points. It is not necessarily
+ related to the actual dimensions of any of the characters in the
+ font; indeed, usually the design size is quite a bit larger than the
+ largest characters. */
+#define BITMAP_FONT_DESIGN_SIZE(f) ((f).design_size)
+
+/* Sometimes a font comes with a comment identifying its source, who
+ owns the trademark, or some such. */
+#define BITMAP_FONT_COMMENT(f) ((f).comment)
+
+/* The checksum found in the bitmap file. */
+#define BITMAP_FONT_CHECKSUM(f) ((f).checksum)
+
+/* The full pathname for the file that we opened. */
+#define BITMAP_FONT_FILENAME(f) ((f).filename)
+
+
+/* Look for a font named FONT_NAME in PK or GF format, at resolution
+ DPI. This ignores any extension in FONT_NAME; it adds `.<dpi>gf' or
+ `.<dpi>pk'. The font is looked for using the PKFONTS, GFFONTS, and
+ TEXFONTS environment variables, just as with the TeX software. If
+ the font can't be found, this gives a fatal error. */
+extern bitmap_font_type get_bitmap_font (string font_name, unsigned dpi);
+
+/* `close_font', below, works for bitmap fonts, too. */
+
+/* The `font_info_type' holds a `bitmap_font_type', and additional
+ information that we get from a font metric file. */
+typedef struct
+{
+ bitmap_font_type bitmap_font;
+ tfm_global_info_type tfm_font;
+ string tfm_filename;
+} font_info_type;
+
+/* The bitmap information that is associated with this font. */
+#define FONT_BITMAP_FONT(f) ((f).bitmap_font)
+
+/* The TFM information. */
+#define FONT_TFM_FONT(f) ((f).tfm_font)
+
+/* The full pathname for the TFM file that we opened. */
+#define FONT_TFM_FILENAME(f) ((f).tfm_filename)
+
+/* The design size is given in points. It is not necessarily
+ related to the actual dimensions of any of the characters in the
+ font; indeed, usually the design size is quite a bit larger than the
+ largest characters. */
+#define FONT_DESIGN_SIZE(f) BITMAP_FONT_DESIGN_SIZE ((f).bitmap_font)
+
+/* Sometimes a font comes with a comment identifying its source, who
+ owns the trademark, or some such. */
+#define FONT_COMMENT(f) BITMAP_FONT_COMMENT ((f).bitmap_font)
+
+
+/* This calls `get_bitmap_font'; in addition, it looks for FONT_NAME in
+ TFM format. If either the bitmap file or the metric file can't be
+ found, this gives a fatal error. */
+extern font_info_type get_font (string font_name, unsigned dpi);
+
+/* Close any open files associated with FONT_NAME, whether it was opened
+ with `get_bitmap_font' or `get_font'. */
+extern void close_font (string font_name);
+
+/* A character is a bitmap image, and is therefore at a particular size
+ and resolution. It is also at a particular position in a font.
+ Generally, characters also have `side bearings'---extra space at the
+ left and/or right of the character. (In some scripts, there is
+ also displacement above and/or below the character, but we don't take
+ that into account here.) */
+
+typedef struct
+{
+ charcode_type code;
+ int set_width;
+ fix_word tfm_width;
+ bounding_box_type bb;
+ bitmap_type bitmap;
+} char_info_type;
+
+/* The character code in our fonts is always between 0 and 255. */
+#define CHARCODE(c) ((c).code)
+
+/* The set width is given in pixels; it's the sum of the left side
+ bearing, the bitmap's width, and the right side bearing. */
+#define CHAR_SET_WIDTH(c) ((c).set_width)
+
+/* The TFM width is the character's true width divided by the design
+ size (expressed as a fix_word). */
+#define CHAR_TFM_WIDTH(c) ((c).tfm_width)
+
+/* Unlike the font's bounding box, the character bounding box is
+ guaranteed to be the tightest possible; i.e., no all-blank rows occur
+ at the top or bottom, and no all-blank columns occur at the left or
+ right. */
+#define CHAR_BB(c) ((c).bb)
+
+/* The pixels. See `bitmap.h'. */
+#define CHAR_BITMAP(c) ((c).bitmap)
+
+
+/* Abbreviations for the width and height of a character's bitmap. */
+#define CHAR_BITMAP_WIDTH(c) BITMAP_WIDTH (CHAR_BITMAP (c))
+#define CHAR_BITMAP_HEIGHT(c) BITMAP_HEIGHT (CHAR_BITMAP (c))
+
+/* Abbreviations for the parts of the character's bounding box. */
+#define CHAR_MIN_COL(c) MIN_COL (CHAR_BB (c))
+#define CHAR_MAX_COL(c) MAX_COL (CHAR_BB (c))
+#define CHAR_MIN_ROW(c) MIN_ROW (CHAR_BB (c))
+#define CHAR_MAX_ROW(c) MAX_ROW (CHAR_BB (c))
+
+
+/* The height of a character is how far it extends above the baseline. */
+#define CHAR_HEIGHT(c) (CHAR_MAX_ROW (c) >= 0 ? CHAR_MAX_ROW (c) : 0)
+
+/* The depth is far it extends below the baseline (but as a positive
+ number, e.g., if a character's bitmap goes down to row -4, the depth
+ is 4). */
+#define CHAR_DEPTH(c) (CHAR_MIN_ROW (c) < 0 ? -CHAR_MIN_ROW (c) : 0)
+
+
+/* Abbreviations for the left and right side bearings, unless someone
+ else has already defined such macros (in which case they presumably
+ don't want ours). */
+#ifndef CHAR_LSB
+#define CHAR_LSB CHAR_MIN_COL
+#endif
+#ifndef CHAR_RSB
+#define CHAR_RSB(c) (CHAR_SET_WIDTH (c) - CHAR_MAX_COL (c))
+#endif
+
+/* Return the character numbered CODE in the font FONT_NAME, or NULL if
+ that character doesn't exist in that font. If `get_font' or
+ `get_bitmap_font' has not been previously called on FONT_NAME,
+ `get_char' gives a fatal error. */
+extern char_info_type *get_char (string font_name, charcode_type code);
+
+
+/* Print a plain text representation of the character C to the file F. */
+extern void print_char (FILE *f, char_info_type c);
+
+
+/* Typeset the TEXT in the font FONT_NAME, at a resolution of DPI. */
+extern bitmap_type string_to_bitmap (string text,
+ string font_name, unsigned dpi);
+
+/* A raw character is the byte string that defines the character in the
+ font file, in some format. */
+
+typedef enum { pk_format, gf_format } bitmap_format_type;
+
+typedef struct
+{
+ bitmap_format_type bitmap_format;
+ charcode_type code;
+ one_byte *bytes;
+ unsigned allocated;
+ unsigned used;
+ bounding_box_type bb;
+ signed_4_bytes h_escapement;
+ fix_word tfm_width;
+} raw_char_type;
+
+/* CHARCODE works to access the character code of a `raw_char_type'
+ variable. Likewise for the bounding box, horizontal escapement, and
+ TFM width. */
+
+/* The file format the character definition was read from. */
+#define RAW_CHAR_BITMAP_FORMAT(rc) ((rc).bitmap_format)
+
+/* The bytes in the file that comprise the character definition. */
+#define RAW_CHAR_BYTES(rc) ((rc).bytes)
+
+/* The number of allocated bytes to which the buffer points. */
+#define RAW_CHAR_ALLOCATED(rc) ((rc).allocated)
+
+/* The number of bytes actually used. */
+#define RAW_CHAR_USED(rc) ((rc).used)
+
+/* A convenience macro for the first unused byte. */
+#define RAW_CHAR_UNUSED_START(rc) RAW_CHAR_BYTES (rc)[RAW_CHAR_USED (rc)]
+
+
+/* Return the raw character numbered CODE in the font named FONT_NAME,
+ or NULL. The only useful operation on a raw character is to write it
+ to an output file with the appropriate format. */
+extern raw_char_type *get_raw_char (string font_name,
+ charcode_type code);
+
+/* Free all allocated storage in the raw character RAW_CHAR, including
+ the character itself. */
+extern void free_raw_char (raw_char_type *raw_char);
+
+/* Miscellanous constants. */
+
+/* We will only deal with fonts that have at most this many characters,
+ although the bitmap formats allow more. */
+#define MAX_CHARCODE 255
+
+/* Some font formats have pointers within the file (to other places in
+ the file). The null value for such pointers is -1. */
+#define NULL_BYTE_PTR (-1)
+
+#endif /* not FONT_LIBRARY_H */