4 * Copyright (C) 2011-2015 by Werner Lemberg.
6 * This file is part of the ttfautohint library, and may only be used,
7 * modified, and distributed under the terms given in `COPYING'. By
8 * continuing to use, modify, or distribute this file you indicate that you
9 * have read `COPYING' and understand and accept it fully.
11 * The file `COPYING' mentioned in the previous paragraph is distributed
12 * with the ttfautohint library.
20 TA_sfnt_split_into_SFNT_tables(SFNT
* sfnt
,
27 /* basic check whether font is a TTF or TTC */
28 if (!FT_IS_SFNT(sfnt
->face
))
29 return TA_Err_Invalid_Font_Type
;
31 error
= FT_Sfnt_Table_Info(sfnt
->face
, 0, NULL
, &sfnt
->num_table_infos
);
35 sfnt
->table_infos
= (SFNT_Table_Info
*)malloc(sfnt
->num_table_infos
36 * sizeof (SFNT_Table_Info
));
37 if (!sfnt
->table_infos
)
38 return FT_Err_Out_Of_Memory
;
40 /* collect SFNT tables and trace some of them */
41 sfnt
->glyf_idx
= MISSING
;
42 sfnt
->loca_idx
= MISSING
;
43 sfnt
->head_idx
= MISSING
;
44 sfnt
->hmtx_idx
= MISSING
;
45 sfnt
->maxp_idx
= MISSING
;
46 sfnt
->name_idx
= MISSING
;
47 sfnt
->post_idx
= MISSING
;
48 sfnt
->OS2_idx
= MISSING
;
49 sfnt
->GPOS_idx
= MISSING
;
51 for (i
= 0; i
< sfnt
->num_table_infos
; i
++)
53 SFNT_Table_Info
* table_info
= &sfnt
->table_infos
[i
];
62 *table_info
= MISSING
;
64 error
= FT_Sfnt_Table_Info(sfnt
->face
, i
, &tag
, &len
);
67 if (error
== FT_Err_Table_Missing
)
73 /* ignore zero-length tables */
77 /* ignore tables which we are going to create by ourselves, */
78 /* or which would become invalid otherwise */
79 else if (tag
== TTAG_fpgm
88 else if (tag
== TTAG_DSIG
)
94 /* make the allocated buffer length a multiple of 4 */
95 buf_len
= (len
+ 3) & ~3;
96 buf
= (FT_Byte
*)malloc(buf_len
);
98 return FT_Err_Out_Of_Memory
;
100 /* pad end of buffer with zeros */
101 buf
[buf_len
- 1] = 0x00;
102 buf
[buf_len
- 2] = 0x00;
103 buf
[buf_len
- 3] = 0x00;
106 error
= FT_Load_Sfnt_Table(sfnt
->face
, tag
, 0, buf
, &len
);
110 /* check whether we already have this table */
111 for (j
= 0; j
< font
->num_tables
; j
++)
113 SFNT_Table
* table
= &font
->tables
[j
];
116 if (table
->tag
== tag
118 && !memcmp(table
->buf
, buf
, len
))
122 if (tag
== TTAG_head
)
124 else if (tag
== TTAG_glyf
)
126 else if (tag
== TTAG_hmtx
)
128 else if (tag
== TTAG_loca
)
130 else if (tag
== TTAG_maxp
)
134 sfnt
->max_components
= buf
[MAXP_MAX_COMPONENTS_OFFSET
] << 8;
135 sfnt
->max_components
+= buf
[MAXP_MAX_COMPONENTS_OFFSET
+ 1];
137 else if (tag
== TTAG_name
)
139 else if (tag
== TTAG_post
)
141 else if (tag
== TTAG_OS2
)
143 else if (tag
== TTAG_GPOS
)
146 if (j
== font
->num_tables
)
148 /* add element to table array if it is missing or different; */
149 /* in case of success, `buf' gets linked and is eventually */
150 /* freed in `TA_font_unload' */
151 error
= TA_font_add_table(font
, table_info
, tag
, len
, buf
);
157 /* reuse existing SFNT table */
168 /* no (non-empty) `glyf', `loca', `head', or `maxp' table; */
169 /* this can't be a valid TTF with outlines */
170 if (sfnt
->glyf_idx
== MISSING
171 || sfnt
->loca_idx
== MISSING
172 || sfnt
->head_idx
== MISSING
173 || sfnt
->maxp_idx
== MISSING
)
174 return TA_Err_Invalid_Font_Type
;
179 /* end of tasfnt.c */