Minimize memory usage of font-related arrays.
This patch replaces some vanilla arrays with typed arrays, and avoids some array copying. It reduces the peak RSS when viewing http://www.dynacw.co.jp/Portals/3/fontsamplepdf/sample_4942546800828.pdf from ~940 MiB to ~750 MiB, and reduces its load time from 83 to 76 ms.
This commit is contained in:
parent
584fef90ab
commit
c7f02d2c8e
@ -2433,17 +2433,43 @@ var Font = (function FontClosure() {
|
|||||||
// length
|
// length
|
||||||
var length = data.length;
|
var length = data.length;
|
||||||
|
|
||||||
// Per spec tables must be 4-bytes align so add padding as needed
|
// Per spec tables must be 4-bytes align so add padding as needed.
|
||||||
while (data.length & 3) {
|
var paddedLength = length;
|
||||||
data.push(0x00);
|
while (paddedLength & 3) {
|
||||||
|
paddedLength++;
|
||||||
}
|
}
|
||||||
|
var i;
|
||||||
|
var padding = paddedLength - length;
|
||||||
|
if (padding !== 0) {
|
||||||
|
// Padding is required. |data| can be an Array, Uint8Array, or
|
||||||
|
// Uint16Array. In the latter two cases we need to create slightly larger
|
||||||
|
// typed arrays and copy the old contents in. Fortunately that's not a
|
||||||
|
// common case.
|
||||||
|
var data2;
|
||||||
|
if (data instanceof Array) {
|
||||||
|
for (i = 0; i < padding; i++) {
|
||||||
|
data.push(0);
|
||||||
|
}
|
||||||
|
} else if (data instanceof Uint8Array) {
|
||||||
|
data2 = new Uint8Array(paddedLength);
|
||||||
|
data2.set(data);
|
||||||
|
data = data2;
|
||||||
|
} else if (data instanceof Uint16Array) {
|
||||||
|
data2 = new Uint16Array(paddedLength);
|
||||||
|
data2.set(data);
|
||||||
|
data = data2;
|
||||||
|
} else {
|
||||||
|
error('bad array kind in createTableEntry');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (file.virtualOffset & 3) {
|
while (file.virtualOffset & 3) {
|
||||||
file.virtualOffset++;
|
file.virtualOffset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// checksum
|
// checksum
|
||||||
var checksum = 0, n = data.length;
|
var checksum = 0, n = data.length;
|
||||||
for (var i = 0; i < n; i += 4) {
|
for (i = 0; i < n; i += 4) {
|
||||||
checksum = (checksum + int32(data[i], data[i + 1], data[i + 2],
|
checksum = (checksum + int32(data[i], data[i + 1], data[i + 2],
|
||||||
data[i + 3])) | 0;
|
data[i + 3])) | 0;
|
||||||
}
|
}
|
||||||
@ -2452,6 +2478,8 @@ var Font = (function FontClosure() {
|
|||||||
string32(offset) + string32(length));
|
string32(offset) + string32(length));
|
||||||
file.file += tableEntry;
|
file.file += tableEntry;
|
||||||
file.virtualOffset += data.length;
|
file.virtualOffset += data.length;
|
||||||
|
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isTrueTypeFile(file) {
|
function isTrueTypeFile(file) {
|
||||||
@ -4066,13 +4094,7 @@ var Font = (function FontClosure() {
|
|||||||
// rewrite the tables but tweak offsets
|
// rewrite the tables but tweak offsets
|
||||||
for (i = 0; i < numTables; i++) {
|
for (i = 0; i < numTables; i++) {
|
||||||
table = tables[tablesNames[i]];
|
table = tables[tablesNames[i]];
|
||||||
var data = [];
|
table.data = createTableEntry(ttf, table.tag, table.data);
|
||||||
|
|
||||||
tableData = table.data;
|
|
||||||
for (var j = 0, jj = tableData.length; j < jj; j++) {
|
|
||||||
data.push(tableData[j]);
|
|
||||||
}
|
|
||||||
createTableEntry(ttf, table.tag, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the table datas
|
// Add the table datas
|
||||||
@ -4254,7 +4276,7 @@ var Font = (function FontClosure() {
|
|||||||
|
|
||||||
var field;
|
var field;
|
||||||
for (field in fields) {
|
for (field in fields) {
|
||||||
createTableEntry(otf, field, fields[field]);
|
fields[field] = createTableEntry(otf, field, fields[field]);
|
||||||
}
|
}
|
||||||
for (field in fields) {
|
for (field in fields) {
|
||||||
var table = fields[field];
|
var table = fields[field];
|
||||||
|
@ -436,7 +436,7 @@ function bytesToString(bytes) {
|
|||||||
|
|
||||||
function stringToArray(str) {
|
function stringToArray(str) {
|
||||||
var length = str.length;
|
var length = str.length;
|
||||||
var array = [];
|
var array = new Uint16Array(length);
|
||||||
for (var i = 0; i < length; ++i) {
|
for (var i = 0; i < length; ++i) {
|
||||||
array[i] = str.charCodeAt(i);
|
array[i] = str.charCodeAt(i);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user