summaryrefslogtreecommitdiff
path: root/include/gf.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/gf.h')
-rw-r--r--include/gf.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/include/gf.h b/include/gf.h
new file mode 100644
index 0000000..c0d8bb2
--- /dev/null
+++ b/include/gf.h
@@ -0,0 +1,156 @@
+/* gf.h: manipulate generic font files. See Metafont: The Program, by
+ Don Knuth, (Volume D of Computers & Typesetting), chapter 46, among
+ other places, for the precise definition of this bitmap 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 GENERIC_FONT_LIBRARY_H
+#define GENERIC_FONT_LIBRARY_H
+
+#include "bitmap.h"
+#include "bounding-box.h"
+#include "font.h"
+#include <kpathsea/types.h>
+
+
+
+/* At most one GF file can be open for reading (or writing) at a time.
+ You must call `gf_open_input_file' before using any of the `gf_get...'
+ routines; similarly for the output side. */
+
+extern boolean gf_open_input_file (string filename);
+extern void gf_close_input_file (void);
+
+extern boolean gf_open_output_file (string filename);
+extern void gf_close_output_file (void);
+
+/* The only interesting information in the preamble is the comment. */
+
+extern string gf_get_preamble (void);
+extern void gf_put_preamble (string comment);
+
+
+/* An important part of the postamble is the character locators. A
+ character exists in the GF file if its `char_pointer' member in this
+ structure is not `NULL_BYTE_PTR'. */
+typedef struct
+{
+ charcode_type charcode;
+ signed_4_bytes h_escapement;
+ fix_word tfm_width;
+ signed_4_bytes char_pointer;
+} gf_char_locator_type;
+
+
+typedef struct
+{
+ fix_word design_size;
+ unsigned checksum;
+ real h_resolution, v_resolution;
+ bounding_box_type font_bb;
+ gf_char_locator_type char_loc[MAX_CHARCODE + 1];
+} gf_postamble_type;
+
+/* The design size is given as a fix_word in TeX points. */
+#define GF_DESIGN_SIZE(p) ((p).design_size)
+
+/* The GF checksum should match the checksums in the TFM file and/or the
+ PK file, if they exist. */
+#define GF_CHECKSUM(p) ((p).checksum)
+
+/* We express the resolutions in pixels per point multiplied by 2^16. */
+#define GF_H_RESOLUTION(p) ((p).h_resolution)
+#define GF_V_RESOLUTION(p) ((p).v_resolution)
+
+/* The font bounding box may not be the tightest possible. */
+#define GF_FONT_BB(p) ((p).font_bb)
+
+/* An abbreviation for a particular character locator. */
+#define GF_CHAR_LOC(p, code) ((p).char_loc[code])
+
+
+/* Return the postamble in the input file. */
+extern gf_postamble_type gf_get_postamble (void);
+
+/* Write the postamble to the output file. The library fills in the
+ information that is not given as arguments. This must be called
+ after all the characters have been written. The resolution arguments
+ should be given in pixels per inch. */
+extern void gf_put_postamble (fix_word design_size,
+ real h_resolution, real v_resolution);
+
+/* The characters are the most important information in the GF file. */
+
+typedef struct
+{
+ charcode_type code;
+ bitmap_type bitmap;
+ bounding_box_type bb;
+ signed_4_bytes h_escapement;
+ fix_word tfm_width;
+} gf_char_type;
+
+/* GF format actually allows character codes to be a full four bytes
+ long, but we cannot deal with such fonts. */
+#define GF_CHARCODE(gc) ((gc).code)
+
+/* The pixels. See `bitmap.h'. */
+#define GF_BITMAP(gc) ((gc).bitmap)
+
+/* GF format does not guarantee that the bounding box is the tightest
+ possible, but the reading routines do. */
+#define GF_CHAR_BB(gc) ((gc).bb)
+
+/* The set width, in pixels. */
+#define GF_H_ESCAPEMENT(gc) ((gc).h_escapement)
+
+/* The character width as a fix_word. */
+#define GF_TFM_WIDTH(gc) ((gc).tfm_width)
+
+/* Conveniently access each member of the bounding box. */
+#define GF_CHAR_MIN_COL(gc) (MIN_COL (GF_CHAR_BB (gc)))
+#define GF_CHAR_MAX_COL(gc) (MAX_COL (GF_CHAR_BB (gc)))
+#define GF_CHAR_MIN_ROW(gc) (MIN_ROW (GF_CHAR_BB (gc)))
+#define GF_CHAR_MAX_ROW(gc) (MAX_ROW (GF_CHAR_BB (gc)))
+
+/* An abbreviation for the left side bearing ... */
+#define GF_CHAR_LSB GF_CHAR_MIN_COL
+
+/* ... and one for the right side bearing. */
+#define GF_CHAR_RSB(c) (GF_H_ESCAPEMENT (c) - GF_CHAR_MAX_COL (c))
+
+
+/* `gf_get_next_char' reads the next character from the input file and returns
+ it. It also returns (as an argument) whether a character was
+ actually found. If not, you've read to the postamble. */
+extern gf_char_type gf_get_next_char (boolean *found);
+
+/* `gf_get_char' returns a pointer to the character numbered CODE
+ in the input file, or a null pointer if that character doesn't exist. */
+extern gf_char_type *gf_get_char (charcode_type code);
+
+/* Read the character CODE but don't interpret it; the result is only
+ useful as a parameter to `gf_put_raw_char'. */
+extern raw_char_type *gf_get_raw_char (charcode_type code);
+
+/* Write the given character to the output file. */
+extern void gf_put_char (gf_char_type);
+
+/* Write the given raw character. */
+extern void gf_put_raw_char (raw_char_type);
+
+#endif /* not GENERIC_FONT_LIBRARY_H */