72 lines
2.0 KiB
Plaintext
72 lines
2.0 KiB
Plaintext
// The `fvar` table stores font variation axes and instances.
|
|
// https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fvar.html
|
|
|
|
import check from '../check';
|
|
import parse from '../parse';
|
|
|
|
function parseFvarAxis(data, start, names) {
|
|
const axis = {};
|
|
const p = new parse.Parser(data, start);
|
|
axis.tag = p.parseTag();
|
|
axis.minValue = p.parseFixed();
|
|
axis.defaultValue = p.parseFixed();
|
|
axis.maxValue = p.parseFixed();
|
|
p.skip('uShort', 1); // reserved for flags; no values defined
|
|
axis.name = names[p.parseUShort()] || {};
|
|
return axis;
|
|
}
|
|
|
|
function parseFvarInstance(data, start, axes, names) {
|
|
const inst = {};
|
|
const p = new parse.Parser(data, start);
|
|
inst.name = names[p.parseUShort()] || {};
|
|
p.skip('uShort', 1); // reserved for flags; no values defined
|
|
|
|
inst.coordinates = {};
|
|
for (let i = 0; i < axes.length; ++i) {
|
|
inst.coordinates[axes[i].tag] = p.parseFixed();
|
|
}
|
|
|
|
return inst;
|
|
}
|
|
|
|
function parseFvarTable(data, start, names) {
|
|
const p = new parse.Parser(data, start);
|
|
const tableVersion = p.parseULong();
|
|
check.argument(
|
|
tableVersion === 0x00010000,
|
|
'Unsupported fvar table version.'
|
|
);
|
|
const offsetToData = p.parseOffset16();
|
|
// Skip countSizePairs.
|
|
p.skip('uShort', 1);
|
|
const axisCount = p.parseUShort();
|
|
const axisSize = p.parseUShort();
|
|
const instanceCount = p.parseUShort();
|
|
const instanceSize = p.parseUShort();
|
|
|
|
const axes = [];
|
|
for (let i = 0; i < axisCount; i++) {
|
|
axes.push(
|
|
parseFvarAxis(data, start + offsetToData + i * axisSize, names)
|
|
);
|
|
}
|
|
|
|
const instances = [];
|
|
const instanceStart = start + offsetToData + axisCount * axisSize;
|
|
for (let j = 0; j < instanceCount; j++) {
|
|
instances.push(
|
|
parseFvarInstance(
|
|
data,
|
|
instanceStart + j * instanceSize,
|
|
axes,
|
|
names
|
|
)
|
|
);
|
|
}
|
|
|
|
return { axes: axes, instances: instances };
|
|
}
|
|
|
|
export default { parse: parseFvarTable };
|