afm.h - enscript - GNU Enscript
 (HTM) git clone git://thinkerwim.org/enscript.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       afm.h (10557B)
       ---
            1 /*
            2  * Public header file.
            3  * Copyright (c) 1995-1998 Markku Rossi.
            4  *
            5  * Author: Markku Rossi <mtr@iki.fi>
            6  */
            7 
            8 /*
            9  * Enscript is free software: you can redistribute it and/or modify
           10  * it under the terms of the GNU General Public License as published by
           11  * the Free Software Foundation, either version 3 of the License, or
           12  * (at your option) any later version.
           13  *
           14  * Enscript is distributed in the hope that it will be useful,
           15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
           16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           17  * GNU General Public License for more details.
           18  *
           19  * You should have received a copy of the GNU General Public License
           20  * along with Enscript.  If not, see <http://www.gnu.org/licenses/>.
           21  */
           22 
           23 #ifndef AFM_H
           24 #define AFM_H
           25 
           26 #ifndef ___P
           27 #if PROTOTYPES
           28 #define ___P(protos) protos
           29 #else /* no PROTOTYPES */
           30 #define ___P(protos) ()
           31 #endif /* no PROTOTYPES */
           32 #endif
           33 
           34 /**********************************************************************
           35  *
           36  *         AFM file entities.
           37  *
           38  **********************************************************************/
           39 
           40 /* AFM types. */
           41 
           42 #define AFM_TYPE_STRING                1
           43 #define AFM_TYPE_NAME                2
           44 #define AFM_TYPE_NUMBER                3
           45 #define AFM_TYPE_INTEGER        4
           46 #define AFM_TYPE_ARRAY                5
           47 #define AFM_TYPE_BOOLEAN        6
           48 
           49 typedef char *AFMString;
           50 typedef char *AFMName;
           51 typedef double AFMNumber;
           52 typedef long AFMInteger;
           53 
           54 typedef enum
           55 {
           56   AFMFalse = 0,
           57   AFMTrue = 1
           58 } AFMBoolean;
           59 
           60 typedef struct afm_array_st *AFMArray;
           61 
           62 struct afm_node_st
           63 {
           64   int type;
           65 
           66   union
           67     {
           68       AFMString string;
           69       AFMName name;
           70       AFMNumber number;
           71       AFMInteger integer;
           72       AFMArray array;
           73       AFMBoolean boolean;
           74     } u;
           75 };
           76 
           77 typedef struct afm_node_st AFMNode;
           78 
           79 struct afm_array_st
           80 {
           81   AFMNumber num_items;
           82   AFMNode *items;
           83 };
           84 
           85 
           86 /* AFM file data structures. */
           87 
           88 /*
           89  * Sorry!  I know that those mixed case variable names are ugly,
           90  * but this is the way how they are written in Adobe's document
           91  * so I think that this is the best way for documentary reasons.
           92  */
           93 
           94 /* Global Font Information*/
           95 struct global_font_information_st
           96 {
           97   AFMString FontName;
           98   AFMString FullName;
           99   AFMString FamilyName;
          100   AFMString Weight;
          101   AFMNumber FontBBox_llx;
          102   AFMNumber FontBBox_lly;
          103   AFMNumber FontBBox_urx;
          104   AFMNumber FontBBox_ury;
          105   AFMString Version;
          106   AFMString Notice;
          107   AFMString EncodingScheme;
          108   AFMInteger MappingScheme;
          109   AFMInteger EscChar;
          110   AFMString CharacterSet;
          111   AFMInteger Characters;
          112   AFMBoolean IsBaseFont;
          113   AFMNumber VVector_0;
          114   AFMNumber VVector_1;
          115   AFMBoolean IsFixedV;
          116   AFMNumber CapHeight;
          117   AFMNumber XHeight;
          118   AFMNumber Ascender;
          119   AFMNumber Descender;
          120   AFMArray BlendAxisTypes;
          121   AFMArray BlendDesignPositions;
          122   AFMArray BlendDesignMap;
          123   AFMArray WeightVector;
          124 };
          125 
          126 typedef struct global_font_information_st AFMGlobalFontInformation;
          127 
          128 
          129 /* Writing Direction Metrics. */
          130 struct writing_direction_metrics_st
          131 {
          132   AFMBoolean is_valid;
          133   AFMNumber UnderlinePosition;
          134   AFMNumber UnderlineThickness;
          135   AFMNumber ItalicAngle;
          136   AFMNumber CharWidth_x;
          137   AFMNumber CharWidth_y;
          138   AFMBoolean IsFixedPitch;
          139 };
          140 
          141 typedef struct writing_direction_metrics_st AFMWritingDirectionMetrics;
          142 
          143 
          144 /* Multiple Master Axis Information. */
          145 struct multiple_master_axis_info_st
          146 {
          147   AFMString AxisType;
          148   AFMString AxisLabel;
          149 };
          150 
          151 typedef struct multiple_master_axis_info_st AFMMultipleMasterAxisInformation;
          152 
          153 
          154 /* Individual Character Metrics. */
          155 
          156 struct ligature_st
          157 {
          158   AFMName successor;
          159   AFMName ligature;
          160 };
          161 
          162 typedef struct ligature_st AFMLigature;
          163 
          164 /* Single individual character. */
          165 struct individual_character_metrics_st
          166 {
          167   AFMInteger character_code;        /* default charcode (-1 if not encoded) */
          168   AFMNumber w0x;                /* character width x in writing direction 0 */
          169   AFMNumber w0y;                /* character width y in writing direction 0 */
          170   AFMNumber w1x;                /* character width x in writing direction 1 */
          171   AFMNumber w1y;                /* character width y in writing direction 1 */
          172   AFMName name;                        /* character name */
          173   AFMNumber vv_x;                /* local VVector x */
          174   AFMNumber vv_y;                /* local VVector y */
          175 
          176   /* character bounding box. */
          177   AFMNumber llx;
          178   AFMNumber lly;
          179   AFMNumber urx;
          180   AFMNumber ury;
          181 
          182   AFMNumber num_ligatures;
          183   AFMLigature *ligatures;
          184 };
          185 
          186 typedef struct individual_character_metrics_st AFMIndividualCharacterMetrics;
          187 
          188 
          189 /* Kerning Data. */
          190 
          191 /* Track Kerning Data. */
          192 struct track_kern_st
          193 {
          194   AFMInteger degree;
          195   AFMNumber min_ptsize;
          196   AFMNumber min_kern;
          197   AFMNumber max_ptsize;
          198   AFMNumber max_kern;
          199 };
          200 
          201 typedef struct track_kern_st AFMTrackKern;
          202 
          203 
          204 /* Pair-Wise Kerning. */
          205 struct pair_wise_kerning_st
          206 {
          207   AFMName name1;
          208   AFMName name2;
          209   AFMNumber kx;
          210   AFMNumber ky;
          211 };
          212 
          213 typedef struct pair_wise_kerning_st AFMPairWiseKerning;
          214 
          215 
          216 /* Composite fonts. */
          217 
          218 /* Single composite component. */
          219 struct composite_component_st
          220 {
          221   AFMName name;
          222   AFMNumber deltax;
          223   AFMNumber deltay;
          224 };
          225 
          226 typedef struct composite_component_st AFMCompositeComponent;
          227 
          228 struct composite_st
          229 {
          230   AFMName name;
          231   AFMInteger num_components;
          232   AFMCompositeComponent *components;
          233 };
          234 
          235 typedef struct composite_st AFMComposite;
          236 
          237 
          238 /**********************************************************************
          239  *
          240  *         Library API.
          241  *
          242  **********************************************************************/
          243 
          244 /* Constants. */
          245 
          246 #define UNITS_PER_POINT        1000
          247 
          248 /* Successful operation. */
          249 #define AFM_SUCCESS        0
          250 
          251 /*
          252  * AFM information levels.  The AFM libarary returns always Global
          253  * Font information, Writing Direction Metrics and Individual
          254  * Character Metrics.  Other fields can be retrieved by defining some
          255  * of the following flags to afm_open_{font, file}() functions.
          256  */
          257 #define AFM_I_MINIMUM                0x00
          258 #define AFM_I_COMPOSITES        0x01
          259 #define AFM_I_KERN_PAIRS        0x02
          260 #define AFM_I_TRACK_KERNS        0x04
          261 #define AFM_I_ALL                0xffffffff
          262 
          263 /*
          264  * Flags for the encoding functions.
          265  */
          266 #define AFM_ENCODE_ACCEPT_COMPOSITES        0x01
          267 
          268 typedef unsigned int AFMError;
          269 
          270 typedef struct afm_handle_st *AFMHandle;
          271 
          272 /* Supported encoding types. */
          273 typedef enum
          274 {
          275   AFM_ENCODING_DEFAULT,                /* Font's default encoding. */
          276   AFM_ENCODING_ISO_8859_1,        /* ISO-8859-1 */
          277   AFM_ENCODING_ISO_8859_2,        /* ISO-8859-2 */
          278   AFM_ENCODING_ISO_8859_3,        /* ISO-8859-3 */
          279   AFM_ENCODING_ISO_8859_4,        /* ISO-8859-4 */
          280   AFM_ENCODING_ISO_8859_5,        /* ISO-8859-5 */
          281   AFM_ENCODING_ISO_8859_7,        /* ISO-8859-7 */
          282   AFM_ENCODING_ISO_8859_9,        /* ISO-8859-9 */
          283   AFM_ENCODING_ISO_8859_10,        /* ISO-8859-10 */
          284   AFM_ENCODING_IBMPC,                /* IBM PC */
          285   AFM_ENCODING_ASCII,                /* 7 bit ASCII */
          286   AFM_ENCODING_MAC,                /* Mac */
          287   AFM_ENCODING_VMS,                /* VMS multinational */
          288   AFM_ENCODING_HP8,                /* HP Roman-8 */
          289   AFM_ENCODING_KOI8                /* Adobe Standard Cyrillic Font KOI8 */
          290 } AFMEncoding;
          291 
          292 /* Special encoding types for individual characters. */
          293 #define AFM_ENC_NONE                ((void *) 0)
          294 #define AFM_ENC_NON_EXISTENT         ((void *) 1)
          295 
          296 
          297 /* AFM information for a single PostScript font. */
          298 
          299 struct afm_font_st
          300 {
          301   /* AFM Library's private data. */
          302   struct afm_font_private_data_st *private;
          303 
          304   AFMNumber version;                /* AFM format specification version number. */
          305   unsigned int info_level;
          306 
          307   /*
          308    * Current font encoding.  Following values are valid:
          309    *
          310    *   AFM_ENC_NONE                character is not encoded
          311    *   AFM_ENC_NON_EXISTENT        character is encoded, but font does not
          312    *                                have the specified character
          313    *   <pointer to character's metrics>
          314    *                                character is encoded and it exists in font
          315    */
          316   AFMIndividualCharacterMetrics *encoding[256];
          317 
          318   AFMGlobalFontInformation global_info;
          319   AFMWritingDirectionMetrics writing_direction_metrics[2];
          320 
          321   AFMInteger num_character_metrics;
          322   AFMIndividualCharacterMetrics *character_metrics;
          323 
          324   AFMInteger num_composites;
          325   AFMComposite *composites;
          326 
          327   AFMInteger num_kern_pairs;
          328   AFMPairWiseKerning *kern_pairs;
          329 
          330   AFMInteger num_track_kerns;
          331   AFMTrackKern *track_kerns;
          332 };
          333 
          334 typedef struct afm_font_st *AFMFont;
          335 
          336 
          337 
          338 /*
          339  * Prototypes for public functions.
          340  */
          341 
          342 /*
          343  * Format error <error> to human readable format to buffer <buf>.
          344  * Buffer must be long enough for error messages (256 bytes is good).
          345  */
          346 void afm_error_to_string ___P ((AFMError error, char *buf));
          347 
          348 /*
          349  * Open AFM library.  <path> specifies the search path for the AFM
          350  * files.  A handle to the library is returned in <handle_return>.
          351  */
          352 AFMError afm_create ___P ((const char *path, unsigned int verbose_level,
          353                            AFMHandle *handle_return));
          354 
          355 /*
          356  * Close AFM library handle <handle>.
          357  */
          358 AFMError afm_destroy ___P ((AFMHandle handle));
          359 
          360 /*
          361  * Set AFM library's verbose level to <level>.  Value 0 means "no output".
          362  */
          363 AFMError afm_set_verbose ___P ((AFMHandle handle, unsigned int level));
          364 
          365 /*
          366  * Return a prefix to the font <fontname>'s data.  Various font
          367  * resource file names can be constructed from the returned prefix:
          368  *   AFM        <prefix>.afm
          369  *   PFA        <prefix>.pfa
          370  *
          371  * Returned prefix belongs to AFM library, user should not modify it.
          372  */
          373 AFMError afm_font_prefix ___P ((AFMHandle handle, const char *fontname,
          374                                 const char **prefix_return));
          375 
          376 /*
          377  * Open font <name> and return font handle in <font_return>.
          378  */
          379 AFMError afm_open_font ___P ((AFMHandle handle, unsigned int info_level,
          380                               const char *name, AFMFont *font_return));
          381 
          382 /*
          383  * Open AFM file <filename> and return font handle in <font_return>.
          384  */
          385 AFMError afm_open_file ___P ((AFMHandle handle, unsigned int info_level,
          386                               const char *filename, AFMFont *font_return));
          387 
          388 /*
          389  * Open built-in default font (Courier).
          390  */
          391 AFMError afm_open_default_font ___P ((AFMHandle handle, AFMFont *font_return));
          392 
          393 /*
          394  * Close font <font>.
          395  */
          396 AFMError afm_close_font ___P ((AFMFont font));
          397 
          398 /*
          399  * Dump font information to file <fp>.
          400  */
          401 void afm_font_dump ___P ((FILE *fp, AFMFont font));
          402 
          403 /*
          404  * Return the width of the string <string, stringlen>.
          405  */
          406 AFMError afm_font_stringwidth ___P ((AFMFont font, AFMNumber ptsize,
          407                                      char *string, unsigned int stringlen,
          408                                      AFMNumber *w0x_return,
          409                                      AFMNumber *w0y_return));
          410 
          411 /*
          412  * Return the width of the character <ch>.
          413  */
          414 AFMError afm_font_charwidth ___P ((AFMFont font, AFMNumber ptsize,
          415                                    char ch, AFMNumber *w0x_return,
          416                                    AFMNumber *w0y_return));
          417 
          418 /*
          419  * Encode character code <code> to print as character <name>.
          420  * If <name> is NULL, encoding is removed.  <flags> can contain
          421  * any combination of the AFM_ENCODE_* values.
          422  */
          423 AFMError afm_font_encode ___P ((AFMFont font, unsigned char code, char *name,
          424                                 unsigned int flags));
          425 
          426 /*
          427  * Apply encoding <enc> to font <font>.  <flags> can contain any
          428  * combination of the AFM_ENCODE_* values.
          429  */
          430 AFMError afm_font_encoding ___P ((AFMFont font, AFMEncoding enc,
          431                                   unsigned int flags));
          432 
          433 #endif /* not AFM_H */