Current File : /home/tradevaly/www/node_modules/fontkit/src/aat/AATLookupTable.js |
import {cache} from '../decorators';
import {range} from '../utils';
export default class AATLookupTable {
constructor(table) {
this.table = table;
}
lookup(glyph) {
switch (this.table.version) {
case 0: // simple array format
return this.table.values.getItem(glyph);
case 2: // segment format
case 4: {
let min = 0;
let max = this.table.binarySearchHeader.nUnits - 1;
while (min <= max) {
var mid = (min + max) >> 1;
var seg = this.table.segments[mid];
// special end of search value
if (seg.firstGlyph === 0xffff) {
return null;
}
if (glyph < seg.firstGlyph) {
max = mid - 1;
} else if (glyph > seg.lastGlyph) {
min = mid + 1;
} else {
if (this.table.version === 2) {
return seg.value;
} else {
return seg.values[glyph - seg.firstGlyph];
}
}
}
return null;
}
case 6: { // lookup single
let min = 0;
let max = this.table.binarySearchHeader.nUnits - 1;
while (min <= max) {
var mid = (min + max) >> 1;
var seg = this.table.segments[mid];
// special end of search value
if (seg.glyph === 0xffff) {
return null;
}
if (glyph < seg.glyph) {
max = mid - 1;
} else if (glyph > seg.glyph) {
min = mid + 1;
} else {
return seg.value;
}
}
return null;
}
case 8: // lookup trimmed
return this.table.values[glyph - this.table.firstGlyph];
default:
throw new Error(`Unknown lookup table format: ${this.table.version}`);
}
}
@cache
glyphsForValue(classValue) {
let res = [];
switch (this.table.version) {
case 2: // segment format
case 4: {
for (let segment of this.table.segments) {
if ((this.table.version === 2 && segment.value === classValue)) {
res.push(...range(segment.firstGlyph, segment.lastGlyph + 1));
} else {
for (let index = 0; index < segment.values.length; index++) {
if (segment.values[index] === classValue) {
res.push(segment.firstGlyph + index);
}
}
}
}
break;
}
case 6: { // lookup single
for (let segment of this.table.segments) {
if (segment.value === classValue) {
res.push(segment.glyph);
}
}
break;
}
case 8: { // lookup trimmed
for (let i = 0; i < this.table.values.length; i++) {
if (this.table.values[i] === classValue) {
res.push(this.table.firstGlyph + i);
}
}
break;
}
default:
throw new Error(`Unknown lookup table format: ${this.table.version}`);
}
return res;
}
}