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_build_loca_table(SFNT
* sfnt
,
23 SFNT_Table
* loca_table
= &font
->tables
[sfnt
->loca_idx
];
24 SFNT_Table
* glyf_table
= &font
->tables
[sfnt
->glyf_idx
];
25 SFNT_Table
* head_table
= &font
->tables
[sfnt
->head_idx
];
27 glyf_Data
* data
= (glyf_Data
*)glyf_table
->data
;
37 if (loca_table
->processed
)
40 /* get largest offset */
44 for (i
= 0; i
< data
->num_glyphs
; i
++, glyph
++)
46 /* glyph records should have offsets which are multiples of 4 */
47 offset
= (offset
+ 3) & ~3U;
48 offset
+= glyph
->len1
+ glyph
->len2
49 + glyph
->ins_extra_len
+ glyph
->ins_len
;
50 /* add two bytes for the instructionLength field */
51 if (glyph
->len2
|| glyph
->ins_len
)
55 /* to make the short format of the `loca' table always work, */
56 /* the `glyf' table's length is adjusted to an even value */
57 offset
= (offset
+ 1) & ~1U;
59 if (offset
> 0xFFFF * 2)
67 loca_table
->len
= (data
->num_glyphs
+ 1) * 4;
68 buf_new
= (FT_Byte
*)realloc(loca_table
->buf
, loca_table
->len
);
70 return FT_Err_Out_Of_Memory
;
72 loca_table
->buf
= buf_new
;
78 for (i
= 0; i
< data
->num_glyphs
; i
++, glyph
++)
80 offset
= (offset
+ 3) & ~3U;
82 *(p
++) = BYTE1(offset
);
83 *(p
++) = BYTE2(offset
);
84 *(p
++) = BYTE3(offset
);
85 *(p
++) = BYTE4(offset
);
87 offset
+= glyph
->len1
+ glyph
->len2
88 + glyph
->ins_extra_len
+ glyph
->ins_len
;
89 if (glyph
->len2
|| glyph
->ins_len
)
93 /* last element holds the size of the `glyf' table */
94 offset
= (offset
+ 1) & ~1U;
95 *(p
++) = BYTE1(offset
);
96 *(p
++) = BYTE2(offset
);
97 *(p
++) = BYTE3(offset
);
98 *(p
++) = BYTE4(offset
);
102 loca_table
->len
= (data
->num_glyphs
+ 1) * 2;
103 buf_new
= (FT_Byte
*)realloc(loca_table
->buf
,
104 (loca_table
->len
+ 3) & ~3U);
106 return FT_Err_Out_Of_Memory
;
108 loca_table
->buf
= buf_new
;
112 glyph
= data
->glyphs
;
114 for (i
= 0; i
< data
->num_glyphs
; i
++, glyph
++)
116 offset
= (offset
+ 1) & ~1U;
118 *(p
++) = HIGH(offset
);
119 *(p
++) = LOW(offset
);
121 offset
+= (glyph
->len1
+ glyph
->len2
122 + glyph
->ins_extra_len
+ glyph
->ins_len
+ 1) >> 1;
123 if (glyph
->len2
|| glyph
->ins_len
)
127 /* last element holds the size of the `glyf' table -- */
128 /* this value must *not* be aligned to a multiple of 4 */
129 *(p
++) = HIGH(offset
);
130 *(p
++) = LOW(offset
);
132 /* pad `loca' table to make its length a multiple of 4 */
133 if (loca_table
->len
% 4 == 2)
140 loca_table
->checksum
= TA_table_compute_checksum(loca_table
->buf
,
142 loca_table
->processed
= 1;
144 head_table
->buf
[LOCA_FORMAT_OFFSET
] = loca_format
;
149 /* end of taloca.c */