Revamp of the Halibut error handling mechanism.
[sgt/halibut] / paper.h
diff --git a/paper.h b/paper.h
index 9bea29d..652fa7e 100644 (file)
--- a/paper.h
+++ b/paper.h
 #define UNITS_PER_PT 1000
 #define FUNITS_PER_PT 1000.0
 
+/* Glyphs are represented by integer indicies into a table of names. */
+typedef unsigned short glyph;
+#define NOGLYPH 0xFFFF
+
 typedef struct document_Tag document;
+typedef struct glyph_width_Tag glyph_width;
 typedef struct kern_pair_Tag kern_pair;
 typedef struct ligature_Tag ligature;
 typedef struct font_info_Tag font_info;
@@ -42,11 +47,20 @@ struct document_Tag {
 };
 
 /*
+ * This data structure represents the normal width of a single glyph
+ * in a font.
+ */
+struct glyph_width_Tag {
+    glyph glyph;
+    int width;
+};
+
+/*
  * This data structure represents a kerning pair within a font.
  */
 struct kern_pair_Tag {
-    /* Glyph indices, in font_data.glyphs. */
-    unsigned short left, right;
+    /* Glyph indices. */
+    glyph left, right;
     /* Kern amount, in internal units. */
     int kern;
 };
@@ -55,7 +69,7 @@ struct kern_pair_Tag {
  * ... and this one represents a ligature.
  */
 struct ligature_Tag {
-    unsigned short left, right, lig;
+    glyph left, right, lig;
 };
 
 /*
@@ -73,27 +87,12 @@ struct font_info_Tag {
      */
     const char *name;
     /*
-     * The file containing this font, if any.
+     * Pointer to data about the file containing the 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.
-     */
-    int nglyphs;
-    const char *const *glyphs;
-    const int *widths;
-    /*
-     * Glyph indices sorted into glyph-name order, for name-to-index
-     * mapping.
-     */
-    unsigned short *glyphsbyname;
+    void *fontfile;
+    enum { TYPE1, TRUETYPE } filetype;
+    /* A tree of glyph_widths */
+    tree234 *widths;
     /* A tree of kern_pairs */
     tree234 *kerns;
     /* ... and one of ligatures */
@@ -105,7 +104,7 @@ struct font_info_Tag {
      * know that no glyph in the Adobe Glyph List falls outside
      * it), whose elements are indices into the above two arrays.
      */
-    unsigned short bmp[65536];
+    glyph bmp[65536];
     /*
      * Various bits of metadata needed for the /FontDescriptor dictionary
      * in PDF.
@@ -128,12 +127,12 @@ 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
+     * with largely non-overlapping encoding vectors. This tree
      * will track which glyphs go into which subfonts. Also here I
      * keep track of the latest subfont of any given font, so I can
      * go back and extend its encoding.
      */
-    subfont_map_entry *subfont_map;
+    tree234 *subfont_map;
     font_encoding *latest_subfont;
     /*
      * The font list to which this font belongs.
@@ -156,8 +155,7 @@ struct font_encoding_Tag {
     char *name;                               /* used by client backends */
 
     font_data *font;                  /* the parent font structure */
-    const char *vector[256];          /* the actual encoding vector */
-    int indices[256];                 /* indices back into main font struct */
+    glyph vector[256];                /* the actual encoding vector */
     wchar_t to_unicode[256];          /* PDF will want to know this */
     int free_pos;                     /* space left to extend encoding */
 };
@@ -223,6 +221,11 @@ struct para_data_Tag {
        JUST, LEFT, RIGHT
     } justification;
     /*
+     * Sometimes (in code paragraphs) we want to override the flags
+     * passed to render_string().
+     */
+    unsigned extraflags;
+    /*
      * For constructing the page outline.
      */
     int outline_level;                /* 0=title 1=C 2=H 3=S 4=S2... */
@@ -372,30 +375,54 @@ struct outline_element_Tag {
 /*
  * Functions exported from bk_paper.c
  */
+int width_cmp(void *, void *); /* use when setting up widths */
 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);
-
+int find_width(font_data *, glyph);
 
 /*
  * Functions and data exported from psdata.c.
  */
-wchar_t ps_glyph_to_unicode(char const *glyph);
+glyph glyph_intern(char const *);
+char const *glyph_extern(glyph);
+wchar_t ps_glyph_to_unicode(glyph);
 extern const char *const ps_std_glyphs[];
+extern glyph const tt_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
+ * Functions exported from bk_pdf.c
  */
+typedef struct object_Tag object;
+typedef struct objlist_Tag objlist;
+object *new_object(objlist *list);
+void objtext(object *o, char const *text);
+void objstream(object *o, char const *text);
+void objstream_len(object *o, char const *text, size_t len);
 char *pdf_outline_convert(wchar_t *s, int *len);
 
 /*
+ * Function exported from bk_ps.c
+ */
+void ps_token(FILE *fp, int *cc, char const *fmt, ...);
+
+/*
  * 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);
+void pf_writeps(font_info const *fi, FILE *ofp);
+
+/*
+ * Backend functions exported by in_sfnt.c
+ */
+typedef struct sfnt_Tag sfnt;
+glyph sfnt_indextoglyph(sfnt *sf, unsigned idx);
+unsigned sfnt_glyphtoindex(sfnt *sf, glyph g);
+unsigned sfnt_nglyphs(sfnt *sf);
+void sfnt_writeps(font_info const *fi, FILE *ofp);
+void sfnt_data(font_info *fi, char **bufp, size_t *lenp);
 
 #endif