make createCMAPTable a nested function function
This commit is contained in:
parent
631b5df2c3
commit
b827da304f
144
fonts.js
144
fonts.js
@ -241,7 +241,77 @@ var Font = (function () {
|
||||
styleSheet.insertRule(rule, styleSheet.length);
|
||||
},
|
||||
|
||||
_createCMAPTable: function font_createCMAPTable(aGlyphs) {
|
||||
convert: function font_convert(aFont, aProperties) {
|
||||
var otf = new Uint8Array(kMaxFontFileSize);
|
||||
|
||||
function s2a(s) {
|
||||
var a = [];
|
||||
for (var i = 0; i < s.length; ++i)
|
||||
a[i] = s.charCodeAt(i);
|
||||
return a;
|
||||
}
|
||||
|
||||
function s16(value) {
|
||||
return String.fromCharCode(value >> 8) + String.fromCharCode(value & 0xff);
|
||||
}
|
||||
|
||||
function createOpenTypeHeader(aFile, aOffsets, numTables) {
|
||||
var header = "";
|
||||
|
||||
// sfnt version (4 bytes)
|
||||
header += "\x4F\x54\x54\x4F";
|
||||
|
||||
// numTables (2 bytes)
|
||||
header += s16(numTables);
|
||||
|
||||
// searchRange (2 bytes)
|
||||
var tablesMaxPower2 = FontsUtils.getMaxPower2(numTables);
|
||||
var searchRange = tablesMaxPower2 * 16;
|
||||
header += s16(searchRange);
|
||||
|
||||
// entrySelector (2 bytes)
|
||||
header += s16(Math.log(tablesMaxPower2) / Math.log(2));
|
||||
|
||||
// rangeShift (2 bytes)
|
||||
header += s16(numTables * 16 - searchRange);
|
||||
|
||||
aFile.set(s2a(header), aOffsets.currentOffset);
|
||||
aOffsets.currentOffset += header.length;
|
||||
aOffsets.virtualOffset += header.length;
|
||||
}
|
||||
|
||||
function createTableEntry(aFile, aOffsets, aTag, aData) {
|
||||
// tag
|
||||
var tag = [
|
||||
aTag.charCodeAt(0),
|
||||
aTag.charCodeAt(1),
|
||||
aTag.charCodeAt(2),
|
||||
aTag.charCodeAt(3)
|
||||
];
|
||||
|
||||
// offset
|
||||
var offset = aOffsets.virtualOffset;
|
||||
|
||||
// Per spec tables must be 4-bytes align so add some 0x00 if needed
|
||||
while (aData.length & 3)
|
||||
aData.push(0x00);
|
||||
|
||||
// length
|
||||
var length = aData.length;
|
||||
|
||||
// checksum
|
||||
var checksum = FontsUtils.bytesToInteger(tag) + offset + length;
|
||||
|
||||
var tableEntry = [].concat(tag,
|
||||
FontsUtils.integerToBytes(checksum, 4),
|
||||
FontsUtils.integerToBytes(offset, 4),
|
||||
FontsUtils.integerToBytes(length, 4));
|
||||
aFile.set(tableEntry, aOffsets.currentOffset);
|
||||
aOffsets.currentOffset += tableEntry.length;
|
||||
aOffsets.virtualOffset += aData.length;
|
||||
}
|
||||
|
||||
function createCMAPTable(aGlyphs) {
|
||||
var characters = new Uint16Array(kMaxGlyphsCount);
|
||||
for (var i = 0; i < aGlyphs.length; i++)
|
||||
characters[aGlyphs[i].unicode] = i + 1;
|
||||
@ -321,76 +391,6 @@ var Font = (function () {
|
||||
|
||||
return cmap.concat(endCount, [0x00, 0x00], startCount,
|
||||
idDeltas, idRangeOffsets, glyphsIdsArray);
|
||||
},
|
||||
|
||||
convert: function font_convert(aFont, aProperties) {
|
||||
var otf = new Uint8Array(kMaxFontFileSize);
|
||||
|
||||
function s2a(s) {
|
||||
var a = [];
|
||||
for (var i = 0; i < s.length; ++i)
|
||||
a[i] = s.charCodeAt(i);
|
||||
return a;
|
||||
}
|
||||
|
||||
function s16(value) {
|
||||
return String.fromCharCode(value >> 8) + String.fromCharCode(value & 0xff);
|
||||
}
|
||||
|
||||
function createOpenTypeHeader(aFile, aOffsets, numTables) {
|
||||
var header = "";
|
||||
|
||||
// sfnt version (4 bytes)
|
||||
header += "\x4F\x54\x54\x4F";
|
||||
|
||||
// numTables (2 bytes)
|
||||
header += s16(numTables);
|
||||
|
||||
// searchRange (2 bytes)
|
||||
var tablesMaxPower2 = FontsUtils.getMaxPower2(numTables);
|
||||
var searchRange = tablesMaxPower2 * 16;
|
||||
header += s16(searchRange);
|
||||
|
||||
// entrySelector (2 bytes)
|
||||
header += s16(Math.log(tablesMaxPower2) / Math.log(2));
|
||||
|
||||
// rangeShift (2 bytes)
|
||||
header += s16(numTables * 16 - searchRange);
|
||||
|
||||
aFile.set(s2a(header), aOffsets.currentOffset);
|
||||
aOffsets.currentOffset += header.length;
|
||||
aOffsets.virtualOffset += header.length;
|
||||
}
|
||||
|
||||
function createTableEntry(aFile, aOffsets, aTag, aData) {
|
||||
// tag
|
||||
var tag = [
|
||||
aTag.charCodeAt(0),
|
||||
aTag.charCodeAt(1),
|
||||
aTag.charCodeAt(2),
|
||||
aTag.charCodeAt(3)
|
||||
];
|
||||
|
||||
// offset
|
||||
var offset = aOffsets.virtualOffset;
|
||||
|
||||
// Per spec tables must be 4-bytes align so add some 0x00 if needed
|
||||
while (aData.length & 3)
|
||||
aData.push(0x00);
|
||||
|
||||
// length
|
||||
var length = aData.length;
|
||||
|
||||
// checksum
|
||||
var checksum = FontsUtils.bytesToInteger(tag) + offset + length;
|
||||
|
||||
var tableEntry = [].concat(tag,
|
||||
FontsUtils.integerToBytes(checksum, 4),
|
||||
FontsUtils.integerToBytes(offset, 4),
|
||||
FontsUtils.integerToBytes(length, 4));
|
||||
aFile.set(tableEntry, aOffsets.currentOffset);
|
||||
aOffsets.currentOffset += tableEntry.length;
|
||||
aOffsets.virtualOffset += aData.length;
|
||||
}
|
||||
|
||||
// Required Tables
|
||||
@ -469,7 +469,7 @@ var Font = (function () {
|
||||
var charstrings = aFont.getOrderedCharStrings(aProperties.glyphs);
|
||||
|
||||
/** CMAP */
|
||||
cmap = this._createCMAPTable(charstrings);
|
||||
cmap = createCMAPTable(charstrings);
|
||||
createTableEntry(otf, offsets, "cmap", cmap);
|
||||
|
||||
/** HEAD */
|
||||
|
Loading…
x
Reference in New Issue
Block a user