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