summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/charstring-il.h
blob: 2c0f15f16610db8229c09ce0b651b2f30cff3555 (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
#ifndef CARYLL_cff_CHARSTRING_IL
#define CARYLL_cff_CHARSTRING_IL

#include "libcff.h"
#include "otfcc/table/glyf.h"

typedef enum {
	IL_ITEM_OPERAND,
	IL_ITEM_OPERATOR,
	IL_ITEM_SPECIAL,
	IL_ITEM_PHANTOM_OPERATOR,
	IL_ITEM_PHANTOM_OPERAND
} cff_InstructionType;

typedef struct {
	cff_InstructionType type;
	arity_t arity;
	union {
		double d;  // for type == IL_ITEM_OPERAND, IL_ITEM_PHANTOM_OPERAND
		int32_t i; // otherwise
	};
} cff_CharstringInstruction;

typedef struct {
	uint32_t length;
	uint32_t free;
	cff_CharstringInstruction *instr;
} cff_CharstringIL;

bool instruction_eq(cff_CharstringInstruction *z1, cff_CharstringInstruction *z2);

// basic ops
cff_CharstringIL *cff_compileGlyphToIL(glyf_Glyph *g, uint16_t defaultWidth, uint16_t nominalWidth);
void cff_optimizeIL(cff_CharstringIL *il, const otfcc_Options *options);
cff_CharstringIL *cff_shrinkIL(cff_CharstringIL *il);
void cff_ILmergeIL(cff_CharstringIL *self, cff_CharstringIL *il);
caryll_Buffer *cff_build_IL(cff_CharstringIL *il);
bool cff_ilEqual(cff_CharstringIL *a, cff_CharstringIL *b);

void il_push_operand(cff_CharstringIL *il, double x);
void il_push_op(cff_CharstringIL *il, int32_t op);
void il_push_special(cff_CharstringIL *il, int32_t s);

#endif