Rough-and-ready line wrapping for PostScript, to keep us below the DSC-mandated
[sgt/halibut] / paper.h
diff --git a/paper.h b/paper.h
index fe2e795..b0ea032 100644 (file)
--- a/paper.h
+++ b/paper.h
@@ -8,7 +8,13 @@
 #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 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;
@@ -35,14 +41,39 @@ struct document_Tag {
 };
 
 /*
- * 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;
+};
+
+/*
+ * 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.
@@ -51,6 +82,13 @@ struct font_data_Tag {
     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;
+    /*
      * 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
@@ -59,6 +97,26 @@ struct font_data_Tag {
      */
     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
@@ -149,6 +207,12 @@ struct para_data_Tag {
        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... */
@@ -183,6 +247,7 @@ struct line_data_Tag {
     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
@@ -209,9 +274,9 @@ struct line_data_Tag {
     /*
      * 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
@@ -269,6 +334,7 @@ struct text_fragment_Tag {
     font_encoding *fe;
     int fontsize;
     char *text;
+    int width;
 };
 
 struct xref_dest_Tag {
@@ -294,10 +360,31 @@ struct outline_element_Tag {
 };
 
 /*
+ * Functions exported from bk_paper.c
+ */
+int kern_cmp(void *, void *); /* use when setting up kern_pairs */
+void font_index_glyphs(font_info *fi);
+int find_glyph(font_info *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