Update NEWS file.
[ttfautohint.git] / lib / tafont.c
blobb6cc377dc7e249389de7227c7e24681c25e55d4f
1 /* tafont.c */
3 /*
4 * Copyright (C) 2011-2014 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.
16 #include "ta.h"
19 FT_Error
20 TA_font_init(FONT* font)
22 FT_Error error;
23 FT_Face f;
24 FT_Int major, minor, patch;
27 error = FT_Init_FreeType(&font->lib);
28 if (error)
29 return error;
31 /* assure correct FreeType version to avoid using the wrong DLL */
32 FT_Library_Version(font->lib, &major, &minor, &patch);
33 if (((major*1000 + minor)*1000 + patch) < 2004005)
34 return TA_Err_Invalid_FreeType_Version;
36 /* get number of faces (i.e. subfonts) */
37 error = FT_New_Memory_Face(font->lib, font->in_buf, font->in_len, -1, &f);
38 if (error)
39 return error;
40 font->num_sfnts = f->num_faces;
41 FT_Done_Face(f);
43 /* it is a TTC if we have more than a single subfont */
44 font->sfnts = (SFNT*)calloc(1, font->num_sfnts * sizeof (SFNT));
45 if (!font->sfnts)
46 return FT_Err_Out_Of_Memory;
48 return TA_Err_Ok;
52 void
53 TA_font_unload(FONT* font,
54 const char* in_buf,
55 char** out_bufp,
56 const char* control_buf)
58 /* in case of error it is expected that unallocated pointers */
59 /* are NULL (and counters are zero) */
61 if (!font)
62 return;
64 if (font->loader)
65 ta_loader_done(font);
67 if (font->tables)
69 FT_ULong i;
72 for (i = 0; i < font->num_tables; i++)
74 free(font->tables[i].buf);
75 if (font->tables[i].data)
77 if (font->tables[i].tag == TTAG_glyf)
79 glyf_Data* data = (glyf_Data*)font->tables[i].data;
80 FT_UShort j;
83 for (j = 0; j < data->num_glyphs; j++)
85 free(data->glyphs[j].buf);
86 free(data->glyphs[j].ins_buf);
87 free(data->glyphs[j].components);
88 free(data->glyphs[j].pointsums);
90 free(data->glyphs);
91 free(data);
95 free(font->tables);
98 if (font->sfnts)
100 FT_Long i;
103 for (i = 0; i < font->num_sfnts; i++)
105 FT_Done_Face(font->sfnts[i].face);
106 free(font->sfnts[i].table_infos);
108 free(font->sfnts);
111 number_set_free(font->x_height_snapping_exceptions);
113 FT_Done_FreeType(font->lib);
115 /* in case the user provided file handles, */
116 /* free the allocated buffers for the file contents */
117 if (!in_buf)
118 free(font->in_buf);
119 if (!out_bufp)
120 free(font->out_buf);
121 if (!control_buf)
122 free(font->control_buf);
123 free(font);
126 /* end of tafont.c */