|
|
@ -4,11 +4,6 @@ |
|
|
|
'use strict'; |
|
|
|
'use strict'; |
|
|
|
var isWorker = (typeof window == 'undefined'); |
|
|
|
var isWorker = (typeof window == 'undefined'); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Maximum file size of the font. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
var kMaxFontFileSize = 300000; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Maximum time to wait for a font to be loaded by font-face rules. |
|
|
|
* Maximum time to wait for a font to be loaded by font-face rules. |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -467,6 +462,14 @@ var Font = (function Font() { |
|
|
|
return array; |
|
|
|
return array; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function arrayToString(arr) { |
|
|
|
|
|
|
|
var str = ""; |
|
|
|
|
|
|
|
for (var i = 0; i < arr.length; ++i) |
|
|
|
|
|
|
|
str += String.fromCharCode(arr[i]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return str; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function int16(bytes) { |
|
|
|
function int16(bytes) { |
|
|
|
return (bytes[0] << 8) + (bytes[1] & 0xff); |
|
|
|
return (bytes[0] << 8) + (bytes[1] & 0xff); |
|
|
|
}; |
|
|
|
}; |
|
|
@ -502,7 +505,7 @@ var Font = (function Font() { |
|
|
|
String.fromCharCode(value & 0xff); |
|
|
|
String.fromCharCode(value & 0xff); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function createOpenTypeHeader(sfnt, file, offsets, numTables) { |
|
|
|
function createOpenTypeHeader(sfnt, file, numTables) { |
|
|
|
// sfnt version (4 bytes)
|
|
|
|
// sfnt version (4 bytes)
|
|
|
|
var header = sfnt; |
|
|
|
var header = sfnt; |
|
|
|
|
|
|
|
|
|
|
@ -520,14 +523,13 @@ var Font = (function Font() { |
|
|
|
// rangeShift (2 bytes)
|
|
|
|
// rangeShift (2 bytes)
|
|
|
|
header += string16(numTables * 16 - searchRange); |
|
|
|
header += string16(numTables * 16 - searchRange); |
|
|
|
|
|
|
|
|
|
|
|
file.set(stringToArray(header), offsets.currentOffset); |
|
|
|
file.file += header; |
|
|
|
offsets.currentOffset += header.length; |
|
|
|
file.virtualOffset += header.length; |
|
|
|
offsets.virtualOffset += header.length; |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function createTableEntry(file, offsets, tag, data) { |
|
|
|
function createTableEntry(file, tag, data) { |
|
|
|
// offset
|
|
|
|
// offset
|
|
|
|
var offset = offsets.virtualOffset; |
|
|
|
var offset = file.virtualOffset; |
|
|
|
|
|
|
|
|
|
|
|
// length
|
|
|
|
// length
|
|
|
|
var length = data.length; |
|
|
|
var length = data.length; |
|
|
@ -536,8 +538,8 @@ var Font = (function Font() { |
|
|
|
while (data.length & 3) |
|
|
|
while (data.length & 3) |
|
|
|
data.push(0x00); |
|
|
|
data.push(0x00); |
|
|
|
|
|
|
|
|
|
|
|
while (offsets.virtualOffset & 3) |
|
|
|
while (file.virtualOffset & 3) |
|
|
|
offsets.virtualOffset++; |
|
|
|
file.virtualOffset++; |
|
|
|
|
|
|
|
|
|
|
|
// checksum
|
|
|
|
// checksum
|
|
|
|
var checksum = 0, n = data.length; |
|
|
|
var checksum = 0, n = data.length; |
|
|
@ -547,11 +549,8 @@ var Font = (function Font() { |
|
|
|
|
|
|
|
|
|
|
|
var tableEntry = (tag + string32(checksum) + |
|
|
|
var tableEntry = (tag + string32(checksum) + |
|
|
|
string32(offset) + string32(length)); |
|
|
|
string32(offset) + string32(length)); |
|
|
|
tableEntry = stringToArray(tableEntry); |
|
|
|
file.file += tableEntry; |
|
|
|
file.set(tableEntry, offsets.currentOffset); |
|
|
|
file.virtualOffset += data.length; |
|
|
|
|
|
|
|
|
|
|
|
offsets.currentOffset += tableEntry.length; |
|
|
|
|
|
|
|
offsets.virtualOffset += data.length; |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
function getRanges(glyphs) { |
|
|
|
function getRanges(glyphs) { |
|
|
@ -973,23 +972,19 @@ var Font = (function Font() { |
|
|
|
tables.push(table); |
|
|
|
tables.push(table); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Create a new file to hold the new version of our truetype with a new
|
|
|
|
|
|
|
|
// header and new offsets
|
|
|
|
|
|
|
|
var ttf = new Uint8Array(kMaxFontFileSize*3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// The offsets object holds at the same time a representation of where
|
|
|
|
|
|
|
|
// to write the table entry information about a table and another offset
|
|
|
|
|
|
|
|
// representing the offset where to put the actual data of a particular
|
|
|
|
|
|
|
|
// table
|
|
|
|
|
|
|
|
var numTables = header.numTables + requiredTables.length; |
|
|
|
var numTables = header.numTables + requiredTables.length; |
|
|
|
var offsets = { |
|
|
|
|
|
|
|
currentOffset: 0, |
|
|
|
// header and new offsets. Table entry information is appended to the
|
|
|
|
|
|
|
|
// end of file. The virtualOffset represents where to put the actual
|
|
|
|
|
|
|
|
// data of a particular table;
|
|
|
|
|
|
|
|
var ttf = { |
|
|
|
|
|
|
|
file: "", |
|
|
|
virtualOffset: numTables * (4 * 4) |
|
|
|
virtualOffset: numTables * (4 * 4) |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// The new numbers of tables will be the last one plus the num
|
|
|
|
// The new numbers of tables will be the last one plus the num
|
|
|
|
// of missing tables
|
|
|
|
// of missing tables
|
|
|
|
createOpenTypeHeader('\x00\x01\x00\x00', ttf, offsets, numTables); |
|
|
|
createOpenTypeHeader('\x00\x01\x00\x00', ttf, numTables); |
|
|
|
|
|
|
|
|
|
|
|
if (requiredTables.indexOf('OS/2') != -1) { |
|
|
|
if (requiredTables.indexOf('OS/2') != -1) { |
|
|
|
tables.push({ |
|
|
|
tables.push({ |
|
|
@ -1095,28 +1090,21 @@ var Font = (function Font() { |
|
|
|
var tableData = table.data; |
|
|
|
var tableData = table.data; |
|
|
|
for (var j = 0; j < tableData.length; j++) |
|
|
|
for (var j = 0; j < tableData.length; j++) |
|
|
|
data.push(tableData[j]); |
|
|
|
data.push(tableData[j]); |
|
|
|
createTableEntry(ttf, offsets, table.tag, data); |
|
|
|
createTableEntry(ttf, table.tag, data); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Add the table datas
|
|
|
|
// Add the table datas
|
|
|
|
for (var i = 0; i < tables.length; i++) { |
|
|
|
for (var i = 0; i < tables.length; i++) { |
|
|
|
var table = tables[i]; |
|
|
|
var table = tables[i]; |
|
|
|
var tableData = table.data; |
|
|
|
var tableData = table.data; |
|
|
|
if (tableData.length + offsets.currentOffset > ttf.length) |
|
|
|
ttf.file += arrayToString(tableData); |
|
|
|
log('blah'); |
|
|
|
|
|
|
|
ttf.set(tableData, offsets.currentOffset); |
|
|
|
|
|
|
|
offsets.currentOffset += tableData.length; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 4-byte aligned data
|
|
|
|
// 4-byte aligned data
|
|
|
|
while (offsets.currentOffset & 3) |
|
|
|
while (ttf.file.length & 3) |
|
|
|
offsets.currentOffset++; |
|
|
|
ttf.file += String.fromCharCode(0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var fontData = []; |
|
|
|
return stringToArray(ttf.file); |
|
|
|
for (var i = 0; i < offsets.currentOffset; i++) |
|
|
|
|
|
|
|
fontData.push(ttf[i]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return fontData; |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
convert: function font_convert(fontName, font, properties) { |
|
|
|
convert: function font_convert(fontName, font, properties) { |
|
|
@ -1133,13 +1121,13 @@ var Font = (function Font() { |
|
|
|
// representing the offset where to draw the actual data of a particular
|
|
|
|
// representing the offset where to draw the actual data of a particular
|
|
|
|
// table
|
|
|
|
// table
|
|
|
|
var kRequiredTablesCount = 9; |
|
|
|
var kRequiredTablesCount = 9; |
|
|
|
var offsets = { |
|
|
|
|
|
|
|
currentOffset: 0, |
|
|
|
var otf = { |
|
|
|
|
|
|
|
file: "", |
|
|
|
virtualOffset: 9 * (4 * 4) |
|
|
|
virtualOffset: 9 * (4 * 4) |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var otf = new Uint8Array(kMaxFontFileSize); |
|
|
|
createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9); |
|
|
|
createOpenTypeHeader('\x4F\x54\x54\x4F', otf, offsets, 9); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var charstrings = font.charstrings; |
|
|
|
var charstrings = font.charstrings; |
|
|
|
properties.fixedPitch = isFixedPitch(charstrings); |
|
|
|
properties.fixedPitch = isFixedPitch(charstrings); |
|
|
@ -1223,18 +1211,14 @@ var Font = (function Font() { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
for (var field in fields) |
|
|
|
for (var field in fields) |
|
|
|
createTableEntry(otf, offsets, field, fields[field]); |
|
|
|
createTableEntry(otf, field, fields[field]); |
|
|
|
|
|
|
|
|
|
|
|
for (var field in fields) { |
|
|
|
for (var field in fields) { |
|
|
|
var table = fields[field]; |
|
|
|
var table = fields[field]; |
|
|
|
otf.set(table, offsets.currentOffset); |
|
|
|
otf.file += arrayToString(table); |
|
|
|
offsets.currentOffset += table.length; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var fontData = []; |
|
|
|
return stringToArray(otf.file); |
|
|
|
for (var i = 0; i < offsets.currentOffset; i++) |
|
|
|
|
|
|
|
fontData.push(otf[i]); |
|
|
|
|
|
|
|
return fontData; |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
bindWorker: function font_bindWorker(data) { |
|
|
|
bindWorker: function font_bindWorker(data) { |
|
|
|