4 * Copyright (C) 2011-2017 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
, (FT_UInt
)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_cvt
89 else if (tag
== TTAG_DSIG
)
95 /* make the allocated buffer length a multiple of 4 */
96 buf_len
= (len
+ 3) & ~3U;
97 buf
= (FT_Byte
*)malloc(buf_len
);
99 return FT_Err_Out_Of_Memory
;
101 /* pad end of buffer with zeros */
102 buf
[buf_len
- 1] = 0x00;
103 buf
[buf_len
- 2] = 0x00;
104 buf
[buf_len
- 3] = 0x00;
107 error
= FT_Load_Sfnt_Table(sfnt
->face
, tag
, 0, buf
, &len
);
111 /* check whether we already have this table */
112 for (j
= 0; j
< font
->num_tables
; j
++)
114 SFNT_Table
* table
= &font
->tables
[j
];
117 if (table
->tag
== tag
119 && !memcmp(table
->buf
, buf
, len
))
123 if (tag
== TTAG_head
)
125 else if (tag
== TTAG_glyf
)
127 else if (tag
== TTAG_hmtx
)
129 else if (tag
== TTAG_loca
)
131 else if (tag
== TTAG_maxp
)
135 sfnt
->max_components
= (FT_UShort
)(buf
[MAXP_MAX_COMPONENTS_OFFSET
] << 8
136 | buf
[MAXP_MAX_COMPONENTS_OFFSET
+ 1]);
138 else if (tag
== TTAG_name
)
140 else if (tag
== TTAG_post
)
142 else if (tag
== TTAG_OS2
)
144 else if (tag
== TTAG_GPOS
)
147 if (j
== font
->num_tables
)
149 /* add element to table array if it is missing or different; */
150 /* in case of success, `buf' gets linked and is eventually */
151 /* freed in `TA_font_unload' */
152 error
= TA_font_add_table(font
, table_info
, tag
, len
, buf
);
158 /* reuse existing SFNT table */
169 /* no (non-empty) `glyf', `loca', `head', or `maxp' table; */
170 /* this can't be a valid TTF with outlines */
171 if (sfnt
->glyf_idx
== MISSING
172 || sfnt
->loca_idx
== MISSING
173 || sfnt
->head_idx
== MISSING
174 || sfnt
->maxp_idx
== MISSING
)
175 return TA_Err_Invalid_Font_Type
;
180 /* end of tasfnt.c */