1 /*
    2  * << Haru Free PDF Library >> -- hpdf_fontdef.h
    3  *
    4  * URL: http://libharu.org
    5  *
    6  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
    7  * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
    8  *
    9  * Permission to use, copy, modify, distribute and sell this software
   10  * and its documentation for any purpose is hereby granted without fee,
   11  * provided that the above copyright notice appear in all copies and
   12  * that both that copyright notice and this permission notice appear
   13  * in supporting documentation.
   14  * It is provided "as is" without express or implied warranty.
   15  *
   16  */
   17 
   18 #ifndef _HPDF_FONTDEF_H
   19 #define _HPDF_FONTDEF_H
   20 
   21 #include "hpdf_objects.h"
   22 
   23 #ifdef __cplusplus
   24 extern "C" {
   25 #endif
   26 
   27 
   28 #define HPDF_FONTDEF_SIG_BYTES 0x464F4E54L
   29 
   30 /*------ collection of flags for defining characteristics. ---*/
   31 
   32 #define HPDF_FONT_FIXED_WIDTH    1
   33 #define HPDF_FONT_SERIF          2
   34 #define HPDF_FONT_SYMBOLIC       4
   35 #define HPDF_FONT_SCRIPT         8
   36   /* Reserved                    16 */
   37 #define HPDF_FONT_STD_CHARSET    32
   38 #define HPDF_FONT_ITALIC         64
   39   /* Reserved                    128
   40      Reserved                    256
   41      Reserved                    512
   42      Reserved                    1024
   43      Reserved                    2048
   44      Reserved                    4096
   45      Reserved                    8192
   46      Reserved                    16384
   47      Reserved                    32768 */
   48 #define HPDF_FONT_ALL_CAP        65536
   49 #define HPDF_FONT_SMALL_CAP      131072
   50 #define HPDF_FONT_FOURCE_BOLD    262144
   51 
   52 #define HPDF_CID_W_TYPE_FROM_TO     0
   53 #define HPDF_CID_W_TYPE_FROM_ARRAY  1
   54 
   55 /*-- HPDF_FontDef ---------------------------------------*/
   56 
   57 typedef struct _HPDF_CharData {
   58     HPDF_INT16     char_cd;
   59     HPDF_UNICODE   unicode;
   60     HPDF_INT16     width;
   61 } HPDF_CharData;
   62 
   63 typedef enum  _HPDF_FontDefType {
   64     HPDF_FONTDEF_TYPE_TYPE1,
   65     HPDF_FONTDEF_TYPE_TRUETYPE,
   66     HPDF_FONTDEF_TYPE_CID,
   67     HPDF_FONTDEF_TYPE_UNINITIALIZED,
   68     HPDF_FONTDEF_TYPE_EOF
   69 } HPDF_FontDefType;
   70 
   71 typedef struct _HPDF_CID_Width {
   72     HPDF_UINT16   cid;
   73     HPDF_INT16    width;
   74 }  HPDF_CID_Width;
   75 
   76 /*----------------------------------------------------------------------------*/
   77 /*----- HPDF_FontDef ---------------------------------------------------------*/
   78 
   79 typedef struct _HPDF_FontDef_Rec  *HPDF_FontDef;
   80 
   81 typedef void  (*HPDF_FontDef_FreeFunc)  (HPDF_FontDef  fontdef);
   82 
   83 typedef void  (*HPDF_FontDef_CleanFunc)  (HPDF_FontDef  fontdef);
   84 
   85 typedef HPDF_STATUS  (*HPDF_FontDef_InitFunc)  (HPDF_FontDef  fontdef);
   86 
   87 typedef struct _HPDF_FontDef_Rec {
   88     HPDF_UINT32              sig_bytes;
   89     char                base_font[HPDF_LIMIT_MAX_NAME_LEN + 1];
   90     HPDF_MMgr                mmgr;
   91     HPDF_Error               error;
   92     HPDF_FontDefType         type;
   93     HPDF_FontDef_CleanFunc   clean_fn;
   94     HPDF_FontDef_FreeFunc    free_fn;
   95     HPDF_FontDef_InitFunc    init_fn;
   96 
   97     HPDF_INT16    ascent;
   98     HPDF_INT16    descent;
   99     HPDF_UINT     flags;
  100     HPDF_Box      font_bbox;
  101     HPDF_INT16    italic_angle;
  102     HPDF_UINT16   stemv;
  103     HPDF_INT16    avg_width;
  104     HPDF_INT16    max_width;
  105     HPDF_INT16    missing_width;
  106     HPDF_UINT16   stemh;
  107     HPDF_UINT16   x_height;
  108     HPDF_UINT16   cap_height;
  109 
  110     /*  the initial value of descriptor entry is NULL.
  111      *  when first font-object besed on the fontdef object is created,
  112      *  the font-descriptor object is created and descriptor entry is set.
  113      */
  114     HPDF_Dict                descriptor;
  115     HPDF_Stream              data;
  116 
  117     HPDF_BOOL                valid;
  118     void                    *attr;
  119 } HPDF_FontDef_Rec;
  120 
  121 
  122 void
  123 HPDF_FontDef_Free  (HPDF_FontDef  fontdef);
  124 
  125 
  126 void
  127 HPDF_FontDef_Cleanup  (HPDF_FontDef  fontdef);
  128 
  129 
  130 HPDF_BOOL
  131 HPDF_FontDef_Validate  (HPDF_FontDef  fontdef);
  132 
  133 
  134 /*----------------------------------------------------------------------------*/
  135 /*----- HPDF_Type1FontDef  ---------------------------------------------------*/
  136 
  137 typedef struct _HPDF_Type1FontDefAttrRec   *HPDF_Type1FontDefAttr;
  138 
  139 typedef struct _HPDF_Type1FontDefAttrRec {
  140     HPDF_BYTE       first_char;                               /* Required */
  141     HPDF_BYTE       last_char;                                /* Required */
  142     HPDF_CharData  *widths;                                   /* Required */
  143     HPDF_UINT       widths_count;
  144 
  145     HPDF_INT16      leading;
  146     char      *char_set;
  147     char       encoding_scheme[HPDF_LIMIT_MAX_NAME_LEN + 1];
  148     HPDF_UINT       length1;
  149     HPDF_UINT       length2;
  150     HPDF_UINT       length3;
  151     HPDF_BOOL       is_base14font;
  152     HPDF_BOOL       is_fixed_pitch;
  153 
  154     HPDF_Stream     font_data;
  155 } HPDF_Type1FontDefAttr_Rec;
  156 
  157 
  158 
  159 HPDF_FontDef
  160 HPDF_Type1FontDef_New  (HPDF_MMgr  mmgr);
  161 
  162 
  163 HPDF_FontDef
  164 HPDF_Type1FontDef_Load  (HPDF_MMgr         mmgr,
  165                          HPDF_Stream       afm,
  166                          HPDF_Stream       font_data);
  167 
  168 
  169 HPDF_FontDef
  170 HPDF_Type1FontDef_Duplicate  (HPDF_MMgr     mmgr,
  171                               HPDF_FontDef  src);
  172 
  173 
  174 HPDF_STATUS
  175 HPDF_Type1FontDef_SetWidths  (HPDF_FontDef         fontdef,
  176                               const HPDF_CharData  *widths);
  177 
  178 
  179 HPDF_INT16
  180 HPDF_Type1FontDef_GetWidthByName  (HPDF_FontDef     fontdef,
  181                                    const char  *gryph_name);
  182 
  183 
  184 HPDF_INT16
  185 HPDF_Type1FontDef_GetWidth  (HPDF_FontDef  fontdef,
  186                              HPDF_UNICODE  unicode);
  187 
  188 
  189 HPDF_FontDef
  190 HPDF_Base14FontDef_New  (HPDF_MMgr        mmgr,
  191                          const char  *font_name);
  192 
  193 
  194 
  195 /*----------------------------------------------------------------------------*/
  196 /*----- HPDF_TTFontDef  ------------------------------------------------------*/
  197 
  198 #define HPDF_TTF_FONT_TAG_LEN  6
  199 
  200 typedef struct _HPDF_TTF_Table {
  201         char     tag[4];
  202         HPDF_UINT32   check_sum;
  203         HPDF_UINT32   offset;
  204         HPDF_UINT32   length;
  205 } HPDF_TTFTable;
  206 
  207 
  208 typedef struct _HPDF_TTF_OffsetTbl {
  209         HPDF_UINT32     sfnt_version;
  210         HPDF_UINT16     num_tables;
  211         HPDF_UINT16     search_range;
  212         HPDF_UINT16     entry_selector;
  213         HPDF_UINT16     range_shift;
  214         HPDF_TTFTable  *table;
  215 } HPDF_TTF_OffsetTbl;
  216 
  217 
  218 typedef struct _HPDF_TTF_CmapRange {
  219         HPDF_UINT16   format;
  220         HPDF_UINT16   length;
  221         HPDF_UINT16   language;
  222         HPDF_UINT16   seg_count_x2;
  223         HPDF_UINT16   search_range;
  224         HPDF_UINT16   entry_selector;
  225         HPDF_UINT16   range_shift;
  226         HPDF_UINT16  *end_count;
  227         HPDF_UINT16   reserved_pad;
  228         HPDF_UINT16  *start_count;
  229         HPDF_INT16   *id_delta;
  230         HPDF_UINT16  *id_range_offset;
  231         HPDF_UINT16  *glyph_id_array;
  232         HPDF_UINT     glyph_id_array_count;
  233 } HPDF_TTF_CmapRange;
  234 
  235 
  236 typedef struct _HPDF_TTF_GryphOffsets {
  237         HPDF_UINT32   base_offset;
  238         HPDF_UINT32  *offsets;
  239         HPDF_BYTE    *flgs;   /* 0: unused, 1: used */
  240 } HPDF_TTF_GryphOffsets;
  241 
  242 
  243 typedef struct _HPDF_TTF_LongHorMetric {
  244         HPDF_UINT16  advance_width;
  245         HPDF_INT16   lsb;
  246 } HPDF_TTF_LongHorMetric;
  247 
  248 
  249 typedef struct _HPDF_TTF_FontHeader {
  250     HPDF_BYTE     version_number[4];
  251     HPDF_UINT32   font_revision;
  252     HPDF_UINT32   check_sum_adjustment;
  253     HPDF_UINT32   magic_number;
  254     HPDF_UINT16   flags;
  255     HPDF_UINT16   units_per_em;
  256     HPDF_BYTE     created[8];
  257     HPDF_BYTE     modified[8];
  258     HPDF_INT16    x_min;
  259     HPDF_INT16    y_min;
  260     HPDF_INT16    x_max;
  261     HPDF_INT16    y_max;
  262     HPDF_UINT16   mac_style;
  263     HPDF_UINT16   lowest_rec_ppem;
  264     HPDF_INT16    font_direction_hint;
  265     HPDF_INT16    index_to_loc_format;
  266     HPDF_INT16    glyph_data_format;
  267 } HPDF_TTF_FontHeader;
  268 
  269 
  270 typedef struct _HPDF_TTF_NameRecord {
  271     HPDF_UINT16   platform_id;
  272     HPDF_UINT16   encoding_id;
  273     HPDF_UINT16   language_id;
  274     HPDF_UINT16   name_id;
  275     HPDF_UINT16   length;
  276     HPDF_UINT16   offset;
  277 }  HPDF_TTF_NameRecord;
  278 
  279 
  280 typedef struct _HPDF_TTF_NamingTable {
  281     HPDF_UINT16           format;
  282     HPDF_UINT16           count;
  283     HPDF_UINT16           string_offset;
  284     HPDF_TTF_NameRecord  *name_records;
  285 }  HPDF_TTF_NamingTable;
  286 
  287 
  288 typedef struct _HPDF_TTFontDefAttr_Rec   *HPDF_TTFontDefAttr;
  289 
  290 typedef struct _HPDF_TTFontDefAttr_Rec {
  291     char                base_font[HPDF_LIMIT_MAX_NAME_LEN + 1];
  292     HPDF_BYTE                first_char;
  293     HPDF_BYTE                last_char;
  294     char               *char_set;
  295     char                tag_name[HPDF_TTF_FONT_TAG_LEN + 1];
  296     char                tag_name2[(HPDF_TTF_FONT_TAG_LEN + 1) * 2];
  297     HPDF_TTF_FontHeader      header;
  298     HPDF_TTF_GryphOffsets    glyph_tbl;
  299     HPDF_UINT16              num_glyphs;
  300     HPDF_TTF_NamingTable     name_tbl;
  301     HPDF_TTF_LongHorMetric  *h_metric;
  302     HPDF_UINT16              num_h_metric;
  303     HPDF_TTF_OffsetTbl       offset_tbl;
  304     HPDF_TTF_CmapRange       cmap;
  305     HPDF_UINT16              fs_type;
  306     HPDF_BYTE                sfamilyclass[2];
  307     HPDF_BYTE                panose[10];
  308     HPDF_UINT32              code_page_range1;
  309     HPDF_UINT32              code_page_range2;
  310 
  311     HPDF_UINT                length1;
  312 
  313     HPDF_BOOL                embedding;
  314     HPDF_BOOL                is_cidfont;
  315 
  316     HPDF_Stream              stream;
  317 } HPDF_TTFontDefAttr_Rec;
  318 
  319 
  320 
  321 HPDF_FontDef
  322 HPDF_TTFontDef_New (HPDF_MMgr   mmgr);
  323 
  324 
  325 HPDF_FontDef
  326 HPDF_TTFontDef_Load  (HPDF_MMgr     mmgr,
  327                       HPDF_Stream   stream,
  328                       HPDF_BOOL     embedding);
  329 
  330 
  331 HPDF_FontDef
  332 HPDF_TTFontDef_Load2  (HPDF_MMgr     mmgr,
  333                        HPDF_Stream   stream,
  334                        HPDF_UINT     index,
  335                        HPDF_BOOL     embedding);
  336 
  337 
  338 HPDF_UINT16
  339 HPDF_TTFontDef_GetGlyphid  (HPDF_FontDef   fontdef,
  340                             HPDF_UINT16    unicode);
  341 
  342 
  343 HPDF_INT16
  344 HPDF_TTFontDef_GetCharWidth  (HPDF_FontDef   fontdef,
  345                               HPDF_UINT16    unicode);
  346 
  347 
  348 HPDF_INT16
  349 HPDF_TTFontDef_GetGidWidth  (HPDF_FontDef   fontdef,
  350                              HPDF_UINT16    gid);
  351 
  352 
  353 HPDF_STATUS
  354 HPDF_TTFontDef_SaveFontData  (HPDF_FontDef   fontdef,
  355                               HPDF_Stream    stream);
  356 
  357 
  358 HPDF_Box
  359 HPDF_TTFontDef_GetCharBBox  (HPDF_FontDef   fontdef,
  360                              HPDF_UINT16    unicode);
  361 
  362 
  363 void
  364 HPDF_TTFontDef_SetTagName  (HPDF_FontDef   fontdef,
  365                             char     *tag);
  366 
  367 
  368 /*----------------------------------------------------------------------------*/
  369 /*----- HPDF_CIDFontDef  -----------------------------------------------------*/
  370 
  371 typedef struct _HPDF_CIDFontDefAttrRec   *HPDF_CIDFontDefAttr;
  372 
  373 typedef struct _HPDF_CIDFontDefAttrRec {
  374     HPDF_List     widths;
  375     HPDF_INT16    DW;
  376     HPDF_INT16    DW2[2];
  377 } HPDF_CIDFontDefAttr_Rec;
  378 
  379 
  380 HPDF_FontDef
  381 HPDF_CIDFontDef_New  (HPDF_MMgr               mmgr,
  382                       char              *name,
  383                       HPDF_FontDef_InitFunc   init_fn);
  384 
  385 
  386 HPDF_STATUS
  387 HPDF_CIDFontDef_AddWidth  (HPDF_FontDef            fontdef,
  388                            const HPDF_CID_Width   *widths);
  389 
  390 
  391 HPDF_INT16
  392 HPDF_CIDFontDef_GetCIDWidth  (HPDF_FontDef  fontdef,
  393                               HPDF_UINT16   cid);
  394 
  395 
  396 
  397 HPDF_STATUS
  398 HPDF_CIDFontDef_ChangeStyle   (HPDF_FontDef    fontdef,
  399                                HPDF_BOOL       bold,
  400                                HPDF_BOOL       italic);
  401 
  402 #ifdef __cplusplus
  403 }
  404 #endif /* __cplusplus */
  405 
  406 #endif /* _HPDF_FONTDEF_H */