scrivito_pdf_widget 1.0.2 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b13dc1d75f2be41e699aee31c3781ed4d3045d6
4
- data.tar.gz: 1e7d29a1d19490e41b6bce84d3717d18472ed427
3
+ metadata.gz: 9978c3c80af00d2aae10f8f04dad11e76a258179
4
+ data.tar.gz: 783bcc8fefd36ffaebb595fe74463f3386dadb06
5
5
  SHA512:
6
- metadata.gz: c25e6b69b108a19efa3f1da69015f957ec628c7c02c9ddd159d6072c81f912b7e28ce2d3c8c2e0f34c62d9d3c4844696a68da36f4c5c3c11bd7164c8a753dd19
7
- data.tar.gz: d33e9423e6c3fd17924c0060c99656bb21954bfdfc0dc92a78a003a4e2a93f08d8dea584122fd924206c30c983bfdcc3bc4a26316cf5b9a0afbf3a5769415038
6
+ metadata.gz: f0e03bf0a575edbd0f796bc3a34741ecb23a4c79777dab1fd49da6a3146d63e82f6a3ccb9670942ea33643955d7d9b67f9fdca3d42d2fae4b9452bbc43e32f85
7
+ data.tar.gz: eeb699e2101a2882c868b5bfad848428db8bf9c250c04bf69be9b87a861e9428a02dca70552dcd032c7b3ab9536acc4e8593d37efebcdbb48e6a4004ff517363
@@ -0,0 +1,4 @@
1
+ //= require scrivito_pdf_widget/pdf
2
+ //= require scrivito_pdf_widget/jquery.viewer
3
+ //= require scrivito_pdf_widget/widget
4
+ //= require scrivito_pdf_widget/editing
@@ -10,6 +10,6 @@
10
10
  // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
11
  // GO AFTER THE REQUIRES BELOW.
12
12
  //
13
- //= require pdf_widget/pdf
14
- //= require pdf_widget/jquery.viewer
15
- //= require pdf_widget/widget
13
+ //= require ./pdf
14
+ //= require ./jquery.viewer
15
+ //= require ./widget
@@ -2,7 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  $(function() {
5
- scrivito.content_browser.filter_defaults.upload['pdf/*'] = 'Pdf';
5
+ scrivito.register_default_obj_class_for_content_type({
6
+ 'application/pdf': 'Pdf'
7
+ })
6
8
 
7
9
  scrivito.content_browser.filters.pdfs = {
8
10
  'title': 'PDF',
@@ -15,14 +15,15 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  /*jshint globalstrict: false */
18
+ /* globals PDFJS */
18
19
 
19
20
  // Initializing PDFJS global object (if still undefined)
20
21
  if (typeof PDFJS === 'undefined') {
21
22
  (typeof window !== 'undefined' ? window : this).PDFJS = {};
22
23
  }
23
24
 
24
- PDFJS.version = '1.0.473';
25
- PDFJS.build = '1694cd8';
25
+ PDFJS.version = '1.0.1040';
26
+ PDFJS.build = '997096f';
26
27
 
27
28
  (function pdfjsWrapper() {
28
29
  // Use strict in our context only - users might not want it
@@ -51,7 +52,7 @@ PDFJS.build = '1694cd8';
51
52
 
52
53
  var globalScope = (typeof window === 'undefined') ? this : window;
53
54
 
54
- var isWorker = (typeof window == 'undefined');
55
+ var isWorker = (typeof window === 'undefined');
55
56
 
56
57
  var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
57
58
 
@@ -302,7 +303,7 @@ function combineUrl(baseUrl, url) {
302
303
  return url;
303
304
  }
304
305
  var i;
305
- if (url.charAt(0) == '/') {
306
+ if (url.charAt(0) === '/') {
306
307
  // absolute path
307
308
  i = baseUrl.indexOf('://');
308
309
  if (url.charAt(1) === '/') {
@@ -372,6 +373,7 @@ var PasswordException = (function PasswordExceptionClosure() {
372
373
 
373
374
  return PasswordException;
374
375
  })();
376
+ PDFJS.PasswordException = PasswordException;
375
377
 
376
378
  var UnknownErrorException = (function UnknownErrorExceptionClosure() {
377
379
  function UnknownErrorException(msg, details) {
@@ -385,6 +387,7 @@ var UnknownErrorException = (function UnknownErrorExceptionClosure() {
385
387
 
386
388
  return UnknownErrorException;
387
389
  })();
390
+ PDFJS.UnknownErrorException = UnknownErrorException;
388
391
 
389
392
  var InvalidPDFException = (function InvalidPDFExceptionClosure() {
390
393
  function InvalidPDFException(msg) {
@@ -397,6 +400,7 @@ var InvalidPDFException = (function InvalidPDFExceptionClosure() {
397
400
 
398
401
  return InvalidPDFException;
399
402
  })();
403
+ PDFJS.InvalidPDFException = InvalidPDFException;
400
404
 
401
405
  var MissingPDFException = (function MissingPDFExceptionClosure() {
402
406
  function MissingPDFException(msg) {
@@ -409,6 +413,22 @@ var MissingPDFException = (function MissingPDFExceptionClosure() {
409
413
 
410
414
  return MissingPDFException;
411
415
  })();
416
+ PDFJS.MissingPDFException = MissingPDFException;
417
+
418
+ var UnexpectedResponseException =
419
+ (function UnexpectedResponseExceptionClosure() {
420
+ function UnexpectedResponseException(msg, status) {
421
+ this.name = 'UnexpectedResponseException';
422
+ this.message = msg;
423
+ this.status = status;
424
+ }
425
+
426
+ UnexpectedResponseException.prototype = new Error();
427
+ UnexpectedResponseException.constructor = UnexpectedResponseException;
428
+
429
+ return UnexpectedResponseException;
430
+ })();
431
+ PDFJS.UnexpectedResponseException = UnexpectedResponseException;
412
432
 
413
433
  var NotImplementedException = (function NotImplementedExceptionClosure() {
414
434
  function NotImplementedException(msg) {
@@ -464,15 +484,6 @@ function bytesToString(bytes) {
464
484
  return strBuf.join('');
465
485
  }
466
486
 
467
- function stringToArray(str) {
468
- var length = str.length;
469
- var array = [];
470
- for (var i = 0; i < length; ++i) {
471
- array[i] = str.charCodeAt(i);
472
- }
473
- return array;
474
- }
475
-
476
487
  function stringToBytes(str) {
477
488
  var length = str.length;
478
489
  var bytes = new Uint8Array(length);
@@ -590,10 +601,10 @@ var Util = PDFJS.Util = (function UtilClosure() {
590
601
 
591
602
  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
592
603
  // creating many intermediate strings.
593
- Util.makeCssRgb = function Util_makeCssRgb(rgb) {
594
- rgbBuf[1] = rgb[0];
595
- rgbBuf[3] = rgb[1];
596
- rgbBuf[5] = rgb[2];
604
+ Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
605
+ rgbBuf[1] = r;
606
+ rgbBuf[3] = g;
607
+ rgbBuf[5] = b;
597
608
  return rgbBuf.join('');
598
609
  };
599
610
 
@@ -972,7 +983,7 @@ function isEmptyObj(obj) {
972
983
  }
973
984
 
974
985
  function isBool(v) {
975
- return typeof v == 'boolean';
986
+ return typeof v === 'boolean';
976
987
  }
977
988
 
978
989
  function isInt(v) {
@@ -1124,7 +1135,7 @@ PDFJS.createPromiseCapability = createPromiseCapability;
1124
1135
  pendingRejectionCheck: false,
1125
1136
 
1126
1137
  scheduleHandlers: function scheduleHandlers(promise) {
1127
- if (promise._status == STATUS_PENDING) {
1138
+ if (promise._status === STATUS_PENDING) {
1128
1139
  return;
1129
1140
  }
1130
1141
 
@@ -1150,10 +1161,10 @@ PDFJS.createPromiseCapability = createPromiseCapability;
1150
1161
 
1151
1162
  try {
1152
1163
  if (nextStatus === STATUS_RESOLVED) {
1153
- if (typeof(handler.onResolve) == 'function') {
1164
+ if (typeof handler.onResolve === 'function') {
1154
1165
  nextValue = handler.onResolve(nextValue);
1155
1166
  }
1156
- } else if (typeof(handler.onReject) === 'function') {
1167
+ } else if (typeof handler.onReject === 'function') {
1157
1168
  nextValue = handler.onReject(nextValue);
1158
1169
  nextStatus = STATUS_RESOLVED;
1159
1170
 
@@ -1320,7 +1331,7 @@ PDFJS.createPromiseCapability = createPromiseCapability;
1320
1331
  return;
1321
1332
  }
1322
1333
 
1323
- if (status == STATUS_RESOLVED &&
1334
+ if (status === STATUS_RESOLVED &&
1324
1335
  Promise.isPromise(value)) {
1325
1336
  value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
1326
1337
  this._updateStatus.bind(this, STATUS_REJECTED));
@@ -1348,7 +1359,7 @@ PDFJS.createPromiseCapability = createPromiseCapability;
1348
1359
 
1349
1360
  then: function Promise_then(onResolve, onReject) {
1350
1361
  var nextPromise = new Promise(function (resolve, reject) {
1351
- this.resolve = reject;
1362
+ this.resolve = resolve;
1352
1363
  this.reject = reject;
1353
1364
  });
1354
1365
  this._handlers.push({
@@ -1663,6 +1674,14 @@ PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
1663
1674
  PDFJS.disableRange = (PDFJS.disableRange === undefined ?
1664
1675
  false : PDFJS.disableRange);
1665
1676
 
1677
+ /**
1678
+ * Disable streaming of PDF file data. By default PDF.js attempts to load PDF
1679
+ * in chunks. This default behavior can be disabled.
1680
+ * @var {boolean}
1681
+ */
1682
+ PDFJS.disableStream = (PDFJS.disableStream === undefined ?
1683
+ false : PDFJS.disableStream);
1684
+
1666
1685
  /**
1667
1686
  * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
1668
1687
  * will automatically keep fetching more data even if it isn't needed to display
@@ -1768,6 +1787,11 @@ PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
1768
1787
  * parameters: function that needs to be called with new password and reason
1769
1788
  * (see {PasswordResponses}).
1770
1789
  *
1790
+ * @param {function} progressCallback is optional. It is used to be able to
1791
+ * monitor the loading progress of the PDF file (necessary to implement e.g.
1792
+ * a loading bar). The callback receives an {Object} with the properties:
1793
+ * {number} loaded and {number} total.
1794
+ *
1771
1795
  * @return {Promise} A promise that is resolved with {@link PDFDocumentProxy}
1772
1796
  * object.
1773
1797
  */
@@ -1856,10 +1880,20 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
1856
1880
  /**
1857
1881
  * @return {Promise} A promise that is resolved with a lookup table for
1858
1882
  * mapping named destinations to reference numbers.
1883
+ *
1884
+ * This can be slow for large documents: use getDestination instead
1859
1885
  */
1860
1886
  getDestinations: function PDFDocumentProxy_getDestinations() {
1861
1887
  return this.transport.getDestinations();
1862
1888
  },
1889
+ /**
1890
+ * @param {string} id The named destination to get.
1891
+ * @return {Promise} A promise that is resolved with all information
1892
+ * of the given named destination.
1893
+ */
1894
+ getDestination: function PDFDocumentProxy_getDestination(id) {
1895
+ return this.transport.getDestination(id);
1896
+ },
1863
1897
  /**
1864
1898
  * @return {Promise} A promise that is resolved with a lookup table for
1865
1899
  * mapping named attachments to their content.
@@ -2080,8 +2114,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
2080
2114
  // this call to render.
2081
2115
  this.pendingDestroy = false;
2082
2116
 
2083
- var renderingIntent = ('intent' in params ?
2084
- (params.intent == 'print' ? 'print' : 'display') : 'display');
2117
+ var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
2085
2118
 
2086
2119
  if (!this.intentStates[renderingIntent]) {
2087
2120
  this.intentStates[renderingIntent] = {};
@@ -2414,6 +2447,12 @@ var WorkerTransport = (function WorkerTransportClosure() {
2414
2447
  });
2415
2448
  });
2416
2449
 
2450
+ pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {
2451
+ messageHandler.send('OnDataRange', {
2452
+ chunk: chunk
2453
+ });
2454
+ });
2455
+
2417
2456
  messageHandler.on('RequestDataRange',
2418
2457
  function transportDataRange(data) {
2419
2458
  pdfDataRangeTransport.requestDataRange(data.begin, data.end);
@@ -2428,42 +2467,58 @@ var WorkerTransport = (function WorkerTransportClosure() {
2428
2467
  this.workerReadyCapability.resolve(pdfDocument);
2429
2468
  }, this);
2430
2469
 
2431
- messageHandler.on('NeedPassword', function transportPassword(data) {
2470
+ messageHandler.on('NeedPassword',
2471
+ function transportNeedPassword(exception) {
2432
2472
  if (this.passwordCallback) {
2433
2473
  return this.passwordCallback(updatePassword,
2434
2474
  PasswordResponses.NEED_PASSWORD);
2435
2475
  }
2436
- this.workerReadyCapability.reject(data.exception.message,
2437
- data.exception);
2476
+ this.workerReadyCapability.reject(
2477
+ new PasswordException(exception.message, exception.code));
2438
2478
  }, this);
2439
2479
 
2440
- messageHandler.on('IncorrectPassword', function transportBadPass(data) {
2480
+ messageHandler.on('IncorrectPassword',
2481
+ function transportIncorrectPassword(exception) {
2441
2482
  if (this.passwordCallback) {
2442
2483
  return this.passwordCallback(updatePassword,
2443
2484
  PasswordResponses.INCORRECT_PASSWORD);
2444
2485
  }
2445
- this.workerReadyCapability.reject(data.exception.message,
2446
- data.exception);
2486
+ this.workerReadyCapability.reject(
2487
+ new PasswordException(exception.message, exception.code));
2488
+ }, this);
2489
+
2490
+ messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
2491
+ this.workerReadyCapability.reject(
2492
+ new InvalidPDFException(exception.message));
2447
2493
  }, this);
2448
2494
 
2449
- messageHandler.on('InvalidPDF', function transportInvalidPDF(data) {
2450
- this.workerReadyCapability.reject(data.exception.name, data.exception);
2495
+ messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
2496
+ this.workerReadyCapability.reject(
2497
+ new MissingPDFException(exception.message));
2451
2498
  }, this);
2452
2499
 
2453
- messageHandler.on('MissingPDF', function transportMissingPDF(data) {
2454
- this.workerReadyCapability.reject(data.exception.message,
2455
- data.exception);
2500
+ messageHandler.on('UnexpectedResponse',
2501
+ function transportUnexpectedResponse(exception) {
2502
+ this.workerReadyCapability.reject(
2503
+ new UnexpectedResponseException(exception.message, exception.status));
2456
2504
  }, this);
2457
2505
 
2458
- messageHandler.on('UnknownError', function transportUnknownError(data) {
2459
- this.workerReadyCapability.reject(data.exception.message,
2460
- data.exception);
2506
+ messageHandler.on('UnknownError',
2507
+ function transportUnknownError(exception) {
2508
+ this.workerReadyCapability.reject(
2509
+ new UnknownErrorException(exception.message, exception.details));
2461
2510
  }, this);
2462
2511
 
2463
2512
  messageHandler.on('DataLoaded', function transportPage(data) {
2464
2513
  this.downloadInfoCapability.resolve(data);
2465
2514
  }, this);
2466
2515
 
2516
+ messageHandler.on('PDFManagerReady', function transportPage(data) {
2517
+ if (this.pdfDataRangeTransport) {
2518
+ this.pdfDataRangeTransport.transportReady();
2519
+ }
2520
+ }, this);
2521
+
2467
2522
  messageHandler.on('StartRenderPage', function transportRender(data) {
2468
2523
  var page = this.pageCache[data.pageIndex];
2469
2524
 
@@ -2495,7 +2550,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
2495
2550
  this.commonObjs.resolve(id, error);
2496
2551
  break;
2497
2552
  } else {
2498
- font = new FontFace(exportedData);
2553
+ font = new FontFaceObject(exportedData);
2499
2554
  }
2500
2555
 
2501
2556
  FontLoader.bind(
@@ -2553,14 +2608,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
2553
2608
  }
2554
2609
  }, this);
2555
2610
 
2556
- messageHandler.on('DocError', function transportDocError(data) {
2557
- this.workerReadyCapability.reject(data);
2558
- }, this);
2559
-
2560
2611
  messageHandler.on('PageError', function transportError(data) {
2561
2612
  var page = this.pageCache[data.pageNum - 1];
2562
2613
  var intentState = page.intentStates[data.intent];
2563
- if (intentState.displayReadyCapability.promise) {
2614
+ if (intentState.displayReadyCapability) {
2564
2615
  intentState.displayReadyCapability.reject(data.error);
2565
2616
  } else {
2566
2617
  error(data.error);
@@ -2570,7 +2621,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
2570
2621
  messageHandler.on('JpegDecode', function(data) {
2571
2622
  var imageUrl = data[0];
2572
2623
  var components = data[1];
2573
- if (components != 3 && components != 1) {
2624
+ if (components !== 3 && components !== 1) {
2574
2625
  return Promise.reject(
2575
2626
  new Error('Only 3 components or 1 component can be returned'));
2576
2627
  }
@@ -2589,13 +2640,13 @@ var WorkerTransport = (function WorkerTransportClosure() {
2589
2640
  var data = tmpCtx.getImageData(0, 0, width, height).data;
2590
2641
  var i, j;
2591
2642
 
2592
- if (components == 3) {
2643
+ if (components === 3) {
2593
2644
  for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
2594
2645
  buf[j] = data[i];
2595
2646
  buf[j + 1] = data[i + 1];
2596
2647
  buf[j + 2] = data[i + 2];
2597
2648
  }
2598
- } else if (components == 1) {
2649
+ } else if (components === 1) {
2599
2650
  for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
2600
2651
  buf[j] = data[i];
2601
2652
  }
@@ -2612,6 +2663,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
2612
2663
 
2613
2664
  fetchDocument: function WorkerTransport_fetchDocument(source) {
2614
2665
  source.disableAutoFetch = PDFJS.disableAutoFetch;
2666
+ source.disableStream = PDFJS.disableStream;
2615
2667
  source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
2616
2668
  this.messageHandler.send('GetDocRequest', {
2617
2669
  source: source,
@@ -2663,6 +2715,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
2663
2715
  return this.messageHandler.sendWithPromise('GetDestinations', null);
2664
2716
  },
2665
2717
 
2718
+ getDestination: function WorkerTransport_getDestination(id) {
2719
+ return this.messageHandler.sendWithPromise('GetDestination', { id: id } );
2720
+ },
2721
+
2666
2722
  getAttachments: function WorkerTransport_getAttachments() {
2667
2723
  return this.messageHandler.sendWithPromise('GetAttachments', null);
2668
2724
  },
@@ -2979,8 +3035,8 @@ var Metadata = PDFJS.Metadata = (function MetadataClosure() {
2979
3035
  var chars = '';
2980
3036
  for (var i = 0; i < bytes.length; i += 2) {
2981
3037
  var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
2982
- chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
2983
- code != 38 && false ? String.fromCharCode(code) :
3038
+ chars += code >= 32 && code < 127 && code !== 60 && code !== 62 &&
3039
+ code !== 38 && false ? String.fromCharCode(code) :
2984
3040
  '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
2985
3041
  }
2986
3042
  return '>' + chars;
@@ -3055,9 +3111,17 @@ var Metadata = PDFJS.Metadata = (function MetadataClosure() {
3055
3111
 
3056
3112
  // Minimal font size that would be used during canvas fillText operations.
3057
3113
  var MIN_FONT_SIZE = 16;
3114
+ // Maximum font size that would be used during canvas fillText operations.
3115
+ var MAX_FONT_SIZE = 100;
3058
3116
  var MAX_GROUP_SIZE = 4096;
3059
3117
 
3118
+ // Heuristic value used when enforcing minimum line widths.
3119
+ var MIN_WIDTH_FACTOR = 0.65;
3120
+
3060
3121
  var COMPILE_TYPE3_GLYPHS = true;
3122
+ var MAX_SIZE_TO_COMPILE = 1000;
3123
+
3124
+ var FULL_CHUNK_HEIGHT = 16;
3061
3125
 
3062
3126
  function createScratchCanvas(width, height) {
3063
3127
  var canvas = document.createElement('canvas');
@@ -3191,7 +3255,7 @@ var CachedCanvases = (function CachedCanvasesClosure() {
3191
3255
  getCanvas: function CachedCanvases_getCanvas(id, width, height,
3192
3256
  trackTransform) {
3193
3257
  var canvasEntry;
3194
- if (id in cache) {
3258
+ if (cache[id] !== undefined) {
3195
3259
  canvasEntry = cache[id];
3196
3260
  canvasEntry.canvas.width = width;
3197
3261
  canvasEntry.canvas.height = height;
@@ -3405,6 +3469,7 @@ var CanvasExtraState = (function CanvasExtraStateClosure() {
3405
3469
  // Default fore and background colors
3406
3470
  this.fillColor = '#000000';
3407
3471
  this.strokeColor = '#000000';
3472
+ this.patternFill = false;
3408
3473
  // Note: fill alpha applies to all non-stroking operations
3409
3474
  this.fillAlpha = 1;
3410
3475
  this.strokeAlpha = 1;
@@ -3457,6 +3522,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3457
3522
  if (canvasCtx) {
3458
3523
  addContextCurrentTransform(canvasCtx);
3459
3524
  }
3525
+ this.cachedGetSinglePixelWidth = null;
3460
3526
  }
3461
3527
 
3462
3528
  function putBinaryImageData(ctx, imgData) {
@@ -3477,13 +3543,11 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3477
3543
  // that's ok; any such pixels are ignored.
3478
3544
 
3479
3545
  var height = imgData.height, width = imgData.width;
3480
- var fullChunkHeight = 16;
3481
- var fracChunks = height / fullChunkHeight;
3482
- var fullChunks = Math.floor(fracChunks);
3483
- var totalChunks = Math.ceil(fracChunks);
3484
- var partialChunkHeight = height - fullChunks * fullChunkHeight;
3546
+ var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
3547
+ var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
3548
+ var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
3485
3549
 
3486
- var chunkImgData = ctx.createImageData(width, fullChunkHeight);
3550
+ var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
3487
3551
  var srcPos = 0, destPos;
3488
3552
  var src = imgData.data;
3489
3553
  var dest = chunkImgData.data;
@@ -3503,7 +3567,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3503
3567
  0xFF000000 : 0x000000FF;
3504
3568
  for (i = 0; i < totalChunks; i++) {
3505
3569
  thisChunkHeight =
3506
- (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
3570
+ (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
3507
3571
  destPos = 0;
3508
3572
  for (j = 0; j < thisChunkHeight; j++) {
3509
3573
  var srcDiff = srcLength - srcPos;
@@ -3538,19 +3602,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3538
3602
  dest32[destPos++] = 0;
3539
3603
  }
3540
3604
 
3541
- ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
3605
+ ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
3542
3606
  }
3543
3607
  } else if (imgData.kind === ImageKind.RGBA_32BPP) {
3544
3608
  // RGBA, 32-bits per pixel.
3545
3609
 
3546
3610
  j = 0;
3547
- elemsInThisChunk = width * fullChunkHeight * 4;
3611
+ elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
3548
3612
  for (i = 0; i < fullChunks; i++) {
3549
3613
  dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
3550
3614
  srcPos += elemsInThisChunk;
3551
3615
 
3552
3616
  ctx.putImageData(chunkImgData, 0, j);
3553
- j += fullChunkHeight;
3617
+ j += FULL_CHUNK_HEIGHT;
3554
3618
  }
3555
3619
  if (i < totalChunks) {
3556
3620
  elemsInThisChunk = width * partialChunkHeight * 4;
@@ -3560,11 +3624,11 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3560
3624
 
3561
3625
  } else if (imgData.kind === ImageKind.RGB_24BPP) {
3562
3626
  // RGB, 24-bits per pixel.
3563
- thisChunkHeight = fullChunkHeight;
3627
+ thisChunkHeight = FULL_CHUNK_HEIGHT;
3564
3628
  elemsInThisChunk = width * thisChunkHeight;
3565
3629
  for (i = 0; i < totalChunks; i++) {
3566
3630
  if (i >= fullChunks) {
3567
- thisChunkHeight =partialChunkHeight;
3631
+ thisChunkHeight = partialChunkHeight;
3568
3632
  elemsInThisChunk = width * thisChunkHeight;
3569
3633
  }
3570
3634
 
@@ -3575,7 +3639,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3575
3639
  dest[destPos++] = src[srcPos++];
3576
3640
  dest[destPos++] = 255;
3577
3641
  }
3578
- ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
3642
+ ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
3579
3643
  }
3580
3644
  } else {
3581
3645
  error('bad image kind: ' + imgData.kind);
@@ -3584,20 +3648,18 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3584
3648
 
3585
3649
  function putBinaryImageMask(ctx, imgData) {
3586
3650
  var height = imgData.height, width = imgData.width;
3587
- var fullChunkHeight = 16;
3588
- var fracChunks = height / fullChunkHeight;
3589
- var fullChunks = Math.floor(fracChunks);
3590
- var totalChunks = Math.ceil(fracChunks);
3591
- var partialChunkHeight = height - fullChunks * fullChunkHeight;
3651
+ var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
3652
+ var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
3653
+ var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
3592
3654
 
3593
- var chunkImgData = ctx.createImageData(width, fullChunkHeight);
3655
+ var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
3594
3656
  var srcPos = 0;
3595
3657
  var src = imgData.data;
3596
3658
  var dest = chunkImgData.data;
3597
3659
 
3598
3660
  for (var i = 0; i < totalChunks; i++) {
3599
3661
  var thisChunkHeight =
3600
- (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
3662
+ (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
3601
3663
 
3602
3664
  // Expand the mask so it can be used by the canvas. Any required
3603
3665
  // inversion has already been handled.
@@ -3614,7 +3676,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3614
3676
  mask >>= 1;
3615
3677
  }
3616
3678
  }
3617
- ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
3679
+ ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
3618
3680
  }
3619
3681
  }
3620
3682
 
@@ -3624,14 +3686,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3624
3686
  'globalCompositeOperation', 'font'];
3625
3687
  for (var i = 0, ii = properties.length; i < ii; i++) {
3626
3688
  var property = properties[i];
3627
- if (property in sourceCtx) {
3689
+ if (sourceCtx[property] !== undefined) {
3628
3690
  destCtx[property] = sourceCtx[property];
3629
3691
  }
3630
3692
  }
3631
- if ('setLineDash' in sourceCtx) {
3693
+ if (sourceCtx.setLineDash !== undefined) {
3632
3694
  destCtx.setLineDash(sourceCtx.getLineDash());
3633
3695
  destCtx.lineDashOffset = sourceCtx.lineDashOffset;
3634
- } else if ('mozDash' in sourceCtx) {
3696
+ } else if (sourceCtx.mozDashOffset !== undefined) {
3635
3697
  destCtx.mozDash = sourceCtx.mozDash;
3636
3698
  destCtx.mozDashOffset = sourceCtx.mozDashOffset;
3637
3699
  }
@@ -3666,9 +3728,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3666
3728
  function composeSMaskLuminosity(maskData, layerData) {
3667
3729
  var length = maskData.length;
3668
3730
  for (var i = 3; i < length; i += 4) {
3669
- var y = ((maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000
3670
- (maskData[i - 2] * 152) + // * 0.59 ....
3671
- (maskData[i - 1] * 28)) | 0; // * 0.11 ....
3731
+ var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000
3732
+ (maskData[i - 2] * 152) + // * 0.59 ....
3733
+ (maskData[i - 1] * 28); // * 0.11 ....
3672
3734
  layerData[i] = (layerData[i] * y) >> 16;
3673
3735
  }
3674
3736
  }
@@ -3688,7 +3750,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3688
3750
  }
3689
3751
 
3690
3752
  // processing image in chunks to save memory
3691
- var PIXELS_TO_PROCESS = 65536;
3753
+ var PIXELS_TO_PROCESS = 1048576;
3692
3754
  var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
3693
3755
  for (var row = 0; row < height; row += chunkSize) {
3694
3756
  var chunkHeight = Math.min(chunkSize, height - row);
@@ -3858,7 +3920,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3858
3920
  },
3859
3921
  setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
3860
3922
  var ctx = this.ctx;
3861
- if ('setLineDash' in ctx) {
3923
+ if (ctx.setLineDash !== undefined) {
3862
3924
  ctx.setLineDash(dashArray);
3863
3925
  ctx.lineDashOffset = dashPhase;
3864
3926
  } else {
@@ -3993,10 +4055,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
3993
4055
 
3994
4056
  this.current = this.stateStack.pop();
3995
4057
  this.ctx.restore();
4058
+
4059
+ this.cachedGetSinglePixelWidth = null;
3996
4060
  }
3997
4061
  },
3998
4062
  transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
3999
4063
  this.ctx.transform(a, b, c, d, e, f);
4064
+
4065
+ this.cachedGetSinglePixelWidth = null;
4000
4066
  },
4001
4067
 
4002
4068
  // Path
@@ -4070,9 +4136,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4070
4136
  consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
4071
4137
  var ctx = this.ctx;
4072
4138
  var strokeColor = this.current.strokeColor;
4073
- if (this.current.lineWidth === 0) {
4074
- ctx.lineWidth = this.getSinglePixelWidth();
4075
- }
4139
+ // Prevent drawing too thin lines by enforcing a minimum line width.
4140
+ ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,
4141
+ this.current.lineWidth);
4076
4142
  // For stroke we want to temporarily change the global alpha to the
4077
4143
  // stroking alpha.
4078
4144
  ctx.globalAlpha = this.current.strokeAlpha;
@@ -4101,10 +4167,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4101
4167
  consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
4102
4168
  var ctx = this.ctx;
4103
4169
  var fillColor = this.current.fillColor;
4170
+ var isPatternFill = this.current.patternFill;
4104
4171
  var needRestore = false;
4105
4172
 
4106
- if (fillColor && fillColor.hasOwnProperty('type') &&
4107
- fillColor.type === 'Pattern') {
4173
+ if (isPatternFill) {
4108
4174
  ctx.save();
4109
4175
  ctx.fillStyle = fillColor.getPattern(ctx, this);
4110
4176
  needRestore = true;
@@ -4255,9 +4321,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4255
4321
  // Keeping the font at minimal size and using the fontSizeScale to change
4256
4322
  // the current transformation matrix before the fillText/strokeText.
4257
4323
  // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
4258
- var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
4259
- this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
4260
- size / MIN_FONT_SIZE;
4324
+ var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :
4325
+ size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
4326
+ this.current.fontSizeScale = size / browserFontSize;
4261
4327
 
4262
4328
  var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
4263
4329
  this.ctx.font = rule;
@@ -4397,12 +4463,18 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4397
4463
  var lineWidth = current.lineWidth;
4398
4464
  var scale = current.textMatrixScale;
4399
4465
  if (scale === 0 || lineWidth === 0) {
4400
- lineWidth = this.getSinglePixelWidth();
4466
+ var fillStrokeMode = current.textRenderingMode &
4467
+ TextRenderingMode.FILL_STROKE_MASK;
4468
+ if (fillStrokeMode === TextRenderingMode.STROKE ||
4469
+ fillStrokeMode === TextRenderingMode.FILL_STROKE) {
4470
+ this.cachedGetSinglePixelWidth = null;
4471
+ lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
4472
+ }
4401
4473
  } else {
4402
4474
  lineWidth /= scale;
4403
4475
  }
4404
4476
 
4405
- if (fontSizeScale != 1.0) {
4477
+ if (fontSizeScale !== 1.0) {
4406
4478
  ctx.scale(fontSizeScale, fontSizeScale);
4407
4479
  lineWidth /= fontSizeScale;
4408
4480
  }
@@ -4492,9 +4564,11 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4492
4564
  var textHScale = current.textHScale * fontDirection;
4493
4565
  var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
4494
4566
  var glyphsLength = glyphs.length;
4567
+ var isTextInvisible =
4568
+ current.textRenderingMode === TextRenderingMode.INVISIBLE;
4495
4569
  var i, glyph, width;
4496
4570
 
4497
- if (fontSize === 0) {
4571
+ if (isTextInvisible || fontSize === 0) {
4498
4572
  return;
4499
4573
  }
4500
4574
 
@@ -4502,7 +4576,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4502
4576
  ctx.transform.apply(ctx, current.textMatrix);
4503
4577
  ctx.translate(current.x, current.y);
4504
4578
 
4505
- ctx.scale(textHScale, 1);
4579
+ ctx.scale(textHScale, fontDirection);
4506
4580
 
4507
4581
  for (i = 0; i < glyphsLength; ++i) {
4508
4582
  glyph = glyphs[i];
@@ -4518,16 +4592,21 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4518
4592
  continue;
4519
4593
  }
4520
4594
 
4595
+ var operatorList = font.charProcOperatorList[glyph.operatorListId];
4596
+ if (!operatorList) {
4597
+ warn('Type3 character \"' + glyph.operatorListId +
4598
+ '\" is not available');
4599
+ continue;
4600
+ }
4521
4601
  this.processingType3 = glyph;
4522
4602
  this.save();
4523
4603
  ctx.scale(fontSize, fontSize);
4524
4604
  ctx.transform.apply(ctx, fontMatrix);
4525
- var operatorList = font.charProcOperatorList[glyph.operatorListId];
4526
4605
  this.executeOperatorList(operatorList);
4527
4606
  this.restore();
4528
4607
 
4529
4608
  var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
4530
- width = ((transformed[0] * fontSize + charSpacing) * fontDirection);
4609
+ width = transformed[0] * fontSize + charSpacing;
4531
4610
 
4532
4611
  ctx.translate(width, 0);
4533
4612
  current.x += width * textHScale;
@@ -4571,16 +4650,18 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4571
4650
  },
4572
4651
  setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
4573
4652
  this.current.fillColor = this.getColorN_Pattern(arguments);
4653
+ this.current.patternFill = true;
4574
4654
  },
4575
4655
  setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
4576
- var color = Util.makeCssRgb(arguments);
4656
+ var color = Util.makeCssRgb(r, g, b);
4577
4657
  this.ctx.strokeStyle = color;
4578
4658
  this.current.strokeColor = color;
4579
4659
  },
4580
4660
  setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
4581
- var color = Util.makeCssRgb(arguments);
4661
+ var color = Util.makeCssRgb(r, g, b);
4582
4662
  this.ctx.fillStyle = color;
4583
4663
  this.current.fillColor = color;
4664
+ this.current.patternFill = false;
4584
4665
  },
4585
4666
 
4586
4667
  shadingFill: function CanvasGraphics_shadingFill(patternIR) {
@@ -4839,11 +4920,12 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4839
4920
  paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
4840
4921
  var ctx = this.ctx;
4841
4922
  var width = img.width, height = img.height;
4923
+ var fillColor = this.current.fillColor;
4924
+ var isPatternFill = this.current.patternFill;
4842
4925
 
4843
4926
  var glyph = this.processingType3;
4844
4927
 
4845
- if (COMPILE_TYPE3_GLYPHS && glyph && !('compiled' in glyph)) {
4846
- var MAX_SIZE_TO_COMPILE = 1000;
4928
+ if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
4847
4929
  if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
4848
4930
  glyph.compiled =
4849
4931
  compileType3Glyph({data: img.data, width: width, height: height});
@@ -4865,9 +4947,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4865
4947
 
4866
4948
  maskCtx.globalCompositeOperation = 'source-in';
4867
4949
 
4868
- var fillColor = this.current.fillColor;
4869
- maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
4870
- fillColor.type === 'Pattern') ?
4950
+ maskCtx.fillStyle = isPatternFill ?
4871
4951
  fillColor.getPattern(maskCtx, this) : fillColor;
4872
4952
  maskCtx.fillRect(0, 0, width, height);
4873
4953
 
@@ -4881,7 +4961,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4881
4961
  scaleY, positions) {
4882
4962
  var width = imgData.width;
4883
4963
  var height = imgData.height;
4884
- var ctx = this.ctx;
4964
+ var fillColor = this.current.fillColor;
4965
+ var isPatternFill = this.current.patternFill;
4885
4966
 
4886
4967
  var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
4887
4968
  var maskCtx = maskCanvas.context;
@@ -4891,14 +4972,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4891
4972
 
4892
4973
  maskCtx.globalCompositeOperation = 'source-in';
4893
4974
 
4894
- var fillColor = this.current.fillColor;
4895
- maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
4896
- fillColor.type === 'Pattern') ?
4897
- fillColor.getPattern(maskCtx, this) : fillColor;
4975
+ maskCtx.fillStyle = isPatternFill ?
4976
+ fillColor.getPattern(maskCtx, this) : fillColor;
4898
4977
  maskCtx.fillRect(0, 0, width, height);
4899
4978
 
4900
4979
  maskCtx.restore();
4901
4980
 
4981
+ var ctx = this.ctx;
4902
4982
  for (var i = 0, ii = positions.length; i < ii; i += 2) {
4903
4983
  ctx.save();
4904
4984
  ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
@@ -4913,6 +4993,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4913
4993
  function CanvasGraphics_paintImageMaskXObjectGroup(images) {
4914
4994
  var ctx = this.ctx;
4915
4995
 
4996
+ var fillColor = this.current.fillColor;
4997
+ var isPatternFill = this.current.patternFill;
4916
4998
  for (var i = 0, ii = images.length; i < ii; i++) {
4917
4999
  var image = images[i];
4918
5000
  var width = image.width, height = image.height;
@@ -4925,9 +5007,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
4925
5007
 
4926
5008
  maskCtx.globalCompositeOperation = 'source-in';
4927
5009
 
4928
- var fillColor = this.current.fillColor;
4929
- maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
4930
- fillColor.type === 'Pattern') ?
5010
+ maskCtx.fillStyle = isPatternFill ?
4931
5011
  fillColor.getPattern(maskCtx, this) : fillColor;
4932
5012
  maskCtx.fillRect(0, 0, width, height);
4933
5013
 
@@ -5130,11 +5210,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
5130
5210
  ctx.beginPath();
5131
5211
  },
5132
5212
  getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
5133
- var inverse = this.ctx.mozCurrentTransformInverse;
5134
- // max of the current horizontal and vertical scale
5135
- return Math.sqrt(Math.max(
5136
- (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
5137
- (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
5213
+ if (this.cachedGetSinglePixelWidth === null) {
5214
+ var inverse = this.ctx.mozCurrentTransformInverse;
5215
+ // max of the current horizontal and vertical scale
5216
+ this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(
5217
+ (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
5218
+ (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
5219
+ }
5220
+ return this.cachedGetSinglePixelWidth;
5138
5221
  },
5139
5222
  getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
5140
5223
  var transform = this.ctx.mozCurrentTransform;
@@ -5202,7 +5285,7 @@ var WebGLUtils = (function WebGLUtilsClosure() {
5202
5285
  }
5203
5286
 
5204
5287
  var currentGL, currentCanvas;
5205
- function generageGL() {
5288
+ function generateGL() {
5206
5289
  if (currentGL) {
5207
5290
  return;
5208
5291
  }
@@ -5260,7 +5343,7 @@ var WebGLUtils = (function WebGLUtilsClosure() {
5260
5343
  function initSmaskGL() {
5261
5344
  var canvas, gl;
5262
5345
 
5263
- generageGL();
5346
+ generateGL();
5264
5347
  canvas = currentCanvas;
5265
5348
  currentCanvas = null;
5266
5349
  gl = currentGL;
@@ -5392,7 +5475,7 @@ var WebGLUtils = (function WebGLUtilsClosure() {
5392
5475
  function initFiguresGL() {
5393
5476
  var canvas, gl;
5394
5477
 
5395
- generageGL();
5478
+ generateGL();
5396
5479
  canvas = currentCanvas;
5397
5480
  currentCanvas = null;
5398
5481
  gl = currentGL;
@@ -5560,7 +5643,7 @@ var WebGLUtils = (function WebGLUtilsClosure() {
5560
5643
  }
5561
5644
  var enabled = false;
5562
5645
  try {
5563
- generageGL();
5646
+ generateGL();
5564
5647
  enabled = !!currentGL;
5565
5648
  } catch (e) { }
5566
5649
  return shadow(this, 'isEnabled', enabled);
@@ -5935,7 +6018,7 @@ var TilingPattern = (function TilingPatternClosure() {
5935
6018
  },
5936
6019
 
5937
6020
  clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
5938
- if (bbox && isArray(bbox) && 4 == bbox.length) {
6021
+ if (bbox && isArray(bbox) && bbox.length === 4) {
5939
6022
  var bboxWidth = x1 - x0;
5940
6023
  var bboxHeight = y1 - y0;
5941
6024
  graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
@@ -5953,7 +6036,7 @@ var TilingPattern = (function TilingPatternClosure() {
5953
6036
  context.strokeStyle = ctx.strokeStyle;
5954
6037
  break;
5955
6038
  case PaintType.UNCOLORED:
5956
- var cssColor = Util.makeCssRgb(color);
6039
+ var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);
5957
6040
  context.fillStyle = cssColor;
5958
6041
  context.strokeStyle = cssColor;
5959
6042
  break;
@@ -5999,6 +6082,10 @@ var FontLoader = {
5999
6082
  if (styleElement) {
6000
6083
  styleElement.parentNode.removeChild(styleElement);
6001
6084
  }
6085
+ this.nativeFontFaces.forEach(function(nativeFontFace) {
6086
+ document.fonts.delete(nativeFontFace);
6087
+ });
6088
+ this.nativeFontFaces.length = 0;
6002
6089
  },
6003
6090
  get loadTestFont() {
6004
6091
  // This is a CFF font with 1 glyph for '.' that fills its entire width and
@@ -6049,13 +6136,27 @@ var FontLoader = {
6049
6136
  return true;
6050
6137
  }
6051
6138
  // TODO other browsers
6139
+ if (userAgent === 'node') {
6140
+ return true;
6141
+ }
6052
6142
  return false;
6053
6143
  })(),
6054
6144
 
6145
+ nativeFontFaces: [],
6146
+
6147
+ isFontLoadingAPISupported: !isWorker && !!document.fonts,
6148
+
6149
+ addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) {
6150
+ this.nativeFontFaces.push(nativeFontFace);
6151
+ document.fonts.add(nativeFontFace);
6152
+ },
6153
+
6055
6154
  bind: function fontLoaderBind(fonts, callback) {
6056
6155
  assert(!isWorker, 'bind() shall be called from main thread');
6057
6156
 
6058
- var rules = [], fontsToLoad = [];
6157
+ var rules = [];
6158
+ var fontsToLoad = [];
6159
+ var fontLoadPromises = [];
6059
6160
  for (var i = 0, ii = fonts.length; i < ii; i++) {
6060
6161
  var font = fonts[i];
6061
6162
 
@@ -6066,15 +6167,26 @@ var FontLoader = {
6066
6167
  }
6067
6168
  font.attached = true;
6068
6169
 
6069
- var rule = font.bindDOM();
6070
- if (rule) {
6071
- rules.push(rule);
6072
- fontsToLoad.push(font);
6170
+ if (this.isFontLoadingAPISupported) {
6171
+ var nativeFontFace = font.createNativeFontFace();
6172
+ if (nativeFontFace) {
6173
+ fontLoadPromises.push(nativeFontFace.loaded);
6174
+ }
6175
+ } else {
6176
+ var rule = font.bindDOM();
6177
+ if (rule) {
6178
+ rules.push(rule);
6179
+ fontsToLoad.push(font);
6180
+ }
6073
6181
  }
6074
6182
  }
6075
6183
 
6076
6184
  var request = FontLoader.queueLoadingCallback(callback);
6077
- if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
6185
+ if (this.isFontLoadingAPISupported) {
6186
+ Promise.all(fontsToLoad).then(function() {
6187
+ request.complete();
6188
+ });
6189
+ } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
6078
6190
  FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);
6079
6191
  } else {
6080
6192
  request.complete();
@@ -6209,8 +6321,8 @@ var FontLoader = {
6209
6321
  }
6210
6322
  };
6211
6323
 
6212
- var FontFace = (function FontFaceClosure() {
6213
- function FontFace(name, file, properties) {
6324
+ var FontFaceObject = (function FontFaceObjectClosure() {
6325
+ function FontFaceObject(name, file, properties) {
6214
6326
  this.compiledGlyphs = {};
6215
6327
  if (arguments.length === 1) {
6216
6328
  // importing translated data
@@ -6221,8 +6333,29 @@ var FontFace = (function FontFaceClosure() {
6221
6333
  return;
6222
6334
  }
6223
6335
  }
6224
- FontFace.prototype = {
6225
- bindDOM: function FontFace_bindDOM() {
6336
+ FontFaceObject.prototype = {
6337
+ createNativeFontFace: function FontFaceObject_createNativeFontFace() {
6338
+ if (!this.data) {
6339
+ return null;
6340
+ }
6341
+
6342
+ if (PDFJS.disableFontFace) {
6343
+ this.disableFontFace = true;
6344
+ return null;
6345
+ }
6346
+
6347
+ var nativeFontFace = new FontFace(this.loadedName, this.data, {});
6348
+
6349
+ FontLoader.addNativeFontFace(nativeFontFace);
6350
+
6351
+ if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
6352
+ globalScope['FontInspector'].enabled) {
6353
+ globalScope['FontInspector'].fontAdded(this);
6354
+ }
6355
+ return nativeFontFace;
6356
+ },
6357
+
6358
+ bindDOM: function FontFaceObject_bindDOM() {
6226
6359
  if (!this.data) {
6227
6360
  return null;
6228
6361
  }
@@ -6249,7 +6382,7 @@ var FontFace = (function FontFaceClosure() {
6249
6382
  return rule;
6250
6383
  },
6251
6384
 
6252
- getPathGenerator: function (objs, character) {
6385
+ getPathGenerator: function FontLoader_getPathGenerator(objs, character) {
6253
6386
  if (!(character in this.compiledGlyphs)) {
6254
6387
  var js = objs.get(this.loadedName + '_path_' + character);
6255
6388
  /*jshint -W054 */
@@ -6258,11 +6391,10 @@ var FontFace = (function FontFaceClosure() {
6258
6391
  return this.compiledGlyphs[character];
6259
6392
  }
6260
6393
  };
6261
- return FontFace;
6394
+ return FontFaceObject;
6262
6395
  })();
6263
6396
 
6264
6397
 
6265
- var HIGHLIGHT_OFFSET = 4; // px
6266
6398
  var ANNOT_MIN_SIZE = 10; // px
6267
6399
 
6268
6400
  var AnnotationUtils = (function AnnotationUtilsClosure() {
@@ -6289,43 +6421,36 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6289
6421
  style.fontFamily = fontFamily + fallbackName;
6290
6422
  }
6291
6423
 
6292
- // TODO(mack): Remove this, it's not really that helpful.
6293
- function getEmptyContainer(tagName, rect, borderWidth) {
6294
- var bWidth = borderWidth || 0;
6295
- var element = document.createElement(tagName);
6296
- element.style.borderWidth = bWidth + 'px';
6297
- var width = rect[2] - rect[0] - 2 * bWidth;
6298
- var height = rect[3] - rect[1] - 2 * bWidth;
6299
- element.style.width = width + 'px';
6300
- element.style.height = height + 'px';
6301
- return element;
6302
- }
6303
-
6304
- function initContainer(item) {
6305
- var container = getEmptyContainer('section', item.rect, item.borderWidth);
6306
- container.style.backgroundColor = item.color;
6307
-
6308
- var color = item.color;
6309
- var rgb = [];
6310
- for (var i = 0; i < 3; ++i) {
6311
- rgb[i] = Math.round(color[i] * 255);
6424
+ function initContainer(item, drawBorder) {
6425
+ var container = document.createElement('section');
6426
+ var cstyle = container.style;
6427
+ var width = item.rect[2] - item.rect[0];
6428
+ var height = item.rect[3] - item.rect[1];
6429
+
6430
+ var bWidth = item.borderWidth || 0;
6431
+ if (bWidth) {
6432
+ width = width - 2 * bWidth;
6433
+ height = height - 2 * bWidth;
6434
+ cstyle.borderWidth = bWidth + 'px';
6435
+ var color = item.color;
6436
+ if (drawBorder && color) {
6437
+ cstyle.borderStyle = 'solid';
6438
+ cstyle.borderColor = Util.makeCssRgb(Math.round(color[0] * 255),
6439
+ Math.round(color[1] * 255),
6440
+ Math.round(color[2] * 255));
6441
+ }
6312
6442
  }
6313
- item.colorCssRgb = Util.makeCssRgb(rgb);
6314
-
6315
- var highlight = document.createElement('div');
6316
- highlight.className = 'annotationHighlight';
6317
- highlight.style.left = highlight.style.top = -HIGHLIGHT_OFFSET + 'px';
6318
- highlight.style.right = highlight.style.bottom = -HIGHLIGHT_OFFSET + 'px';
6319
- highlight.setAttribute('hidden', true);
6320
-
6321
- item.highlightElement = highlight;
6322
- container.appendChild(item.highlightElement);
6323
-
6443
+ cstyle.width = width + 'px';
6444
+ cstyle.height = height + 'px';
6324
6445
  return container;
6325
6446
  }
6326
6447
 
6327
6448
  function getHtmlElementForTextWidgetAnnotation(item, commonObjs) {
6328
- var element = getEmptyContainer('div', item.rect, 0);
6449
+ var element = document.createElement('div');
6450
+ var width = item.rect[2] - item.rect[0];
6451
+ var height = item.rect[3] - item.rect[1];
6452
+ element.style.width = width + 'px';
6453
+ element.style.height = height + 'px';
6329
6454
  element.style.display = 'table';
6330
6455
 
6331
6456
  var content = document.createElement('div');
@@ -6344,7 +6469,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6344
6469
  return element;
6345
6470
  }
6346
6471
 
6347
- function getHtmlElementForTextAnnotation(item, commonObjs) {
6472
+ function getHtmlElementForTextAnnotation(item) {
6348
6473
  var rect = item.rect;
6349
6474
 
6350
6475
  // sanity check because of OOo-generated PDFs
@@ -6355,7 +6480,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6355
6480
  rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
6356
6481
  }
6357
6482
 
6358
- var container = initContainer(item);
6483
+ var container = initContainer(item, false);
6359
6484
  container.className = 'annotText';
6360
6485
 
6361
6486
  var image = document.createElement('img');
@@ -6380,13 +6505,15 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6380
6505
  var i, ii;
6381
6506
  if (item.hasBgColor) {
6382
6507
  var color = item.color;
6383
- var rgb = [];
6384
- for (i = 0; i < 3; ++i) {
6385
- // Enlighten the color (70%)
6386
- var c = Math.round(color[i] * 255);
6387
- rgb[i] = Math.round((255 - c) * 0.7) + c;
6388
- }
6389
- content.style.backgroundColor = Util.makeCssRgb(rgb);
6508
+
6509
+ // Enlighten the color (70%)
6510
+ var BACKGROUND_ENLIGHT = 0.7;
6511
+ var r = BACKGROUND_ENLIGHT * (1.0 - color[0]) + color[0];
6512
+ var g = BACKGROUND_ENLIGHT * (1.0 - color[1]) + color[1];
6513
+ var b = BACKGROUND_ENLIGHT * (1.0 - color[2]) + color[2];
6514
+ content.style.backgroundColor = Util.makeCssRgb((r * 255) | 0,
6515
+ (g * 255) | 0,
6516
+ (b * 255) | 0);
6390
6517
  }
6391
6518
 
6392
6519
  var title = document.createElement('h1');
@@ -6461,14 +6588,10 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6461
6588
  return container;
6462
6589
  }
6463
6590
 
6464
- function getHtmlElementForLinkAnnotation(item, commonObjs) {
6465
-
6466
- var container = initContainer(item);
6591
+ function getHtmlElementForLinkAnnotation(item) {
6592
+ var container = initContainer(item, true);
6467
6593
  container.className = 'annotLink';
6468
6594
 
6469
- container.style.borderColor = item.colorCssRgb;
6470
- container.style.borderStyle = 'solid';
6471
-
6472
6595
  var link = document.createElement('a');
6473
6596
  link.href = link.title = item.url || '';
6474
6597
 
@@ -6482,9 +6605,9 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6482
6605
  case AnnotationType.WIDGET:
6483
6606
  return getHtmlElementForTextWidgetAnnotation(data, objs);
6484
6607
  case AnnotationType.TEXT:
6485
- return getHtmlElementForTextAnnotation(data, objs);
6608
+ return getHtmlElementForTextAnnotation(data);
6486
6609
  case AnnotationType.LINK:
6487
- return getHtmlElementForLinkAnnotation(data, objs);
6610
+ return getHtmlElementForLinkAnnotation(data);
6488
6611
  default:
6489
6612
  throw new Error('Unsupported annotationType: ' + data.annotationType);
6490
6613
  }
@@ -6497,15 +6620,1187 @@ var AnnotationUtils = (function AnnotationUtilsClosure() {
6497
6620
  PDFJS.AnnotationUtils = AnnotationUtils;
6498
6621
 
6499
6622
 
6500
- }).call((typeof window === 'undefined') ? this : window);
6623
+ var SVG_DEFAULTS = {
6624
+ fontStyle: 'normal',
6625
+ fontWeight: 'normal',
6626
+ fillColor: '#000000'
6627
+ };
6628
+
6629
+ var convertImgDataToPng = (function convertImgDataToPngClosure() {
6630
+ var PNG_HEADER =
6631
+ new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
6632
+
6633
+ var CHUNK_WRAPPER_SIZE = 12;
6634
+
6635
+ var crcTable = new Int32Array(256);
6636
+ for (var i = 0; i < 256; i++) {
6637
+ var c = i;
6638
+ for (var h = 0; h < 8; h++) {
6639
+ if (c & 1) {
6640
+ c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);
6641
+ } else {
6642
+ c = (c >> 1) & 0x7fffffff;
6643
+ }
6644
+ }
6645
+ crcTable[i] = c;
6646
+ }
6647
+
6648
+ function crc32(data, start, end) {
6649
+ var crc = -1;
6650
+ for (var i = start; i < end; i++) {
6651
+ var a = (crc ^ data[i]) & 0xff;
6652
+ var b = crcTable[a];
6653
+ crc = (crc >>> 8) ^ b;
6654
+ }
6655
+ return crc ^ -1;
6656
+ }
6657
+
6658
+ function writePngChunk(type, body, data, offset) {
6659
+ var p = offset;
6660
+ var len = body.length;
6661
+
6662
+ data[p] = len >> 24 & 0xff;
6663
+ data[p + 1] = len >> 16 & 0xff;
6664
+ data[p + 2] = len >> 8 & 0xff;
6665
+ data[p + 3] = len & 0xff;
6666
+ p += 4;
6667
+
6668
+ data[p] = type.charCodeAt(0) & 0xff;
6669
+ data[p + 1] = type.charCodeAt(1) & 0xff;
6670
+ data[p + 2] = type.charCodeAt(2) & 0xff;
6671
+ data[p + 3] = type.charCodeAt(3) & 0xff;
6672
+ p += 4;
6673
+
6674
+ data.set(body, p);
6675
+ p += body.length;
6676
+
6677
+ var crc = crc32(data, offset + 4, p);
6678
+
6679
+ data[p] = crc >> 24 & 0xff;
6680
+ data[p + 1] = crc >> 16 & 0xff;
6681
+ data[p + 2] = crc >> 8 & 0xff;
6682
+ data[p + 3] = crc & 0xff;
6683
+ }
6684
+
6685
+ function adler32(data, start, end) {
6686
+ var a = 1;
6687
+ var b = 0;
6688
+ for (var i = start; i < end; ++i) {
6689
+ a = (a + (data[i] & 0xff)) % 65521;
6690
+ b = (b + a) % 65521;
6691
+ }
6692
+ return (b << 16) | a;
6693
+ }
6694
+
6695
+ function encode(imgData, kind) {
6696
+ var width = imgData.width;
6697
+ var height = imgData.height;
6698
+ var bitDepth, colorType, lineSize;
6699
+ var bytes = imgData.data;
6700
+
6701
+ switch (kind) {
6702
+ case ImageKind.GRAYSCALE_1BPP:
6703
+ colorType = 0;
6704
+ bitDepth = 1;
6705
+ lineSize = (width + 7) >> 3;
6706
+ break;
6707
+ case ImageKind.RGB_24BPP:
6708
+ colorType = 2;
6709
+ bitDepth = 8;
6710
+ lineSize = width * 3;
6711
+ break;
6712
+ case ImageKind.RGBA_32BPP:
6713
+ colorType = 6;
6714
+ bitDepth = 8;
6715
+ lineSize = width * 4;
6716
+ break;
6717
+ default:
6718
+ throw new Error('invalid format');
6719
+ }
6720
+
6721
+ // prefix every row with predictor 0
6722
+ var literals = new Uint8Array((1 + lineSize) * height);
6723
+ var offsetLiterals = 0, offsetBytes = 0;
6724
+ var y, i;
6725
+ for (y = 0; y < height; ++y) {
6726
+ literals[offsetLiterals++] = 0; // no prediction
6727
+ literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),
6728
+ offsetLiterals);
6729
+ offsetBytes += lineSize;
6730
+ offsetLiterals += lineSize;
6731
+ }
6732
+
6733
+ if (kind === ImageKind.GRAYSCALE_1BPP) {
6734
+ // inverting for B/W
6735
+ offsetLiterals = 0;
6736
+ for (y = 0; y < height; y++) {
6737
+ offsetLiterals++; // skipping predictor
6738
+ for (i = 0; i < lineSize; i++) {
6739
+ literals[offsetLiterals++] ^= 0xFF;
6740
+ }
6741
+ }
6742
+ }
6743
+
6744
+ var ihdr = new Uint8Array([
6745
+ width >> 24 & 0xff,
6746
+ width >> 16 & 0xff,
6747
+ width >> 8 & 0xff,
6748
+ width & 0xff,
6749
+ height >> 24 & 0xff,
6750
+ height >> 16 & 0xff,
6751
+ height >> 8 & 0xff,
6752
+ height & 0xff,
6753
+ bitDepth, // bit depth
6754
+ colorType, // color type
6755
+ 0x00, // compression method
6756
+ 0x00, // filter method
6757
+ 0x00 // interlace method
6758
+ ]);
6759
+
6760
+ var len = literals.length;
6761
+ var maxBlockLength = 0xFFFF;
6762
+
6763
+ var deflateBlocks = Math.ceil(len / maxBlockLength);
6764
+ var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
6765
+ var pi = 0;
6766
+ idat[pi++] = 0x78; // compression method and flags
6767
+ idat[pi++] = 0x9c; // flags
6768
+
6769
+ var pos = 0;
6770
+ while (len > maxBlockLength) {
6771
+ // writing non-final DEFLATE blocks type 0 and length of 65535
6772
+ idat[pi++] = 0x00;
6773
+ idat[pi++] = 0xff;
6774
+ idat[pi++] = 0xff;
6775
+ idat[pi++] = 0x00;
6776
+ idat[pi++] = 0x00;
6777
+ idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
6778
+ pi += maxBlockLength;
6779
+ pos += maxBlockLength;
6780
+ len -= maxBlockLength;
6781
+ }
6782
+
6783
+ // writing non-final DEFLATE blocks type 0
6784
+ idat[pi++] = 0x01;
6785
+ idat[pi++] = len & 0xff;
6786
+ idat[pi++] = len >> 8 & 0xff;
6787
+ idat[pi++] = (~len & 0xffff) & 0xff;
6788
+ idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
6789
+ idat.set(literals.subarray(pos), pi);
6790
+ pi += literals.length - pos;
6791
+
6792
+ var adler = adler32(literals, 0, literals.length); // checksum
6793
+ idat[pi++] = adler >> 24 & 0xff;
6794
+ idat[pi++] = adler >> 16 & 0xff;
6795
+ idat[pi++] = adler >> 8 & 0xff;
6796
+ idat[pi++] = adler & 0xff;
6797
+
6798
+ // PNG will consists: header, IHDR+data, IDAT+data, and IEND.
6799
+ var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +
6800
+ ihdr.length + idat.length;
6801
+ var data = new Uint8Array(pngLength);
6802
+ var offset = 0;
6803
+ data.set(PNG_HEADER, offset);
6804
+ offset += PNG_HEADER.length;
6805
+ writePngChunk('IHDR', ihdr, data, offset);
6806
+ offset += CHUNK_WRAPPER_SIZE + ihdr.length;
6807
+ writePngChunk('IDATA', idat, data, offset);
6808
+ offset += CHUNK_WRAPPER_SIZE + idat.length;
6809
+ writePngChunk('IEND', new Uint8Array(0), data, offset);
6810
+
6811
+ return PDFJS.createObjectURL(data, 'image/png');
6812
+ }
6813
+
6814
+ return function convertImgDataToPng(imgData) {
6815
+ var kind = (imgData.kind === undefined ?
6816
+ ImageKind.GRAYSCALE_1BPP : imgData.kind);
6817
+ return encode(imgData, kind);
6818
+ };
6819
+ })();
6820
+
6821
+ var SVGExtraState = (function SVGExtraStateClosure() {
6822
+ function SVGExtraState() {
6823
+ this.fontSizeScale = 1;
6824
+ this.fontWeight = SVG_DEFAULTS.fontWeight;
6825
+ this.fontSize = 0;
6826
+
6827
+ this.textMatrix = IDENTITY_MATRIX;
6828
+ this.fontMatrix = FONT_IDENTITY_MATRIX;
6829
+ this.leading = 0;
6830
+
6831
+ // Current point (in user coordinates)
6832
+ this.x = 0;
6833
+ this.y = 0;
6834
+
6835
+ // Start of text line (in text coordinates)
6836
+ this.lineX = 0;
6837
+ this.lineY = 0;
6838
+
6839
+ // Character and word spacing
6840
+ this.charSpacing = 0;
6841
+ this.wordSpacing = 0;
6842
+ this.textHScale = 1;
6843
+ this.textRise = 0;
6844
+
6845
+ // Default foreground and background colors
6846
+ this.fillColor = SVG_DEFAULTS.fillColor;
6847
+ this.strokeColor = '#000000';
6848
+
6849
+ this.fillAlpha = 1;
6850
+ this.strokeAlpha = 1;
6851
+ this.lineWidth = 1;
6852
+ this.lineJoin = '';
6853
+ this.lineCap = '';
6854
+ this.miterLimit = 0;
6855
+
6856
+ this.dashArray = [];
6857
+ this.dashPhase = 0;
6858
+
6859
+ this.dependencies = [];
6860
+
6861
+ // Clipping
6862
+ this.clipId = '';
6863
+ this.pendingClip = false;
6864
+
6865
+ this.maskId = '';
6866
+ }
6867
+
6868
+ SVGExtraState.prototype = {
6869
+ clone: function SVGExtraState_clone() {
6870
+ return Object.create(this);
6871
+ },
6872
+ setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
6873
+ this.x = x;
6874
+ this.y = y;
6875
+ }
6876
+ };
6877
+ return SVGExtraState;
6878
+ })();
6879
+
6880
+ var SVGGraphics = (function SVGGraphicsClosure() {
6881
+ function createScratchSVG(width, height) {
6882
+ var NS = 'http://www.w3.org/2000/svg';
6883
+ var svg = document.createElementNS(NS, 'svg:svg');
6884
+ svg.setAttributeNS(null, 'version', '1.1');
6885
+ svg.setAttributeNS(null, 'width', width + 'px');
6886
+ svg.setAttributeNS(null, 'height', height + 'px');
6887
+ svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
6888
+ return svg;
6889
+ }
6890
+
6891
+ function opListToTree(opList) {
6892
+ var opTree = [];
6893
+ var tmp = [];
6894
+ var opListLen = opList.length;
6895
+
6896
+ for (var x = 0; x < opListLen; x++) {
6897
+ if (opList[x].fn === 'save') {
6898
+ opTree.push({'fnId': 92, 'fn': 'group', 'items': []});
6899
+ tmp.push(opTree);
6900
+ opTree = opTree[opTree.length - 1].items;
6901
+ continue;
6902
+ }
6903
+
6904
+ if(opList[x].fn === 'restore') {
6905
+ opTree = tmp.pop();
6906
+ } else {
6907
+ opTree.push(opList[x]);
6908
+ }
6909
+ }
6910
+ return opTree;
6911
+ }
6912
+
6913
+ /**
6914
+ * Formats float number.
6915
+ * @param value {number} number to format.
6916
+ * @returns {string}
6917
+ */
6918
+ function pf(value) {
6919
+ if (value === (value | 0)) { // integer number
6920
+ return value.toString();
6921
+ }
6922
+ var s = value.toFixed(10);
6923
+ var i = s.length - 1;
6924
+ if (s[i] !== '0') {
6925
+ return s;
6926
+ }
6927
+ // removing trailing zeros
6928
+ do {
6929
+ i--;
6930
+ } while (s[i] === '0');
6931
+ return s.substr(0, s[i] === '.' ? i : i + 1);
6932
+ }
6933
+
6934
+ /**
6935
+ * Formats transform matrix. The standard rotation, scale and translate
6936
+ * matrices are replaced by their shorter forms, and for identity matrix
6937
+ * returns empty string to save the memory.
6938
+ * @param m {Array} matrix to format.
6939
+ * @returns {string}
6940
+ */
6941
+ function pm(m) {
6942
+ if (m[4] === 0 && m[5] === 0) {
6943
+ if (m[1] === 0 && m[2] === 0) {
6944
+ if (m[0] === 1 && m[3] === 1) {
6945
+ return '';
6946
+ }
6947
+ return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
6948
+ }
6949
+ if (m[0] === m[3] && m[1] === -m[2]) {
6950
+ var a = Math.acos(m[0]) * 180 / Math.PI;
6951
+ return 'rotate(' + pf(a) + ')';
6952
+ }
6953
+ } else {
6954
+ if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
6955
+ return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
6956
+ }
6957
+ }
6958
+ return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +
6959
+ pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
6960
+ }
6961
+
6962
+ function SVGGraphics(commonObjs, objs) {
6963
+ this.current = new SVGExtraState();
6964
+ this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
6965
+ this.transformStack = [];
6966
+ this.extraStack = [];
6967
+ this.commonObjs = commonObjs;
6968
+ this.objs = objs;
6969
+ this.pendingEOFill = false;
6970
+
6971
+ this.embedFonts = false;
6972
+ this.embeddedFonts = {};
6973
+ this.cssStyle = null;
6974
+ }
6975
+
6976
+ var NS = 'http://www.w3.org/2000/svg';
6977
+ var XML_NS = 'http://www.w3.org/XML/1998/namespace';
6978
+ var XLINK_NS = 'http://www.w3.org/1999/xlink';
6979
+ var LINE_CAP_STYLES = ['butt', 'round', 'square'];
6980
+ var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
6981
+ var clipCount = 0;
6982
+ var maskCount = 0;
6983
+
6984
+ SVGGraphics.prototype = {
6985
+ save: function SVGGraphics_save() {
6986
+ this.transformStack.push(this.transformMatrix);
6987
+ var old = this.current;
6988
+ this.extraStack.push(old);
6989
+ this.current = old.clone();
6990
+ },
6991
+
6992
+ restore: function SVGGraphics_restore() {
6993
+ this.transformMatrix = this.transformStack.pop();
6994
+ this.current = this.extraStack.pop();
6995
+
6996
+ this.tgrp = document.createElementNS(NS, 'svg:g');
6997
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
6998
+ this.pgrp.appendChild(this.tgrp);
6999
+ },
7000
+
7001
+ group: function SVGGraphics_group(items) {
7002
+ this.save();
7003
+ this.executeOpTree(items);
7004
+ this.restore();
7005
+ },
7006
+
7007
+ loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
7008
+ var fnArray = operatorList.fnArray;
7009
+ var fnArrayLen = fnArray.length;
7010
+ var argsArray = operatorList.argsArray;
7011
+
7012
+ var self = this;
7013
+ for (var i = 0; i < fnArrayLen; i++) {
7014
+ if (OPS.dependency === fnArray[i]) {
7015
+ var deps = argsArray[i];
7016
+ for (var n = 0, nn = deps.length; n < nn; n++) {
7017
+ var obj = deps[n];
7018
+ var common = obj.substring(0, 2) === 'g_';
7019
+ var promise;
7020
+ if (common) {
7021
+ promise = new Promise(function(resolve) {
7022
+ self.commonObjs.get(obj, resolve);
7023
+ });
7024
+ } else {
7025
+ promise = new Promise(function(resolve) {
7026
+ self.objs.get(obj, resolve);
7027
+ });
7028
+ }
7029
+ this.current.dependencies.push(promise);
7030
+ }
7031
+ }
7032
+ }
7033
+ return Promise.all(this.current.dependencies);
7034
+ },
7035
+
7036
+ transform: function SVGGraphics_transform(a, b, c, d, e, f) {
7037
+ var transformMatrix = [a, b, c, d, e, f];
7038
+ this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,
7039
+ transformMatrix);
7040
+
7041
+ this.tgrp = document.createElementNS(NS, 'svg:g');
7042
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
7043
+ },
7044
+
7045
+ getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
7046
+ this.svg = createScratchSVG(viewport.width, viewport.height);
7047
+ this.viewport = viewport;
7048
+
7049
+ return this.loadDependencies(operatorList).then(function () {
7050
+ this.transformMatrix = IDENTITY_MATRIX;
7051
+ this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
7052
+ this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
7053
+ this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
7054
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
7055
+ this.defs = document.createElementNS(NS, 'svg:defs');
7056
+ this.pgrp.appendChild(this.defs);
7057
+ this.pgrp.appendChild(this.tgrp);
7058
+ this.svg.appendChild(this.pgrp);
7059
+ var opTree = this.convertOpList(operatorList);
7060
+ this.executeOpTree(opTree);
7061
+ return this.svg;
7062
+ }.bind(this));
7063
+ },
7064
+
7065
+ convertOpList: function SVGGraphics_convertOpList(operatorList) {
7066
+ var argsArray = operatorList.argsArray;
7067
+ var fnArray = operatorList.fnArray;
7068
+ var fnArrayLen = fnArray.length;
7069
+ var REVOPS = [];
7070
+ var opList = [];
7071
+
7072
+ for (var op in OPS) {
7073
+ REVOPS[OPS[op]] = op;
7074
+ }
7075
+
7076
+ for (var x = 0; x < fnArrayLen; x++) {
7077
+ var fnId = fnArray[x];
7078
+ opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});
7079
+ }
7080
+ return opListToTree(opList);
7081
+ },
7082
+
7083
+ executeOpTree: function SVGGraphics_executeOpTree(opTree) {
7084
+ var opTreeLen = opTree.length;
7085
+ for(var x = 0; x < opTreeLen; x++) {
7086
+ var fn = opTree[x].fn;
7087
+ var fnId = opTree[x].fnId;
7088
+ var args = opTree[x].args;
7089
+
7090
+ switch (fnId | 0) {
7091
+ case OPS.beginText:
7092
+ this.beginText();
7093
+ break;
7094
+ case OPS.setLeading:
7095
+ this.setLeading(args);
7096
+ break;
7097
+ case OPS.setLeadingMoveText:
7098
+ this.setLeadingMoveText(args[0], args[1]);
7099
+ break;
7100
+ case OPS.setFont:
7101
+ this.setFont(args);
7102
+ break;
7103
+ case OPS.showText:
7104
+ this.showText(args[0]);
7105
+ break;
7106
+ case OPS.showSpacedText:
7107
+ this.showText(args[0]);
7108
+ break;
7109
+ case OPS.endText:
7110
+ this.endText();
7111
+ break;
7112
+ case OPS.moveText:
7113
+ this.moveText(args[0], args[1]);
7114
+ break;
7115
+ case OPS.setCharSpacing:
7116
+ this.setCharSpacing(args[0]);
7117
+ break;
7118
+ case OPS.setWordSpacing:
7119
+ this.setWordSpacing(args[0]);
7120
+ break;
7121
+ case OPS.setTextMatrix:
7122
+ this.setTextMatrix(args[0], args[1], args[2],
7123
+ args[3], args[4], args[5]);
7124
+ break;
7125
+ case OPS.setLineWidth:
7126
+ this.setLineWidth(args[0]);
7127
+ break;
7128
+ case OPS.setLineJoin:
7129
+ this.setLineJoin(args[0]);
7130
+ break;
7131
+ case OPS.setLineCap:
7132
+ this.setLineCap(args[0]);
7133
+ break;
7134
+ case OPS.setMiterLimit:
7135
+ this.setMiterLimit(args[0]);
7136
+ break;
7137
+ case OPS.setFillRGBColor:
7138
+ this.setFillRGBColor(args[0], args[1], args[2]);
7139
+ break;
7140
+ case OPS.setStrokeRGBColor:
7141
+ this.setStrokeRGBColor(args[0], args[1], args[2]);
7142
+ break;
7143
+ case OPS.setDash:
7144
+ this.setDash(args[0], args[1]);
7145
+ break;
7146
+ case OPS.setGState:
7147
+ this.setGState(args[0]);
7148
+ break;
7149
+ case OPS.fill:
7150
+ this.fill();
7151
+ break;
7152
+ case OPS.eoFill:
7153
+ this.eoFill();
7154
+ break;
7155
+ case OPS.stroke:
7156
+ this.stroke();
7157
+ break;
7158
+ case OPS.fillStroke:
7159
+ this.fillStroke();
7160
+ break;
7161
+ case OPS.eoFillStroke:
7162
+ this.eoFillStroke();
7163
+ break;
7164
+ case OPS.clip:
7165
+ this.clip('nonzero');
7166
+ break;
7167
+ case OPS.eoClip:
7168
+ this.clip('evenodd');
7169
+ break;
7170
+ case OPS.paintSolidColorImageMask:
7171
+ this.paintSolidColorImageMask();
7172
+ break;
7173
+ case OPS.paintJpegXObject:
7174
+ this.paintJpegXObject(args[0], args[1], args[2]);
7175
+ break;
7176
+ case OPS.paintImageXObject:
7177
+ this.paintImageXObject(args[0]);
7178
+ break;
7179
+ case OPS.paintInlineImageXObject:
7180
+ this.paintInlineImageXObject(args[0]);
7181
+ break;
7182
+ case OPS.paintImageMaskXObject:
7183
+ this.paintImageMaskXObject(args[0]);
7184
+ break;
7185
+ case OPS.paintFormXObjectBegin:
7186
+ this.paintFormXObjectBegin(args[0], args[1]);
7187
+ break;
7188
+ case OPS.paintFormXObjectEnd:
7189
+ this.paintFormXObjectEnd();
7190
+ break;
7191
+ case OPS.closePath:
7192
+ this.closePath();
7193
+ break;
7194
+ case OPS.closeStroke:
7195
+ this.closeStroke();
7196
+ break;
7197
+ case OPS.closeFillStroke:
7198
+ this.closeFillStroke();
7199
+ break;
7200
+ case OPS.nextLine:
7201
+ this.nextLine();
7202
+ break;
7203
+ case OPS.transform:
7204
+ this.transform(args[0], args[1], args[2], args[3],
7205
+ args[4], args[5]);
7206
+ break;
7207
+ case OPS.constructPath:
7208
+ this.constructPath(args[0], args[1]);
7209
+ break;
7210
+ case OPS.endPath:
7211
+ this.endPath();
7212
+ break;
7213
+ case 92:
7214
+ this.group(opTree[x].items);
7215
+ break;
7216
+ default:
7217
+ warn('Unimplemented method '+ fn);
7218
+ break;
7219
+ }
7220
+ }
7221
+ },
7222
+
7223
+ setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
7224
+ this.current.wordSpacing = wordSpacing;
7225
+ },
7226
+
7227
+ setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
7228
+ this.current.charSpacing = charSpacing;
7229
+ },
7230
+
7231
+ nextLine: function SVGGraphics_nextLine() {
7232
+ this.moveText(0, this.current.leading);
7233
+ },
7234
+
7235
+ setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
7236
+ var current = this.current;
7237
+ this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
7238
+
7239
+ this.current.x = this.current.lineX = 0;
7240
+ this.current.y = this.current.lineY = 0;
7241
+
7242
+ current.xcoords = [];
7243
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
7244
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
7245
+ current.tspan.setAttributeNS(null, 'font-size',
7246
+ pf(current.fontSize) + 'px');
7247
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
7248
+
7249
+ current.txtElement = document.createElementNS(NS, 'svg:text');
7250
+ current.txtElement.appendChild(current.tspan);
7251
+ },
7252
+
7253
+ beginText: function SVGGraphics_beginText() {
7254
+ this.current.x = this.current.lineX = 0;
7255
+ this.current.y = this.current.lineY = 0;
7256
+ this.current.textMatrix = IDENTITY_MATRIX;
7257
+ this.current.lineMatrix = IDENTITY_MATRIX;
7258
+ this.current.tspan = document.createElementNS(NS, 'svg:tspan');
7259
+ this.current.txtElement = document.createElementNS(NS, 'svg:text');
7260
+ this.current.txtgrp = document.createElementNS(NS, 'svg:g');
7261
+ this.current.xcoords = [];
7262
+ },
7263
+
7264
+ moveText: function SVGGraphics_moveText(x, y) {
7265
+ var current = this.current;
7266
+ this.current.x = this.current.lineX += x;
7267
+ this.current.y = this.current.lineY += y;
7268
+
7269
+ current.xcoords = [];
7270
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
7271
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
7272
+ current.tspan.setAttributeNS(null, 'font-size',
7273
+ pf(current.fontSize) + 'px');
7274
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
7275
+ },
7276
+
7277
+ showText: function SVGGraphics_showText(glyphs) {
7278
+ var current = this.current;
7279
+ var font = current.font;
7280
+ var fontSize = current.fontSize;
7281
+
7282
+ if (fontSize === 0) {
7283
+ return;
7284
+ }
7285
+
7286
+ var charSpacing = current.charSpacing;
7287
+ var wordSpacing = current.wordSpacing;
7288
+ var fontDirection = current.fontDirection;
7289
+ var textHScale = current.textHScale * fontDirection;
7290
+ var glyphsLength = glyphs.length;
7291
+ var vertical = font.vertical;
7292
+ var widthAdvanceScale = fontSize * current.fontMatrix[0];
7293
+
7294
+ var x = 0, i;
7295
+ for (i = 0; i < glyphsLength; ++i) {
7296
+ var glyph = glyphs[i];
7297
+ if (glyph === null) {
7298
+ // word break
7299
+ x += fontDirection * wordSpacing;
7300
+ continue;
7301
+ } else if (isNum(glyph)) {
7302
+ x += -glyph * fontSize * 0.001;
7303
+ continue;
7304
+ }
7305
+ current.xcoords.push(current.x + x * textHScale);
7306
+
7307
+ var width = glyph.width;
7308
+ var character = glyph.fontChar;
7309
+ var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
7310
+ x += charWidth;
7311
+
7312
+ current.tspan.textContent += character;
7313
+ }
7314
+ if (vertical) {
7315
+ current.y -= x * textHScale;
7316
+ } else {
7317
+ current.x += x * textHScale;
7318
+ }
7319
+
7320
+ current.tspan.setAttributeNS(null, 'x',
7321
+ current.xcoords.map(pf).join(' '));
7322
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
7323
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
7324
+ current.tspan.setAttributeNS(null, 'font-size',
7325
+ pf(current.fontSize) + 'px');
7326
+ if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
7327
+ current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
7328
+ }
7329
+ if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
7330
+ current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
7331
+ }
7332
+ if (current.fillColor !== SVG_DEFAULTS.fillColor) {
7333
+ current.tspan.setAttributeNS(null, 'fill', current.fillColor);
7334
+ }
7335
+
7336
+ current.txtElement.setAttributeNS(null, 'transform',
7337
+ pm(current.textMatrix) +
7338
+ ' scale(1, -1)' );
7339
+ current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
7340
+ current.txtElement.appendChild(current.tspan);
7341
+ current.txtgrp.appendChild(current.txtElement);
7342
+
7343
+ this.tgrp.appendChild(current.txtElement);
7344
+
7345
+ },
7346
+
7347
+ setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
7348
+ this.setLeading(-y);
7349
+ this.moveText(x, y);
7350
+ },
7351
+
7352
+ addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
7353
+ if (!this.cssStyle) {
7354
+ this.cssStyle = document.createElementNS(NS, 'svg:style');
7355
+ this.cssStyle.setAttributeNS(null, 'type', 'text/css');
7356
+ this.defs.appendChild(this.cssStyle);
7357
+ }
7358
+
7359
+ var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
7360
+ this.cssStyle.textContent +=
7361
+ '@font-face { font-family: "' + fontObj.loadedName + '";' +
7362
+ ' src: url(' + url + '); }\n';
7363
+ },
7364
+
7365
+ setFont: function SVGGraphics_setFont(details) {
7366
+ var current = this.current;
7367
+ var fontObj = this.commonObjs.get(details[0]);
7368
+ var size = details[1];
7369
+ this.current.font = fontObj;
7370
+
7371
+ if (this.embedFonts && fontObj.data &&
7372
+ !this.embeddedFonts[fontObj.loadedName]) {
7373
+ this.addFontStyle(fontObj);
7374
+ this.embeddedFonts[fontObj.loadedName] = fontObj;
7375
+ }
7376
+
7377
+ current.fontMatrix = (fontObj.fontMatrix ?
7378
+ fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
7379
+
7380
+ var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
7381
+ (fontObj.bold ? 'bold' : 'normal');
7382
+ var italic = fontObj.italic ? 'italic' : 'normal';
7383
+
7384
+ if (size < 0) {
7385
+ size = -size;
7386
+ current.fontDirection = -1;
7387
+ } else {
7388
+ current.fontDirection = 1;
7389
+ }
7390
+ current.fontSize = size;
7391
+ current.fontFamily = fontObj.loadedName;
7392
+ current.fontWeight = bold;
7393
+ current.fontStyle = italic;
7394
+
7395
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
7396
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
7397
+ current.xcoords = [];
7398
+ },
7399
+
7400
+ endText: function SVGGraphics_endText() {
7401
+ if (this.current.pendingClip) {
7402
+ this.cgrp.appendChild(this.tgrp);
7403
+ this.pgrp.appendChild(this.cgrp);
7404
+ } else {
7405
+ this.pgrp.appendChild(this.tgrp);
7406
+ }
7407
+ this.tgrp = document.createElementNS(NS, 'svg:g');
7408
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
7409
+ },
7410
+
7411
+ // Path properties
7412
+ setLineWidth: function SVGGraphics_setLineWidth(width) {
7413
+ this.current.lineWidth = width;
7414
+ },
7415
+ setLineCap: function SVGGraphics_setLineCap(style) {
7416
+ this.current.lineCap = LINE_CAP_STYLES[style];
7417
+ },
7418
+ setLineJoin: function SVGGraphics_setLineJoin(style) {
7419
+ this.current.lineJoin = LINE_JOIN_STYLES[style];
7420
+ },
7421
+ setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
7422
+ this.current.miterLimit = limit;
7423
+ },
7424
+ setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
7425
+ var color = Util.makeCssRgb(r, g, b);
7426
+ this.current.strokeColor = color;
7427
+ },
7428
+ setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
7429
+ var color = Util.makeCssRgb(r, g, b);
7430
+ this.current.fillColor = color;
7431
+ this.current.tspan = document.createElementNS(NS, 'svg:tspan');
7432
+ this.current.xcoords = [];
7433
+ },
7434
+ setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
7435
+ this.current.dashArray = dashArray;
7436
+ this.current.dashPhase = dashPhase;
7437
+ },
7438
+
7439
+ constructPath: function SVGGraphics_constructPath(ops, args) {
7440
+ var current = this.current;
7441
+ var x = current.x, y = current.y;
7442
+ current.path = document.createElementNS(NS, 'svg:path');
7443
+ var d = [];
7444
+ var opLength = ops.length;
7445
+
7446
+ for (var i = 0, j = 0; i < opLength; i++) {
7447
+ switch (ops[i] | 0) {
7448
+ case OPS.rectangle:
7449
+ x = args[j++];
7450
+ y = args[j++];
7451
+ var width = args[j++];
7452
+ var height = args[j++];
7453
+ var xw = x + width;
7454
+ var yh = y + height;
7455
+ d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),
7456
+ 'L', pf(x), pf(yh), 'Z');
7457
+ break;
7458
+ case OPS.moveTo:
7459
+ x = args[j++];
7460
+ y = args[j++];
7461
+ d.push('M', pf(x), pf(y));
7462
+ break;
7463
+ case OPS.lineTo:
7464
+ x = args[j++];
7465
+ y = args[j++];
7466
+ d.push('L', pf(x) , pf(y));
7467
+ break;
7468
+ case OPS.curveTo:
7469
+ x = args[j + 4];
7470
+ y = args[j + 5];
7471
+ d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),
7472
+ pf(args[j + 3]), pf(x), pf(y));
7473
+ j += 6;
7474
+ break;
7475
+ case OPS.curveTo2:
7476
+ x = args[j + 2];
7477
+ y = args[j + 3];
7478
+ d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),
7479
+ pf(args[j + 2]), pf(args[j + 3]));
7480
+ j += 4;
7481
+ break;
7482
+ case OPS.curveTo3:
7483
+ x = args[j + 2];
7484
+ y = args[j + 3];
7485
+ d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
7486
+ pf(x), pf(y));
7487
+ j += 4;
7488
+ break;
7489
+ case OPS.closePath:
7490
+ d.push('Z');
7491
+ break;
7492
+ }
7493
+ }
7494
+ current.path.setAttributeNS(null, 'd', d.join(' '));
7495
+ current.path.setAttributeNS(null, 'stroke-miterlimit',
7496
+ pf(current.miterLimit));
7497
+ current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);
7498
+ current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
7499
+ current.path.setAttributeNS(null, 'stroke-width',
7500
+ pf(current.lineWidth) + 'px');
7501
+ current.path.setAttributeNS(null, 'stroke-dasharray',
7502
+ current.dashArray.map(pf).join(' '));
7503
+ current.path.setAttributeNS(null, 'stroke-dashoffset',
7504
+ pf(current.dashPhase) + 'px');
7505
+ current.path.setAttributeNS(null, 'fill', 'none');
7506
+
7507
+ this.tgrp.appendChild(current.path);
7508
+ if (current.pendingClip) {
7509
+ this.cgrp.appendChild(this.tgrp);
7510
+ this.pgrp.appendChild(this.cgrp);
7511
+ } else {
7512
+ this.pgrp.appendChild(this.tgrp);
7513
+ }
7514
+ // Saving a reference in current.element so that it can be addressed
7515
+ // in 'fill' and 'stroke'
7516
+ current.element = current.path;
7517
+ current.setCurrentPoint(x, y);
7518
+ },
7519
+
7520
+ endPath: function SVGGraphics_endPath() {
7521
+ var current = this.current;
7522
+ if (current.pendingClip) {
7523
+ this.cgrp.appendChild(this.tgrp);
7524
+ this.pgrp.appendChild(this.cgrp);
7525
+ } else {
7526
+ this.pgrp.appendChild(this.tgrp);
7527
+ }
7528
+ this.tgrp = document.createElementNS(NS, 'svg:g');
7529
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
7530
+ },
7531
+
7532
+ clip: function SVGGraphics_clip(type) {
7533
+ var current = this.current;
7534
+ // Add current path to clipping path
7535
+ current.clipId = 'clippath' + clipCount;
7536
+ clipCount++;
7537
+ this.clippath = document.createElementNS(NS, 'svg:clipPath');
7538
+ this.clippath.setAttributeNS(null, 'id', current.clipId);
7539
+ var clipElement = current.element.cloneNode();
7540
+ if (type === 'evenodd') {
7541
+ clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
7542
+ } else {
7543
+ clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
7544
+ }
7545
+ this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
7546
+ this.clippath.appendChild(clipElement);
7547
+ this.defs.appendChild(this.clippath);
7548
+
7549
+ // Create a new group with that attribute
7550
+ current.pendingClip = true;
7551
+ this.cgrp = document.createElementNS(NS, 'svg:g');
7552
+ this.cgrp.setAttributeNS(null, 'clip-path',
7553
+ 'url(#' + current.clipId + ')');
7554
+ this.pgrp.appendChild(this.cgrp);
7555
+ },
7556
+
7557
+ closePath: function SVGGraphics_closePath() {
7558
+ var current = this.current;
7559
+ var d = current.path.getAttributeNS(null, 'd');
7560
+ d += 'Z';
7561
+ current.path.setAttributeNS(null, 'd', d);
7562
+ },
7563
+
7564
+ setLeading: function SVGGraphics_setLeading(leading) {
7565
+ this.current.leading = -leading;
7566
+ },
7567
+
7568
+ setTextRise: function SVGGraphics_setTextRise(textRise) {
7569
+ this.current.textRise = textRise;
7570
+ },
7571
+
7572
+ setHScale: function SVGGraphics_setHScale(scale) {
7573
+ this.current.textHScale = scale / 100;
7574
+ },
7575
+
7576
+ setGState: function SVGGraphics_setGState(states) {
7577
+ for (var i = 0, ii = states.length; i < ii; i++) {
7578
+ var state = states[i];
7579
+ var key = state[0];
7580
+ var value = state[1];
7581
+
7582
+ switch (key) {
7583
+ case 'LW':
7584
+ this.setLineWidth(value);
7585
+ break;
7586
+ case 'LC':
7587
+ this.setLineCap(value);
7588
+ break;
7589
+ case 'LJ':
7590
+ this.setLineJoin(value);
7591
+ break;
7592
+ case 'ML':
7593
+ this.setMiterLimit(value);
7594
+ break;
7595
+ case 'D':
7596
+ this.setDash(value[0], value[1]);
7597
+ break;
7598
+ case 'RI':
7599
+ break;
7600
+ case 'FL':
7601
+ break;
7602
+ case 'Font':
7603
+ this.setFont(value);
7604
+ break;
7605
+ case 'CA':
7606
+ break;
7607
+ case 'ca':
7608
+ break;
7609
+ case 'BM':
7610
+ break;
7611
+ case 'SMask':
7612
+ break;
7613
+ }
7614
+ }
7615
+ },
7616
+
7617
+ fill: function SVGGraphics_fill() {
7618
+ var current = this.current;
7619
+ current.element.setAttributeNS(null, 'fill', current.fillColor);
7620
+ },
7621
+
7622
+ stroke: function SVGGraphics_stroke() {
7623
+ var current = this.current;
7624
+ current.element.setAttributeNS(null, 'stroke', current.strokeColor);
7625
+ current.element.setAttributeNS(null, 'fill', 'none');
7626
+ },
7627
+
7628
+ eoFill: function SVGGraphics_eoFill() {
7629
+ var current = this.current;
7630
+ current.element.setAttributeNS(null, 'fill', current.fillColor);
7631
+ current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
7632
+ },
7633
+
7634
+ fillStroke: function SVGGraphics_fillStroke() {
7635
+ // Order is important since stroke wants fill to be none.
7636
+ // First stroke, then if fill needed, it will be overwritten.
7637
+ this.stroke();
7638
+ this.fill();
7639
+ },
7640
+
7641
+ eoFillStroke: function SVGGraphics_eoFillStroke() {
7642
+ this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
7643
+ this.fillStroke();
7644
+ },
7645
+
7646
+ closeStroke: function SVGGraphics_closeStroke() {
7647
+ this.closePath();
7648
+ this.stroke();
7649
+ },
7650
+
7651
+ closeFillStroke: function SVGGraphics_closeFillStroke() {
7652
+ this.closePath();
7653
+ this.fillStroke();
7654
+ },
7655
+
7656
+ paintSolidColorImageMask:
7657
+ function SVGGraphics_paintSolidColorImageMask() {
7658
+ var current = this.current;
7659
+ var rect = document.createElementNS(NS, 'svg:rect');
7660
+ rect.setAttributeNS(null, 'x', '0');
7661
+ rect.setAttributeNS(null, 'y', '0');
7662
+ rect.setAttributeNS(null, 'width', '1px');
7663
+ rect.setAttributeNS(null, 'height', '1px');
7664
+ rect.setAttributeNS(null, 'fill', current.fillColor);
7665
+ this.tgrp.appendChild(rect);
7666
+ },
7667
+
7668
+ paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
7669
+ var current = this.current;
7670
+ var imgObj = this.objs.get(objId);
7671
+ var imgEl = document.createElementNS(NS, 'svg:image');
7672
+ imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
7673
+ imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
7674
+ imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
7675
+ imgEl.setAttributeNS(null, 'x', '0');
7676
+ imgEl.setAttributeNS(null, 'y', pf(-h));
7677
+ imgEl.setAttributeNS(null, 'transform',
7678
+ 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
7679
+
7680
+ this.tgrp.appendChild(imgEl);
7681
+ if (current.pendingClip) {
7682
+ this.cgrp.appendChild(this.tgrp);
7683
+ this.pgrp.appendChild(this.cgrp);
7684
+ } else {
7685
+ this.pgrp.appendChild(this.tgrp);
7686
+ }
7687
+ },
7688
+
7689
+ paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
7690
+ var imgData = this.objs.get(objId);
7691
+ if (!imgData) {
7692
+ warn('Dependent image isn\'t ready yet');
7693
+ return;
7694
+ }
7695
+ this.paintInlineImageXObject(imgData);
7696
+ },
7697
+
7698
+ paintInlineImageXObject:
7699
+ function SVGGraphics_paintInlineImageXObject(imgData, mask) {
7700
+ var current = this.current;
7701
+ var width = imgData.width;
7702
+ var height = imgData.height;
7703
+
7704
+ var imgSrc = convertImgDataToPng(imgData);
7705
+ var cliprect = document.createElementNS(NS, 'svg:rect');
7706
+ cliprect.setAttributeNS(null, 'x', '0');
7707
+ cliprect.setAttributeNS(null, 'y', '0');
7708
+ cliprect.setAttributeNS(null, 'width', pf(width));
7709
+ cliprect.setAttributeNS(null, 'height', pf(height));
7710
+ current.element = cliprect;
7711
+ this.clip('nonzero');
7712
+ var imgEl = document.createElementNS(NS, 'svg:image');
7713
+ imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
7714
+ imgEl.setAttributeNS(null, 'x', '0');
7715
+ imgEl.setAttributeNS(null, 'y', pf(-height));
7716
+ imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
7717
+ imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
7718
+ imgEl.setAttributeNS(null, 'transform',
7719
+ 'scale(' + pf(1 / width) + ' ' +
7720
+ pf(-1 / height) + ')');
7721
+ if (mask) {
7722
+ mask.appendChild(imgEl);
7723
+ } else {
7724
+ this.tgrp.appendChild(imgEl);
7725
+ }
7726
+ if (current.pendingClip) {
7727
+ this.cgrp.appendChild(this.tgrp);
7728
+ this.pgrp.appendChild(this.cgrp);
7729
+ } else {
7730
+ this.pgrp.appendChild(this.tgrp);
7731
+ }
7732
+ },
7733
+
7734
+ paintImageMaskXObject:
7735
+ function SVGGraphics_paintImageMaskXObject(imgData) {
7736
+ var current = this.current;
7737
+ var width = imgData.width;
7738
+ var height = imgData.height;
7739
+ var fillColor = current.fillColor;
7740
+
7741
+ current.maskId = 'mask' + maskCount++;
7742
+ var mask = document.createElementNS(NS, 'svg:mask');
7743
+ mask.setAttributeNS(null, 'id', current.maskId);
7744
+
7745
+ var rect = document.createElementNS(NS, 'svg:rect');
7746
+ rect.setAttributeNS(null, 'x', '0');
7747
+ rect.setAttributeNS(null, 'y', '0');
7748
+ rect.setAttributeNS(null, 'width', pf(width));
7749
+ rect.setAttributeNS(null, 'height', pf(height));
7750
+ rect.setAttributeNS(null, 'fill', fillColor);
7751
+ rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');
7752
+ this.defs.appendChild(mask);
7753
+ this.tgrp.appendChild(rect);
7754
+
7755
+ this.paintInlineImageXObject(imgData, mask);
7756
+ },
7757
+
7758
+ paintFormXObjectBegin:
7759
+ function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
7760
+ this.save();
7761
+
7762
+ if (isArray(matrix) && matrix.length === 6) {
7763
+ this.transform(matrix[0], matrix[1], matrix[2],
7764
+ matrix[3], matrix[4], matrix[5]);
7765
+ }
7766
+
7767
+ if (isArray(bbox) && bbox.length === 4) {
7768
+ var width = bbox[2] - bbox[0];
7769
+ var height = bbox[3] - bbox[1];
7770
+
7771
+ var cliprect = document.createElementNS(NS, 'svg:rect');
7772
+ cliprect.setAttributeNS(null, 'x', bbox[0]);
7773
+ cliprect.setAttributeNS(null, 'y', bbox[1]);
7774
+ cliprect.setAttributeNS(null, 'width', pf(width));
7775
+ cliprect.setAttributeNS(null, 'height', pf(height));
7776
+ this.current.element = cliprect;
7777
+ this.clip('nonzero');
7778
+ this.endPath();
7779
+ }
7780
+ },
7781
+
7782
+ paintFormXObjectEnd:
7783
+ function SVGGraphics_paintFormXObjectEnd() {
7784
+ this.restore();
7785
+ }
7786
+ };
7787
+ return SVGGraphics;
7788
+ })();
7789
+
7790
+ PDFJS.SVGGraphics = SVGGraphics;
7791
+
7792
+
7793
+ }).call((typeof window === 'undefined') ? this : window);
7794
+
7795
+ if (!PDFJS.workerSrc && typeof document !== 'undefined') {
7796
+ // workerSrc is not set -- using last script url to define default location
7797
+ PDFJS.workerSrc = (function () {
7798
+ 'use strict';
7799
+ var scriptTagContainer = document.body ||
7800
+ document.getElementsByTagName('head')[0];
7801
+ var pdfjsSrc = scriptTagContainer.lastChild.src;
7802
+ return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
7803
+ })();
7804
+ }
7805
+
6501
7806
 
6502
- if (!PDFJS.workerSrc && typeof document !== 'undefined') {
6503
- // workerSrc is not set -- using last script url to define default location
6504
- PDFJS.workerSrc = (function () {
6505
- 'use strict';
6506
- var scriptTagContainer = document.body ||
6507
- document.getElementsByTagName('head')[0];
6508
- var pdfjsSrc = scriptTagContainer.lastChild.src;
6509
- return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
6510
- })();
6511
- }