pdfjs-dist 2.0.489 → 2.2.228
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.
Potentially problematic release.
This version of pdfjs-dist might be problematic. Click here for more details.
- package/CODE_OF_CONDUCT.md +15 -0
- package/bower.json +1 -1
- package/build/pdf.js +18515 -11402
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +48266 -37137
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/external/url/url-lib.js +627 -0
- package/image_decoders/pdf.image_decoders.js +11350 -0
- package/image_decoders/pdf.image_decoders.js.map +1 -0
- package/image_decoders/pdf.image_decoders.min.js +1 -0
- package/lib/core/annotation.js +587 -242
- package/lib/core/arithmetic_decoder.js +275 -245
- package/lib/core/bidi.js +65 -6
- package/lib/core/ccitt.js +173 -18
- package/lib/core/ccitt_stream.js +15 -6
- package/lib/core/cff_parser.js +433 -61
- package/lib/core/charsets.js +5 -4
- package/lib/core/chunked_stream.js +400 -152
- package/lib/core/cmap.js +326 -87
- package/lib/core/colorspace.js +874 -594
- package/lib/core/core_utils.js +147 -0
- package/lib/core/crypto.js +290 -45
- package/lib/core/document.js +560 -268
- package/lib/core/encodings.js +19 -10
- package/lib/core/evaluator.js +1005 -360
- package/lib/core/font_renderer.js +331 -97
- package/lib/core/fonts.js +812 -195
- package/lib/core/function.js +284 -71
- package/lib/core/glyphlist.js +4 -3
- package/lib/core/image.js +169 -62
- package/lib/core/image_utils.js +111 -0
- package/lib/core/jbig2.js +479 -66
- package/lib/core/jbig2_stream.js +19 -8
- package/lib/core/jpeg_stream.js +38 -13
- package/lib/core/jpg.js +253 -29
- package/lib/core/jpx.js +396 -6
- package/lib/core/jpx_stream.js +18 -6
- package/lib/core/metrics.js +15 -15
- package/lib/core/murmurhash3.js +56 -34
- package/lib/core/obj.js +1354 -488
- package/lib/core/operator_list.js +144 -31
- package/lib/core/parser.js +539 -191
- package/lib/core/pattern.js +148 -14
- package/lib/core/pdf_manager.js +323 -133
- package/lib/core/primitives.js +111 -24
- package/lib/core/ps_parser.js +134 -45
- package/lib/core/standard_fonts.js +17 -17
- package/lib/core/stream.js +313 -34
- package/lib/core/type1_parser.js +143 -13
- package/lib/core/unicode.js +32 -5
- package/lib/core/worker.js +217 -190
- package/lib/core/worker_stream.js +277 -0
- package/lib/display/annotation_layer.js +450 -133
- package/lib/display/api.js +1597 -784
- package/lib/display/api_compatibility.js +11 -13
- package/lib/display/canvas.js +360 -44
- package/lib/display/content_disposition.js +83 -32
- package/lib/display/display_utils.js +747 -0
- package/lib/display/fetch_stream.js +221 -90
- package/lib/display/font_loader.js +468 -236
- package/lib/display/metadata.js +38 -16
- package/lib/display/network.js +635 -428
- package/lib/display/network_utils.js +32 -19
- package/lib/display/node_stream.js +367 -175
- package/lib/display/pattern_helper.js +81 -31
- package/lib/display/svg.js +1235 -519
- package/lib/display/text_layer.js +153 -29
- package/lib/display/transport_stream.js +345 -94
- package/lib/display/webgl.js +64 -18
- package/lib/display/worker_options.js +5 -4
- package/lib/display/xml_parser.js +166 -53
- package/lib/examples/node/domstubs.js +60 -4
- package/lib/pdf.js +36 -14
- package/lib/pdf.worker.js +5 -3
- package/lib/shared/compatibility.js +158 -564
- package/lib/shared/global_scope.js +2 -2
- package/lib/shared/is_node.js +4 -4
- package/lib/shared/message_handler.js +521 -0
- package/lib/shared/streams_polyfill.js +21 -17
- package/lib/shared/url_polyfill.js +56 -0
- package/lib/shared/util.js +243 -710
- package/lib/test/unit/annotation_spec.js +870 -401
- package/lib/test/unit/api_spec.js +657 -345
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +54 -11
- package/lib/test/unit/clitests_helper.js +10 -8
- package/lib/test/unit/cmap_spec.js +95 -41
- package/lib/test/unit/colorspace_spec.js +115 -63
- package/lib/test/unit/core_utils_spec.js +191 -0
- package/lib/test/unit/crypto_spec.js +17 -5
- package/lib/test/unit/custom_spec.js +43 -55
- package/lib/test/unit/display_svg_spec.js +34 -18
- package/lib/test/unit/display_utils_spec.js +273 -0
- package/lib/test/unit/document_spec.js +8 -13
- package/lib/test/unit/encodings_spec.js +25 -45
- package/lib/test/unit/evaluator_spec.js +38 -15
- package/lib/test/unit/fetch_stream_spec.js +109 -0
- package/lib/test/unit/function_spec.js +17 -5
- package/lib/test/unit/jasmine-boot.js +33 -20
- package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
- package/lib/test/unit/metadata_spec.js +71 -11
- package/lib/test/unit/murmurhash3_spec.js +3 -3
- package/lib/test/unit/network_spec.js +19 -54
- package/lib/test/unit/network_utils_spec.js +91 -14
- package/lib/test/unit/node_stream_spec.js +56 -32
- package/lib/test/unit/parser_spec.js +162 -71
- package/lib/test/unit/pdf_find_controller_spec.js +230 -0
- package/lib/test/unit/pdf_find_utils_spec.js +63 -0
- package/lib/test/unit/pdf_history_spec.js +21 -9
- package/lib/test/unit/primitives_spec.js +53 -20
- package/lib/test/unit/stream_spec.js +12 -4
- package/lib/test/unit/test_utils.js +273 -56
- package/lib/test/unit/testreporter.js +21 -3
- package/lib/test/unit/type1_parser_spec.js +8 -6
- package/lib/test/unit/ui_utils_spec.js +454 -16
- package/lib/test/unit/unicode_spec.js +18 -15
- package/lib/test/unit/util_spec.js +87 -128
- package/lib/web/annotation_layer_builder.js +39 -22
- package/lib/web/app.js +1290 -588
- package/lib/web/app_options.js +100 -62
- package/lib/web/base_viewer.js +511 -182
- package/lib/web/chromecom.js +261 -117
- package/lib/web/debugger.js +166 -22
- package/lib/web/download_manager.js +32 -13
- package/lib/web/firefox_print_service.js +20 -10
- package/lib/web/firefoxcom.js +315 -80
- package/lib/web/genericcom.js +89 -30
- package/lib/web/genericl10n.js +142 -30
- package/lib/web/grab_to_pan.js +28 -4
- package/lib/web/interfaces.js +170 -47
- package/lib/web/overlay_manager.js +235 -85
- package/lib/web/password_prompt.js +22 -14
- package/lib/web/pdf_attachment_viewer.js +38 -18
- package/lib/web/pdf_cursor_tools.js +39 -16
- package/lib/web/pdf_document_properties.js +255 -136
- package/lib/web/pdf_find_bar.js +84 -40
- package/lib/web/pdf_find_controller.js +495 -184
- package/lib/web/pdf_find_utils.js +111 -0
- package/lib/web/pdf_history.js +190 -53
- package/lib/web/pdf_link_service.js +138 -77
- package/lib/web/pdf_outline_viewer.js +122 -46
- package/lib/web/pdf_page_view.js +191 -67
- package/lib/web/pdf_presentation_mode.js +99 -34
- package/lib/web/pdf_print_service.js +61 -13
- package/lib/web/pdf_rendering_queue.js +28 -9
- package/lib/web/pdf_sidebar.js +141 -81
- package/lib/web/pdf_sidebar_resizer.js +42 -16
- package/lib/web/pdf_single_page_viewer.js +74 -66
- package/lib/web/pdf_thumbnail_view.js +104 -33
- package/lib/web/pdf_thumbnail_viewer.js +66 -26
- package/lib/web/pdf_viewer.component.js +112 -32
- package/lib/web/pdf_viewer.js +91 -52
- package/lib/web/preferences.js +284 -89
- package/lib/web/secondary_toolbar.js +165 -40
- package/lib/web/text_layer_builder.js +134 -59
- package/lib/web/toolbar.js +78 -43
- package/lib/web/ui_utils.js +462 -136
- package/lib/web/view_history.js +215 -67
- package/lib/web/viewer_compatibility.js +4 -13
- package/package.json +5 -4
- package/web/pdf_viewer.css +79 -11
- package/web/pdf_viewer.js +6107 -3748
- package/web/pdf_viewer.js.map +1 -1
- package/lib/display/dom_utils.js +0 -309
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/test/unit/fonts_spec.js +0 -81
- package/lib/web/dom_events.js +0 -137
package/lib/core/type1_parser.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @licstart The following is the entire license notice for the
|
3
3
|
* Javascript code in this page
|
4
4
|
*
|
5
|
-
* Copyright
|
5
|
+
* Copyright 2019 Mozilla Foundation
|
6
6
|
*
|
7
7
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
8
|
* you may not use this file except in compliance with the License.
|
@@ -19,20 +19,21 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
24
|
Object.defineProperty(exports, "__esModule", {
|
25
25
|
value: true
|
26
26
|
});
|
27
|
-
exports.Type1Parser =
|
27
|
+
exports.Type1Parser = void 0;
|
28
28
|
|
29
|
-
var _util = require(
|
29
|
+
var _util = require("../shared/util");
|
30
30
|
|
31
|
-
var _encodings = require(
|
31
|
+
var _encodings = require("./encodings");
|
32
32
|
|
33
|
-
var _stream = require(
|
33
|
+
var _stream = require("./stream");
|
34
34
|
|
35
35
|
var HINTING_ENABLED = false;
|
36
|
+
|
36
37
|
var Type1CharString = function Type1CharStringClosure() {
|
37
38
|
var COMMAND_MAP = {
|
38
39
|
'hstem': [1],
|
@@ -51,6 +52,7 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
51
52
|
'vhcurveto': [30],
|
52
53
|
'hvcurveto': [31]
|
53
54
|
};
|
55
|
+
|
54
56
|
function Type1CharString() {
|
55
57
|
this.width = 0;
|
56
58
|
this.lsb = 0;
|
@@ -58,78 +60,100 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
58
60
|
this.output = [];
|
59
61
|
this.stack = [];
|
60
62
|
}
|
63
|
+
|
61
64
|
Type1CharString.prototype = {
|
62
65
|
convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {
|
63
66
|
var count = encoded.length;
|
64
67
|
var error = false;
|
65
68
|
var wx, sbx, subrNumber;
|
69
|
+
|
66
70
|
for (var i = 0; i < count; i++) {
|
67
71
|
var value = encoded[i];
|
72
|
+
|
68
73
|
if (value < 32) {
|
69
74
|
if (value === 12) {
|
70
75
|
value = (value << 8) + encoded[++i];
|
71
76
|
}
|
77
|
+
|
72
78
|
switch (value) {
|
73
79
|
case 1:
|
74
80
|
if (!HINTING_ENABLED) {
|
75
81
|
this.stack = [];
|
76
82
|
break;
|
77
83
|
}
|
84
|
+
|
78
85
|
error = this.executeCommand(2, COMMAND_MAP.hstem);
|
79
86
|
break;
|
87
|
+
|
80
88
|
case 3:
|
81
89
|
if (!HINTING_ENABLED) {
|
82
90
|
this.stack = [];
|
83
91
|
break;
|
84
92
|
}
|
93
|
+
|
85
94
|
error = this.executeCommand(2, COMMAND_MAP.vstem);
|
86
95
|
break;
|
96
|
+
|
87
97
|
case 4:
|
88
98
|
if (this.flexing) {
|
89
99
|
if (this.stack.length < 1) {
|
90
100
|
error = true;
|
91
101
|
break;
|
92
102
|
}
|
103
|
+
|
93
104
|
var dy = this.stack.pop();
|
94
105
|
this.stack.push(0, dy);
|
95
106
|
break;
|
96
107
|
}
|
108
|
+
|
97
109
|
error = this.executeCommand(1, COMMAND_MAP.vmoveto);
|
98
110
|
break;
|
111
|
+
|
99
112
|
case 5:
|
100
113
|
error = this.executeCommand(2, COMMAND_MAP.rlineto);
|
101
114
|
break;
|
115
|
+
|
102
116
|
case 6:
|
103
117
|
error = this.executeCommand(1, COMMAND_MAP.hlineto);
|
104
118
|
break;
|
119
|
+
|
105
120
|
case 7:
|
106
121
|
error = this.executeCommand(1, COMMAND_MAP.vlineto);
|
107
122
|
break;
|
123
|
+
|
108
124
|
case 8:
|
109
125
|
error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
|
110
126
|
break;
|
127
|
+
|
111
128
|
case 9:
|
112
129
|
this.stack = [];
|
113
130
|
break;
|
131
|
+
|
114
132
|
case 10:
|
115
133
|
if (this.stack.length < 1) {
|
116
134
|
error = true;
|
117
135
|
break;
|
118
136
|
}
|
137
|
+
|
119
138
|
subrNumber = this.stack.pop();
|
139
|
+
|
120
140
|
if (!subrs[subrNumber]) {
|
121
141
|
error = true;
|
122
142
|
break;
|
123
143
|
}
|
144
|
+
|
124
145
|
error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);
|
125
146
|
break;
|
147
|
+
|
126
148
|
case 11:
|
127
149
|
return error;
|
150
|
+
|
128
151
|
case 13:
|
129
152
|
if (this.stack.length < 2) {
|
130
153
|
error = true;
|
131
154
|
break;
|
132
155
|
}
|
156
|
+
|
133
157
|
wx = this.stack.pop();
|
134
158
|
sbx = this.stack.pop();
|
135
159
|
this.lsb = sbx;
|
@@ -137,45 +161,58 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
137
161
|
this.stack.push(wx, sbx);
|
138
162
|
error = this.executeCommand(2, COMMAND_MAP.hmoveto);
|
139
163
|
break;
|
164
|
+
|
140
165
|
case 14:
|
141
166
|
this.output.push(COMMAND_MAP.endchar[0]);
|
142
167
|
break;
|
168
|
+
|
143
169
|
case 21:
|
144
170
|
if (this.flexing) {
|
145
171
|
break;
|
146
172
|
}
|
173
|
+
|
147
174
|
error = this.executeCommand(2, COMMAND_MAP.rmoveto);
|
148
175
|
break;
|
176
|
+
|
149
177
|
case 22:
|
150
178
|
if (this.flexing) {
|
151
179
|
this.stack.push(0);
|
152
180
|
break;
|
153
181
|
}
|
182
|
+
|
154
183
|
error = this.executeCommand(1, COMMAND_MAP.hmoveto);
|
155
184
|
break;
|
185
|
+
|
156
186
|
case 30:
|
157
187
|
error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
|
158
188
|
break;
|
189
|
+
|
159
190
|
case 31:
|
160
191
|
error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
|
161
192
|
break;
|
193
|
+
|
162
194
|
case (12 << 8) + 0:
|
163
195
|
this.stack = [];
|
164
196
|
break;
|
197
|
+
|
165
198
|
case (12 << 8) + 1:
|
166
199
|
if (!HINTING_ENABLED) {
|
167
200
|
this.stack = [];
|
168
201
|
break;
|
169
202
|
}
|
203
|
+
|
170
204
|
error = this.executeCommand(2, COMMAND_MAP.vstem);
|
171
205
|
break;
|
206
|
+
|
172
207
|
case (12 << 8) + 2:
|
173
208
|
if (!HINTING_ENABLED) {
|
174
209
|
this.stack = [];
|
175
210
|
break;
|
176
211
|
}
|
212
|
+
|
177
213
|
error = this.executeCommand(2, COMMAND_MAP.hstem);
|
178
214
|
break;
|
215
|
+
|
179
216
|
case (12 << 8) + 6:
|
180
217
|
if (seacAnalysisEnabled) {
|
181
218
|
this.seac = this.stack.splice(-4, 4);
|
@@ -183,12 +220,15 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
183
220
|
} else {
|
184
221
|
error = this.executeCommand(4, COMMAND_MAP.endchar);
|
185
222
|
}
|
223
|
+
|
186
224
|
break;
|
225
|
+
|
187
226
|
case (12 << 8) + 7:
|
188
227
|
if (this.stack.length < 4) {
|
189
228
|
error = true;
|
190
229
|
break;
|
191
230
|
}
|
231
|
+
|
192
232
|
this.stack.pop();
|
193
233
|
wx = this.stack.pop();
|
194
234
|
var sby = this.stack.pop();
|
@@ -198,22 +238,27 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
198
238
|
this.stack.push(wx, sbx, sby);
|
199
239
|
error = this.executeCommand(3, COMMAND_MAP.rmoveto);
|
200
240
|
break;
|
241
|
+
|
201
242
|
case (12 << 8) + 12:
|
202
243
|
if (this.stack.length < 2) {
|
203
244
|
error = true;
|
204
245
|
break;
|
205
246
|
}
|
247
|
+
|
206
248
|
var num2 = this.stack.pop();
|
207
249
|
var num1 = this.stack.pop();
|
208
250
|
this.stack.push(num1 / num2);
|
209
251
|
break;
|
252
|
+
|
210
253
|
case (12 << 8) + 16:
|
211
254
|
if (this.stack.length < 2) {
|
212
255
|
error = true;
|
213
256
|
break;
|
214
257
|
}
|
258
|
+
|
215
259
|
subrNumber = this.stack.pop();
|
216
260
|
var numArgs = this.stack.pop();
|
261
|
+
|
217
262
|
if (subrNumber === 0 && numArgs === 3) {
|
218
263
|
var flexArgs = this.stack.splice(this.stack.length - 17, 17);
|
219
264
|
this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);
|
@@ -223,19 +268,25 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
223
268
|
} else if (subrNumber === 1 && numArgs === 0) {
|
224
269
|
this.flexing = true;
|
225
270
|
}
|
271
|
+
|
226
272
|
break;
|
273
|
+
|
227
274
|
case (12 << 8) + 17:
|
228
275
|
break;
|
276
|
+
|
229
277
|
case (12 << 8) + 33:
|
230
278
|
this.stack = [];
|
231
279
|
break;
|
280
|
+
|
232
281
|
default:
|
233
282
|
(0, _util.warn)('Unknown type 1 charstring command of "' + value + '"');
|
234
283
|
break;
|
235
284
|
}
|
285
|
+
|
236
286
|
if (error) {
|
237
287
|
break;
|
238
288
|
}
|
289
|
+
|
239
290
|
continue;
|
240
291
|
} else if (value <= 246) {
|
241
292
|
value = value - 139;
|
@@ -246,18 +297,24 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
246
297
|
} else {
|
247
298
|
value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
|
248
299
|
}
|
300
|
+
|
249
301
|
this.stack.push(value);
|
250
302
|
}
|
303
|
+
|
251
304
|
return error;
|
252
305
|
},
|
253
306
|
executeCommand: function executeCommand(howManyArgs, command, keepStack) {
|
254
307
|
var stackLength = this.stack.length;
|
308
|
+
|
255
309
|
if (howManyArgs > stackLength) {
|
256
310
|
return true;
|
257
311
|
}
|
312
|
+
|
258
313
|
var start = stackLength - howManyArgs;
|
314
|
+
|
259
315
|
for (var i = start; i < stackLength; i++) {
|
260
316
|
var value = this.stack[i];
|
317
|
+
|
261
318
|
if (Number.isInteger(value)) {
|
262
319
|
this.output.push(28, value >> 8 & 0xff, value & 0xff);
|
263
320
|
} else {
|
@@ -265,44 +322,56 @@ var Type1CharString = function Type1CharStringClosure() {
|
|
265
322
|
this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF);
|
266
323
|
}
|
267
324
|
}
|
325
|
+
|
268
326
|
this.output.push.apply(this.output, command);
|
327
|
+
|
269
328
|
if (keepStack) {
|
270
329
|
this.stack.splice(start, howManyArgs);
|
271
330
|
} else {
|
272
331
|
this.stack.length = 0;
|
273
332
|
}
|
333
|
+
|
274
334
|
return false;
|
275
335
|
}
|
276
336
|
};
|
277
337
|
return Type1CharString;
|
278
338
|
}();
|
339
|
+
|
279
340
|
var Type1Parser = function Type1ParserClosure() {
|
280
341
|
var EEXEC_ENCRYPT_KEY = 55665;
|
281
342
|
var CHAR_STRS_ENCRYPT_KEY = 4330;
|
343
|
+
|
282
344
|
function isHexDigit(code) {
|
283
345
|
return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
|
284
346
|
}
|
347
|
+
|
285
348
|
function decrypt(data, key, discardNumber) {
|
286
349
|
if (discardNumber >= data.length) {
|
287
350
|
return new Uint8Array(0);
|
288
351
|
}
|
352
|
+
|
289
353
|
var r = key | 0,
|
290
354
|
c1 = 52845,
|
291
355
|
c2 = 22719,
|
292
356
|
i,
|
293
357
|
j;
|
358
|
+
|
294
359
|
for (i = 0; i < discardNumber; i++) {
|
295
360
|
r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
|
296
361
|
}
|
362
|
+
|
297
363
|
var count = data.length - discardNumber;
|
298
364
|
var decrypted = new Uint8Array(count);
|
365
|
+
|
299
366
|
for (i = discardNumber, j = 0; j < count; i++, j++) {
|
300
367
|
var value = data[i];
|
301
368
|
decrypted[j] = value ^ r >> 8;
|
302
369
|
r = (value + r) * c1 + c2 & (1 << 16) - 1;
|
303
370
|
}
|
371
|
+
|
304
372
|
return decrypted;
|
305
373
|
}
|
374
|
+
|
306
375
|
function decryptAscii(data, key, discardNumber) {
|
307
376
|
var r = key | 0,
|
308
377
|
c1 = 52845,
|
@@ -311,48 +380,62 @@ var Type1Parser = function Type1ParserClosure() {
|
|
311
380
|
maybeLength = count >>> 1;
|
312
381
|
var decrypted = new Uint8Array(maybeLength);
|
313
382
|
var i, j;
|
383
|
+
|
314
384
|
for (i = 0, j = 0; i < count; i++) {
|
315
385
|
var digit1 = data[i];
|
386
|
+
|
316
387
|
if (!isHexDigit(digit1)) {
|
317
388
|
continue;
|
318
389
|
}
|
390
|
+
|
319
391
|
i++;
|
320
392
|
var digit2;
|
393
|
+
|
321
394
|
while (i < count && !isHexDigit(digit2 = data[i])) {
|
322
395
|
i++;
|
323
396
|
}
|
397
|
+
|
324
398
|
if (i < count) {
|
325
399
|
var value = parseInt(String.fromCharCode(digit1, digit2), 16);
|
326
400
|
decrypted[j++] = value ^ r >> 8;
|
327
401
|
r = (value + r) * c1 + c2 & (1 << 16) - 1;
|
328
402
|
}
|
329
403
|
}
|
404
|
+
|
330
405
|
return Array.prototype.slice.call(decrypted, discardNumber, j);
|
331
406
|
}
|
407
|
+
|
332
408
|
function isSpecial(c) {
|
333
409
|
return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29;
|
334
410
|
}
|
411
|
+
|
335
412
|
function Type1Parser(stream, encrypted, seacAnalysisEnabled) {
|
336
413
|
if (encrypted) {
|
337
414
|
var data = stream.getBytes();
|
338
415
|
var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]));
|
339
416
|
stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
|
340
417
|
}
|
418
|
+
|
341
419
|
this.seacAnalysisEnabled = !!seacAnalysisEnabled;
|
342
420
|
this.stream = stream;
|
343
421
|
this.nextChar();
|
344
422
|
}
|
423
|
+
|
345
424
|
Type1Parser.prototype = {
|
346
425
|
readNumberArray: function Type1Parser_readNumberArray() {
|
347
426
|
this.getToken();
|
348
427
|
var array = [];
|
428
|
+
|
349
429
|
while (true) {
|
350
430
|
var token = this.getToken();
|
431
|
+
|
351
432
|
if (token === null || token === ']' || token === '}') {
|
352
433
|
break;
|
353
434
|
}
|
435
|
+
|
354
436
|
array.push(parseFloat(token || 0));
|
355
437
|
}
|
438
|
+
|
356
439
|
return array;
|
357
440
|
},
|
358
441
|
readNumber: function Type1Parser_readNumber() {
|
@@ -373,10 +456,12 @@ var Type1Parser = function Type1ParserClosure() {
|
|
373
456
|
getToken: function Type1Parser_getToken() {
|
374
457
|
var comment = false;
|
375
458
|
var ch = this.currentChar;
|
459
|
+
|
376
460
|
while (true) {
|
377
461
|
if (ch === -1) {
|
378
462
|
return null;
|
379
463
|
}
|
464
|
+
|
380
465
|
if (comment) {
|
381
466
|
if (ch === 0x0A || ch === 0x0D) {
|
382
467
|
comment = false;
|
@@ -386,23 +471,29 @@ var Type1Parser = function Type1ParserClosure() {
|
|
386
471
|
} else if (!(0, _util.isSpace)(ch)) {
|
387
472
|
break;
|
388
473
|
}
|
474
|
+
|
389
475
|
ch = this.nextChar();
|
390
476
|
}
|
477
|
+
|
391
478
|
if (isSpecial(ch)) {
|
392
479
|
this.nextChar();
|
393
480
|
return String.fromCharCode(ch);
|
394
481
|
}
|
482
|
+
|
395
483
|
var token = '';
|
484
|
+
|
396
485
|
do {
|
397
486
|
token += String.fromCharCode(ch);
|
398
487
|
ch = this.nextChar();
|
399
488
|
} while (ch >= 0 && !(0, _util.isSpace)(ch) && !isSpecial(ch));
|
489
|
+
|
400
490
|
return token;
|
401
491
|
},
|
402
492
|
readCharStrings: function Type1Parser_readCharStrings(bytes, lenIV) {
|
403
493
|
if (lenIV === -1) {
|
404
494
|
return bytes;
|
405
495
|
}
|
496
|
+
|
406
497
|
return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
|
407
498
|
},
|
408
499
|
extractFontProgram: function Type1Parser_extractFontProgram() {
|
@@ -414,82 +505,103 @@ var Type1Parser = function Type1ParserClosure() {
|
|
414
505
|
var program = {
|
415
506
|
subrs: [],
|
416
507
|
charstrings: [],
|
417
|
-
properties: {
|
508
|
+
properties: {
|
509
|
+
'privateData': privateData
|
510
|
+
}
|
418
511
|
};
|
419
512
|
var token, length, data, lenIV, encoded;
|
513
|
+
|
420
514
|
while ((token = this.getToken()) !== null) {
|
421
515
|
if (token !== '/') {
|
422
516
|
continue;
|
423
517
|
}
|
518
|
+
|
424
519
|
token = this.getToken();
|
520
|
+
|
425
521
|
switch (token) {
|
426
522
|
case 'CharStrings':
|
427
523
|
this.getToken();
|
428
524
|
this.getToken();
|
429
525
|
this.getToken();
|
430
526
|
this.getToken();
|
527
|
+
|
431
528
|
while (true) {
|
432
529
|
token = this.getToken();
|
530
|
+
|
433
531
|
if (token === null || token === 'end') {
|
434
532
|
break;
|
435
533
|
}
|
534
|
+
|
436
535
|
if (token !== '/') {
|
437
536
|
continue;
|
438
537
|
}
|
538
|
+
|
439
539
|
var glyph = this.getToken();
|
440
540
|
length = this.readInt();
|
441
541
|
this.getToken();
|
442
|
-
data = stream.
|
542
|
+
data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
|
443
543
|
lenIV = program.properties.privateData['lenIV'];
|
444
|
-
encoded = this.readCharStrings(data
|
445
|
-
stream.skip(length);
|
544
|
+
encoded = this.readCharStrings(data, lenIV);
|
446
545
|
this.nextChar();
|
447
546
|
token = this.getToken();
|
547
|
+
|
448
548
|
if (token === 'noaccess') {
|
449
549
|
this.getToken();
|
450
550
|
}
|
551
|
+
|
451
552
|
charstrings.push({
|
452
553
|
glyph: glyph,
|
453
554
|
encoded: encoded
|
454
555
|
});
|
455
556
|
}
|
557
|
+
|
456
558
|
break;
|
559
|
+
|
457
560
|
case 'Subrs':
|
458
561
|
this.readInt();
|
459
562
|
this.getToken();
|
563
|
+
|
460
564
|
while (this.getToken() === 'dup') {
|
461
565
|
var index = this.readInt();
|
462
566
|
length = this.readInt();
|
463
567
|
this.getToken();
|
464
|
-
data = stream.
|
568
|
+
data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
|
465
569
|
lenIV = program.properties.privateData['lenIV'];
|
466
|
-
encoded = this.readCharStrings(data
|
467
|
-
stream.skip(length);
|
570
|
+
encoded = this.readCharStrings(data, lenIV);
|
468
571
|
this.nextChar();
|
469
572
|
token = this.getToken();
|
573
|
+
|
470
574
|
if (token === 'noaccess') {
|
471
575
|
this.getToken();
|
472
576
|
}
|
577
|
+
|
473
578
|
subrs[index] = encoded;
|
474
579
|
}
|
580
|
+
|
475
581
|
break;
|
582
|
+
|
476
583
|
case 'BlueValues':
|
477
584
|
case 'OtherBlues':
|
478
585
|
case 'FamilyBlues':
|
479
586
|
case 'FamilyOtherBlues':
|
480
587
|
var blueArray = this.readNumberArray();
|
588
|
+
|
481
589
|
if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
|
482
590
|
program.properties.privateData[token] = blueArray;
|
483
591
|
}
|
592
|
+
|
484
593
|
break;
|
594
|
+
|
485
595
|
case 'StemSnapH':
|
486
596
|
case 'StemSnapV':
|
487
597
|
program.properties.privateData[token] = this.readNumberArray();
|
488
598
|
break;
|
599
|
+
|
489
600
|
case 'StdHW':
|
490
601
|
case 'StdVW':
|
491
602
|
program.properties.privateData[token] = this.readNumberArray()[0];
|
492
603
|
break;
|
604
|
+
|
493
605
|
case 'BlueShift':
|
494
606
|
case 'lenIV':
|
495
607
|
case 'BlueFuzz':
|
@@ -498,20 +610,24 @@ var Type1Parser = function Type1ParserClosure() {
|
|
498
610
|
case 'ExpansionFactor':
|
499
611
|
program.properties.privateData[token] = this.readNumber();
|
500
612
|
break;
|
613
|
+
|
501
614
|
case 'ForceBold':
|
502
615
|
program.properties.privateData[token] = this.readBoolean();
|
503
616
|
break;
|
504
617
|
}
|
505
618
|
}
|
619
|
+
|
506
620
|
for (var i = 0; i < charstrings.length; i++) {
|
507
621
|
glyph = charstrings[i].glyph;
|
508
622
|
encoded = charstrings[i].encoded;
|
509
623
|
var charString = new Type1CharString();
|
510
624
|
var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
|
511
625
|
var output = charString.output;
|
626
|
+
|
512
627
|
if (error) {
|
513
628
|
output = [14];
|
514
629
|
}
|
630
|
+
|
515
631
|
program.charstrings.push({
|
516
632
|
glyphName: glyph,
|
517
633
|
charstring: output,
|
@@ -520,40 +636,51 @@ var Type1Parser = function Type1ParserClosure() {
|
|
520
636
|
seac: charString.seac
|
521
637
|
});
|
522
638
|
}
|
639
|
+
|
523
640
|
return program;
|
524
641
|
},
|
525
642
|
extractFontHeader: function Type1Parser_extractFontHeader(properties) {
|
526
643
|
var token;
|
644
|
+
|
527
645
|
while ((token = this.getToken()) !== null) {
|
528
646
|
if (token !== '/') {
|
529
647
|
continue;
|
530
648
|
}
|
649
|
+
|
531
650
|
token = this.getToken();
|
651
|
+
|
532
652
|
switch (token) {
|
533
653
|
case 'FontMatrix':
|
534
654
|
var matrix = this.readNumberArray();
|
535
655
|
properties.fontMatrix = matrix;
|
536
656
|
break;
|
657
|
+
|
537
658
|
case 'Encoding':
|
538
659
|
var encodingArg = this.getToken();
|
539
660
|
var encoding;
|
661
|
+
|
540
662
|
if (!/^\d+$/.test(encodingArg)) {
|
541
663
|
encoding = (0, _encodings.getEncoding)(encodingArg);
|
542
664
|
} else {
|
543
665
|
encoding = [];
|
544
666
|
var size = parseInt(encodingArg, 10) | 0;
|
545
667
|
this.getToken();
|
668
|
+
|
546
669
|
for (var j = 0; j < size; j++) {
|
547
670
|
token = this.getToken();
|
671
|
+
|
548
672
|
while (token !== 'dup' && token !== 'def') {
|
549
673
|
token = this.getToken();
|
674
|
+
|
550
675
|
if (token === null) {
|
551
676
|
return;
|
552
677
|
}
|
553
678
|
}
|
679
|
+
|
554
680
|
if (token === 'def') {
|
555
681
|
break;
|
556
682
|
}
|
683
|
+
|
557
684
|
var index = this.readInt();
|
558
685
|
this.getToken();
|
559
686
|
var glyph = this.getToken();
|
@@ -561,8 +688,10 @@ var Type1Parser = function Type1ParserClosure() {
|
|
561
688
|
this.getToken();
|
562
689
|
}
|
563
690
|
}
|
691
|
+
|
564
692
|
properties.builtInEncoding = encoding;
|
565
693
|
break;
|
694
|
+
|
566
695
|
case 'FontBBox':
|
567
696
|
var fontBBox = this.readNumberArray();
|
568
697
|
properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
|
@@ -575,4 +704,5 @@ var Type1Parser = function Type1ParserClosure() {
|
|
575
704
|
};
|
576
705
|
return Type1Parser;
|
577
706
|
}();
|
707
|
+
|
578
708
|
exports.Type1Parser = Type1Parser;
|