Merge pull request #337 from sbarman/openmag

fixed fonts.js to build fonts using strings
This commit is contained in:
Chris Jones 2011-08-19 10:19:13 -07:00
commit 2634a72c53

View File

@ -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.
*/ */
@ -466,6 +461,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);
// 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,26 +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;
ttf.set(tableData, offsets.currentOffset); ttf.file += arrayToString(tableData);
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) {
@ -1131,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);
@ -1221,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) {