#ifndef HALIBUT_PAPER_H
#define HALIBUT_PAPER_H
+/* Number of internal units per PostScript point. */
+#define UNITS_PER_PT 1000
+#define FUNITS_PER_PT 1000.0
+
typedef struct document_Tag document;
+typedef struct kern_pair_Tag kern_pair;
+typedef struct ligature_Tag ligature;
+typedef struct font_info_Tag font_info;
typedef struct font_data_Tag font_data;
typedef struct font_encoding_Tag font_encoding;
typedef struct font_list_Tag font_list;
};
/*
- * This data structure represents a particular font.
+ * This data structure represents a kerning pair within a font.
*/
-struct font_data_Tag {
+struct kern_pair_Tag {
+ /* Glyph indices, in font_data.glyphs. */
+ unsigned short left, right;
+ /* Kern amount, in internal units. */
+ int kern;
+};
+
+/*
+ * ... and this one represents a ligature.
+ */
+struct ligature_Tag {
+ unsigned short left, right, lig;
+};
+
+/*
+ * This data structure holds static information about a font that doesn't
+ * depend on the particular document. It gets generated when the font's
+ * metrics are read in.
+ */
+
+font_info *all_fonts;
+
+struct font_info_Tag {
+ font_info *next;
/*
* Specify the PostScript name of the font and its point size.
*/
const char *name;
/*
+ * The file containing this font, if any.
+ */
+ FILE *fp;
+ filepos pos;
+ /*
+ * Lengths of the unencrypted and encrypted portions of the font.
+ */
+ long length1, length2;
+ /*
* An array of pointers to the available glyph names, and their
* corresponding character widths. These two arrays have
* parallel indices.
const char *const *glyphs;
const int *widths;
/*
+ * Glyph indices sorted into glyph-name order, for name-to-index
+ * mapping.
+ */
+ unsigned short *glyphsbyname;
+ /* A tree of kern_pairs */
+ tree234 *kerns;
+ /* ... and one of ligatures */
+ tree234 *ligs;
+ /*
* For reasonably speedy lookup, we set up a 65536-element
* table representing the Unicode BMP (I can conveniently
* restrict myself to the BMP for the moment since I happen to
*/
unsigned short bmp[65536];
/*
+ * Various bits of metadata needed for the /FontDescriptor dictionary
+ * in PDF.
+ */
+ float fontbbox[4];
+ float capheight;
+ float xheight;
+ float ascent;
+ float descent;
+ float stemv;
+ float stemh;
+ float italicangle;
+};
+
+/*
+ * This structure holds the information about how a font is used
+ * in a document.
+ */
+struct font_data_Tag {
+ font_info const *info;
+ /*
* At some point I'm going to divide the font into sub-fonts
* with largely non-overlapping encoding vectors. This array
* will track which glyphs go into which subfonts. Also here I
RECT_NONE, RECT_CHAPTER_UNDERLINE, RECT_RULE
} rect_type;
/*
+ * We left- and right-justify in special circumstances.
+ */
+ enum {
+ JUST, LEFT, RIGHT
+ } justification;
+ /*
* For constructing the page outline.
*/
int outline_level; /* 0=title 1=C 2=H 3=S 4=S2... */
word *end;
int xpos;
int hshortfall, nspaces; /* for justifying paragraphs */
+ int real_shortfall;
/*
* Auxiliary text: a section number in a margin, or a list item
* bullet or number. Also mention where to display this text
/*
* These fields are used in the page breaking algorithm.
*/
- int bestcost;
- int vshortfall, text, space;
- line_data *page_last; /* last line on a page starting here */
+ int *bestcost;
+ int *vshortfall, *text, *space;
+ line_data **page_last; /* last line on a page starting here */
/*
* After page breaking, we can assign an actual y-coordinate on
* the page to each line. Also we store a pointer back to the
font_encoding *fe;
int fontsize;
char *text;
+ int width;
};
struct xref_dest_Tag {
};
/*
+ * Functions exported from bk_paper.c
+ */
+int kern_cmp(void *, void *); /* use when setting up kern_pairs */
+int lig_cmp(void *, void *); /* use when setting up ligatures */
+void font_index_glyphs(font_info *fi);
+int find_glyph(font_info const *fi, char const *name);
+
+
+/*
* Functions and data exported from psdata.c.
*/
wchar_t ps_glyph_to_unicode(char const *glyph);
extern const char *const ps_std_glyphs[];
+void init_std_fonts(void);
const int *ps_std_font_widths(char const *fontname);
+const kern_pair *ps_std_font_kerns(char const *fontname);
+
+/*
+ * Function from bk_pdf.c borrowed by bk_ps.c
+ */
+char *pdf_outline_convert(wchar_t *s, int *len);
+
+/*
+ * Backend functions exported by in_pf.c
+ */
+void pf_part1(font_info *fi, char **bufp, size_t *lenp);
+void pf_part2(font_info *fi, char **bufp, size_t *lenp);
#endif