aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
l---------LIBPARSEPCF_ACCELERATORS.31
l---------LIBPARSEPCF_BDF_ACCELERATORS.31
l---------LIBPARSEPCF_BDF_ENCODINGS.31
l---------LIBPARSEPCF_BITMAPS.31
l---------LIBPARSEPCF_GLYPH_NAMES.31
l---------LIBPARSEPCF_INK_METRICS.31
l---------LIBPARSEPCF_METRICS.31
l---------LIBPARSEPCF_NOT_ENCODED.31
l---------LIBPARSEPCF_PROPERTIES.31
l---------LIBPARSEPCF_SWIDTHS.31
-rw-r--r--Makefile51
-rw-r--r--libparsepcf.h10
l---------libparsepcf_destroy_preparsed_font.31
-rw-r--r--libparsepcf_get_accelerators.3161
l---------libparsepcf_get_bitmap_offsets.31
-rw-r--r--libparsepcf_get_bitmaps.3162
-rw-r--r--libparsepcf_get_encoding.3170
l---------libparsepcf_get_glyph_indices.31
l---------libparsepcf_get_glyph_name_subtable.31
-rw-r--r--libparsepcf_get_glyph_names.3111
-rw-r--r--libparsepcf_get_metrics.3150
l---------libparsepcf_get_metrics_count.31
-rw-r--r--libparsepcf_get_properties.3180
l---------libparsepcf_get_property_subtable.31
l---------libparsepcf_get_swidth_count.31
-rw-r--r--libparsepcf_get_swidths.3105
l---------libparsepcf_get_table_count.31
-rw-r--r--libparsepcf_get_tables.3101
-rw-r--r--libparsepcf_preparse_font.3249
l---------struct_libparsepcf_accelerators.31
l---------struct_libparsepcf_bitmaps.31
l---------struct_libparsepcf_encoding.31
l---------struct_libparsepcf_font.31
l---------struct_libparsepcf_glyph_names.31
l---------struct_libparsepcf_metrics.31
l---------struct_libparsepcf_properties.31
l---------struct_libparsepcf_property_subtable.31
l---------struct_libparsepcf_table.31
38 files changed, 1474 insertions, 3 deletions
diff --git a/LIBPARSEPCF_ACCELERATORS.3 b/LIBPARSEPCF_ACCELERATORS.3
new file mode 120000
index 0000000..373e5bb
--- /dev/null
+++ b/LIBPARSEPCF_ACCELERATORS.3
@@ -0,0 +1 @@
+libparsepcf_get_accelerators.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_BDF_ACCELERATORS.3 b/LIBPARSEPCF_BDF_ACCELERATORS.3
new file mode 120000
index 0000000..373e5bb
--- /dev/null
+++ b/LIBPARSEPCF_BDF_ACCELERATORS.3
@@ -0,0 +1 @@
+libparsepcf_get_accelerators.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_BDF_ENCODINGS.3 b/LIBPARSEPCF_BDF_ENCODINGS.3
new file mode 120000
index 0000000..2b68279
--- /dev/null
+++ b/LIBPARSEPCF_BDF_ENCODINGS.3
@@ -0,0 +1 @@
+libparsepcf_get_encoding.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_BITMAPS.3 b/LIBPARSEPCF_BITMAPS.3
new file mode 120000
index 0000000..8f92a6f
--- /dev/null
+++ b/LIBPARSEPCF_BITMAPS.3
@@ -0,0 +1 @@
+libparsepcf_get_bitmaps.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_GLYPH_NAMES.3 b/LIBPARSEPCF_GLYPH_NAMES.3
new file mode 120000
index 0000000..1d119d1
--- /dev/null
+++ b/LIBPARSEPCF_GLYPH_NAMES.3
@@ -0,0 +1 @@
+libparsepcf_get_glyph_names.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_INK_METRICS.3 b/LIBPARSEPCF_INK_METRICS.3
new file mode 120000
index 0000000..58b91b9
--- /dev/null
+++ b/LIBPARSEPCF_INK_METRICS.3
@@ -0,0 +1 @@
+libparsepcf_get_metrics.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_METRICS.3 b/LIBPARSEPCF_METRICS.3
new file mode 120000
index 0000000..58b91b9
--- /dev/null
+++ b/LIBPARSEPCF_METRICS.3
@@ -0,0 +1 @@
+libparsepcf_get_metrics.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_NOT_ENCODED.3 b/LIBPARSEPCF_NOT_ENCODED.3
new file mode 120000
index 0000000..2b68279
--- /dev/null
+++ b/LIBPARSEPCF_NOT_ENCODED.3
@@ -0,0 +1 @@
+libparsepcf_get_encoding.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_PROPERTIES.3 b/LIBPARSEPCF_PROPERTIES.3
new file mode 120000
index 0000000..271ccf6
--- /dev/null
+++ b/LIBPARSEPCF_PROPERTIES.3
@@ -0,0 +1 @@
+libparsepcf_get_properties.3 \ No newline at end of file
diff --git a/LIBPARSEPCF_SWIDTHS.3 b/LIBPARSEPCF_SWIDTHS.3
new file mode 120000
index 0000000..697cd3d
--- /dev/null
+++ b/LIBPARSEPCF_SWIDTHS.3
@@ -0,0 +1 @@
+libparsepcf_get_swidths.3 \ No newline at end of file
diff --git a/Makefile b/Makefile
index cabef3f..ccd5c25 100644
--- a/Makefile
+++ b/Makefile
@@ -15,6 +15,9 @@ LIB_MINOR = 0
LIB_VERSION = $(LIB_MAJOR).$(LIB_MINOR)
LIB_NAME = parsepcf
+# Version 2.0 is ABI-backwards compatible with
+# version 1.0, but not API-backwards compatible
+
OBJ =\
libparsepcf_destroy_preparsed_font.o\
@@ -45,6 +48,47 @@ HDR =\
libparsepcf.h\
common.h
+MAN3 =\
+ struct_libparsepcf_table.3\
+ LIBPARSEPCF_PROPERTIES.3\
+ LIBPARSEPCF_ACCELERATORS.3\
+ LIBPARSEPCF_METRICS.3\
+ LIBPARSEPCF_BITMAPS.3\
+ LIBPARSEPCF_INK_METRICS.3\
+ LIBPARSEPCF_BDF_ENCODINGS.3\
+ LIBPARSEPCF_SWIDTHS.3\
+ LIBPARSEPCF_GLYPH_NAMES.3\
+ LIBPARSEPCF_BDF_ACCELERATORS.3\
+ libparsepcf_get_table_count.3\
+ libparsepcf_get_tables.3\
+ struct_libparsepcf_properties.3\
+ struct_libparsepcf_property_subtable.3\
+ libparsepcf_get_properties.3\
+ libparsepcf_get_property_subtable.3\
+ struct_libparsepcf_metrics.3\
+ libparsepcf_get_metrics_count.3\
+ libparsepcf_get_metrics.3\
+ struct_libparsepcf_glyph_names.3\
+ libparsepcf_get_glyph_names.3\
+ libparsepcf_get_glyph_name_subtable.3\
+ struct_libparsepcf_bitmaps.3\
+ int libparsepcf_get_bitmaps.3\
+ int libparsepcf_get_bitmap_offsets.3\
+ struct_libparsepcf_encoding.3\
+ LIBPARSEPCF_NOT_ENCODED.3\
+ libparsepcf_get_encoding.3\
+ libparsepcf_get_glyph_indices.3\
+ struct_libparsepcf_accelerators.3\
+ libparsepcf_get_accelerators.3\
+ libparsepcf_get_swidth_count.3\
+ libparsepcf_get_swidths.3\
+ struct_libparsepcf_font.3\
+ libparsepcf_preparse_font.3\
+ libparsepcf_destroy_preparsed_font.3
+
+MAN0 = libparsepcf.h.0
+MAN7 = libparsepcf.7
+
LOBJ = $(OBJ:.o=.lo)
SRC = $(OBJ:.o=.c)
@@ -73,12 +117,16 @@ libparsepcf.$(LIBEXT): $(LOBJ)
install: libparsepcf.a libparsepcf.$(LIBEXT)
mkdir -p -- "$(DESTDIR)$(PREFIX)/lib"
mkdir -p -- "$(DESTDIR)$(PREFIX)/include"
+ mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man0"
+ mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man3"
+ mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man7"
cp -- libparsepcf.a "$(DESTDIR)$(PREFIX)/lib/"
cp -- libparsepcf.$(LIBEXT) "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBMINOREXT)"
$(FIX_INSTALL_NAME) "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBMINOREXT)"
ln -sf -- libparsepcf.$(LIBMINOREXT) "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBMAJOREXT)"
ln -sf -- libparsepcf.$(LIBMAJOREXT) "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBEXT)"
cp -- libparsepcf.h "$(DESTDIR)$(PREFIX)/include/"
+ cp -P -- $(MAN3) "$(DESTDIR)$(MANPREFIX)/man3/"
uninstall:
-rm -f -- "$(DESTDIR)$(PREFIX)/lib/libparsepcf.a"
@@ -86,6 +134,9 @@ uninstall:
-rm -f -- "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBMINOREXT)"
-rm -f -- "$(DESTDIR)$(PREFIX)/lib/libparsepcf.$(LIBEXT)"
-rm -f -- "$(DESTDIR)$(PREFIX)/include/libparsepcf.h"
+ -cd -- "$(DESTDIR)$(MANPREFIX)/man0/" && rm -f -- $(MAN0)
+ -cd -- "$(DESTDIR)$(MANPREFIX)/man3/" && rm -f -- $(MAN3)
+ -cd -- "$(DESTDIR)$(MANPREFIX)/man7/" && rm -f -- $(MAN7)
clean:
-rm -f -- *.o *.a *.lo *.su *.so *.so.* *.dll *.dylib
diff --git a/libparsepcf.h b/libparsepcf.h
index d9ec6dd..f5980e4 100644
--- a/libparsepcf.h
+++ b/libparsepcf.h
@@ -40,6 +40,8 @@ struct libparsepcf_table {
/**
* The size of the table
+ *
+ * Intended for internal use
*/
uint32_t size;
@@ -48,6 +50,8 @@ struct libparsepcf_table {
*
* (The file is padded with NUL bytes to align
* each table to a 4 byte boundary)
+ *
+ * Intended for internal use
*/
uint32_t offset;
};
@@ -667,8 +671,8 @@ struct libparsepcf_accelerators {
uint8_t constant_metrics : 1;
/**
- * `.constant_metrics` and, for all characters, left side bearing = 0,
- * right side bearing = character width, ascent = `.font_ascent`, and
+ * `.constant_metrics` and, for all characters, left-side bearing = 0,
+ * right-side bearing = character width, ascent = `.font_ascent`, and
* descent = `.font_descent`
*/
uint8_t terminal_font : 1;
@@ -748,7 +752,7 @@ struct libparsepcf_accelerators {
*
* @throws EBFONT The file is not a properly formatted PCF file
*
- * `LIBPARSEPCF_BDF_ACCELERATORS` shall be prefered over
+ * `LIBPARSEPCF_BDF_ACCELERATORS` shall be preferred over
* `LIBPARSEPCF_ACCELERATORS` of both tables are present.
* `LIBPARSEPCF_BDF_ACCELERATORS` is more accurate and refers
* only to the encoded characters in the font, whereas
diff --git a/libparsepcf_destroy_preparsed_font.3 b/libparsepcf_destroy_preparsed_font.3
new file mode 120000
index 0000000..bcbba50
--- /dev/null
+++ b/libparsepcf_destroy_preparsed_font.3
@@ -0,0 +1 @@
+libparsepcf_preparse_font.3 \ No newline at end of file
diff --git a/libparsepcf_get_accelerators.3 b/libparsepcf_get_accelerators.3
new file mode 100644
index 0000000..a68c6f4
--- /dev/null
+++ b/libparsepcf_get_accelerators.3
@@ -0,0 +1,161 @@
+.TH LIBPARSEPCF_GET_ACCELERATORS 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_accelerators \- Get font information
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_ACCELERATORS /* value omitted */
+#define LIBPARSEPCF_BDF_ACCELERATORS /* value omitted */
+
+struct libparsepcf_accelerators {
+ uint8_t \fIno_overlap\fP : 1;
+ uint8_t \fIconstant_metrics\fP : 1;
+ uint8_t \fIterminal_font\fP : 1;
+ uint8_t \fIconstant_width\fP : 1;
+ uint8_t \fIink_inside\fP : 1;
+ uint8_t \fIink_metrics\fP : 1;
+ uint8_t \fIdraw_rtl\fP : 1;
+ uint8_t \fIhave_ink_bounds\fP : 1;
+ int32_t \fIfont_ascent\fP;
+ int32_t \fIfont_descent\fP;
+ int32_t \fImax_overlap\fP;
+ struct libparsepcf_metrics \fImin_bounds\fP;
+ struct libparsepcf_metrics \fImax_bounds\fP;
+ struct libparsepcf_metrics \fImin_ink_bounds\fP;
+ struct libparsepcf_metrics \fImax_ink_bounds\fP;
+};
+
+int libparsepcf_get_accelerators(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_accelerators *\fImeta_out\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+A PCF font files may record overall font
+information, intended for optimisations,
+in the tables with the types
+.B LIBPARSEPCF_ACCELERATORS
+and
+.B LIBPARSEPCF_BDF_ACCELERATORS
+which can be retrieved with the
+.BR libparsepcf_get_tables (3)
+function. If both tables are present,
+.B LIBPARSEPCF_BDF_ACCELERATORS
+shall be preferred, it is more accurate
+and only refers to the encoded characters
+in the font, whereas
+.B LIBPARSEPCF_ACCELERATORS
+includes all glyphs (not that the fallback
+glyph do not necessarily correspond to an
+encoded character).
+.PP
+Once the
+.B LIBPARSEPCF_ACCELERATORS
+or
+.B LIBPARSEPCF_BDF_ACCELERATORS
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_accelerators ()
+function along with the font file contents in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_accelerators ()
+function will store the font information in
+.IR *meta_out .
+.PP
+The following information will be stored in
+.IR *meta_out :
+.TP
+.I no_overlap
+If 1, then for each glyph, the layout metrics,
+.IR mtx ,
+.I mtx.right_side_bearing - mtx.character_width
+will not be greater than
+.IR meta_out->min_bounds.left_side_bearing .
+.TP
+.I constant_width
+If 1, all glyph have the same layout width.
+.TP
+.I constant_metrics
+If 1, all glyphs have the same layout metrics.
+.TP
+.I terminal_font
+If 1, all glyphs have the same layout metrics
+and for each glyph, the layout left-side bearing is 0,
+the layout right-side bearing is the layout width,
+the layout ascent is
+.IR meta_out->font_ascent ,
+and the layout descent is
+.IR meta_out->font_descent .
+.TP
+.I ink_inside
+If 1, no glyph will have ink outside the
+glyph's layout box.
+.TP
+.I ink_metrics
+If 1, at least one glyph have ink metrics
+different from the layout metrics.
+.TP
+.I draw_rtl
+If 1, the font is a right-to-left font,
+if 0, the font is a left-to-right font.
+.TP
+.I have_ink_bounds
+If 0, the function copied
+.I meta_out->min_bounds
+into
+.I meta_out->min_ink_bounds
+and
+.I meta_out->max_bounds
+into
+.IR meta_out->max_ink_bounds .
+.TP
+.I font_ascent
+The number of pixels the font ascend above the baseline.
+.TP
+.I font_descent
+The number of pixels the font descend below the baseline.
+.TP
+.I max_overlap
+The maximum horizontal overlap, in pixels, of two glyph.
+.TP
+.I min_bounds
+The lower bounds, over each glyph, of the layout metrics.
+.TP
+.I max_bounds
+The upper bounds, over each glyph, of the layout metrics.
+.TP
+.I min_ink_bounds
+The lower bounds, over each glyph, of the ink metrics.
+.TP
+.I max_ink_bounds
+The upper bounds, over each glyph, of the ink metrics.
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_accelerators ()
+function returns 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_accelerators ()
+function fails if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_bitmap_offsets.3 b/libparsepcf_get_bitmap_offsets.3
new file mode 120000
index 0000000..8f92a6f
--- /dev/null
+++ b/libparsepcf_get_bitmap_offsets.3
@@ -0,0 +1 @@
+libparsepcf_get_bitmaps.3 \ No newline at end of file
diff --git a/libparsepcf_get_bitmaps.3 b/libparsepcf_get_bitmaps.3
new file mode 100644
index 0000000..54daed5
--- /dev/null
+++ b/libparsepcf_get_bitmaps.3
@@ -0,0 +1,162 @@
+.TH LIBPARSEPCF_GET_BITMAPS 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_bitmaps \- Get glyph bitmaps
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_BITMAPS /* value omitted */
+
+struct libparsepcf_bitmaps {
+ size_t \fIglyph_count\fP;
+ size_t \fIbit_packing\fP;
+ size_t \fIrow_padding\fP;
+ int \fImsbyte_first\fP;
+ int \fImsbit_first\fP;
+ const uint8_t *\fIbitmap_data\fP;
+ /* fields intended for internal use omitted */
+};
+
+int libparsepcf_get_bitmaps(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_bitmaps *\fImeta_out\fP);
+
+int libparsepcf_get_bitmap_offsets(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ const struct libparsepcf_bitmaps *\fImeta\fP,
+ size_t *\fIoffsets_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+Glyphs in PCF fonts are encoded as bitmaps which
+can be looked up in the table with the type
+.BR LIBPARSEPCF_BITMAPS ,
+which can be retrieved with the
+.BR libparsepcf_get_tables (3)
+function.
+.PP
+Once the
+.B LIBPARSEPCF_BITMAPS
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_bitmaps ()
+function along with the font file contents in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_bitmaps ()
+function will store the number of available
+glyphs in
+.IR meta_out->glyph_count ,
+which shall be used to check that all glyphs
+have a bitmap recorded. The
+.BR libparsepcf_get_bitmaps ()
+function will store information needed to decode
+the bitmap in
+.IR *meta_out .
+.PP
+Then the
+.BR libparsepcf_get_bitmap_offsets ()
+function can be used to get offset from
+.I meta_out->bitmap_data
+where the bitmap for each glyph is stored.
+The first four arguments shall be the
+same as with
+.BR libparsepcf_get_bitmaps ().
+.I first
+shall be the index of the glyph with the lowest index
+of the glyph the function shall get the bitmap offset
+for, and
+.I count
+shall be the number of consecutive glyphs
+(including the first glyph) to get this information
+for. For each queried glyph with index
+.IR i ,
+the bitmap offset will be stored in
+.IR offsets_out[i-first] .
+.PP
+The application shall ensure that
+.IR "first + count <= meta->glyph_count" .
+.PP
+Note that glyph indices are not the same as character
+codepoints. See
+.BR libparsepcf_get_encoding (3)
+for details about mapping characters to glyphs.
+.PP
+The be able to interpret a glyph's bitmap, it's ink
+metrics must also be acquired. The
+.BR libparsepcf_get_metrics (3)
+function is used to get a glyph's ink metrics. The
+ink metrics describe the boundaries of the bitmap,
+but the
+.BR libparsepcf_get_bitmaps ()
+function returns encoding information. The bitmap
+encodes the glyph row by row, from top to bottom,
+at the end of each row, padding is inserted into
+the bitmap to align the beginning of the next row
+in the bitmap. It is always padded to a number of
+two bytes, specified in
+.IR meta_out->row_padding .
+For each row, the cells are encoded from left to
+right, there are three fields in
+.I meta_out
+that affect the order of the bits. For example,
+the bits can be group in bytes, dual-byte words or
+quad-byte words. The number of bytes in each group
+is specified in
+.IR meta_out->bit_packing ,
+which is always a power of two and no greater than
+.IR meta_out->row_padding ,
+and each these units are intepreted as unsigned integers,
+that are either encoded in big endian (most significant
+byte first) or little endian (least significant
+byte first).
+.I meta_out->msbyte_first
+will either be 0 or 1. If 0, these units are encoded
+in little endian; if 1 these units are encoded in
+big endian. Once a unit as been interpreted as in
+unsigned integer, its bits can be inspected to
+determine the value of each cell the unit covers,
+the cells are order from left to right, but the
+bits either ordered from least significant to most
+significant or from most significant to least
+significant, and for each set bit the corresponding
+cell is inked and for each cleared bit the
+corresponding cell is uninked.
+.I meta_out->msbit_first
+is used to determine the bit order; it will either
+be 0 or 1. If 0, the bits are ordered from least
+significant to most significant; if 1, the bits are
+ordered from most significant to least significant.
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_bitmaps ()
+and
+.BR libparsepcf_get_bitmap_offsets ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_bitmaps ()
+and
+.BR libparsepcf_get_bitmap_offsets ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_encoding.3 b/libparsepcf_get_encoding.3
new file mode 100644
index 0000000..428ca19
--- /dev/null
+++ b/libparsepcf_get_encoding.3
@@ -0,0 +1,170 @@
+.TH LIBPARSEPCF_GET_ENCODING 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_encoding \- Get glyph index
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_BDF_ENCODINGS /* value omitted */
+
+#define LIBPARSEPCF_NOT_ENCODED ((size_t)0xFFFF)
+
+struct libparsepcf_encoding {
+ uint16_t \fImin_byte2\fP;
+ uint16_t \fImax_byte2\fP;
+ uint16_t \fImin_byte1\fP;
+ uint16_t \fImax_byte1\fP;
+ uint16_t \fIdefault_glyph\fP;
+ size_t \fIchar_count\fP;
+};
+
+int libparsepcf_get_encoding(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_encoding *\fImeta_out\fP);
+
+int libparsepcf_get_glyph_indices(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ const struct libparsepcf_encoding *\fImeta\fP,
+ size_t *\fIindices_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+PCF fonts file are encoded for specific for characters
+sets and encodings do not encode glyphs by codepoints
+but rather by how characters are encoded. To get the
+appropriate glyph for a character, the
+.BR libparsepcf_get_properties (3)
+function must first be used to determine the encoding,
+and if it does not match the expeced encoding translate
+the text into the encoding used by the font (it may
+also be possible to load a version of the font the
+uses the expected encoding). Second, the
+.BR libparsepcf_get_tables (3)
+function is used to find the table with the type
+.BR LIBPARSEPCF_BDF_ENCODINGS ,
+which is then passed into the
+.BR libparsepcf_get_encoding (3)
+function as it's third argument
+.RI ( table ),
+along with the font file contents in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument to get the coverage of the font, encoding
+information, and the default glyph to use when the
+font does not have the glyph for a character.
+If the encoding uses one byte for each character,
+.I meta_out->min_byte1
+and
+.I meta_out->max_byte1
+are both set to 0, otherwise, the encoding uses
+two bytes for each character.
+The index of the default glyph will be stored in
+.IR meta_out->default_glyph .
+The fields
+.IR meta_out->min_byte1 ,
+.IR meta_out->max_byte1 ,
+.IR meta_out->min_byte2 ,
+and
+.I meta_out->max_byte2
+are used to translate an encoded character into
+a character index which can then be mapped into
+a glyph index using the
+.BR libparsepcf_get_glyph_indices ()
+function.
+.PP
+When calling the
+.BR libparsepcf_get_glyph_indices ()
+function, the first four arguments shall be
+the same as passed into the
+.BR libparsepcf_get_encoding ()
+function.
+.I first
+shall be the index of the character with the lowest index
+of the character the function shall get the glyph index
+for, and
+.I count
+shall be the number of consecutive characters
+(including the first character) to get this information
+for. For each queried character with index
+.IR i ,
+the glyph index will be stored in
+.IR indices_out[i-first] ,
+however if character is not encoded (does not have
+a glyph), it the value
+.I LIBPARSEPCF_NOT_ENCODED
+will be stored instead.
+.PP
+The application shall ensure that
+.IR "first + count <= meta->char_count" .
+.PP
+For single-byte encodings, the character index
+is calculated by subtracting
+.I meta_out->min_byte2
+from the character byte, however the application
+must make sure that the value of the character
+byte is at least
+.I meta_out->min_byte2
+but no greater than
+.IR meta_out->max_byte2 .
+.PP
+For dual-bute encodings, the application must
+first ensure that there are two bytes available,
+and ensure that the value of the first byte is
+at least
+.I meta_out->min_byte1
+but no greater than
+.IR meta_out->max_byte1 ,
+and that the value of the second byte is at least
+.I meta_out->min_byte2
+but no greater than
+.IR meta_out->max_byte2 .
+The application can then subtract
+.I meta_out->min_byte1
+from the value of the first byte, and call the
+difference
+.IR a ,
+and subtract
+.I meta_out->min_byte2
+from the value of the second byte, and call the
+difference
+.IR b .
+If the application has already calculated the
+font-constant value
+.IR ".max_byte2 - .min_byte2 + 1" ,
+called
+.IR k .
+The character's index is than calculated by
+.IR "a * k + b" .
+(This is the simplest description of the
+formula but it can be optimised for the
+application to use one less subtract.)
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_encoding ()
+and
+.BR libparsepcf_get_glyph_indices ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_encoding ()
+and
+.BR libparsepcf_get_glyph_indices ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_glyph_indices.3 b/libparsepcf_get_glyph_indices.3
new file mode 120000
index 0000000..2b68279
--- /dev/null
+++ b/libparsepcf_get_glyph_indices.3
@@ -0,0 +1 @@
+libparsepcf_get_encoding.3 \ No newline at end of file
diff --git a/libparsepcf_get_glyph_name_subtable.3 b/libparsepcf_get_glyph_name_subtable.3
new file mode 120000
index 0000000..1d119d1
--- /dev/null
+++ b/libparsepcf_get_glyph_name_subtable.3
@@ -0,0 +1 @@
+libparsepcf_get_glyph_names.3 \ No newline at end of file
diff --git a/libparsepcf_get_glyph_names.3 b/libparsepcf_get_glyph_names.3
new file mode 100644
index 0000000..d9991b1
--- /dev/null
+++ b/libparsepcf_get_glyph_names.3
@@ -0,0 +1,111 @@
+.TH libparsepcf_get_glyph_names 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_glyph_names \- Get glyph PostScript names
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_GLYPH_NAMES /* value omitted */
+
+struct libparsepcf_glyph_names {
+ size_t \fIglyph_count\fP;
+ /* fields intended for internal use omitted */
+};
+
+int libparsepcf_get_glyph_names(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_glyph_names *\fImeta_out\fP);
+
+int libparsepcf_get_glyph_name_subtable(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ const struct libparsepcf_glyph_names *\fImeta\fP,
+ const char **\fInames_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+If the PostScript glyph names are stored in
+a PCF font file, they are recorded in the table
+with the type
+.B LIBPARSEPCF_GLYPH_NAMES
+retrieved with the
+.BR libparsepcf_get_tables (3)
+function.
+.PP
+Once the
+.B LIBPARSEPCF_GLYPH_NAMES
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_glyph_names ()
+function along with the font file contents
+in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_glyph_names ()
+function will store the number of available
+glyphs in
+.IR meta_out->glyph_count ,
+which shall be used to check that all glyphs
+have a name recorded, as well as internal
+information needed by the
+.BR libparsepcf_get_glyph_name_subtable ()
+function in other fields in
+.IR *meta_out .
+.PP
+Then the
+.BR libparsepcf_get_glyph_name_subtable ()
+function can be used to get the PostScript names
+of each glyph. The first four arguments shall be
+the same as with
+.BR libparsepcf_get_glyph_names ().
+.I first
+shall be the index of the glyph with the lowest
+index of the glyph the function shall get the
+name for, and
+.I count
+shall be the number of consecutive glyphs
+(including the first glyph) to get this information
+for. For each queried glyph with index
+.IR i ,
+the PostScript name will be stored in
+.IR names_out[i-first] .
+.PP
+The application shall ensure that
+.IR "first + count <= meta->glyph_count" .
+.PP
+Note that glyph indices are not the same as character
+codepoints. See
+.BR libparsepcf_get_encoding (3)
+for details about mapping characters to glyphs.
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_glyph_names ()
+and
+.BR libparsepcf_get_glyph_name_subtable ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_glyph_names ()
+and
+.BR libparsepcf_get_glyph_name_subtable ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_metrics.3 b/libparsepcf_get_metrics.3
new file mode 100644
index 0000000..70bd623
--- /dev/null
+++ b/libparsepcf_get_metrics.3
@@ -0,0 +1,150 @@
+.TH LIBPARSEPCF_GET_METRICS 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_metrics \- Get glyph metrics
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_METRICS /* value omitted */
+#define LIBPARSEPCF_INK_METRICS /* value omitted */
+
+struct libparsepcf_metrics {
+ int16_t \fIleft_side_bearing\fP;
+ int16_t \fIright_side_bearing\fP;
+ int16_t \fIcharacter_width\fP;
+ int16_t \fIcharacter_ascent\fP;
+ int16_t \fIcharacter_descent\fP;
+ uint16_t \fIcharacter_attributes\fP;
+};
+
+int libparsepcf_get_metrics_count(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ size_t *\fIcount_out\fP);
+
+int libparsepcf_get_metrics(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_metrics *\fImetrics_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+In PCF font files, the layout metrics for each
+glyph is recorded in a type with the tape
+.BR LIBPARSEPCF_METRICS ,
+which can be retrieved with the
+.BR libparsepcf_get_tables (3)
+function. The file may also contain the table
+.B LIBPARSEPCF_INK_METRICS
+for the ink metrics. If however no
+.B LIBPARSEPCF_INK_METRICS
+is present in the file, the
+.B LIBPARSEPCF_METRICS
+file be used for this purpose instead in
+addition to layout metrics
+.PP
+Once the
+.B LIBPARSEPCF_METRICS
+or
+.B LIBPARSEPCF_INK_METRICS
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_metrics_count ()
+function along with the font file contents in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_metrics_count ()
+function will store the number of available
+glyphs in
+.IR *count_out ,
+which shall be used to check that all glyphs
+have a metrics recorded.
+.PP
+Then the
+.BR libparsepcf_get_metrics ()
+function can be used to get the glyph metrics of
+each glyph. The first three arguments shall be the
+same as with
+.BR libparsepcf_get_metrics_count ().
+.I first
+shall be the index of the glyph with the lowest index
+of the glyph the function shall get the metrics for, and
+.I count
+shall be the number of consecutive glyphs
+(including the first glyph) to get this information
+for. For each queried glyph with index
+.IR i ,
+the metrics will be stored in
+.IR metrics_out[i-first] .
+.PP
+The application shall ensure that
+.IR "first + count <= *count_out" .
+.PP
+Note that glyph indices are not the same as character
+codepoints. See
+.BR libparsepcf_get_encoding (3)
+for details about mapping characters to glyphs.
+.PP
+The glyph metrics consists of five fields:
+.TP
+.I left_side_bearing
+The number of pixels right of (negative if left of)
+the origin (caret position) of the leftmost ink-on
+pixel in the glyph
+.TP
+.I right_side_bearing
+The number of pixels right of (negative if left of)
+the origin (caret position) of the rightmost ink-on
+pixel in the glyph
+.TP
+.I character_width
+The number of pixels the next characters origin shall
+be right of the current character's origin (that is
+the number of pixels the caret shall advance)
+.TP
+.I character_ascent
+The number of pixels the character ascend above
+the baseline (if non-positive, it's fully below
+the baseline)
+.TP
+.I character_descent
+The number of pixels the character descend below
+the baseline (if non-positive, it's fully above
+the baseline)
+.PP
+Along with the glyph metrics, each glyph may
+also have an applications-specific attribute
+store in the
+.I character_attributes
+field.
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_metrics_count ()
+and
+.BR libparsepcf_get_metrics ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_metrics_count ()
+and
+.BR libparsepcf_get_metrics ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_metrics_count.3 b/libparsepcf_get_metrics_count.3
new file mode 120000
index 0000000..58b91b9
--- /dev/null
+++ b/libparsepcf_get_metrics_count.3
@@ -0,0 +1 @@
+libparsepcf_get_metrics.3 \ No newline at end of file
diff --git a/libparsepcf_get_properties.3 b/libparsepcf_get_properties.3
new file mode 100644
index 0000000..366b07f
--- /dev/null
+++ b/libparsepcf_get_properties.3
@@ -0,0 +1,180 @@
+.TH LIBPARSEPCF_GET_PROPERTIES 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_properties \- Get font properties
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_PROPERTIES /* value omitted */
+
+struct libparsepcf_properties {
+ size_t \fIproperty_count\fP;
+ /* fields intended for internal use omitted */
+};
+
+struct libparsepcf_property_subtable {
+ const char *\fIname\fP;
+ int \fIis_string_property\fP;
+ union {
+ int32_t \fIsigned_value\fP;
+ const char *\fIstring_value\fP;
+ } \fIvalue\fP;
+};
+
+int libparsepcf_get_properties(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ struct libparsepcf_properties *\fImeta_out\fP);
+
+int libparsepcf_get_property_subtable(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ const struct libparsepcf_properties *\fImeta\fP,
+ struct libparsepcf_property_subtable *\fIprops\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+A PCF font files should record font
+properties in the table with the type
+.B LIBPARSEPCF_PROPERTIES
+which can be retrieved with the
+.BR libparsepcf_get_tables (3)
+function.
+.PP
+Once the
+.B LIBPARSEPCF_PROPERTIES
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_properties ()
+function along with the font file contents in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_properties ()
+function will store the number of available
+properties in
+.IR meta_out->property_count ,
+as well as internal information needed by the
+.BR libparsepcf_get_property_subtable ()
+function in other fields in
+.IR *meta_out .
+.PP
+Then the
+.BR libparsepcf_get_property_subtable ()
+function can be used to get each font property.
+The first four arguments shall be
+the same as with
+.BR libparsepcf_get_properties ().
+.I first
+shall be the index of the property with the lowest
+index of the property the function shall get, and
+.I count
+shall be the number of consecutive properties
+(including the first properties) to get. For each
+queried properties with index
+.IR i ,
+the property name will be stored in
+.I props[i]->name
+and the property value will be stored in
+.I props[i]->value.signed_value
+it it is numerical and in
+.I props[i]->value.string_value
+if it is a textual. In the former case
+.I props[i]->is_string_property
+will be set to 0 and in the latter case
+.I props[i]->is_string_property
+will be set to 1.
+.PP
+The application shall ensure that
+.IR "first + count <= meta->property_count" .
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_properties ()
+and
+.BR libparsepcf_get_property_subtable ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_properties ()
+and
+.BR libparsepcf_get_property_subtable ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH EXTENDED DESCRIPTION
+For X fonts, the file will some of the properties
+listing in
+.IR https://www.x.org/releases/X11R7.7/doc/xorg-docs/xlfd/xlfd.html .
+Particularly important fields are:
+.TP
+.B FAMILY_NAME
+The name of the font. Note that the name is not
+necessarily unique, but must be combined with other
+identification properties to unique identify the
+font or font family.
+.TP
+.B FONT
+X Logical Font Descriptor. This uniquely identifies
+the the font and some of its properties.
+.TP
+.B SLANT
+The font's slant style. Common values are
+\(dqR\(dq for roman, \(dqI\(dq for italic, and
+\(dqO\(dq for oblique.
+.TP
+.B ADD_STYLE_NAME
+The font's style, apart from slant style. Common
+values are \(dqSerif\(dq, \(dqSans Serif\(dq, and
+\(dq\(dq.
+.TP
+.B SPACING
+The font's width-variableness, \(dqP\(dq for
+proportional, \(dqM\(dq for monospaced, and
+\(dqC\(dq for character-cell (monospaced font that
+follows the standard typewriter character cell model).
+.TP
+.B AVERAGE_WIDTH
+Mostly useful for character-cell types, where it
+specifies the cell width in decipixels.
+.TP
+.B PIXEL_SIZE
+The height of the font in pixels.
+.TP
+.B CAP_HEIGHT
+The nominal height of majuscule letters in pixels.
+.TP
+.B X_HEIGHT
+The nominal height of minuscule letters in pixels.
+.TP
+.B POINT_SIZE
+The height of the font in decipoints.
+.TP
+.B RESOLUTION_X
+The horizontal resolution, in dots per inch, the
+font was designed for.
+.TP
+.B RESOLUTION_Y
+The vertical resolution, in dots per inch, the
+font was designed for.
+.TP
+.BR CHARSET_REGISTRY " and " CHARSET_ENCODING
+Identifies the character encoding used by the
+font, ISO10646-1 (the combination \(dqISO10646\(dq,
+\(dq1\(dq) is particularly important.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_property_subtable.3 b/libparsepcf_get_property_subtable.3
new file mode 120000
index 0000000..271ccf6
--- /dev/null
+++ b/libparsepcf_get_property_subtable.3
@@ -0,0 +1 @@
+libparsepcf_get_properties.3 \ No newline at end of file
diff --git a/libparsepcf_get_swidth_count.3 b/libparsepcf_get_swidth_count.3
new file mode 120000
index 0000000..697cd3d
--- /dev/null
+++ b/libparsepcf_get_swidth_count.3
@@ -0,0 +1 @@
+libparsepcf_get_swidths.3 \ No newline at end of file
diff --git a/libparsepcf_get_swidths.3 b/libparsepcf_get_swidths.3
new file mode 100644
index 0000000..36cd7aa
--- /dev/null
+++ b/libparsepcf_get_swidths.3
@@ -0,0 +1,105 @@
+.TH LIBPARSEPCF_GET_SWIDTHS 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_swidths \- Get em-width of glyphs
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+#define LIBPARSEPCF_SWIDTHS /* value omitted */
+
+int libparsepcf_get_swidth_count(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ size_t *\fIcount_out\fP);
+
+int libparsepcf_get_swidths(const void *\fIdata\fP, size_t \fIsize\fP,
+ const struct libparsepcf_table *\fItable\fP,
+ int32_t *\fIwidths_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+If the so called scaleable widths of the glyphs
+in a PCF font file is recorded in the file, they
+are recorded in the table with the type
+.B LIBPARSEPCF_SWIDTHS
+retrieved with the
+.BR libparsepcf_get_tables (3)
+function.
+.PP
+The \(dqscaleable width\(dq of a glyph is the
+width measured in a relative unit, in the case
+of PCF files, milli-ems.
+.PP
+Once the
+.B LIBPARSEPCF_SWIDTHS
+table has been identified, it can be passed as
+the third argument
+.RI ( table )
+to the
+.BR libparsepcf_get_swidth_count ()
+function along with the font file contents
+in the
+.I data
+argument and size, in bytes, of the file in the
+.I size
+argument. The
+.BR libparsepcf_get_swidth_count ()
+function will store the number of available
+glyphs in
+.IR *count_out ,
+which shall be used to check that all glyphs
+have a width recorded.
+.PP
+Then the
+.BR libparsepcf_get_swidths ()
+function can be used to get the width, in
+milli-ems, of each glyph. The first three
+arguments shall be the same as with
+.BR libparsepcf_get_swidth_count ().
+.I first
+shall be the index of the glyph with the lowest
+index of the glyph the function shall get the
+width for, and
+.I count
+shall be the number of consecutive glyphs
+(including the first glyph) to get this information
+for. For each queried glyph with index
+.IR i ,
+the width will be stored in
+.IR widths_out[i-first] .
+.PP
+The application shall ensure that
+.IR "first + count <= *count_out" .
+.PP
+Note that glyph indices are not the same as character
+codepoints. See
+.BR libparsepcf_get_encoding (3)
+for details about mapping characters to glyphs.
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_swidth_count ()
+and
+.BR libparsepcf_get_swidths ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_swidth_count ()
+and
+.BR libparsepcf_get_swidths ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3)
diff --git a/libparsepcf_get_table_count.3 b/libparsepcf_get_table_count.3
new file mode 120000
index 0000000..9a77785
--- /dev/null
+++ b/libparsepcf_get_table_count.3
@@ -0,0 +1 @@
+libparsepcf_get_tables.3 \ No newline at end of file
diff --git a/libparsepcf_get_tables.3 b/libparsepcf_get_tables.3
new file mode 100644
index 0000000..5bd066c
--- /dev/null
+++ b/libparsepcf_get_tables.3
@@ -0,0 +1,101 @@
+.TH LIBPARSEPCF_GET_TABLES 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_get_tables \- Get font data tables
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+struct libparsepcf_table {
+ uint32_t \fItype\fP;
+ /* fields intended for internal use omitted */
+};
+
+int libparsepcf_get_table_count(const void *\fIdata\fP, size_t \fIsize\fP, size_t *\fIcount_out\fP);
+
+int libparsepcf_get_tables(const void *\fIdata\fP, size_t \fIsize\fP,
+ struct libparsepcf_table *\fItables_out\fP,
+ size_t \fIfirst\fP, size_t \fIcount\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+PCF font files contain a set of tables for containing
+different information about the font or its glyphs. The
+.BR libparsepcf_get_table_count ()
+function is used to determine the number of the tables
+in the file, and the
+.BR libparsepcf_get_tables ()
+function is used to get the tables.
+.PP
+The
+.I data
+argument shall the font file content and the
+.I size
+argument shall be the size of the file in bytes.
+.PP
+The
+.BR libparsepcf_get_table_count ()
+function will store, in
+.IR *count_out ,
+the number of tables available in the font file.
+.PP
+The
+.BR libparsepcf_get_table ()
+function will store information about tables in
+.IR tables_out .
+.I first
+shall be the index of the table with the lowest
+index of the table the function shall get the
+information for, and
+.I count
+shall be the number of consecutive tables
+(including the first table) to get the information
+for. For each queried table with index
+.IR i ,
+the table's type (what it is used for) will be
+stored in
+.IR tables_out[i-first].table ,
+.I tables_out[i-first]
+will also contain additional internal information
+required by the functions used to parse the function,
+see the
+.B SEE ALSO
+section for functions used to parse individual tables
+(the functions whose name include \(dq_get_\(dq)).
+.PP
+The application shall ensure that
+.IR "first + count <= *count_out" .
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_get_table_count ()
+and
+.BR libparsepcf_get_tables ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_get_table_count ()
+and
+.BR libparsepcf_get_tables ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH SEE ALSO
+.BR libparsepcf (7),
+.BR libparsepcf_preparse_font (3),
+.BR libparsepcf_get_accelerators (3),
+.BR libparsepcf_get_bitmaps (3),
+.BR libparsepcf_get_encoding (3),
+.BR libparsepcf_get_glyph_names (3),
+.BR libparsepcf_get_metrics (3),
+.BR libparsepcf_get_properties (3),
+.BR libparsepcf_get_swidths (3)
diff --git a/libparsepcf_preparse_font.3 b/libparsepcf_preparse_font.3
new file mode 100644
index 0000000..0fce166
--- /dev/null
+++ b/libparsepcf_preparse_font.3
@@ -0,0 +1,249 @@
+.TH LIBPARSEPCF_PREPARSE_FONT 3 LIBPARSEPCF
+.SH NAME
+libparsepcf_preprase_font \- Get font data tables and metadata
+
+.SH SYNOPSIS
+.nf
+#include <libparsepcf.h>
+
+struct libparsepcf_font {
+ const struct libparsepcf_table *\fIprob_table\fP;
+ struct libparsepcf_properties \fIprops\fP;
+ const struct libparsepcf_table *\fIaccel_table\fP;
+ struct libparsepcf_accelerators \fIaccels\fP;
+ const struct libparsepcf_table *\fImtx_table\fP;
+ size_t \fImetrics\fP;
+ const struct libparsepcf_table *\fIinkmtx_table\fP;
+ size_t \fIink_metrics\fP;
+ const struct libparsepcf_table *\fIenc_table\fP;
+ struct libparsepcf_encoding \fIencoding\fP;
+ const struct libparsepcf_table *\fIbitmap_table\fP;
+ struct libparsepcf_bitmaps \fIbitmaps\fP;
+ const struct libparsepcf_table *\fIswidth_table\fP;
+ size_t \fIswidths\fP;
+ const struct libparsepcf_table *\fIname_table\fP;
+ struct libparsepcf_glyph_names \fInames\fP;
+ size_t \fIglyph_count\fP;
+ /* fields intended for internal use omitted */
+};
+
+int libparsepcf_preparse_font(const void *\fIdata\fP, size_t \fIsize\fP,
+ struct libparsepcf_font *\fIfont_out\fP);
+
+int libparsepcf_destroy_preparsed_font(struct libparsepcf_font *\fIfont\fP);
+.fi
+.PP
+Link with
+.IR -lparsepcf .
+
+.SH DESCRIPTION
+PCF font files contain a set of tables for containing
+different information about the font or its glyphs.
+The
+.BR libparsepcf_preparse_font ()
+function can be used, as an alternative to the
+.BR libparsepcf_get_tables (3)
+function, the to locate and load the tables, making
+it easy to use other functions to read the table's
+subtables.
+.PP
+The
+.I data
+argument shall the font file content and the
+.I size
+argument shall be the size of the file in bytes.
+.PP
+If the font file contains a property table
+.RI ( LIBPARSEPCF_PROPERTIES )
+it will be stored in
+.I font_out->prob_table
+and the data retrieved by the
+.BR libparsepcf_get_properties (3)
+function for the
+.BR libparsepcf_get_property_subtable (3)
+function will be stored in
+.IR font_out->probs ,
+otherwise
+.I font_out->prob_table
+will be set to
+.IR NULL .
+.PP
+If the font file contains an \(dqaccelerators\(dq
+table
+.RI ( LIBPARSEPCF_BDF_ACCELERATORS
+(preferred) or
+.I LIBPARSEPCF_ACCELERATORS
+(fallback)) it will be stored in
+.I font_out->accel_table
+and the table will be loaded into
+.IR font_out->accels ,
+otherwise
+.I font_out->accel_table
+will be set to
+.IR NULL .
+Be sure to check that
+.I font_out->accel_table
+is
+.RI non- NULL
+before reading
+.IR font_out->accels .
+.PP
+The glyph layout metrics table
+.RI ( LIBPARSEPCF_METRICS ),
+which can be parsed using the
+.BR libparsepcf_get_metrics (3)
+function, will be stored in
+.I font_out->mtx_table
+and the number of glyph in the table
+will be stored in
+.IR font_out->metrics .
+.PP
+If the font file contains a glyph ink metrics table
+.RI ( LIBPARSEPCF_INK_METRICS ),
+which can be parsed using the
+.BR libparsepcf_get_metrics (3)
+function, will be stored in
+.I font_out->inkmtx_table
+and the number of glyph in the table
+will be stored in
+.IR font_out->ink_metrics ,
+otherwise
+.I font_out->inkmtx_table
+will be set to
+.IR NULL .
+.PP
+The character-to-glyph table
+.RI ( LIBPARSEPCF_BDF_ENCODINGS ),
+which can be parsed using the
+.BR libparsepcf_get_glyph_indices (3)
+function, will be stored in
+.I font_out->enc_table
+and the data retrieved by the
+.BR libparsepcf_get_encoding (3)
+function for the
+.BR libparsepcf_get_glyph_indices (3)
+function will be stored in
+.IR font_out->encoding .
+.PP
+If the font contains a bitmap talbe
+.RI ( LIBPARSEPCF_BITMAPS ),
+it will be stored in
+.IR font_out->bitmap_table
+and data load from the table, using the
+.BR libparsepcf_get_bitmaps (3)
+function will be stored
+.IR font_out->bitmaps ,
+otherwise
+.I font_out->bitmap_table
+will be set to
+.IR NULL .
+Unless
+.I font_out->bitmaps
+is set to
+.IR NULL ,
+the
+.BR libparsepcf_get_bitmap_offsets (3)
+function can be used to get the individual
+bitmaps for each glyph.
+.PP
+If the font file contains a \(dqscaleable\(dq
+width table
+.RI ( LIBPARSEPCF_SWIDTHS ),
+which can be parsed using the
+.BR libparsepcf_get_swidths (3)
+function, will be stored in
+.I font_out->swidth_table
+and the number of glyph in the table
+will be stored in
+.IR font_out->swidths ,
+otherwise
+.I font_out->swidth_table
+will be set to
+.IR NULL .
+.PP
+If the font file contains a PostScript
+glyph name table
+.RI ( LIBPARSEPCF_GLYPH_NAMES ),
+which can be parsed using the
+.BR libparsepcf_get_glyph_name_subtable (3)
+function, will be stored in
+.I font_out->name_table
+and the data retrieved by the
+.BR libparsepcf_get_glyph_names (3)
+function for the
+.BR libparsepcf_get_glyph_name_subtable (3)
+function will be stored in
+.IR font_out->names .
+otherwise
+.I font_out->name_table
+will be set to
+.IR NULL .
+.PP
+The function will ensure that all tables report the
+same number of glyphs, and the number of glyphs will
+be stored in
+.IR font_out->glyph_count ,
+but it may (if the corresponding table is found)
+also be stored in
+.IR font_out->metrics ,
+.IR font_out->ink_metrics ,
+.IR font_out->bitmaps.glyph_count ,
+.IR font_out->names.glyph_count ,
+and
+.IR font_out->swidths .
+.PP
+If the font contains a property table,
+.PP
+Once the font is not needed anymore, the
+.BR libparsepcf_destroy_preparsed_font ()
+function shall be used to deallocate the memory
+stored in
+.IR *font ,
+it will also reset the contents of
+.IR *font .
+
+.SH RETURN VALUE
+The
+.BR libparsepcf_preparse_font ()
+and
+.BR libparsepcf_destroy_preparsed_font ()
+functions return 0 upon successful completion.
+On failure, -1 is returned and
+.I errno
+is set appropriately to indicate the error.
+
+.SH ERRORS
+The
+.BR libparsepcf_preparse_font ()
+and
+.BR libparsepcf_destroy_preparsed_font ()
+functions fail if:
+.TP
+.B EBFONT
+The font file is corrupt or unsupported.
+
+.SH NOTES
+As the layout metrics shall be used if the
+font file is missing the ink metrics table,
+it may be a good idea, for the application
+to set
+.I font_out->inkmtx_table
+to
+.I font_out->mtx_table
+and
+.I font_out->ink_metrics
+to
+.I font_out->metrics
+if
+.I font_out->inkmtx_table
+is
+.IR NULL .
+The
+.BR libparsepcf_preparse_font ()
+function does not automatically because
+it may be useful for the application to
+know whether the ink metrics and layout
+metrics are identical.
+
+.SH SEE ALSO
+.BR libparsepcf (7)
diff --git a/struct_libparsepcf_accelerators.3 b/struct_libparsepcf_accelerators.3
new file mode 120000
index 0000000..373e5bb
--- /dev/null
+++ b/struct_libparsepcf_accelerators.3
@@ -0,0 +1 @@
+libparsepcf_get_accelerators.3 \ No newline at end of file
diff --git a/struct_libparsepcf_bitmaps.3 b/struct_libparsepcf_bitmaps.3
new file mode 120000
index 0000000..8f92a6f
--- /dev/null
+++ b/struct_libparsepcf_bitmaps.3
@@ -0,0 +1 @@
+libparsepcf_get_bitmaps.3 \ No newline at end of file
diff --git a/struct_libparsepcf_encoding.3 b/struct_libparsepcf_encoding.3
new file mode 120000
index 0000000..2b68279
--- /dev/null
+++ b/struct_libparsepcf_encoding.3
@@ -0,0 +1 @@
+libparsepcf_get_encoding.3 \ No newline at end of file
diff --git a/struct_libparsepcf_font.3 b/struct_libparsepcf_font.3
new file mode 120000
index 0000000..bcbba50
--- /dev/null
+++ b/struct_libparsepcf_font.3
@@ -0,0 +1 @@
+libparsepcf_preparse_font.3 \ No newline at end of file
diff --git a/struct_libparsepcf_glyph_names.3 b/struct_libparsepcf_glyph_names.3
new file mode 120000
index 0000000..1d119d1
--- /dev/null
+++ b/struct_libparsepcf_glyph_names.3
@@ -0,0 +1 @@
+libparsepcf_get_glyph_names.3 \ No newline at end of file
diff --git a/struct_libparsepcf_metrics.3 b/struct_libparsepcf_metrics.3
new file mode 120000
index 0000000..58b91b9
--- /dev/null
+++ b/struct_libparsepcf_metrics.3
@@ -0,0 +1 @@
+libparsepcf_get_metrics.3 \ No newline at end of file
diff --git a/struct_libparsepcf_properties.3 b/struct_libparsepcf_properties.3
new file mode 120000
index 0000000..271ccf6
--- /dev/null
+++ b/struct_libparsepcf_properties.3
@@ -0,0 +1 @@
+libparsepcf_get_properties.3 \ No newline at end of file
diff --git a/struct_libparsepcf_property_subtable.3 b/struct_libparsepcf_property_subtable.3
new file mode 120000
index 0000000..271ccf6
--- /dev/null
+++ b/struct_libparsepcf_property_subtable.3
@@ -0,0 +1 @@
+libparsepcf_get_properties.3 \ No newline at end of file
diff --git a/struct_libparsepcf_table.3 b/struct_libparsepcf_table.3
new file mode 120000
index 0000000..9a77785
--- /dev/null
+++ b/struct_libparsepcf_table.3
@@ -0,0 +1 @@
+libparsepcf_get_tables.3 \ No newline at end of file