Show More
Commit Description:
utf8mb4
Commit Description:
utf8mb4
References:
File last commit:
Show/Diff file:
Action:
node_modules/fontkit/src/aat/AATLookupTable.js
| 125 lines
| 3.0 KiB
| application/javascript
| JavascriptGenshiLexer
|
r789 | 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; | ||||
} | ||||
} | ||||