Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
nPairs: r.uint16,
searchRange: r.uint16,
entrySelector: r.uint16,
rangeShift: r.uint16,
pairs: new r.Array(KernPair, 'nPairs')
},
2: {
rowWidth: r.uint16,
leftTable: new r.Pointer(r.uint16, ClassTable, {type: 'parent'}),
rightTable: new r.Pointer(r.uint16, ClassTable, {type: 'parent'}),
array: new r.Pointer(r.uint16, Kern2Array, {type: 'parent'})
},
3: {
glyphCount: r.uint16,
kernValueCount: r.uint8,
leftClassCount: r.uint8,
rightClassCount: r.uint8,
flags: r.uint8,
kernValue: new r.Array(r.int16, 'kernValueCount'),
leftClass: new r.Array(r.uint8, 'glyphCount'),
rightClass: new r.Array(r.uint8, 'glyphCount'),
kernIndex: new r.Array(r.uint8, t => t.leftClassCount * t.rightClassCount)
}
});
let KernTable = new r.VersionedStruct('version', {
0: { // Microsoft uses this format
subVersion: r.uint16, // Microsoft has an extra sub-table version number
length: r.uint16, // Length of the subtable, in bytes
format: r.uint8, // Format of subtable
});
let LangTagRecord = new r.Struct({
length: r.uint16,
tag: new r.Pointer(r.uint16, new r.String('length', 'utf16be'), {type: 'parent', relativeTo: 'stringOffset'})
});
var NameTable = new r.VersionedStruct(r.uint16, {
0: {
count: r.uint16,
stringOffset: r.uint16,
records: new r.Array(NameRecord, 'count')
},
1: {
count: r.uint16,
stringOffset: r.uint16,
records: new r.Array(NameRecord, 'count'),
langTagCount: r.uint16,
langTags: new r.Array(LangTagRecord, 'langTagCount')
}
});
export default NameTable;
const NAMES = [
'copyright',
'fontFamily',
'fontSubfamily',
'uniqueSubfamily',
'fullName',
'version',
'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII.
2: { // Class pair adjustment
coverage: new r.Pointer(r.uint16, Coverage),
valueFormat1: ValueFormat,
valueFormat2: ValueFormat,
classDef1: new r.Pointer(r.uint16, ClassDef),
classDef2: new r.Pointer(r.uint16, ClassDef),
class1Count: r.uint16,
class2Count: r.uint16,
classRecords: new r.LazyArray(new r.LazyArray(Class2Record, 'class2Count'), 'class1Count')
}
}),
3: { // Cursive Attachment Positioning
format: r.uint16,
coverage: new r.Pointer(r.uint16, Coverage),
entryExitCount: r.uint16,
entryExitRecords: new r.Array(EntryExitRecord, 'entryExitCount')
},
4: { // MarkToBase Attachment Positioning
format: r.uint16,
markCoverage: new r.Pointer(r.uint16, Coverage),
baseCoverage: new r.Pointer(r.uint16, Coverage),
classCount: r.uint16,
markArray: new r.Pointer(r.uint16, MarkArray),
baseArray: new r.Pointer(r.uint16, BaseArray)
},
5: { // MarkToLigature Attachment Positioning
format: r.uint16,
markCoverage: new r.Pointer(r.uint16, Coverage),
import r from 'restructure';
import tables from './';
let WOFFDirectoryEntry = new r.Struct({
tag: new r.String(4),
offset: new r.Pointer(r.uint32, 'void', {type: 'global'}),
compLength: r.uint32,
length: r.uint32,
origChecksum: r.uint32
});
let WOFFDirectory = new r.Struct({
tag: new r.String(4), // should be 'wOFF'
flavor: r.uint32,
length: r.uint32,
numTables: r.uint16,
reserved: new r.Reserved(r.uint16),
totalSfntSize: r.uint32,
majorVersion: r.uint16,
minorVersion: r.uint16,
metaOffset: r.uint32,
metaLength: r.uint32,
metaOrigLength: r.uint32,
privOffset: r.uint32,
privLength: r.uint32,
tables: new r.Array(WOFFDirectoryEntry, 'numTables')
});
WOFFDirectory.process = function() {
let tables = {};
for (let table of this.tables) {
tables[table.tag] = table;
let SBitLineMetrics = new r.Struct({
ascender: r.int8,
descender: r.int8,
widthMax: r.uint8,
caretSlopeNumerator: r.int8,
caretSlopeDenominator: r.int8,
caretOffset: r.int8,
minOriginSB: r.int8,
minAdvanceSB: r.int8,
maxBeforeBL: r.int8,
minAfterBL: r.int8,
pad: new r.Reserved(r.int8, 2)
});
let CodeOffsetPair = new r.Struct({
glyphCode: r.uint16,
offset: r.uint16
});
let IndexSubtable = new r.VersionedStruct(r.uint16, {
header: {
imageFormat: r.uint16,
imageDataOffset: r.uint32
},
1: {
offsetArray: new r.Array(r.uint32, t => t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1)
},
2: {
imageSize: r.uint32,
bigMetrics: BigMetrics
import r from 'restructure';
let Axis = new r.Struct({
axisTag: new r.String(4),
minValue: r.fixed32,
defaultValue: r.fixed32,
maxValue: r.fixed32,
flags: r.uint16,
nameID: r.uint16,
name: t => t.parent.parent.name.records.fontFeatures[t.nameID]
});
let Instance = new r.Struct({
nameID: r.uint16,
name: t => t.parent.parent.name.records.fontFeatures[t.nameID],
flags: r.uint16,
coord: new r.Array(r.fixed32, t => t.parent.axisCount),
postscriptNameID: new r.Optional(r.uint16, t => t.parent.instanceSize - t._currentOffset > 0)
});
export default new r.Struct({
version: r.fixed32,
offsetToData: r.uint16,
countSizePairs: r.uint16,
axisCount: r.uint16,
axisSize: r.uint16,
instanceCount: r.uint16,
instanceSize: r.uint16,
axis: new r.Array(Axis, 'axisCount'),
instance: new r.Array(Instance, 'instanceCount')
});
nameID: r.uint16,
name: t => t.parent.parent.name.records.fontFeatures[t.nameID]
});
let Instance = new r.Struct({
nameID: r.uint16,
name: t => t.parent.parent.name.records.fontFeatures[t.nameID],
flags: r.uint16,
coord: new r.Array(r.fixed32, t => t.parent.axisCount),
postscriptNameID: new r.Optional(r.uint16, t => t.parent.instanceSize - t._currentOffset > 0)
});
export default new r.Struct({
version: r.fixed32,
offsetToData: r.uint16,
countSizePairs: r.uint16,
axisCount: r.uint16,
axisSize: r.uint16,
instanceCount: r.uint16,
instanceSize: r.uint16,
axis: new r.Array(Axis, 'axisCount'),
instance: new r.Array(Instance, 'instanceCount')
});
decode(stream, parent) {
let version = this.getCFFVersion(parent);
let count = version >= 2
? stream.readUInt32BE()
: stream.readUInt16BE();
if (count === 0) {
return [];
}
let offSize = stream.readUInt8();
let offsetType;
if (offSize === 1) {
offsetType = r.uint8;
} else if (offSize === 2) {
offsetType = r.uint16;
} else if (offSize === 3) {
offsetType = r.uint24;
} else if (offSize === 4) {
offsetType = r.uint32;
} else {
throw new Error(`Bad offset size in CFFIndex: ${offSize} ${stream.pos}`);
}
let ret = [];
let startPos = stream.pos + ((count + 1) * offSize) - 1;
let start = offsetType.decode(stream);
for (let i = 0; i < count; i++) {
let end = offsetType.decode(stream);
if (this.type != null) {
let count = 0;
let res = [];
while (count < length) {
let range = this.type.decode(stream, parent);
range.offset = count;
count += range.nLeft + 1;
res.push(range);
}
return res;
}
}
let CFFCustomCharset = new r.VersionedStruct(r.uint8, {
0: {
glyphs: new r.Array(r.uint16, t => t.parent.CharStrings.length - 1)
},
1: {
ranges: new RangeArray(Range1, t => t.parent.CharStrings.length - 1)
},
2: {
ranges: new RangeArray(Range2, t => t.parent.CharStrings.length - 1)
}
});
let CFFCharset = new PredefinedOp([ ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset ], new CFFPointer(CFFCustomCharset, {lazy: true}));
let FDRange3 = new r.Struct({
first: r.uint16,
fd: r.uint8
export function StateTable(entryData = {}, lookupType = r.uint16) {
let entry = Object.assign({
newState: r.uint16,
flags: r.uint16
}, entryData);
let Entry = new r.Struct(entry);
let StateArray = new UnboundedArray(new r.Array(r.uint16, t => t.nClasses));
let StateHeader = new r.Struct({
nClasses: r.uint32,
classTable: new r.Pointer(r.uint32, new LookupTable(lookupType)),
stateArray: new r.Pointer(r.uint32, StateArray),
entryTable: new r.Pointer(r.uint32, new UnboundedArray(Entry))
});
return StateHeader;
}