Merge pull request #4478 from nnethercote/plain-fnArray
Use a vanilla array for fnArray
This commit is contained in:
commit
878a123e47
@ -1277,38 +1277,30 @@ var OperatorList = (function OperatorListClosure() {
|
|||||||
var CHUNK_SIZE = 1000;
|
var CHUNK_SIZE = 1000;
|
||||||
var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
|
var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
|
||||||
|
|
||||||
function getTransfers(queue) {
|
function getTransfers(queue) {
|
||||||
var transfers = [];
|
var transfers = [];
|
||||||
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
||||||
for (var i = 0, ii = queue.length; i < ii; i++) {
|
for (var i = 0, ii = queue.length; i < ii; i++) {
|
||||||
switch (fnArray[i]) {
|
switch (fnArray[i]) {
|
||||||
case OPS.paintInlineImageXObject:
|
case OPS.paintInlineImageXObject:
|
||||||
case OPS.paintInlineImageXObjectGroup:
|
case OPS.paintInlineImageXObjectGroup:
|
||||||
case OPS.paintImageMaskXObject:
|
case OPS.paintImageMaskXObject:
|
||||||
var arg = argsArray[i][0]; // first param in imgData
|
var arg = argsArray[i][0]; // first param in imgData
|
||||||
if (!arg.cached) {
|
if (!arg.cached) {
|
||||||
transfers.push(arg.data.buffer);
|
transfers.push(arg.data.buffer);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return transfers;
|
|
||||||
}
|
}
|
||||||
|
return transfers;
|
||||||
|
}
|
||||||
|
|
||||||
|
function OperatorList(intent, messageHandler, pageIndex) {
|
||||||
function OperatorList(intent, messageHandler, pageIndex) {
|
|
||||||
this.messageHandler = messageHandler;
|
this.messageHandler = messageHandler;
|
||||||
// When there isn't a message handler the fn array needs to be able to grow
|
this.fnArray = [];
|
||||||
// since we can't flush the operators.
|
|
||||||
if (messageHandler) {
|
|
||||||
this.fnArray = new Uint8Array(CHUNK_SIZE);
|
|
||||||
} else {
|
|
||||||
this.fnArray = [];
|
|
||||||
}
|
|
||||||
this.argsArray = [];
|
this.argsArray = [];
|
||||||
this.dependencies = {};
|
this.dependencies = {};
|
||||||
this.pageIndex = pageIndex;
|
this.pageIndex = pageIndex;
|
||||||
this.fnIndex = 0;
|
|
||||||
this.intent = intent;
|
this.intent = intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1319,19 +1311,16 @@ var OperatorList = (function OperatorListClosure() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
addOp: function(fn, args) {
|
addOp: function(fn, args) {
|
||||||
|
this.fnArray.push(fn);
|
||||||
|
this.argsArray.push(args);
|
||||||
if (this.messageHandler) {
|
if (this.messageHandler) {
|
||||||
this.fnArray[this.fnIndex++] = fn;
|
if (this.fnArray.length >= CHUNK_SIZE) {
|
||||||
this.argsArray.push(args);
|
|
||||||
if (this.fnIndex >= CHUNK_SIZE) {
|
|
||||||
this.flush();
|
this.flush();
|
||||||
} else if (this.fnIndex >= CHUNK_SIZE_ABOUT &&
|
} else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&
|
||||||
(fn === OPS.restore || fn === OPS.endText)) {
|
(fn === OPS.restore || fn === OPS.endText)) {
|
||||||
// heuristic to flush on boundary of restore or endText
|
// heuristic to flush on boundary of restore or endText
|
||||||
this.flush();
|
this.flush();
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.fnArray.push(fn);
|
|
||||||
this.argsArray.push(args);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1377,9 +1366,9 @@ var OperatorList = (function OperatorListClosure() {
|
|||||||
pageIndex: this.pageIndex,
|
pageIndex: this.pageIndex,
|
||||||
intent: this.intent
|
intent: this.intent
|
||||||
}, null, transfers);
|
}, null, transfers);
|
||||||
this.dependencies = [];
|
this.dependencies = {};
|
||||||
this.fnIndex = 0;
|
this.fnArray.length = 0;
|
||||||
this.argsArray = [];
|
this.argsArray.length = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1671,22 +1660,6 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessor() {
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
var QueueOptimizer = (function QueueOptimizerClosure() {
|
var QueueOptimizer = (function QueueOptimizerClosure() {
|
||||||
function squash(array, index, howMany, element) {
|
|
||||||
if (isArray(array)) {
|
|
||||||
array.splice(index, howMany, element);
|
|
||||||
} else if (typeof element !== 'undefined') {
|
|
||||||
// Replace the element.
|
|
||||||
array[index] = element;
|
|
||||||
// Shift everything after the element up.
|
|
||||||
var sub = array.subarray(index + howMany);
|
|
||||||
array.set(sub, index + 1);
|
|
||||||
} else {
|
|
||||||
// Shift everything after the element up.
|
|
||||||
var sub = array.subarray(index + howMany);
|
|
||||||
array.set(sub, index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addState(parentState, pattern, fn) {
|
function addState(parentState, pattern, fn) {
|
||||||
var state = parentState;
|
var state = parentState;
|
||||||
for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
|
for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
|
||||||
@ -1729,7 +1702,7 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
|
|
||||||
var fnArray = context.fnArray, argsArray = context.argsArray;
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
||||||
var j = context.currentOperation - 3, i = j + 4;
|
var j = context.currentOperation - 3, i = j + 4;
|
||||||
var ii = context.operationsLength;
|
var ii = fnArray.length;
|
||||||
|
|
||||||
for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {
|
for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {
|
||||||
}
|
}
|
||||||
@ -1794,12 +1767,11 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// replacing queue items
|
// replacing queue items
|
||||||
squash(fnArray, j, count * 4, OPS.paintInlineImageXObjectGroup);
|
fnArray.splice(j, count * 4, OPS.paintInlineImageXObjectGroup);
|
||||||
argsArray.splice(j, count * 4,
|
argsArray.splice(j, count * 4,
|
||||||
[{width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
|
[{width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
|
||||||
data: imgData}, map]);
|
data: imgData}, map]);
|
||||||
context.currentOperation = j;
|
context.currentOperation = j;
|
||||||
context.operationsLength -= count * 4 - 1;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
addState(InitialState,
|
addState(InitialState,
|
||||||
@ -1813,7 +1785,7 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
|
|
||||||
var fnArray = context.fnArray, argsArray = context.argsArray;
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
||||||
var j = context.currentOperation - 3, i = j + 4;
|
var j = context.currentOperation - 3, i = j + 4;
|
||||||
var ii = context.operationsLength;
|
var ii = fnArray.length;
|
||||||
|
|
||||||
for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {
|
for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {
|
||||||
}
|
}
|
||||||
@ -1858,12 +1830,11 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// replacing queue items
|
// replacing queue items
|
||||||
squash(fnArray, j, count * 4, OPS.paintImageMaskXObjectRepeat);
|
fnArray.splice(j, count * 4, OPS.paintImageMaskXObjectRepeat);
|
||||||
argsArray.splice(j, count * 4, [argsArray[j + 2][0],
|
argsArray.splice(j, count * 4, [argsArray[j + 2][0],
|
||||||
argsArray[j + 1][0], argsArray[j + 1][3], positions]);
|
argsArray[j + 1][0], argsArray[j + 1][3], positions]);
|
||||||
|
|
||||||
context.currentOperation = j;
|
context.currentOperation = j;
|
||||||
context.operationsLength -= count * 4 - 1;
|
|
||||||
} else {
|
} else {
|
||||||
count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
|
count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
|
||||||
var images = [];
|
var images = [];
|
||||||
@ -1875,11 +1846,10 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// replacing queue items
|
// replacing queue items
|
||||||
squash(fnArray, j, count * 4, OPS.paintImageMaskXObjectGroup);
|
fnArray.splice(j, count * 4, OPS.paintImageMaskXObjectGroup);
|
||||||
argsArray.splice(j, count * 4, [images]);
|
argsArray.splice(j, count * 4, [images]);
|
||||||
|
|
||||||
context.currentOperation = j;
|
context.currentOperation = j;
|
||||||
context.operationsLength -= count * 4 - 1;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1894,7 +1864,7 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
if (argsArray[j + 1][1] !== 0 || argsArray[j + 1][2] !== 0) {
|
if (argsArray[j + 1][1] !== 0 || argsArray[j + 1][2] !== 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var ii = context.operationsLength;
|
var ii = fnArray.length;
|
||||||
for (; i + 3 < ii && fnArray[i - 4] === fnArray[i]; i += 4) {
|
for (; i + 3 < ii && fnArray[i - 4] === fnArray[i]; i += 4) {
|
||||||
if (fnArray[i - 3] !== fnArray[i + 1] ||
|
if (fnArray[i - 3] !== fnArray[i + 1] ||
|
||||||
fnArray[i - 2] !== fnArray[i + 2] ||
|
fnArray[i - 2] !== fnArray[i + 2] ||
|
||||||
@ -1930,11 +1900,10 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
var args = [argsArray[j + 2][0], argsArray[j + 1][0],
|
var args = [argsArray[j + 2][0], argsArray[j + 1][0],
|
||||||
argsArray[j + 1][3], positions];
|
argsArray[j + 1][3], positions];
|
||||||
// replacing queue items
|
// replacing queue items
|
||||||
squash(fnArray, j, count * 4, OPS.paintImageXObjectRepeat);
|
fnArray.splice(j, count * 4, OPS.paintImageXObjectRepeat);
|
||||||
argsArray.splice(j, count * 4, args);
|
argsArray.splice(j, count * 4, args);
|
||||||
|
|
||||||
context.currentOperation = j;
|
context.currentOperation = j;
|
||||||
context.operationsLength -= count * 4 - 1;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
addState(InitialState,
|
addState(InitialState,
|
||||||
@ -1947,7 +1916,7 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
|
|
||||||
var fnArray = context.fnArray, argsArray = context.argsArray;
|
var fnArray = context.fnArray, argsArray = context.argsArray;
|
||||||
var j = context.currentOperation - 4, i = j + 5;
|
var j = context.currentOperation - 4, i = j + 5;
|
||||||
var ii = context.operationsLength;
|
var ii = fnArray.length;
|
||||||
|
|
||||||
for (; i < ii && fnArray[i - 5] === fnArray[i]; i++) {
|
for (; i < ii && fnArray[i - 5] === fnArray[i]; i++) {
|
||||||
if (fnArray[i] === OPS.setFont) {
|
if (fnArray[i] === OPS.setFont) {
|
||||||
@ -1983,12 +1952,10 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
k += 5;
|
k += 5;
|
||||||
}
|
}
|
||||||
var removed = (count - 1) * 3;
|
var removed = (count - 1) * 3;
|
||||||
squash(fnArray, i, removed);
|
fnArray.splice(i, removed);
|
||||||
argsArray.splice(i, removed);
|
argsArray.splice(i, removed);
|
||||||
|
|
||||||
context.currentOperation = i;
|
context.currentOperation = i;
|
||||||
context.operationsLength -= removed;
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function QueueOptimizer() {
|
function QueueOptimizer() {
|
||||||
@ -1998,7 +1965,6 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
var fnArray = queue.fnArray, argsArray = queue.argsArray;
|
||||||
var context = {
|
var context = {
|
||||||
currentOperation: 0,
|
currentOperation: 0,
|
||||||
operationsLength: argsArray.length,
|
|
||||||
fnArray: fnArray,
|
fnArray: fnArray,
|
||||||
argsArray: argsArray
|
argsArray: argsArray
|
||||||
};
|
};
|
||||||
@ -2010,7 +1976,7 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
|
|||||||
context.currentOperation = i;
|
context.currentOperation = i;
|
||||||
state = state(context);
|
state = state(context);
|
||||||
i = context.currentOperation;
|
i = context.currentOperation;
|
||||||
ii = context.operationsLength;
|
ii = context.fnArray.length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user