[Pkg-javascript-commits] [pdf.js] 05/246: Minimize memory usage of font-related arrays.
David Prévot
taffit at moszumanska.debian.org
Sun Sep 7 15:36:19 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository pdf.js.
commit c7f02d2c8ee1d1c7cbb26c9600c910ab3b33603f
Author: Nicholas Nethercote <nnethercote at mozilla.com>
Date: Mon Jul 21 22:19:31 2014 -0700
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.
---
src/core/fonts.js | 46 ++++++++++++++++++++++++++++++++++------------
src/shared/util.js | 2 +-
2 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/src/core/fonts.js b/src/core/fonts.js
index daf6257..c274841 100644
--- a/src/core/fonts.js
+++ b/src/core/fonts.js
@@ -2433,17 +2433,43 @@ var Font = (function FontClosure() {
// length
var length = data.length;
- // Per spec tables must be 4-bytes align so add padding as needed
- while (data.length & 3) {
- data.push(0x00);
+ // Per spec tables must be 4-bytes align so add padding as needed.
+ var paddedLength = length;
+ 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) {
file.virtualOffset++;
}
// checksum
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],
data[i + 3])) | 0;
}
@@ -2452,6 +2478,8 @@ var Font = (function FontClosure() {
string32(offset) + string32(length));
file.file += tableEntry;
file.virtualOffset += data.length;
+
+ return data;
}
function isTrueTypeFile(file) {
@@ -4066,13 +4094,7 @@ var Font = (function FontClosure() {
// rewrite the tables but tweak offsets
for (i = 0; i < numTables; i++) {
table = tables[tablesNames[i]];
- var data = [];
-
- tableData = table.data;
- for (var j = 0, jj = tableData.length; j < jj; j++) {
- data.push(tableData[j]);
- }
- createTableEntry(ttf, table.tag, data);
+ table.data = createTableEntry(ttf, table.tag, table.data);
}
// Add the table datas
@@ -4254,7 +4276,7 @@ var Font = (function FontClosure() {
var field;
for (field in fields) {
- createTableEntry(otf, field, fields[field]);
+ fields[field] = createTableEntry(otf, field, fields[field]);
}
for (field in fields) {
var table = fields[field];
diff --git a/src/shared/util.js b/src/shared/util.js
index 78e4f59..2684485 100644
--- a/src/shared/util.js
+++ b/src/shared/util.js
@@ -436,7 +436,7 @@ function bytesToString(bytes) {
function stringToArray(str) {
var length = str.length;
- var array = [];
+ var array = new Uint16Array(length);
for (var i = 0; i < length; ++i) {
array[i] = str.charCodeAt(i);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git
More information about the Pkg-javascript-commits
mailing list