|
|
import TTFGlyph from './TTFGlyph';
|
|
|
import r from 'restructure';
|
|
|
|
|
|
let SBIXImage = new r.Struct({
|
|
|
originX: r.uint16,
|
|
|
originY: r.uint16,
|
|
|
type: new r.String(4),
|
|
|
data: new r.Buffer(t => t.parent.buflen - t._currentOffset)
|
|
|
});
|
|
|
|
|
|
/**
|
|
|
* Represents a color (e.g. emoji) glyph in Apple's SBIX format.
|
|
|
*/
|
|
|
export default class SBIXGlyph extends TTFGlyph {
|
|
|
/**
|
|
|
* Returns an object representing a glyph image at the given point size.
|
|
|
* The object has a data property with a Buffer containing the actual image data,
|
|
|
* along with the image type, and origin.
|
|
|
*
|
|
|
* @param {number} size
|
|
|
* @return {object}
|
|
|
*/
|
|
|
getImageForSize(size) {
|
|
|
for (let i = 0; i < this._font.sbix.imageTables.length; i++) {
|
|
|
var table = this._font.sbix.imageTables[i];
|
|
|
if (table.ppem >= size) { break; }
|
|
|
}
|
|
|
|
|
|
let offsets = table.imageOffsets;
|
|
|
let start = offsets[this.id];
|
|
|
let end = offsets[this.id + 1];
|
|
|
|
|
|
if (start === end) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
this._font.stream.pos = start;
|
|
|
return SBIXImage.decode(this._font.stream, {buflen: end - start});
|
|
|
}
|
|
|
|
|
|
render(ctx, size) {
|
|
|
let img = this.getImageForSize(size);
|
|
|
if (img != null) {
|
|
|
let scale = size / this._font.unitsPerEm;
|
|
|
ctx.image(img.data, {height: size, x: img.originX, y: (this.bbox.minY - img.originY) * scale});
|
|
|
}
|
|
|
|
|
|
if (this._font.sbix.flags.renderOutlines) {
|
|
|
super.render(ctx, size);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|