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 */ 407