summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/table/VORG.c
blob: 9a6692514787fb11c47d90ebfc6168e95d1ca04a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "VORG.h"

#include "support/util.h"

static INLINE void disposeVORG(table_VORG *vorg) {
	FREE(vorg->entries);
}

caryll_standardRefType(table_VORG, table_iVORG, disposeVORG);

table_VORG *otfcc_readVORG(const otfcc_Packet packet, const otfcc_Options *options) {
	FOR_TABLE(OTFCC_CHR('V','O','R','G'), table) {
		font_file_pointer data = table.data;
		uint32_t length = table.length;
		if (length < 8) goto VORG_CORRUPTED;
		uint16_t numVertOriginYMetrics = read_16u(data + 6);
		if (length < 8 + 4 * numVertOriginYMetrics) goto VORG_CORRUPTED;

		table_VORG *vorg = table_iVORG.create();
		vorg->defaultVerticalOrigin = read_16s(data + 4);
		vorg->numVertOriginYMetrics = numVertOriginYMetrics;
		NEW(vorg->entries, numVertOriginYMetrics);
		for (uint16_t j = 0; j < numVertOriginYMetrics; j++) {
			vorg->entries[j].gid = read_16u(data + 8 + 4 * j);
			vorg->entries[j].verticalOrigin = read_16s(data + 8 + 4 * j + 2);
		}
		return vorg;
	VORG_CORRUPTED:
		logWarning("Table 'VORG' corrupted.");
	}
	return NULL;
}

caryll_Buffer *otfcc_buildVORG(const table_VORG *table, const otfcc_Options *options) {
	if (!table) return NULL;
	caryll_Buffer *buf = bufnew();
	bufwrite16b(buf, 1);
	bufwrite16b(buf, 0);
	bufwrite16b(buf, table->defaultVerticalOrigin);
	bufwrite16b(buf, table->numVertOriginYMetrics);
	for (uint16_t j = 0; j < table->numVertOriginYMetrics; j++) {
		bufwrite16b(buf, table->entries[j].gid);
		bufwrite16b(buf, table->entries[j].verticalOrigin);
	}
	return buf;
}