@vaadin-component-factory/vcf-pdf-viewer 0.9.0 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +33 -18
- package/{src/display → pdfjs/dist}/display_utils.js +344 -139
- package/{src/display → pdfjs/dist}/fetch_stream.js +115 -97
- package/pdfjs/dist/get.js +1857 -0
- package/pdfjs/dist/index.js +767 -0
- package/pdfjs/dist/l10n_utils.js +140 -0
- package/{src/shared → pdfjs/dist}/message_handler.js +243 -259
- package/{src/display → pdfjs/dist}/network.js +149 -87
- package/{src/display/content_disposition.js → pdfjs/dist/network_utils.js} +167 -55
- package/{src/display → pdfjs/dist}/node_stream.js +133 -98
- package/pdfjs/dist/pdf.js +12778 -0
- package/pdfjs/dist/pdf_link_service.js +638 -0
- package/pdfjs/dist/pdf_rendering_queue.js +199 -0
- package/pdfjs/dist/pdf_thumbnail_viewer.js +819 -0
- package/pdfjs/dist/pdf_viewer.js +3598 -0
- package/pdfjs/dist/typeof.js +100 -0
- package/pdfjs/dist/ui_utils.js +1033 -0
- package/{src/shared → pdfjs/dist}/util.js +301 -287
- package/pdfjs/dist/worker.js +62813 -0
- package/src/vcf-pdf-viewer.js +77 -27
- package/theme/lumo/vcf-pdf-viewer-styles.js +1 -1
- package/theme/material/vcf-pdf-viewer.js +2 -2
- package/src/core/.eslintrc +0 -13
- package/src/core/annotation.js +0 -2948
- package/src/core/arithmetic_decoder.js +0 -182
- package/src/core/ascii_85_stream.js +0 -98
- package/src/core/ascii_hex_stream.js +0 -79
- package/src/core/base_stream.js +0 -110
- package/src/core/bidi.js +0 -438
- package/src/core/calibri_factors.js +0 -308
- package/src/core/catalog.js +0 -1459
- package/src/core/ccitt.js +0 -1062
- package/src/core/ccitt_stream.js +0 -60
- package/src/core/cff_font.js +0 -116
- package/src/core/cff_parser.js +0 -1949
- package/src/core/charsets.js +0 -119
- package/src/core/chunked_stream.js +0 -557
- package/src/core/cmap.js +0 -1039
- package/src/core/colorspace.js +0 -1533
- package/src/core/core_utils.js +0 -464
- package/src/core/crypto.js +0 -1900
- package/src/core/decode_stream.js +0 -170
- package/src/core/decrypt_stream.js +0 -59
- package/src/core/default_appearance.js +0 -99
- package/src/core/document.js +0 -1456
- package/src/core/encodings.js +0 -301
- package/src/core/evaluator.js +0 -4601
- package/src/core/file_spec.js +0 -108
- package/src/core/flate_stream.js +0 -402
- package/src/core/font_renderer.js +0 -882
- package/src/core/fonts.js +0 -3260
- package/src/core/fonts_utils.js +0 -221
- package/src/core/function.js +0 -1257
- package/src/core/glyf.js +0 -706
- package/src/core/glyphlist.js +0 -4558
- package/src/core/helvetica_factors.js +0 -353
- package/src/core/image.js +0 -802
- package/src/core/image_utils.js +0 -291
- package/src/core/jbig2.js +0 -2572
- package/src/core/jbig2_stream.js +0 -73
- package/src/core/jpeg_stream.js +0 -105
- package/src/core/jpg.js +0 -1416
- package/src/core/jpx.js +0 -2343
- package/src/core/jpx_stream.js +0 -87
- package/src/core/liberationsans_widths.js +0 -221
- package/src/core/lzw_stream.js +0 -150
- package/src/core/metadata_parser.js +0 -146
- package/src/core/metrics.js +0 -2970
- package/src/core/murmurhash3.js +0 -139
- package/src/core/myriadpro_factors.js +0 -290
- package/src/core/name_number_tree.js +0 -153
- package/src/core/object_loader.js +0 -149
- package/src/core/opentype_file_builder.js +0 -154
- package/src/core/operator_list.js +0 -734
- package/src/core/parser.js +0 -1416
- package/src/core/pattern.js +0 -985
- package/src/core/pdf_manager.js +0 -217
- package/src/core/predictor_stream.js +0 -238
- package/src/core/primitives.js +0 -402
- package/src/core/ps_parser.js +0 -272
- package/src/core/run_length_stream.js +0 -61
- package/src/core/segoeui_factors.js +0 -308
- package/src/core/standard_fonts.js +0 -817
- package/src/core/stream.js +0 -103
- package/src/core/struct_tree.js +0 -335
- package/src/core/to_unicode_map.js +0 -103
- package/src/core/type1_font.js +0 -421
- package/src/core/type1_parser.js +0 -776
- package/src/core/unicode.js +0 -1649
- package/src/core/worker.js +0 -848
- package/src/core/worker_stream.js +0 -135
- package/src/core/writer.js +0 -278
- package/src/core/xfa/bind.js +0 -652
- package/src/core/xfa/builder.js +0 -207
- package/src/core/xfa/config.js +0 -1926
- package/src/core/xfa/connection_set.js +0 -202
- package/src/core/xfa/data.js +0 -82
- package/src/core/xfa/datasets.js +0 -76
- package/src/core/xfa/factory.js +0 -111
- package/src/core/xfa/fonts.js +0 -181
- package/src/core/xfa/formcalc_lexer.js +0 -385
- package/src/core/xfa/formcalc_parser.js +0 -1340
- package/src/core/xfa/html_utils.js +0 -639
- package/src/core/xfa/layout.js +0 -383
- package/src/core/xfa/locale_set.js +0 -345
- package/src/core/xfa/namespaces.js +0 -81
- package/src/core/xfa/parser.js +0 -184
- package/src/core/xfa/setup.js +0 -38
- package/src/core/xfa/signature.js +0 -40
- package/src/core/xfa/som.js +0 -338
- package/src/core/xfa/stylesheet.js +0 -40
- package/src/core/xfa/template.js +0 -6260
- package/src/core/xfa/text.js +0 -290
- package/src/core/xfa/unknown.js +0 -29
- package/src/core/xfa/utils.js +0 -217
- package/src/core/xfa/xdp.js +0 -59
- package/src/core/xfa/xfa_object.js +0 -1130
- package/src/core/xfa/xhtml.js +0 -543
- package/src/core/xfa_fonts.js +0 -208
- package/src/core/xml_parser.js +0 -507
- package/src/core/xref.js +0 -899
- package/src/display/annotation_layer.js +0 -2107
- package/src/display/annotation_storage.js +0 -113
- package/src/display/api.js +0 -3292
- package/src/display/base_factory.js +0 -180
- package/src/display/canvas.js +0 -2828
- package/src/display/font_loader.js +0 -484
- package/src/display/metadata.js +0 -41
- package/src/display/network_utils.js +0 -100
- package/src/display/node_utils.js +0 -83
- package/src/display/optional_content_config.js +0 -189
- package/src/display/pattern_helper.js +0 -659
- package/src/display/svg.js +0 -1709
- package/src/display/text_layer.js +0 -847
- package/src/display/transport_stream.js +0 -303
- package/src/display/worker_options.js +0 -40
- package/src/display/xfa_layer.js +0 -204
- package/src/doc_helper.js +0 -25
- package/src/images/logo.svg +0 -41
- package/src/interfaces.js +0 -169
- package/src/license_header.js +0 -14
- package/src/license_header_libre.js +0 -21
- package/src/pdf.image_decoders.js +0 -46
- package/src/pdf.js +0 -146
- package/src/pdf.sandbox.external.js +0 -181
- package/src/pdf.sandbox.js +0 -151
- package/src/pdf.scripting.js +0 -25
- package/src/pdf.worker.entry.js +0 -19
- package/src/pdf.worker.js +0 -23
- package/src/scripting_api/aform.js +0 -608
- package/src/scripting_api/app.js +0 -621
- package/src/scripting_api/color.js +0 -129
- package/src/scripting_api/common.js +0 -58
- package/src/scripting_api/console.js +0 -38
- package/src/scripting_api/constants.js +0 -208
- package/src/scripting_api/doc.js +0 -1195
- package/src/scripting_api/error.js +0 -23
- package/src/scripting_api/event.js +0 -232
- package/src/scripting_api/field.js +0 -620
- package/src/scripting_api/fullscreen.js +0 -145
- package/src/scripting_api/initialization.js +0 -223
- package/src/scripting_api/pdf_object.js +0 -24
- package/src/scripting_api/print_params.js +0 -146
- package/src/scripting_api/proxy.js +0 -139
- package/src/scripting_api/thermometer.js +0 -69
- package/src/scripting_api/util.js +0 -581
- package/src/shared/.eslintrc +0 -13
- package/src/shared/cffStandardStrings.js +0 -311
- package/src/shared/compatibility.js +0 -114
- package/src/shared/fonts_utils.js +0 -429
- package/src/shared/is_node.js +0 -27
- package/src/shared/scripting_utils.js +0 -85
- package/src/worker_loader.js +0 -32
|
@@ -1,734 +0,0 @@
|
|
|
1
|
-
/* Copyright 2017 Mozilla Foundation
|
|
2
|
-
*
|
|
3
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
* you may not use this file except in compliance with the License.
|
|
5
|
-
* You may obtain a copy of the License at
|
|
6
|
-
*
|
|
7
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
*
|
|
9
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
* See the License for the specific language governing permissions and
|
|
13
|
-
* limitations under the License.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { assert, ImageKind, OPS, shadow, warn } from "../shared/util.js";
|
|
17
|
-
|
|
18
|
-
function addState(parentState, pattern, checkFn, iterateFn, processFn) {
|
|
19
|
-
let state = parentState;
|
|
20
|
-
for (let i = 0, ii = pattern.length - 1; i < ii; i++) {
|
|
21
|
-
const item = pattern[i];
|
|
22
|
-
state = state[item] || (state[item] = []);
|
|
23
|
-
}
|
|
24
|
-
state[pattern[pattern.length - 1]] = {
|
|
25
|
-
checkFn,
|
|
26
|
-
iterateFn,
|
|
27
|
-
processFn,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {
|
|
32
|
-
// Handles special case of mainly LaTeX documents which use image masks to
|
|
33
|
-
// draw lines with the current fill style.
|
|
34
|
-
// 'count' groups of (save, transform, paintImageMaskXObject, restore)+
|
|
35
|
-
// have been found at iFirstSave.
|
|
36
|
-
const iFirstPIMXO = iFirstSave + 2;
|
|
37
|
-
let i;
|
|
38
|
-
for (i = 0; i < count; i++) {
|
|
39
|
-
const arg = argsArray[iFirstPIMXO + 4 * i];
|
|
40
|
-
const imageMask = arg.length === 1 && arg[0];
|
|
41
|
-
if (
|
|
42
|
-
imageMask &&
|
|
43
|
-
imageMask.width === 1 &&
|
|
44
|
-
imageMask.height === 1 &&
|
|
45
|
-
(!imageMask.data.length ||
|
|
46
|
-
(imageMask.data.length === 1 && imageMask.data[0] === 0))
|
|
47
|
-
) {
|
|
48
|
-
fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
return count - i;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const InitialState = [];
|
|
57
|
-
|
|
58
|
-
// This replaces (save, transform, paintInlineImageXObject, restore)+
|
|
59
|
-
// sequences with one |paintInlineImageXObjectGroup| operation.
|
|
60
|
-
addState(
|
|
61
|
-
InitialState,
|
|
62
|
-
[OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],
|
|
63
|
-
null,
|
|
64
|
-
function iterateInlineImageGroup(context, i) {
|
|
65
|
-
const fnArray = context.fnArray;
|
|
66
|
-
const iFirstSave = context.iCurr - 3;
|
|
67
|
-
const pos = (i - iFirstSave) % 4;
|
|
68
|
-
switch (pos) {
|
|
69
|
-
case 0:
|
|
70
|
-
return fnArray[i] === OPS.save;
|
|
71
|
-
case 1:
|
|
72
|
-
return fnArray[i] === OPS.transform;
|
|
73
|
-
case 2:
|
|
74
|
-
return fnArray[i] === OPS.paintInlineImageXObject;
|
|
75
|
-
case 3:
|
|
76
|
-
return fnArray[i] === OPS.restore;
|
|
77
|
-
}
|
|
78
|
-
throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);
|
|
79
|
-
},
|
|
80
|
-
function foundInlineImageGroup(context, i) {
|
|
81
|
-
const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
|
|
82
|
-
const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
|
|
83
|
-
const MAX_WIDTH = 1000;
|
|
84
|
-
const IMAGE_PADDING = 1;
|
|
85
|
-
|
|
86
|
-
const fnArray = context.fnArray,
|
|
87
|
-
argsArray = context.argsArray;
|
|
88
|
-
const curr = context.iCurr;
|
|
89
|
-
const iFirstSave = curr - 3;
|
|
90
|
-
const iFirstTransform = curr - 2;
|
|
91
|
-
const iFirstPIIXO = curr - 1;
|
|
92
|
-
|
|
93
|
-
const count = Math.min(
|
|
94
|
-
Math.floor((i - iFirstSave) / 4),
|
|
95
|
-
MAX_IMAGES_IN_INLINE_IMAGES_BLOCK
|
|
96
|
-
);
|
|
97
|
-
if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
|
|
98
|
-
return i - ((i - iFirstSave) % 4);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// assuming that heights of those image is too small (~1 pixel)
|
|
102
|
-
// packing as much as possible by lines
|
|
103
|
-
let maxX = 0;
|
|
104
|
-
const map = [];
|
|
105
|
-
let maxLineHeight = 0;
|
|
106
|
-
let currentX = IMAGE_PADDING,
|
|
107
|
-
currentY = IMAGE_PADDING;
|
|
108
|
-
for (let q = 0; q < count; q++) {
|
|
109
|
-
const transform = argsArray[iFirstTransform + (q << 2)];
|
|
110
|
-
const img = argsArray[iFirstPIIXO + (q << 2)][0];
|
|
111
|
-
if (currentX + img.width > MAX_WIDTH) {
|
|
112
|
-
// starting new line
|
|
113
|
-
maxX = Math.max(maxX, currentX);
|
|
114
|
-
currentY += maxLineHeight + 2 * IMAGE_PADDING;
|
|
115
|
-
currentX = 0;
|
|
116
|
-
maxLineHeight = 0;
|
|
117
|
-
}
|
|
118
|
-
map.push({
|
|
119
|
-
transform,
|
|
120
|
-
x: currentX,
|
|
121
|
-
y: currentY,
|
|
122
|
-
w: img.width,
|
|
123
|
-
h: img.height,
|
|
124
|
-
});
|
|
125
|
-
currentX += img.width + 2 * IMAGE_PADDING;
|
|
126
|
-
maxLineHeight = Math.max(maxLineHeight, img.height);
|
|
127
|
-
}
|
|
128
|
-
const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
|
|
129
|
-
const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
|
|
130
|
-
const imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);
|
|
131
|
-
const imgRowSize = imgWidth << 2;
|
|
132
|
-
for (let q = 0; q < count; q++) {
|
|
133
|
-
const data = argsArray[iFirstPIIXO + (q << 2)][0].data;
|
|
134
|
-
// Copy image by lines and extends pixels into padding.
|
|
135
|
-
const rowSize = map[q].w << 2;
|
|
136
|
-
let dataOffset = 0;
|
|
137
|
-
let offset = (map[q].x + map[q].y * imgWidth) << 2;
|
|
138
|
-
imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
|
|
139
|
-
for (let k = 0, kk = map[q].h; k < kk; k++) {
|
|
140
|
-
imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
|
|
141
|
-
dataOffset += rowSize;
|
|
142
|
-
offset += imgRowSize;
|
|
143
|
-
}
|
|
144
|
-
imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
|
|
145
|
-
while (offset >= 0) {
|
|
146
|
-
data[offset - 4] = data[offset];
|
|
147
|
-
data[offset - 3] = data[offset + 1];
|
|
148
|
-
data[offset - 2] = data[offset + 2];
|
|
149
|
-
data[offset - 1] = data[offset + 3];
|
|
150
|
-
data[offset + rowSize] = data[offset + rowSize - 4];
|
|
151
|
-
data[offset + rowSize + 1] = data[offset + rowSize - 3];
|
|
152
|
-
data[offset + rowSize + 2] = data[offset + rowSize - 2];
|
|
153
|
-
data[offset + rowSize + 3] = data[offset + rowSize - 1];
|
|
154
|
-
offset -= imgRowSize;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Replace queue items.
|
|
159
|
-
fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
|
|
160
|
-
argsArray.splice(iFirstSave, count * 4, [
|
|
161
|
-
{
|
|
162
|
-
width: imgWidth,
|
|
163
|
-
height: imgHeight,
|
|
164
|
-
kind: ImageKind.RGBA_32BPP,
|
|
165
|
-
data: imgData,
|
|
166
|
-
},
|
|
167
|
-
map,
|
|
168
|
-
]);
|
|
169
|
-
|
|
170
|
-
return iFirstSave + 1;
|
|
171
|
-
}
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
// This replaces (save, transform, paintImageMaskXObject, restore)+
|
|
175
|
-
// sequences with one |paintImageMaskXObjectGroup| or one
|
|
176
|
-
// |paintImageMaskXObjectRepeat| operation.
|
|
177
|
-
addState(
|
|
178
|
-
InitialState,
|
|
179
|
-
[OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],
|
|
180
|
-
null,
|
|
181
|
-
function iterateImageMaskGroup(context, i) {
|
|
182
|
-
const fnArray = context.fnArray;
|
|
183
|
-
const iFirstSave = context.iCurr - 3;
|
|
184
|
-
const pos = (i - iFirstSave) % 4;
|
|
185
|
-
switch (pos) {
|
|
186
|
-
case 0:
|
|
187
|
-
return fnArray[i] === OPS.save;
|
|
188
|
-
case 1:
|
|
189
|
-
return fnArray[i] === OPS.transform;
|
|
190
|
-
case 2:
|
|
191
|
-
return fnArray[i] === OPS.paintImageMaskXObject;
|
|
192
|
-
case 3:
|
|
193
|
-
return fnArray[i] === OPS.restore;
|
|
194
|
-
}
|
|
195
|
-
throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);
|
|
196
|
-
},
|
|
197
|
-
function foundImageMaskGroup(context, i) {
|
|
198
|
-
const MIN_IMAGES_IN_MASKS_BLOCK = 10;
|
|
199
|
-
const MAX_IMAGES_IN_MASKS_BLOCK = 100;
|
|
200
|
-
const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
|
|
201
|
-
|
|
202
|
-
const fnArray = context.fnArray,
|
|
203
|
-
argsArray = context.argsArray;
|
|
204
|
-
const curr = context.iCurr;
|
|
205
|
-
const iFirstSave = curr - 3;
|
|
206
|
-
const iFirstTransform = curr - 2;
|
|
207
|
-
const iFirstPIMXO = curr - 1;
|
|
208
|
-
|
|
209
|
-
// At this point, i is the index of the first op past the last valid
|
|
210
|
-
// quartet.
|
|
211
|
-
let count = Math.floor((i - iFirstSave) / 4);
|
|
212
|
-
count = handlePaintSolidColorImageMask(
|
|
213
|
-
iFirstSave,
|
|
214
|
-
count,
|
|
215
|
-
fnArray,
|
|
216
|
-
argsArray
|
|
217
|
-
);
|
|
218
|
-
if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
|
|
219
|
-
return i - ((i - iFirstSave) % 4);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
let isSameImage = false;
|
|
223
|
-
let iTransform, transformArgs;
|
|
224
|
-
const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
|
|
225
|
-
const firstTransformArg0 = argsArray[iFirstTransform][0],
|
|
226
|
-
firstTransformArg1 = argsArray[iFirstTransform][1],
|
|
227
|
-
firstTransformArg2 = argsArray[iFirstTransform][2],
|
|
228
|
-
firstTransformArg3 = argsArray[iFirstTransform][3];
|
|
229
|
-
|
|
230
|
-
if (firstTransformArg1 === firstTransformArg2) {
|
|
231
|
-
isSameImage = true;
|
|
232
|
-
iTransform = iFirstTransform + 4;
|
|
233
|
-
let iPIMXO = iFirstPIMXO + 4;
|
|
234
|
-
for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
|
|
235
|
-
transformArgs = argsArray[iTransform];
|
|
236
|
-
if (
|
|
237
|
-
argsArray[iPIMXO][0] !== firstPIMXOArg0 ||
|
|
238
|
-
transformArgs[0] !== firstTransformArg0 ||
|
|
239
|
-
transformArgs[1] !== firstTransformArg1 ||
|
|
240
|
-
transformArgs[2] !== firstTransformArg2 ||
|
|
241
|
-
transformArgs[3] !== firstTransformArg3
|
|
242
|
-
) {
|
|
243
|
-
if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
|
|
244
|
-
isSameImage = false;
|
|
245
|
-
} else {
|
|
246
|
-
count = q;
|
|
247
|
-
}
|
|
248
|
-
break; // different image or transform
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
if (isSameImage) {
|
|
254
|
-
count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
|
|
255
|
-
const positions = new Float32Array(count * 2);
|
|
256
|
-
iTransform = iFirstTransform;
|
|
257
|
-
for (let q = 0; q < count; q++, iTransform += 4) {
|
|
258
|
-
transformArgs = argsArray[iTransform];
|
|
259
|
-
positions[q << 1] = transformArgs[4];
|
|
260
|
-
positions[(q << 1) + 1] = transformArgs[5];
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Replace queue items.
|
|
264
|
-
fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
|
|
265
|
-
argsArray.splice(iFirstSave, count * 4, [
|
|
266
|
-
firstPIMXOArg0,
|
|
267
|
-
firstTransformArg0,
|
|
268
|
-
firstTransformArg1,
|
|
269
|
-
firstTransformArg2,
|
|
270
|
-
firstTransformArg3,
|
|
271
|
-
positions,
|
|
272
|
-
]);
|
|
273
|
-
} else {
|
|
274
|
-
count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
|
|
275
|
-
const images = [];
|
|
276
|
-
for (let q = 0; q < count; q++) {
|
|
277
|
-
transformArgs = argsArray[iFirstTransform + (q << 2)];
|
|
278
|
-
const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
|
|
279
|
-
images.push({
|
|
280
|
-
data: maskParams.data,
|
|
281
|
-
width: maskParams.width,
|
|
282
|
-
height: maskParams.height,
|
|
283
|
-
transform: transformArgs,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Replace queue items.
|
|
288
|
-
fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
|
|
289
|
-
argsArray.splice(iFirstSave, count * 4, [images]);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
return iFirstSave + 1;
|
|
293
|
-
}
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// This replaces (save, transform, paintImageXObject, restore)+ sequences
|
|
297
|
-
// with one paintImageXObjectRepeat operation, if the |transform| and
|
|
298
|
-
// |paintImageXObjectRepeat| ops are appropriate.
|
|
299
|
-
addState(
|
|
300
|
-
InitialState,
|
|
301
|
-
[OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],
|
|
302
|
-
function (context) {
|
|
303
|
-
const argsArray = context.argsArray;
|
|
304
|
-
const iFirstTransform = context.iCurr - 2;
|
|
305
|
-
return (
|
|
306
|
-
argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0
|
|
307
|
-
);
|
|
308
|
-
},
|
|
309
|
-
function iterateImageGroup(context, i) {
|
|
310
|
-
const fnArray = context.fnArray,
|
|
311
|
-
argsArray = context.argsArray;
|
|
312
|
-
const iFirstSave = context.iCurr - 3;
|
|
313
|
-
const pos = (i - iFirstSave) % 4;
|
|
314
|
-
switch (pos) {
|
|
315
|
-
case 0:
|
|
316
|
-
return fnArray[i] === OPS.save;
|
|
317
|
-
case 1:
|
|
318
|
-
if (fnArray[i] !== OPS.transform) {
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
const iFirstTransform = context.iCurr - 2;
|
|
322
|
-
const firstTransformArg0 = argsArray[iFirstTransform][0];
|
|
323
|
-
const firstTransformArg3 = argsArray[iFirstTransform][3];
|
|
324
|
-
if (
|
|
325
|
-
argsArray[i][0] !== firstTransformArg0 ||
|
|
326
|
-
argsArray[i][1] !== 0 ||
|
|
327
|
-
argsArray[i][2] !== 0 ||
|
|
328
|
-
argsArray[i][3] !== firstTransformArg3
|
|
329
|
-
) {
|
|
330
|
-
return false; // transforms don't match
|
|
331
|
-
}
|
|
332
|
-
return true;
|
|
333
|
-
case 2:
|
|
334
|
-
if (fnArray[i] !== OPS.paintImageXObject) {
|
|
335
|
-
return false;
|
|
336
|
-
}
|
|
337
|
-
const iFirstPIXO = context.iCurr - 1;
|
|
338
|
-
const firstPIXOArg0 = argsArray[iFirstPIXO][0];
|
|
339
|
-
if (argsArray[i][0] !== firstPIXOArg0) {
|
|
340
|
-
return false; // images don't match
|
|
341
|
-
}
|
|
342
|
-
return true;
|
|
343
|
-
case 3:
|
|
344
|
-
return fnArray[i] === OPS.restore;
|
|
345
|
-
}
|
|
346
|
-
throw new Error(`iterateImageGroup - invalid pos: ${pos}`);
|
|
347
|
-
},
|
|
348
|
-
function (context, i) {
|
|
349
|
-
const MIN_IMAGES_IN_BLOCK = 3;
|
|
350
|
-
const MAX_IMAGES_IN_BLOCK = 1000;
|
|
351
|
-
|
|
352
|
-
const fnArray = context.fnArray,
|
|
353
|
-
argsArray = context.argsArray;
|
|
354
|
-
const curr = context.iCurr;
|
|
355
|
-
const iFirstSave = curr - 3;
|
|
356
|
-
const iFirstTransform = curr - 2;
|
|
357
|
-
const iFirstPIXO = curr - 1;
|
|
358
|
-
const firstPIXOArg0 = argsArray[iFirstPIXO][0];
|
|
359
|
-
const firstTransformArg0 = argsArray[iFirstTransform][0];
|
|
360
|
-
const firstTransformArg3 = argsArray[iFirstTransform][3];
|
|
361
|
-
|
|
362
|
-
// At this point, i is the index of the first op past the last valid
|
|
363
|
-
// quartet.
|
|
364
|
-
const count = Math.min(
|
|
365
|
-
Math.floor((i - iFirstSave) / 4),
|
|
366
|
-
MAX_IMAGES_IN_BLOCK
|
|
367
|
-
);
|
|
368
|
-
if (count < MIN_IMAGES_IN_BLOCK) {
|
|
369
|
-
return i - ((i - iFirstSave) % 4);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
// Extract the (x,y) positions from all of the matching transforms.
|
|
373
|
-
const positions = new Float32Array(count * 2);
|
|
374
|
-
let iTransform = iFirstTransform;
|
|
375
|
-
for (let q = 0; q < count; q++, iTransform += 4) {
|
|
376
|
-
const transformArgs = argsArray[iTransform];
|
|
377
|
-
positions[q << 1] = transformArgs[4];
|
|
378
|
-
positions[(q << 1) + 1] = transformArgs[5];
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Replace queue items.
|
|
382
|
-
const args = [
|
|
383
|
-
firstPIXOArg0,
|
|
384
|
-
firstTransformArg0,
|
|
385
|
-
firstTransformArg3,
|
|
386
|
-
positions,
|
|
387
|
-
];
|
|
388
|
-
fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
|
|
389
|
-
argsArray.splice(iFirstSave, count * 4, args);
|
|
390
|
-
|
|
391
|
-
return iFirstSave + 1;
|
|
392
|
-
}
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
// This replaces (beginText, setFont, setTextMatrix, showText, endText)+
|
|
396
|
-
// sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+
|
|
397
|
-
// sequences, if the font for each one is the same.
|
|
398
|
-
addState(
|
|
399
|
-
InitialState,
|
|
400
|
-
[OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
|
|
401
|
-
null,
|
|
402
|
-
function iterateShowTextGroup(context, i) {
|
|
403
|
-
const fnArray = context.fnArray,
|
|
404
|
-
argsArray = context.argsArray;
|
|
405
|
-
const iFirstSave = context.iCurr - 4;
|
|
406
|
-
const pos = (i - iFirstSave) % 5;
|
|
407
|
-
switch (pos) {
|
|
408
|
-
case 0:
|
|
409
|
-
return fnArray[i] === OPS.beginText;
|
|
410
|
-
case 1:
|
|
411
|
-
return fnArray[i] === OPS.setFont;
|
|
412
|
-
case 2:
|
|
413
|
-
return fnArray[i] === OPS.setTextMatrix;
|
|
414
|
-
case 3:
|
|
415
|
-
if (fnArray[i] !== OPS.showText) {
|
|
416
|
-
return false;
|
|
417
|
-
}
|
|
418
|
-
const iFirstSetFont = context.iCurr - 3;
|
|
419
|
-
const firstSetFontArg0 = argsArray[iFirstSetFont][0];
|
|
420
|
-
const firstSetFontArg1 = argsArray[iFirstSetFont][1];
|
|
421
|
-
if (
|
|
422
|
-
argsArray[i][0] !== firstSetFontArg0 ||
|
|
423
|
-
argsArray[i][1] !== firstSetFontArg1
|
|
424
|
-
) {
|
|
425
|
-
return false; // fonts don't match
|
|
426
|
-
}
|
|
427
|
-
return true;
|
|
428
|
-
case 4:
|
|
429
|
-
return fnArray[i] === OPS.endText;
|
|
430
|
-
}
|
|
431
|
-
throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);
|
|
432
|
-
},
|
|
433
|
-
function (context, i) {
|
|
434
|
-
const MIN_CHARS_IN_BLOCK = 3;
|
|
435
|
-
const MAX_CHARS_IN_BLOCK = 1000;
|
|
436
|
-
|
|
437
|
-
const fnArray = context.fnArray,
|
|
438
|
-
argsArray = context.argsArray;
|
|
439
|
-
const curr = context.iCurr;
|
|
440
|
-
const iFirstBeginText = curr - 4;
|
|
441
|
-
const iFirstSetFont = curr - 3;
|
|
442
|
-
const iFirstSetTextMatrix = curr - 2;
|
|
443
|
-
const iFirstShowText = curr - 1;
|
|
444
|
-
const iFirstEndText = curr;
|
|
445
|
-
const firstSetFontArg0 = argsArray[iFirstSetFont][0];
|
|
446
|
-
const firstSetFontArg1 = argsArray[iFirstSetFont][1];
|
|
447
|
-
|
|
448
|
-
// At this point, i is the index of the first op past the last valid
|
|
449
|
-
// quintet.
|
|
450
|
-
let count = Math.min(
|
|
451
|
-
Math.floor((i - iFirstBeginText) / 5),
|
|
452
|
-
MAX_CHARS_IN_BLOCK
|
|
453
|
-
);
|
|
454
|
-
if (count < MIN_CHARS_IN_BLOCK) {
|
|
455
|
-
return i - ((i - iFirstBeginText) % 5);
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// If the preceding quintet is (<something>, setFont, setTextMatrix,
|
|
459
|
-
// showText, endText), include that as well. (E.g. <something> might be
|
|
460
|
-
// |dependency|.)
|
|
461
|
-
let iFirst = iFirstBeginText;
|
|
462
|
-
if (
|
|
463
|
-
iFirstBeginText >= 4 &&
|
|
464
|
-
fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&
|
|
465
|
-
fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&
|
|
466
|
-
fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&
|
|
467
|
-
fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&
|
|
468
|
-
argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&
|
|
469
|
-
argsArray[iFirstBeginText - 4][1] === firstSetFontArg1
|
|
470
|
-
) {
|
|
471
|
-
count++;
|
|
472
|
-
iFirst -= 5;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
// Remove (endText, beginText, setFont) trios.
|
|
476
|
-
let iEndText = iFirst + 4;
|
|
477
|
-
for (let q = 1; q < count; q++) {
|
|
478
|
-
fnArray.splice(iEndText, 3);
|
|
479
|
-
argsArray.splice(iEndText, 3);
|
|
480
|
-
iEndText += 2;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
return iEndText + 1;
|
|
484
|
-
}
|
|
485
|
-
);
|
|
486
|
-
|
|
487
|
-
class NullOptimizer {
|
|
488
|
-
constructor(queue) {
|
|
489
|
-
this.queue = queue;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
_optimize() {}
|
|
493
|
-
|
|
494
|
-
push(fn, args) {
|
|
495
|
-
this.queue.fnArray.push(fn);
|
|
496
|
-
this.queue.argsArray.push(args);
|
|
497
|
-
this._optimize();
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
flush() {}
|
|
501
|
-
|
|
502
|
-
reset() {}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
class QueueOptimizer extends NullOptimizer {
|
|
506
|
-
constructor(queue) {
|
|
507
|
-
super(queue);
|
|
508
|
-
this.state = null;
|
|
509
|
-
this.context = {
|
|
510
|
-
iCurr: 0,
|
|
511
|
-
fnArray: queue.fnArray,
|
|
512
|
-
argsArray: queue.argsArray,
|
|
513
|
-
};
|
|
514
|
-
this.match = null;
|
|
515
|
-
this.lastProcessed = 0;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
_optimize() {
|
|
519
|
-
// Process new fnArray item(s) chunk.
|
|
520
|
-
const fnArray = this.queue.fnArray;
|
|
521
|
-
let i = this.lastProcessed,
|
|
522
|
-
ii = fnArray.length;
|
|
523
|
-
let state = this.state;
|
|
524
|
-
let match = this.match;
|
|
525
|
-
if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
|
|
526
|
-
// Micro-optimization for the common case: last item is not
|
|
527
|
-
// optimizable, just skipping it.
|
|
528
|
-
this.lastProcessed = ii;
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
const context = this.context;
|
|
533
|
-
while (i < ii) {
|
|
534
|
-
if (match) {
|
|
535
|
-
// Already find a block of potentially optimizable items, iterating...
|
|
536
|
-
const iterate = (0, match.iterateFn)(context, i);
|
|
537
|
-
if (iterate) {
|
|
538
|
-
i++;
|
|
539
|
-
continue;
|
|
540
|
-
}
|
|
541
|
-
// Found last items for the block, processing...
|
|
542
|
-
i = (0, match.processFn)(context, i + 1);
|
|
543
|
-
ii = fnArray.length;
|
|
544
|
-
match = null;
|
|
545
|
-
state = null;
|
|
546
|
-
if (i >= ii) {
|
|
547
|
-
break;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
// Find the potentially optimizable items.
|
|
551
|
-
state = (state || InitialState)[fnArray[i]];
|
|
552
|
-
if (!state || Array.isArray(state)) {
|
|
553
|
-
i++;
|
|
554
|
-
continue;
|
|
555
|
-
}
|
|
556
|
-
// Found a start of the block based on addState rules.
|
|
557
|
-
context.iCurr = i;
|
|
558
|
-
i++;
|
|
559
|
-
if (state.checkFn && !(0, state.checkFn)(context)) {
|
|
560
|
-
// Check failed, continue search...
|
|
561
|
-
state = null;
|
|
562
|
-
continue;
|
|
563
|
-
}
|
|
564
|
-
match = state;
|
|
565
|
-
state = null;
|
|
566
|
-
}
|
|
567
|
-
this.state = state;
|
|
568
|
-
this.match = match;
|
|
569
|
-
this.lastProcessed = i;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
flush() {
|
|
573
|
-
while (this.match) {
|
|
574
|
-
const length = this.queue.fnArray.length;
|
|
575
|
-
this.lastProcessed = (0, this.match.processFn)(this.context, length);
|
|
576
|
-
this.match = null;
|
|
577
|
-
this.state = null;
|
|
578
|
-
// Repeat optimization until all chunks are exhausted.
|
|
579
|
-
this._optimize();
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
reset() {
|
|
584
|
-
this.state = null;
|
|
585
|
-
this.match = null;
|
|
586
|
-
this.lastProcessed = 0;
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
class OperatorList {
|
|
591
|
-
static get CHUNK_SIZE() {
|
|
592
|
-
return shadow(this, "CHUNK_SIZE", 1000);
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
// Close to chunk size.
|
|
596
|
-
static get CHUNK_SIZE_ABOUT() {
|
|
597
|
-
return shadow(this, "CHUNK_SIZE_ABOUT", this.CHUNK_SIZE - 5);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
constructor(intent, streamSink) {
|
|
601
|
-
this._streamSink = streamSink;
|
|
602
|
-
this.fnArray = [];
|
|
603
|
-
this.argsArray = [];
|
|
604
|
-
if (streamSink && !(intent && intent.startsWith("oplist-"))) {
|
|
605
|
-
this.optimizer = new QueueOptimizer(this);
|
|
606
|
-
} else {
|
|
607
|
-
this.optimizer = new NullOptimizer(this);
|
|
608
|
-
}
|
|
609
|
-
this.dependencies = new Set();
|
|
610
|
-
this._totalLength = 0;
|
|
611
|
-
this.weight = 0;
|
|
612
|
-
this._resolved = streamSink ? null : Promise.resolve();
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
get length() {
|
|
616
|
-
return this.argsArray.length;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
get ready() {
|
|
620
|
-
return this._resolved || this._streamSink.ready;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* @type {number} The total length of the entire operator list, since
|
|
625
|
-
* `this.length === 0` after flushing.
|
|
626
|
-
*/
|
|
627
|
-
get totalLength() {
|
|
628
|
-
return this._totalLength + this.length;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
addOp(fn, args) {
|
|
632
|
-
this.optimizer.push(fn, args);
|
|
633
|
-
this.weight++;
|
|
634
|
-
if (this._streamSink) {
|
|
635
|
-
if (this.weight >= OperatorList.CHUNK_SIZE) {
|
|
636
|
-
this.flush();
|
|
637
|
-
} else if (
|
|
638
|
-
this.weight >= OperatorList.CHUNK_SIZE_ABOUT &&
|
|
639
|
-
(fn === OPS.restore || fn === OPS.endText)
|
|
640
|
-
) {
|
|
641
|
-
// Heuristic to flush on boundary of restore or endText.
|
|
642
|
-
this.flush();
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
addDependency(dependency) {
|
|
648
|
-
if (this.dependencies.has(dependency)) {
|
|
649
|
-
return;
|
|
650
|
-
}
|
|
651
|
-
this.dependencies.add(dependency);
|
|
652
|
-
this.addOp(OPS.dependency, [dependency]);
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
addDependencies(dependencies) {
|
|
656
|
-
for (const dependency of dependencies) {
|
|
657
|
-
this.addDependency(dependency);
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
addOpList(opList) {
|
|
662
|
-
if (!(opList instanceof OperatorList)) {
|
|
663
|
-
warn('addOpList - ignoring invalid "opList" parameter.');
|
|
664
|
-
return;
|
|
665
|
-
}
|
|
666
|
-
for (const dependency of opList.dependencies) {
|
|
667
|
-
this.dependencies.add(dependency);
|
|
668
|
-
}
|
|
669
|
-
for (let i = 0, ii = opList.length; i < ii; i++) {
|
|
670
|
-
this.addOp(opList.fnArray[i], opList.argsArray[i]);
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
getIR() {
|
|
675
|
-
return {
|
|
676
|
-
fnArray: this.fnArray,
|
|
677
|
-
argsArray: this.argsArray,
|
|
678
|
-
length: this.length,
|
|
679
|
-
};
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
get _transfers() {
|
|
683
|
-
const transfers = [];
|
|
684
|
-
const { fnArray, argsArray, length } = this;
|
|
685
|
-
for (let i = 0; i < length; i++) {
|
|
686
|
-
switch (fnArray[i]) {
|
|
687
|
-
case OPS.paintInlineImageXObject:
|
|
688
|
-
case OPS.paintInlineImageXObjectGroup:
|
|
689
|
-
case OPS.paintImageMaskXObject:
|
|
690
|
-
const arg = argsArray[i][0]; // First parameter in imgData.
|
|
691
|
-
|
|
692
|
-
if (
|
|
693
|
-
typeof PDFJSDev === "undefined" ||
|
|
694
|
-
PDFJSDev.test("!PRODUCTION || TESTING")
|
|
695
|
-
) {
|
|
696
|
-
assert(
|
|
697
|
-
arg.data instanceof Uint8ClampedArray,
|
|
698
|
-
'OperatorList._transfers: Unsupported "arg.data" type.'
|
|
699
|
-
);
|
|
700
|
-
}
|
|
701
|
-
if (!arg.cached) {
|
|
702
|
-
transfers.push(arg.data.buffer);
|
|
703
|
-
}
|
|
704
|
-
break;
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
return transfers;
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
flush(lastChunk = false) {
|
|
711
|
-
this.optimizer.flush();
|
|
712
|
-
const length = this.length;
|
|
713
|
-
this._totalLength += length;
|
|
714
|
-
|
|
715
|
-
this._streamSink.enqueue(
|
|
716
|
-
{
|
|
717
|
-
fnArray: this.fnArray,
|
|
718
|
-
argsArray: this.argsArray,
|
|
719
|
-
lastChunk,
|
|
720
|
-
length,
|
|
721
|
-
},
|
|
722
|
-
1,
|
|
723
|
-
this._transfers
|
|
724
|
-
);
|
|
725
|
-
|
|
726
|
-
this.dependencies.clear();
|
|
727
|
-
this.fnArray.length = 0;
|
|
728
|
-
this.argsArray.length = 0;
|
|
729
|
-
this.weight = 0;
|
|
730
|
-
this.optimizer.reset();
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
export { OperatorList };
|