Optimizing pdf when text printed char-by-char

This commit is contained in:
Yury Delendik 2014-02-23 21:51:14 -06:00
parent dbb3d17d8f
commit 2c23be369b

View File

@ -1633,12 +1633,16 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
function squash(array, index, howMany, element) {
if (isArray(array)) {
array.splice(index, howMany, element);
} else {
} 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);
}
}
@ -1772,6 +1776,60 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
context.operationsLength -= count * 4 - 1;
});
addState(InitialState,
[OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
function (context) {
// moving single chars with same font into beginText/endText groups
// searching for (beginText, setFont, setTextMatrix, showText, endText)+
var MIN_CHARS_IN_BLOCK = 3;
var MAX_CHARS_IN_BLOCK = 1000;
var fnArray = context.fnArray, argsArray = context.argsArray;
var j = context.currentOperation - 4, i = j + 5;
var ii = context.operationsLength;
for (; i < ii && fnArray[i - 5] === fnArray[i]; i++) {
if (fnArray[i] === OPS.setFont) {
if (argsArray[i - 5][0] !== argsArray[i][0] ||
argsArray[i - 5][1] !== argsArray[i][1]) {
break;
}
}
}
var count = Math.min(((i - j) / 5) | 0, MAX_CHARS_IN_BLOCK);
if (count < MIN_CHARS_IN_BLOCK) {
context.currentOperation = i - 1;
return;
}
if (j >= 4 && fnArray[j - 4] === fnArray[j + 1] &&
fnArray[j - 3] === fnArray[j + 2] &&
fnArray[j - 2] === fnArray[j + 3] &&
fnArray[j - 1] === fnArray[j + 4] &&
argsArray[j - 4][0] === argsArray[j + 1][0] &&
argsArray[j - 4][1] === argsArray[j + 1][1]) {
// extending one block ahead (very first block might have 'dependency')
count++;
j -= 5;
}
var k = j + 7;
i = j + 4;
for (var q = 1; q < count; q++) {
fnArray[i] = fnArray[k];
argsArray[i] = argsArray[k];
fnArray[i + 1] = fnArray[k + 1];
argsArray[i + 1] = argsArray[k + 1];
i += 2;
k += 5;
}
var removed = (count - 1) * 3;
squash(fnArray, i, removed);
argsArray.splice(i, removed);
context.currentOperation = i;
context.operationsLength -= removed;
});
function QueueOptimizer() {
}
QueueOptimizer.prototype = {