|  | @@ -21,8 +21,8 @@ if (typeof PDFJS === 'undefined') {
 | 
											
												
													
														|  |     typeof global !== 'undefined' ? global : this).PDFJS = {};
 |  |     typeof global !== 'undefined' ? global : this).PDFJS = {};
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -PDFJS.version = '1.3.137';
 |  | 
 | 
											
												
													
														|  | -PDFJS.build = 'b8e7efa';
 |  | 
 | 
											
												
													
														|  | 
 |  | +PDFJS.version = '1.3.142';
 | 
											
												
													
														|  | 
 |  | +PDFJS.build = 'e8db825';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  (function pdfjsWrapper() {
 |  |  (function pdfjsWrapper() {
 | 
											
												
													
														|  |    // Use strict in our context only - users might not want it
 |  |    // Use strict in our context only - users might not want it
 | 
											
										
											
												
													
														|  | @@ -57,6 +57,74 @@ PDFJS.build = 'b8e7efa';
 | 
											
												
													
														|  |  }));
 |  |  }));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedGlobal);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedGlobal) {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +var PDFJS = sharedGlobal.PDFJS;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Optimised CSS custom property getter/setter.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var CustomStyle = (function CustomStyleClosure() {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/
 | 
											
												
													
														|  | 
 |  | +  //              animate-css-transforms-firefox-webkit.html
 | 
											
												
													
														|  | 
 |  | +  // in some versions of IE9 it is critical that ms appear in this list
 | 
											
												
													
														|  | 
 |  | +  // before Moz
 | 
											
												
													
														|  | 
 |  | +  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
 | 
											
												
													
														|  | 
 |  | +  var _cache = {};
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  function CustomStyle() {}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  CustomStyle.getProp = function get(propName, element) {
 | 
											
												
													
														|  | 
 |  | +    // check cache only when no element is given
 | 
											
												
													
														|  | 
 |  | +    if (arguments.length === 1 && typeof _cache[propName] === 'string') {
 | 
											
												
													
														|  | 
 |  | +      return _cache[propName];
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    element = element || document.documentElement;
 | 
											
												
													
														|  | 
 |  | +    var style = element.style, prefixed, uPropName;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // test standard property first
 | 
											
												
													
														|  | 
 |  | +    if (typeof style[propName] === 'string') {
 | 
											
												
													
														|  | 
 |  | +      return (_cache[propName] = propName);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // capitalize
 | 
											
												
													
														|  | 
 |  | +    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // test vendor specific properties
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0, l = prefixes.length; i < l; i++) {
 | 
											
												
													
														|  | 
 |  | +      prefixed = prefixes[i] + uPropName;
 | 
											
												
													
														|  | 
 |  | +      if (typeof style[prefixed] === 'string') {
 | 
											
												
													
														|  | 
 |  | +        return (_cache[propName] = prefixed);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    //if all fails then set to undefined
 | 
											
												
													
														|  | 
 |  | +    return (_cache[propName] = 'undefined');
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  CustomStyle.setProp = function set(propName, element, str) {
 | 
											
												
													
														|  | 
 |  | +    var prop = this.getProp(propName);
 | 
											
												
													
														|  | 
 |  | +    if (prop !== 'undefined') {
 | 
											
												
													
														|  | 
 |  | +      element.style[prop] = str;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  return CustomStyle;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +PDFJS.CustomStyle = CustomStyle;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +exports.CustomStyle = CustomStyle;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  (function (root, factory) {
 |  |  (function (root, factory) {
 | 
											
												
													
														|  |    {
 |  |    {
 | 
											
												
													
														|  |      factory((root.pdfjsSharedUtil = {}), root.pdfjsSharedGlobal);
 |  |      factory((root.pdfjsSharedUtil = {}), root.pdfjsSharedGlobal);
 | 
											
										
											
												
													
														|  | @@ -1727,74 +1795,6 @@ exports.warn = warn;
 | 
											
												
													
														|  |  }));
 |  |  }));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedGlobal);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}(this, function (exports, sharedGlobal) {
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var PDFJS = sharedGlobal.PDFJS;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Optimised CSS custom property getter/setter.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var CustomStyle = (function CustomStyleClosure() {
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/
 |  | 
 | 
											
												
													
														|  | -  //              animate-css-transforms-firefox-webkit.html
 |  | 
 | 
											
												
													
														|  | -  // in some versions of IE9 it is critical that ms appear in this list
 |  | 
 | 
											
												
													
														|  | -  // before Moz
 |  | 
 | 
											
												
													
														|  | -  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
 |  | 
 | 
											
												
													
														|  | -  var _cache = {};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  function CustomStyle() {}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  CustomStyle.getProp = function get(propName, element) {
 |  | 
 | 
											
												
													
														|  | -    // check cache only when no element is given
 |  | 
 | 
											
												
													
														|  | -    if (arguments.length === 1 && typeof _cache[propName] === 'string') {
 |  | 
 | 
											
												
													
														|  | -      return _cache[propName];
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    element = element || document.documentElement;
 |  | 
 | 
											
												
													
														|  | -    var style = element.style, prefixed, uPropName;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // test standard property first
 |  | 
 | 
											
												
													
														|  | -    if (typeof style[propName] === 'string') {
 |  | 
 | 
											
												
													
														|  | -      return (_cache[propName] = propName);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // capitalize
 |  | 
 | 
											
												
													
														|  | -    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // test vendor specific properties
 |  | 
 | 
											
												
													
														|  | -    for (var i = 0, l = prefixes.length; i < l; i++) {
 |  | 
 | 
											
												
													
														|  | -      prefixed = prefixes[i] + uPropName;
 |  | 
 | 
											
												
													
														|  | -      if (typeof style[prefixed] === 'string') {
 |  | 
 | 
											
												
													
														|  | -        return (_cache[propName] = prefixed);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    //if all fails then set to undefined
 |  | 
 | 
											
												
													
														|  | -    return (_cache[propName] = 'undefined');
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  CustomStyle.setProp = function set(propName, element, str) {
 |  | 
 | 
											
												
													
														|  | -    var prop = this.getProp(propName);
 |  | 
 | 
											
												
													
														|  | -    if (prop !== 'undefined') {
 |  | 
 | 
											
												
													
														|  | -      element.style[prop] = str;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  return CustomStyle;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -PDFJS.CustomStyle = CustomStyle;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -exports.CustomStyle = CustomStyle;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  (function (root, factory) {
 |  |  (function (root, factory) {
 | 
											
												
													
														|  |    {
 |  |    {
 | 
											
												
													
														|  |      factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil,
 |  |      factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil,
 | 
											
										
											
												
													
														|  | @@ -2974,6560 +2974,6587 @@ exports.Metadata = Metadata;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  (function (root, factory) {
 |  |  (function (root, factory) {
 | 
											
												
													
														|  |    {
 |  |    {
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil);
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  }(this, function (exports, sharedUtil) {
 |  |  }(this, function (exports, sharedUtil) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var createPromiseCapability = sharedUtil.createPromiseCapability;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Text layer render parameters.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} TextLayerRenderParameters
 |  | 
 | 
											
												
													
														|  | - * @property {TextContent} textContent - Text content to render (the object is
 |  | 
 | 
											
												
													
														|  | - *   returned by the page's getTextContent() method).
 |  | 
 | 
											
												
													
														|  | - * @property {HTMLElement} container - HTML element that will contain text runs.
 |  | 
 | 
											
												
													
														|  | - * @property {PDFJS.PageViewport} viewport - The target viewport to properly
 |  | 
 | 
											
												
													
														|  | - *   layout the text runs.
 |  | 
 | 
											
												
													
														|  | - * @property {Array} textDivs - (optional) HTML elements that are correspond
 |  | 
 | 
											
												
													
														|  | - *   the text items of the textContent input. This is output and shall be
 |  | 
 | 
											
												
													
														|  | - *   initially be set to empty array.
 |  | 
 | 
											
												
													
														|  | - * @property {number} timeout - (optional) Delay in milliseconds before
 |  | 
 | 
											
												
													
														|  | - *   rendering of the text  runs occurs.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var renderTextLayer = (function renderTextLayerClosure() {
 |  | 
 | 
											
												
													
														|  | -  var MAX_TEXT_DIVS_TO_RENDER = 100000;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var NonWhitespaceRegexp = /\S/;
 |  | 
 | 
											
												
													
														|  | 
 |  | +var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +var ImageKind = sharedUtil.ImageKind;
 | 
											
												
													
														|  | 
 |  | +var OPS = sharedUtil.OPS;
 | 
											
												
													
														|  | 
 |  | +var Util = sharedUtil.Util;
 | 
											
												
													
														|  | 
 |  | +var isNum = sharedUtil.isNum;
 | 
											
												
													
														|  | 
 |  | +var isArray = sharedUtil.isArray;
 | 
											
												
													
														|  | 
 |  | +var warn = sharedUtil.warn;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function isAllWhitespace(str) {
 |  | 
 | 
											
												
													
														|  | -    return !NonWhitespaceRegexp.test(str);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var SVG_DEFAULTS = {
 | 
											
												
													
														|  | 
 |  | +  fontStyle: 'normal',
 | 
											
												
													
														|  | 
 |  | +  fontWeight: 'normal',
 | 
											
												
													
														|  | 
 |  | +  fillColor: '#000000'
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function appendText(textDivs, viewport, geom, styles) {
 |  | 
 | 
											
												
													
														|  | -    var style = styles[geom.fontName];
 |  | 
 | 
											
												
													
														|  | -    var textDiv = document.createElement('div');
 |  | 
 | 
											
												
													
														|  | -    textDivs.push(textDiv);
 |  | 
 | 
											
												
													
														|  | -    if (isAllWhitespace(geom.str)) {
 |  | 
 | 
											
												
													
														|  | -      textDiv.dataset.isWhitespace = true;
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var tx = PDFJS.Util.transform(viewport.transform, geom.transform);
 |  | 
 | 
											
												
													
														|  | -    var angle = Math.atan2(tx[1], tx[0]);
 |  | 
 | 
											
												
													
														|  | -    if (style.vertical) {
 |  | 
 | 
											
												
													
														|  | -      angle += Math.PI / 2;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
 |  | 
 | 
											
												
													
														|  | -    var fontAscent = fontHeight;
 |  | 
 | 
											
												
													
														|  | -    if (style.ascent) {
 |  | 
 | 
											
												
													
														|  | -      fontAscent = style.ascent * fontAscent;
 |  | 
 | 
											
												
													
														|  | -    } else if (style.descent) {
 |  | 
 | 
											
												
													
														|  | -      fontAscent = (1 + style.descent) * fontAscent;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var convertImgDataToPng = (function convertImgDataToPngClosure() {
 | 
											
												
													
														|  | 
 |  | +  var PNG_HEADER =
 | 
											
												
													
														|  | 
 |  | +    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var left;
 |  | 
 | 
											
												
													
														|  | -    var top;
 |  | 
 | 
											
												
													
														|  | -    if (angle === 0) {
 |  | 
 | 
											
												
													
														|  | -      left = tx[4];
 |  | 
 | 
											
												
													
														|  | -      top = tx[5] - fontAscent;
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      left = tx[4] + (fontAscent * Math.sin(angle));
 |  | 
 | 
											
												
													
														|  | -      top = tx[5] - (fontAscent * Math.cos(angle));
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    textDiv.style.left = left + 'px';
 |  | 
 | 
											
												
													
														|  | -    textDiv.style.top = top + 'px';
 |  | 
 | 
											
												
													
														|  | -    textDiv.style.fontSize = fontHeight + 'px';
 |  | 
 | 
											
												
													
														|  | -    textDiv.style.fontFamily = style.fontFamily;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var CHUNK_WRAPPER_SIZE = 12;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    textDiv.textContent = geom.str;
 |  | 
 | 
											
												
													
														|  | -    // |fontName| is only used by the Font Inspector. This test will succeed
 |  | 
 | 
											
												
													
														|  | -    // when e.g. the Font Inspector is off but the Stepper is on, but it's
 |  | 
 | 
											
												
													
														|  | -    // not worth the effort to do a more accurate test.
 |  | 
 | 
											
												
													
														|  | -    if (PDFJS.pdfBug) {
 |  | 
 | 
											
												
													
														|  | -      textDiv.dataset.fontName = geom.fontName;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    // Storing into dataset will convert number into string.
 |  | 
 | 
											
												
													
														|  | -    if (angle !== 0) {
 |  | 
 | 
											
												
													
														|  | -      textDiv.dataset.angle = angle * (180 / Math.PI);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    // We don't bother scaling single-char text divs, because it has very
 |  | 
 | 
											
												
													
														|  | -    // little effect on text highlighting. This makes scrolling on docs with
 |  | 
 | 
											
												
													
														|  | -    // lots of such divs a lot faster.
 |  | 
 | 
											
												
													
														|  | -    if (geom.str.length > 1) {
 |  | 
 | 
											
												
													
														|  | -      if (style.vertical) {
 |  | 
 | 
											
												
													
														|  | -        textDiv.dataset.canvasWidth = geom.height * viewport.scale;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var crcTable = new Int32Array(256);
 | 
											
												
													
														|  | 
 |  | +  for (var i = 0; i < 256; i++) {
 | 
											
												
													
														|  | 
 |  | +    var c = i;
 | 
											
												
													
														|  | 
 |  | +    for (var h = 0; h < 8; h++) {
 | 
											
												
													
														|  | 
 |  | +      if (c & 1) {
 | 
											
												
													
														|  | 
 |  | +        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);
 | 
											
												
													
														|  |        } else {
 |  |        } else {
 | 
											
												
													
														|  | -        textDiv.dataset.canvasWidth = geom.width * viewport.scale;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        c = (c >> 1) & 0x7fffffff;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +    crcTable[i] = c;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function render(task) {
 |  | 
 | 
											
												
													
														|  | -    if (task._canceled) {
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function crc32(data, start, end) {
 | 
											
												
													
														|  | 
 |  | +    var crc = -1;
 | 
											
												
													
														|  | 
 |  | +    for (var i = start; i < end; i++) {
 | 
											
												
													
														|  | 
 |  | +      var a = (crc ^ data[i]) & 0xff;
 | 
											
												
													
														|  | 
 |  | +      var b = crcTable[a];
 | 
											
												
													
														|  | 
 |  | +      crc = (crc >>> 8) ^ b;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    var textLayerFrag = task._container;
 |  | 
 | 
											
												
													
														|  | -    var textDivs = task._textDivs;
 |  | 
 | 
											
												
													
														|  | -    var capability = task._capability;
 |  | 
 | 
											
												
													
														|  | -    var textDivsLength = textDivs.length;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return crc ^ -1;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // No point in rendering many divs as it would make the browser
 |  | 
 | 
											
												
													
														|  | -    // unusable even after the divs are rendered.
 |  | 
 | 
											
												
													
														|  | -    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
 |  | 
 | 
											
												
													
														|  | -      capability.resolve();
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function writePngChunk(type, body, data, offset) {
 | 
											
												
													
														|  | 
 |  | +    var p = offset;
 | 
											
												
													
														|  | 
 |  | +    var len = body.length;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var canvas = document.createElement('canvas');
 |  | 
 | 
											
												
													
														|  | -    canvas.mozOpaque = true;
 |  | 
 | 
											
												
													
														|  | -    var ctx = canvas.getContext('2d', {alpha: false});
 |  | 
 | 
											
												
													
														|  | 
 |  | +    data[p] = len >> 24 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 1] = len >> 16 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 2] = len >> 8 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 3] = len & 0xff;
 | 
											
												
													
														|  | 
 |  | +    p += 4;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var lastFontSize;
 |  | 
 | 
											
												
													
														|  | -    var lastFontFamily;
 |  | 
 | 
											
												
													
														|  | -    for (var i = 0; i < textDivsLength; i++) {
 |  | 
 | 
											
												
													
														|  | -      var textDiv = textDivs[i];
 |  | 
 | 
											
												
													
														|  | -      if (textDiv.dataset.isWhitespace !== undefined) {
 |  | 
 | 
											
												
													
														|  | -        continue;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    data[p] = type.charCodeAt(0) & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 1] = type.charCodeAt(1) & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 2] = type.charCodeAt(2) & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 3] = type.charCodeAt(3) & 0xff;
 | 
											
												
													
														|  | 
 |  | +    p += 4;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var fontSize = textDiv.style.fontSize;
 |  | 
 | 
											
												
													
														|  | -      var fontFamily = textDiv.style.fontFamily;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    data.set(body, p);
 | 
											
												
													
														|  | 
 |  | +    p += body.length;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Only build font string and set to context if different from last.
 |  | 
 | 
											
												
													
														|  | -      if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {
 |  | 
 | 
											
												
													
														|  | -        ctx.font = fontSize + ' ' + fontFamily;
 |  | 
 | 
											
												
													
														|  | -        lastFontSize = fontSize;
 |  | 
 | 
											
												
													
														|  | -        lastFontFamily = fontFamily;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var crc = crc32(data, offset + 4, p);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var width = ctx.measureText(textDiv.textContent).width;
 |  | 
 | 
											
												
													
														|  | -      if (width > 0) {
 |  | 
 | 
											
												
													
														|  | -        textLayerFrag.appendChild(textDiv);
 |  | 
 | 
											
												
													
														|  | -        var transform;
 |  | 
 | 
											
												
													
														|  | -        if (textDiv.dataset.canvasWidth !== undefined) {
 |  | 
 | 
											
												
													
														|  | -          // Dataset values come of type string.
 |  | 
 | 
											
												
													
														|  | -          var textScale = textDiv.dataset.canvasWidth / width;
 |  | 
 | 
											
												
													
														|  | -          transform = 'scaleX(' + textScale + ')';
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          transform = '';
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        var rotation = textDiv.dataset.angle;
 |  | 
 | 
											
												
													
														|  | -        if (rotation) {
 |  | 
 | 
											
												
													
														|  | -          transform = 'rotate(' + rotation + 'deg) ' + transform;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        if (transform) {
 |  | 
 | 
											
												
													
														|  | -          PDFJS.CustomStyle.setProp('transform' , textDiv, transform);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    capability.resolve();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    data[p] = crc >> 24 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 1] = crc >> 16 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 2] = crc >> 8 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    data[p + 3] = crc & 0xff;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  /**
 |  | 
 | 
											
												
													
														|  | -   * Text layer rendering task.
 |  | 
 | 
											
												
													
														|  | -   *
 |  | 
 | 
											
												
													
														|  | -   * @param {TextContent} textContent
 |  | 
 | 
											
												
													
														|  | -   * @param {HTMLElement} container
 |  | 
 | 
											
												
													
														|  | -   * @param {PDFJS.PageViewport} viewport
 |  | 
 | 
											
												
													
														|  | -   * @param {Array} textDivs
 |  | 
 | 
											
												
													
														|  | -   * @private
 |  | 
 | 
											
												
													
														|  | -   */
 |  | 
 | 
											
												
													
														|  | -  function TextLayerRenderTask(textContent, container, viewport, textDivs) {
 |  | 
 | 
											
												
													
														|  | -    this._textContent = textContent;
 |  | 
 | 
											
												
													
														|  | -    this._container = container;
 |  | 
 | 
											
												
													
														|  | -    this._viewport = viewport;
 |  | 
 | 
											
												
													
														|  | -    textDivs = textDivs || [];
 |  | 
 | 
											
												
													
														|  | -    this._textDivs = textDivs;
 |  | 
 | 
											
												
													
														|  | -    this._canceled = false;
 |  | 
 | 
											
												
													
														|  | -    this._capability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -    this._renderTimer = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function adler32(data, start, end) {
 | 
											
												
													
														|  | 
 |  | +    var a = 1;
 | 
											
												
													
														|  | 
 |  | +    var b = 0;
 | 
											
												
													
														|  | 
 |  | +    for (var i = start; i < end; ++i) {
 | 
											
												
													
														|  | 
 |  | +      a = (a + (data[i] & 0xff)) % 65521;
 | 
											
												
													
														|  | 
 |  | +      b = (b + a) % 65521;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return (b << 16) | a;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | -  TextLayerRenderTask.prototype = {
 |  | 
 | 
											
												
													
														|  | -    get promise() {
 |  | 
 | 
											
												
													
														|  | -      return this._capability.promise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    cancel: function TextLayer_cancel() {
 |  | 
 | 
											
												
													
														|  | -      this._canceled = true;
 |  | 
 | 
											
												
													
														|  | -      if (this._renderTimer !== null) {
 |  | 
 | 
											
												
													
														|  | -        clearTimeout(this._renderTimer);
 |  | 
 | 
											
												
													
														|  | -        this._renderTimer = null;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this._capability.reject('canceled');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function encode(imgData, kind) {
 | 
											
												
													
														|  | 
 |  | +    var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +    var height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +    var bitDepth, colorType, lineSize;
 | 
											
												
													
														|  | 
 |  | +    var bytes = imgData.data;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    _render: function TextLayer_render(timeout) {
 |  | 
 | 
											
												
													
														|  | -      var textItems = this._textContent.items;
 |  | 
 | 
											
												
													
														|  | -      var styles = this._textContent.styles;
 |  | 
 | 
											
												
													
														|  | -      var textDivs = this._textDivs;
 |  | 
 | 
											
												
													
														|  | -      var viewport = this._viewport;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, len = textItems.length; i < len; i++) {
 |  | 
 | 
											
												
													
														|  | -        appendText(textDivs, viewport, textItems[i], styles);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    switch (kind) {
 | 
											
												
													
														|  | 
 |  | +      case ImageKind.GRAYSCALE_1BPP:
 | 
											
												
													
														|  | 
 |  | +        colorType = 0;
 | 
											
												
													
														|  | 
 |  | +        bitDepth = 1;
 | 
											
												
													
														|  | 
 |  | +        lineSize = (width + 7) >> 3;
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +      case ImageKind.RGB_24BPP:
 | 
											
												
													
														|  | 
 |  | +        colorType = 2;
 | 
											
												
													
														|  | 
 |  | +        bitDepth = 8;
 | 
											
												
													
														|  | 
 |  | +        lineSize = width * 3;
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +      case ImageKind.RGBA_32BPP:
 | 
											
												
													
														|  | 
 |  | +        colorType = 6;
 | 
											
												
													
														|  | 
 |  | +        bitDepth = 8;
 | 
											
												
													
														|  | 
 |  | +        lineSize = width * 4;
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +      default:
 | 
											
												
													
														|  | 
 |  | +        throw new Error('invalid format');
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (!timeout) { // Render right away
 |  | 
 | 
											
												
													
														|  | -        render(this);
 |  | 
 | 
											
												
													
														|  | -      } else { // Schedule
 |  | 
 | 
											
												
													
														|  | -        var self = this;
 |  | 
 | 
											
												
													
														|  | -        this._renderTimer = setTimeout(function() {
 |  | 
 | 
											
												
													
														|  | -          render(self);
 |  | 
 | 
											
												
													
														|  | -          self._renderTimer = null;
 |  | 
 | 
											
												
													
														|  | -        }, timeout);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // prefix every row with predictor 0
 | 
											
												
													
														|  | 
 |  | +    var literals = new Uint8Array((1 + lineSize) * height);
 | 
											
												
													
														|  | 
 |  | +    var offsetLiterals = 0, offsetBytes = 0;
 | 
											
												
													
														|  | 
 |  | +    var y, i;
 | 
											
												
													
														|  | 
 |  | +    for (y = 0; y < height; ++y) {
 | 
											
												
													
														|  | 
 |  | +      literals[offsetLiterals++] = 0; // no prediction
 | 
											
												
													
														|  | 
 |  | +      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),
 | 
											
												
													
														|  | 
 |  | +                   offsetLiterals);
 | 
											
												
													
														|  | 
 |  | +      offsetBytes += lineSize;
 | 
											
												
													
														|  | 
 |  | +      offsetLiterals += lineSize;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if (kind === ImageKind.GRAYSCALE_1BPP) {
 | 
											
												
													
														|  | 
 |  | +      // inverting for B/W
 | 
											
												
													
														|  | 
 |  | +      offsetLiterals = 0;
 | 
											
												
													
														|  | 
 |  | +      for (y = 0; y < height; y++) {
 | 
											
												
													
														|  | 
 |  | +        offsetLiterals++; // skipping predictor
 | 
											
												
													
														|  | 
 |  | +        for (i = 0; i < lineSize; i++) {
 | 
											
												
													
														|  | 
 |  | +          literals[offsetLiterals++] ^= 0xFF;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    var ihdr = new Uint8Array([
 | 
											
												
													
														|  | 
 |  | +      width >> 24 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      width >> 16 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      width >> 8 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      width & 0xff,
 | 
											
												
													
														|  | 
 |  | +      height >> 24 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      height >> 16 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      height >> 8 & 0xff,
 | 
											
												
													
														|  | 
 |  | +      height & 0xff,
 | 
											
												
													
														|  | 
 |  | +      bitDepth, // bit depth
 | 
											
												
													
														|  | 
 |  | +      colorType, // color type
 | 
											
												
													
														|  | 
 |  | +      0x00, // compression method
 | 
											
												
													
														|  | 
 |  | +      0x00, // filter method
 | 
											
												
													
														|  | 
 |  | +      0x00 // interlace method
 | 
											
												
													
														|  | 
 |  | +    ]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  /**
 |  | 
 | 
											
												
													
														|  | -   * Starts rendering of the text layer.
 |  | 
 | 
											
												
													
														|  | -   *
 |  | 
 | 
											
												
													
														|  | -   * @param {TextLayerRenderParameters} renderParameters
 |  | 
 | 
											
												
													
														|  | -   * @returns {TextLayerRenderTask}
 |  | 
 | 
											
												
													
														|  | -   */
 |  | 
 | 
											
												
													
														|  | -  function renderTextLayer(renderParameters) {
 |  | 
 | 
											
												
													
														|  | -    var task = new TextLayerRenderTask(renderParameters.textContent,
 |  | 
 | 
											
												
													
														|  | -                                       renderParameters.container,
 |  | 
 | 
											
												
													
														|  | -                                       renderParameters.viewport,
 |  | 
 | 
											
												
													
														|  | -                                       renderParameters.textDivs);
 |  | 
 | 
											
												
													
														|  | -    task._render(renderParameters.timeout);
 |  | 
 | 
											
												
													
														|  | -    return task;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var len = literals.length;
 | 
											
												
													
														|  | 
 |  | +    var maxBlockLength = 0xFFFF;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return renderTextLayer;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var deflateBlocks = Math.ceil(len / maxBlockLength);
 | 
											
												
													
														|  | 
 |  | +    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
 | 
											
												
													
														|  | 
 |  | +    var pi = 0;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = 0x78; // compression method and flags
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = 0x9c; // flags
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -PDFJS.renderTextLayer = renderTextLayer;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var pos = 0;
 | 
											
												
													
														|  | 
 |  | +    while (len > maxBlockLength) {
 | 
											
												
													
														|  | 
 |  | +      // writing non-final DEFLATE blocks type 0 and length of 65535
 | 
											
												
													
														|  | 
 |  | +      idat[pi++] = 0x00;
 | 
											
												
													
														|  | 
 |  | +      idat[pi++] = 0xff;
 | 
											
												
													
														|  | 
 |  | +      idat[pi++] = 0xff;
 | 
											
												
													
														|  | 
 |  | +      idat[pi++] = 0x00;
 | 
											
												
													
														|  | 
 |  | +      idat[pi++] = 0x00;
 | 
											
												
													
														|  | 
 |  | +      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
 | 
											
												
													
														|  | 
 |  | +      pi += maxBlockLength;
 | 
											
												
													
														|  | 
 |  | +      pos += maxBlockLength;
 | 
											
												
													
														|  | 
 |  | +      len -= maxBlockLength;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -exports.renderTextLayer = renderTextLayer;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // writing non-final DEFLATE blocks type 0
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = 0x01;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = len & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = len >> 8 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = (~len & 0xffff) & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat.set(literals.subarray(pos), pi);
 | 
											
												
													
														|  | 
 |  | +    pi += literals.length - pos;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    var adler = adler32(literals, 0, literals.length); // checksum
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = adler >> 24 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = adler >> 16 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = adler >> 8 & 0xff;
 | 
											
												
													
														|  | 
 |  | +    idat[pi++] = adler & 0xff;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.
 | 
											
												
													
														|  | 
 |  | +    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +
 | 
											
												
													
														|  | 
 |  | +                    ihdr.length + idat.length;
 | 
											
												
													
														|  | 
 |  | +    var data = new Uint8Array(pngLength);
 | 
											
												
													
														|  | 
 |  | +    var offset = 0;
 | 
											
												
													
														|  | 
 |  | +    data.set(PNG_HEADER, offset);
 | 
											
												
													
														|  | 
 |  | +    offset += PNG_HEADER.length;
 | 
											
												
													
														|  | 
 |  | +    writePngChunk('IHDR', ihdr, data, offset);
 | 
											
												
													
														|  | 
 |  | +    offset += CHUNK_WRAPPER_SIZE + ihdr.length;
 | 
											
												
													
														|  | 
 |  | +    writePngChunk('IDATA', idat, data, offset);
 | 
											
												
													
														|  | 
 |  | +    offset += CHUNK_WRAPPER_SIZE + idat.length;
 | 
											
												
													
														|  | 
 |  | +    writePngChunk('IEND', new Uint8Array(0), data, offset);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return PDFJS.createObjectURL(data, 'image/png');
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | -}(this, function (exports, sharedUtil) {
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var shadow = sharedUtil.shadow;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return function convertImgDataToPng(imgData) {
 | 
											
												
													
														|  | 
 |  | +    var kind = (imgData.kind === undefined ?
 | 
											
												
													
														|  | 
 |  | +                ImageKind.GRAYSCALE_1BPP : imgData.kind);
 | 
											
												
													
														|  | 
 |  | +    return encode(imgData, kind);
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var WebGLUtils = (function WebGLUtilsClosure() {
 |  | 
 | 
											
												
													
														|  | -  function loadShader(gl, code, shaderType) {
 |  | 
 | 
											
												
													
														|  | -    var shader = gl.createShader(shaderType);
 |  | 
 | 
											
												
													
														|  | -    gl.shaderSource(shader, code);
 |  | 
 | 
											
												
													
														|  | -    gl.compileShader(shader);
 |  | 
 | 
											
												
													
														|  | -    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
 |  | 
 | 
											
												
													
														|  | -    if (!compiled) {
 |  | 
 | 
											
												
													
														|  | -      var errorMsg = gl.getShaderInfoLog(shader);
 |  | 
 | 
											
												
													
														|  | -      throw new Error('Error during shader compilation: ' + errorMsg);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return shader;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  function createVertexShader(gl, code) {
 |  | 
 | 
											
												
													
														|  | -    return loadShader(gl, code, gl.VERTEX_SHADER);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  function createFragmentShader(gl, code) {
 |  | 
 | 
											
												
													
														|  | -    return loadShader(gl, code, gl.FRAGMENT_SHADER);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  function createProgram(gl, shaders) {
 |  | 
 | 
											
												
													
														|  | -    var program = gl.createProgram();
 |  | 
 | 
											
												
													
														|  | -    for (var i = 0, ii = shaders.length; i < ii; ++i) {
 |  | 
 | 
											
												
													
														|  | -      gl.attachShader(program, shaders[i]);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    gl.linkProgram(program);
 |  | 
 | 
											
												
													
														|  | -    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
 |  | 
 | 
											
												
													
														|  | -    if (!linked) {
 |  | 
 | 
											
												
													
														|  | -      var errorMsg = gl.getProgramInfoLog(program);
 |  | 
 | 
											
												
													
														|  | -      throw new Error('Error during program linking: ' + errorMsg);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return program;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  function createTexture(gl, image, textureId) {
 |  | 
 | 
											
												
													
														|  | -    gl.activeTexture(textureId);
 |  | 
 | 
											
												
													
														|  | -    var texture = gl.createTexture();
 |  | 
 | 
											
												
													
														|  | -    gl.bindTexture(gl.TEXTURE_2D, texture);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Set the parameters so we can render any size image.
 |  | 
 | 
											
												
													
														|  | -    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
 |  | 
 | 
											
												
													
														|  | -    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
 |  | 
 | 
											
												
													
														|  | -    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
 |  | 
 | 
											
												
													
														|  | -    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Upload the image into the texture.
 |  | 
 | 
											
												
													
														|  | -    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
 |  | 
 | 
											
												
													
														|  | -    return texture;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var currentGL, currentCanvas;
 |  | 
 | 
											
												
													
														|  | -  function generateGL() {
 |  | 
 | 
											
												
													
														|  | -    if (currentGL) {
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    currentCanvas = document.createElement('canvas');
 |  | 
 | 
											
												
													
														|  | -    currentGL = currentCanvas.getContext('webgl',
 |  | 
 | 
											
												
													
														|  | -      { premultipliedalpha: false });
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var smaskVertexShaderCode = '\
 |  | 
 | 
											
												
													
														|  | -  attribute vec2 a_position;                                    \
 |  | 
 | 
											
												
													
														|  | -  attribute vec2 a_texCoord;                                    \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  uniform vec2 u_resolution;                                    \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  varying vec2 v_texCoord;                                      \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  void main() {                                                 \
 |  | 
 | 
											
												
													
														|  | -    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
 |  | 
 | 
											
												
													
														|  | -    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -    v_texCoord = a_texCoord;                                    \
 |  | 
 | 
											
												
													
														|  | -  }                                                             ';
 |  | 
 | 
											
												
													
														|  | 
 |  | +var SVGExtraState = (function SVGExtraStateClosure() {
 | 
											
												
													
														|  | 
 |  | +  function SVGExtraState() {
 | 
											
												
													
														|  | 
 |  | +    this.fontSizeScale = 1;
 | 
											
												
													
														|  | 
 |  | +    this.fontWeight = SVG_DEFAULTS.fontWeight;
 | 
											
												
													
														|  | 
 |  | +    this.fontSize = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var smaskFragmentShaderCode = '\
 |  | 
 | 
											
												
													
														|  | -  precision mediump float;                                      \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  uniform vec4 u_backdrop;                                      \
 |  | 
 | 
											
												
													
														|  | -  uniform int u_subtype;                                        \
 |  | 
 | 
											
												
													
														|  | -  uniform sampler2D u_image;                                    \
 |  | 
 | 
											
												
													
														|  | -  uniform sampler2D u_mask;                                     \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  varying vec2 v_texCoord;                                      \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  void main() {                                                 \
 |  | 
 | 
											
												
													
														|  | -    vec4 imageColor = texture2D(u_image, v_texCoord);           \
 |  | 
 | 
											
												
													
														|  | -    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
 |  | 
 | 
											
												
													
														|  | -    if (u_backdrop.a > 0.0) {                                   \
 |  | 
 | 
											
												
													
														|  | -      maskColor.rgb = maskColor.rgb * maskColor.a +             \
 |  | 
 | 
											
												
													
														|  | -                      u_backdrop.rgb * (1.0 - maskColor.a);     \
 |  | 
 | 
											
												
													
														|  | -    }                                                           \
 |  | 
 | 
											
												
													
														|  | -    float lum;                                                  \
 |  | 
 | 
											
												
													
														|  | -    if (u_subtype == 0) {                                       \
 |  | 
 | 
											
												
													
														|  | -      lum = maskColor.a;                                        \
 |  | 
 | 
											
												
													
														|  | -    } else {                                                    \
 |  | 
 | 
											
												
													
														|  | -      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
 |  | 
 | 
											
												
													
														|  | -            maskColor.b * 0.11;                                 \
 |  | 
 | 
											
												
													
														|  | -    }                                                           \
 |  | 
 | 
											
												
													
														|  | -    imageColor.a *= lum;                                        \
 |  | 
 | 
											
												
													
														|  | -    imageColor.rgb *= imageColor.a;                             \
 |  | 
 | 
											
												
													
														|  | -    gl_FragColor = imageColor;                                  \
 |  | 
 | 
											
												
													
														|  | -  }                                                             ';
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.textMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +    this.fontMatrix = FONT_IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +    this.leading = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var smaskCache = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Current point (in user coordinates)
 | 
											
												
													
														|  | 
 |  | +    this.x = 0;
 | 
											
												
													
														|  | 
 |  | +    this.y = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function initSmaskGL() {
 |  | 
 | 
											
												
													
														|  | -    var canvas, gl;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Start of text line (in text coordinates)
 | 
											
												
													
														|  | 
 |  | +    this.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +    this.lineY = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    generateGL();
 |  | 
 | 
											
												
													
														|  | -    canvas = currentCanvas;
 |  | 
 | 
											
												
													
														|  | -    currentCanvas = null;
 |  | 
 | 
											
												
													
														|  | -    gl = currentGL;
 |  | 
 | 
											
												
													
														|  | -    currentGL = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Character and word spacing
 | 
											
												
													
														|  | 
 |  | +    this.charSpacing = 0;
 | 
											
												
													
														|  | 
 |  | +    this.wordSpacing = 0;
 | 
											
												
													
														|  | 
 |  | +    this.textHScale = 1;
 | 
											
												
													
														|  | 
 |  | +    this.textRise = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // setup a GLSL program
 |  | 
 | 
											
												
													
														|  | -    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
 |  | 
 | 
											
												
													
														|  | -    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
 |  | 
 | 
											
												
													
														|  | -    var program = createProgram(gl, [vertexShader, fragmentShader]);
 |  | 
 | 
											
												
													
														|  | -    gl.useProgram(program);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Default foreground and background colors
 | 
											
												
													
														|  | 
 |  | +    this.fillColor = SVG_DEFAULTS.fillColor;
 | 
											
												
													
														|  | 
 |  | +    this.strokeColor = '#000000';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var cache = {};
 |  | 
 | 
											
												
													
														|  | -    cache.gl = gl;
 |  | 
 | 
											
												
													
														|  | -    cache.canvas = canvas;
 |  | 
 | 
											
												
													
														|  | -    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
 |  | 
 | 
											
												
													
														|  | -    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
 |  | 
 | 
											
												
													
														|  | -    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
 |  | 
 | 
											
												
													
														|  | -    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.fillAlpha = 1;
 | 
											
												
													
														|  | 
 |  | +    this.strokeAlpha = 1;
 | 
											
												
													
														|  | 
 |  | +    this.lineWidth = 1;
 | 
											
												
													
														|  | 
 |  | +    this.lineJoin = '';
 | 
											
												
													
														|  | 
 |  | +    this.lineCap = '';
 | 
											
												
													
														|  | 
 |  | +    this.miterLimit = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
 |  | 
 | 
											
												
													
														|  | -    var texLayerLocation = gl.getUniformLocation(program, 'u_image');
 |  | 
 | 
											
												
													
														|  | -    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.dashArray = [];
 | 
											
												
													
														|  | 
 |  | +    this.dashPhase = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // provide texture coordinates for the rectangle.
 |  | 
 | 
											
												
													
														|  | -    var texCoordBuffer = gl.createBuffer();
 |  | 
 | 
											
												
													
														|  | -    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
 |  | 
 | 
											
												
													
														|  | -    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
 |  | 
 | 
											
												
													
														|  | -      0.0,  0.0,
 |  | 
 | 
											
												
													
														|  | -      1.0,  0.0,
 |  | 
 | 
											
												
													
														|  | -      0.0,  1.0,
 |  | 
 | 
											
												
													
														|  | -      0.0,  1.0,
 |  | 
 | 
											
												
													
														|  | -      1.0,  0.0,
 |  | 
 | 
											
												
													
														|  | -      1.0,  1.0]), gl.STATIC_DRAW);
 |  | 
 | 
											
												
													
														|  | -    gl.enableVertexAttribArray(texCoordLocation);
 |  | 
 | 
											
												
													
														|  | -    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.dependencies = [];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.uniform1i(texLayerLocation, 0);
 |  | 
 | 
											
												
													
														|  | -    gl.uniform1i(texMaskLocation, 1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Clipping
 | 
											
												
													
														|  | 
 |  | +    this.clipId = '';
 | 
											
												
													
														|  | 
 |  | +    this.pendingClip = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    smaskCache = cache;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.maskId = '';
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function composeSMask(layer, mask, properties) {
 |  | 
 | 
											
												
													
														|  | -    var width = layer.width, height = layer.height;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    if (!smaskCache) {
 |  | 
 | 
											
												
													
														|  | -      initSmaskGL();
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;
 |  | 
 | 
											
												
													
														|  | -    canvas.width = width;
 |  | 
 | 
											
												
													
														|  | -    canvas.height = height;
 |  | 
 | 
											
												
													
														|  | -    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
 |  | 
 | 
											
												
													
														|  | -    gl.uniform2f(cache.resolutionLocation, width, height);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    if (properties.backdrop) {
 |  | 
 | 
											
												
													
														|  | -      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],
 |  | 
 | 
											
												
													
														|  | -                   properties.backdrop[1], properties.backdrop[2], 1);
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  SVGExtraState.prototype = {
 | 
											
												
													
														|  | 
 |  | +    clone: function SVGExtraState_clone() {
 | 
											
												
													
														|  | 
 |  | +      return Object.create(this);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
 | 
											
												
													
														|  | 
 |  | +      this.x = x;
 | 
											
												
													
														|  | 
 |  | +      this.y = y;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    gl.uniform1i(cache.subtypeLocation,
 |  | 
 | 
											
												
													
														|  | -                 properties.subtype === 'Luminosity' ? 1 : 0);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Create a textures
 |  | 
 | 
											
												
													
														|  | -    var texture = createTexture(gl, layer, gl.TEXTURE0);
 |  | 
 | 
											
												
													
														|  | -    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Create a buffer and put a single clipspace rectangle in
 |  | 
 | 
											
												
													
														|  | -    // it (2 triangles)
 |  | 
 | 
											
												
													
														|  | -    var buffer = gl.createBuffer();
 |  | 
 | 
											
												
													
														|  | -    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
 |  | 
 | 
											
												
													
														|  | -    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
 |  | 
 | 
											
												
													
														|  | -      0, 0,
 |  | 
 | 
											
												
													
														|  | -      width, 0,
 |  | 
 | 
											
												
													
														|  | -      0, height,
 |  | 
 | 
											
												
													
														|  | -      0, height,
 |  | 
 | 
											
												
													
														|  | -      width, 0,
 |  | 
 | 
											
												
													
														|  | -      width, height]), gl.STATIC_DRAW);
 |  | 
 | 
											
												
													
														|  | -    gl.enableVertexAttribArray(cache.positionLocation);
 |  | 
 | 
											
												
													
														|  | -    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // draw
 |  | 
 | 
											
												
													
														|  | -    gl.clearColor(0, 0, 0, 0);
 |  | 
 | 
											
												
													
														|  | -    gl.enable(gl.BLEND);
 |  | 
 | 
											
												
													
														|  | -    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
 |  | 
 | 
											
												
													
														|  | -    gl.clear(gl.COLOR_BUFFER_BIT);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return SVGExtraState;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.drawArrays(gl.TRIANGLES, 0, 6);
 |  | 
 | 
											
												
													
														|  | 
 |  | +var SVGGraphics = (function SVGGraphicsClosure() {
 | 
											
												
													
														|  | 
 |  | +  function createScratchSVG(width, height) {
 | 
											
												
													
														|  | 
 |  | +    var NS = 'http://www.w3.org/2000/svg';
 | 
											
												
													
														|  | 
 |  | +    var svg = document.createElementNS(NS, 'svg:svg');
 | 
											
												
													
														|  | 
 |  | +    svg.setAttributeNS(null, 'version', '1.1');
 | 
											
												
													
														|  | 
 |  | +    svg.setAttributeNS(null, 'width', width + 'px');
 | 
											
												
													
														|  | 
 |  | +    svg.setAttributeNS(null, 'height', height + 'px');
 | 
											
												
													
														|  | 
 |  | +    svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
 | 
											
												
													
														|  | 
 |  | +    return svg;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.flush();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function opListToTree(opList) {
 | 
											
												
													
														|  | 
 |  | +    var opTree = [];
 | 
											
												
													
														|  | 
 |  | +    var tmp = [];
 | 
											
												
													
														|  | 
 |  | +    var opListLen = opList.length;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.deleteTexture(texture);
 |  | 
 | 
											
												
													
														|  | -    gl.deleteTexture(maskTexture);
 |  | 
 | 
											
												
													
														|  | -    gl.deleteBuffer(buffer);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    for (var x = 0; x < opListLen; x++) {
 | 
											
												
													
														|  | 
 |  | +      if (opList[x].fn === 'save') {
 | 
											
												
													
														|  | 
 |  | +        opTree.push({'fnId': 92, 'fn': 'group', 'items': []});
 | 
											
												
													
														|  | 
 |  | +        tmp.push(opTree);
 | 
											
												
													
														|  | 
 |  | +        opTree = opTree[opTree.length - 1].items;
 | 
											
												
													
														|  | 
 |  | +        continue;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return canvas;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if(opList[x].fn === 'restore') {
 | 
											
												
													
														|  | 
 |  | +        opTree = tmp.pop();
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        opTree.push(opList[x]);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return opTree;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var figuresVertexShaderCode = '\
 |  | 
 | 
											
												
													
														|  | -  attribute vec2 a_position;                                    \
 |  | 
 | 
											
												
													
														|  | -  attribute vec3 a_color;                                       \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  uniform vec2 u_resolution;                                    \
 |  | 
 | 
											
												
													
														|  | -  uniform vec2 u_scale;                                         \
 |  | 
 | 
											
												
													
														|  | -  uniform vec2 u_offset;                                        \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  varying vec4 v_color;                                         \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  void main() {                                                 \
 |  | 
 | 
											
												
													
														|  | -    vec2 position = (a_position + u_offset) * u_scale;          \
 |  | 
 | 
											
												
													
														|  | -    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
 |  | 
 | 
											
												
													
														|  | -    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -    v_color = vec4(a_color / 255.0, 1.0);                       \
 |  | 
 | 
											
												
													
														|  | -  }                                                             ';
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var figuresFragmentShaderCode = '\
 |  | 
 | 
											
												
													
														|  | -  precision mediump float;                                      \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  varying vec4 v_color;                                         \
 |  | 
 | 
											
												
													
														|  | -                                                                \
 |  | 
 | 
											
												
													
														|  | -  void main() {                                                 \
 |  | 
 | 
											
												
													
														|  | -    gl_FragColor = v_color;                                     \
 |  | 
 | 
											
												
													
														|  | -  }                                                             ';
 |  | 
 | 
											
												
													
														|  | 
 |  | +  /**
 | 
											
												
													
														|  | 
 |  | +   * Formats float number.
 | 
											
												
													
														|  | 
 |  | +   * @param value {number} number to format.
 | 
											
												
													
														|  | 
 |  | +   * @returns {string}
 | 
											
												
													
														|  | 
 |  | +   */
 | 
											
												
													
														|  | 
 |  | +  function pf(value) {
 | 
											
												
													
														|  | 
 |  | +    if (value === (value | 0)) { // integer number
 | 
											
												
													
														|  | 
 |  | +      return value.toString();
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var s = value.toFixed(10);
 | 
											
												
													
														|  | 
 |  | +    var i = s.length - 1;
 | 
											
												
													
														|  | 
 |  | +    if (s[i] !== '0') {
 | 
											
												
													
														|  | 
 |  | +      return s;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    // removing trailing zeros
 | 
											
												
													
														|  | 
 |  | +    do {
 | 
											
												
													
														|  | 
 |  | +      i--;
 | 
											
												
													
														|  | 
 |  | +    } while (s[i] === '0');
 | 
											
												
													
														|  | 
 |  | +    return s.substr(0, s[i] === '.' ? i : i + 1);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var figuresCache = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  /**
 | 
											
												
													
														|  | 
 |  | +   * Formats transform matrix. The standard rotation, scale and translate
 | 
											
												
													
														|  | 
 |  | +   * matrices are replaced by their shorter forms, and for identity matrix
 | 
											
												
													
														|  | 
 |  | +   * returns empty string to save the memory.
 | 
											
												
													
														|  | 
 |  | +   * @param m {Array} matrix to format.
 | 
											
												
													
														|  | 
 |  | +   * @returns {string}
 | 
											
												
													
														|  | 
 |  | +   */
 | 
											
												
													
														|  | 
 |  | +  function pm(m) {
 | 
											
												
													
														|  | 
 |  | +    if (m[4] === 0 && m[5] === 0) {
 | 
											
												
													
														|  | 
 |  | +      if (m[1] === 0 && m[2] === 0) {
 | 
											
												
													
														|  | 
 |  | +        if (m[0] === 1 && m[3] === 1) {
 | 
											
												
													
														|  | 
 |  | +          return '';
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (m[0] === m[3] && m[1] === -m[2]) {
 | 
											
												
													
														|  | 
 |  | +        var a = Math.acos(m[0]) * 180 / Math.PI;
 | 
											
												
													
														|  | 
 |  | +        return 'rotate(' + pf(a) + ')';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
 | 
											
												
													
														|  | 
 |  | +        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +
 | 
											
												
													
														|  | 
 |  | +      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function initFiguresGL() {
 |  | 
 | 
											
												
													
														|  | -    var canvas, gl;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function SVGGraphics(commonObjs, objs) {
 | 
											
												
													
														|  | 
 |  | +    this.current = new SVGExtraState();
 | 
											
												
													
														|  | 
 |  | +    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
 | 
											
												
													
														|  | 
 |  | +    this.transformStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.extraStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.commonObjs = commonObjs;
 | 
											
												
													
														|  | 
 |  | +    this.objs = objs;
 | 
											
												
													
														|  | 
 |  | +    this.pendingEOFill = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    generateGL();
 |  | 
 | 
											
												
													
														|  | -    canvas = currentCanvas;
 |  | 
 | 
											
												
													
														|  | -    currentCanvas = null;
 |  | 
 | 
											
												
													
														|  | -    gl = currentGL;
 |  | 
 | 
											
												
													
														|  | -    currentGL = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.embedFonts = false;
 | 
											
												
													
														|  | 
 |  | +    this.embeddedFonts = {};
 | 
											
												
													
														|  | 
 |  | +    this.cssStyle = null;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // setup a GLSL program
 |  | 
 | 
											
												
													
														|  | -    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
 |  | 
 | 
											
												
													
														|  | -    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
 |  | 
 | 
											
												
													
														|  | -    var program = createProgram(gl, [vertexShader, fragmentShader]);
 |  | 
 | 
											
												
													
														|  | -    gl.useProgram(program);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var NS = 'http://www.w3.org/2000/svg';
 | 
											
												
													
														|  | 
 |  | +  var XML_NS = 'http://www.w3.org/XML/1998/namespace';
 | 
											
												
													
														|  | 
 |  | +  var XLINK_NS = 'http://www.w3.org/1999/xlink';
 | 
											
												
													
														|  | 
 |  | +  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
 | 
											
												
													
														|  | 
 |  | +  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
 | 
											
												
													
														|  | 
 |  | +  var clipCount = 0;
 | 
											
												
													
														|  | 
 |  | +  var maskCount = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var cache = {};
 |  | 
 | 
											
												
													
														|  | -    cache.gl = gl;
 |  | 
 | 
											
												
													
														|  | -    cache.canvas = canvas;
 |  | 
 | 
											
												
													
														|  | -    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
 |  | 
 | 
											
												
													
														|  | -    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
 |  | 
 | 
											
												
													
														|  | -    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
 |  | 
 | 
											
												
													
														|  | -    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
 |  | 
 | 
											
												
													
														|  | -    cache.colorLocation = gl.getAttribLocation(program, 'a_color');
 |  | 
 | 
											
												
													
														|  | 
 |  | +  SVGGraphics.prototype = {
 | 
											
												
													
														|  | 
 |  | +    save: function SVGGraphics_save() {
 | 
											
												
													
														|  | 
 |  | +      this.transformStack.push(this.transformMatrix);
 | 
											
												
													
														|  | 
 |  | +      var old = this.current;
 | 
											
												
													
														|  | 
 |  | +      this.extraStack.push(old);
 | 
											
												
													
														|  | 
 |  | +      this.current = old.clone();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    figuresCache = cache;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    restore: function SVGGraphics_restore() {
 | 
											
												
													
														|  | 
 |  | +      this.transformMatrix = this.transformStack.pop();
 | 
											
												
													
														|  | 
 |  | +      this.current = this.extraStack.pop();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function drawFigures(width, height, backgroundColor, figures, context) {
 |  | 
 | 
											
												
													
														|  | -    if (!figuresCache) {
 |  | 
 | 
											
												
													
														|  | -      initFiguresGL();
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.tgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  | 
 |  | +      this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    canvas.width = width;
 |  | 
 | 
											
												
													
														|  | -    canvas.height = height;
 |  | 
 | 
											
												
													
														|  | -    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
 |  | 
 | 
											
												
													
														|  | -    gl.uniform2f(cache.resolutionLocation, width, height);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    group: function SVGGraphics_group(items) {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      this.executeOpTree(items);
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // count triangle points
 |  | 
 | 
											
												
													
														|  | -    var count = 0;
 |  | 
 | 
											
												
													
														|  | -    var i, ii, rows;
 |  | 
 | 
											
												
													
														|  | -    for (i = 0, ii = figures.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -      switch (figures[i].type) {
 |  | 
 | 
											
												
													
														|  | -        case 'lattice':
 |  | 
 | 
											
												
													
														|  | -          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;
 |  | 
 | 
											
												
													
														|  | -          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
 |  | 
 | 
											
												
													
														|  | -          break;
 |  | 
 | 
											
												
													
														|  | -        case 'triangles':
 |  | 
 | 
											
												
													
														|  | -          count += figures[i].coords.length;
 |  | 
 | 
											
												
													
														|  | -          break;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    // transfer data
 |  | 
 | 
											
												
													
														|  | -    var coords = new Float32Array(count * 2);
 |  | 
 | 
											
												
													
														|  | -    var colors = new Uint8Array(count * 3);
 |  | 
 | 
											
												
													
														|  | -    var coordsMap = context.coords, colorsMap = context.colors;
 |  | 
 | 
											
												
													
														|  | -    var pIndex = 0, cIndex = 0;
 |  | 
 | 
											
												
													
														|  | -    for (i = 0, ii = figures.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -      var figure = figures[i], ps = figure.coords, cs = figure.colors;
 |  | 
 | 
											
												
													
														|  | -      switch (figure.type) {
 |  | 
 | 
											
												
													
														|  | -        case 'lattice':
 |  | 
 | 
											
												
													
														|  | -          var cols = figure.verticesPerRow;
 |  | 
 | 
											
												
													
														|  | -          rows = (ps.length / cols) | 0;
 |  | 
 | 
											
												
													
														|  | -          for (var row = 1; row < rows; row++) {
 |  | 
 | 
											
												
													
														|  | -            var offset = row * cols + 1;
 |  | 
 | 
											
												
													
														|  | -            for (var col = 1; col < cols; col++, offset++) {
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
 | 
											
												
													
														|  | 
 |  | +      var fnArray = operatorList.fnArray;
 | 
											
												
													
														|  | 
 |  | +      var fnArrayLen = fnArray.length;
 | 
											
												
													
														|  | 
 |  | +      var argsArray = operatorList.argsArray;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -              coords[pIndex + 6] = coords[pIndex + 2];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 7] = coords[pIndex + 3];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 8] = coords[pIndex + 4];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 9] = coords[pIndex + 5];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 10] = coordsMap[ps[offset]];
 |  | 
 | 
											
												
													
														|  | -              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 9] = colors[cIndex + 3];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 10] = colors[cIndex + 4];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 11] = colors[cIndex + 5];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 12] = colors[cIndex + 6];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 13] = colors[cIndex + 7];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 14] = colors[cIndex + 8];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 15] = colorsMap[cs[offset]];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
 |  | 
 | 
											
												
													
														|  | -              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
 |  | 
 | 
											
												
													
														|  | -              pIndex += 12;
 |  | 
 | 
											
												
													
														|  | -              cIndex += 18;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var self = this;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0; i < fnArrayLen; i++) {
 | 
											
												
													
														|  | 
 |  | +        if (OPS.dependency === fnArray[i]) {
 | 
											
												
													
														|  | 
 |  | +          var deps = argsArray[i];
 | 
											
												
													
														|  | 
 |  | +          for (var n = 0, nn = deps.length; n < nn; n++) {
 | 
											
												
													
														|  | 
 |  | +            var obj = deps[n];
 | 
											
												
													
														|  | 
 |  | +            var common = obj.substring(0, 2) === 'g_';
 | 
											
												
													
														|  | 
 |  | +            var promise;
 | 
											
												
													
														|  | 
 |  | +            if (common) {
 | 
											
												
													
														|  | 
 |  | +              promise = new Promise(function(resolve) {
 | 
											
												
													
														|  | 
 |  | +                self.commonObjs.get(obj, resolve);
 | 
											
												
													
														|  | 
 |  | +              });
 | 
											
												
													
														|  | 
 |  | +            } else {
 | 
											
												
													
														|  | 
 |  | +              promise = new Promise(function(resolve) {
 | 
											
												
													
														|  | 
 |  | +                self.objs.get(obj, resolve);
 | 
											
												
													
														|  | 
 |  | +              });
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  | 
 |  | +            this.current.dependencies.push(promise);
 | 
											
												
													
														|  |            }
 |  |            }
 | 
											
												
													
														|  | -          break;
 |  | 
 | 
											
												
													
														|  | -        case 'triangles':
 |  | 
 | 
											
												
													
														|  | -          for (var j = 0, jj = ps.length; j < jj; j++) {
 |  | 
 | 
											
												
													
														|  | -            coords[pIndex] = coordsMap[ps[j]];
 |  | 
 | 
											
												
													
														|  | -            coords[pIndex + 1] = coordsMap[ps[j] + 1];
 |  | 
 | 
											
												
													
														|  | -            colors[cIndex] = colorsMap[cs[j]];
 |  | 
 | 
											
												
													
														|  | -            colors[cIndex + 1] = colorsMap[cs[j] + 1];
 |  | 
 | 
											
												
													
														|  | -            colors[cIndex + 2] = colorsMap[cs[j] + 2];
 |  | 
 | 
											
												
													
														|  | -            pIndex += 2;
 |  | 
 | 
											
												
													
														|  | -            cIndex += 3;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          break;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // draw
 |  | 
 | 
											
												
													
														|  | -    if (backgroundColor) {
 |  | 
 | 
											
												
													
														|  | -      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,
 |  | 
 | 
											
												
													
														|  | -                    backgroundColor[2] / 255, 1.0);
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      gl.clearColor(0, 0, 0, 0);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    gl.clear(gl.COLOR_BUFFER_BIT);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return Promise.all(this.current.dependencies);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var coordsBuffer = gl.createBuffer();
 |  | 
 | 
											
												
													
														|  | -    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
 |  | 
 | 
											
												
													
														|  | -    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
 |  | 
 | 
											
												
													
														|  | -    gl.enableVertexAttribArray(cache.positionLocation);
 |  | 
 | 
											
												
													
														|  | -    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    transform: function SVGGraphics_transform(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      var transformMatrix = [a, b, c, d, e, f];
 | 
											
												
													
														|  | 
 |  | +      this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,
 | 
											
												
													
														|  | 
 |  | +                                                  transformMatrix);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var colorsBuffer = gl.createBuffer();
 |  | 
 | 
											
												
													
														|  | -    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
 |  | 
 | 
											
												
													
														|  | -    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
 |  | 
 | 
											
												
													
														|  | -    gl.enableVertexAttribArray(cache.colorLocation);
 |  | 
 | 
											
												
													
														|  | -    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,
 |  | 
 | 
											
												
													
														|  | -                           0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.tgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
 |  | 
 | 
											
												
													
														|  | -    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
 | 
											
												
													
														|  | 
 |  | +      this.svg = createScratchSVG(viewport.width, viewport.height);
 | 
											
												
													
														|  | 
 |  | +      this.viewport = viewport;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.drawArrays(gl.TRIANGLES, 0, count);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return this.loadDependencies(operatorList).then(function () {
 | 
											
												
													
														|  | 
 |  | +        this.transformMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +        this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
 | 
											
												
													
														|  | 
 |  | +        this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
 | 
											
												
													
														|  | 
 |  | +        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  | 
 |  | +        this.defs = document.createElementNS(NS, 'svg:defs');
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.defs);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.svg.appendChild(this.pgrp);
 | 
											
												
													
														|  | 
 |  | +        var opTree = this.convertOpList(operatorList);
 | 
											
												
													
														|  | 
 |  | +        this.executeOpTree(opTree);
 | 
											
												
													
														|  | 
 |  | +        return this.svg;
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.flush();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    convertOpList: function SVGGraphics_convertOpList(operatorList) {
 | 
											
												
													
														|  | 
 |  | +      var argsArray = operatorList.argsArray;
 | 
											
												
													
														|  | 
 |  | +      var fnArray = operatorList.fnArray;
 | 
											
												
													
														|  | 
 |  | +      var fnArrayLen  = fnArray.length;
 | 
											
												
													
														|  | 
 |  | +      var REVOPS = [];
 | 
											
												
													
														|  | 
 |  | +      var opList = [];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    gl.deleteBuffer(coordsBuffer);
 |  | 
 | 
											
												
													
														|  | -    gl.deleteBuffer(colorsBuffer);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (var op in OPS) {
 | 
											
												
													
														|  | 
 |  | +        REVOPS[OPS[op]] = op;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return canvas;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (var x = 0; x < fnArrayLen; x++) {
 | 
											
												
													
														|  | 
 |  | +        var fnId = fnArray[x];
 | 
											
												
													
														|  | 
 |  | +        opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return opListToTree(opList);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function cleanup() {
 |  | 
 | 
											
												
													
														|  | -    if (smaskCache && smaskCache.canvas) {
 |  | 
 | 
											
												
													
														|  | -      smaskCache.canvas.width = 0;
 |  | 
 | 
											
												
													
														|  | -      smaskCache.canvas.height = 0;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (figuresCache && figuresCache.canvas) {
 |  | 
 | 
											
												
													
														|  | -      figuresCache.canvas.width = 0;
 |  | 
 | 
											
												
													
														|  | -      figuresCache.canvas.height = 0;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    smaskCache = null;
 |  | 
 | 
											
												
													
														|  | -    figuresCache = null;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    executeOpTree: function SVGGraphics_executeOpTree(opTree) {
 | 
											
												
													
														|  | 
 |  | +      var opTreeLen = opTree.length;
 | 
											
												
													
														|  | 
 |  | +      for(var x = 0; x < opTreeLen; x++) {
 | 
											
												
													
														|  | 
 |  | +        var fn = opTree[x].fn;
 | 
											
												
													
														|  | 
 |  | +        var fnId = opTree[x].fnId;
 | 
											
												
													
														|  | 
 |  | +        var args = opTree[x].args;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return {
 |  | 
 | 
											
												
													
														|  | -    get isEnabled() {
 |  | 
 | 
											
												
													
														|  | -      if (PDFJS.disableWebGL) {
 |  | 
 | 
											
												
													
														|  | -        return false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        switch (fnId | 0) {
 | 
											
												
													
														|  | 
 |  | +          case OPS.beginText:
 | 
											
												
													
														|  | 
 |  | +            this.beginText();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setLeading:
 | 
											
												
													
														|  | 
 |  | +            this.setLeading(args);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setLeadingMoveText:
 | 
											
												
													
														|  | 
 |  | +            this.setLeadingMoveText(args[0], args[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setFont:
 | 
											
												
													
														|  | 
 |  | +            this.setFont(args);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.showText:
 | 
											
												
													
														|  | 
 |  | +            this.showText(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.showSpacedText:
 | 
											
												
													
														|  | 
 |  | +            this.showText(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.endText:
 | 
											
												
													
														|  | 
 |  | +            this.endText();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.moveText:
 | 
											
												
													
														|  | 
 |  | +            this.moveText(args[0], args[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setCharSpacing:
 | 
											
												
													
														|  | 
 |  | +            this.setCharSpacing(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setWordSpacing:
 | 
											
												
													
														|  | 
 |  | +            this.setWordSpacing(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setHScale:
 | 
											
												
													
														|  | 
 |  | +            this.setHScale(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setTextMatrix:
 | 
											
												
													
														|  | 
 |  | +            this.setTextMatrix(args[0], args[1], args[2],
 | 
											
												
													
														|  | 
 |  | +                               args[3], args[4], args[5]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setLineWidth:
 | 
											
												
													
														|  | 
 |  | +            this.setLineWidth(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setLineJoin:
 | 
											
												
													
														|  | 
 |  | +            this.setLineJoin(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setLineCap:
 | 
											
												
													
														|  | 
 |  | +            this.setLineCap(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setMiterLimit:
 | 
											
												
													
														|  | 
 |  | +            this.setMiterLimit(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setFillRGBColor:
 | 
											
												
													
														|  | 
 |  | +            this.setFillRGBColor(args[0], args[1], args[2]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setStrokeRGBColor:
 | 
											
												
													
														|  | 
 |  | +            this.setStrokeRGBColor(args[0], args[1], args[2]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setDash:
 | 
											
												
													
														|  | 
 |  | +            this.setDash(args[0], args[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.setGState:
 | 
											
												
													
														|  | 
 |  | +            this.setGState(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.fill:
 | 
											
												
													
														|  | 
 |  | +            this.fill();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.eoFill:
 | 
											
												
													
														|  | 
 |  | +            this.eoFill();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.stroke:
 | 
											
												
													
														|  | 
 |  | +            this.stroke();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.fillStroke:
 | 
											
												
													
														|  | 
 |  | +            this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.eoFillStroke:
 | 
											
												
													
														|  | 
 |  | +            this.eoFillStroke();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.clip:
 | 
											
												
													
														|  | 
 |  | +            this.clip('nonzero');
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.eoClip:
 | 
											
												
													
														|  | 
 |  | +            this.clip('evenodd');
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintSolidColorImageMask:
 | 
											
												
													
														|  | 
 |  | +            this.paintSolidColorImageMask();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintJpegXObject:
 | 
											
												
													
														|  | 
 |  | +            this.paintJpegXObject(args[0], args[1], args[2]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintImageXObject:
 | 
											
												
													
														|  | 
 |  | +            this.paintImageXObject(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintInlineImageXObject:
 | 
											
												
													
														|  | 
 |  | +            this.paintInlineImageXObject(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintImageMaskXObject:
 | 
											
												
													
														|  | 
 |  | +            this.paintImageMaskXObject(args[0]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintFormXObjectBegin:
 | 
											
												
													
														|  | 
 |  | +            this.paintFormXObjectBegin(args[0], args[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.paintFormXObjectEnd:
 | 
											
												
													
														|  | 
 |  | +            this.paintFormXObjectEnd();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.closePath:
 | 
											
												
													
														|  | 
 |  | +            this.closePath();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.closeStroke:
 | 
											
												
													
														|  | 
 |  | +            this.closeStroke();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.closeFillStroke:
 | 
											
												
													
														|  | 
 |  | +            this.closeFillStroke();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.nextLine:
 | 
											
												
													
														|  | 
 |  | +            this.nextLine();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.transform:
 | 
											
												
													
														|  | 
 |  | +            this.transform(args[0], args[1], args[2], args[3],
 | 
											
												
													
														|  | 
 |  | +                           args[4], args[5]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.constructPath:
 | 
											
												
													
														|  | 
 |  | +            this.constructPath(args[0], args[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.endPath:
 | 
											
												
													
														|  | 
 |  | +            this.endPath();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 92:
 | 
											
												
													
														|  | 
 |  | +            this.group(opTree[x].items);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          default:
 | 
											
												
													
														|  | 
 |  | +            warn('Unimplemented method '+ fn);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      var enabled = false;
 |  | 
 | 
											
												
													
														|  | -      try {
 |  | 
 | 
											
												
													
														|  | -        generateGL();
 |  | 
 | 
											
												
													
														|  | -        enabled = !!currentGL;
 |  | 
 | 
											
												
													
														|  | -      } catch (e) { }
 |  | 
 | 
											
												
													
														|  | -      return shadow(this, 'isEnabled', enabled);
 |  | 
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    composeSMask: composeSMask,
 |  | 
 | 
											
												
													
														|  | -    drawFigures: drawFigures,
 |  | 
 | 
											
												
													
														|  | -    clear: cleanup
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -exports.WebGLUtils = WebGLUtils;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
 | 
											
												
													
														|  | 
 |  | +      this.current.wordSpacing = wordSpacing;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
 | 
											
												
													
														|  | 
 |  | +      this.current.charSpacing = charSpacing;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil,
 |  | 
 | 
											
												
													
														|  | -      root.pdfjsDisplayWebGL);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}(this, function (exports, sharedUtil, displayWebGL) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    nextLine: function SVGGraphics_nextLine() {
 | 
											
												
													
														|  | 
 |  | +      this.moveText(0, this.current.leading);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var Util = sharedUtil.Util;
 |  | 
 | 
											
												
													
														|  | -var info = sharedUtil.info;
 |  | 
 | 
											
												
													
														|  | -var isArray = sharedUtil.isArray;
 |  | 
 | 
											
												
													
														|  | -var error = sharedUtil.error;
 |  | 
 | 
											
												
													
														|  | -var WebGLUtils = displayWebGL.WebGLUtils;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var ShadingIRs = {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -ShadingIRs.RadialAxial = {
 |  | 
 | 
											
												
													
														|  | -  fromIR: function RadialAxial_fromIR(raw) {
 |  | 
 | 
											
												
													
														|  | -    var type = raw[1];
 |  | 
 | 
											
												
													
														|  | -    var colorStops = raw[2];
 |  | 
 | 
											
												
													
														|  | -    var p0 = raw[3];
 |  | 
 | 
											
												
													
														|  | -    var p1 = raw[4];
 |  | 
 | 
											
												
													
														|  | -    var r0 = raw[5];
 |  | 
 | 
											
												
													
														|  | -    var r1 = raw[6];
 |  | 
 | 
											
												
													
														|  | -    return {
 |  | 
 | 
											
												
													
														|  | -      type: 'Pattern',
 |  | 
 | 
											
												
													
														|  | -      getPattern: function RadialAxial_getPattern(ctx) {
 |  | 
 | 
											
												
													
														|  | -        var grad;
 |  | 
 | 
											
												
													
														|  | -        if (type === 'axial') {
 |  | 
 | 
											
												
													
														|  | -          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
 |  | 
 | 
											
												
													
														|  | -        } else if (type === 'radial') {
 |  | 
 | 
											
												
													
														|  | -          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.xcoords = [];
 | 
											
												
													
														|  | 
 |  | +      current.tspan = document.createElementNS(NS, 'svg:tspan');
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-size',
 | 
											
												
													
														|  | 
 |  | +                                   pf(current.fontSize) + 'px');
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
 |  | 
 | 
											
												
													
														|  | -          var c = colorStops[i];
 |  | 
 | 
											
												
													
														|  | -          grad.addColorStop(c[0], c[1]);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        return grad;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.txtElement = document.createElementNS(NS, 'svg:text');
 | 
											
												
													
														|  | 
 |  | +      current.txtElement.appendChild(current.tspan);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var createMeshCanvas = (function createMeshCanvasClosure() {
 |  | 
 | 
											
												
													
														|  | -  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
 |  | 
 | 
											
												
													
														|  | -    // Very basic Gouraud-shaded triangle rasterization algorithm.
 |  | 
 | 
											
												
													
														|  | -    var coords = context.coords, colors = context.colors;
 |  | 
 | 
											
												
													
														|  | -    var bytes = data.data, rowSize = data.width * 4;
 |  | 
 | 
											
												
													
														|  | -    var tmp;
 |  | 
 | 
											
												
													
														|  | -    if (coords[p1 + 1] > coords[p2 + 1]) {
 |  | 
 | 
											
												
													
														|  | -      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (coords[p2 + 1] > coords[p3 + 1]) {
 |  | 
 | 
											
												
													
														|  | -      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (coords[p1 + 1] > coords[p2 + 1]) {
 |  | 
 | 
											
												
													
														|  | -      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
 |  | 
 | 
											
												
													
														|  | -    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
 |  | 
 | 
											
												
													
														|  | -    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
 |  | 
 | 
											
												
													
														|  | -    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
 |  | 
 | 
											
												
													
														|  | -    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
 |  | 
 | 
											
												
													
														|  | -    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
 |  | 
 | 
											
												
													
														|  | -    if (y1 >= y3) {
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
 |  | 
 | 
											
												
													
														|  | -    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
 |  | 
 | 
											
												
													
														|  | -    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    beginText: function SVGGraphics_beginText() {
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY = 0;
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +      this.current.lineMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
 | 
											
												
													
														|  | 
 |  | +      this.current.txtElement = document.createElementNS(NS, 'svg:text');
 | 
											
												
													
														|  | 
 |  | +      this.current.txtgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.current.xcoords = [];
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var minY = Math.round(y1), maxY = Math.round(y3);
 |  | 
 | 
											
												
													
														|  | -    var xa, car, cag, cab;
 |  | 
 | 
											
												
													
														|  | -    var xb, cbr, cbg, cbb;
 |  | 
 | 
											
												
													
														|  | -    var k;
 |  | 
 | 
											
												
													
														|  | -    for (var y = minY; y <= maxY; y++) {
 |  | 
 | 
											
												
													
														|  | -      if (y < y2) {
 |  | 
 | 
											
												
													
														|  | -        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
 |  | 
 | 
											
												
													
														|  | -        xa = x1 - (x1 - x2) * k;
 |  | 
 | 
											
												
													
														|  | -        car = c1r - (c1r - c2r) * k;
 |  | 
 | 
											
												
													
														|  | -        cag = c1g - (c1g - c2g) * k;
 |  | 
 | 
											
												
													
														|  | -        cab = c1b - (c1b - c2b) * k;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
 |  | 
 | 
											
												
													
														|  | -        xa = x2 - (x2 - x3) * k;
 |  | 
 | 
											
												
													
														|  | -        car = c2r - (c2r - c3r) * k;
 |  | 
 | 
											
												
													
														|  | -        cag = c2g - (c2g - c3g) * k;
 |  | 
 | 
											
												
													
														|  | -        cab = c2b - (c2b - c3b) * k;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
 |  | 
 | 
											
												
													
														|  | -      xb = x1 - (x1 - x3) * k;
 |  | 
 | 
											
												
													
														|  | -      cbr = c1r - (c1r - c3r) * k;
 |  | 
 | 
											
												
													
														|  | -      cbg = c1g - (c1g - c3g) * k;
 |  | 
 | 
											
												
													
														|  | -      cbb = c1b - (c1b - c3b) * k;
 |  | 
 | 
											
												
													
														|  | -      var x1_ = Math.round(Math.min(xa, xb));
 |  | 
 | 
											
												
													
														|  | -      var x2_ = Math.round(Math.max(xa, xb));
 |  | 
 | 
											
												
													
														|  | -      var j = rowSize * y + x1_ * 4;
 |  | 
 | 
											
												
													
														|  | -      for (var x = x1_; x <= x2_; x++) {
 |  | 
 | 
											
												
													
														|  | -        k = (xa - x) / (xa - xb);
 |  | 
 | 
											
												
													
														|  | -        k = k < 0 ? 0 : k > 1 ? 1 : k;
 |  | 
 | 
											
												
													
														|  | -        bytes[j++] = (car - (car - cbr) * k) | 0;
 |  | 
 | 
											
												
													
														|  | -        bytes[j++] = (cag - (cag - cbg) * k) | 0;
 |  | 
 | 
											
												
													
														|  | -        bytes[j++] = (cab - (cab - cbb) * k) | 0;
 |  | 
 | 
											
												
													
														|  | -        bytes[j++] = 255;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    moveText: function SVGGraphics_moveText(x, y) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX += x;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY += y;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function drawFigure(data, figure, context) {
 |  | 
 | 
											
												
													
														|  | -    var ps = figure.coords;
 |  | 
 | 
											
												
													
														|  | -    var cs = figure.colors;
 |  | 
 | 
											
												
													
														|  | -    var i, ii;
 |  | 
 | 
											
												
													
														|  | -    switch (figure.type) {
 |  | 
 | 
											
												
													
														|  | -      case 'lattice':
 |  | 
 | 
											
												
													
														|  | -        var verticesPerRow = figure.verticesPerRow;
 |  | 
 | 
											
												
													
														|  | -        var rows = Math.floor(ps.length / verticesPerRow) - 1;
 |  | 
 | 
											
												
													
														|  | -        var cols = verticesPerRow - 1;
 |  | 
 | 
											
												
													
														|  | -        for (i = 0; i < rows; i++) {
 |  | 
 | 
											
												
													
														|  | -          var q = i * verticesPerRow;
 |  | 
 | 
											
												
													
														|  | -          for (var j = 0; j < cols; j++, q++) {
 |  | 
 | 
											
												
													
														|  | -            drawTriangle(data, context,
 |  | 
 | 
											
												
													
														|  | -              ps[q], ps[q + 1], ps[q + verticesPerRow],
 |  | 
 | 
											
												
													
														|  | -              cs[q], cs[q + 1], cs[q + verticesPerRow]);
 |  | 
 | 
											
												
													
														|  | -            drawTriangle(data, context,
 |  | 
 | 
											
												
													
														|  | -              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],
 |  | 
 | 
											
												
													
														|  | -              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      case 'triangles':
 |  | 
 | 
											
												
													
														|  | -        for (i = 0, ii = ps.length; i < ii; i += 3) {
 |  | 
 | 
											
												
													
														|  | -          drawTriangle(data, context,
 |  | 
 | 
											
												
													
														|  | -            ps[i], ps[i + 1], ps[i + 2],
 |  | 
 | 
											
												
													
														|  | -            cs[i], cs[i + 1], cs[i + 2]);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      default:
 |  | 
 | 
											
												
													
														|  | -        error('illigal figure');
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.xcoords = [];
 | 
											
												
													
														|  | 
 |  | +      current.tspan = document.createElementNS(NS, 'svg:tspan');
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-size',
 | 
											
												
													
														|  | 
 |  | +                                   pf(current.fontSize) + 'px');
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
 |  | 
 | 
											
												
													
														|  | -                            backgroundColor, cachedCanvases) {
 |  | 
 | 
											
												
													
														|  | -    // we will increase scale on some weird factor to let antialiasing take
 |  | 
 | 
											
												
													
														|  | -    // care of "rough" edges
 |  | 
 | 
											
												
													
														|  | -    var EXPECTED_SCALE = 1.1;
 |  | 
 | 
											
												
													
														|  | -    // MAX_PATTERN_SIZE is used to avoid OOM situation.
 |  | 
 | 
											
												
													
														|  | -    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
 |  | 
 | 
											
												
													
														|  | 
 |  | +    showText: function SVGGraphics_showText(glyphs) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var font = current.font;
 | 
											
												
													
														|  | 
 |  | +      var fontSize = current.fontSize;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var offsetX = Math.floor(bounds[0]);
 |  | 
 | 
											
												
													
														|  | -    var offsetY = Math.floor(bounds[1]);
 |  | 
 | 
											
												
													
														|  | -    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
 |  | 
 | 
											
												
													
														|  | -    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (fontSize === 0) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
 |  | 
 | 
											
												
													
														|  | -      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
 |  | 
 | 
											
												
													
														|  | -    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
 |  | 
 | 
											
												
													
														|  | -      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
 |  | 
 | 
											
												
													
														|  | -    var scaleX = boundsWidth / width;
 |  | 
 | 
											
												
													
														|  | -    var scaleY = boundsHeight / height;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var charSpacing = current.charSpacing;
 | 
											
												
													
														|  | 
 |  | +      var wordSpacing = current.wordSpacing;
 | 
											
												
													
														|  | 
 |  | +      var fontDirection = current.fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var textHScale = current.textHScale * fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var glyphsLength = glyphs.length;
 | 
											
												
													
														|  | 
 |  | +      var vertical = font.vertical;
 | 
											
												
													
														|  | 
 |  | +      var widthAdvanceScale = fontSize * current.fontMatrix[0];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var context = {
 |  | 
 | 
											
												
													
														|  | -      coords: coords,
 |  | 
 | 
											
												
													
														|  | -      colors: colors,
 |  | 
 | 
											
												
													
														|  | -      offsetX: -offsetX,
 |  | 
 | 
											
												
													
														|  | -      offsetY: -offsetY,
 |  | 
 | 
											
												
													
														|  | -      scaleX: 1 / scaleX,
 |  | 
 | 
											
												
													
														|  | -      scaleY: 1 / scaleY
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var x = 0, i;
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < glyphsLength; ++i) {
 | 
											
												
													
														|  | 
 |  | +        var glyph = glyphs[i];
 | 
											
												
													
														|  | 
 |  | +        if (glyph === null) {
 | 
											
												
													
														|  | 
 |  | +          // word break
 | 
											
												
													
														|  | 
 |  | +          x += fontDirection * wordSpacing;
 | 
											
												
													
														|  | 
 |  | +          continue;
 | 
											
												
													
														|  | 
 |  | +        } else if (isNum(glyph)) {
 | 
											
												
													
														|  | 
 |  | +          x += -glyph * fontSize * 0.001;
 | 
											
												
													
														|  | 
 |  | +          continue;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        current.xcoords.push(current.x + x * textHScale);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var canvas, tmpCanvas, i, ii;
 |  | 
 | 
											
												
													
														|  | -    if (WebGLUtils.isEnabled) {
 |  | 
 | 
											
												
													
														|  | -      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
 |  | 
 | 
											
												
													
														|  | -                                      figures, context);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var width = glyph.width;
 | 
											
												
													
														|  | 
 |  | +        var character = glyph.fontChar;
 | 
											
												
													
														|  | 
 |  | +        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
 | 
											
												
													
														|  | 
 |  | +        x += charWidth;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126
 |  | 
 | 
											
												
													
														|  | -      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
 |  | 
 | 
											
												
													
														|  | -      tmpCanvas.context.drawImage(canvas, 0, 0);
 |  | 
 | 
											
												
													
														|  | -      canvas = tmpCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
 |  | 
 | 
											
												
													
														|  | -      var tmpCtx = tmpCanvas.context;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        current.tspan.textContent += character;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (vertical) {
 | 
											
												
													
														|  | 
 |  | +        current.y -= x * textHScale;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        current.x += x * textHScale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var data = tmpCtx.createImageData(width, height);
 |  | 
 | 
											
												
													
														|  | -      if (backgroundColor) {
 |  | 
 | 
											
												
													
														|  | -        var bytes = data.data;
 |  | 
 | 
											
												
													
														|  | -        for (i = 0, ii = bytes.length; i < ii; i += 4) {
 |  | 
 | 
											
												
													
														|  | -          bytes[i] = backgroundColor[0];
 |  | 
 | 
											
												
													
														|  | -          bytes[i + 1] = backgroundColor[1];
 |  | 
 | 
											
												
													
														|  | -          bytes[i + 2] = backgroundColor[2];
 |  | 
 | 
											
												
													
														|  | -          bytes[i + 3] = 255;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'x',
 | 
											
												
													
														|  | 
 |  | +                                   current.xcoords.map(pf).join(' '));
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'font-size',
 | 
											
												
													
														|  | 
 |  | +                                   pf(current.fontSize) + 'px');
 | 
											
												
													
														|  | 
 |  | +      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
 | 
											
												
													
														|  | 
 |  | +        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      for (i = 0; i < figures.length; i++) {
 |  | 
 | 
											
												
													
														|  | -        drawFigure(data, figures[i], context);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
 | 
											
												
													
														|  | 
 |  | +        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (current.fillColor !== SVG_DEFAULTS.fillColor) {
 | 
											
												
													
														|  | 
 |  | +        current.tspan.setAttributeNS(null, 'fill', current.fillColor);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      tmpCtx.putImageData(data, 0, 0);
 |  | 
 | 
											
												
													
														|  | -      canvas = tmpCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
 |  | 
 | 
											
												
													
														|  | -            scaleX: scaleX, scaleY: scaleY};
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  return createMeshCanvas;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.txtElement.setAttributeNS(null, 'transform',
 | 
											
												
													
														|  | 
 |  | +                                        pm(current.textMatrix) +
 | 
											
												
													
														|  | 
 |  | +                                        ' scale(1, -1)' );
 | 
											
												
													
														|  | 
 |  | +      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
 | 
											
												
													
														|  | 
 |  | +      current.txtElement.appendChild(current.tspan);
 | 
											
												
													
														|  | 
 |  | +      current.txtgrp.appendChild(current.txtElement);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -ShadingIRs.Mesh = {
 |  | 
 | 
											
												
													
														|  | -  fromIR: function Mesh_fromIR(raw) {
 |  | 
 | 
											
												
													
														|  | -    //var type = raw[1];
 |  | 
 | 
											
												
													
														|  | -    var coords = raw[2];
 |  | 
 | 
											
												
													
														|  | -    var colors = raw[3];
 |  | 
 | 
											
												
													
														|  | -    var figures = raw[4];
 |  | 
 | 
											
												
													
														|  | -    var bounds = raw[5];
 |  | 
 | 
											
												
													
														|  | -    var matrix = raw[6];
 |  | 
 | 
											
												
													
														|  | -    //var bbox = raw[7];
 |  | 
 | 
											
												
													
														|  | -    var background = raw[8];
 |  | 
 | 
											
												
													
														|  | -    return {
 |  | 
 | 
											
												
													
														|  | -      type: 'Pattern',
 |  | 
 | 
											
												
													
														|  | -      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
 |  | 
 | 
											
												
													
														|  | -        var scale;
 |  | 
 | 
											
												
													
														|  | -        if (shadingFill) {
 |  | 
 | 
											
												
													
														|  | -          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          // Obtain scale from matrix and current transformation matrix.
 |  | 
 | 
											
												
													
														|  | -          scale = Util.singularValueDecompose2dScale(owner.baseTransform);
 |  | 
 | 
											
												
													
														|  | -          if (matrix) {
 |  | 
 | 
											
												
													
														|  | -            var matrixScale = Util.singularValueDecompose2dScale(matrix);
 |  | 
 | 
											
												
													
														|  | -            scale = [scale[0] * matrixScale[0],
 |  | 
 | 
											
												
													
														|  | -                     scale[1] * matrixScale[1]];
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        // Rasterizing on the main thread since sending/queue large canvases
 |  | 
 | 
											
												
													
														|  | -        // might cause OOM.
 |  | 
 | 
											
												
													
														|  | -        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
 |  | 
 | 
											
												
													
														|  | -          colors, figures, shadingFill ? null : background,
 |  | 
 | 
											
												
													
														|  | -          owner.cachedCanvases);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        if (!shadingFill) {
 |  | 
 | 
											
												
													
														|  | -          ctx.setTransform.apply(ctx, owner.baseTransform);
 |  | 
 | 
											
												
													
														|  | -          if (matrix) {
 |  | 
 | 
											
												
													
														|  | -            ctx.transform.apply(ctx, matrix);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.appendChild(current.txtElement);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        ctx.translate(temporaryPatternCanvas.offsetX,
 |  | 
 | 
											
												
													
														|  | -                      temporaryPatternCanvas.offsetY);
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(temporaryPatternCanvas.scaleX,
 |  | 
 | 
											
												
													
														|  | -                  temporaryPatternCanvas.scaleY);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
 | 
											
												
													
														|  | 
 |  | +      this.setLeading(-y);
 | 
											
												
													
														|  | 
 |  | +      this.moveText(x, y);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -ShadingIRs.Dummy = {
 |  | 
 | 
											
												
													
														|  | -  fromIR: function Dummy_fromIR() {
 |  | 
 | 
											
												
													
														|  | -    return {
 |  | 
 | 
											
												
													
														|  | -      type: 'Pattern',
 |  | 
 | 
											
												
													
														|  | -      getPattern: function Dummy_fromIR_getPattern() {
 |  | 
 | 
											
												
													
														|  | -        return 'hotpink';
 |  | 
 | 
											
												
													
														|  | 
 |  | +    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
 | 
											
												
													
														|  | 
 |  | +      if (!this.cssStyle) {
 | 
											
												
													
														|  | 
 |  | +        this.cssStyle = document.createElementNS(NS, 'svg:style');
 | 
											
												
													
														|  | 
 |  | +        this.cssStyle.setAttributeNS(null, 'type', 'text/css');
 | 
											
												
													
														|  | 
 |  | +        this.defs.appendChild(this.cssStyle);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -function getShadingPatternFromIR(raw) {
 |  | 
 | 
											
												
													
														|  | -  var shadingIR = ShadingIRs[raw[0]];
 |  | 
 | 
											
												
													
														|  | -  if (!shadingIR) {
 |  | 
 | 
											
												
													
														|  | -    error('Unknown IR type: ' + raw[0]);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  return shadingIR.fromIR(raw);
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var TilingPattern = (function TilingPatternClosure() {
 |  | 
 | 
											
												
													
														|  | -  var PaintType = {
 |  | 
 | 
											
												
													
														|  | -    COLORED: 1,
 |  | 
 | 
											
												
													
														|  | -    UNCOLORED: 2
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
 |  | 
 | 
											
												
													
														|  | -    this.operatorList = IR[2];
 |  | 
 | 
											
												
													
														|  | -    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
 |  | 
 | 
											
												
													
														|  | -    this.bbox = IR[4];
 |  | 
 | 
											
												
													
														|  | -    this.xstep = IR[5];
 |  | 
 | 
											
												
													
														|  | -    this.ystep = IR[6];
 |  | 
 | 
											
												
													
														|  | -    this.paintType = IR[7];
 |  | 
 | 
											
												
													
														|  | -    this.tilingType = IR[8];
 |  | 
 | 
											
												
													
														|  | -    this.color = color;
 |  | 
 | 
											
												
													
														|  | -    this.canvasGraphicsFactory = canvasGraphicsFactory;
 |  | 
 | 
											
												
													
														|  | -    this.baseTransform = baseTransform;
 |  | 
 | 
											
												
													
														|  | -    this.type = 'Pattern';
 |  | 
 | 
											
												
													
														|  | -    this.ctx = ctx;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  TilingPattern.prototype = {
 |  | 
 | 
											
												
													
														|  | -    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
 |  | 
 | 
											
												
													
														|  | -      var operatorList = this.operatorList;
 |  | 
 | 
											
												
													
														|  | -      var bbox = this.bbox;
 |  | 
 | 
											
												
													
														|  | -      var xstep = this.xstep;
 |  | 
 | 
											
												
													
														|  | -      var ystep = this.ystep;
 |  | 
 | 
											
												
													
														|  | -      var paintType = this.paintType;
 |  | 
 | 
											
												
													
														|  | -      var tilingType = this.tilingType;
 |  | 
 | 
											
												
													
														|  | -      var color = this.color;
 |  | 
 | 
											
												
													
														|  | -      var canvasGraphicsFactory = this.canvasGraphicsFactory;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      info('TilingType: ' + tilingType);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var topLeft = [x0, y0];
 |  | 
 | 
											
												
													
														|  | -      // we want the canvas to be as large as the step size
 |  | 
 | 
											
												
													
														|  | -      var botRight = [x0 + xstep, y0 + ystep];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var width = botRight[0] - topLeft[0];
 |  | 
 | 
											
												
													
														|  | -      var height = botRight[1] - topLeft[1];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // Obtain scale from matrix and current transformation matrix.
 |  | 
 | 
											
												
													
														|  | -      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
 |  | 
 | 
											
												
													
														|  | -      var curMatrixScale = Util.singularValueDecompose2dScale(
 |  | 
 | 
											
												
													
														|  | -        this.baseTransform);
 |  | 
 | 
											
												
													
														|  | -      var combinedScale = [matrixScale[0] * curMatrixScale[0],
 |  | 
 | 
											
												
													
														|  | -        matrixScale[1] * curMatrixScale[1]];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // MAX_PATTERN_SIZE is used to avoid OOM situation.
 |  | 
 | 
											
												
													
														|  | -      // Use width and height values that are as close as possible to the end
 |  | 
 | 
											
												
													
														|  | -      // result when the pattern is used. Too low value makes the pattern look
 |  | 
 | 
											
												
													
														|  | -      // blurry. Too large value makes it look too crispy.
 |  | 
 | 
											
												
													
														|  | -      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),
 |  | 
 | 
											
												
													
														|  | -        MAX_PATTERN_SIZE);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
 |  | 
 | 
											
												
													
														|  | -        MAX_PATTERN_SIZE);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
 | 
											
												
													
														|  | 
 |  | +      this.cssStyle.textContent +=
 | 
											
												
													
														|  | 
 |  | +        '@font-face { font-family: "' + fontObj.loadedName + '";' +
 | 
											
												
													
														|  | 
 |  | +        ' src: url(' + url + '); }\n';
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern',
 |  | 
 | 
											
												
													
														|  | -        width, height, true);
 |  | 
 | 
											
												
													
														|  | -      var tmpCtx = tmpCanvas.context;
 |  | 
 | 
											
												
													
														|  | -      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
 |  | 
 | 
											
												
													
														|  | -      graphics.groupLevel = owner.groupLevel;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setFont: function SVGGraphics_setFont(details) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var fontObj = this.commonObjs.get(details[0]);
 | 
											
												
													
														|  | 
 |  | +      var size = details[1];
 | 
											
												
													
														|  | 
 |  | +      this.current.font = fontObj;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.embedFonts && fontObj.data &&
 | 
											
												
													
														|  | 
 |  | +          !this.embeddedFonts[fontObj.loadedName]) {
 | 
											
												
													
														|  | 
 |  | +        this.addFontStyle(fontObj);
 | 
											
												
													
														|  | 
 |  | +        this.embeddedFonts[fontObj.loadedName] = fontObj;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.setScale(width, height, xstep, ystep);
 |  | 
 | 
											
												
													
														|  | -      this.transformToScale(graphics);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.fontMatrix = (fontObj.fontMatrix ?
 | 
											
												
													
														|  | 
 |  | +                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // transform coordinates to pattern space
 |  | 
 | 
											
												
													
														|  | -      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
 |  | 
 | 
											
												
													
														|  | -      graphics.transform.apply(graphics, tmpTranslate);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
 | 
											
												
													
														|  | 
 |  | +                                 (fontObj.bold ? 'bold' : 'normal');
 | 
											
												
													
														|  | 
 |  | +      var italic = fontObj.italic ? 'italic' : 'normal';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (size < 0) {
 | 
											
												
													
														|  | 
 |  | +        size = -size;
 | 
											
												
													
														|  | 
 |  | +        current.fontDirection = -1;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        current.fontDirection = 1;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      current.fontSize = size;
 | 
											
												
													
														|  | 
 |  | +      current.fontFamily = fontObj.loadedName;
 | 
											
												
													
														|  | 
 |  | +      current.fontWeight = bold;
 | 
											
												
													
														|  | 
 |  | +      current.fontStyle = italic;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      graphics.executeOperatorList(operatorList);
 |  | 
 | 
											
												
													
														|  | -      return tmpCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.tspan = document.createElementNS(NS, 'svg:tspan');
 | 
											
												
													
														|  | 
 |  | +      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 | 
											
												
													
														|  | 
 |  | +      current.xcoords = [];
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
 |  | 
 | 
											
												
													
														|  | -      this.scale = [width / xstep, height / ystep];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endText: function SVGGraphics_endText() {
 | 
											
												
													
														|  | 
 |  | +      if (this.current.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        this.cgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.tgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    transformToScale: function TilingPattern_transformToScale(graphics) {
 |  | 
 | 
											
												
													
														|  | -      var scale = this.scale;
 |  | 
 | 
											
												
													
														|  | -      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
 |  | 
 | 
											
												
													
														|  | -      graphics.transform.apply(graphics, tmpScale);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Path properties
 | 
											
												
													
														|  | 
 |  | +    setLineWidth: function SVGGraphics_setLineWidth(width) {
 | 
											
												
													
														|  | 
 |  | +      this.current.lineWidth = width;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    scaleToContext: function TilingPattern_scaleToContext() {
 |  | 
 | 
											
												
													
														|  | -      var scale = this.scale;
 |  | 
 | 
											
												
													
														|  | -      this.ctx.scale(1 / scale[0], 1 / scale[1]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setLineCap: function SVGGraphics_setLineCap(style) {
 | 
											
												
													
														|  | 
 |  | +      this.current.lineCap = LINE_CAP_STYLES[style];
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
 |  | 
 | 
											
												
													
														|  | -      if (bbox && isArray(bbox) && bbox.length === 4) {
 |  | 
 | 
											
												
													
														|  | -        var bboxWidth = x1 - x0;
 |  | 
 | 
											
												
													
														|  | -        var bboxHeight = y1 - y0;
 |  | 
 | 
											
												
													
														|  | -        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
 |  | 
 | 
											
												
													
														|  | -        graphics.clip();
 |  | 
 | 
											
												
													
														|  | -        graphics.endPath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setLineJoin: function SVGGraphics_setLineJoin(style) {
 | 
											
												
													
														|  | 
 |  | +      this.current.lineJoin = LINE_JOIN_STYLES[style];
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
 | 
											
												
													
														|  | 
 |  | +      this.current.miterLimit = limit;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
 | 
											
												
													
														|  | 
 |  | +      var color = Util.makeCssRgb(r, g, b);
 | 
											
												
													
														|  | 
 |  | +      this.current.strokeColor = color;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
 | 
											
												
													
														|  | 
 |  | +      var color = Util.makeCssRgb(r, g, b);
 | 
											
												
													
														|  | 
 |  | +      this.current.fillColor = color;
 | 
											
												
													
														|  | 
 |  | +      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
 | 
											
												
													
														|  | 
 |  | +      this.current.xcoords = [];
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
 | 
											
												
													
														|  | 
 |  | +      this.current.dashArray = dashArray;
 | 
											
												
													
														|  | 
 |  | +      this.current.dashPhase = dashPhase;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setFillAndStrokeStyleToContext:
 |  | 
 | 
											
												
													
														|  | -      function setFillAndStrokeStyleToContext(context, paintType, color) {
 |  | 
 | 
											
												
													
														|  | -        switch (paintType) {
 |  | 
 | 
											
												
													
														|  | -          case PaintType.COLORED:
 |  | 
 | 
											
												
													
														|  | -            var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -            context.fillStyle = ctx.fillStyle;
 |  | 
 | 
											
												
													
														|  | -            context.strokeStyle = ctx.strokeStyle;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case PaintType.UNCOLORED:
 |  | 
 | 
											
												
													
														|  | -            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);
 |  | 
 | 
											
												
													
														|  | -            context.fillStyle = cssColor;
 |  | 
 | 
											
												
													
														|  | -            context.strokeStyle = cssColor;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          default:
 |  | 
 | 
											
												
													
														|  | -            error('Unsupported paint type: ' + paintType);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    constructPath: function SVGGraphics_constructPath(ops, args) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var x = current.x, y = current.y;
 | 
											
												
													
														|  | 
 |  | +      current.path = document.createElementNS(NS, 'svg:path');
 | 
											
												
													
														|  | 
 |  | +      var d = [];
 | 
											
												
													
														|  | 
 |  | +      var opLength = ops.length;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getPattern: function TilingPattern_getPattern(ctx, owner) {
 |  | 
 | 
											
												
													
														|  | -      var temporaryPatternCanvas = this.createPatternCanvas(owner);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      ctx.setTransform.apply(ctx, this.baseTransform);
 |  | 
 | 
											
												
													
														|  | -      ctx.transform.apply(ctx, this.matrix);
 |  | 
 | 
											
												
													
														|  | -      this.scaleToContext();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, j = 0; i < opLength; i++) {
 | 
											
												
													
														|  | 
 |  | +        switch (ops[i] | 0) {
 | 
											
												
													
														|  | 
 |  | +          case OPS.rectangle:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            var width = args[j++];
 | 
											
												
													
														|  | 
 |  | +            var height = args[j++];
 | 
											
												
													
														|  | 
 |  | +            var xw = x + width;
 | 
											
												
													
														|  | 
 |  | +            var yh = y + height;
 | 
											
												
													
														|  | 
 |  | +            d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),
 | 
											
												
													
														|  | 
 |  | +                   'L', pf(x), pf(yh), 'Z');
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.moveTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            d.push('M', pf(x), pf(y));
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.lineTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            d.push('L', pf(x) , pf(y));
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 4];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 5];
 | 
											
												
													
														|  | 
 |  | +            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),
 | 
											
												
													
														|  | 
 |  | +                   pf(args[j + 3]), pf(x), pf(y));
 | 
											
												
													
														|  | 
 |  | +            j += 6;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo2:
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 2];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 3];
 | 
											
												
													
														|  | 
 |  | +            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),
 | 
											
												
													
														|  | 
 |  | +                   pf(args[j + 2]), pf(args[j + 3]));
 | 
											
												
													
														|  | 
 |  | +            j += 4;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo3:
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 2];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 3];
 | 
											
												
													
														|  | 
 |  | +            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
 | 
											
												
													
														|  | 
 |  | +                   pf(x), pf(y));
 | 
											
												
													
														|  | 
 |  | +            j += 4;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.closePath:
 | 
											
												
													
														|  | 
 |  | +            d.push('Z');
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'd', d.join(' '));
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-miterlimit',
 | 
											
												
													
														|  | 
 |  | +                                  pf(current.miterLimit));
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-width',
 | 
											
												
													
														|  | 
 |  | +                                  pf(current.lineWidth) + 'px');
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-dasharray',
 | 
											
												
													
														|  | 
 |  | +                                  current.dashArray.map(pf).join(' '));
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'stroke-dashoffset',
 | 
											
												
													
														|  | 
 |  | +                                  pf(current.dashPhase) + 'px');
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'fill', 'none');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      return ctx.createPattern(temporaryPatternCanvas, 'repeat');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.appendChild(current.path);
 | 
											
												
													
														|  | 
 |  | +      if (current.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        this.cgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      // Saving a reference in current.element so that it can be addressed
 | 
											
												
													
														|  | 
 |  | +      // in 'fill' and 'stroke'
 | 
											
												
													
														|  | 
 |  | +      current.element = current.path;
 | 
											
												
													
														|  | 
 |  | +      current.setCurrentPoint(x, y);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return TilingPattern;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endPath: function SVGGraphics_endPath() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      if (current.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        this.cgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.tgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -exports.getShadingPatternFromIR = getShadingPatternFromIR;
 |  | 
 | 
											
												
													
														|  | -exports.TilingPattern = TilingPattern;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    clip: function SVGGraphics_clip(type) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      // Add current path to clipping path
 | 
											
												
													
														|  | 
 |  | +      current.clipId = 'clippath' + clipCount;
 | 
											
												
													
														|  | 
 |  | +      clipCount++;
 | 
											
												
													
														|  | 
 |  | +      this.clippath = document.createElementNS(NS, 'svg:clipPath');
 | 
											
												
													
														|  | 
 |  | +      this.clippath.setAttributeNS(null, 'id', current.clipId);
 | 
											
												
													
														|  | 
 |  | +      var clipElement = current.element.cloneNode();
 | 
											
												
													
														|  | 
 |  | +      if (type === 'evenodd') {
 | 
											
												
													
														|  | 
 |  | +        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 | 
											
												
													
														|  | 
 |  | +      this.clippath.appendChild(clipElement);
 | 
											
												
													
														|  | 
 |  | +      this.defs.appendChild(this.clippath);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +      // Create a new group with that attribute
 | 
											
												
													
														|  | 
 |  | +      current.pendingClip = true;
 | 
											
												
													
														|  | 
 |  | +      this.cgrp = document.createElementNS(NS, 'svg:g');
 | 
											
												
													
														|  | 
 |  | +      this.cgrp.setAttributeNS(null, 'clip-path',
 | 
											
												
													
														|  | 
 |  | +                               'url(#' + current.clipId + ')');
 | 
											
												
													
														|  | 
 |  | +      this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil,
 |  | 
 | 
											
												
													
														|  | -      root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}(this, function (exports, sharedUtil, displayPatternHelper, displayWebGL) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    closePath: function SVGGraphics_closePath() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var d = current.path.getAttributeNS(null, 'd');
 | 
											
												
													
														|  | 
 |  | +      d += 'Z';
 | 
											
												
													
														|  | 
 |  | +      current.path.setAttributeNS(null, 'd', d);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -var ImageKind = sharedUtil.ImageKind;
 |  | 
 | 
											
												
													
														|  | -var OPS = sharedUtil.OPS;
 |  | 
 | 
											
												
													
														|  | -var TextRenderingMode = sharedUtil.TextRenderingMode;
 |  | 
 | 
											
												
													
														|  | -var Uint32ArrayView = sharedUtil.Uint32ArrayView;
 |  | 
 | 
											
												
													
														|  | -var Util = sharedUtil.Util;
 |  | 
 | 
											
												
													
														|  | -var assert = sharedUtil.assert;
 |  | 
 | 
											
												
													
														|  | -var info = sharedUtil.info;
 |  | 
 | 
											
												
													
														|  | -var isNum = sharedUtil.isNum;
 |  | 
 | 
											
												
													
														|  | -var isArray = sharedUtil.isArray;
 |  | 
 | 
											
												
													
														|  | -var error = sharedUtil.error;
 |  | 
 | 
											
												
													
														|  | -var shadow = sharedUtil.shadow;
 |  | 
 | 
											
												
													
														|  | -var warn = sharedUtil.warn;
 |  | 
 | 
											
												
													
														|  | -var TilingPattern = displayPatternHelper.TilingPattern;
 |  | 
 | 
											
												
													
														|  | -var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR;
 |  | 
 | 
											
												
													
														|  | -var WebGLUtils = displayWebGL.WebGLUtils;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setLeading: function SVGGraphics_setLeading(leading) {
 | 
											
												
													
														|  | 
 |  | +      this.current.leading = -leading;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -// <canvas> contexts store most of the state we need natively.
 |  | 
 | 
											
												
													
														|  | -// However, PDF needs a bit more state, which we store here.
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setTextRise: function SVGGraphics_setTextRise(textRise) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textRise = textRise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -// Minimal font size that would be used during canvas fillText operations.
 |  | 
 | 
											
												
													
														|  | -var MIN_FONT_SIZE = 16;
 |  | 
 | 
											
												
													
														|  | -// Maximum font size that would be used during canvas fillText operations.
 |  | 
 | 
											
												
													
														|  | -var MAX_FONT_SIZE = 100;
 |  | 
 | 
											
												
													
														|  | -var MAX_GROUP_SIZE = 4096;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setHScale: function SVGGraphics_setHScale(scale) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textHScale = scale / 100;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -// Heuristic value used when enforcing minimum line widths.
 |  | 
 | 
											
												
													
														|  | -var MIN_WIDTH_FACTOR = 0.65;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setGState: function SVGGraphics_setGState(states) {
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = states.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        var state = states[i];
 | 
											
												
													
														|  | 
 |  | +        var key = state[0];
 | 
											
												
													
														|  | 
 |  | +        var value = state[1];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var COMPILE_TYPE3_GLYPHS = true;
 |  | 
 | 
											
												
													
														|  | -var MAX_SIZE_TO_COMPILE = 1000;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        switch (key) {
 | 
											
												
													
														|  | 
 |  | +          case 'LW':
 | 
											
												
													
														|  | 
 |  | +            this.setLineWidth(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'LC':
 | 
											
												
													
														|  | 
 |  | +            this.setLineCap(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'LJ':
 | 
											
												
													
														|  | 
 |  | +            this.setLineJoin(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'ML':
 | 
											
												
													
														|  | 
 |  | +            this.setMiterLimit(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'D':
 | 
											
												
													
														|  | 
 |  | +            this.setDash(value[0], value[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'RI':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'FL':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'Font':
 | 
											
												
													
														|  | 
 |  | +            this.setFont(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'CA':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'ca':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'BM':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'SMask':
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var FULL_CHUNK_HEIGHT = 16;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    fill: function SVGGraphics_fill() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      current.element.setAttributeNS(null, 'fill', current.fillColor);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -function createScratchCanvas(width, height) {
 |  | 
 | 
											
												
													
														|  | -  var canvas = document.createElement('canvas');
 |  | 
 | 
											
												
													
														|  | -  canvas.width = width;
 |  | 
 | 
											
												
													
														|  | -  canvas.height = height;
 |  | 
 | 
											
												
													
														|  | -  return canvas;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | 
 |  | +    stroke: function SVGGraphics_stroke() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      current.element.setAttributeNS(null, 'stroke', current.strokeColor);
 | 
											
												
													
														|  | 
 |  | +      current.element.setAttributeNS(null, 'fill', 'none');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -function addContextCurrentTransform(ctx) {
 |  | 
 | 
											
												
													
														|  | -  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.
 |  | 
 | 
											
												
													
														|  | -  if (!ctx.mozCurrentTransform) {
 |  | 
 | 
											
												
													
														|  | -    ctx._originalSave = ctx.save;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalRestore = ctx.restore;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalRotate = ctx.rotate;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalScale = ctx.scale;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalTranslate = ctx.translate;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalTransform = ctx.transform;
 |  | 
 | 
											
												
													
														|  | -    ctx._originalSetTransform = ctx.setTransform;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    eoFill: function SVGGraphics_eoFill() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      current.element.setAttributeNS(null, 'fill', current.fillColor);
 | 
											
												
													
														|  | 
 |  | +      current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
 |  | 
 | 
											
												
													
														|  | -    ctx._transformStack = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    fillStroke: function SVGGraphics_fillStroke() {
 | 
											
												
													
														|  | 
 |  | +      // Order is important since stroke wants fill to be none.
 | 
											
												
													
														|  | 
 |  | +      // First stroke, then if fill needed, it will be overwritten.
 | 
											
												
													
														|  | 
 |  | +      this.stroke();
 | 
											
												
													
														|  | 
 |  | +      this.fill();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    Object.defineProperty(ctx, 'mozCurrentTransform', {
 |  | 
 | 
											
												
													
														|  | -      get: function getCurrentTransform() {
 |  | 
 | 
											
												
													
														|  | -        return this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    eoFillStroke: function SVGGraphics_eoFillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
 | 
											
												
													
														|  | 
 |  | +      this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
 |  | 
 | 
											
												
													
														|  | -      get: function getCurrentTransformInverse() {
 |  | 
 | 
											
												
													
														|  | -        // Calculation done using WolframAlpha:
 |  | 
 | 
											
												
													
														|  | -        // http://www.wolframalpha.com/input/?
 |  | 
 | 
											
												
													
														|  | -        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        var m = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        var ad_bc = a * d - b * c;
 |  | 
 | 
											
												
													
														|  | -        var bc_ad = b * c - a * d;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    closeStroke: function SVGGraphics_closeStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.closePath();
 | 
											
												
													
														|  | 
 |  | +      this.stroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        return [
 |  | 
 | 
											
												
													
														|  | -          d / ad_bc,
 |  | 
 | 
											
												
													
														|  | -          b / bc_ad,
 |  | 
 | 
											
												
													
														|  | -          c / bc_ad,
 |  | 
 | 
											
												
													
														|  | -          a / ad_bc,
 |  | 
 | 
											
												
													
														|  | -          (d * e - c * f) / bc_ad,
 |  | 
 | 
											
												
													
														|  | -          (b * e - a * f) / ad_bc
 |  | 
 | 
											
												
													
														|  | -        ];
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    closeFillStroke: function SVGGraphics_closeFillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.closePath();
 | 
											
												
													
														|  | 
 |  | +      this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.save = function ctxSave() {
 |  | 
 | 
											
												
													
														|  | -      var old = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      this._transformStack.push(old);
 |  | 
 | 
											
												
													
														|  | -      this._transformMatrix = old.slice(0, 6);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintSolidColorImageMask:
 | 
											
												
													
														|  | 
 |  | +        function SVGGraphics_paintSolidColorImageMask() {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var rect = document.createElementNS(NS, 'svg:rect');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'x', '0');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'y', '0');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'width', '1px');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'height', '1px');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'fill', current.fillColor);
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.appendChild(rect);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this._originalSave();
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var imgObj = this.objs.get(objId);
 | 
											
												
													
														|  | 
 |  | +      var imgEl = document.createElementNS(NS, 'svg:image');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'x', '0');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'y', pf(-h));
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'transform',
 | 
											
												
													
														|  | 
 |  | +                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.restore = function ctxRestore() {
 |  | 
 | 
											
												
													
														|  | -      var prev = this._transformStack.pop();
 |  | 
 | 
											
												
													
														|  | -      if (prev) {
 |  | 
 | 
											
												
													
														|  | -        this._transformMatrix = prev;
 |  | 
 | 
											
												
													
														|  | -        this._originalRestore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.appendChild(imgEl);
 | 
											
												
													
														|  | 
 |  | +      if (current.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        this.cgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    ctx.translate = function ctxTranslate(x, y) {
 |  | 
 | 
											
												
													
														|  | -      var m = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      m[4] = m[0] * x + m[2] * y + m[4];
 |  | 
 | 
											
												
													
														|  | -      m[5] = m[1] * x + m[3] * y + m[5];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this._originalTranslate(x, y);
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
 | 
											
												
													
														|  | 
 |  | +      var imgData = this.objs.get(objId);
 | 
											
												
													
														|  | 
 |  | +      if (!imgData) {
 | 
											
												
													
														|  | 
 |  | +        warn('Dependent image isn\'t ready yet');
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.paintInlineImageXObject(imgData);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.scale = function ctxScale(x, y) {
 |  | 
 | 
											
												
													
														|  | -      var m = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      m[0] = m[0] * x;
 |  | 
 | 
											
												
													
														|  | -      m[1] = m[1] * x;
 |  | 
 | 
											
												
													
														|  | -      m[2] = m[2] * y;
 |  | 
 | 
											
												
													
														|  | -      m[3] = m[3] * y;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintInlineImageXObject:
 | 
											
												
													
														|  | 
 |  | +        function SVGGraphics_paintInlineImageXObject(imgData, mask) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var height = imgData.height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this._originalScale(x, y);
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var imgSrc = convertImgDataToPng(imgData);
 | 
											
												
													
														|  | 
 |  | +      var cliprect = document.createElementNS(NS, 'svg:rect');
 | 
											
												
													
														|  | 
 |  | +      cliprect.setAttributeNS(null, 'x', '0');
 | 
											
												
													
														|  | 
 |  | +      cliprect.setAttributeNS(null, 'y', '0');
 | 
											
												
													
														|  | 
 |  | +      cliprect.setAttributeNS(null, 'width', pf(width));
 | 
											
												
													
														|  | 
 |  | +      cliprect.setAttributeNS(null, 'height', pf(height));
 | 
											
												
													
														|  | 
 |  | +      current.element = cliprect;
 | 
											
												
													
														|  | 
 |  | +      this.clip('nonzero');
 | 
											
												
													
														|  | 
 |  | +      var imgEl = document.createElementNS(NS, 'svg:image');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'x', '0');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'y', pf(-height));
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
 | 
											
												
													
														|  | 
 |  | +      imgEl.setAttributeNS(null, 'transform',
 | 
											
												
													
														|  | 
 |  | +                           'scale(' + pf(1 / width) + ' ' +
 | 
											
												
													
														|  | 
 |  | +                           pf(-1 / height) + ')');
 | 
											
												
													
														|  | 
 |  | +      if (mask) {
 | 
											
												
													
														|  | 
 |  | +        mask.appendChild(imgEl);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.tgrp.appendChild(imgEl);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (current.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        this.cgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.cgrp);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.pgrp.appendChild(this.tgrp);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      var m = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      this._transformMatrix = [
 |  | 
 | 
											
												
													
														|  | -        m[0] * a + m[2] * b,
 |  | 
 | 
											
												
													
														|  | -        m[1] * a + m[3] * b,
 |  | 
 | 
											
												
													
														|  | -        m[0] * c + m[2] * d,
 |  | 
 | 
											
												
													
														|  | -        m[1] * c + m[3] * d,
 |  | 
 | 
											
												
													
														|  | -        m[0] * e + m[2] * f + m[4],
 |  | 
 | 
											
												
													
														|  | -        m[1] * e + m[3] * f + m[5]
 |  | 
 | 
											
												
													
														|  | -      ];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageMaskXObject:
 | 
											
												
													
														|  | 
 |  | +        function SVGGraphics_paintImageMaskXObject(imgData) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +      var fillColor = current.fillColor;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx._originalTransform(a, b, c, d, e, f);
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.maskId = 'mask' + maskCount++;
 | 
											
												
													
														|  | 
 |  | +      var mask = document.createElementNS(NS, 'svg:mask');
 | 
											
												
													
														|  | 
 |  | +      mask.setAttributeNS(null, 'id', current.maskId);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      this._transformMatrix = [a, b, c, d, e, f];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var rect = document.createElementNS(NS, 'svg:rect');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'x', '0');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'y', '0');
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'width', pf(width));
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'height', pf(height));
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'fill', fillColor);
 | 
											
												
													
														|  | 
 |  | +      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');
 | 
											
												
													
														|  | 
 |  | +      this.defs.appendChild(mask);
 | 
											
												
													
														|  | 
 |  | +      this.tgrp.appendChild(rect);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx._originalSetTransform(a, b, c, d, e, f);
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.paintInlineImageXObject(imgData, mask);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.rotate = function ctxRotate(angle) {
 |  | 
 | 
											
												
													
														|  | -      var cosValue = Math.cos(angle);
 |  | 
 | 
											
												
													
														|  | -      var sinValue = Math.sin(angle);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintFormXObjectBegin:
 | 
											
												
													
														|  | 
 |  | +        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var m = this._transformMatrix;
 |  | 
 | 
											
												
													
														|  | -      this._transformMatrix = [
 |  | 
 | 
											
												
													
														|  | -        m[0] * cosValue + m[2] * sinValue,
 |  | 
 | 
											
												
													
														|  | -        m[1] * cosValue + m[3] * sinValue,
 |  | 
 | 
											
												
													
														|  | -        m[0] * (-sinValue) + m[2] * cosValue,
 |  | 
 | 
											
												
													
														|  | -        m[1] * (-sinValue) + m[3] * cosValue,
 |  | 
 | 
											
												
													
														|  | -        m[4],
 |  | 
 | 
											
												
													
														|  | -        m[5]
 |  | 
 | 
											
												
													
														|  | -      ];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isArray(matrix) && matrix.length === 6) {
 | 
											
												
													
														|  | 
 |  | +        this.transform(matrix[0], matrix[1], matrix[2],
 | 
											
												
													
														|  | 
 |  | +                       matrix[3], matrix[4], matrix[5]);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this._originalRotate(angle);
 |  | 
 | 
											
												
													
														|  | -    };
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isArray(bbox) && bbox.length === 4) {
 | 
											
												
													
														|  | 
 |  | +        var width = bbox[2] - bbox[0];
 | 
											
												
													
														|  | 
 |  | +        var height = bbox[3] - bbox[1];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var CachedCanvases = (function CachedCanvasesClosure() {
 |  | 
 | 
											
												
													
														|  | -  function CachedCanvases() {
 |  | 
 | 
											
												
													
														|  | -    this.cache = Object.create(null);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  CachedCanvases.prototype = {
 |  | 
 | 
											
												
													
														|  | -    getCanvas: function CachedCanvases_getCanvas(id, width, height,
 |  | 
 | 
											
												
													
														|  | -                                                 trackTransform) {
 |  | 
 | 
											
												
													
														|  | -      var canvasEntry;
 |  | 
 | 
											
												
													
														|  | -      if (this.cache[id] !== undefined) {
 |  | 
 | 
											
												
													
														|  | -        canvasEntry = this.cache[id];
 |  | 
 | 
											
												
													
														|  | -        canvasEntry.canvas.width = width;
 |  | 
 | 
											
												
													
														|  | -        canvasEntry.canvas.height = height;
 |  | 
 | 
											
												
													
														|  | -        // reset canvas transform for emulated mozCurrentTransform, if needed
 |  | 
 | 
											
												
													
														|  | -        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        var canvas = createScratchCanvas(width, height);
 |  | 
 | 
											
												
													
														|  | -        var ctx = canvas.getContext('2d');
 |  | 
 | 
											
												
													
														|  | -        if (trackTransform) {
 |  | 
 | 
											
												
													
														|  | -          addContextCurrentTransform(ctx);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        this.cache[id] = canvasEntry = {canvas: canvas, context: ctx};
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var cliprect = document.createElementNS(NS, 'svg:rect');
 | 
											
												
													
														|  | 
 |  | +        cliprect.setAttributeNS(null, 'x', bbox[0]);
 | 
											
												
													
														|  | 
 |  | +        cliprect.setAttributeNS(null, 'y', bbox[1]);
 | 
											
												
													
														|  | 
 |  | +        cliprect.setAttributeNS(null, 'width', pf(width));
 | 
											
												
													
														|  | 
 |  | +        cliprect.setAttributeNS(null, 'height', pf(height));
 | 
											
												
													
														|  | 
 |  | +        this.current.element = cliprect;
 | 
											
												
													
														|  | 
 |  | +        this.clip('nonzero');
 | 
											
												
													
														|  | 
 |  | +        this.endPath();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return canvasEntry;
 |  | 
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    clear: function () {
 |  | 
 | 
											
												
													
														|  | -      for (var id in this.cache) {
 |  | 
 | 
											
												
													
														|  | -        var canvasEntry = this.cache[id];
 |  | 
 | 
											
												
													
														|  | -        // Zeroing the width and height causes Firefox to release graphics
 |  | 
 | 
											
												
													
														|  | -        // resources immediately, which can greatly reduce memory consumption.
 |  | 
 | 
											
												
													
														|  | -        canvasEntry.canvas.width = 0;
 |  | 
 | 
											
												
													
														|  | -        canvasEntry.canvas.height = 0;
 |  | 
 | 
											
												
													
														|  | -        delete this.cache[id];
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    paintFormXObjectEnd:
 | 
											
												
													
														|  | 
 |  | +        function SVGGraphics_paintFormXObjectEnd() {
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  | -  return CachedCanvases;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return SVGGraphics;
 | 
											
												
													
														|  |  })();
 |  |  })();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -function compileType3Glyph(imgData) {
 |  | 
 | 
											
												
													
														|  | -  var POINT_TO_PROCESS_LIMIT = 1000;
 |  | 
 | 
											
												
													
														|  | 
 |  | +PDFJS.SVGGraphics = SVGGraphics;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var width = imgData.width, height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -  var i, j, j0, width1 = width + 1;
 |  | 
 | 
											
												
													
														|  | -  var points = new Uint8Array(width1 * (height + 1));
 |  | 
 | 
											
												
													
														|  | -  var POINT_TYPES =
 |  | 
 | 
											
												
													
														|  | -      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +exports.SVGGraphics = SVGGraphics;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // decodes bit-packed mask data
 |  | 
 | 
											
												
													
														|  | -  var lineSize = (width + 7) & ~7, data0 = imgData.data;
 |  | 
 | 
											
												
													
														|  | -  var data = new Uint8Array(lineSize * height), pos = 0, ii;
 |  | 
 | 
											
												
													
														|  | -  for (i = 0, ii = data0.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -    var mask = 128, elem = data0[i];
 |  | 
 | 
											
												
													
														|  | -    while (mask > 0) {
 |  | 
 | 
											
												
													
														|  | -      data[pos++] = (elem & mask) ? 0 : 255;
 |  | 
 | 
											
												
													
														|  | -      mask >>= 1;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil,
 | 
											
												
													
														|  | 
 |  | +      root.pdfjsDisplayDOMUtils, root.pdfjsSharedGlobal);
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedUtil, displayDOMUtils, sharedGlobal) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // finding iteresting points: every point is located between mask pixels,
 |  | 
 | 
											
												
													
														|  | -  // so there will be points of the (width + 1)x(height + 1) grid. Every point
 |  | 
 | 
											
												
													
														|  | -  // will have flags assigned based on neighboring mask pixels:
 |  | 
 | 
											
												
													
														|  | -  //   4 | 8
 |  | 
 | 
											
												
													
														|  | -  //   --P--
 |  | 
 | 
											
												
													
														|  | -  //   2 | 1
 |  | 
 | 
											
												
													
														|  | -  // We are interested only in points with the flags:
 |  | 
 | 
											
												
													
														|  | -  //   - outside corners: 1, 2, 4, 8;
 |  | 
 | 
											
												
													
														|  | -  //   - inside corners: 7, 11, 13, 14;
 |  | 
 | 
											
												
													
														|  | -  //   - and, intersections: 5, 10.
 |  | 
 | 
											
												
													
														|  | -  var count = 0;
 |  | 
 | 
											
												
													
														|  | -  pos = 0;
 |  | 
 | 
											
												
													
														|  | -  if (data[pos] !== 0) {
 |  | 
 | 
											
												
													
														|  | -    points[0] = 1;
 |  | 
 | 
											
												
													
														|  | -    ++count;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  for (j = 1; j < width; j++) {
 |  | 
 | 
											
												
													
														|  | -    if (data[pos] !== data[pos + 1]) {
 |  | 
 | 
											
												
													
														|  | -      points[j] = data[pos] ? 2 : 1;
 |  | 
 | 
											
												
													
														|  | -      ++count;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    pos++;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  if (data[pos] !== 0) {
 |  | 
 | 
											
												
													
														|  | -    points[j] = 2;
 |  | 
 | 
											
												
													
														|  | -    ++count;
 |  | 
 | 
											
												
													
														|  | 
 |  | +var Util = sharedUtil.Util;
 | 
											
												
													
														|  | 
 |  | +var createPromiseCapability = sharedUtil.createPromiseCapability;
 | 
											
												
													
														|  | 
 |  | +var CustomStyle = displayDOMUtils.CustomStyle;
 | 
											
												
													
														|  | 
 |  | +var PDFJS = sharedGlobal.PDFJS;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Text layer render parameters.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} TextLayerRenderParameters
 | 
											
												
													
														|  | 
 |  | + * @property {TextContent} textContent - Text content to render (the object is
 | 
											
												
													
														|  | 
 |  | + *   returned by the page's getTextContent() method).
 | 
											
												
													
														|  | 
 |  | + * @property {HTMLElement} container - HTML element that will contain text runs.
 | 
											
												
													
														|  | 
 |  | + * @property {PDFJS.PageViewport} viewport - The target viewport to properly
 | 
											
												
													
														|  | 
 |  | + *   layout the text runs.
 | 
											
												
													
														|  | 
 |  | + * @property {Array} textDivs - (optional) HTML elements that are correspond
 | 
											
												
													
														|  | 
 |  | + *   the text items of the textContent input. This is output and shall be
 | 
											
												
													
														|  | 
 |  | + *   initially be set to empty array.
 | 
											
												
													
														|  | 
 |  | + * @property {number} timeout - (optional) Delay in milliseconds before
 | 
											
												
													
														|  | 
 |  | + *   rendering of the text  runs occurs.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var renderTextLayer = (function renderTextLayerClosure() {
 | 
											
												
													
														|  | 
 |  | +  var MAX_TEXT_DIVS_TO_RENDER = 100000;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  var NonWhitespaceRegexp = /\S/;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  function isAllWhitespace(str) {
 | 
											
												
													
														|  | 
 |  | +    return !NonWhitespaceRegexp.test(str);
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | -  for (i = 1; i < height; i++) {
 |  | 
 | 
											
												
													
														|  | -    pos = i * lineSize;
 |  | 
 | 
											
												
													
														|  | -    j0 = i * width1;
 |  | 
 | 
											
												
													
														|  | -    if (data[pos - lineSize] !== data[pos]) {
 |  | 
 | 
											
												
													
														|  | -      points[j0] = data[pos] ? 1 : 8;
 |  | 
 | 
											
												
													
														|  | -      ++count;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  function appendText(textDivs, viewport, geom, styles) {
 | 
											
												
													
														|  | 
 |  | +    var style = styles[geom.fontName];
 | 
											
												
													
														|  | 
 |  | +    var textDiv = document.createElement('div');
 | 
											
												
													
														|  | 
 |  | +    textDivs.push(textDiv);
 | 
											
												
													
														|  | 
 |  | +    if (isAllWhitespace(geom.str)) {
 | 
											
												
													
														|  | 
 |  | +      textDiv.dataset.isWhitespace = true;
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    // 'sum' is the position of the current pixel configuration in the 'TYPES'
 |  | 
 | 
											
												
													
														|  | -    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
 |  | 
 | 
											
												
													
														|  | -    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
 |  | 
 | 
											
												
													
														|  | -    for (j = 1; j < width; j++) {
 |  | 
 | 
											
												
													
														|  | -      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +
 |  | 
 | 
											
												
													
														|  | -            (data[pos - lineSize + 1] ? 8 : 0);
 |  | 
 | 
											
												
													
														|  | -      if (POINT_TYPES[sum]) {
 |  | 
 | 
											
												
													
														|  | -        points[j0 + j] = POINT_TYPES[sum];
 |  | 
 | 
											
												
													
														|  | -        ++count;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      pos++;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var tx = Util.transform(viewport.transform, geom.transform);
 | 
											
												
													
														|  | 
 |  | +    var angle = Math.atan2(tx[1], tx[0]);
 | 
											
												
													
														|  | 
 |  | +    if (style.vertical) {
 | 
											
												
													
														|  | 
 |  | +      angle += Math.PI / 2;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    if (data[pos - lineSize] !== data[pos]) {
 |  | 
 | 
											
												
													
														|  | -      points[j0 + j] = data[pos] ? 2 : 4;
 |  | 
 | 
											
												
													
														|  | -      ++count;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
 | 
											
												
													
														|  | 
 |  | +    var fontAscent = fontHeight;
 | 
											
												
													
														|  | 
 |  | +    if (style.ascent) {
 | 
											
												
													
														|  | 
 |  | +      fontAscent = style.ascent * fontAscent;
 | 
											
												
													
														|  | 
 |  | +    } else if (style.descent) {
 | 
											
												
													
														|  | 
 |  | +      fontAscent = (1 + style.descent) * fontAscent;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    if (count > POINT_TO_PROCESS_LIMIT) {
 |  | 
 | 
											
												
													
														|  | -      return null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var left;
 | 
											
												
													
														|  | 
 |  | +    var top;
 | 
											
												
													
														|  | 
 |  | +    if (angle === 0) {
 | 
											
												
													
														|  | 
 |  | +      left = tx[4];
 | 
											
												
													
														|  | 
 |  | +      top = tx[5] - fontAscent;
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      left = tx[4] + (fontAscent * Math.sin(angle));
 | 
											
												
													
														|  | 
 |  | +      top = tx[5] - (fontAscent * Math.cos(angle));
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    textDiv.style.left = left + 'px';
 | 
											
												
													
														|  | 
 |  | +    textDiv.style.top = top + 'px';
 | 
											
												
													
														|  | 
 |  | +    textDiv.style.fontSize = fontHeight + 'px';
 | 
											
												
													
														|  | 
 |  | +    textDiv.style.fontFamily = style.fontFamily;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  pos = lineSize * (height - 1);
 |  | 
 | 
											
												
													
														|  | -  j0 = i * width1;
 |  | 
 | 
											
												
													
														|  | -  if (data[pos] !== 0) {
 |  | 
 | 
											
												
													
														|  | -    points[j0] = 8;
 |  | 
 | 
											
												
													
														|  | -    ++count;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  for (j = 1; j < width; j++) {
 |  | 
 | 
											
												
													
														|  | -    if (data[pos] !== data[pos + 1]) {
 |  | 
 | 
											
												
													
														|  | -      points[j0 + j] = data[pos] ? 4 : 8;
 |  | 
 | 
											
												
													
														|  | -      ++count;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    textDiv.textContent = geom.str;
 | 
											
												
													
														|  | 
 |  | +    // |fontName| is only used by the Font Inspector. This test will succeed
 | 
											
												
													
														|  | 
 |  | +    // when e.g. the Font Inspector is off but the Stepper is on, but it's
 | 
											
												
													
														|  | 
 |  | +    // not worth the effort to do a more accurate test.
 | 
											
												
													
														|  | 
 |  | +    if (PDFJS.pdfBug) {
 | 
											
												
													
														|  | 
 |  | +      textDiv.dataset.fontName = geom.fontName;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    // Storing into dataset will convert number into string.
 | 
											
												
													
														|  | 
 |  | +    if (angle !== 0) {
 | 
											
												
													
														|  | 
 |  | +      textDiv.dataset.angle = angle * (180 / Math.PI);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    // We don't bother scaling single-char text divs, because it has very
 | 
											
												
													
														|  | 
 |  | +    // little effect on text highlighting. This makes scrolling on docs with
 | 
											
												
													
														|  | 
 |  | +    // lots of such divs a lot faster.
 | 
											
												
													
														|  | 
 |  | +    if (geom.str.length > 1) {
 | 
											
												
													
														|  | 
 |  | +      if (style.vertical) {
 | 
											
												
													
														|  | 
 |  | +        textDiv.dataset.canvasWidth = geom.height * viewport.scale;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        textDiv.dataset.canvasWidth = geom.width * viewport.scale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    pos++;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  if (data[pos] !== 0) {
 |  | 
 | 
											
												
													
														|  | -    points[j0 + j] = 4;
 |  | 
 | 
											
												
													
														|  | -    ++count;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  if (count > POINT_TO_PROCESS_LIMIT) {
 |  | 
 | 
											
												
													
														|  | -    return null;
 |  | 
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // building outlines
 |  | 
 | 
											
												
													
														|  | -  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
 |  | 
 | 
											
												
													
														|  | -  var outlines = [];
 |  | 
 | 
											
												
													
														|  | -  for (i = 0; count && i <= height; i++) {
 |  | 
 | 
											
												
													
														|  | -    var p = i * width1;
 |  | 
 | 
											
												
													
														|  | -    var end = p + width;
 |  | 
 | 
											
												
													
														|  | -    while (p < end && !points[p]) {
 |  | 
 | 
											
												
													
														|  | -      p++;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function render(task) {
 | 
											
												
													
														|  | 
 |  | +    if (task._canceled) {
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    if (p === end) {
 |  | 
 | 
											
												
													
														|  | -      continue;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var textLayerFrag = task._container;
 | 
											
												
													
														|  | 
 |  | +    var textDivs = task._textDivs;
 | 
											
												
													
														|  | 
 |  | +    var capability = task._capability;
 | 
											
												
													
														|  | 
 |  | +    var textDivsLength = textDivs.length;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // No point in rendering many divs as it would make the browser
 | 
											
												
													
														|  | 
 |  | +    // unusable even after the divs are rendered.
 | 
											
												
													
														|  | 
 |  | +    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
 | 
											
												
													
														|  | 
 |  | +      capability.resolve();
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    var coords = [p % width1, i];
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var type = points[p], p0 = p, pp;
 |  | 
 | 
											
												
													
														|  | -    do {
 |  | 
 | 
											
												
													
														|  | -      var step = steps[type];
 |  | 
 | 
											
												
													
														|  | -      do {
 |  | 
 | 
											
												
													
														|  | -        p += step;
 |  | 
 | 
											
												
													
														|  | -      } while (!points[p]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var canvas = document.createElement('canvas');
 | 
											
												
													
														|  | 
 |  | +    canvas.mozOpaque = true;
 | 
											
												
													
														|  | 
 |  | +    var ctx = canvas.getContext('2d', {alpha: false});
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      pp = points[p];
 |  | 
 | 
											
												
													
														|  | -      if (pp !== 5 && pp !== 10) {
 |  | 
 | 
											
												
													
														|  | -        // set new direction
 |  | 
 | 
											
												
													
														|  | -        type = pp;
 |  | 
 | 
											
												
													
														|  | -        // delete mark
 |  | 
 | 
											
												
													
														|  | -        points[p] = 0;
 |  | 
 | 
											
												
													
														|  | -      } else { // type is 5 or 10, ie, a crossing
 |  | 
 | 
											
												
													
														|  | -        // set new direction
 |  | 
 | 
											
												
													
														|  | -        type = pp & ((0x33 * type) >> 4);
 |  | 
 | 
											
												
													
														|  | -        // set new type for "future hit"
 |  | 
 | 
											
												
													
														|  | -        points[p] &= (type >> 2 | type << 2);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var lastFontSize;
 | 
											
												
													
														|  | 
 |  | +    var lastFontFamily;
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0; i < textDivsLength; i++) {
 | 
											
												
													
														|  | 
 |  | +      var textDiv = textDivs[i];
 | 
											
												
													
														|  | 
 |  | +      if (textDiv.dataset.isWhitespace !== undefined) {
 | 
											
												
													
														|  | 
 |  | +        continue;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      coords.push(p % width1);
 |  | 
 | 
											
												
													
														|  | -      coords.push((p / width1) | 0);
 |  | 
 | 
											
												
													
														|  | -      --count;
 |  | 
 | 
											
												
													
														|  | -    } while (p0 !== p);
 |  | 
 | 
											
												
													
														|  | -    outlines.push(coords);
 |  | 
 | 
											
												
													
														|  | -    --i;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var fontSize = textDiv.style.fontSize;
 | 
											
												
													
														|  | 
 |  | +      var fontFamily = textDiv.style.fontFamily;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var drawOutline = function(c) {
 |  | 
 | 
											
												
													
														|  | -    c.save();
 |  | 
 | 
											
												
													
														|  | -    // the path shall be painted in [0..1]x[0..1] space
 |  | 
 | 
											
												
													
														|  | -    c.scale(1 / width, -1 / height);
 |  | 
 | 
											
												
													
														|  | -    c.translate(0, -height);
 |  | 
 | 
											
												
													
														|  | -    c.beginPath();
 |  | 
 | 
											
												
													
														|  | -    for (var i = 0, ii = outlines.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -      var o = outlines[i];
 |  | 
 | 
											
												
													
														|  | -      c.moveTo(o[0], o[1]);
 |  | 
 | 
											
												
													
														|  | -      for (var j = 2, jj = o.length; j < jj; j += 2) {
 |  | 
 | 
											
												
													
														|  | -        c.lineTo(o[j], o[j+1]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Only build font string and set to context if different from last.
 | 
											
												
													
														|  | 
 |  | +      if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {
 | 
											
												
													
														|  | 
 |  | +        ctx.font = fontSize + ' ' + fontFamily;
 | 
											
												
													
														|  | 
 |  | +        lastFontSize = fontSize;
 | 
											
												
													
														|  | 
 |  | +        lastFontFamily = fontFamily;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    c.fill();
 |  | 
 | 
											
												
													
														|  | -    c.beginPath();
 |  | 
 | 
											
												
													
														|  | -    c.restore();
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return drawOutline;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var width = ctx.measureText(textDiv.textContent).width;
 | 
											
												
													
														|  | 
 |  | +      if (width > 0) {
 | 
											
												
													
														|  | 
 |  | +        textLayerFrag.appendChild(textDiv);
 | 
											
												
													
														|  | 
 |  | +        var transform;
 | 
											
												
													
														|  | 
 |  | +        if (textDiv.dataset.canvasWidth !== undefined) {
 | 
											
												
													
														|  | 
 |  | +          // Dataset values come of type string.
 | 
											
												
													
														|  | 
 |  | +          var textScale = textDiv.dataset.canvasWidth / width;
 | 
											
												
													
														|  | 
 |  | +          transform = 'scaleX(' + textScale + ')';
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          transform = '';
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        var rotation = textDiv.dataset.angle;
 | 
											
												
													
														|  | 
 |  | +        if (rotation) {
 | 
											
												
													
														|  | 
 |  | +          transform = 'rotate(' + rotation + 'deg) ' + transform;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if (transform) {
 | 
											
												
													
														|  | 
 |  | +          CustomStyle.setProp('transform' , textDiv, transform);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    capability.resolve();
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var CanvasExtraState = (function CanvasExtraStateClosure() {
 |  | 
 | 
											
												
													
														|  | -  function CanvasExtraState(old) {
 |  | 
 | 
											
												
													
														|  | -    // Are soft masks and alpha values shapes or opacities?
 |  | 
 | 
											
												
													
														|  | -    this.alphaIsShape = false;
 |  | 
 | 
											
												
													
														|  | -    this.fontSize = 0;
 |  | 
 | 
											
												
													
														|  | -    this.fontSizeScale = 1;
 |  | 
 | 
											
												
													
														|  | -    this.textMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -    this.textMatrixScale = 1;
 |  | 
 | 
											
												
													
														|  | -    this.fontMatrix = FONT_IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -    this.leading = 0;
 |  | 
 | 
											
												
													
														|  | -    // Current point (in user coordinates)
 |  | 
 | 
											
												
													
														|  | -    this.x = 0;
 |  | 
 | 
											
												
													
														|  | -    this.y = 0;
 |  | 
 | 
											
												
													
														|  | -    // Start of text line (in text coordinates)
 |  | 
 | 
											
												
													
														|  | -    this.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -    this.lineY = 0;
 |  | 
 | 
											
												
													
														|  | -    // Character and word spacing
 |  | 
 | 
											
												
													
														|  | -    this.charSpacing = 0;
 |  | 
 | 
											
												
													
														|  | -    this.wordSpacing = 0;
 |  | 
 | 
											
												
													
														|  | -    this.textHScale = 1;
 |  | 
 | 
											
												
													
														|  | -    this.textRenderingMode = TextRenderingMode.FILL;
 |  | 
 | 
											
												
													
														|  | -    this.textRise = 0;
 |  | 
 | 
											
												
													
														|  | -    // Default fore and background colors
 |  | 
 | 
											
												
													
														|  | -    this.fillColor = '#000000';
 |  | 
 | 
											
												
													
														|  | -    this.strokeColor = '#000000';
 |  | 
 | 
											
												
													
														|  | -    this.patternFill = false;
 |  | 
 | 
											
												
													
														|  | -    // Note: fill alpha applies to all non-stroking operations
 |  | 
 | 
											
												
													
														|  | -    this.fillAlpha = 1;
 |  | 
 | 
											
												
													
														|  | -    this.strokeAlpha = 1;
 |  | 
 | 
											
												
													
														|  | -    this.lineWidth = 1;
 |  | 
 | 
											
												
													
														|  | -    this.activeSMask = null; // nonclonable field (see the save method below)
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    this.old = old;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  /**
 | 
											
												
													
														|  | 
 |  | +   * Text layer rendering task.
 | 
											
												
													
														|  | 
 |  | +   *
 | 
											
												
													
														|  | 
 |  | +   * @param {TextContent} textContent
 | 
											
												
													
														|  | 
 |  | +   * @param {HTMLElement} container
 | 
											
												
													
														|  | 
 |  | +   * @param {PDFJS.PageViewport} viewport
 | 
											
												
													
														|  | 
 |  | +   * @param {Array} textDivs
 | 
											
												
													
														|  | 
 |  | +   * @private
 | 
											
												
													
														|  | 
 |  | +   */
 | 
											
												
													
														|  | 
 |  | +  function TextLayerRenderTask(textContent, container, viewport, textDivs) {
 | 
											
												
													
														|  | 
 |  | +    this._textContent = textContent;
 | 
											
												
													
														|  | 
 |  | +    this._container = container;
 | 
											
												
													
														|  | 
 |  | +    this._viewport = viewport;
 | 
											
												
													
														|  | 
 |  | +    textDivs = textDivs || [];
 | 
											
												
													
														|  | 
 |  | +    this._textDivs = textDivs;
 | 
											
												
													
														|  | 
 |  | +    this._canceled = false;
 | 
											
												
													
														|  | 
 |  | +    this._capability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +    this._renderTimer = null;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | 
 |  | +  TextLayerRenderTask.prototype = {
 | 
											
												
													
														|  | 
 |  | +    get promise() {
 | 
											
												
													
														|  | 
 |  | +      return this._capability.promise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  CanvasExtraState.prototype = {
 |  | 
 | 
											
												
													
														|  | -    clone: function CanvasExtraState_clone() {
 |  | 
 | 
											
												
													
														|  | -      return Object.create(this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    cancel: function TextLayer_cancel() {
 | 
											
												
													
														|  | 
 |  | +      this._canceled = true;
 | 
											
												
													
														|  | 
 |  | +      if (this._renderTimer !== null) {
 | 
											
												
													
														|  | 
 |  | +        clearTimeout(this._renderTimer);
 | 
											
												
													
														|  | 
 |  | +        this._renderTimer = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this._capability.reject('canceled');
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
 |  | 
 | 
											
												
													
														|  | -      this.x = x;
 |  | 
 | 
											
												
													
														|  | -      this.y = y;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    _render: function TextLayer_render(timeout) {
 | 
											
												
													
														|  | 
 |  | +      var textItems = this._textContent.items;
 | 
											
												
													
														|  | 
 |  | +      var styles = this._textContent.styles;
 | 
											
												
													
														|  | 
 |  | +      var textDivs = this._textDivs;
 | 
											
												
													
														|  | 
 |  | +      var viewport = this._viewport;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, len = textItems.length; i < len; i++) {
 | 
											
												
													
														|  | 
 |  | +        appendText(textDivs, viewport, textItems[i], styles);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (!timeout) { // Render right away
 | 
											
												
													
														|  | 
 |  | +        render(this);
 | 
											
												
													
														|  | 
 |  | +      } else { // Schedule
 | 
											
												
													
														|  | 
 |  | +        var self = this;
 | 
											
												
													
														|  | 
 |  | +        this._renderTimer = setTimeout(function() {
 | 
											
												
													
														|  | 
 |  | +          render(self);
 | 
											
												
													
														|  | 
 |  | +          self._renderTimer = null;
 | 
											
												
													
														|  | 
 |  | +        }, timeout);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  | -  return CanvasExtraState;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var CanvasGraphics = (function CanvasGraphicsClosure() {
 |  | 
 | 
											
												
													
														|  | -  // Defines the time the executeOperatorList is going to be executing
 |  | 
 | 
											
												
													
														|  | -  // before it stops and shedules a continue of execution.
 |  | 
 | 
											
												
													
														|  | -  var EXECUTION_TIME = 15;
 |  | 
 | 
											
												
													
														|  | -  // Defines the number of steps before checking the execution time
 |  | 
 | 
											
												
													
														|  | -  var EXECUTION_STEPS = 10;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
 |  | 
 | 
											
												
													
														|  | -    this.ctx = canvasCtx;
 |  | 
 | 
											
												
													
														|  | -    this.current = new CanvasExtraState();
 |  | 
 | 
											
												
													
														|  | -    this.stateStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.pendingClip = null;
 |  | 
 | 
											
												
													
														|  | -    this.pendingEOFill = false;
 |  | 
 | 
											
												
													
														|  | -    this.res = null;
 |  | 
 | 
											
												
													
														|  | -    this.xobjs = null;
 |  | 
 | 
											
												
													
														|  | -    this.commonObjs = commonObjs;
 |  | 
 | 
											
												
													
														|  | -    this.objs = objs;
 |  | 
 | 
											
												
													
														|  | -    this.imageLayer = imageLayer;
 |  | 
 | 
											
												
													
														|  | -    this.groupStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.processingType3 = null;
 |  | 
 | 
											
												
													
														|  | -    // Patterns are painted relative to the initial page/form transform, see pdf
 |  | 
 | 
											
												
													
														|  | -    // spec 8.7.2 NOTE 1.
 |  | 
 | 
											
												
													
														|  | -    this.baseTransform = null;
 |  | 
 | 
											
												
													
														|  | -    this.baseTransformStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.groupLevel = 0;
 |  | 
 | 
											
												
													
														|  | -    this.smaskStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.smaskCounter = 0;
 |  | 
 | 
											
												
													
														|  | -    this.tempSMask = null;
 |  | 
 | 
											
												
													
														|  | -    this.cachedCanvases = new CachedCanvases();
 |  | 
 | 
											
												
													
														|  | -    if (canvasCtx) {
 |  | 
 | 
											
												
													
														|  | -      // NOTE: if mozCurrentTransform is polyfilled, then the current state of
 |  | 
 | 
											
												
													
														|  | -      // the transformation must already be set in canvasCtx._transformMatrix.
 |  | 
 | 
											
												
													
														|  | -      addContextCurrentTransform(canvasCtx);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    this.cachedGetSinglePixelWidth = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  /**
 | 
											
												
													
														|  | 
 |  | +   * Starts rendering of the text layer.
 | 
											
												
													
														|  | 
 |  | +   *
 | 
											
												
													
														|  | 
 |  | +   * @param {TextLayerRenderParameters} renderParameters
 | 
											
												
													
														|  | 
 |  | +   * @returns {TextLayerRenderTask}
 | 
											
												
													
														|  | 
 |  | +   */
 | 
											
												
													
														|  | 
 |  | +  function renderTextLayer(renderParameters) {
 | 
											
												
													
														|  | 
 |  | +    var task = new TextLayerRenderTask(renderParameters.textContent,
 | 
											
												
													
														|  | 
 |  | +                                       renderParameters.container,
 | 
											
												
													
														|  | 
 |  | +                                       renderParameters.viewport,
 | 
											
												
													
														|  | 
 |  | +                                       renderParameters.textDivs);
 | 
											
												
													
														|  | 
 |  | +    task._render(renderParameters.timeout);
 | 
											
												
													
														|  | 
 |  | +    return task;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function putBinaryImageData(ctx, imgData) {
 |  | 
 | 
											
												
													
														|  | -    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
 |  | 
 | 
											
												
													
														|  | -      ctx.putImageData(imgData, 0, 0);
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return renderTextLayer;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Put the image data to the canvas in chunks, rather than putting the
 |  | 
 | 
											
												
													
														|  | -    // whole image at once.  This saves JS memory, because the ImageData object
 |  | 
 | 
											
												
													
														|  | -    // is smaller. It also possibly saves C++ memory within the implementation
 |  | 
 | 
											
												
													
														|  | -    // of putImageData(). (E.g. in Firefox we make two short-lived copies of
 |  | 
 | 
											
												
													
														|  | -    // the data passed to putImageData()). |n| shouldn't be too small, however,
 |  | 
 | 
											
												
													
														|  | -    // because too many putImageData() calls will slow things down.
 |  | 
 | 
											
												
													
														|  | -    //
 |  | 
 | 
											
												
													
														|  | -    // Note: as written, if the last chunk is partial, the putImageData() call
 |  | 
 | 
											
												
													
														|  | -    // will (conceptually) put pixels past the bounds of the canvas.  But
 |  | 
 | 
											
												
													
														|  | -    // that's ok; any such pixels are ignored.
 |  | 
 | 
											
												
													
														|  | 
 |  | +PDFJS.renderTextLayer = renderTextLayer;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var height = imgData.height, width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +exports.renderTextLayer = renderTextLayer;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 |  | 
 | 
											
												
													
														|  | -    var srcPos = 0, destPos;
 |  | 
 | 
											
												
													
														|  | -    var src = imgData.data;
 |  | 
 | 
											
												
													
														|  | -    var dest = chunkImgData.data;
 |  | 
 | 
											
												
													
														|  | -    var i, j, thisChunkHeight, elemsInThisChunk;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // There are multiple forms in which the pixel data can be passed, and
 |  | 
 | 
											
												
													
														|  | -    // imgData.kind tells us which one this is.
 |  | 
 | 
											
												
													
														|  | -    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {
 |  | 
 | 
											
												
													
														|  | -      // Grayscale, 1 bit per pixel (i.e. black-and-white).
 |  | 
 | 
											
												
													
														|  | -      var srcLength = src.byteLength;
 |  | 
 | 
											
												
													
														|  | -      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :
 |  | 
 | 
											
												
													
														|  | -        new Uint32ArrayView(dest);
 |  | 
 | 
											
												
													
														|  | -      var dest32DataLength = dest32.length;
 |  | 
 | 
											
												
													
														|  | -      var fullSrcDiff = (width + 7) >> 3;
 |  | 
 | 
											
												
													
														|  | -      var white = 0xFFFFFFFF;
 |  | 
 | 
											
												
													
														|  | -      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?
 |  | 
 | 
											
												
													
														|  | -        0xFF000000 : 0x000000FF;
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < totalChunks; i++) {
 |  | 
 | 
											
												
													
														|  | -        thisChunkHeight =
 |  | 
 | 
											
												
													
														|  | -          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
 |  | 
 | 
											
												
													
														|  | -        destPos = 0;
 |  | 
 | 
											
												
													
														|  | -        for (j = 0; j < thisChunkHeight; j++) {
 |  | 
 | 
											
												
													
														|  | -          var srcDiff = srcLength - srcPos;
 |  | 
 | 
											
												
													
														|  | -          var k = 0;
 |  | 
 | 
											
												
													
														|  | -          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;
 |  | 
 | 
											
												
													
														|  | -          var kEndUnrolled = kEnd & ~7;
 |  | 
 | 
											
												
													
														|  | -          var mask = 0;
 |  | 
 | 
											
												
													
														|  | -          var srcByte = 0;
 |  | 
 | 
											
												
													
														|  | -          for (; k < kEndUnrolled; k += 8) {
 |  | 
 | 
											
												
													
														|  | -            srcByte = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 128) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 64) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 32) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 16) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 8) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 4) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 2) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & 1) ? white : black;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          for (; k < kEnd; k++) {
 |  | 
 | 
											
												
													
														|  | -             if (mask === 0) {
 |  | 
 | 
											
												
													
														|  | -               srcByte = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -               mask = 128;
 |  | 
 | 
											
												
													
														|  | -             }
 |  | 
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedUtil) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            dest32[destPos++] = (srcByte & mask) ? white : black;
 |  | 
 | 
											
												
													
														|  | -            mask >>= 1;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        // We ran out of input. Make all remaining pixels transparent.
 |  | 
 | 
											
												
													
														|  | -        while (destPos < dest32DataLength) {
 |  | 
 | 
											
												
													
														|  | -          dest32[destPos++] = 0;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var shadow = sharedUtil.shadow;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    } else if (imgData.kind === ImageKind.RGBA_32BPP) {
 |  | 
 | 
											
												
													
														|  | -      // RGBA, 32-bits per pixel.
 |  | 
 | 
											
												
													
														|  | 
 |  | +var WebGLUtils = (function WebGLUtilsClosure() {
 | 
											
												
													
														|  | 
 |  | +  function loadShader(gl, code, shaderType) {
 | 
											
												
													
														|  | 
 |  | +    var shader = gl.createShader(shaderType);
 | 
											
												
													
														|  | 
 |  | +    gl.shaderSource(shader, code);
 | 
											
												
													
														|  | 
 |  | +    gl.compileShader(shader);
 | 
											
												
													
														|  | 
 |  | +    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
 | 
											
												
													
														|  | 
 |  | +    if (!compiled) {
 | 
											
												
													
														|  | 
 |  | +      var errorMsg = gl.getShaderInfoLog(shader);
 | 
											
												
													
														|  | 
 |  | +      throw new Error('Error during shader compilation: ' + errorMsg);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return shader;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  function createVertexShader(gl, code) {
 | 
											
												
													
														|  | 
 |  | +    return loadShader(gl, code, gl.VERTEX_SHADER);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  function createFragmentShader(gl, code) {
 | 
											
												
													
														|  | 
 |  | +    return loadShader(gl, code, gl.FRAGMENT_SHADER);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  function createProgram(gl, shaders) {
 | 
											
												
													
														|  | 
 |  | +    var program = gl.createProgram();
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0, ii = shaders.length; i < ii; ++i) {
 | 
											
												
													
														|  | 
 |  | +      gl.attachShader(program, shaders[i]);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    gl.linkProgram(program);
 | 
											
												
													
														|  | 
 |  | +    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
 | 
											
												
													
														|  | 
 |  | +    if (!linked) {
 | 
											
												
													
														|  | 
 |  | +      var errorMsg = gl.getProgramInfoLog(program);
 | 
											
												
													
														|  | 
 |  | +      throw new Error('Error during program linking: ' + errorMsg);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return program;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  function createTexture(gl, image, textureId) {
 | 
											
												
													
														|  | 
 |  | +    gl.activeTexture(textureId);
 | 
											
												
													
														|  | 
 |  | +    var texture = gl.createTexture();
 | 
											
												
													
														|  | 
 |  | +    gl.bindTexture(gl.TEXTURE_2D, texture);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      j = 0;
 |  | 
 | 
											
												
													
														|  | -      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < fullChunks; i++) {
 |  | 
 | 
											
												
													
														|  | -        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
 |  | 
 | 
											
												
													
														|  | -        srcPos += elemsInThisChunk;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Set the parameters so we can render any size image.
 | 
											
												
													
														|  | 
 |  | +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
 | 
											
												
													
														|  | 
 |  | +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
 | 
											
												
													
														|  | 
 |  | +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
 | 
											
												
													
														|  | 
 |  | +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        ctx.putImageData(chunkImgData, 0, j);
 |  | 
 | 
											
												
													
														|  | -        j += FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (i < totalChunks) {
 |  | 
 | 
											
												
													
														|  | -        elemsInThisChunk = width * partialChunkHeight * 4;
 |  | 
 | 
											
												
													
														|  | -        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
 |  | 
 | 
											
												
													
														|  | -        ctx.putImageData(chunkImgData, 0, j);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    } else if (imgData.kind === ImageKind.RGB_24BPP) {
 |  | 
 | 
											
												
													
														|  | -      // RGB, 24-bits per pixel.
 |  | 
 | 
											
												
													
														|  | -      thisChunkHeight = FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -      elemsInThisChunk = width * thisChunkHeight;
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < totalChunks; i++) {
 |  | 
 | 
											
												
													
														|  | -        if (i >= fullChunks) {
 |  | 
 | 
											
												
													
														|  | -          thisChunkHeight = partialChunkHeight;
 |  | 
 | 
											
												
													
														|  | -          elemsInThisChunk = width * thisChunkHeight;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Upload the image into the texture.
 | 
											
												
													
														|  | 
 |  | +    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
 | 
											
												
													
														|  | 
 |  | +    return texture;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        destPos = 0;
 |  | 
 | 
											
												
													
														|  | -        for (j = elemsInThisChunk; j--;) {
 |  | 
 | 
											
												
													
														|  | -          dest[destPos++] = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -          dest[destPos++] = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -          dest[destPos++] = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -          dest[destPos++] = 255;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      error('bad image kind: ' + imgData.kind);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var currentGL, currentCanvas;
 | 
											
												
													
														|  | 
 |  | +  function generateGL() {
 | 
											
												
													
														|  | 
 |  | +    if (currentGL) {
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +    currentCanvas = document.createElement('canvas');
 | 
											
												
													
														|  | 
 |  | +    currentGL = currentCanvas.getContext('webgl',
 | 
											
												
													
														|  | 
 |  | +      { premultipliedalpha: false });
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function putBinaryImageMask(ctx, imgData) {
 |  | 
 | 
											
												
													
														|  | -    var height = imgData.height, width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
 |  | 
 | 
											
												
													
														|  | -    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var smaskVertexShaderCode = '\
 | 
											
												
													
														|  | 
 |  | +  attribute vec2 a_position;                                    \
 | 
											
												
													
														|  | 
 |  | +  attribute vec2 a_texCoord;                                    \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  uniform vec2 u_resolution;                                    \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  varying vec2 v_texCoord;                                      \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  void main() {                                                 \
 | 
											
												
													
														|  | 
 |  | +    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
 | 
											
												
													
														|  | 
 |  | +    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +    v_texCoord = a_texCoord;                                    \
 | 
											
												
													
														|  | 
 |  | +  }                                                             ';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 |  | 
 | 
											
												
													
														|  | -    var srcPos = 0;
 |  | 
 | 
											
												
													
														|  | -    var src = imgData.data;
 |  | 
 | 
											
												
													
														|  | -    var dest = chunkImgData.data;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var smaskFragmentShaderCode = '\
 | 
											
												
													
														|  | 
 |  | +  precision mediump float;                                      \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  uniform vec4 u_backdrop;                                      \
 | 
											
												
													
														|  | 
 |  | +  uniform int u_subtype;                                        \
 | 
											
												
													
														|  | 
 |  | +  uniform sampler2D u_image;                                    \
 | 
											
												
													
														|  | 
 |  | +  uniform sampler2D u_mask;                                     \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  varying vec2 v_texCoord;                                      \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  void main() {                                                 \
 | 
											
												
													
														|  | 
 |  | +    vec4 imageColor = texture2D(u_image, v_texCoord);           \
 | 
											
												
													
														|  | 
 |  | +    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
 | 
											
												
													
														|  | 
 |  | +    if (u_backdrop.a > 0.0) {                                   \
 | 
											
												
													
														|  | 
 |  | +      maskColor.rgb = maskColor.rgb * maskColor.a +             \
 | 
											
												
													
														|  | 
 |  | +                      u_backdrop.rgb * (1.0 - maskColor.a);     \
 | 
											
												
													
														|  | 
 |  | +    }                                                           \
 | 
											
												
													
														|  | 
 |  | +    float lum;                                                  \
 | 
											
												
													
														|  | 
 |  | +    if (u_subtype == 0) {                                       \
 | 
											
												
													
														|  | 
 |  | +      lum = maskColor.a;                                        \
 | 
											
												
													
														|  | 
 |  | +    } else {                                                    \
 | 
											
												
													
														|  | 
 |  | +      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
 | 
											
												
													
														|  | 
 |  | +            maskColor.b * 0.11;                                 \
 | 
											
												
													
														|  | 
 |  | +    }                                                           \
 | 
											
												
													
														|  | 
 |  | +    imageColor.a *= lum;                                        \
 | 
											
												
													
														|  | 
 |  | +    imageColor.rgb *= imageColor.a;                             \
 | 
											
												
													
														|  | 
 |  | +    gl_FragColor = imageColor;                                  \
 | 
											
												
													
														|  | 
 |  | +  }                                                             ';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    for (var i = 0; i < totalChunks; i++) {
 |  | 
 | 
											
												
													
														|  | -      var thisChunkHeight =
 |  | 
 | 
											
												
													
														|  | -        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var smaskCache = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Expand the mask so it can be used by the canvas.  Any required
 |  | 
 | 
											
												
													
														|  | -      // inversion has already been handled.
 |  | 
 | 
											
												
													
														|  | -      var destPos = 3; // alpha component offset
 |  | 
 | 
											
												
													
														|  | -      for (var j = 0; j < thisChunkHeight; j++) {
 |  | 
 | 
											
												
													
														|  | -        var mask = 0;
 |  | 
 | 
											
												
													
														|  | -        for (var k = 0; k < width; k++) {
 |  | 
 | 
											
												
													
														|  | -          if (!mask) {
 |  | 
 | 
											
												
													
														|  | -            var elem = src[srcPos++];
 |  | 
 | 
											
												
													
														|  | -            mask = 128;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          dest[destPos] = (elem & mask) ? 0 : 255;
 |  | 
 | 
											
												
													
														|  | -          destPos += 4;
 |  | 
 | 
											
												
													
														|  | -          mask >>= 1;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function initSmaskGL() {
 | 
											
												
													
														|  | 
 |  | +    var canvas, gl;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function copyCtxState(sourceCtx, destCtx) {
 |  | 
 | 
											
												
													
														|  | -    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
 |  | 
 | 
											
												
													
														|  | -                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
 |  | 
 | 
											
												
													
														|  | -                      'globalCompositeOperation', 'font'];
 |  | 
 | 
											
												
													
														|  | -    for (var i = 0, ii = properties.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -      var property = properties[i];
 |  | 
 | 
											
												
													
														|  | -      if (sourceCtx[property] !== undefined) {
 |  | 
 | 
											
												
													
														|  | -        destCtx[property] = sourceCtx[property];
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (sourceCtx.setLineDash !== undefined) {
 |  | 
 | 
											
												
													
														|  | -      destCtx.setLineDash(sourceCtx.getLineDash());
 |  | 
 | 
											
												
													
														|  | -      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
 |  | 
 | 
											
												
													
														|  | -    } else if (sourceCtx.mozDashOffset !== undefined) {
 |  | 
 | 
											
												
													
														|  | -      destCtx.mozDash = sourceCtx.mozDash;
 |  | 
 | 
											
												
													
														|  | -      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    generateGL();
 | 
											
												
													
														|  | 
 |  | +    canvas = currentCanvas;
 | 
											
												
													
														|  | 
 |  | +    currentCanvas = null;
 | 
											
												
													
														|  | 
 |  | +    gl = currentGL;
 | 
											
												
													
														|  | 
 |  | +    currentGL = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function composeSMaskBackdrop(bytes, r0, g0, b0) {
 |  | 
 | 
											
												
													
														|  | -    var length = bytes.length;
 |  | 
 | 
											
												
													
														|  | -    for (var i = 3; i < length; i += 4) {
 |  | 
 | 
											
												
													
														|  | -      var alpha = bytes[i];
 |  | 
 | 
											
												
													
														|  | -      if (alpha === 0) {
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 3] = r0;
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 2] = g0;
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 1] = b0;
 |  | 
 | 
											
												
													
														|  | -      } else if (alpha < 255) {
 |  | 
 | 
											
												
													
														|  | -        var alpha_ = 255 - alpha;
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;
 |  | 
 | 
											
												
													
														|  | -        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // setup a GLSL program
 | 
											
												
													
														|  | 
 |  | +    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
 | 
											
												
													
														|  | 
 |  | +    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
 | 
											
												
													
														|  | 
 |  | +    var program = createProgram(gl, [vertexShader, fragmentShader]);
 | 
											
												
													
														|  | 
 |  | +    gl.useProgram(program);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function composeSMaskAlpha(maskData, layerData, transferMap) {
 |  | 
 | 
											
												
													
														|  | -    var length = maskData.length;
 |  | 
 | 
											
												
													
														|  | -    var scale = 1 / 255;
 |  | 
 | 
											
												
													
														|  | -    for (var i = 3; i < length; i += 4) {
 |  | 
 | 
											
												
													
														|  | -      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
 |  | 
 | 
											
												
													
														|  | -      layerData[i] = (layerData[i] * alpha * scale) | 0;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var cache = {};
 | 
											
												
													
														|  | 
 |  | +    cache.gl = gl;
 | 
											
												
													
														|  | 
 |  | +    cache.canvas = canvas;
 | 
											
												
													
														|  | 
 |  | +    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
 | 
											
												
													
														|  | 
 |  | +    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
 | 
											
												
													
														|  | 
 |  | +    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
 | 
											
												
													
														|  | 
 |  | +    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function composeSMaskLuminosity(maskData, layerData, transferMap) {
 |  | 
 | 
											
												
													
														|  | -    var length = maskData.length;
 |  | 
 | 
											
												
													
														|  | -    for (var i = 3; i < length; i += 4) {
 |  | 
 | 
											
												
													
														|  | -      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000
 |  | 
 | 
											
												
													
														|  | -              (maskData[i - 2] * 152) + // * 0.59 ....
 |  | 
 | 
											
												
													
														|  | -              (maskData[i - 1] * 28);   // * 0.11 ....
 |  | 
 | 
											
												
													
														|  | -      layerData[i] = transferMap ?
 |  | 
 | 
											
												
													
														|  | -        (layerData[i] * transferMap[y >> 8]) >> 8 :
 |  | 
 | 
											
												
													
														|  | -        (layerData[i] * y) >> 16;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
 | 
											
												
													
														|  | 
 |  | +    var texLayerLocation = gl.getUniformLocation(program, 'u_image');
 | 
											
												
													
														|  | 
 |  | +    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function genericComposeSMask(maskCtx, layerCtx, width, height,
 |  | 
 | 
											
												
													
														|  | -                               subtype, backdrop, transferMap) {
 |  | 
 | 
											
												
													
														|  | -    var hasBackdrop = !!backdrop;
 |  | 
 | 
											
												
													
														|  | -    var r0 = hasBackdrop ? backdrop[0] : 0;
 |  | 
 | 
											
												
													
														|  | -    var g0 = hasBackdrop ? backdrop[1] : 0;
 |  | 
 | 
											
												
													
														|  | -    var b0 = hasBackdrop ? backdrop[2] : 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // provide texture coordinates for the rectangle.
 | 
											
												
													
														|  | 
 |  | +    var texCoordBuffer = gl.createBuffer();
 | 
											
												
													
														|  | 
 |  | +    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
 | 
											
												
													
														|  | 
 |  | +    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
 | 
											
												
													
														|  | 
 |  | +      0.0,  0.0,
 | 
											
												
													
														|  | 
 |  | +      1.0,  0.0,
 | 
											
												
													
														|  | 
 |  | +      0.0,  1.0,
 | 
											
												
													
														|  | 
 |  | +      0.0,  1.0,
 | 
											
												
													
														|  | 
 |  | +      1.0,  0.0,
 | 
											
												
													
														|  | 
 |  | +      1.0,  1.0]), gl.STATIC_DRAW);
 | 
											
												
													
														|  | 
 |  | +    gl.enableVertexAttribArray(texCoordLocation);
 | 
											
												
													
														|  | 
 |  | +    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var composeFn;
 |  | 
 | 
											
												
													
														|  | -    if (subtype === 'Luminosity') {
 |  | 
 | 
											
												
													
														|  | -      composeFn = composeSMaskLuminosity;
 |  | 
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      composeFn = composeSMaskAlpha;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.uniform1i(texLayerLocation, 0);
 | 
											
												
													
														|  | 
 |  | +    gl.uniform1i(texMaskLocation, 1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // processing image in chunks to save memory
 |  | 
 | 
											
												
													
														|  | -    var PIXELS_TO_PROCESS = 1048576;
 |  | 
 | 
											
												
													
														|  | -    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
 |  | 
 | 
											
												
													
														|  | -    for (var row = 0; row < height; row += chunkSize) {
 |  | 
 | 
											
												
													
														|  | -      var chunkHeight = Math.min(chunkSize, height - row);
 |  | 
 | 
											
												
													
														|  | -      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
 |  | 
 | 
											
												
													
														|  | -      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    smaskCache = cache;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (hasBackdrop) {
 |  | 
 | 
											
												
													
														|  | -        composeSMaskBackdrop(maskData.data, r0, g0, b0);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      composeFn(maskData.data, layerData.data, transferMap);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function composeSMask(layer, mask, properties) {
 | 
											
												
													
														|  | 
 |  | +    var width = layer.width, height = layer.height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.putImageData(layerData, 0, row);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (!smaskCache) {
 | 
											
												
													
														|  | 
 |  | +      initSmaskGL();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;
 | 
											
												
													
														|  | 
 |  | +    canvas.width = width;
 | 
											
												
													
														|  | 
 |  | +    canvas.height = height;
 | 
											
												
													
														|  | 
 |  | +    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
 | 
											
												
													
														|  | 
 |  | +    gl.uniform2f(cache.resolutionLocation, width, height);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function composeSMask(ctx, smask, layerCtx) {
 |  | 
 | 
											
												
													
														|  | -    var mask = smask.canvas;
 |  | 
 | 
											
												
													
														|  | -    var maskCtx = smask.context;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (properties.backdrop) {
 | 
											
												
													
														|  | 
 |  | +      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],
 | 
											
												
													
														|  | 
 |  | +                   properties.backdrop[1], properties.backdrop[2], 1);
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    gl.uniform1i(cache.subtypeLocation,
 | 
											
												
													
														|  | 
 |  | +                 properties.subtype === 'Luminosity' ? 1 : 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,
 |  | 
 | 
											
												
													
														|  | -                     smask.offsetX, smask.offsetY);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Create a textures
 | 
											
												
													
														|  | 
 |  | +    var texture = createTexture(gl, layer, gl.TEXTURE0);
 | 
											
												
													
														|  | 
 |  | +    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var backdrop = smask.backdrop || null;
 |  | 
 | 
											
												
													
														|  | -    if (!smask.transferMap && WebGLUtils.isEnabled) {
 |  | 
 | 
											
												
													
														|  | -      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
 |  | 
 | 
											
												
													
														|  | -        {subtype: smask.subtype, backdrop: backdrop});
 |  | 
 | 
											
												
													
														|  | -      ctx.setTransform(1, 0, 0, 1, 0, 0);
 |  | 
 | 
											
												
													
														|  | -      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
 |  | 
 | 
											
												
													
														|  | -      return;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
 |  | 
 | 
											
												
													
														|  | -                        smask.subtype, backdrop, smask.transferMap);
 |  | 
 | 
											
												
													
														|  | -    ctx.drawImage(mask, 0, 0);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
 |  | 
 | 
											
												
													
														|  | -  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
 |  | 
 | 
											
												
													
														|  | -  var NORMAL_CLIP = {};
 |  | 
 | 
											
												
													
														|  | -  var EO_CLIP = {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Create a buffer and put a single clipspace rectangle in
 | 
											
												
													
														|  | 
 |  | +    // it (2 triangles)
 | 
											
												
													
														|  | 
 |  | +    var buffer = gl.createBuffer();
 | 
											
												
													
														|  | 
 |  | +    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
 | 
											
												
													
														|  | 
 |  | +    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
 | 
											
												
													
														|  | 
 |  | +      0, 0,
 | 
											
												
													
														|  | 
 |  | +      width, 0,
 | 
											
												
													
														|  | 
 |  | +      0, height,
 | 
											
												
													
														|  | 
 |  | +      0, height,
 | 
											
												
													
														|  | 
 |  | +      width, 0,
 | 
											
												
													
														|  | 
 |  | +      width, height]), gl.STATIC_DRAW);
 | 
											
												
													
														|  | 
 |  | +    gl.enableVertexAttribArray(cache.positionLocation);
 | 
											
												
													
														|  | 
 |  | +    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  CanvasGraphics.prototype = {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // draw
 | 
											
												
													
														|  | 
 |  | +    gl.clearColor(0, 0, 0, 0);
 | 
											
												
													
														|  | 
 |  | +    gl.enable(gl.BLEND);
 | 
											
												
													
														|  | 
 |  | +    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
 | 
											
												
													
														|  | 
 |  | +    gl.clear(gl.COLOR_BUFFER_BIT);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport,
 |  | 
 | 
											
												
													
														|  | -                                                       transparency) {
 |  | 
 | 
											
												
													
														|  | -      // For pdfs that use blend modes we have to clear the canvas else certain
 |  | 
 | 
											
												
													
														|  | -      // blend modes can look wrong since we'd be blending with a white
 |  | 
 | 
											
												
													
														|  | -      // backdrop. The problem with a transparent backdrop though is we then
 |  | 
 | 
											
												
													
														|  | -      // don't get sub pixel anti aliasing on text, creating temporary
 |  | 
 | 
											
												
													
														|  | -      // transparent canvas when we have blend modes.
 |  | 
 | 
											
												
													
														|  | -      var width = this.ctx.canvas.width;
 |  | 
 | 
											
												
													
														|  | -      var height = this.ctx.canvas.height;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.drawArrays(gl.TRIANGLES, 0, 6);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.ctx.save();
 |  | 
 | 
											
												
													
														|  | -      this.ctx.fillStyle = 'rgb(255, 255, 255)';
 |  | 
 | 
											
												
													
														|  | -      this.ctx.fillRect(0, 0, width, height);
 |  | 
 | 
											
												
													
														|  | -      this.ctx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.flush();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (transparency) {
 |  | 
 | 
											
												
													
														|  | -        var transparentCanvas = this.cachedCanvases.getCanvas(
 |  | 
 | 
											
												
													
														|  | -          'transparent', width, height, true);
 |  | 
 | 
											
												
													
														|  | -        this.compositeCtx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -        this.transparentCanvas = transparentCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | -        this.ctx = transparentCanvas.context;
 |  | 
 | 
											
												
													
														|  | -        this.ctx.save();
 |  | 
 | 
											
												
													
														|  | -        // The transform can be applied before rendering, transferring it to
 |  | 
 | 
											
												
													
														|  | -        // the new canvas.
 |  | 
 | 
											
												
													
														|  | -        this.ctx.transform.apply(this.ctx,
 |  | 
 | 
											
												
													
														|  | -                                 this.compositeCtx.mozCurrentTransform);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.deleteTexture(texture);
 | 
											
												
													
														|  | 
 |  | +    gl.deleteTexture(maskTexture);
 | 
											
												
													
														|  | 
 |  | +    gl.deleteBuffer(buffer);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.ctx.save();
 |  | 
 | 
											
												
													
														|  | -      if (transform) {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.transform.apply(this.ctx, transform);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this.ctx.transform.apply(this.ctx, viewport.transform);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return canvas;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.baseTransform = this.ctx.mozCurrentTransform.slice();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var figuresVertexShaderCode = '\
 | 
											
												
													
														|  | 
 |  | +  attribute vec2 a_position;                                    \
 | 
											
												
													
														|  | 
 |  | +  attribute vec3 a_color;                                       \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  uniform vec2 u_resolution;                                    \
 | 
											
												
													
														|  | 
 |  | +  uniform vec2 u_scale;                                         \
 | 
											
												
													
														|  | 
 |  | +  uniform vec2 u_offset;                                        \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  varying vec4 v_color;                                         \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  void main() {                                                 \
 | 
											
												
													
														|  | 
 |  | +    vec2 position = (a_position + u_offset) * u_scale;          \
 | 
											
												
													
														|  | 
 |  | +    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
 | 
											
												
													
														|  | 
 |  | +    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +    v_color = vec4(a_color / 255.0, 1.0);                       \
 | 
											
												
													
														|  | 
 |  | +  }                                                             ';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.imageLayer) {
 |  | 
 | 
											
												
													
														|  | -        this.imageLayer.beginLayout();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var figuresFragmentShaderCode = '\
 | 
											
												
													
														|  | 
 |  | +  precision mediump float;                                      \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  varying vec4 v_color;                                         \
 | 
											
												
													
														|  | 
 |  | +                                                                \
 | 
											
												
													
														|  | 
 |  | +  void main() {                                                 \
 | 
											
												
													
														|  | 
 |  | +    gl_FragColor = v_color;                                     \
 | 
											
												
													
														|  | 
 |  | +  }                                                             ';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    executeOperatorList: function CanvasGraphics_executeOperatorList(
 |  | 
 | 
											
												
													
														|  | -                                    operatorList,
 |  | 
 | 
											
												
													
														|  | -                                    executionStartIdx, continueCallback,
 |  | 
 | 
											
												
													
														|  | -                                    stepper) {
 |  | 
 | 
											
												
													
														|  | -      var argsArray = operatorList.argsArray;
 |  | 
 | 
											
												
													
														|  | -      var fnArray = operatorList.fnArray;
 |  | 
 | 
											
												
													
														|  | -      var i = executionStartIdx || 0;
 |  | 
 | 
											
												
													
														|  | -      var argsArrayLen = argsArray.length;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var figuresCache = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Sometimes the OperatorList to execute is empty.
 |  | 
 | 
											
												
													
														|  | -      if (argsArrayLen === i) {
 |  | 
 | 
											
												
													
														|  | -        return i;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function initFiguresGL() {
 | 
											
												
													
														|  | 
 |  | +    var canvas, gl;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&
 |  | 
 | 
											
												
													
														|  | -                             typeof continueCallback === 'function');
 |  | 
 | 
											
												
													
														|  | -      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
 |  | 
 | 
											
												
													
														|  | -      var steps = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    generateGL();
 | 
											
												
													
														|  | 
 |  | +    canvas = currentCanvas;
 | 
											
												
													
														|  | 
 |  | +    currentCanvas = null;
 | 
											
												
													
														|  | 
 |  | +    gl = currentGL;
 | 
											
												
													
														|  | 
 |  | +    currentGL = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var commonObjs = this.commonObjs;
 |  | 
 | 
											
												
													
														|  | -      var objs = this.objs;
 |  | 
 | 
											
												
													
														|  | -      var fnId;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // setup a GLSL program
 | 
											
												
													
														|  | 
 |  | +    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
 | 
											
												
													
														|  | 
 |  | +    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
 | 
											
												
													
														|  | 
 |  | +    var program = createProgram(gl, [vertexShader, fragmentShader]);
 | 
											
												
													
														|  | 
 |  | +    gl.useProgram(program);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      while (true) {
 |  | 
 | 
											
												
													
														|  | -        if (stepper !== undefined && i === stepper.nextBreakPoint) {
 |  | 
 | 
											
												
													
														|  | -          stepper.breakIt(i, continueCallback);
 |  | 
 | 
											
												
													
														|  | -          return i;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var cache = {};
 | 
											
												
													
														|  | 
 |  | +    cache.gl = gl;
 | 
											
												
													
														|  | 
 |  | +    cache.canvas = canvas;
 | 
											
												
													
														|  | 
 |  | +    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
 | 
											
												
													
														|  | 
 |  | +    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
 | 
											
												
													
														|  | 
 |  | +    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
 | 
											
												
													
														|  | 
 |  | +    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
 | 
											
												
													
														|  | 
 |  | +    cache.colorLocation = gl.getAttribLocation(program, 'a_color');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        fnId = fnArray[i];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    figuresCache = cache;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (fnId !== OPS.dependency) {
 |  | 
 | 
											
												
													
														|  | -          this[fnId].apply(this, argsArray[i]);
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          var deps = argsArray[i];
 |  | 
 | 
											
												
													
														|  | -          for (var n = 0, nn = deps.length; n < nn; n++) {
 |  | 
 | 
											
												
													
														|  | -            var depObjId = deps[n];
 |  | 
 | 
											
												
													
														|  | -            var common = depObjId[0] === 'g' && depObjId[1] === '_';
 |  | 
 | 
											
												
													
														|  | -            var objsPool = common ? commonObjs : objs;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function drawFigures(width, height, backgroundColor, figures, context) {
 | 
											
												
													
														|  | 
 |  | +    if (!figuresCache) {
 | 
											
												
													
														|  | 
 |  | +      initFiguresGL();
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            // If the promise isn't resolved yet, add the continueCallback
 |  | 
 | 
											
												
													
														|  | -            // to the promise and bail out.
 |  | 
 | 
											
												
													
														|  | -            if (!objsPool.isResolved(depObjId)) {
 |  | 
 | 
											
												
													
														|  | -              objsPool.get(depObjId, continueCallback);
 |  | 
 | 
											
												
													
														|  | -              return i;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    canvas.width = width;
 | 
											
												
													
														|  | 
 |  | +    canvas.height = height;
 | 
											
												
													
														|  | 
 |  | +    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
 | 
											
												
													
														|  | 
 |  | +    gl.uniform2f(cache.resolutionLocation, width, height);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // count triangle points
 | 
											
												
													
														|  | 
 |  | +    var count = 0;
 | 
											
												
													
														|  | 
 |  | +    var i, ii, rows;
 | 
											
												
													
														|  | 
 |  | +    for (i = 0, ii = figures.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +      switch (figures[i].type) {
 | 
											
												
													
														|  | 
 |  | +        case 'lattice':
 | 
											
												
													
														|  | 
 |  | +          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;
 | 
											
												
													
														|  | 
 |  | +          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
 | 
											
												
													
														|  | 
 |  | +          break;
 | 
											
												
													
														|  | 
 |  | +        case 'triangles':
 | 
											
												
													
														|  | 
 |  | +          count += figures[i].coords.length;
 | 
											
												
													
														|  | 
 |  | +          break;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    // transfer data
 | 
											
												
													
														|  | 
 |  | +    var coords = new Float32Array(count * 2);
 | 
											
												
													
														|  | 
 |  | +    var colors = new Uint8Array(count * 3);
 | 
											
												
													
														|  | 
 |  | +    var coordsMap = context.coords, colorsMap = context.colors;
 | 
											
												
													
														|  | 
 |  | +    var pIndex = 0, cIndex = 0;
 | 
											
												
													
														|  | 
 |  | +    for (i = 0, ii = figures.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +      var figure = figures[i], ps = figure.coords, cs = figure.colors;
 | 
											
												
													
														|  | 
 |  | +      switch (figure.type) {
 | 
											
												
													
														|  | 
 |  | +        case 'lattice':
 | 
											
												
													
														|  | 
 |  | +          var cols = figure.verticesPerRow;
 | 
											
												
													
														|  | 
 |  | +          rows = (ps.length / cols) | 0;
 | 
											
												
													
														|  | 
 |  | +          for (var row = 1; row < rows; row++) {
 | 
											
												
													
														|  | 
 |  | +            var offset = row * cols + 1;
 | 
											
												
													
														|  | 
 |  | +            for (var col = 1; col < cols; col++, offset++) {
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 6] = coords[pIndex + 2];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 7] = coords[pIndex + 3];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 8] = coords[pIndex + 4];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 9] = coords[pIndex + 5];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 10] = coordsMap[ps[offset]];
 | 
											
												
													
														|  | 
 |  | +              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 9] = colors[cIndex + 3];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 10] = colors[cIndex + 4];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 11] = colors[cIndex + 5];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 12] = colors[cIndex + 6];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 13] = colors[cIndex + 7];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 14] = colors[cIndex + 8];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 15] = colorsMap[cs[offset]];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
 | 
											
												
													
														|  | 
 |  | +              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
 | 
											
												
													
														|  | 
 |  | +              pIndex += 12;
 | 
											
												
													
														|  | 
 |  | +              cIndex += 18;
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |            }
 |  |            }
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +          break;
 | 
											
												
													
														|  | 
 |  | +        case 'triangles':
 | 
											
												
													
														|  | 
 |  | +          for (var j = 0, jj = ps.length; j < jj; j++) {
 | 
											
												
													
														|  | 
 |  | +            coords[pIndex] = coordsMap[ps[j]];
 | 
											
												
													
														|  | 
 |  | +            coords[pIndex + 1] = coordsMap[ps[j] + 1];
 | 
											
												
													
														|  | 
 |  | +            colors[cIndex] = colorsMap[cs[j]];
 | 
											
												
													
														|  | 
 |  | +            colors[cIndex + 1] = colorsMap[cs[j] + 1];
 | 
											
												
													
														|  | 
 |  | +            colors[cIndex + 2] = colorsMap[cs[j] + 2];
 | 
											
												
													
														|  | 
 |  | +            pIndex += 2;
 | 
											
												
													
														|  | 
 |  | +            cIndex += 3;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          break;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        i++;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // draw
 | 
											
												
													
														|  | 
 |  | +    if (backgroundColor) {
 | 
											
												
													
														|  | 
 |  | +      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,
 | 
											
												
													
														|  | 
 |  | +                    backgroundColor[2] / 255, 1.0);
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      gl.clearColor(0, 0, 0, 0);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    gl.clear(gl.COLOR_BUFFER_BIT);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // If the entire operatorList was executed, stop as were done.
 |  | 
 | 
											
												
													
														|  | -        if (i === argsArrayLen) {
 |  | 
 | 
											
												
													
														|  | -          return i;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var coordsBuffer = gl.createBuffer();
 | 
											
												
													
														|  | 
 |  | +    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
 | 
											
												
													
														|  | 
 |  | +    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
 | 
											
												
													
														|  | 
 |  | +    gl.enableVertexAttribArray(cache.positionLocation);
 | 
											
												
													
														|  | 
 |  | +    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // If the execution took longer then a certain amount of time and
 |  | 
 | 
											
												
													
														|  | -        // `continueCallback` is specified, interrupt the execution.
 |  | 
 | 
											
												
													
														|  | -        if (chunkOperations && ++steps > EXECUTION_STEPS) {
 |  | 
 | 
											
												
													
														|  | -          if (Date.now() > endTime) {
 |  | 
 | 
											
												
													
														|  | -            continueCallback();
 |  | 
 | 
											
												
													
														|  | -            return i;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          steps = 0;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var colorsBuffer = gl.createBuffer();
 | 
											
												
													
														|  | 
 |  | +    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
 | 
											
												
													
														|  | 
 |  | +    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
 | 
											
												
													
														|  | 
 |  | +    gl.enableVertexAttribArray(cache.colorLocation);
 | 
											
												
													
														|  | 
 |  | +    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,
 | 
											
												
													
														|  | 
 |  | +                           0, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // If the operatorList isn't executed completely yet OR the execution
 |  | 
 | 
											
												
													
														|  | -        // time was short enough, do another execution round.
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
 | 
											
												
													
														|  | 
 |  | +    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endDrawing: function CanvasGraphics_endDrawing() {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.drawArrays(gl.TRIANGLES, 0, count);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.transparentCanvas) {
 |  | 
 | 
											
												
													
														|  | -        this.ctx = this.compositeCtx;
 |  | 
 | 
											
												
													
														|  | -        this.ctx.drawImage(this.transparentCanvas, 0, 0);
 |  | 
 | 
											
												
													
														|  | -        this.transparentCanvas = null;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.flush();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.cachedCanvases.clear();
 |  | 
 | 
											
												
													
														|  | -      WebGLUtils.clear();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    gl.deleteBuffer(coordsBuffer);
 | 
											
												
													
														|  | 
 |  | +    gl.deleteBuffer(colorsBuffer);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.imageLayer) {
 |  | 
 | 
											
												
													
														|  | -        this.imageLayer.endLayout();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return canvas;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Graphics state
 |  | 
 | 
											
												
													
														|  | -    setLineWidth: function CanvasGraphics_setLineWidth(width) {
 |  | 
 | 
											
												
													
														|  | -      this.current.lineWidth = width;
 |  | 
 | 
											
												
													
														|  | -      this.ctx.lineWidth = width;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setLineCap: function CanvasGraphics_setLineCap(style) {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.lineCap = LINE_CAP_STYLES[style];
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setLineJoin: function CanvasGraphics_setLineJoin(style) {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.miterLimit = limit;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      if (ctx.setLineDash !== undefined) {
 |  | 
 | 
											
												
													
														|  | -        ctx.setLineDash(dashArray);
 |  | 
 | 
											
												
													
														|  | -        ctx.lineDashOffset = dashPhase;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        ctx.mozDash = dashArray;
 |  | 
 | 
											
												
													
														|  | -        ctx.mozDashOffset = dashPhase;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
 |  | 
 | 
											
												
													
														|  | -      // Maybe if we one day fully support color spaces this will be important
 |  | 
 | 
											
												
													
														|  | -      // for now we can ignore.
 |  | 
 | 
											
												
													
														|  | -      // TODO set rendering intent?
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setFlatness: function CanvasGraphics_setFlatness(flatness) {
 |  | 
 | 
											
												
													
														|  | -      // There's no way to control this with canvas, but we can safely ignore.
 |  | 
 | 
											
												
													
														|  | -      // TODO set flatness?
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setGState: function CanvasGraphics_setGState(states) {
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = states.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        var state = states[i];
 |  | 
 | 
											
												
													
														|  | -        var key = state[0];
 |  | 
 | 
											
												
													
														|  | -        var value = state[1];
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function cleanup() {
 | 
											
												
													
														|  | 
 |  | +    if (smaskCache && smaskCache.canvas) {
 | 
											
												
													
														|  | 
 |  | +      smaskCache.canvas.width = 0;
 | 
											
												
													
														|  | 
 |  | +      smaskCache.canvas.height = 0;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (figuresCache && figuresCache.canvas) {
 | 
											
												
													
														|  | 
 |  | +      figuresCache.canvas.width = 0;
 | 
											
												
													
														|  | 
 |  | +      figuresCache.canvas.height = 0;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    smaskCache = null;
 | 
											
												
													
														|  | 
 |  | +    figuresCache = null;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        switch (key) {
 |  | 
 | 
											
												
													
														|  | -          case 'LW':
 |  | 
 | 
											
												
													
														|  | -            this.setLineWidth(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'LC':
 |  | 
 | 
											
												
													
														|  | -            this.setLineCap(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'LJ':
 |  | 
 | 
											
												
													
														|  | -            this.setLineJoin(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'ML':
 |  | 
 | 
											
												
													
														|  | -            this.setMiterLimit(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'D':
 |  | 
 | 
											
												
													
														|  | -            this.setDash(value[0], value[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'RI':
 |  | 
 | 
											
												
													
														|  | -            this.setRenderingIntent(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'FL':
 |  | 
 | 
											
												
													
														|  | -            this.setFlatness(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'Font':
 |  | 
 | 
											
												
													
														|  | -            this.setFont(value[0], value[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'CA':
 |  | 
 | 
											
												
													
														|  | -            this.current.strokeAlpha = state[1];
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'ca':
 |  | 
 | 
											
												
													
														|  | -            this.current.fillAlpha = state[1];
 |  | 
 | 
											
												
													
														|  | -            this.ctx.globalAlpha = state[1];
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'BM':
 |  | 
 | 
											
												
													
														|  | -            if (value && value.name && (value.name !== 'Normal')) {
 |  | 
 | 
											
												
													
														|  | -              var mode = value.name.replace(/([A-Z])/g,
 |  | 
 | 
											
												
													
														|  | -                function(c) {
 |  | 
 | 
											
												
													
														|  | -                  return '-' + c.toLowerCase();
 |  | 
 | 
											
												
													
														|  | -                }
 |  | 
 | 
											
												
													
														|  | -              ).substring(1);
 |  | 
 | 
											
												
													
														|  | -              this.ctx.globalCompositeOperation = mode;
 |  | 
 | 
											
												
													
														|  | -              if (this.ctx.globalCompositeOperation !== mode) {
 |  | 
 | 
											
												
													
														|  | -                warn('globalCompositeOperation "' + mode +
 |  | 
 | 
											
												
													
														|  | -                     '" is not supported');
 |  | 
 | 
											
												
													
														|  | -              }
 |  | 
 | 
											
												
													
														|  | -            } else {
 |  | 
 | 
											
												
													
														|  | -              this.ctx.globalCompositeOperation = 'source-over';
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'SMask':
 |  | 
 | 
											
												
													
														|  | -            if (this.current.activeSMask) {
 |  | 
 | 
											
												
													
														|  | -              this.endSMaskGroup();
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            this.current.activeSMask = value ? this.tempSMask : null;
 |  | 
 | 
											
												
													
														|  | -            if (this.current.activeSMask) {
 |  | 
 | 
											
												
													
														|  | -              this.beginSMaskGroup();
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            this.tempSMask = null;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return {
 | 
											
												
													
														|  | 
 |  | +    get isEnabled() {
 | 
											
												
													
														|  | 
 |  | +      if (PDFJS.disableWebGL) {
 | 
											
												
													
														|  | 
 |  | +        return false;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      var enabled = false;
 | 
											
												
													
														|  | 
 |  | +      try {
 | 
											
												
													
														|  | 
 |  | +        generateGL();
 | 
											
												
													
														|  | 
 |  | +        enabled = !!currentGL;
 | 
											
												
													
														|  | 
 |  | +      } catch (e) { }
 | 
											
												
													
														|  | 
 |  | +      return shadow(this, 'isEnabled', enabled);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var activeSMask = this.current.activeSMask;
 |  | 
 | 
											
												
													
														|  | -      var drawnWidth = activeSMask.canvas.width;
 |  | 
 | 
											
												
													
														|  | -      var drawnHeight = activeSMask.canvas.height;
 |  | 
 | 
											
												
													
														|  | -      var cacheId = 'smaskGroupAt' + this.groupLevel;
 |  | 
 | 
											
												
													
														|  | -      var scratchCanvas = this.cachedCanvases.getCanvas(
 |  | 
 | 
											
												
													
														|  | -        cacheId, drawnWidth, drawnHeight, true);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    composeSMask: composeSMask,
 | 
											
												
													
														|  | 
 |  | +    drawFigures: drawFigures,
 | 
											
												
													
														|  | 
 |  | +    clear: cleanup
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var currentCtx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var currentTransform = currentCtx.mozCurrentTransform;
 |  | 
 | 
											
												
													
														|  | -      this.ctx.save();
 |  | 
 | 
											
												
													
														|  | 
 |  | +exports.WebGLUtils = WebGLUtils;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var groupCtx = scratchCanvas.context;
 |  | 
 | 
											
												
													
														|  | -      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
 |  | 
 | 
											
												
													
														|  | -      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
 |  | 
 | 
											
												
													
														|  | -      groupCtx.transform.apply(groupCtx, currentTransform);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      copyCtxState(currentCtx, groupCtx);
 |  | 
 | 
											
												
													
														|  | -      this.ctx = groupCtx;
 |  | 
 | 
											
												
													
														|  | -      this.setGState([
 |  | 
 | 
											
												
													
														|  | -        ['BM', 'Normal'],
 |  | 
 | 
											
												
													
														|  | -        ['ca', 1],
 |  | 
 | 
											
												
													
														|  | -        ['CA', 1]
 |  | 
 | 
											
												
													
														|  | -      ]);
 |  | 
 | 
											
												
													
														|  | -      this.groupStack.push(currentCtx);
 |  | 
 | 
											
												
													
														|  | -      this.groupLevel++;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
 |  | 
 | 
											
												
													
														|  | -      var groupCtx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      this.groupLevel--;
 |  | 
 | 
											
												
													
														|  | -      this.ctx = this.groupStack.pop();
 |  | 
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil,
 | 
											
												
													
														|  | 
 |  | +      root.pdfjsDisplayWebGL);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedUtil, displayWebGL) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
 |  | 
 | 
											
												
													
														|  | -      this.ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      copyCtxState(groupCtx, this.ctx);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    save: function CanvasGraphics_save() {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.save();
 |  | 
 | 
											
												
													
														|  | -      var old = this.current;
 |  | 
 | 
											
												
													
														|  | -      this.stateStack.push(old);
 |  | 
 | 
											
												
													
														|  | -      this.current = old.clone();
 |  | 
 | 
											
												
													
														|  | -      this.current.activeSMask = null;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    restore: function CanvasGraphics_restore() {
 |  | 
 | 
											
												
													
														|  | -      if (this.stateStack.length !== 0) {
 |  | 
 | 
											
												
													
														|  | -        if (this.current.activeSMask !== null) {
 |  | 
 | 
											
												
													
														|  | -          this.endSMaskGroup();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var Util = sharedUtil.Util;
 | 
											
												
													
														|  | 
 |  | +var info = sharedUtil.info;
 | 
											
												
													
														|  | 
 |  | +var isArray = sharedUtil.isArray;
 | 
											
												
													
														|  | 
 |  | +var error = sharedUtil.error;
 | 
											
												
													
														|  | 
 |  | +var WebGLUtils = displayWebGL.WebGLUtils;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.current = this.stateStack.pop();
 |  | 
 | 
											
												
													
														|  | -        this.ctx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +var ShadingIRs = {};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // Ensure that the clipping path is reset (fixes issue6413.pdf).
 |  | 
 | 
											
												
													
														|  | -        this.pendingClip = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +ShadingIRs.RadialAxial = {
 | 
											
												
													
														|  | 
 |  | +  fromIR: function RadialAxial_fromIR(raw) {
 | 
											
												
													
														|  | 
 |  | +    var type = raw[1];
 | 
											
												
													
														|  | 
 |  | +    var colorStops = raw[2];
 | 
											
												
													
														|  | 
 |  | +    var p0 = raw[3];
 | 
											
												
													
														|  | 
 |  | +    var p1 = raw[4];
 | 
											
												
													
														|  | 
 |  | +    var r0 = raw[5];
 | 
											
												
													
														|  | 
 |  | +    var r1 = raw[6];
 | 
											
												
													
														|  | 
 |  | +    return {
 | 
											
												
													
														|  | 
 |  | +      type: 'Pattern',
 | 
											
												
													
														|  | 
 |  | +      getPattern: function RadialAxial_getPattern(ctx) {
 | 
											
												
													
														|  | 
 |  | +        var grad;
 | 
											
												
													
														|  | 
 |  | +        if (type === 'axial') {
 | 
											
												
													
														|  | 
 |  | +          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
 | 
											
												
													
														|  | 
 |  | +        } else if (type === 'radial') {
 | 
											
												
													
														|  | 
 |  | +          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.cachedGetSinglePixelWidth = null;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.transform(a, b, c, d, e, f);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      this.cachedGetSinglePixelWidth = null;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Path
 |  | 
 | 
											
												
													
														|  | -    constructPath: function CanvasGraphics_constructPath(ops, args) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var x = current.x, y = current.y;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        switch (ops[i] | 0) {
 |  | 
 | 
											
												
													
														|  | -          case OPS.rectangle:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            var width = args[j++];
 |  | 
 | 
											
												
													
														|  | -            var height = args[j++];
 |  | 
 | 
											
												
													
														|  | -            if (width === 0) {
 |  | 
 | 
											
												
													
														|  | -              width = this.getSinglePixelWidth();
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            if (height === 0) {
 |  | 
 | 
											
												
													
														|  | -              height = this.getSinglePixelWidth();
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            var xw = x + width;
 |  | 
 | 
											
												
													
														|  | -            var yh = y + height;
 |  | 
 | 
											
												
													
														|  | -            this.ctx.moveTo(x, y);
 |  | 
 | 
											
												
													
														|  | -            this.ctx.lineTo(xw, y);
 |  | 
 | 
											
												
													
														|  | -            this.ctx.lineTo(xw, yh);
 |  | 
 | 
											
												
													
														|  | -            this.ctx.lineTo(x, yh);
 |  | 
 | 
											
												
													
														|  | -            this.ctx.lineTo(x, y);
 |  | 
 | 
											
												
													
														|  | -            this.ctx.closePath();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.moveTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            ctx.moveTo(x, y);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.lineTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            ctx.lineTo(x, y);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 4];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 5];
 |  | 
 | 
											
												
													
														|  | -            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],
 |  | 
 | 
											
												
													
														|  | -                              x, y);
 |  | 
 | 
											
												
													
														|  | -            j += 6;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo2:
 |  | 
 | 
											
												
													
														|  | -            ctx.bezierCurveTo(x, y, args[j], args[j + 1],
 |  | 
 | 
											
												
													
														|  | -                              args[j + 2], args[j + 3]);
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 2];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 3];
 |  | 
 | 
											
												
													
														|  | -            j += 4;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo3:
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 2];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 3];
 |  | 
 | 
											
												
													
														|  | -            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
 |  | 
 | 
											
												
													
														|  | -            j += 4;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.closePath:
 |  | 
 | 
											
												
													
														|  | -            ctx.closePath();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      current.setCurrentPoint(x, y);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    closePath: function CanvasGraphics_closePath() {
 |  | 
 | 
											
												
													
														|  | -      this.ctx.closePath();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    stroke: function CanvasGraphics_stroke(consumePath) {
 |  | 
 | 
											
												
													
														|  | -      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var strokeColor = this.current.strokeColor;
 |  | 
 | 
											
												
													
														|  | -      // Prevent drawing too thin lines by enforcing a minimum line width.
 |  | 
 | 
											
												
													
														|  | -      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,
 |  | 
 | 
											
												
													
														|  | -                               this.current.lineWidth);
 |  | 
 | 
											
												
													
														|  | -      // For stroke we want to temporarily change the global alpha to the
 |  | 
 | 
											
												
													
														|  | -      // stroking alpha.
 |  | 
 | 
											
												
													
														|  | -      ctx.globalAlpha = this.current.strokeAlpha;
 |  | 
 | 
											
												
													
														|  | -      if (strokeColor && strokeColor.hasOwnProperty('type') &&
 |  | 
 | 
											
												
													
														|  | -          strokeColor.type === 'Pattern') {
 |  | 
 | 
											
												
													
														|  | -        // for patterns, we transform to pattern space, calculate
 |  | 
 | 
											
												
													
														|  | -        // the pattern, call stroke, and restore to user space
 |  | 
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
 |  | 
 | 
											
												
													
														|  | -        ctx.stroke();
 |  | 
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        ctx.stroke();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (consumePath) {
 |  | 
 | 
											
												
													
														|  | -        this.consumePath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      // Restore the global alpha to the fill alpha
 |  | 
 | 
											
												
													
														|  | -      ctx.globalAlpha = this.current.fillAlpha;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    closeStroke: function CanvasGraphics_closeStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.closePath();
 |  | 
 | 
											
												
													
														|  | -      this.stroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    fill: function CanvasGraphics_fill(consumePath) {
 |  | 
 | 
											
												
													
														|  | -      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var fillColor = this.current.fillColor;
 |  | 
 | 
											
												
													
														|  | -      var isPatternFill = this.current.patternFill;
 |  | 
 | 
											
												
													
														|  | -      var needRestore = false;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (isPatternFill) {
 |  | 
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        if (this.baseTransform) {
 |  | 
 | 
											
												
													
														|  | -          ctx.setTransform.apply(ctx, this.baseTransform);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        ctx.fillStyle = fillColor.getPattern(ctx, this);
 |  | 
 | 
											
												
													
														|  | -        needRestore = true;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (this.pendingEOFill) {
 |  | 
 | 
											
												
													
														|  | -        if (ctx.mozFillRule !== undefined) {
 |  | 
 | 
											
												
													
														|  | -          ctx.mozFillRule = 'evenodd';
 |  | 
 | 
											
												
													
														|  | -          ctx.fill();
 |  | 
 | 
											
												
													
														|  | -          ctx.mozFillRule = 'nonzero';
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          ctx.fill('evenodd');
 |  | 
 | 
											
												
													
														|  | 
 |  | +        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
 | 
											
												
													
														|  | 
 |  | +          var c = colorStops[i];
 | 
											
												
													
														|  | 
 |  | +          grad.addColorStop(c[0], c[1]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        this.pendingEOFill = false;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        ctx.fill();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (needRestore) {
 |  | 
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (consumePath) {
 |  | 
 | 
											
												
													
														|  | -        this.consumePath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    eoFill: function CanvasGraphics_eoFill() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingEOFill = true;
 |  | 
 | 
											
												
													
														|  | -      this.fill();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    fillStroke: function CanvasGraphics_fillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.fill(false);
 |  | 
 | 
											
												
													
														|  | -      this.stroke(false);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      this.consumePath();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    eoFillStroke: function CanvasGraphics_eoFillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingEOFill = true;
 |  | 
 | 
											
												
													
														|  | -      this.fillStroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    closeFillStroke: function CanvasGraphics_closeFillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.closePath();
 |  | 
 | 
											
												
													
														|  | -      this.fillStroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingEOFill = true;
 |  | 
 | 
											
												
													
														|  | -      this.closePath();
 |  | 
 | 
											
												
													
														|  | -      this.fillStroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    endPath: function CanvasGraphics_endPath() {
 |  | 
 | 
											
												
													
														|  | -      this.consumePath();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Clipping
 |  | 
 | 
											
												
													
														|  | -    clip: function CanvasGraphics_clip() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingClip = NORMAL_CLIP;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    eoClip: function CanvasGraphics_eoClip() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingClip = EO_CLIP;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Text
 |  | 
 | 
											
												
													
														|  | -    beginText: function CanvasGraphics_beginText() {
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrixScale = 1;
 |  | 
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY = 0;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    endText: function CanvasGraphics_endText() {
 |  | 
 | 
											
												
													
														|  | -      var paths = this.pendingTextPaths;
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      if (paths === undefined) {
 |  | 
 | 
											
												
													
														|  | -        ctx.beginPath();
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      ctx.save();
 |  | 
 | 
											
												
													
														|  | -      ctx.beginPath();
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0; i < paths.length; i++) {
 |  | 
 | 
											
												
													
														|  | -        var path = paths[i];
 |  | 
 | 
											
												
													
														|  | -        ctx.setTransform.apply(ctx, path.transform);
 |  | 
 | 
											
												
													
														|  | -        ctx.translate(path.x, path.y);
 |  | 
 | 
											
												
													
														|  | -        path.addToPath(ctx, path.fontSize);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      ctx.clip();
 |  | 
 | 
											
												
													
														|  | -      ctx.beginPath();
 |  | 
 | 
											
												
													
														|  | -      delete this.pendingTextPaths;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
 |  | 
 | 
											
												
													
														|  | -      this.current.charSpacing = spacing;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
 |  | 
 | 
											
												
													
														|  | -      this.current.wordSpacing = spacing;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setHScale: function CanvasGraphics_setHScale(scale) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textHScale = scale / 100;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setLeading: function CanvasGraphics_setLeading(leading) {
 |  | 
 | 
											
												
													
														|  | -      this.current.leading = -leading;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setFont: function CanvasGraphics_setFont(fontRefName, size) {
 |  | 
 | 
											
												
													
														|  | -      var fontObj = this.commonObjs.get(fontRefName);
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (!fontObj) {
 |  | 
 | 
											
												
													
														|  | -        error('Can\'t find font for ' + fontRefName);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        return grad;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.fontMatrix = (fontObj.fontMatrix ?
 |  | 
 | 
											
												
													
														|  | -                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // A valid matrix needs all main diagonal elements to be non-zero
 |  | 
 | 
											
												
													
														|  | -      // This also ensures we bypass FF bugzilla bug #719844.
 |  | 
 | 
											
												
													
														|  | -      if (current.fontMatrix[0] === 0 ||
 |  | 
 | 
											
												
													
														|  | -          current.fontMatrix[3] === 0) {
 |  | 
 | 
											
												
													
														|  | -        warn('Invalid font matrix for font ' + fontRefName);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var createMeshCanvas = (function createMeshCanvasClosure() {
 | 
											
												
													
														|  | 
 |  | +  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
 | 
											
												
													
														|  | 
 |  | +    // Very basic Gouraud-shaded triangle rasterization algorithm.
 | 
											
												
													
														|  | 
 |  | +    var coords = context.coords, colors = context.colors;
 | 
											
												
													
														|  | 
 |  | +    var bytes = data.data, rowSize = data.width * 4;
 | 
											
												
													
														|  | 
 |  | +    var tmp;
 | 
											
												
													
														|  | 
 |  | +    if (coords[p1 + 1] > coords[p2 + 1]) {
 | 
											
												
													
														|  | 
 |  | +      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (coords[p2 + 1] > coords[p3 + 1]) {
 | 
											
												
													
														|  | 
 |  | +      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (coords[p1 + 1] > coords[p2 + 1]) {
 | 
											
												
													
														|  | 
 |  | +      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
 | 
											
												
													
														|  | 
 |  | +    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
 | 
											
												
													
														|  | 
 |  | +    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
 | 
											
												
													
														|  | 
 |  | +    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
 | 
											
												
													
														|  | 
 |  | +    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
 | 
											
												
													
														|  | 
 |  | +    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
 | 
											
												
													
														|  | 
 |  | +    if (y1 >= y3) {
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
 | 
											
												
													
														|  | 
 |  | +    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
 | 
											
												
													
														|  | 
 |  | +    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
 |  | 
 | 
											
												
													
														|  | -      // and in some docs this can be negative (inverted x-y axes).
 |  | 
 | 
											
												
													
														|  | -      if (size < 0) {
 |  | 
 | 
											
												
													
														|  | -        size = -size;
 |  | 
 | 
											
												
													
														|  | -        current.fontDirection = -1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var minY = Math.round(y1), maxY = Math.round(y3);
 | 
											
												
													
														|  | 
 |  | +    var xa, car, cag, cab;
 | 
											
												
													
														|  | 
 |  | +    var xb, cbr, cbg, cbb;
 | 
											
												
													
														|  | 
 |  | +    var k;
 | 
											
												
													
														|  | 
 |  | +    for (var y = minY; y <= maxY; y++) {
 | 
											
												
													
														|  | 
 |  | +      if (y < y2) {
 | 
											
												
													
														|  | 
 |  | +        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
 | 
											
												
													
														|  | 
 |  | +        xa = x1 - (x1 - x2) * k;
 | 
											
												
													
														|  | 
 |  | +        car = c1r - (c1r - c2r) * k;
 | 
											
												
													
														|  | 
 |  | +        cag = c1g - (c1g - c2g) * k;
 | 
											
												
													
														|  | 
 |  | +        cab = c1b - (c1b - c2b) * k;
 | 
											
												
													
														|  |        } else {
 |  |        } else {
 | 
											
												
													
														|  | -        current.fontDirection = 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
 | 
											
												
													
														|  | 
 |  | +        xa = x2 - (x2 - x3) * k;
 | 
											
												
													
														|  | 
 |  | +        car = c2r - (c2r - c3r) * k;
 | 
											
												
													
														|  | 
 |  | +        cag = c2g - (c2g - c3g) * k;
 | 
											
												
													
														|  | 
 |  | +        cab = c2b - (c2b - c3b) * k;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      this.current.font = fontObj;
 |  | 
 | 
											
												
													
														|  | -      this.current.fontSize = size;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (fontObj.isType3Font) {
 |  | 
 | 
											
												
													
														|  | -        return; // we don't need ctx.font for Type3 fonts
 |  | 
 | 
											
												
													
														|  | 
 |  | +      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
 | 
											
												
													
														|  | 
 |  | +      xb = x1 - (x1 - x3) * k;
 | 
											
												
													
														|  | 
 |  | +      cbr = c1r - (c1r - c3r) * k;
 | 
											
												
													
														|  | 
 |  | +      cbg = c1g - (c1g - c3g) * k;
 | 
											
												
													
														|  | 
 |  | +      cbb = c1b - (c1b - c3b) * k;
 | 
											
												
													
														|  | 
 |  | +      var x1_ = Math.round(Math.min(xa, xb));
 | 
											
												
													
														|  | 
 |  | +      var x2_ = Math.round(Math.max(xa, xb));
 | 
											
												
													
														|  | 
 |  | +      var j = rowSize * y + x1_ * 4;
 | 
											
												
													
														|  | 
 |  | +      for (var x = x1_; x <= x2_; x++) {
 | 
											
												
													
														|  | 
 |  | +        k = (xa - x) / (xa - xb);
 | 
											
												
													
														|  | 
 |  | +        k = k < 0 ? 0 : k > 1 ? 1 : k;
 | 
											
												
													
														|  | 
 |  | +        bytes[j++] = (car - (car - cbr) * k) | 0;
 | 
											
												
													
														|  | 
 |  | +        bytes[j++] = (cag - (cag - cbg) * k) | 0;
 | 
											
												
													
														|  | 
 |  | +        bytes[j++] = (cab - (cab - cbb) * k) | 0;
 | 
											
												
													
														|  | 
 |  | +        bytes[j++] = 255;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var name = fontObj.loadedName || 'sans-serif';
 |  | 
 | 
											
												
													
														|  | -      var bold = fontObj.black ? (fontObj.bold ? '900' : 'bold') :
 |  | 
 | 
											
												
													
														|  | -                                 (fontObj.bold ? 'bold' : 'normal');
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var italic = fontObj.italic ? 'italic' : 'normal';
 |  | 
 | 
											
												
													
														|  | -      var typeface = '"' + name + '", ' + fontObj.fallbackName;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // Some font backends cannot handle fonts below certain size.
 |  | 
 | 
											
												
													
														|  | -      // Keeping the font at minimal size and using the fontSizeScale to change
 |  | 
 | 
											
												
													
														|  | -      // the current transformation matrix before the fillText/strokeText.
 |  | 
 | 
											
												
													
														|  | -      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
 |  | 
 | 
											
												
													
														|  | -      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :
 |  | 
 | 
											
												
													
														|  | -                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
 |  | 
 | 
											
												
													
														|  | -      this.current.fontSizeScale = size / browserFontSize;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function drawFigure(data, figure, context) {
 | 
											
												
													
														|  | 
 |  | +    var ps = figure.coords;
 | 
											
												
													
														|  | 
 |  | +    var cs = figure.colors;
 | 
											
												
													
														|  | 
 |  | +    var i, ii;
 | 
											
												
													
														|  | 
 |  | +    switch (figure.type) {
 | 
											
												
													
														|  | 
 |  | +      case 'lattice':
 | 
											
												
													
														|  | 
 |  | +        var verticesPerRow = figure.verticesPerRow;
 | 
											
												
													
														|  | 
 |  | +        var rows = Math.floor(ps.length / verticesPerRow) - 1;
 | 
											
												
													
														|  | 
 |  | +        var cols = verticesPerRow - 1;
 | 
											
												
													
														|  | 
 |  | +        for (i = 0; i < rows; i++) {
 | 
											
												
													
														|  | 
 |  | +          var q = i * verticesPerRow;
 | 
											
												
													
														|  | 
 |  | +          for (var j = 0; j < cols; j++, q++) {
 | 
											
												
													
														|  | 
 |  | +            drawTriangle(data, context,
 | 
											
												
													
														|  | 
 |  | +              ps[q], ps[q + 1], ps[q + verticesPerRow],
 | 
											
												
													
														|  | 
 |  | +              cs[q], cs[q + 1], cs[q + verticesPerRow]);
 | 
											
												
													
														|  | 
 |  | +            drawTriangle(data, context,
 | 
											
												
													
														|  | 
 |  | +              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],
 | 
											
												
													
														|  | 
 |  | +              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +      case 'triangles':
 | 
											
												
													
														|  | 
 |  | +        for (i = 0, ii = ps.length; i < ii; i += 3) {
 | 
											
												
													
														|  | 
 |  | +          drawTriangle(data, context,
 | 
											
												
													
														|  | 
 |  | +            ps[i], ps[i + 1], ps[i + 2],
 | 
											
												
													
														|  | 
 |  | +            cs[i], cs[i + 1], cs[i + 2]);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +      default:
 | 
											
												
													
														|  | 
 |  | +        error('illigal figure');
 | 
											
												
													
														|  | 
 |  | +        break;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
 |  | 
 | 
											
												
													
														|  | -      this.ctx.font = rule;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textRenderingMode = mode;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setTextRise: function CanvasGraphics_setTextRise(rise) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textRise = rise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    moveText: function CanvasGraphics_moveText(x, y) {
 |  | 
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX += x;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY += y;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
 |  | 
 | 
											
												
													
														|  | -      this.setLeading(-y);
 |  | 
 | 
											
												
													
														|  | -      this.moveText(x, y);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrix = [a, b, c, d, e, f];
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrixScale = Math.sqrt(a * a + b * b);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
 | 
											
												
													
														|  | 
 |  | +                            backgroundColor, cachedCanvases) {
 | 
											
												
													
														|  | 
 |  | +    // we will increase scale on some weird factor to let antialiasing take
 | 
											
												
													
														|  | 
 |  | +    // care of "rough" edges
 | 
											
												
													
														|  | 
 |  | +    var EXPECTED_SCALE = 1.1;
 | 
											
												
													
														|  | 
 |  | +    // MAX_PATTERN_SIZE is used to avoid OOM situation.
 | 
											
												
													
														|  | 
 |  | +    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY = 0;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    nextLine: function CanvasGraphics_nextLine() {
 |  | 
 | 
											
												
													
														|  | -      this.moveText(0, this.current.leading);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var offsetX = Math.floor(bounds[0]);
 | 
											
												
													
														|  | 
 |  | +    var offsetY = Math.floor(bounds[1]);
 | 
											
												
													
														|  | 
 |  | +    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
 | 
											
												
													
														|  | 
 |  | +    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintChar: function CanvasGraphics_paintChar(character, x, y) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var font = current.font;
 |  | 
 | 
											
												
													
														|  | -      var textRenderingMode = current.textRenderingMode;
 |  | 
 | 
											
												
													
														|  | -      var fontSize = current.fontSize / current.fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -      var fillStrokeMode = textRenderingMode &
 |  | 
 | 
											
												
													
														|  | -        TextRenderingMode.FILL_STROKE_MASK;
 |  | 
 | 
											
												
													
														|  | -      var isAddToPathSet = !!(textRenderingMode &
 |  | 
 | 
											
												
													
														|  | -        TextRenderingMode.ADD_TO_PATH_FLAG);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
 | 
											
												
													
														|  | 
 |  | +      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
 | 
											
												
													
														|  | 
 |  | +    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
 | 
											
												
													
														|  | 
 |  | +      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
 | 
											
												
													
														|  | 
 |  | +    var scaleX = boundsWidth / width;
 | 
											
												
													
														|  | 
 |  | +    var scaleY = boundsHeight / height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var addToPath;
 |  | 
 | 
											
												
													
														|  | -      if (font.disableFontFace || isAddToPathSet) {
 |  | 
 | 
											
												
													
														|  | -        addToPath = font.getPathGenerator(this.commonObjs, character);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var context = {
 | 
											
												
													
														|  | 
 |  | +      coords: coords,
 | 
											
												
													
														|  | 
 |  | +      colors: colors,
 | 
											
												
													
														|  | 
 |  | +      offsetX: -offsetX,
 | 
											
												
													
														|  | 
 |  | +      offsetY: -offsetY,
 | 
											
												
													
														|  | 
 |  | +      scaleX: 1 / scaleX,
 | 
											
												
													
														|  | 
 |  | +      scaleY: 1 / scaleY
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (font.disableFontFace) {
 |  | 
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.translate(x, y);
 |  | 
 | 
											
												
													
														|  | -        ctx.beginPath();
 |  | 
 | 
											
												
													
														|  | -        addToPath(ctx, fontSize);
 |  | 
 | 
											
												
													
														|  | -        if (fillStrokeMode === TextRenderingMode.FILL ||
 |  | 
 | 
											
												
													
														|  | -            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 |  | 
 | 
											
												
													
														|  | -          ctx.fill();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        if (fillStrokeMode === TextRenderingMode.STROKE ||
 |  | 
 | 
											
												
													
														|  | -            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 |  | 
 | 
											
												
													
														|  | -          ctx.stroke();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        if (fillStrokeMode === TextRenderingMode.FILL ||
 |  | 
 | 
											
												
													
														|  | -            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 |  | 
 | 
											
												
													
														|  | -          ctx.fillText(character, x, y);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        if (fillStrokeMode === TextRenderingMode.STROKE ||
 |  | 
 | 
											
												
													
														|  | -            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 |  | 
 | 
											
												
													
														|  | -          ctx.strokeText(character, x, y);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var canvas, tmpCanvas, i, ii;
 | 
											
												
													
														|  | 
 |  | +    if (WebGLUtils.isEnabled) {
 | 
											
												
													
														|  | 
 |  | +      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
 | 
											
												
													
														|  | 
 |  | +                                      figures, context);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isAddToPathSet) {
 |  | 
 | 
											
												
													
														|  | -        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
 |  | 
 | 
											
												
													
														|  | -        paths.push({
 |  | 
 | 
											
												
													
														|  | -          transform: ctx.mozCurrentTransform,
 |  | 
 | 
											
												
													
														|  | -          x: x,
 |  | 
 | 
											
												
													
														|  | -          y: y,
 |  | 
 | 
											
												
													
														|  | -          fontSize: fontSize,
 |  | 
 | 
											
												
													
														|  | -          addToPath: addToPath
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126
 | 
											
												
													
														|  | 
 |  | +      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
 | 
											
												
													
														|  | 
 |  | +      tmpCanvas.context.drawImage(canvas, 0, 0);
 | 
											
												
													
														|  | 
 |  | +      canvas = tmpCanvas.canvas;
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
 | 
											
												
													
														|  | 
 |  | +      var tmpCtx = tmpCanvas.context;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    get isFontSubpixelAAEnabled() {
 |  | 
 | 
											
												
													
														|  | -      // Checks if anti-aliasing is enabled when scaled text is painted.
 |  | 
 | 
											
												
													
														|  | -      // On Windows GDI scaled fonts looks bad.
 |  | 
 | 
											
												
													
														|  | -      var ctx = document.createElement('canvas').getContext('2d');
 |  | 
 | 
											
												
													
														|  | -      ctx.scale(1.5, 1);
 |  | 
 | 
											
												
													
														|  | -      ctx.fillText('I', 0, 10);
 |  | 
 | 
											
												
													
														|  | -      var data = ctx.getImageData(0, 0, 10, 10).data;
 |  | 
 | 
											
												
													
														|  | -      var enabled = false;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 3; i < data.length; i += 4) {
 |  | 
 | 
											
												
													
														|  | -        if (data[i] > 0 && data[i] < 255) {
 |  | 
 | 
											
												
													
														|  | -          enabled = true;
 |  | 
 | 
											
												
													
														|  | -          break;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var data = tmpCtx.createImageData(width, height);
 | 
											
												
													
														|  | 
 |  | +      if (backgroundColor) {
 | 
											
												
													
														|  | 
 |  | +        var bytes = data.data;
 | 
											
												
													
														|  | 
 |  | +        for (i = 0, ii = bytes.length; i < ii; i += 4) {
 | 
											
												
													
														|  | 
 |  | +          bytes[i] = backgroundColor[0];
 | 
											
												
													
														|  | 
 |  | +          bytes[i + 1] = backgroundColor[1];
 | 
											
												
													
														|  | 
 |  | +          bytes[i + 2] = backgroundColor[2];
 | 
											
												
													
														|  | 
 |  | +          bytes[i + 3] = 255;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return shadow(this, 'isFontSubpixelAAEnabled', enabled);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    showText: function CanvasGraphics_showText(glyphs) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var font = current.font;
 |  | 
 | 
											
												
													
														|  | -      if (font.isType3Font) {
 |  | 
 | 
											
												
													
														|  | -        return this.showType3Text(glyphs);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var fontSize = current.fontSize;
 |  | 
 | 
											
												
													
														|  | -      if (fontSize === 0) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < figures.length; i++) {
 | 
											
												
													
														|  | 
 |  | +        drawFigure(data, figures[i], context);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      tmpCtx.putImageData(data, 0, 0);
 | 
											
												
													
														|  | 
 |  | +      canvas = tmpCanvas.canvas;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var fontSizeScale = current.fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -      var charSpacing = current.charSpacing;
 |  | 
 | 
											
												
													
														|  | -      var wordSpacing = current.wordSpacing;
 |  | 
 | 
											
												
													
														|  | -      var fontDirection = current.fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var textHScale = current.textHScale * fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var glyphsLength = glyphs.length;
 |  | 
 | 
											
												
													
														|  | -      var vertical = font.vertical;
 |  | 
 | 
											
												
													
														|  | -      var spacingDir = vertical ? 1 : -1;
 |  | 
 | 
											
												
													
														|  | -      var defaultVMetrics = font.defaultVMetrics;
 |  | 
 | 
											
												
													
														|  | -      var widthAdvanceScale = fontSize * current.fontMatrix[0];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var simpleFillText =
 |  | 
 | 
											
												
													
														|  | -        current.textRenderingMode === TextRenderingMode.FILL &&
 |  | 
 | 
											
												
													
														|  | -        !font.disableFontFace;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
 | 
											
												
													
														|  | 
 |  | +            scaleX: scaleX, scaleY: scaleY};
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  return createMeshCanvas;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx.save();
 |  | 
 | 
											
												
													
														|  | -      ctx.transform.apply(ctx, current.textMatrix);
 |  | 
 | 
											
												
													
														|  | -      ctx.translate(current.x, current.y + current.textRise);
 |  | 
 | 
											
												
													
														|  | 
 |  | +ShadingIRs.Mesh = {
 | 
											
												
													
														|  | 
 |  | +  fromIR: function Mesh_fromIR(raw) {
 | 
											
												
													
														|  | 
 |  | +    //var type = raw[1];
 | 
											
												
													
														|  | 
 |  | +    var coords = raw[2];
 | 
											
												
													
														|  | 
 |  | +    var colors = raw[3];
 | 
											
												
													
														|  | 
 |  | +    var figures = raw[4];
 | 
											
												
													
														|  | 
 |  | +    var bounds = raw[5];
 | 
											
												
													
														|  | 
 |  | +    var matrix = raw[6];
 | 
											
												
													
														|  | 
 |  | +    //var bbox = raw[7];
 | 
											
												
													
														|  | 
 |  | +    var background = raw[8];
 | 
											
												
													
														|  | 
 |  | +    return {
 | 
											
												
													
														|  | 
 |  | +      type: 'Pattern',
 | 
											
												
													
														|  | 
 |  | +      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
 | 
											
												
													
														|  | 
 |  | +        var scale;
 | 
											
												
													
														|  | 
 |  | +        if (shadingFill) {
 | 
											
												
													
														|  | 
 |  | +          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          // Obtain scale from matrix and current transformation matrix.
 | 
											
												
													
														|  | 
 |  | +          scale = Util.singularValueDecompose2dScale(owner.baseTransform);
 | 
											
												
													
														|  | 
 |  | +          if (matrix) {
 | 
											
												
													
														|  | 
 |  | +            var matrixScale = Util.singularValueDecompose2dScale(matrix);
 | 
											
												
													
														|  | 
 |  | +            scale = [scale[0] * matrixScale[0],
 | 
											
												
													
														|  | 
 |  | +                     scale[1] * matrixScale[1]];
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (fontDirection > 0) {
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(textHScale, -1);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(textHScale, 1);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var lineWidth = current.lineWidth;
 |  | 
 | 
											
												
													
														|  | -      var scale = current.textMatrixScale;
 |  | 
 | 
											
												
													
														|  | -      if (scale === 0 || lineWidth === 0) {
 |  | 
 | 
											
												
													
														|  | -        var fillStrokeMode = current.textRenderingMode &
 |  | 
 | 
											
												
													
														|  | -          TextRenderingMode.FILL_STROKE_MASK;
 |  | 
 | 
											
												
													
														|  | -        if (fillStrokeMode === TextRenderingMode.STROKE ||
 |  | 
 | 
											
												
													
														|  | -            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 |  | 
 | 
											
												
													
														|  | -          this.cachedGetSinglePixelWidth = null;
 |  | 
 | 
											
												
													
														|  | -          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Rasterizing on the main thread since sending/queue large canvases
 | 
											
												
													
														|  | 
 |  | +        // might cause OOM.
 | 
											
												
													
														|  | 
 |  | +        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
 | 
											
												
													
														|  | 
 |  | +          colors, figures, shadingFill ? null : background,
 | 
											
												
													
														|  | 
 |  | +          owner.cachedCanvases);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (!shadingFill) {
 | 
											
												
													
														|  | 
 |  | +          ctx.setTransform.apply(ctx, owner.baseTransform);
 | 
											
												
													
														|  | 
 |  | +          if (matrix) {
 | 
											
												
													
														|  | 
 |  | +            ctx.transform.apply(ctx, matrix);
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        lineWidth /= scale;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (fontSizeScale !== 1.0) {
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(fontSizeScale, fontSizeScale);
 |  | 
 | 
											
												
													
														|  | -        lineWidth /= fontSizeScale;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        ctx.translate(temporaryPatternCanvas.offsetX,
 | 
											
												
													
														|  | 
 |  | +                      temporaryPatternCanvas.offsetY);
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(temporaryPatternCanvas.scaleX,
 | 
											
												
													
														|  | 
 |  | +                  temporaryPatternCanvas.scaleY);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx.lineWidth = lineWidth;
 |  | 
 | 
											
												
													
														|  | 
 |  | +ShadingIRs.Dummy = {
 | 
											
												
													
														|  | 
 |  | +  fromIR: function Dummy_fromIR() {
 | 
											
												
													
														|  | 
 |  | +    return {
 | 
											
												
													
														|  | 
 |  | +      type: 'Pattern',
 | 
											
												
													
														|  | 
 |  | +      getPattern: function Dummy_fromIR_getPattern() {
 | 
											
												
													
														|  | 
 |  | +        return 'hotpink';
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var x = 0, i;
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < glyphsLength; ++i) {
 |  | 
 | 
											
												
													
														|  | -        var glyph = glyphs[i];
 |  | 
 | 
											
												
													
														|  | -        if (isNum(glyph)) {
 |  | 
 | 
											
												
													
														|  | -          x += spacingDir * glyph * fontSize / 1000;
 |  | 
 | 
											
												
													
														|  | -          continue;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +function getShadingPatternFromIR(raw) {
 | 
											
												
													
														|  | 
 |  | +  var shadingIR = ShadingIRs[raw[0]];
 | 
											
												
													
														|  | 
 |  | +  if (!shadingIR) {
 | 
											
												
													
														|  | 
 |  | +    error('Unknown IR type: ' + raw[0]);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  return shadingIR.fromIR(raw);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var restoreNeeded = false;
 |  | 
 | 
											
												
													
														|  | -        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
 |  | 
 | 
											
												
													
														|  | -        var character = glyph.fontChar;
 |  | 
 | 
											
												
													
														|  | -        var accent = glyph.accent;
 |  | 
 | 
											
												
													
														|  | -        var scaledX, scaledY, scaledAccentX, scaledAccentY;
 |  | 
 | 
											
												
													
														|  | -        var width = glyph.width;
 |  | 
 | 
											
												
													
														|  | -        if (vertical) {
 |  | 
 | 
											
												
													
														|  | -          var vmetric, vx, vy;
 |  | 
 | 
											
												
													
														|  | -          vmetric = glyph.vmetric || defaultVMetrics;
 |  | 
 | 
											
												
													
														|  | -          vx = glyph.vmetric ? vmetric[1] : width * 0.5;
 |  | 
 | 
											
												
													
														|  | -          vx = -vx * widthAdvanceScale;
 |  | 
 | 
											
												
													
														|  | -          vy = vmetric[2] * widthAdvanceScale;
 |  | 
 | 
											
												
													
														|  | 
 |  | +var TilingPattern = (function TilingPatternClosure() {
 | 
											
												
													
														|  | 
 |  | +  var PaintType = {
 | 
											
												
													
														|  | 
 |  | +    COLORED: 1,
 | 
											
												
													
														|  | 
 |  | +    UNCOLORED: 2
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -          width = vmetric ? -vmetric[0] : width;
 |  | 
 | 
											
												
													
														|  | -          scaledX = vx / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -          scaledY = (x + vy) / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          scaledX = x / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -          scaledY = 0;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (font.remeasure && width > 0) {
 |  | 
 | 
											
												
													
														|  | -          // Some standard fonts may not have the exact width: rescale per
 |  | 
 | 
											
												
													
														|  | -          // character if measured width is greater than expected glyph width
 |  | 
 | 
											
												
													
														|  | -          // and subpixel-aa is enabled, otherwise just center the glyph.
 |  | 
 | 
											
												
													
														|  | -          var measuredWidth = ctx.measureText(character).width * 1000 /
 |  | 
 | 
											
												
													
														|  | -            fontSize * fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
 |  | 
 | 
											
												
													
														|  | -            var characterScaleX = width / measuredWidth;
 |  | 
 | 
											
												
													
														|  | -            restoreNeeded = true;
 |  | 
 | 
											
												
													
														|  | -            ctx.save();
 |  | 
 | 
											
												
													
														|  | -            ctx.scale(characterScaleX, 1);
 |  | 
 | 
											
												
													
														|  | -            scaledX /= characterScaleX;
 |  | 
 | 
											
												
													
														|  | -          } else if (width !== measuredWidth) {
 |  | 
 | 
											
												
													
														|  | -            scaledX += (width - measuredWidth) / 2000 *
 |  | 
 | 
											
												
													
														|  | -              fontSize / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
 | 
											
												
													
														|  | 
 |  | +    this.operatorList = IR[2];
 | 
											
												
													
														|  | 
 |  | +    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
 | 
											
												
													
														|  | 
 |  | +    this.bbox = IR[4];
 | 
											
												
													
														|  | 
 |  | +    this.xstep = IR[5];
 | 
											
												
													
														|  | 
 |  | +    this.ystep = IR[6];
 | 
											
												
													
														|  | 
 |  | +    this.paintType = IR[7];
 | 
											
												
													
														|  | 
 |  | +    this.tilingType = IR[8];
 | 
											
												
													
														|  | 
 |  | +    this.color = color;
 | 
											
												
													
														|  | 
 |  | +    this.canvasGraphicsFactory = canvasGraphicsFactory;
 | 
											
												
													
														|  | 
 |  | +    this.baseTransform = baseTransform;
 | 
											
												
													
														|  | 
 |  | +    this.type = 'Pattern';
 | 
											
												
													
														|  | 
 |  | +    this.ctx = ctx;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (simpleFillText && !accent) {
 |  | 
 | 
											
												
													
														|  | -          // common case
 |  | 
 | 
											
												
													
														|  | -          ctx.fillText(character, scaledX, scaledY);
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          this.paintChar(character, scaledX, scaledY);
 |  | 
 | 
											
												
													
														|  | -          if (accent) {
 |  | 
 | 
											
												
													
														|  | -            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
 |  | 
 | 
											
												
													
														|  | -            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  TilingPattern.prototype = {
 | 
											
												
													
														|  | 
 |  | +    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
 | 
											
												
													
														|  | 
 |  | +      var operatorList = this.operatorList;
 | 
											
												
													
														|  | 
 |  | +      var bbox = this.bbox;
 | 
											
												
													
														|  | 
 |  | +      var xstep = this.xstep;
 | 
											
												
													
														|  | 
 |  | +      var ystep = this.ystep;
 | 
											
												
													
														|  | 
 |  | +      var paintType = this.paintType;
 | 
											
												
													
														|  | 
 |  | +      var tilingType = this.tilingType;
 | 
											
												
													
														|  | 
 |  | +      var color = this.color;
 | 
											
												
													
														|  | 
 |  | +      var canvasGraphicsFactory = this.canvasGraphicsFactory;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var charWidth = width * widthAdvanceScale + spacing * fontDirection;
 |  | 
 | 
											
												
													
														|  | -        x += charWidth;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      info('TilingType: ' + tilingType);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (restoreNeeded) {
 |  | 
 | 
											
												
													
														|  | -          ctx.restore();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (vertical) {
 |  | 
 | 
											
												
													
														|  | -        current.y -= x * textHScale;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        current.x += x * textHScale;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    showType3Text: function CanvasGraphics_showType3Text(glyphs) {
 |  | 
 | 
											
												
													
														|  | -      // Type3 fonts - each glyph is a "mini-PDF"
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var font = current.font;
 |  | 
 | 
											
												
													
														|  | -      var fontSize = current.fontSize;
 |  | 
 | 
											
												
													
														|  | -      var fontDirection = current.fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var spacingDir = font.vertical ? 1 : -1;
 |  | 
 | 
											
												
													
														|  | -      var charSpacing = current.charSpacing;
 |  | 
 | 
											
												
													
														|  | -      var wordSpacing = current.wordSpacing;
 |  | 
 | 
											
												
													
														|  | -      var textHScale = current.textHScale * fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -      var glyphsLength = glyphs.length;
 |  | 
 | 
											
												
													
														|  | -      var isTextInvisible =
 |  | 
 | 
											
												
													
														|  | -        current.textRenderingMode === TextRenderingMode.INVISIBLE;
 |  | 
 | 
											
												
													
														|  | -      var i, glyph, width, spacingLength;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var topLeft = [x0, y0];
 | 
											
												
													
														|  | 
 |  | +      // we want the canvas to be as large as the step size
 | 
											
												
													
														|  | 
 |  | +      var botRight = [x0 + xstep, y0 + ystep];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isTextInvisible || fontSize === 0) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this.cachedGetSinglePixelWidth = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var width = botRight[0] - topLeft[0];
 | 
											
												
													
														|  | 
 |  | +      var height = botRight[1] - topLeft[1];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx.save();
 |  | 
 | 
											
												
													
														|  | -      ctx.transform.apply(ctx, current.textMatrix);
 |  | 
 | 
											
												
													
														|  | -      ctx.translate(current.x, current.y);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Obtain scale from matrix and current transformation matrix.
 | 
											
												
													
														|  | 
 |  | +      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
 | 
											
												
													
														|  | 
 |  | +      var curMatrixScale = Util.singularValueDecompose2dScale(
 | 
											
												
													
														|  | 
 |  | +        this.baseTransform);
 | 
											
												
													
														|  | 
 |  | +      var combinedScale = [matrixScale[0] * curMatrixScale[0],
 | 
											
												
													
														|  | 
 |  | +        matrixScale[1] * curMatrixScale[1]];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx.scale(textHScale, fontDirection);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // MAX_PATTERN_SIZE is used to avoid OOM situation.
 | 
											
												
													
														|  | 
 |  | +      // Use width and height values that are as close as possible to the end
 | 
											
												
													
														|  | 
 |  | +      // result when the pattern is used. Too low value makes the pattern look
 | 
											
												
													
														|  | 
 |  | +      // blurry. Too large value makes it look too crispy.
 | 
											
												
													
														|  | 
 |  | +      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),
 | 
											
												
													
														|  | 
 |  | +        MAX_PATTERN_SIZE);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      for (i = 0; i < glyphsLength; ++i) {
 |  | 
 | 
											
												
													
														|  | -        glyph = glyphs[i];
 |  | 
 | 
											
												
													
														|  | -        if (isNum(glyph)) {
 |  | 
 | 
											
												
													
														|  | -          spacingLength = spacingDir * glyph * fontSize / 1000;
 |  | 
 | 
											
												
													
														|  | -          this.ctx.translate(spacingLength, 0);
 |  | 
 | 
											
												
													
														|  | -          current.x += spacingLength * textHScale;
 |  | 
 | 
											
												
													
														|  | -          continue;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
 | 
											
												
													
														|  | 
 |  | +        MAX_PATTERN_SIZE);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
 |  | 
 | 
											
												
													
														|  | -        var operatorList = font.charProcOperatorList[glyph.operatorListId];
 |  | 
 | 
											
												
													
														|  | -        if (!operatorList) {
 |  | 
 | 
											
												
													
														|  | -          warn('Type3 character \"' + glyph.operatorListId +
 |  | 
 | 
											
												
													
														|  | -               '\" is not available');
 |  | 
 | 
											
												
													
														|  | -          continue;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        this.processingType3 = glyph;
 |  | 
 | 
											
												
													
														|  | -        this.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(fontSize, fontSize);
 |  | 
 | 
											
												
													
														|  | -        ctx.transform.apply(ctx, fontMatrix);
 |  | 
 | 
											
												
													
														|  | -        this.executeOperatorList(operatorList);
 |  | 
 | 
											
												
													
														|  | -        this.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern',
 | 
											
												
													
														|  | 
 |  | +        width, height, true);
 | 
											
												
													
														|  | 
 |  | +      var tmpCtx = tmpCanvas.context;
 | 
											
												
													
														|  | 
 |  | +      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
 | 
											
												
													
														|  | 
 |  | +      graphics.groupLevel = owner.groupLevel;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
 |  | 
 | 
											
												
													
														|  | -        width = transformed[0] * fontSize + spacing;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        ctx.translate(width, 0);
 |  | 
 | 
											
												
													
														|  | -        current.x += width * textHScale;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      this.processingType3 = null;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.setScale(width, height, xstep, ystep);
 | 
											
												
													
														|  | 
 |  | +      this.transformToScale(graphics);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Type3 fonts
 |  | 
 | 
											
												
													
														|  | -    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
 |  | 
 | 
											
												
													
														|  | -      // We can safely ignore this since the width should be the same
 |  | 
 | 
											
												
													
														|  | -      // as the width in the Widths array.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
 |  | 
 | 
											
												
													
														|  | -                                                                        yWidth,
 |  | 
 | 
											
												
													
														|  | -                                                                        llx,
 |  | 
 | 
											
												
													
														|  | -                                                                        lly,
 |  | 
 | 
											
												
													
														|  | -                                                                        urx,
 |  | 
 | 
											
												
													
														|  | -                                                                        ury) {
 |  | 
 | 
											
												
													
														|  | -      // TODO According to the spec we're also suppose to ignore any operators
 |  | 
 | 
											
												
													
														|  | -      // that set color or include images while processing this type3 font.
 |  | 
 | 
											
												
													
														|  | -      this.ctx.rect(llx, lly, urx - llx, ury - lly);
 |  | 
 | 
											
												
													
														|  | -      this.clip();
 |  | 
 | 
											
												
													
														|  | -      this.endPath();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // transform coordinates to pattern space
 | 
											
												
													
														|  | 
 |  | +      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
 | 
											
												
													
														|  | 
 |  | +      graphics.transform.apply(graphics, tmpTranslate);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Color
 |  | 
 | 
											
												
													
														|  | -    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
 |  | 
 | 
											
												
													
														|  | -      var pattern;
 |  | 
 | 
											
												
													
														|  | -      if (IR[0] === 'TilingPattern') {
 |  | 
 | 
											
												
													
														|  | -        var color = IR[1];
 |  | 
 | 
											
												
													
														|  | -        var baseTransform = this.baseTransform ||
 |  | 
 | 
											
												
													
														|  | -                            this.ctx.mozCurrentTransform.slice();
 |  | 
 | 
											
												
													
														|  | -        var self = this;
 |  | 
 | 
											
												
													
														|  | -        var canvasGraphicsFactory = {
 |  | 
 | 
											
												
													
														|  | -          createCanvasGraphics: function (ctx) {
 |  | 
 | 
											
												
													
														|  | -            return new CanvasGraphics(ctx, self.commonObjs, self.objs);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        };
 |  | 
 | 
											
												
													
														|  | -        pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory,
 |  | 
 | 
											
												
													
														|  | -                                    baseTransform);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        pattern = getShadingPatternFromIR(IR);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      return pattern;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
 |  | 
 | 
											
												
													
														|  | -      this.current.strokeColor = this.getColorN_Pattern(arguments);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      graphics.executeOperatorList(operatorList);
 | 
											
												
													
														|  | 
 |  | +      return tmpCanvas.canvas;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
 |  | 
 | 
											
												
													
														|  | -      this.current.fillColor = this.getColorN_Pattern(arguments);
 |  | 
 | 
											
												
													
														|  | -      this.current.patternFill = true;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
 | 
											
												
													
														|  | 
 |  | +      this.scale = [width / xstep, height / ystep];
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
 |  | 
 | 
											
												
													
														|  | -      var color = Util.makeCssRgb(r, g, b);
 |  | 
 | 
											
												
													
														|  | -      this.ctx.strokeStyle = color;
 |  | 
 | 
											
												
													
														|  | -      this.current.strokeColor = color;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    transformToScale: function TilingPattern_transformToScale(graphics) {
 | 
											
												
													
														|  | 
 |  | +      var scale = this.scale;
 | 
											
												
													
														|  | 
 |  | +      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
 | 
											
												
													
														|  | 
 |  | +      graphics.transform.apply(graphics, tmpScale);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
 |  | 
 | 
											
												
													
														|  | -      var color = Util.makeCssRgb(r, g, b);
 |  | 
 | 
											
												
													
														|  | -      this.ctx.fillStyle = color;
 |  | 
 | 
											
												
													
														|  | -      this.current.fillColor = color;
 |  | 
 | 
											
												
													
														|  | -      this.current.patternFill = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    scaleToContext: function TilingPattern_scaleToContext() {
 | 
											
												
													
														|  | 
 |  | +      var scale = this.scale;
 | 
											
												
													
														|  | 
 |  | +      this.ctx.scale(1 / scale[0], 1 / scale[1]);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
 | 
											
												
													
														|  | 
 |  | +      if (bbox && isArray(bbox) && bbox.length === 4) {
 | 
											
												
													
														|  | 
 |  | +        var bboxWidth = x1 - x0;
 | 
											
												
													
														|  | 
 |  | +        var bboxHeight = y1 - y0;
 | 
											
												
													
														|  | 
 |  | +        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
 | 
											
												
													
														|  | 
 |  | +        graphics.clip();
 | 
											
												
													
														|  | 
 |  | +        graphics.endPath();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      var pattern = getShadingPatternFromIR(patternIR);
 |  | 
 | 
											
												
													
														|  | -      ctx.fillStyle = pattern.getPattern(ctx, this, true);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setFillAndStrokeStyleToContext:
 | 
											
												
													
														|  | 
 |  | +      function setFillAndStrokeStyleToContext(context, paintType, color) {
 | 
											
												
													
														|  | 
 |  | +        switch (paintType) {
 | 
											
												
													
														|  | 
 |  | +          case PaintType.COLORED:
 | 
											
												
													
														|  | 
 |  | +            var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +            context.fillStyle = ctx.fillStyle;
 | 
											
												
													
														|  | 
 |  | +            context.strokeStyle = ctx.strokeStyle;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case PaintType.UNCOLORED:
 | 
											
												
													
														|  | 
 |  | +            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);
 | 
											
												
													
														|  | 
 |  | +            context.fillStyle = cssColor;
 | 
											
												
													
														|  | 
 |  | +            context.strokeStyle = cssColor;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          default:
 | 
											
												
													
														|  | 
 |  | +            error('Unsupported paint type: ' + paintType);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var inv = ctx.mozCurrentTransformInverse;
 |  | 
 | 
											
												
													
														|  | -      if (inv) {
 |  | 
 | 
											
												
													
														|  | -        var canvas = ctx.canvas;
 |  | 
 | 
											
												
													
														|  | -        var width = canvas.width;
 |  | 
 | 
											
												
													
														|  | -        var height = canvas.height;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getPattern: function TilingPattern_getPattern(ctx, owner) {
 | 
											
												
													
														|  | 
 |  | +      var temporaryPatternCanvas = this.createPatternCanvas(owner);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var bl = Util.applyTransform([0, 0], inv);
 |  | 
 | 
											
												
													
														|  | -        var br = Util.applyTransform([0, height], inv);
 |  | 
 | 
											
												
													
														|  | -        var ul = Util.applyTransform([width, 0], inv);
 |  | 
 | 
											
												
													
														|  | -        var ur = Util.applyTransform([width, height], inv);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      ctx.setTransform.apply(ctx, this.baseTransform);
 | 
											
												
													
														|  | 
 |  | +      ctx.transform.apply(ctx, this.matrix);
 | 
											
												
													
														|  | 
 |  | +      this.scaleToContext();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
 |  | 
 | 
											
												
													
														|  | -        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
 |  | 
 | 
											
												
													
														|  | -        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
 |  | 
 | 
											
												
													
														|  | -        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return ctx.createPattern(temporaryPatternCanvas, 'repeat');
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        // HACK to draw the gradient onto an infinite rectangle.
 |  | 
 | 
											
												
													
														|  | -        // PDF gradients are drawn across the entire image while
 |  | 
 | 
											
												
													
														|  | -        // Canvas only allows gradients to be drawn in a rectangle
 |  | 
 | 
											
												
													
														|  | -        // The following bug should allow us to remove this.
 |  | 
 | 
											
												
													
														|  | -        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return TilingPattern;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +exports.getShadingPatternFromIR = getShadingPatternFromIR;
 | 
											
												
													
														|  | 
 |  | +exports.TilingPattern = TilingPattern;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Images
 |  | 
 | 
											
												
													
														|  | -    beginInlineImage: function CanvasGraphics_beginInlineImage() {
 |  | 
 | 
											
												
													
														|  | -      error('Should not call beginInlineImage');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    beginImageData: function CanvasGraphics_beginImageData() {
 |  | 
 | 
											
												
													
														|  | -      error('Should not call beginImageData');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil,
 | 
											
												
													
														|  | 
 |  | +      root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedUtil, displayPatternHelper, displayWebGL) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
 |  | 
 | 
											
												
													
														|  | -                                                                        bbox) {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      this.baseTransformStack.push(this.baseTransform);
 |  | 
 | 
											
												
													
														|  | 
 |  | +var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +var ImageKind = sharedUtil.ImageKind;
 | 
											
												
													
														|  | 
 |  | +var OPS = sharedUtil.OPS;
 | 
											
												
													
														|  | 
 |  | +var TextRenderingMode = sharedUtil.TextRenderingMode;
 | 
											
												
													
														|  | 
 |  | +var Uint32ArrayView = sharedUtil.Uint32ArrayView;
 | 
											
												
													
														|  | 
 |  | +var Util = sharedUtil.Util;
 | 
											
												
													
														|  | 
 |  | +var assert = sharedUtil.assert;
 | 
											
												
													
														|  | 
 |  | +var info = sharedUtil.info;
 | 
											
												
													
														|  | 
 |  | +var isNum = sharedUtil.isNum;
 | 
											
												
													
														|  | 
 |  | +var isArray = sharedUtil.isArray;
 | 
											
												
													
														|  | 
 |  | +var error = sharedUtil.error;
 | 
											
												
													
														|  | 
 |  | +var shadow = sharedUtil.shadow;
 | 
											
												
													
														|  | 
 |  | +var warn = sharedUtil.warn;
 | 
											
												
													
														|  | 
 |  | +var TilingPattern = displayPatternHelper.TilingPattern;
 | 
											
												
													
														|  | 
 |  | +var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR;
 | 
											
												
													
														|  | 
 |  | +var WebGLUtils = displayWebGL.WebGLUtils;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isArray(matrix) && 6 === matrix.length) {
 |  | 
 | 
											
												
													
														|  | -        this.transform.apply(this, matrix);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +// <canvas> contexts store most of the state we need natively.
 | 
											
												
													
														|  | 
 |  | +// However, PDF needs a bit more state, which we store here.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.baseTransform = this.ctx.mozCurrentTransform;
 |  | 
 | 
											
												
													
														|  | 
 |  | +// Minimal font size that would be used during canvas fillText operations.
 | 
											
												
													
														|  | 
 |  | +var MIN_FONT_SIZE = 16;
 | 
											
												
													
														|  | 
 |  | +// Maximum font size that would be used during canvas fillText operations.
 | 
											
												
													
														|  | 
 |  | +var MAX_FONT_SIZE = 100;
 | 
											
												
													
														|  | 
 |  | +var MAX_GROUP_SIZE = 4096;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isArray(bbox) && 4 === bbox.length) {
 |  | 
 | 
											
												
													
														|  | -        var width = bbox[2] - bbox[0];
 |  | 
 | 
											
												
													
														|  | -        var height = bbox[3] - bbox[1];
 |  | 
 | 
											
												
													
														|  | -        this.ctx.rect(bbox[0], bbox[1], width, height);
 |  | 
 | 
											
												
													
														|  | -        this.clip();
 |  | 
 | 
											
												
													
														|  | -        this.endPath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +// Heuristic value used when enforcing minimum line widths.
 | 
											
												
													
														|  | 
 |  | +var MIN_WIDTH_FACTOR = 0.65;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -      this.baseTransform = this.baseTransformStack.pop();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +var COMPILE_TYPE3_GLYPHS = true;
 | 
											
												
													
														|  | 
 |  | +var MAX_SIZE_TO_COMPILE = 1000;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginGroup: function CanvasGraphics_beginGroup(group) {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      var currentCtx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      // TODO non-isolated groups - according to Rik at adobe non-isolated
 |  | 
 | 
											
												
													
														|  | -      // group results aren't usually that different and they even have tools
 |  | 
 | 
											
												
													
														|  | -      // that ignore this setting. Notes from Rik on implmenting:
 |  | 
 | 
											
												
													
														|  | -      // - When you encounter an transparency group, create a new canvas with
 |  | 
 | 
											
												
													
														|  | -      // the dimensions of the bbox
 |  | 
 | 
											
												
													
														|  | -      // - copy the content from the previous canvas to the new canvas
 |  | 
 | 
											
												
													
														|  | -      // - draw as usual
 |  | 
 | 
											
												
													
														|  | -      // - remove the backdrop alpha:
 |  | 
 | 
											
												
													
														|  | -      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
 |  | 
 | 
											
												
													
														|  | -      // value of your transparency group and 'alphaBackdrop' the alpha of the
 |  | 
 | 
											
												
													
														|  | -      // backdrop
 |  | 
 | 
											
												
													
														|  | -      // - remove background color:
 |  | 
 | 
											
												
													
														|  | -      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
 |  | 
 | 
											
												
													
														|  | -      if (!group.isolated) {
 |  | 
 | 
											
												
													
														|  | -        info('TODO: Support non-isolated groups.');
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var FULL_CHUNK_HEIGHT = 16;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // TODO knockout - supposedly possible with the clever use of compositing
 |  | 
 | 
											
												
													
														|  | -      // modes.
 |  | 
 | 
											
												
													
														|  | -      if (group.knockout) {
 |  | 
 | 
											
												
													
														|  | -        warn('Knockout groups not supported.');
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +function createScratchCanvas(width, height) {
 | 
											
												
													
														|  | 
 |  | +  var canvas = document.createElement('canvas');
 | 
											
												
													
														|  | 
 |  | +  canvas.width = width;
 | 
											
												
													
														|  | 
 |  | +  canvas.height = height;
 | 
											
												
													
														|  | 
 |  | +  return canvas;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var currentTransform = currentCtx.mozCurrentTransform;
 |  | 
 | 
											
												
													
														|  | -      if (group.matrix) {
 |  | 
 | 
											
												
													
														|  | -        currentCtx.transform.apply(currentCtx, group.matrix);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      assert(group.bbox, 'Bounding box is required.');
 |  | 
 | 
											
												
													
														|  | 
 |  | +function addContextCurrentTransform(ctx) {
 | 
											
												
													
														|  | 
 |  | +  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.
 | 
											
												
													
														|  | 
 |  | +  if (!ctx.mozCurrentTransform) {
 | 
											
												
													
														|  | 
 |  | +    ctx._originalSave = ctx.save;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalRestore = ctx.restore;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalRotate = ctx.rotate;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalScale = ctx.scale;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalTranslate = ctx.translate;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalTransform = ctx.transform;
 | 
											
												
													
														|  | 
 |  | +    ctx._originalSetTransform = ctx.setTransform;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Based on the current transform figure out how big the bounding box
 |  | 
 | 
											
												
													
														|  | -      // will actually be.
 |  | 
 | 
											
												
													
														|  | -      var bounds = Util.getAxialAlignedBoundingBox(
 |  | 
 | 
											
												
													
														|  | -                    group.bbox,
 |  | 
 | 
											
												
													
														|  | -                    currentCtx.mozCurrentTransform);
 |  | 
 | 
											
												
													
														|  | -      // Clip the bounding box to the current canvas.
 |  | 
 | 
											
												
													
														|  | -      var canvasBounds = [0,
 |  | 
 | 
											
												
													
														|  | -                          0,
 |  | 
 | 
											
												
													
														|  | -                          currentCtx.canvas.width,
 |  | 
 | 
											
												
													
														|  | -                          currentCtx.canvas.height];
 |  | 
 | 
											
												
													
														|  | -      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
 |  | 
 | 
											
												
													
														|  | -      // Use ceil in case we're between sizes so we don't create canvas that is
 |  | 
 | 
											
												
													
														|  | -      // too small and make the canvas at least 1x1 pixels.
 |  | 
 | 
											
												
													
														|  | -      var offsetX = Math.floor(bounds[0]);
 |  | 
 | 
											
												
													
														|  | -      var offsetY = Math.floor(bounds[1]);
 |  | 
 | 
											
												
													
														|  | -      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
 |  | 
 | 
											
												
													
														|  | -      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
 |  | 
 | 
											
												
													
														|  | -      var scaleX = 1, scaleY = 1;
 |  | 
 | 
											
												
													
														|  | -      if (drawnWidth > MAX_GROUP_SIZE) {
 |  | 
 | 
											
												
													
														|  | -        scaleX = drawnWidth / MAX_GROUP_SIZE;
 |  | 
 | 
											
												
													
														|  | -        drawnWidth = MAX_GROUP_SIZE;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (drawnHeight > MAX_GROUP_SIZE) {
 |  | 
 | 
											
												
													
														|  | -        scaleY = drawnHeight / MAX_GROUP_SIZE;
 |  | 
 | 
											
												
													
														|  | -        drawnHeight = MAX_GROUP_SIZE;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
 | 
											
												
													
														|  | 
 |  | +    ctx._transformStack = [];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var cacheId = 'groupAt' + this.groupLevel;
 |  | 
 | 
											
												
													
														|  | -      if (group.smask) {
 |  | 
 | 
											
												
													
														|  | -        // Using two cache entries is case if masks are used one after another.
 |  | 
 | 
											
												
													
														|  | -        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    Object.defineProperty(ctx, 'mozCurrentTransform', {
 | 
											
												
													
														|  | 
 |  | +      get: function getCurrentTransform() {
 | 
											
												
													
														|  | 
 |  | +        return this._transformMatrix;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      var scratchCanvas = this.cachedCanvases.getCanvas(
 |  | 
 | 
											
												
													
														|  | -        cacheId, drawnWidth, drawnHeight, true);
 |  | 
 | 
											
												
													
														|  | -      var groupCtx = scratchCanvas.context;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Since we created a new canvas that is just the size of the bounding box
 |  | 
 | 
											
												
													
														|  | -      // we have to translate the group ctx.
 |  | 
 | 
											
												
													
														|  | -      groupCtx.scale(1 / scaleX, 1 / scaleY);
 |  | 
 | 
											
												
													
														|  | -      groupCtx.translate(-offsetX, -offsetY);
 |  | 
 | 
											
												
													
														|  | -      groupCtx.transform.apply(groupCtx, currentTransform);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
 | 
											
												
													
														|  | 
 |  | +      get: function getCurrentTransformInverse() {
 | 
											
												
													
														|  | 
 |  | +        // Calculation done using WolframAlpha:
 | 
											
												
													
														|  | 
 |  | +        // http://www.wolframalpha.com/input/?
 | 
											
												
													
														|  | 
 |  | +        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (group.smask) {
 |  | 
 | 
											
												
													
														|  | -        // Saving state and cached mask to be used in setGState.
 |  | 
 | 
											
												
													
														|  | -        this.smaskStack.push({
 |  | 
 | 
											
												
													
														|  | -          canvas: scratchCanvas.canvas,
 |  | 
 | 
											
												
													
														|  | -          context: groupCtx,
 |  | 
 | 
											
												
													
														|  | -          offsetX: offsetX,
 |  | 
 | 
											
												
													
														|  | -          offsetY: offsetY,
 |  | 
 | 
											
												
													
														|  | -          scaleX: scaleX,
 |  | 
 | 
											
												
													
														|  | -          scaleY: scaleY,
 |  | 
 | 
											
												
													
														|  | -          subtype: group.smask.subtype,
 |  | 
 | 
											
												
													
														|  | -          backdrop: group.smask.backdrop,
 |  | 
 | 
											
												
													
														|  | -          transferMap: group.smask.transferMap || null
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        // Setup the current ctx so when the group is popped we draw it at the
 |  | 
 | 
											
												
													
														|  | -        // right location.
 |  | 
 | 
											
												
													
														|  | -        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
 |  | 
 | 
											
												
													
														|  | -        currentCtx.translate(offsetX, offsetY);
 |  | 
 | 
											
												
													
														|  | -        currentCtx.scale(scaleX, scaleY);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      // The transparency group inherits all off the current graphics state
 |  | 
 | 
											
												
													
														|  | -      // except the blend mode, soft mask, and alpha constants.
 |  | 
 | 
											
												
													
														|  | -      copyCtxState(currentCtx, groupCtx);
 |  | 
 | 
											
												
													
														|  | -      this.ctx = groupCtx;
 |  | 
 | 
											
												
													
														|  | -      this.setGState([
 |  | 
 | 
											
												
													
														|  | -        ['BM', 'Normal'],
 |  | 
 | 
											
												
													
														|  | -        ['ca', 1],
 |  | 
 | 
											
												
													
														|  | -        ['CA', 1]
 |  | 
 | 
											
												
													
														|  | -      ]);
 |  | 
 | 
											
												
													
														|  | -      this.groupStack.push(currentCtx);
 |  | 
 | 
											
												
													
														|  | -      this.groupLevel++;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var m = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endGroup: function CanvasGraphics_endGroup(group) {
 |  | 
 | 
											
												
													
														|  | -      this.groupLevel--;
 |  | 
 | 
											
												
													
														|  | -      var groupCtx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      this.ctx = this.groupStack.pop();
 |  | 
 | 
											
												
													
														|  | -      // Turn off image smoothing to avoid sub pixel interpolation which can
 |  | 
 | 
											
												
													
														|  | -      // look kind of blurry for some pdfs.
 |  | 
 | 
											
												
													
														|  | -      if (this.ctx.imageSmoothingEnabled !== undefined) {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.imageSmoothingEnabled = false;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.mozImageSmoothingEnabled = false;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (group.smask) {
 |  | 
 | 
											
												
													
														|  | -        this.tempSMask = this.smaskStack.pop();
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.drawImage(groupCtx.canvas, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var ad_bc = a * d - b * c;
 | 
											
												
													
														|  | 
 |  | +        var bc_ad = b * c - a * d;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        return [
 | 
											
												
													
														|  | 
 |  | +          d / ad_bc,
 | 
											
												
													
														|  | 
 |  | +          b / bc_ad,
 | 
											
												
													
														|  | 
 |  | +          c / bc_ad,
 | 
											
												
													
														|  | 
 |  | +          a / ad_bc,
 | 
											
												
													
														|  | 
 |  | +          (d * e - c * f) / bc_ad,
 | 
											
												
													
														|  | 
 |  | +          (b * e - a * f) / ad_bc
 | 
											
												
													
														|  | 
 |  | +        ];
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginAnnotations: function CanvasGraphics_beginAnnotations() {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      this.current = new CanvasExtraState();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.save = function ctxSave() {
 | 
											
												
													
														|  | 
 |  | +      var old = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +      this._transformStack.push(old);
 | 
											
												
													
														|  | 
 |  | +      this._transformMatrix = old.slice(0, 6);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.baseTransform) {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.setTransform.apply(this.ctx, this.baseTransform);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this._originalSave();
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    ctx.restore = function ctxRestore() {
 | 
											
												
													
														|  | 
 |  | +      var prev = this._transformStack.pop();
 | 
											
												
													
														|  | 
 |  | +      if (prev) {
 | 
											
												
													
														|  | 
 |  | +        this._transformMatrix = prev;
 | 
											
												
													
														|  | 
 |  | +        this._originalRestore();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endAnnotations: function CanvasGraphics_endAnnotations() {
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.translate = function ctxTranslate(x, y) {
 | 
											
												
													
														|  | 
 |  | +      var m = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +      m[4] = m[0] * x + m[2] * y + m[4];
 | 
											
												
													
														|  | 
 |  | +      m[5] = m[1] * x + m[3] * y + m[5];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
 |  | 
 | 
											
												
													
														|  | -                                                             matrix) {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this._originalTranslate(x, y);
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isArray(rect) && 4 === rect.length) {
 |  | 
 | 
											
												
													
														|  | -        var width = rect[2] - rect[0];
 |  | 
 | 
											
												
													
														|  | -        var height = rect[3] - rect[1];
 |  | 
 | 
											
												
													
														|  | -        this.ctx.rect(rect[0], rect[1], width, height);
 |  | 
 | 
											
												
													
														|  | -        this.clip();
 |  | 
 | 
											
												
													
														|  | -        this.endPath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.scale = function ctxScale(x, y) {
 | 
											
												
													
														|  | 
 |  | +      var m = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +      m[0] = m[0] * x;
 | 
											
												
													
														|  | 
 |  | +      m[1] = m[1] * x;
 | 
											
												
													
														|  | 
 |  | +      m[2] = m[2] * y;
 | 
											
												
													
														|  | 
 |  | +      m[3] = m[3] * y;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.transform.apply(this, transform);
 |  | 
 | 
											
												
													
														|  | -      this.transform.apply(this, matrix);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this._originalScale(x, y);
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endAnnotation: function CanvasGraphics_endAnnotation() {
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      var m = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +      this._transformMatrix = [
 | 
											
												
													
														|  | 
 |  | +        m[0] * a + m[2] * b,
 | 
											
												
													
														|  | 
 |  | +        m[1] * a + m[3] * b,
 | 
											
												
													
														|  | 
 |  | +        m[0] * c + m[2] * d,
 | 
											
												
													
														|  | 
 |  | +        m[1] * c + m[3] * d,
 | 
											
												
													
														|  | 
 |  | +        m[0] * e + m[2] * f + m[4],
 | 
											
												
													
														|  | 
 |  | +        m[1] * e + m[3] * f + m[5]
 | 
											
												
													
														|  | 
 |  | +      ];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
 |  | 
 | 
											
												
													
														|  | -      var domImage = this.objs.get(objId);
 |  | 
 | 
											
												
													
														|  | -      if (!domImage) {
 |  | 
 | 
											
												
													
														|  | -        warn('Dependent image isn\'t ready yet');
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx._originalTransform(a, b, c, d, e, f);
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      this._transformMatrix = [a, b, c, d, e, f];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      // scale the image to the unit square
 |  | 
 | 
											
												
													
														|  | -      ctx.scale(1 / w, -1 / h);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx._originalSetTransform(a, b, c, d, e, f);
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
 |  | 
 | 
											
												
													
														|  | -                    0, -h, w, h);
 |  | 
 | 
											
												
													
														|  | -      if (this.imageLayer) {
 |  | 
 | 
											
												
													
														|  | -        var currentTransform = ctx.mozCurrentTransformInverse;
 |  | 
 | 
											
												
													
														|  | -        var position = this.getCanvasPosition(0, 0);
 |  | 
 | 
											
												
													
														|  | -        this.imageLayer.appendImage({
 |  | 
 | 
											
												
													
														|  | -          objId: objId,
 |  | 
 | 
											
												
													
														|  | -          left: position[0],
 |  | 
 | 
											
												
													
														|  | -          top: position[1],
 |  | 
 | 
											
												
													
														|  | -          width: w / currentTransform[0],
 |  | 
 | 
											
												
													
														|  | -          height: h / currentTransform[3]
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    ctx.rotate = function ctxRotate(angle) {
 | 
											
												
													
														|  | 
 |  | +      var cosValue = Math.cos(angle);
 | 
											
												
													
														|  | 
 |  | +      var sinValue = Math.sin(angle);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var width = img.width, height = img.height;
 |  | 
 | 
											
												
													
														|  | -      var fillColor = this.current.fillColor;
 |  | 
 | 
											
												
													
														|  | -      var isPatternFill = this.current.patternFill;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var m = this._transformMatrix;
 | 
											
												
													
														|  | 
 |  | +      this._transformMatrix = [
 | 
											
												
													
														|  | 
 |  | +        m[0] * cosValue + m[2] * sinValue,
 | 
											
												
													
														|  | 
 |  | +        m[1] * cosValue + m[3] * sinValue,
 | 
											
												
													
														|  | 
 |  | +        m[0] * (-sinValue) + m[2] * cosValue,
 | 
											
												
													
														|  | 
 |  | +        m[1] * (-sinValue) + m[3] * cosValue,
 | 
											
												
													
														|  | 
 |  | +        m[4],
 | 
											
												
													
														|  | 
 |  | +        m[5]
 | 
											
												
													
														|  | 
 |  | +      ];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var glyph = this.processingType3;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this._originalRotate(angle);
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
 |  | 
 | 
											
												
													
														|  | -        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
 |  | 
 | 
											
												
													
														|  | -          glyph.compiled =
 |  | 
 | 
											
												
													
														|  | -            compileType3Glyph({data: img.data, width: width, height: height});
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          glyph.compiled = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +var CachedCanvases = (function CachedCanvasesClosure() {
 | 
											
												
													
														|  | 
 |  | +  function CachedCanvases() {
 | 
											
												
													
														|  | 
 |  | +    this.cache = Object.create(null);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  CachedCanvases.prototype = {
 | 
											
												
													
														|  | 
 |  | +    getCanvas: function CachedCanvases_getCanvas(id, width, height,
 | 
											
												
													
														|  | 
 |  | +                                                 trackTransform) {
 | 
											
												
													
														|  | 
 |  | +      var canvasEntry;
 | 
											
												
													
														|  | 
 |  | +      if (this.cache[id] !== undefined) {
 | 
											
												
													
														|  | 
 |  | +        canvasEntry = this.cache[id];
 | 
											
												
													
														|  | 
 |  | +        canvasEntry.canvas.width = width;
 | 
											
												
													
														|  | 
 |  | +        canvasEntry.canvas.height = height;
 | 
											
												
													
														|  | 
 |  | +        // reset canvas transform for emulated mozCurrentTransform, if needed
 | 
											
												
													
														|  | 
 |  | +        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        var canvas = createScratchCanvas(width, height);
 | 
											
												
													
														|  | 
 |  | +        var ctx = canvas.getContext('2d');
 | 
											
												
													
														|  | 
 |  | +        if (trackTransform) {
 | 
											
												
													
														|  | 
 |  | +          addContextCurrentTransform(ctx);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | 
 |  | +        this.cache[id] = canvasEntry = {canvas: canvas, context: ctx};
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return canvasEntry;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    clear: function () {
 | 
											
												
													
														|  | 
 |  | +      for (var id in this.cache) {
 | 
											
												
													
														|  | 
 |  | +        var canvasEntry = this.cache[id];
 | 
											
												
													
														|  | 
 |  | +        // Zeroing the width and height causes Firefox to release graphics
 | 
											
												
													
														|  | 
 |  | +        // resources immediately, which can greatly reduce memory consumption.
 | 
											
												
													
														|  | 
 |  | +        canvasEntry.canvas.width = 0;
 | 
											
												
													
														|  | 
 |  | +        canvasEntry.canvas.height = 0;
 | 
											
												
													
														|  | 
 |  | +        delete this.cache[id];
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return CachedCanvases;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +function compileType3Glyph(imgData) {
 | 
											
												
													
														|  | 
 |  | +  var POINT_TO_PROCESS_LIMIT = 1000;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  var width = imgData.width, height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +  var i, j, j0, width1 = width + 1;
 | 
											
												
													
														|  | 
 |  | +  var points = new Uint8Array(width1 * (height + 1));
 | 
											
												
													
														|  | 
 |  | +  var POINT_TYPES =
 | 
											
												
													
														|  | 
 |  | +      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  // decodes bit-packed mask data
 | 
											
												
													
														|  | 
 |  | +  var lineSize = (width + 7) & ~7, data0 = imgData.data;
 | 
											
												
													
														|  | 
 |  | +  var data = new Uint8Array(lineSize * height), pos = 0, ii;
 | 
											
												
													
														|  | 
 |  | +  for (i = 0, ii = data0.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +    var mask = 128, elem = data0[i];
 | 
											
												
													
														|  | 
 |  | +    while (mask > 0) {
 | 
											
												
													
														|  | 
 |  | +      data[pos++] = (elem & mask) ? 0 : 255;
 | 
											
												
													
														|  | 
 |  | +      mask >>= 1;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (glyph && glyph.compiled) {
 |  | 
 | 
											
												
													
														|  | -        glyph.compiled(ctx);
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // finding iteresting points: every point is located between mask pixels,
 | 
											
												
													
														|  | 
 |  | +  // so there will be points of the (width + 1)x(height + 1) grid. Every point
 | 
											
												
													
														|  | 
 |  | +  // will have flags assigned based on neighboring mask pixels:
 | 
											
												
													
														|  | 
 |  | +  //   4 | 8
 | 
											
												
													
														|  | 
 |  | +  //   --P--
 | 
											
												
													
														|  | 
 |  | +  //   2 | 1
 | 
											
												
													
														|  | 
 |  | +  // We are interested only in points with the flags:
 | 
											
												
													
														|  | 
 |  | +  //   - outside corners: 1, 2, 4, 8;
 | 
											
												
													
														|  | 
 |  | +  //   - inside corners: 7, 11, 13, 14;
 | 
											
												
													
														|  | 
 |  | +  //   - and, intersections: 5, 10.
 | 
											
												
													
														|  | 
 |  | +  var count = 0;
 | 
											
												
													
														|  | 
 |  | +  pos = 0;
 | 
											
												
													
														|  | 
 |  | +  if (data[pos] !== 0) {
 | 
											
												
													
														|  | 
 |  | +    points[0] = 1;
 | 
											
												
													
														|  | 
 |  | +    ++count;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  for (j = 1; j < width; j++) {
 | 
											
												
													
														|  | 
 |  | +    if (data[pos] !== data[pos + 1]) {
 | 
											
												
													
														|  | 
 |  | +      points[j] = data[pos] ? 2 : 1;
 | 
											
												
													
														|  | 
 |  | +      ++count;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    pos++;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  if (data[pos] !== 0) {
 | 
											
												
													
														|  | 
 |  | +    points[j] = 2;
 | 
											
												
													
														|  | 
 |  | +    ++count;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  for (i = 1; i < height; i++) {
 | 
											
												
													
														|  | 
 |  | +    pos = i * lineSize;
 | 
											
												
													
														|  | 
 |  | +    j0 = i * width1;
 | 
											
												
													
														|  | 
 |  | +    if (data[pos - lineSize] !== data[pos]) {
 | 
											
												
													
														|  | 
 |  | +      points[j0] = data[pos] ? 1 : 8;
 | 
											
												
													
														|  | 
 |  | +      ++count;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    // 'sum' is the position of the current pixel configuration in the 'TYPES'
 | 
											
												
													
														|  | 
 |  | +    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
 | 
											
												
													
														|  | 
 |  | +    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
 | 
											
												
													
														|  | 
 |  | +    for (j = 1; j < width; j++) {
 | 
											
												
													
														|  | 
 |  | +      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +
 | 
											
												
													
														|  | 
 |  | +            (data[pos - lineSize + 1] ? 8 : 0);
 | 
											
												
													
														|  | 
 |  | +      if (POINT_TYPES[sum]) {
 | 
											
												
													
														|  | 
 |  | +        points[j0 + j] = POINT_TYPES[sum];
 | 
											
												
													
														|  | 
 |  | +        ++count;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      pos++;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (data[pos - lineSize] !== data[pos]) {
 | 
											
												
													
														|  | 
 |  | +      points[j0 + j] = data[pos] ? 2 : 4;
 | 
											
												
													
														|  | 
 |  | +      ++count;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 |  | 
 | 
											
												
													
														|  | -                                                     width, height);
 |  | 
 | 
											
												
													
														|  | -      var maskCtx = maskCanvas.context;
 |  | 
 | 
											
												
													
														|  | -      maskCtx.save();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      putBinaryImageMask(maskCtx, img);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      maskCtx.globalCompositeOperation = 'source-in';
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (count > POINT_TO_PROCESS_LIMIT) {
 | 
											
												
													
														|  | 
 |  | +      return null;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.fillStyle = isPatternFill ?
 |  | 
 | 
											
												
													
														|  | -                          fillColor.getPattern(maskCtx, this) : fillColor;
 |  | 
 | 
											
												
													
														|  | -      maskCtx.fillRect(0, 0, width, height);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  pos = lineSize * (height - 1);
 | 
											
												
													
														|  | 
 |  | +  j0 = i * width1;
 | 
											
												
													
														|  | 
 |  | +  if (data[pos] !== 0) {
 | 
											
												
													
														|  | 
 |  | +    points[j0] = 8;
 | 
											
												
													
														|  | 
 |  | +    ++count;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  for (j = 1; j < width; j++) {
 | 
											
												
													
														|  | 
 |  | +    if (data[pos] !== data[pos + 1]) {
 | 
											
												
													
														|  | 
 |  | +      points[j0 + j] = data[pos] ? 4 : 8;
 | 
											
												
													
														|  | 
 |  | +      ++count;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    pos++;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  if (data[pos] !== 0) {
 | 
											
												
													
														|  | 
 |  | +    points[j0 + j] = 4;
 | 
											
												
													
														|  | 
 |  | +    ++count;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  if (count > POINT_TO_PROCESS_LIMIT) {
 | 
											
												
													
														|  | 
 |  | +    return null;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // building outlines
 | 
											
												
													
														|  | 
 |  | +  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
 | 
											
												
													
														|  | 
 |  | +  var outlines = [];
 | 
											
												
													
														|  | 
 |  | +  for (i = 0; count && i <= height; i++) {
 | 
											
												
													
														|  | 
 |  | +    var p = i * width1;
 | 
											
												
													
														|  | 
 |  | +    var end = p + width;
 | 
											
												
													
														|  | 
 |  | +    while (p < end && !points[p]) {
 | 
											
												
													
														|  | 
 |  | +      p++;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (p === end) {
 | 
											
												
													
														|  | 
 |  | +      continue;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var coords = [p % width1, i];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.paintInlineImageXObject(maskCanvas.canvas);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var type = points[p], p0 = p, pp;
 | 
											
												
													
														|  | 
 |  | +    do {
 | 
											
												
													
														|  | 
 |  | +      var step = steps[type];
 | 
											
												
													
														|  | 
 |  | +      do {
 | 
											
												
													
														|  | 
 |  | +        p += step;
 | 
											
												
													
														|  | 
 |  | +      } while (!points[p]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageMaskXObjectRepeat:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,
 |  | 
 | 
											
												
													
														|  | -                                                          scaleY, positions) {
 |  | 
 | 
											
												
													
														|  | -      var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -      var fillColor = this.current.fillColor;
 |  | 
 | 
											
												
													
														|  | -      var isPatternFill = this.current.patternFill;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      pp = points[p];
 | 
											
												
													
														|  | 
 |  | +      if (pp !== 5 && pp !== 10) {
 | 
											
												
													
														|  | 
 |  | +        // set new direction
 | 
											
												
													
														|  | 
 |  | +        type = pp;
 | 
											
												
													
														|  | 
 |  | +        // delete mark
 | 
											
												
													
														|  | 
 |  | +        points[p] = 0;
 | 
											
												
													
														|  | 
 |  | +      } else { // type is 5 or 10, ie, a crossing
 | 
											
												
													
														|  | 
 |  | +        // set new direction
 | 
											
												
													
														|  | 
 |  | +        type = pp & ((0x33 * type) >> 4);
 | 
											
												
													
														|  | 
 |  | +        // set new type for "future hit"
 | 
											
												
													
														|  | 
 |  | +        points[p] &= (type >> 2 | type << 2);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 |  | 
 | 
											
												
													
														|  | -                                                     width, height);
 |  | 
 | 
											
												
													
														|  | -      var maskCtx = maskCanvas.context;
 |  | 
 | 
											
												
													
														|  | -      maskCtx.save();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      coords.push(p % width1);
 | 
											
												
													
														|  | 
 |  | +      coords.push((p / width1) | 0);
 | 
											
												
													
														|  | 
 |  | +      --count;
 | 
											
												
													
														|  | 
 |  | +    } while (p0 !== p);
 | 
											
												
													
														|  | 
 |  | +    outlines.push(coords);
 | 
											
												
													
														|  | 
 |  | +    --i;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      putBinaryImageMask(maskCtx, imgData);
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var drawOutline = function(c) {
 | 
											
												
													
														|  | 
 |  | +    c.save();
 | 
											
												
													
														|  | 
 |  | +    // the path shall be painted in [0..1]x[0..1] space
 | 
											
												
													
														|  | 
 |  | +    c.scale(1 / width, -1 / height);
 | 
											
												
													
														|  | 
 |  | +    c.translate(0, -height);
 | 
											
												
													
														|  | 
 |  | +    c.beginPath();
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0, ii = outlines.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +      var o = outlines[i];
 | 
											
												
													
														|  | 
 |  | +      c.moveTo(o[0], o[1]);
 | 
											
												
													
														|  | 
 |  | +      for (var j = 2, jj = o.length; j < jj; j += 2) {
 | 
											
												
													
														|  | 
 |  | +        c.lineTo(o[j], o[j+1]);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    c.fill();
 | 
											
												
													
														|  | 
 |  | +    c.beginPath();
 | 
											
												
													
														|  | 
 |  | +    c.restore();
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.globalCompositeOperation = 'source-in';
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return drawOutline;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.fillStyle = isPatternFill ?
 |  | 
 | 
											
												
													
														|  | -                          fillColor.getPattern(maskCtx, this) : fillColor;
 |  | 
 | 
											
												
													
														|  | -      maskCtx.fillRect(0, 0, width, height);
 |  | 
 | 
											
												
													
														|  | 
 |  | +var CanvasExtraState = (function CanvasExtraStateClosure() {
 | 
											
												
													
														|  | 
 |  | +  function CanvasExtraState(old) {
 | 
											
												
													
														|  | 
 |  | +    // Are soft masks and alpha values shapes or opacities?
 | 
											
												
													
														|  | 
 |  | +    this.alphaIsShape = false;
 | 
											
												
													
														|  | 
 |  | +    this.fontSize = 0;
 | 
											
												
													
														|  | 
 |  | +    this.fontSizeScale = 1;
 | 
											
												
													
														|  | 
 |  | +    this.textMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +    this.textMatrixScale = 1;
 | 
											
												
													
														|  | 
 |  | +    this.fontMatrix = FONT_IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +    this.leading = 0;
 | 
											
												
													
														|  | 
 |  | +    // Current point (in user coordinates)
 | 
											
												
													
														|  | 
 |  | +    this.x = 0;
 | 
											
												
													
														|  | 
 |  | +    this.y = 0;
 | 
											
												
													
														|  | 
 |  | +    // Start of text line (in text coordinates)
 | 
											
												
													
														|  | 
 |  | +    this.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +    this.lineY = 0;
 | 
											
												
													
														|  | 
 |  | +    // Character and word spacing
 | 
											
												
													
														|  | 
 |  | +    this.charSpacing = 0;
 | 
											
												
													
														|  | 
 |  | +    this.wordSpacing = 0;
 | 
											
												
													
														|  | 
 |  | +    this.textHScale = 1;
 | 
											
												
													
														|  | 
 |  | +    this.textRenderingMode = TextRenderingMode.FILL;
 | 
											
												
													
														|  | 
 |  | +    this.textRise = 0;
 | 
											
												
													
														|  | 
 |  | +    // Default fore and background colors
 | 
											
												
													
														|  | 
 |  | +    this.fillColor = '#000000';
 | 
											
												
													
														|  | 
 |  | +    this.strokeColor = '#000000';
 | 
											
												
													
														|  | 
 |  | +    this.patternFill = false;
 | 
											
												
													
														|  | 
 |  | +    // Note: fill alpha applies to all non-stroking operations
 | 
											
												
													
														|  | 
 |  | +    this.fillAlpha = 1;
 | 
											
												
													
														|  | 
 |  | +    this.strokeAlpha = 1;
 | 
											
												
													
														|  | 
 |  | +    this.lineWidth = 1;
 | 
											
												
													
														|  | 
 |  | +    this.activeSMask = null; // nonclonable field (see the save method below)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      maskCtx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.old = old;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = positions.length; i < ii; i += 2) {
 |  | 
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(1, -1);
 |  | 
 | 
											
												
													
														|  | -        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
 |  | 
 | 
											
												
													
														|  | -          0, -1, 1, 1);
 |  | 
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  CanvasExtraState.prototype = {
 | 
											
												
													
														|  | 
 |  | +    clone: function CanvasExtraState_clone() {
 | 
											
												
													
														|  | 
 |  | +      return Object.create(this);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | 
 |  | +    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
 | 
											
												
													
														|  | 
 |  | +      this.x = x;
 | 
											
												
													
														|  | 
 |  | +      this.y = y;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return CanvasExtraState;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageMaskXObjectGroup:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintImageMaskXObjectGroup(images) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | 
 |  | +var CanvasGraphics = (function CanvasGraphicsClosure() {
 | 
											
												
													
														|  | 
 |  | +  // Defines the time the executeOperatorList is going to be executing
 | 
											
												
													
														|  | 
 |  | +  // before it stops and shedules a continue of execution.
 | 
											
												
													
														|  | 
 |  | +  var EXECUTION_TIME = 15;
 | 
											
												
													
														|  | 
 |  | +  // Defines the number of steps before checking the execution time
 | 
											
												
													
														|  | 
 |  | +  var EXECUTION_STEPS = 10;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var fillColor = this.current.fillColor;
 |  | 
 | 
											
												
													
														|  | -      var isPatternFill = this.current.patternFill;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = images.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        var image = images[i];
 |  | 
 | 
											
												
													
														|  | -        var width = image.width, height = image.height;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
 | 
											
												
													
														|  | 
 |  | +    this.ctx = canvasCtx;
 | 
											
												
													
														|  | 
 |  | +    this.current = new CanvasExtraState();
 | 
											
												
													
														|  | 
 |  | +    this.stateStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.pendingClip = null;
 | 
											
												
													
														|  | 
 |  | +    this.pendingEOFill = false;
 | 
											
												
													
														|  | 
 |  | +    this.res = null;
 | 
											
												
													
														|  | 
 |  | +    this.xobjs = null;
 | 
											
												
													
														|  | 
 |  | +    this.commonObjs = commonObjs;
 | 
											
												
													
														|  | 
 |  | +    this.objs = objs;
 | 
											
												
													
														|  | 
 |  | +    this.imageLayer = imageLayer;
 | 
											
												
													
														|  | 
 |  | +    this.groupStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.processingType3 = null;
 | 
											
												
													
														|  | 
 |  | +    // Patterns are painted relative to the initial page/form transform, see pdf
 | 
											
												
													
														|  | 
 |  | +    // spec 8.7.2 NOTE 1.
 | 
											
												
													
														|  | 
 |  | +    this.baseTransform = null;
 | 
											
												
													
														|  | 
 |  | +    this.baseTransformStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.groupLevel = 0;
 | 
											
												
													
														|  | 
 |  | +    this.smaskStack = [];
 | 
											
												
													
														|  | 
 |  | +    this.smaskCounter = 0;
 | 
											
												
													
														|  | 
 |  | +    this.tempSMask = null;
 | 
											
												
													
														|  | 
 |  | +    this.cachedCanvases = new CachedCanvases();
 | 
											
												
													
														|  | 
 |  | +    if (canvasCtx) {
 | 
											
												
													
														|  | 
 |  | +      // NOTE: if mozCurrentTransform is polyfilled, then the current state of
 | 
											
												
													
														|  | 
 |  | +      // the transformation must already be set in canvasCtx._transformMatrix.
 | 
											
												
													
														|  | 
 |  | +      addContextCurrentTransform(canvasCtx);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    this.cachedGetSinglePixelWidth = null;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 |  | 
 | 
											
												
													
														|  | -                                                       width, height);
 |  | 
 | 
											
												
													
														|  | -        var maskCtx = maskCanvas.context;
 |  | 
 | 
											
												
													
														|  | -        maskCtx.save();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function putBinaryImageData(ctx, imgData) {
 | 
											
												
													
														|  | 
 |  | +    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
 | 
											
												
													
														|  | 
 |  | +      ctx.putImageData(imgData, 0, 0);
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        putBinaryImageMask(maskCtx, image);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Put the image data to the canvas in chunks, rather than putting the
 | 
											
												
													
														|  | 
 |  | +    // whole image at once.  This saves JS memory, because the ImageData object
 | 
											
												
													
														|  | 
 |  | +    // is smaller. It also possibly saves C++ memory within the implementation
 | 
											
												
													
														|  | 
 |  | +    // of putImageData(). (E.g. in Firefox we make two short-lived copies of
 | 
											
												
													
														|  | 
 |  | +    // the data passed to putImageData()). |n| shouldn't be too small, however,
 | 
											
												
													
														|  | 
 |  | +    // because too many putImageData() calls will slow things down.
 | 
											
												
													
														|  | 
 |  | +    //
 | 
											
												
													
														|  | 
 |  | +    // Note: as written, if the last chunk is partial, the putImageData() call
 | 
											
												
													
														|  | 
 |  | +    // will (conceptually) put pixels past the bounds of the canvas.  But
 | 
											
												
													
														|  | 
 |  | +    // that's ok; any such pixels are ignored.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        maskCtx.globalCompositeOperation = 'source-in';
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var height = imgData.height, width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  | 
 |  | +    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  | 
 |  | +    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        maskCtx.fillStyle = isPatternFill ?
 |  | 
 | 
											
												
													
														|  | -                            fillColor.getPattern(maskCtx, this) : fillColor;
 |  | 
 | 
											
												
													
														|  | -        maskCtx.fillRect(0, 0, width, height);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 | 
											
												
													
														|  | 
 |  | +    var srcPos = 0, destPos;
 | 
											
												
													
														|  | 
 |  | +    var src = imgData.data;
 | 
											
												
													
														|  | 
 |  | +    var dest = chunkImgData.data;
 | 
											
												
													
														|  | 
 |  | +    var i, j, thisChunkHeight, elemsInThisChunk;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        maskCtx.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // There are multiple forms in which the pixel data can be passed, and
 | 
											
												
													
														|  | 
 |  | +    // imgData.kind tells us which one this is.
 | 
											
												
													
														|  | 
 |  | +    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {
 | 
											
												
													
														|  | 
 |  | +      // Grayscale, 1 bit per pixel (i.e. black-and-white).
 | 
											
												
													
														|  | 
 |  | +      var srcLength = src.byteLength;
 | 
											
												
													
														|  | 
 |  | +      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :
 | 
											
												
													
														|  | 
 |  | +        new Uint32ArrayView(dest);
 | 
											
												
													
														|  | 
 |  | +      var dest32DataLength = dest32.length;
 | 
											
												
													
														|  | 
 |  | +      var fullSrcDiff = (width + 7) >> 3;
 | 
											
												
													
														|  | 
 |  | +      var white = 0xFFFFFFFF;
 | 
											
												
													
														|  | 
 |  | +      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?
 | 
											
												
													
														|  | 
 |  | +        0xFF000000 : 0x000000FF;
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < totalChunks; i++) {
 | 
											
												
													
														|  | 
 |  | +        thisChunkHeight =
 | 
											
												
													
														|  | 
 |  | +          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
 | 
											
												
													
														|  | 
 |  | +        destPos = 0;
 | 
											
												
													
														|  | 
 |  | +        for (j = 0; j < thisChunkHeight; j++) {
 | 
											
												
													
														|  | 
 |  | +          var srcDiff = srcLength - srcPos;
 | 
											
												
													
														|  | 
 |  | +          var k = 0;
 | 
											
												
													
														|  | 
 |  | +          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;
 | 
											
												
													
														|  | 
 |  | +          var kEndUnrolled = kEnd & ~7;
 | 
											
												
													
														|  | 
 |  | +          var mask = 0;
 | 
											
												
													
														|  | 
 |  | +          var srcByte = 0;
 | 
											
												
													
														|  | 
 |  | +          for (; k < kEndUnrolled; k += 8) {
 | 
											
												
													
														|  | 
 |  | +            srcByte = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 128) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 64) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 32) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 16) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 8) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 4) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 2) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & 1) ? white : black;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          for (; k < kEnd; k++) {
 | 
											
												
													
														|  | 
 |  | +             if (mask === 0) {
 | 
											
												
													
														|  | 
 |  | +               srcByte = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +               mask = 128;
 | 
											
												
													
														|  | 
 |  | +             }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.transform.apply(ctx, image.transform);
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(1, -1);
 |  | 
 | 
											
												
													
														|  | -        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
 |  | 
 | 
											
												
													
														|  | -                      0, -1, 1, 1);
 |  | 
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +            dest32[destPos++] = (srcByte & mask) ? white : black;
 | 
											
												
													
														|  | 
 |  | +            mask >>= 1;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        // We ran out of input. Make all remaining pixels transparent.
 | 
											
												
													
														|  | 
 |  | +        while (destPos < dest32DataLength) {
 | 
											
												
													
														|  | 
 |  | +          dest32[destPos++] = 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
 |  | 
 | 
											
												
													
														|  | -      var imgData = this.objs.get(objId);
 |  | 
 | 
											
												
													
														|  | -      if (!imgData) {
 |  | 
 | 
											
												
													
														|  | -        warn('Dependent image isn\'t ready yet');
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    } else if (imgData.kind === ImageKind.RGBA_32BPP) {
 | 
											
												
													
														|  | 
 |  | +      // RGBA, 32-bits per pixel.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.paintInlineImageXObject(imgData);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    paintImageXObjectRepeat:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,
 |  | 
 | 
											
												
													
														|  | -                                                          positions) {
 |  | 
 | 
											
												
													
														|  | -      var imgData = this.objs.get(objId);
 |  | 
 | 
											
												
													
														|  | -      if (!imgData) {
 |  | 
 | 
											
												
													
														|  | -        warn('Dependent image isn\'t ready yet');
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      j = 0;
 | 
											
												
													
														|  | 
 |  | +      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < fullChunks; i++) {
 | 
											
												
													
														|  | 
 |  | +        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
 | 
											
												
													
														|  | 
 |  | +        srcPos += elemsInThisChunk;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -      var map = [];
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = positions.length; i < ii; i += 2) {
 |  | 
 | 
											
												
													
														|  | -        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],
 |  | 
 | 
											
												
													
														|  | -                 positions[i + 1]], x: 0, y: 0, w: width, h: height});
 |  | 
 | 
											
												
													
														|  | 
 |  | +        ctx.putImageData(chunkImgData, 0, j);
 | 
											
												
													
														|  | 
 |  | +        j += FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.paintInlineImageXObjectGroup(imgData, map);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    paintInlineImageXObject:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintInlineImageXObject(imgData) {
 |  | 
 | 
											
												
													
														|  | -      var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      // scale the image to the unit square
 |  | 
 | 
											
												
													
														|  | -      ctx.scale(1 / width, -1 / height);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var currentTransform = ctx.mozCurrentTransformInverse;
 |  | 
 | 
											
												
													
														|  | -      var a = currentTransform[0], b = currentTransform[1];
 |  | 
 | 
											
												
													
														|  | -      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
 |  | 
 | 
											
												
													
														|  | -      var c = currentTransform[2], d = currentTransform[3];
 |  | 
 | 
											
												
													
														|  | -      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var imgToPaint, tmpCanvas;
 |  | 
 | 
											
												
													
														|  | -      // instanceof HTMLElement does not work in jsdom node.js module
 |  | 
 | 
											
												
													
														|  | -      if (imgData instanceof HTMLElement || !imgData.data) {
 |  | 
 | 
											
												
													
														|  | -        imgToPaint = imgData;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage',
 |  | 
 | 
											
												
													
														|  | -                                                  width, height);
 |  | 
 | 
											
												
													
														|  | -        var tmpCtx = tmpCanvas.context;
 |  | 
 | 
											
												
													
														|  | -        putBinaryImageData(tmpCtx, imgData);
 |  | 
 | 
											
												
													
														|  | -        imgToPaint = tmpCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (i < totalChunks) {
 | 
											
												
													
														|  | 
 |  | +        elemsInThisChunk = width * partialChunkHeight * 4;
 | 
											
												
													
														|  | 
 |  | +        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
 | 
											
												
													
														|  | 
 |  | +        ctx.putImageData(chunkImgData, 0, j);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var paintWidth = width, paintHeight = height;
 |  | 
 | 
											
												
													
														|  | -      var tmpCanvasId = 'prescale1';
 |  | 
 | 
											
												
													
														|  | -      // Vertial or horizontal scaling shall not be more than 2 to not loose the
 |  | 
 | 
											
												
													
														|  | -      // pixels during drawImage operation, painting on the temporary canvas(es)
 |  | 
 | 
											
												
													
														|  | -      // that are twice smaller in size
 |  | 
 | 
											
												
													
														|  | -      while ((widthScale > 2 && paintWidth > 1) ||
 |  | 
 | 
											
												
													
														|  | -             (heightScale > 2 && paintHeight > 1)) {
 |  | 
 | 
											
												
													
														|  | -        var newWidth = paintWidth, newHeight = paintHeight;
 |  | 
 | 
											
												
													
														|  | -        if (widthScale > 2 && paintWidth > 1) {
 |  | 
 | 
											
												
													
														|  | -          newWidth = Math.ceil(paintWidth / 2);
 |  | 
 | 
											
												
													
														|  | -          widthScale /= paintWidth / newWidth;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        if (heightScale > 2 && paintHeight > 1) {
 |  | 
 | 
											
												
													
														|  | -          newHeight = Math.ceil(paintHeight / 2);
 |  | 
 | 
											
												
													
														|  | -          heightScale /= paintHeight / newHeight;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    } else if (imgData.kind === ImageKind.RGB_24BPP) {
 | 
											
												
													
														|  | 
 |  | +      // RGB, 24-bits per pixel.
 | 
											
												
													
														|  | 
 |  | +      thisChunkHeight = FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  | 
 |  | +      elemsInThisChunk = width * thisChunkHeight;
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < totalChunks; i++) {
 | 
											
												
													
														|  | 
 |  | +        if (i >= fullChunks) {
 | 
											
												
													
														|  | 
 |  | +          thisChunkHeight = partialChunkHeight;
 | 
											
												
													
														|  | 
 |  | +          elemsInThisChunk = width * thisChunkHeight;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId,
 |  | 
 | 
											
												
													
														|  | -                                                  newWidth, newHeight);
 |  | 
 | 
											
												
													
														|  | -        tmpCtx = tmpCanvas.context;
 |  | 
 | 
											
												
													
														|  | -        tmpCtx.clearRect(0, 0, newWidth, newHeight);
 |  | 
 | 
											
												
													
														|  | -        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
 |  | 
 | 
											
												
													
														|  | -                                     0, 0, newWidth, newHeight);
 |  | 
 | 
											
												
													
														|  | -        imgToPaint = tmpCanvas.canvas;
 |  | 
 | 
											
												
													
														|  | -        paintWidth = newWidth;
 |  | 
 | 
											
												
													
														|  | -        paintHeight = newHeight;
 |  | 
 | 
											
												
													
														|  | -        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
 |  | 
 | 
											
												
													
														|  | -                                0, -height, width, height);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.imageLayer) {
 |  | 
 | 
											
												
													
														|  | -        var position = this.getCanvasPosition(0, -height);
 |  | 
 | 
											
												
													
														|  | -        this.imageLayer.appendImage({
 |  | 
 | 
											
												
													
														|  | -          imgData: imgData,
 |  | 
 | 
											
												
													
														|  | -          left: position[0],
 |  | 
 | 
											
												
													
														|  | -          top: position[1],
 |  | 
 | 
											
												
													
														|  | -          width: width / currentTransform[0],
 |  | 
 | 
											
												
													
														|  | -          height: height / currentTransform[3]
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +        destPos = 0;
 | 
											
												
													
														|  | 
 |  | +        for (j = elemsInThisChunk; j--;) {
 | 
											
												
													
														|  | 
 |  | +          dest[destPos++] = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +          dest[destPos++] = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +          dest[destPos++] = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +          dest[destPos++] = 255;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      error('bad image kind: ' + imgData.kind);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintInlineImageXObjectGroup:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      var w = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var h = imgData.height;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function putBinaryImageMask(ctx, imgData) {
 | 
											
												
													
														|  | 
 |  | +    var height = imgData.height, width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  | 
 |  | +    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
 | 
											
												
													
														|  | 
 |  | +    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);
 |  | 
 | 
											
												
													
														|  | -      var tmpCtx = tmpCanvas.context;
 |  | 
 | 
											
												
													
														|  | -      putBinaryImageData(tmpCtx, imgData);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 | 
											
												
													
														|  | 
 |  | +    var srcPos = 0;
 | 
											
												
													
														|  | 
 |  | +    var src = imgData.data;
 | 
											
												
													
														|  | 
 |  | +    var dest = chunkImgData.data;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      for (var i = 0, ii = map.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        var entry = map[i];
 |  | 
 | 
											
												
													
														|  | -        ctx.save();
 |  | 
 | 
											
												
													
														|  | -        ctx.transform.apply(ctx, entry.transform);
 |  | 
 | 
											
												
													
														|  | -        ctx.scale(1, -1);
 |  | 
 | 
											
												
													
														|  | -        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,
 |  | 
 | 
											
												
													
														|  | -                      0, -1, 1, 1);
 |  | 
 | 
											
												
													
														|  | -        if (this.imageLayer) {
 |  | 
 | 
											
												
													
														|  | -          var position = this.getCanvasPosition(entry.x, entry.y);
 |  | 
 | 
											
												
													
														|  | -          this.imageLayer.appendImage({
 |  | 
 | 
											
												
													
														|  | -            imgData: imgData,
 |  | 
 | 
											
												
													
														|  | -            left: position[0],
 |  | 
 | 
											
												
													
														|  | -            top: position[1],
 |  | 
 | 
											
												
													
														|  | -            width: w,
 |  | 
 | 
											
												
													
														|  | -            height: h
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0; i < totalChunks; i++) {
 | 
											
												
													
														|  | 
 |  | +      var thisChunkHeight =
 | 
											
												
													
														|  | 
 |  | +        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      // Expand the mask so it can be used by the canvas.  Any required
 | 
											
												
													
														|  | 
 |  | +      // inversion has already been handled.
 | 
											
												
													
														|  | 
 |  | +      var destPos = 3; // alpha component offset
 | 
											
												
													
														|  | 
 |  | +      for (var j = 0; j < thisChunkHeight; j++) {
 | 
											
												
													
														|  | 
 |  | +        var mask = 0;
 | 
											
												
													
														|  | 
 |  | +        for (var k = 0; k < width; k++) {
 | 
											
												
													
														|  | 
 |  | +          if (!mask) {
 | 
											
												
													
														|  | 
 |  | +            var elem = src[srcPos++];
 | 
											
												
													
														|  | 
 |  | +            mask = 128;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          dest[destPos] = (elem & mask) ? 0 : 255;
 | 
											
												
													
														|  | 
 |  | +          destPos += 4;
 | 
											
												
													
														|  | 
 |  | +          mask >>= 1;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        ctx.restore();
 |  | 
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintSolidColorImageMask:
 |  | 
 | 
											
												
													
														|  | -      function CanvasGraphics_paintSolidColorImageMask() {
 |  | 
 | 
											
												
													
														|  | -        this.ctx.fillRect(0, 0, 1, 1);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function copyCtxState(sourceCtx, destCtx) {
 | 
											
												
													
														|  | 
 |  | +    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
 | 
											
												
													
														|  | 
 |  | +                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
 | 
											
												
													
														|  | 
 |  | +                      'globalCompositeOperation', 'font'];
 | 
											
												
													
														|  | 
 |  | +    for (var i = 0, ii = properties.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +      var property = properties[i];
 | 
											
												
													
														|  | 
 |  | +      if (sourceCtx[property] !== undefined) {
 | 
											
												
													
														|  | 
 |  | +        destCtx[property] = sourceCtx[property];
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (sourceCtx.setLineDash !== undefined) {
 | 
											
												
													
														|  | 
 |  | +      destCtx.setLineDash(sourceCtx.getLineDash());
 | 
											
												
													
														|  | 
 |  | +      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
 | 
											
												
													
														|  | 
 |  | +    } else if (sourceCtx.mozDashOffset !== undefined) {
 | 
											
												
													
														|  | 
 |  | +      destCtx.mozDash = sourceCtx.mozDash;
 | 
											
												
													
														|  | 
 |  | +      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintXObject: function CanvasGraphics_paintXObject() {
 |  | 
 | 
											
												
													
														|  | -      warn('Unsupported \'paintXObject\' command.');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function composeSMaskBackdrop(bytes, r0, g0, b0) {
 | 
											
												
													
														|  | 
 |  | +    var length = bytes.length;
 | 
											
												
													
														|  | 
 |  | +    for (var i = 3; i < length; i += 4) {
 | 
											
												
													
														|  | 
 |  | +      var alpha = bytes[i];
 | 
											
												
													
														|  | 
 |  | +      if (alpha === 0) {
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 3] = r0;
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 2] = g0;
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 1] = b0;
 | 
											
												
													
														|  | 
 |  | +      } else if (alpha < 255) {
 | 
											
												
													
														|  | 
 |  | +        var alpha_ = 255 - alpha;
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;
 | 
											
												
													
														|  | 
 |  | +        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Marked content
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function composeSMaskAlpha(maskData, layerData, transferMap) {
 | 
											
												
													
														|  | 
 |  | +    var length = maskData.length;
 | 
											
												
													
														|  | 
 |  | +    var scale = 1 / 255;
 | 
											
												
													
														|  | 
 |  | +    for (var i = 3; i < length; i += 4) {
 | 
											
												
													
														|  | 
 |  | +      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
 | 
											
												
													
														|  | 
 |  | +      layerData[i] = (layerData[i] * alpha * scale) | 0;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    markPoint: function CanvasGraphics_markPoint(tag) {
 |  | 
 | 
											
												
													
														|  | -      // TODO Marked content.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
 |  | 
 | 
											
												
													
														|  | -      // TODO Marked content.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
 |  | 
 | 
											
												
													
														|  | -      // TODO Marked content.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
 |  | 
 | 
											
												
													
														|  | -                                        tag, properties) {
 |  | 
 | 
											
												
													
														|  | -      // TODO Marked content.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    endMarkedContent: function CanvasGraphics_endMarkedContent() {
 |  | 
 | 
											
												
													
														|  | -      // TODO Marked content.
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function composeSMaskLuminosity(maskData, layerData, transferMap) {
 | 
											
												
													
														|  | 
 |  | +    var length = maskData.length;
 | 
											
												
													
														|  | 
 |  | +    for (var i = 3; i < length; i += 4) {
 | 
											
												
													
														|  | 
 |  | +      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000
 | 
											
												
													
														|  | 
 |  | +              (maskData[i - 2] * 152) + // * 0.59 ....
 | 
											
												
													
														|  | 
 |  | +              (maskData[i - 1] * 28);   // * 0.11 ....
 | 
											
												
													
														|  | 
 |  | +      layerData[i] = transferMap ?
 | 
											
												
													
														|  | 
 |  | +        (layerData[i] * transferMap[y >> 8]) >> 8 :
 | 
											
												
													
														|  | 
 |  | +        (layerData[i] * y) >> 16;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Compatibility
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function genericComposeSMask(maskCtx, layerCtx, width, height,
 | 
											
												
													
														|  | 
 |  | +                               subtype, backdrop, transferMap) {
 | 
											
												
													
														|  | 
 |  | +    var hasBackdrop = !!backdrop;
 | 
											
												
													
														|  | 
 |  | +    var r0 = hasBackdrop ? backdrop[0] : 0;
 | 
											
												
													
														|  | 
 |  | +    var g0 = hasBackdrop ? backdrop[1] : 0;
 | 
											
												
													
														|  | 
 |  | +    var b0 = hasBackdrop ? backdrop[2] : 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginCompat: function CanvasGraphics_beginCompat() {
 |  | 
 | 
											
												
													
														|  | -      // TODO ignore undefined operators (should we do that anyway?)
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    endCompat: function CanvasGraphics_endCompat() {
 |  | 
 | 
											
												
													
														|  | -      // TODO stop ignoring undefined operators
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    var composeFn;
 | 
											
												
													
														|  | 
 |  | +    if (subtype === 'Luminosity') {
 | 
											
												
													
														|  | 
 |  | +      composeFn = composeSMaskLuminosity;
 | 
											
												
													
														|  | 
 |  | +    } else {
 | 
											
												
													
														|  | 
 |  | +      composeFn = composeSMaskAlpha;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Helper functions
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // processing image in chunks to save memory
 | 
											
												
													
														|  | 
 |  | +    var PIXELS_TO_PROCESS = 1048576;
 | 
											
												
													
														|  | 
 |  | +    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
 | 
											
												
													
														|  | 
 |  | +    for (var row = 0; row < height; row += chunkSize) {
 | 
											
												
													
														|  | 
 |  | +      var chunkHeight = Math.min(chunkSize, height - row);
 | 
											
												
													
														|  | 
 |  | +      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
 | 
											
												
													
														|  | 
 |  | +      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    consumePath: function CanvasGraphics_consumePath() {
 |  | 
 | 
											
												
													
														|  | -      var ctx = this.ctx;
 |  | 
 | 
											
												
													
														|  | -      if (this.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        if (this.pendingClip === EO_CLIP) {
 |  | 
 | 
											
												
													
														|  | -          if (ctx.mozFillRule !== undefined) {
 |  | 
 | 
											
												
													
														|  | -            ctx.mozFillRule = 'evenodd';
 |  | 
 | 
											
												
													
														|  | -            ctx.clip();
 |  | 
 | 
											
												
													
														|  | -            ctx.mozFillRule = 'nonzero';
 |  | 
 | 
											
												
													
														|  | -          } else {
 |  | 
 | 
											
												
													
														|  | -            ctx.clip('evenodd');
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          ctx.clip();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        this.pendingClip = null;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      ctx.beginPath();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
 |  | 
 | 
											
												
													
														|  | -      if (this.cachedGetSinglePixelWidth === null) {
 |  | 
 | 
											
												
													
														|  | -        var inverse = this.ctx.mozCurrentTransformInverse;
 |  | 
 | 
											
												
													
														|  | -        // max of the current horizontal and vertical scale
 |  | 
 | 
											
												
													
														|  | -        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(
 |  | 
 | 
											
												
													
														|  | -          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
 |  | 
 | 
											
												
													
														|  | -          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (hasBackdrop) {
 | 
											
												
													
														|  | 
 |  | +        composeSMaskBackdrop(maskData.data, r0, g0, b0);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return this.cachedGetSinglePixelWidth;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
 |  | 
 | 
											
												
													
														|  | -      var transform = this.ctx.mozCurrentTransform;
 |  | 
 | 
											
												
													
														|  | -      return [
 |  | 
 | 
											
												
													
														|  | -        transform[0] * x + transform[2] * y + transform[4],
 |  | 
 | 
											
												
													
														|  | -        transform[1] * x + transform[3] * y + transform[5]
 |  | 
 | 
											
												
													
														|  | -      ];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      composeFn(maskData.data, layerData.data, transferMap);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      maskCtx.putImageData(layerData, 0, row);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  for (var op in OPS) {
 |  | 
 | 
											
												
													
														|  | -    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function composeSMask(ctx, smask, layerCtx) {
 | 
											
												
													
														|  | 
 |  | +    var mask = smask.canvas;
 | 
											
												
													
														|  | 
 |  | +    var maskCtx = smask.context;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,
 | 
											
												
													
														|  | 
 |  | +                     smask.offsetX, smask.offsetY);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    var backdrop = smask.backdrop || null;
 | 
											
												
													
														|  | 
 |  | +    if (!smask.transferMap && WebGLUtils.isEnabled) {
 | 
											
												
													
														|  | 
 |  | +      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
 | 
											
												
													
														|  | 
 |  | +        {subtype: smask.subtype, backdrop: backdrop});
 | 
											
												
													
														|  | 
 |  | +      ctx.setTransform(1, 0, 0, 1, 0, 0);
 | 
											
												
													
														|  | 
 |  | +      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
 | 
											
												
													
														|  | 
 |  | +      return;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
 | 
											
												
													
														|  | 
 |  | +                        smask.subtype, backdrop, smask.transferMap);
 | 
											
												
													
														|  | 
 |  | +    ctx.drawImage(mask, 0, 0);
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return CanvasGraphics;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
 | 
											
												
													
														|  | 
 |  | +  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
 | 
											
												
													
														|  | 
 |  | +  var NORMAL_CLIP = {};
 | 
											
												
													
														|  | 
 |  | +  var EO_CLIP = {};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -exports.CanvasGraphics = CanvasGraphics;
 |  | 
 | 
											
												
													
														|  | -exports.createScratchCanvas = createScratchCanvas;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | 
 |  | +  CanvasGraphics.prototype = {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport,
 | 
											
												
													
														|  | 
 |  | +                                                       transparency) {
 | 
											
												
													
														|  | 
 |  | +      // For pdfs that use blend modes we have to clear the canvas else certain
 | 
											
												
													
														|  | 
 |  | +      // blend modes can look wrong since we'd be blending with a white
 | 
											
												
													
														|  | 
 |  | +      // backdrop. The problem with a transparent backdrop though is we then
 | 
											
												
													
														|  | 
 |  | +      // don't get sub pixel anti aliasing on text, creating temporary
 | 
											
												
													
														|  | 
 |  | +      // transparent canvas when we have blend modes.
 | 
											
												
													
														|  | 
 |  | +      var width = this.ctx.canvas.width;
 | 
											
												
													
														|  | 
 |  | +      var height = this.ctx.canvas.height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil,
 |  | 
 | 
											
												
													
														|  | -      root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas,
 |  | 
 | 
											
												
													
														|  | -      root.pdfjsSharedGlobal);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}(this, function (exports, sharedUtil, displayFontLoader, displayCanvas,
 |  | 
 | 
											
												
													
														|  | -                  sharedGlobal, amdRequire) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.ctx.save();
 | 
											
												
													
														|  | 
 |  | +      this.ctx.fillStyle = 'rgb(255, 255, 255)';
 | 
											
												
													
														|  | 
 |  | +      this.ctx.fillRect(0, 0, width, height);
 | 
											
												
													
														|  | 
 |  | +      this.ctx.restore();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var InvalidPDFException = sharedUtil.InvalidPDFException;
 |  | 
 | 
											
												
													
														|  | -var MessageHandler = sharedUtil.MessageHandler;
 |  | 
 | 
											
												
													
														|  | -var MissingPDFException = sharedUtil.MissingPDFException;
 |  | 
 | 
											
												
													
														|  | -var PasswordResponses = sharedUtil.PasswordResponses;
 |  | 
 | 
											
												
													
														|  | -var PasswordException = sharedUtil.PasswordException;
 |  | 
 | 
											
												
													
														|  | -var StatTimer = sharedUtil.StatTimer;
 |  | 
 | 
											
												
													
														|  | -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException;
 |  | 
 | 
											
												
													
														|  | -var UnknownErrorException = sharedUtil.UnknownErrorException;
 |  | 
 | 
											
												
													
														|  | -var Util = sharedUtil.Util;
 |  | 
 | 
											
												
													
														|  | -var createPromiseCapability = sharedUtil.createPromiseCapability;
 |  | 
 | 
											
												
													
														|  | -var combineUrl = sharedUtil.combineUrl;
 |  | 
 | 
											
												
													
														|  | -var error = sharedUtil.error;
 |  | 
 | 
											
												
													
														|  | -var deprecated = sharedUtil.deprecated;
 |  | 
 | 
											
												
													
														|  | -var info = sharedUtil.info;
 |  | 
 | 
											
												
													
														|  | -var isArrayBuffer = sharedUtil.isArrayBuffer;
 |  | 
 | 
											
												
													
														|  | -var loadJpegStream = sharedUtil.loadJpegStream;
 |  | 
 | 
											
												
													
														|  | -var stringToBytes = sharedUtil.stringToBytes;
 |  | 
 | 
											
												
													
														|  | -var warn = sharedUtil.warn;
 |  | 
 | 
											
												
													
														|  | -var FontFaceObject = displayFontLoader.FontFaceObject;
 |  | 
 | 
											
												
													
														|  | -var FontLoader = displayFontLoader.FontLoader;
 |  | 
 | 
											
												
													
														|  | -var CanvasGraphics = displayCanvas.CanvasGraphics;
 |  | 
 | 
											
												
													
														|  | -var createScratchCanvas = displayCanvas.createScratchCanvas;
 |  | 
 | 
											
												
													
														|  | -var PDFJS = sharedGlobal.PDFJS;
 |  | 
 | 
											
												
													
														|  | -var globalScope = sharedGlobal.globalScope;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (transparency) {
 | 
											
												
													
														|  | 
 |  | +        var transparentCanvas = this.cachedCanvases.getCanvas(
 | 
											
												
													
														|  | 
 |  | +          'transparent', width, height, true);
 | 
											
												
													
														|  | 
 |  | +        this.compositeCtx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +        this.transparentCanvas = transparentCanvas.canvas;
 | 
											
												
													
														|  | 
 |  | +        this.ctx = transparentCanvas.context;
 | 
											
												
													
														|  | 
 |  | +        this.ctx.save();
 | 
											
												
													
														|  | 
 |  | +        // The transform can be applied before rendering, transferring it to
 | 
											
												
													
														|  | 
 |  | +        // the new canvas.
 | 
											
												
													
														|  | 
 |  | +        this.ctx.transform.apply(this.ctx,
 | 
											
												
													
														|  | 
 |  | +                                 this.compositeCtx.mozCurrentTransform);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.ctx.save();
 | 
											
												
													
														|  | 
 |  | +      if (transform) {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.transform.apply(this.ctx, transform);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.ctx.transform.apply(this.ctx, viewport.transform);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.baseTransform = this.ctx.mozCurrentTransform.slice();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +      if (this.imageLayer) {
 | 
											
												
													
														|  | 
 |  | +        this.imageLayer.beginLayout();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var useRequireEnsure = false;
 |  | 
 | 
											
												
													
														|  | -if (typeof module !== 'undefined' && module.require) {
 |  | 
 | 
											
												
													
														|  | -  // node.js - disable worker and set require.ensure.
 |  | 
 | 
											
												
													
														|  | -  PDFJS.disableWorker = true;
 |  | 
 | 
											
												
													
														|  | -  if (typeof require.ensure === 'undefined') {
 |  | 
 | 
											
												
													
														|  | -    require.ensure = require('node-ensure');
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  useRequireEnsure = true;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -if (typeof __webpack_require__ !== 'undefined') {
 |  | 
 | 
											
												
													
														|  | -  // Webpack - get/bundle pdf.worker.js as additional file.
 |  | 
 | 
											
												
													
														|  | -  PDFJS.workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js');
 |  | 
 | 
											
												
													
														|  | -  useRequireEnsure = true;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -var fakeWorkerFilesLoader = useRequireEnsure && function (callback) {
 |  | 
 | 
											
												
													
														|  | -  require.ensure([], function () {
 |  | 
 | 
											
												
													
														|  | -    require('./pdf.worker.js');
 |  | 
 | 
											
												
													
														|  | -    callback();
 |  | 
 | 
											
												
													
														|  | -  });
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | 
 |  | +    executeOperatorList: function CanvasGraphics_executeOperatorList(
 | 
											
												
													
														|  | 
 |  | +                                    operatorList,
 | 
											
												
													
														|  | 
 |  | +                                    executionStartIdx, continueCallback,
 | 
											
												
													
														|  | 
 |  | +                                    stepper) {
 | 
											
												
													
														|  | 
 |  | +      var argsArray = operatorList.argsArray;
 | 
											
												
													
														|  | 
 |  | +      var fnArray = operatorList.fnArray;
 | 
											
												
													
														|  | 
 |  | +      var i = executionStartIdx || 0;
 | 
											
												
													
														|  | 
 |  | +      var argsArrayLen = argsArray.length;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +      // Sometimes the OperatorList to execute is empty.
 | 
											
												
													
														|  | 
 |  | +      if (argsArrayLen === i) {
 | 
											
												
													
														|  | 
 |  | +        return i;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * The maximum allowed image size in total pixels e.g. width * height. Images
 |  | 
 | 
											
												
													
														|  | - * above this value will not be drawn. Use -1 for no limit.
 |  | 
 | 
											
												
													
														|  | - * @var {number}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?
 |  | 
 | 
											
												
													
														|  | -                      -1 : PDFJS.maxImageSize);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&
 | 
											
												
													
														|  | 
 |  | +                             typeof continueCallback === 'function');
 | 
											
												
													
														|  | 
 |  | +      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
 | 
											
												
													
														|  | 
 |  | +      var steps = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * The url of where the predefined Adobe CMaps are located. Include trailing
 |  | 
 | 
											
												
													
														|  | - * slash.
 |  | 
 | 
											
												
													
														|  | - * @var {string}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var commonObjs = this.commonObjs;
 | 
											
												
													
														|  | 
 |  | +      var objs = this.objs;
 | 
											
												
													
														|  | 
 |  | +      var fnId;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Specifies if CMaps are binary packed.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      while (true) {
 | 
											
												
													
														|  | 
 |  | +        if (stepper !== undefined && i === stepper.nextBreakPoint) {
 | 
											
												
													
														|  | 
 |  | +          stepper.breakIt(i, continueCallback);
 | 
											
												
													
														|  | 
 |  | +          return i;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * By default fonts are converted to OpenType fonts and loaded via font face
 |  | 
 | 
											
												
													
														|  | - * rules. If disabled, the font will be rendered using a built in font renderer
 |  | 
 | 
											
												
													
														|  | - * that constructs the glyphs with primitive path commands.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?
 |  | 
 | 
											
												
													
														|  | -                         false : PDFJS.disableFontFace);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        fnId = fnArray[i];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Path for image resources, mainly for annotation icons. Include trailing
 |  | 
 | 
											
												
													
														|  | - * slash.
 |  | 
 | 
											
												
													
														|  | - * @var {string}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?
 |  | 
 | 
											
												
													
														|  | -                            '' : PDFJS.imageResourcesPath);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (fnId !== OPS.dependency) {
 | 
											
												
													
														|  | 
 |  | +          this[fnId].apply(this, argsArray[i]);
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          var deps = argsArray[i];
 | 
											
												
													
														|  | 
 |  | +          for (var n = 0, nn = deps.length; n < nn; n++) {
 | 
											
												
													
														|  | 
 |  | +            var depObjId = deps[n];
 | 
											
												
													
														|  | 
 |  | +            var common = depObjId[0] === 'g' && depObjId[1] === '_';
 | 
											
												
													
														|  | 
 |  | +            var objsPool = common ? commonObjs : objs;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disable the web worker and run all code on the main thread. This will happen
 |  | 
 | 
											
												
													
														|  | - * automatically if the browser doesn't support workers or sending typed arrays
 |  | 
 | 
											
												
													
														|  | - * to workers.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableWorker = (PDFJS.disableWorker === undefined ?
 |  | 
 | 
											
												
													
														|  | -                       false : PDFJS.disableWorker);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            // If the promise isn't resolved yet, add the continueCallback
 | 
											
												
													
														|  | 
 |  | +            // to the promise and bail out.
 | 
											
												
													
														|  | 
 |  | +            if (!objsPool.isResolved(depObjId)) {
 | 
											
												
													
														|  | 
 |  | +              objsPool.get(depObjId, continueCallback);
 | 
											
												
													
														|  | 
 |  | +              return i;
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Path and filename of the worker file. Required when the worker is enabled in
 |  | 
 | 
											
												
													
														|  | - * development mode. If unspecified in the production build, the worker will be
 |  | 
 | 
											
												
													
														|  | - * loaded based on the location of the pdf.js file. It is recommended that
 |  | 
 | 
											
												
													
														|  | - * the workerSrc is set in a custom application to prevent issues caused by
 |  | 
 | 
											
												
													
														|  | - * third-party frameworks and libraries.
 |  | 
 | 
											
												
													
														|  | - * @var {string}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        i++;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disable range request loading of PDF files. When enabled and if the server
 |  | 
 | 
											
												
													
														|  | - * supports partial content requests then the PDF will be fetched in chunks.
 |  | 
 | 
											
												
													
														|  | - * Enabled (false) by default.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableRange = (PDFJS.disableRange === undefined ?
 |  | 
 | 
											
												
													
														|  | -                      false : PDFJS.disableRange);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // If the entire operatorList was executed, stop as were done.
 | 
											
												
													
														|  | 
 |  | +        if (i === argsArrayLen) {
 | 
											
												
													
														|  | 
 |  | +          return i;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF
 |  | 
 | 
											
												
													
														|  | - * in chunks. This default behavior can be disabled.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableStream = (PDFJS.disableStream === undefined ?
 |  | 
 | 
											
												
													
														|  | -                       false : PDFJS.disableStream);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // If the execution took longer then a certain amount of time and
 | 
											
												
													
														|  | 
 |  | +        // `continueCallback` is specified, interrupt the execution.
 | 
											
												
													
														|  | 
 |  | +        if (chunkOperations && ++steps > EXECUTION_STEPS) {
 | 
											
												
													
														|  | 
 |  | +          if (Date.now() > endTime) {
 | 
											
												
													
														|  | 
 |  | +            continueCallback();
 | 
											
												
													
														|  | 
 |  | +            return i;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          steps = 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
 |  | 
 | 
											
												
													
														|  | - * will automatically keep fetching more data even if it isn't needed to display
 |  | 
 | 
											
												
													
														|  | - * the current page. This default behavior can be disabled.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * NOTE: It is also necessary to disable streaming, see above,
 |  | 
 | 
											
												
													
														|  | - *       in order for disabling of pre-fetching to work correctly.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?
 |  | 
 | 
											
												
													
														|  | -                          false : PDFJS.disableAutoFetch);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // If the operatorList isn't executed completely yet OR the execution
 | 
											
												
													
														|  | 
 |  | +        // time was short enough, do another execution round.
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Enables special hooks for debugging PDF.js.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endDrawing: function CanvasGraphics_endDrawing() {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.restore();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Enables transfer usage in postMessage for ArrayBuffers.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?
 |  | 
 | 
											
												
													
														|  | -                              true : PDFJS.postMessageTransfers);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.transparentCanvas) {
 | 
											
												
													
														|  | 
 |  | +        this.ctx = this.compositeCtx;
 | 
											
												
													
														|  | 
 |  | +        this.ctx.drawImage(this.transparentCanvas, 0, 0);
 | 
											
												
													
														|  | 
 |  | +        this.transparentCanvas = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disables URL.createObjectURL usage.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?
 |  | 
 | 
											
												
													
														|  | -                                false : PDFJS.disableCreateObjectURL);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.cachedCanvases.clear();
 | 
											
												
													
														|  | 
 |  | +      WebGLUtils.clear();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (this.imageLayer) {
 | 
											
												
													
														|  | 
 |  | +        this.imageLayer.endLayout();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // Graphics state
 | 
											
												
													
														|  | 
 |  | +    setLineWidth: function CanvasGraphics_setLineWidth(width) {
 | 
											
												
													
														|  | 
 |  | +      this.current.lineWidth = width;
 | 
											
												
													
														|  | 
 |  | +      this.ctx.lineWidth = width;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setLineCap: function CanvasGraphics_setLineCap(style) {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.lineCap = LINE_CAP_STYLES[style];
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setLineJoin: function CanvasGraphics_setLineJoin(style) {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.miterLimit = limit;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      if (ctx.setLineDash !== undefined) {
 | 
											
												
													
														|  | 
 |  | +        ctx.setLineDash(dashArray);
 | 
											
												
													
														|  | 
 |  | +        ctx.lineDashOffset = dashPhase;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        ctx.mozDash = dashArray;
 | 
											
												
													
														|  | 
 |  | +        ctx.mozDashOffset = dashPhase;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
 | 
											
												
													
														|  | 
 |  | +      // Maybe if we one day fully support color spaces this will be important
 | 
											
												
													
														|  | 
 |  | +      // for now we can ignore.
 | 
											
												
													
														|  | 
 |  | +      // TODO set rendering intent?
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setFlatness: function CanvasGraphics_setFlatness(flatness) {
 | 
											
												
													
														|  | 
 |  | +      // There's no way to control this with canvas, but we can safely ignore.
 | 
											
												
													
														|  | 
 |  | +      // TODO set flatness?
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setGState: function CanvasGraphics_setGState(states) {
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = states.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        var state = states[i];
 | 
											
												
													
														|  | 
 |  | +        var key = state[0];
 | 
											
												
													
														|  | 
 |  | +        var value = state[1];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        switch (key) {
 | 
											
												
													
														|  | 
 |  | +          case 'LW':
 | 
											
												
													
														|  | 
 |  | +            this.setLineWidth(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'LC':
 | 
											
												
													
														|  | 
 |  | +            this.setLineCap(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'LJ':
 | 
											
												
													
														|  | 
 |  | +            this.setLineJoin(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'ML':
 | 
											
												
													
														|  | 
 |  | +            this.setMiterLimit(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'D':
 | 
											
												
													
														|  | 
 |  | +            this.setDash(value[0], value[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'RI':
 | 
											
												
													
														|  | 
 |  | +            this.setRenderingIntent(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'FL':
 | 
											
												
													
														|  | 
 |  | +            this.setFlatness(value);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'Font':
 | 
											
												
													
														|  | 
 |  | +            this.setFont(value[0], value[1]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'CA':
 | 
											
												
													
														|  | 
 |  | +            this.current.strokeAlpha = state[1];
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'ca':
 | 
											
												
													
														|  | 
 |  | +            this.current.fillAlpha = state[1];
 | 
											
												
													
														|  | 
 |  | +            this.ctx.globalAlpha = state[1];
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'BM':
 | 
											
												
													
														|  | 
 |  | +            if (value && value.name && (value.name !== 'Normal')) {
 | 
											
												
													
														|  | 
 |  | +              var mode = value.name.replace(/([A-Z])/g,
 | 
											
												
													
														|  | 
 |  | +                function(c) {
 | 
											
												
													
														|  | 
 |  | +                  return '-' + c.toLowerCase();
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +              ).substring(1);
 | 
											
												
													
														|  | 
 |  | +              this.ctx.globalCompositeOperation = mode;
 | 
											
												
													
														|  | 
 |  | +              if (this.ctx.globalCompositeOperation !== mode) {
 | 
											
												
													
														|  | 
 |  | +                warn('globalCompositeOperation "' + mode +
 | 
											
												
													
														|  | 
 |  | +                     '" is not supported');
 | 
											
												
													
														|  | 
 |  | +              }
 | 
											
												
													
														|  | 
 |  | +            } else {
 | 
											
												
													
														|  | 
 |  | +              this.ctx.globalCompositeOperation = 'source-over';
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'SMask':
 | 
											
												
													
														|  | 
 |  | +            if (this.current.activeSMask) {
 | 
											
												
													
														|  | 
 |  | +              this.endSMaskGroup();
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            this.current.activeSMask = value ? this.tempSMask : null;
 | 
											
												
													
														|  | 
 |  | +            if (this.current.activeSMask) {
 | 
											
												
													
														|  | 
 |  | +              this.beginSMaskGroup();
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            this.tempSMask = null;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disables WebGL usage.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?
 |  | 
 | 
											
												
													
														|  | -                      true : PDFJS.disableWebGL);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var activeSMask = this.current.activeSMask;
 | 
											
												
													
														|  | 
 |  | +      var drawnWidth = activeSMask.canvas.width;
 | 
											
												
													
														|  | 
 |  | +      var drawnHeight = activeSMask.canvas.height;
 | 
											
												
													
														|  | 
 |  | +      var cacheId = 'smaskGroupAt' + this.groupLevel;
 | 
											
												
													
														|  | 
 |  | +      var scratchCanvas = this.cachedCanvases.getCanvas(
 | 
											
												
													
														|  | 
 |  | +        cacheId, drawnWidth, drawnHeight, true);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Disables fullscreen support, and by extension Presentation Mode,
 |  | 
 | 
											
												
													
														|  | - * in browsers which support the fullscreen API.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ?
 |  | 
 | 
											
												
													
														|  | -                           false : PDFJS.disableFullscreen);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var currentCtx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var currentTransform = currentCtx.mozCurrentTransform;
 | 
											
												
													
														|  | 
 |  | +      this.ctx.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Enables CSS only zooming.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?
 |  | 
 | 
											
												
													
														|  | -                        false : PDFJS.useOnlyCssZoom);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var groupCtx = scratchCanvas.context;
 | 
											
												
													
														|  | 
 |  | +      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
 | 
											
												
													
														|  | 
 |  | +      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
 | 
											
												
													
														|  | 
 |  | +      groupCtx.transform.apply(groupCtx, currentTransform);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Controls the logging level.
 |  | 
 | 
											
												
													
														|  | - * The constants from PDFJS.VERBOSITY_LEVELS should be used:
 |  | 
 | 
											
												
													
														|  | - * - errors
 |  | 
 | 
											
												
													
														|  | - * - warnings [default]
 |  | 
 | 
											
												
													
														|  | - * - infos
 |  | 
 | 
											
												
													
														|  | - * @var {number}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.verbosity = (PDFJS.verbosity === undefined ?
 |  | 
 | 
											
												
													
														|  | -                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      copyCtxState(currentCtx, groupCtx);
 | 
											
												
													
														|  | 
 |  | +      this.ctx = groupCtx;
 | 
											
												
													
														|  | 
 |  | +      this.setGState([
 | 
											
												
													
														|  | 
 |  | +        ['BM', 'Normal'],
 | 
											
												
													
														|  | 
 |  | +        ['ca', 1],
 | 
											
												
													
														|  | 
 |  | +        ['CA', 1]
 | 
											
												
													
														|  | 
 |  | +      ]);
 | 
											
												
													
														|  | 
 |  | +      this.groupStack.push(currentCtx);
 | 
											
												
													
														|  | 
 |  | +      this.groupLevel++;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
 | 
											
												
													
														|  | 
 |  | +      var groupCtx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      this.groupLevel--;
 | 
											
												
													
														|  | 
 |  | +      this.ctx = this.groupStack.pop();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * The maximum supported canvas size in total pixels e.g. width * height.
 |  | 
 | 
											
												
													
														|  | - * The default value is 4096 * 4096. Use -1 for no limit.
 |  | 
 | 
											
												
													
														|  | - * @var {number}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
 |  | 
 | 
											
												
													
														|  | -                         16777216 : PDFJS.maxCanvasPixels);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
 | 
											
												
													
														|  | 
 |  | +      this.ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      copyCtxState(groupCtx, this.ctx);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    save: function CanvasGraphics_save() {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.save();
 | 
											
												
													
														|  | 
 |  | +      var old = this.current;
 | 
											
												
													
														|  | 
 |  | +      this.stateStack.push(old);
 | 
											
												
													
														|  | 
 |  | +      this.current = old.clone();
 | 
											
												
													
														|  | 
 |  | +      this.current.activeSMask = null;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    restore: function CanvasGraphics_restore() {
 | 
											
												
													
														|  | 
 |  | +      if (this.stateStack.length !== 0) {
 | 
											
												
													
														|  | 
 |  | +        if (this.current.activeSMask !== null) {
 | 
											
												
													
														|  | 
 |  | +          this.endSMaskGroup();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * (Deprecated) Opens external links in a new window if enabled.
 |  | 
 | 
											
												
													
														|  | - * The default behavior opens external links in the PDF.js window.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * NOTE: This property has been deprecated, please use
 |  | 
 | 
											
												
													
														|  | - *       `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead.
 |  | 
 | 
											
												
													
														|  | - * @var {boolean}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.openExternalLinksInNewWindow = (
 |  | 
 | 
											
												
													
														|  | -  PDFJS.openExternalLinksInNewWindow === undefined ?
 |  | 
 | 
											
												
													
														|  | -    false : PDFJS.openExternalLinksInNewWindow);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.current = this.stateStack.pop();
 | 
											
												
													
														|  | 
 |  | +        this.ctx.restore();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Specifies the |target| attribute for external links.
 |  | 
 | 
											
												
													
														|  | - * The constants from PDFJS.LinkTarget should be used:
 |  | 
 | 
											
												
													
														|  | - *  - NONE [default]
 |  | 
 | 
											
												
													
														|  | - *  - SELF
 |  | 
 | 
											
												
													
														|  | - *  - BLANK
 |  | 
 | 
											
												
													
														|  | - *  - PARENT
 |  | 
 | 
											
												
													
														|  | - *  - TOP
 |  | 
 | 
											
												
													
														|  | - * @var {number}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ?
 |  | 
 | 
											
												
													
														|  | -                            PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Ensure that the clipping path is reset (fixes issue6413.pdf).
 | 
											
												
													
														|  | 
 |  | +        this.pendingClip = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Specifies the |rel| attribute for external links. Defaults to stripping
 |  | 
 | 
											
												
													
														|  | - * the referrer.
 |  | 
 | 
											
												
													
														|  | - * @var {string}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ?
 |  | 
 | 
											
												
													
														|  | -                         'noreferrer' : PDFJS.externalLinkRel);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.cachedGetSinglePixelWidth = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.transform(a, b, c, d, e, f);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | -  * Determines if we can eval strings as JS. Primarily used to improve
 |  | 
 | 
											
												
													
														|  | -  * performance for font rendering.
 |  | 
 | 
											
												
													
														|  | -  * @var {boolean}
 |  | 
 | 
											
												
													
														|  | -  */
 |  | 
 | 
											
												
													
														|  | -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ?
 |  | 
 | 
											
												
													
														|  | -                         true : PDFJS.isEvalSupported);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.cachedGetSinglePixelWidth = null;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Document initialization / loading parameters object.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} DocumentInitParameters
 |  | 
 | 
											
												
													
														|  | - * @property {string}     url   - The URL of the PDF.
 |  | 
 | 
											
												
													
														|  | - * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays
 |  | 
 | 
											
												
													
														|  | - *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,
 |  | 
 | 
											
												
													
														|  | - *   use atob() to convert it to a binary string first.
 |  | 
 | 
											
												
													
														|  | - * @property {Object}     httpHeaders - Basic authentication headers.
 |  | 
 | 
											
												
													
														|  | - * @property {boolean}    withCredentials - Indicates whether or not cross-site
 |  | 
 | 
											
												
													
														|  | - *   Access-Control requests should be made using credentials such as cookies
 |  | 
 | 
											
												
													
														|  | - *   or authorization headers. The default is false.
 |  | 
 | 
											
												
													
														|  | - * @property {string}     password - For decrypting password-protected PDFs.
 |  | 
 | 
											
												
													
														|  | - * @property {TypedArray} initialData - A typed array with the first portion or
 |  | 
 | 
											
												
													
														|  | - *   all of the pdf data. Used by the extension since some data is already
 |  | 
 | 
											
												
													
														|  | - *   loaded before the switch to range requests.
 |  | 
 | 
											
												
													
														|  | - * @property {number}     length - The PDF file length. It's used for progress
 |  | 
 | 
											
												
													
														|  | - *   reports and range requests operations.
 |  | 
 | 
											
												
													
														|  | - * @property {PDFDataRangeTransport} range
 |  | 
 | 
											
												
													
														|  | - * @property {number}     rangeChunkSize - Optional parameter to specify
 |  | 
 | 
											
												
													
														|  | - *   maximum number of bytes fetched per range request. The default value is
 |  | 
 | 
											
												
													
														|  | - *   2^16 = 65536.
 |  | 
 | 
											
												
													
														|  | - * @property {PDFWorker}  worker - The worker that will be used for the loading
 |  | 
 | 
											
												
													
														|  | - *   and parsing of the PDF data.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Path
 | 
											
												
													
														|  | 
 |  | +    constructPath: function CanvasGraphics_constructPath(ops, args) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var x = current.x, y = current.y;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        switch (ops[i] | 0) {
 | 
											
												
													
														|  | 
 |  | +          case OPS.rectangle:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            var width = args[j++];
 | 
											
												
													
														|  | 
 |  | +            var height = args[j++];
 | 
											
												
													
														|  | 
 |  | +            if (width === 0) {
 | 
											
												
													
														|  | 
 |  | +              width = this.getSinglePixelWidth();
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            if (height === 0) {
 | 
											
												
													
														|  | 
 |  | +              height = this.getSinglePixelWidth();
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            var xw = x + width;
 | 
											
												
													
														|  | 
 |  | +            var yh = y + height;
 | 
											
												
													
														|  | 
 |  | +            this.ctx.moveTo(x, y);
 | 
											
												
													
														|  | 
 |  | +            this.ctx.lineTo(xw, y);
 | 
											
												
													
														|  | 
 |  | +            this.ctx.lineTo(xw, yh);
 | 
											
												
													
														|  | 
 |  | +            this.ctx.lineTo(x, yh);
 | 
											
												
													
														|  | 
 |  | +            this.ctx.lineTo(x, y);
 | 
											
												
													
														|  | 
 |  | +            this.ctx.closePath();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.moveTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            ctx.moveTo(x, y);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.lineTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j++];
 | 
											
												
													
														|  | 
 |  | +            y = args[j++];
 | 
											
												
													
														|  | 
 |  | +            ctx.lineTo(x, y);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo:
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 4];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 5];
 | 
											
												
													
														|  | 
 |  | +            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],
 | 
											
												
													
														|  | 
 |  | +                              x, y);
 | 
											
												
													
														|  | 
 |  | +            j += 6;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo2:
 | 
											
												
													
														|  | 
 |  | +            ctx.bezierCurveTo(x, y, args[j], args[j + 1],
 | 
											
												
													
														|  | 
 |  | +                              args[j + 2], args[j + 3]);
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 2];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 3];
 | 
											
												
													
														|  | 
 |  | +            j += 4;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.curveTo3:
 | 
											
												
													
														|  | 
 |  | +            x = args[j + 2];
 | 
											
												
													
														|  | 
 |  | +            y = args[j + 3];
 | 
											
												
													
														|  | 
 |  | +            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
 | 
											
												
													
														|  | 
 |  | +            j += 4;
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case OPS.closePath:
 | 
											
												
													
														|  | 
 |  | +            ctx.closePath();
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      current.setCurrentPoint(x, y);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    closePath: function CanvasGraphics_closePath() {
 | 
											
												
													
														|  | 
 |  | +      this.ctx.closePath();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    stroke: function CanvasGraphics_stroke(consumePath) {
 | 
											
												
													
														|  | 
 |  | +      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var strokeColor = this.current.strokeColor;
 | 
											
												
													
														|  | 
 |  | +      // Prevent drawing too thin lines by enforcing a minimum line width.
 | 
											
												
													
														|  | 
 |  | +      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,
 | 
											
												
													
														|  | 
 |  | +                               this.current.lineWidth);
 | 
											
												
													
														|  | 
 |  | +      // For stroke we want to temporarily change the global alpha to the
 | 
											
												
													
														|  | 
 |  | +      // stroking alpha.
 | 
											
												
													
														|  | 
 |  | +      ctx.globalAlpha = this.current.strokeAlpha;
 | 
											
												
													
														|  | 
 |  | +      if (strokeColor && strokeColor.hasOwnProperty('type') &&
 | 
											
												
													
														|  | 
 |  | +          strokeColor.type === 'Pattern') {
 | 
											
												
													
														|  | 
 |  | +        // for patterns, we transform to pattern space, calculate
 | 
											
												
													
														|  | 
 |  | +        // the pattern, call stroke, and restore to user space
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
 | 
											
												
													
														|  | 
 |  | +        ctx.stroke();
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        ctx.stroke();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (consumePath) {
 | 
											
												
													
														|  | 
 |  | +        this.consumePath();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      // Restore the global alpha to the fill alpha
 | 
											
												
													
														|  | 
 |  | +      ctx.globalAlpha = this.current.fillAlpha;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    closeStroke: function CanvasGraphics_closeStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.closePath();
 | 
											
												
													
														|  | 
 |  | +      this.stroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    fill: function CanvasGraphics_fill(consumePath) {
 | 
											
												
													
														|  | 
 |  | +      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var fillColor = this.current.fillColor;
 | 
											
												
													
														|  | 
 |  | +      var isPatternFill = this.current.patternFill;
 | 
											
												
													
														|  | 
 |  | +      var needRestore = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} PDFDocumentStats
 |  | 
 | 
											
												
													
														|  | - * @property {Array} streamTypes - Used stream types in the document (an item
 |  | 
 | 
											
												
													
														|  | - *   is set to true if specific stream ID was used in the document).
 |  | 
 | 
											
												
													
														|  | - * @property {Array} fontTypes - Used font type in the document (an item is set
 |  | 
 | 
											
												
													
														|  | - *   to true if specific font ID was used in the document).
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isPatternFill) {
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        if (this.baseTransform) {
 | 
											
												
													
														|  | 
 |  | +          ctx.setTransform.apply(ctx, this.baseTransform);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        ctx.fillStyle = fillColor.getPattern(ctx, this);
 | 
											
												
													
														|  | 
 |  | +        needRestore = true;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * This is the main entry point for loading a PDF and interacting with it.
 |  | 
 | 
											
												
													
														|  | - * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
 |  | 
 | 
											
												
													
														|  | - * is used, which means it must follow the same origin rules that any XHR does
 |  | 
 | 
											
												
													
														|  | - * e.g. No cross domain requests without CORS.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src
 |  | 
 | 
											
												
													
														|  | - * Can be a url to where a PDF is located, a typed array (Uint8Array)
 |  | 
 | 
											
												
													
														|  | - * already populated with data or parameter object.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used
 |  | 
 | 
											
												
													
														|  | - * if you want to manually serve range requests for data in the PDF.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @param {function} passwordCallback (deprecated) It is used to request a
 |  | 
 | 
											
												
													
														|  | - * password if wrong or no password was provided. The callback receives two
 |  | 
 | 
											
												
													
														|  | - * parameters: function that needs to be called with new password and reason
 |  | 
 | 
											
												
													
														|  | - * (see {PasswordResponses}).
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @param {function} progressCallback (deprecated) It is used to be able to
 |  | 
 | 
											
												
													
														|  | - * monitor the loading progress of the PDF file (necessary to implement e.g.
 |  | 
 | 
											
												
													
														|  | - * a loading bar). The callback receives an {Object} with the properties:
 |  | 
 | 
											
												
													
														|  | - * {number} loaded and {number} total.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @return {PDFDocumentLoadingTask}
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -PDFJS.getDocument = function getDocument(src,
 |  | 
 | 
											
												
													
														|  | -                                         pdfDataRangeTransport,
 |  | 
 | 
											
												
													
														|  | -                                         passwordCallback,
 |  | 
 | 
											
												
													
														|  | -                                         progressCallback) {
 |  | 
 | 
											
												
													
														|  | -  var task = new PDFDocumentLoadingTask();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.pendingEOFill) {
 | 
											
												
													
														|  | 
 |  | +        if (ctx.mozFillRule !== undefined) {
 | 
											
												
													
														|  | 
 |  | +          ctx.mozFillRule = 'evenodd';
 | 
											
												
													
														|  | 
 |  | +          ctx.fill();
 | 
											
												
													
														|  | 
 |  | +          ctx.mozFillRule = 'nonzero';
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          ctx.fill('evenodd');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        this.pendingEOFill = false;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        ctx.fill();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // Support of the obsolete arguments (for compatibility with API v1.0)
 |  | 
 | 
											
												
													
														|  | -  if (arguments.length > 1) {
 |  | 
 | 
											
												
													
														|  | -    deprecated('getDocument is called with pdfDataRangeTransport, ' +
 |  | 
 | 
											
												
													
														|  | -               'passwordCallback or progressCallback argument');
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  if (pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {
 |  | 
 | 
											
												
													
														|  | -      // Not a PDFDataRangeTransport instance, trying to add missing properties.
 |  | 
 | 
											
												
													
														|  | -      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);
 |  | 
 | 
											
												
													
														|  | -      pdfDataRangeTransport.length = src.length;
 |  | 
 | 
											
												
													
														|  | -      pdfDataRangeTransport.initialData = src.initialData;
 |  | 
 | 
											
												
													
														|  | -      if (!pdfDataRangeTransport.abort) {
 |  | 
 | 
											
												
													
														|  | -        pdfDataRangeTransport.abort = function () {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (needRestore) {
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    src = Object.create(src);
 |  | 
 | 
											
												
													
														|  | -    src.range = pdfDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  task.onPassword = passwordCallback || null;
 |  | 
 | 
											
												
													
														|  | -  task.onProgress = progressCallback || null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (consumePath) {
 | 
											
												
													
														|  | 
 |  | +        this.consumePath();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    eoFill: function CanvasGraphics_eoFill() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingEOFill = true;
 | 
											
												
													
														|  | 
 |  | +      this.fill();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    fillStroke: function CanvasGraphics_fillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.fill(false);
 | 
											
												
													
														|  | 
 |  | +      this.stroke(false);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var source;
 |  | 
 | 
											
												
													
														|  | -  if (typeof src === 'string') {
 |  | 
 | 
											
												
													
														|  | -    source = { url: src };
 |  | 
 | 
											
												
													
														|  | -  } else if (isArrayBuffer(src)) {
 |  | 
 | 
											
												
													
														|  | -    source = { data: src };
 |  | 
 | 
											
												
													
														|  | -  } else if (src instanceof PDFDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -    source = { range: src };
 |  | 
 | 
											
												
													
														|  | -  } else {
 |  | 
 | 
											
												
													
														|  | -    if (typeof src !== 'object') {
 |  | 
 | 
											
												
													
														|  | -      error('Invalid parameter in getDocument, need either Uint8Array, ' +
 |  | 
 | 
											
												
													
														|  | -        'string or a parameter object');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (!src.url && !src.data && !src.range) {
 |  | 
 | 
											
												
													
														|  | -      error('Invalid parameter object: need either .data, .range or .url');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.consumePath();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    eoFillStroke: function CanvasGraphics_eoFillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingEOFill = true;
 | 
											
												
													
														|  | 
 |  | +      this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    closeFillStroke: function CanvasGraphics_closeFillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.closePath();
 | 
											
												
													
														|  | 
 |  | +      this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingEOFill = true;
 | 
											
												
													
														|  | 
 |  | +      this.closePath();
 | 
											
												
													
														|  | 
 |  | +      this.fillStroke();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    endPath: function CanvasGraphics_endPath() {
 | 
											
												
													
														|  | 
 |  | +      this.consumePath();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    source = src;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Clipping
 | 
											
												
													
														|  | 
 |  | +    clip: function CanvasGraphics_clip() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingClip = NORMAL_CLIP;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    eoClip: function CanvasGraphics_eoClip() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingClip = EO_CLIP;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var params = {};
 |  | 
 | 
											
												
													
														|  | -  var rangeTransport = null;
 |  | 
 | 
											
												
													
														|  | -  var worker = null;
 |  | 
 | 
											
												
													
														|  | -  for (var key in source) {
 |  | 
 | 
											
												
													
														|  | -    if (key === 'url' && typeof window !== 'undefined') {
 |  | 
 | 
											
												
													
														|  | -      // The full path is required in the 'url' field.
 |  | 
 | 
											
												
													
														|  | -      params[key] = combineUrl(window.location.href, source[key]);
 |  | 
 | 
											
												
													
														|  | -      continue;
 |  | 
 | 
											
												
													
														|  | -    } else if (key === 'range') {
 |  | 
 | 
											
												
													
														|  | -      rangeTransport = source[key];
 |  | 
 | 
											
												
													
														|  | -      continue;
 |  | 
 | 
											
												
													
														|  | -    } else if (key === 'worker') {
 |  | 
 | 
											
												
													
														|  | -      worker = source[key];
 |  | 
 | 
											
												
													
														|  | -      continue;
 |  | 
 | 
											
												
													
														|  | -    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
 |  | 
 | 
											
												
													
														|  | -      // Converting string or array-like data to Uint8Array.
 |  | 
 | 
											
												
													
														|  | -      var pdfBytes = source[key];
 |  | 
 | 
											
												
													
														|  | -      if (typeof pdfBytes === 'string') {
 |  | 
 | 
											
												
													
														|  | -        params[key] = stringToBytes(pdfBytes);
 |  | 
 | 
											
												
													
														|  | -      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&
 |  | 
 | 
											
												
													
														|  | -                 !isNaN(pdfBytes.length)) {
 |  | 
 | 
											
												
													
														|  | -        params[key] = new Uint8Array(pdfBytes);
 |  | 
 | 
											
												
													
														|  | -      } else if (isArrayBuffer(pdfBytes)) {
 |  | 
 | 
											
												
													
														|  | -        params[key] = new Uint8Array(pdfBytes);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        error('Invalid PDF binary data: either typed array, string or ' +
 |  | 
 | 
											
												
													
														|  | -              'array-like object is expected in the data property.');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Text
 | 
											
												
													
														|  | 
 |  | +    beginText: function CanvasGraphics_beginText() {
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrix = IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrixScale = 1;
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY = 0;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    endText: function CanvasGraphics_endText() {
 | 
											
												
													
														|  | 
 |  | +      var paths = this.pendingTextPaths;
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      if (paths === undefined) {
 | 
											
												
													
														|  | 
 |  | +        ctx.beginPath();
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      continue;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    params[key] = source[key];
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  if (!worker) {
 |  | 
 | 
											
												
													
														|  | -    // Worker was not provided -- creating and owning our own.
 |  | 
 | 
											
												
													
														|  | -    worker = new PDFWorker();
 |  | 
 | 
											
												
													
														|  | -    task._worker = worker;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  var docId = task.docId;
 |  | 
 | 
											
												
													
														|  | -  worker.promise.then(function () {
 |  | 
 | 
											
												
													
														|  | -    if (task.destroyed) {
 |  | 
 | 
											
												
													
														|  | -      throw new Error('Loading aborted');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return _fetchDocument(worker, params, rangeTransport, docId).then(
 |  | 
 | 
											
												
													
														|  | -        function (workerId) {
 |  | 
 | 
											
												
													
														|  | -      if (task.destroyed) {
 |  | 
 | 
											
												
													
														|  | -        throw new Error('Loading aborted');
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.save();
 | 
											
												
													
														|  | 
 |  | +      ctx.beginPath();
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0; i < paths.length; i++) {
 | 
											
												
													
														|  | 
 |  | +        var path = paths[i];
 | 
											
												
													
														|  | 
 |  | +        ctx.setTransform.apply(ctx, path.transform);
 | 
											
												
													
														|  | 
 |  | +        ctx.translate(path.x, path.y);
 | 
											
												
													
														|  | 
 |  | +        path.addToPath(ctx, path.fontSize);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      var messageHandler = new MessageHandler(docId, workerId, worker.port);
 |  | 
 | 
											
												
													
														|  | -      messageHandler.send('Ready', null);
 |  | 
 | 
											
												
													
														|  | -      var transport = new WorkerTransport(messageHandler, task, rangeTransport);
 |  | 
 | 
											
												
													
														|  | -      task._transport = transport;
 |  | 
 | 
											
												
													
														|  | -    });
 |  | 
 | 
											
												
													
														|  | -  }, task._capability.reject);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  return task;
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      ctx.clip();
 | 
											
												
													
														|  | 
 |  | +      ctx.beginPath();
 | 
											
												
													
														|  | 
 |  | +      delete this.pendingTextPaths;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
 | 
											
												
													
														|  | 
 |  | +      this.current.charSpacing = spacing;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
 | 
											
												
													
														|  | 
 |  | +      this.current.wordSpacing = spacing;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setHScale: function CanvasGraphics_setHScale(scale) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textHScale = scale / 100;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setLeading: function CanvasGraphics_setLeading(leading) {
 | 
											
												
													
														|  | 
 |  | +      this.current.leading = -leading;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setFont: function CanvasGraphics_setFont(fontRefName, size) {
 | 
											
												
													
														|  | 
 |  | +      var fontObj = this.commonObjs.get(fontRefName);
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Starts fetching of specified PDF document/data.
 |  | 
 | 
											
												
													
														|  | - * @param {PDFWorker} worker
 |  | 
 | 
											
												
													
														|  | - * @param {Object} source
 |  | 
 | 
											
												
													
														|  | - * @param {PDFDataRangeTransport} pdfDataRangeTransport
 |  | 
 | 
											
												
													
														|  | - * @param {string} docId Unique document id, used as MessageHandler id.
 |  | 
 | 
											
												
													
														|  | - * @returns {Promise} The promise, which is resolved when worker id of
 |  | 
 | 
											
												
													
														|  | - *                    MessageHandler is known.
 |  | 
 | 
											
												
													
														|  | - * @private
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
 |  | 
 | 
											
												
													
														|  | -  if (worker.destroyed) {
 |  | 
 | 
											
												
													
														|  | -    return Promise.reject(new Error('Worker was destroyed'));
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (!fontObj) {
 | 
											
												
													
														|  | 
 |  | +        error('Can\'t find font for ' + fontRefName);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  source.disableAutoFetch = PDFJS.disableAutoFetch;
 |  | 
 | 
											
												
													
														|  | -  source.disableStream = PDFJS.disableStream;
 |  | 
 | 
											
												
													
														|  | -  source.chunkedViewerLoading = !!pdfDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -  if (pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -    source.length = pdfDataRangeTransport.length;
 |  | 
 | 
											
												
													
														|  | -    source.initialData = pdfDataRangeTransport.initialData;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  return worker.messageHandler.sendWithPromise('GetDocRequest', {
 |  | 
 | 
											
												
													
														|  | -    docId: docId,
 |  | 
 | 
											
												
													
														|  | -    source: source,
 |  | 
 | 
											
												
													
														|  | -    disableRange: PDFJS.disableRange,
 |  | 
 | 
											
												
													
														|  | -    maxImageSize: PDFJS.maxImageSize,
 |  | 
 | 
											
												
													
														|  | -    cMapUrl: PDFJS.cMapUrl,
 |  | 
 | 
											
												
													
														|  | -    cMapPacked: PDFJS.cMapPacked,
 |  | 
 | 
											
												
													
														|  | -    disableFontFace: PDFJS.disableFontFace,
 |  | 
 | 
											
												
													
														|  | -    disableCreateObjectURL: PDFJS.disableCreateObjectURL,
 |  | 
 | 
											
												
													
														|  | -    verbosity: PDFJS.verbosity
 |  | 
 | 
											
												
													
														|  | -  }).then(function (workerId) {
 |  | 
 | 
											
												
													
														|  | -    if (worker.destroyed) {
 |  | 
 | 
											
												
													
														|  | -      throw new Error('Worker was destroyed');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return workerId;
 |  | 
 | 
											
												
													
														|  | -  });
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | 
 |  | +      current.fontMatrix = (fontObj.fontMatrix ?
 | 
											
												
													
														|  | 
 |  | +                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * PDF document loading operation.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - * @alias PDFDocumentLoadingTask
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
 |  | 
 | 
											
												
													
														|  | -  var nextDocumentId = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // A valid matrix needs all main diagonal elements to be non-zero
 | 
											
												
													
														|  | 
 |  | +      // This also ensures we bypass FF bugzilla bug #719844.
 | 
											
												
													
														|  | 
 |  | +      if (current.fontMatrix[0] === 0 ||
 | 
											
												
													
														|  | 
 |  | +          current.fontMatrix[3] === 0) {
 | 
											
												
													
														|  | 
 |  | +        warn('Invalid font matrix for font ' + fontRefName);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  /** @constructs PDFDocumentLoadingTask */
 |  | 
 | 
											
												
													
														|  | -  function PDFDocumentLoadingTask() {
 |  | 
 | 
											
												
													
														|  | -    this._capability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -    this._transport = null;
 |  | 
 | 
											
												
													
														|  | -    this._worker = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
 | 
											
												
													
														|  | 
 |  | +      // and in some docs this can be negative (inverted x-y axes).
 | 
											
												
													
														|  | 
 |  | +      if (size < 0) {
 | 
											
												
													
														|  | 
 |  | +        size = -size;
 | 
											
												
													
														|  | 
 |  | +        current.fontDirection = -1;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        current.fontDirection = 1;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Unique document loading task id -- used in MessageHandlers.
 |  | 
 | 
											
												
													
														|  | -     * @type {string}
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    this.docId = 'd' + (nextDocumentId++);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.current.font = fontObj;
 | 
											
												
													
														|  | 
 |  | +      this.current.fontSize = size;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Shows if loading task is destroyed.
 |  | 
 | 
											
												
													
														|  | -     * @type {boolean}
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    this.destroyed = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (fontObj.isType3Font) {
 | 
											
												
													
														|  | 
 |  | +        return; // we don't need ctx.font for Type3 fonts
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Callback to request a password if wrong or no password was provided.
 |  | 
 | 
											
												
													
														|  | -     * The callback receives two parameters: function that needs to be called
 |  | 
 | 
											
												
													
														|  | -     * with new password and reason (see {PasswordResponses}).
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    this.onPassword = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var name = fontObj.loadedName || 'sans-serif';
 | 
											
												
													
														|  | 
 |  | +      var bold = fontObj.black ? (fontObj.bold ? '900' : 'bold') :
 | 
											
												
													
														|  | 
 |  | +                                 (fontObj.bold ? 'bold' : 'normal');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Callback to be able to monitor the loading progress of the PDF file
 |  | 
 | 
											
												
													
														|  | -     * (necessary to implement e.g. a loading bar). The callback receives
 |  | 
 | 
											
												
													
														|  | -     * an {Object} with the properties: {number} loaded and {number} total.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    this.onProgress = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var italic = fontObj.italic ? 'italic' : 'normal';
 | 
											
												
													
														|  | 
 |  | +      var typeface = '"' + name + '", ' + fontObj.fallbackName;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Callback to when unsupported feature is used. The callback receives
 |  | 
 | 
											
												
													
														|  | -     * an {PDFJS.UNSUPPORTED_FEATURES} argument.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    this.onUnsupportedFeature = null;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Some font backends cannot handle fonts below certain size.
 | 
											
												
													
														|  | 
 |  | +      // Keeping the font at minimal size and using the fontSizeScale to change
 | 
											
												
													
														|  | 
 |  | +      // the current transformation matrix before the fillText/strokeText.
 | 
											
												
													
														|  | 
 |  | +      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
 | 
											
												
													
														|  | 
 |  | +      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :
 | 
											
												
													
														|  | 
 |  | +                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
 | 
											
												
													
														|  | 
 |  | +      this.current.fontSizeScale = size / browserFontSize;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  PDFDocumentLoadingTask.prototype =
 |  | 
 | 
											
												
													
														|  | -      /** @lends PDFDocumentLoadingTask.prototype */ {
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise}
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get promise() {
 |  | 
 | 
											
												
													
														|  | -      return this._capability.promise;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
 | 
											
												
													
														|  | 
 |  | +      this.ctx.font = rule;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Aborts all network requests and destroys worker.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved after destruction activity
 |  | 
 | 
											
												
													
														|  | -     *                   is completed.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    destroy: function () {
 |  | 
 | 
											
												
													
														|  | -      this.destroyed = true;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var transportDestroyed = !this._transport ? Promise.resolve() :
 |  | 
 | 
											
												
													
														|  | -        this._transport.destroy();
 |  | 
 | 
											
												
													
														|  | -      return transportDestroyed.then(function () {
 |  | 
 | 
											
												
													
														|  | -        this._transport = null;
 |  | 
 | 
											
												
													
														|  | -        if (this._worker) {
 |  | 
 | 
											
												
													
														|  | -          this._worker.destroy();
 |  | 
 | 
											
												
													
														|  | -          this._worker = null;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textRenderingMode = mode;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setTextRise: function CanvasGraphics_setTextRise(rise) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textRise = rise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    moveText: function CanvasGraphics_moveText(x, y) {
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX += x;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY += y;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
 | 
											
												
													
														|  | 
 |  | +      this.setLeading(-y);
 | 
											
												
													
														|  | 
 |  | +      this.moveText(x, y);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | 
 |  | +    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrix = [a, b, c, d, e, f];
 | 
											
												
													
														|  | 
 |  | +      this.current.textMatrixScale = Math.sqrt(a * a + b * b);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Registers callbacks to indicate the document loading completion.
 |  | 
 | 
											
												
													
														|  | -     *
 |  | 
 | 
											
												
													
														|  | -     * @param {function} onFulfilled The callback for the loading completion.
 |  | 
 | 
											
												
													
														|  | -     * @param {function} onRejected The callback for the loading failure.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved after the onFulfilled or
 |  | 
 | 
											
												
													
														|  | -     *                   onRejected callback.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
 |  | 
 | 
											
												
													
														|  | -      return this.promise.then.apply(this.promise, arguments);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.current.x = this.current.lineX = 0;
 | 
											
												
													
														|  | 
 |  | +      this.current.y = this.current.lineY = 0;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    nextLine: function CanvasGraphics_nextLine() {
 | 
											
												
													
														|  | 
 |  | +      this.moveText(0, this.current.leading);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return PDFDocumentLoadingTask;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintChar: function CanvasGraphics_paintChar(character, x, y) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var font = current.font;
 | 
											
												
													
														|  | 
 |  | +      var textRenderingMode = current.textRenderingMode;
 | 
											
												
													
														|  | 
 |  | +      var fontSize = current.fontSize / current.fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +      var fillStrokeMode = textRenderingMode &
 | 
											
												
													
														|  | 
 |  | +        TextRenderingMode.FILL_STROKE_MASK;
 | 
											
												
													
														|  | 
 |  | +      var isAddToPathSet = !!(textRenderingMode &
 | 
											
												
													
														|  | 
 |  | +        TextRenderingMode.ADD_TO_PATH_FLAG);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Abstract class to support range requests file loading.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - * @alias PDFJS.PDFDataRangeTransport
 |  | 
 | 
											
												
													
														|  | - * @param {number} length
 |  | 
 | 
											
												
													
														|  | - * @param {Uint8Array} initialData
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {
 |  | 
 | 
											
												
													
														|  | -  function PDFDataRangeTransport(length, initialData) {
 |  | 
 | 
											
												
													
														|  | -    this.length = length;
 |  | 
 | 
											
												
													
														|  | -    this.initialData = initialData;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var addToPath;
 | 
											
												
													
														|  | 
 |  | +      if (font.disableFontFace || isAddToPathSet) {
 | 
											
												
													
														|  | 
 |  | +        addToPath = font.getPathGenerator(this.commonObjs, character);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this._rangeListeners = [];
 |  | 
 | 
											
												
													
														|  | -    this._progressListeners = [];
 |  | 
 | 
											
												
													
														|  | -    this._progressiveReadListeners = [];
 |  | 
 | 
											
												
													
														|  | -    this._readyCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  PDFDataRangeTransport.prototype =
 |  | 
 | 
											
												
													
														|  | -      /** @lends PDFDataRangeTransport.prototype */ {
 |  | 
 | 
											
												
													
														|  | -    addRangeListener:
 |  | 
 | 
											
												
													
														|  | -        function PDFDataRangeTransport_addRangeListener(listener) {
 |  | 
 | 
											
												
													
														|  | -      this._rangeListeners.push(listener);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (font.disableFontFace) {
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.translate(x, y);
 | 
											
												
													
														|  | 
 |  | +        ctx.beginPath();
 | 
											
												
													
														|  | 
 |  | +        addToPath(ctx, fontSize);
 | 
											
												
													
														|  | 
 |  | +        if (fillStrokeMode === TextRenderingMode.FILL ||
 | 
											
												
													
														|  | 
 |  | +            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 | 
											
												
													
														|  | 
 |  | +          ctx.fill();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if (fillStrokeMode === TextRenderingMode.STROKE ||
 | 
											
												
													
														|  | 
 |  | +            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 | 
											
												
													
														|  | 
 |  | +          ctx.stroke();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        if (fillStrokeMode === TextRenderingMode.FILL ||
 | 
											
												
													
														|  | 
 |  | +            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 | 
											
												
													
														|  | 
 |  | +          ctx.fillText(character, x, y);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if (fillStrokeMode === TextRenderingMode.STROKE ||
 | 
											
												
													
														|  | 
 |  | +            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 | 
											
												
													
														|  | 
 |  | +          ctx.strokeText(character, x, y);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    addProgressListener:
 |  | 
 | 
											
												
													
														|  | -        function PDFDataRangeTransport_addProgressListener(listener) {
 |  | 
 | 
											
												
													
														|  | -      this._progressListeners.push(listener);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isAddToPathSet) {
 | 
											
												
													
														|  | 
 |  | +        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
 | 
											
												
													
														|  | 
 |  | +        paths.push({
 | 
											
												
													
														|  | 
 |  | +          transform: ctx.mozCurrentTransform,
 | 
											
												
													
														|  | 
 |  | +          x: x,
 | 
											
												
													
														|  | 
 |  | +          y: y,
 | 
											
												
													
														|  | 
 |  | +          fontSize: fontSize,
 | 
											
												
													
														|  | 
 |  | +          addToPath: addToPath
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    addProgressiveReadListener:
 |  | 
 | 
											
												
													
														|  | -        function PDFDataRangeTransport_addProgressiveReadListener(listener) {
 |  | 
 | 
											
												
													
														|  | -      this._progressiveReadListeners.push(listener);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    get isFontSubpixelAAEnabled() {
 | 
											
												
													
														|  | 
 |  | +      // Checks if anti-aliasing is enabled when scaled text is painted.
 | 
											
												
													
														|  | 
 |  | +      // On Windows GDI scaled fonts looks bad.
 | 
											
												
													
														|  | 
 |  | +      var ctx = document.createElement('canvas').getContext('2d');
 | 
											
												
													
														|  | 
 |  | +      ctx.scale(1.5, 1);
 | 
											
												
													
														|  | 
 |  | +      ctx.fillText('I', 0, 10);
 | 
											
												
													
														|  | 
 |  | +      var data = ctx.getImageData(0, 0, 10, 10).data;
 | 
											
												
													
														|  | 
 |  | +      var enabled = false;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 3; i < data.length; i += 4) {
 | 
											
												
													
														|  | 
 |  | +        if (data[i] > 0 && data[i] < 255) {
 | 
											
												
													
														|  | 
 |  | +          enabled = true;
 | 
											
												
													
														|  | 
 |  | +          break;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return shadow(this, 'isFontSubpixelAAEnabled', enabled);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
 |  | 
 | 
											
												
													
														|  | -      var listeners = this._rangeListeners;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, n = listeners.length; i < n; ++i) {
 |  | 
 | 
											
												
													
														|  | -        listeners[i](begin, chunk);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    showText: function CanvasGraphics_showText(glyphs) {
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var font = current.font;
 | 
											
												
													
														|  | 
 |  | +      if (font.isType3Font) {
 | 
											
												
													
														|  | 
 |  | +        return this.showType3Text(glyphs);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
 |  | 
 | 
											
												
													
														|  | -      this._readyCapability.promise.then(function () {
 |  | 
 | 
											
												
													
														|  | -        var listeners = this._progressListeners;
 |  | 
 | 
											
												
													
														|  | -        for (var i = 0, n = listeners.length; i < n; ++i) {
 |  | 
 | 
											
												
													
														|  | -          listeners[i](loaded);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var fontSize = current.fontSize;
 | 
											
												
													
														|  | 
 |  | +      if (fontSize === 0) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    onDataProgressiveRead:
 |  | 
 | 
											
												
													
														|  | -        function PDFDataRangeTransport_onDataProgress(chunk) {
 |  | 
 | 
											
												
													
														|  | -      this._readyCapability.promise.then(function () {
 |  | 
 | 
											
												
													
														|  | -        var listeners = this._progressiveReadListeners;
 |  | 
 | 
											
												
													
														|  | -        for (var i = 0, n = listeners.length; i < n; ++i) {
 |  | 
 | 
											
												
													
														|  | -          listeners[i](chunk);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var fontSizeScale = current.fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +      var charSpacing = current.charSpacing;
 | 
											
												
													
														|  | 
 |  | +      var wordSpacing = current.wordSpacing;
 | 
											
												
													
														|  | 
 |  | +      var fontDirection = current.fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var textHScale = current.textHScale * fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var glyphsLength = glyphs.length;
 | 
											
												
													
														|  | 
 |  | +      var vertical = font.vertical;
 | 
											
												
													
														|  | 
 |  | +      var spacingDir = vertical ? 1 : -1;
 | 
											
												
													
														|  | 
 |  | +      var defaultVMetrics = font.defaultVMetrics;
 | 
											
												
													
														|  | 
 |  | +      var widthAdvanceScale = fontSize * current.fontMatrix[0];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var simpleFillText =
 | 
											
												
													
														|  | 
 |  | +        current.textRenderingMode === TextRenderingMode.FILL &&
 | 
											
												
													
														|  | 
 |  | +        !font.disableFontFace;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      ctx.save();
 | 
											
												
													
														|  | 
 |  | +      ctx.transform.apply(ctx, current.textMatrix);
 | 
											
												
													
														|  | 
 |  | +      ctx.translate(current.x, current.y + current.textRise);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (fontDirection > 0) {
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(textHScale, -1);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(textHScale, 1);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var lineWidth = current.lineWidth;
 | 
											
												
													
														|  | 
 |  | +      var scale = current.textMatrixScale;
 | 
											
												
													
														|  | 
 |  | +      if (scale === 0 || lineWidth === 0) {
 | 
											
												
													
														|  | 
 |  | +        var fillStrokeMode = current.textRenderingMode &
 | 
											
												
													
														|  | 
 |  | +          TextRenderingMode.FILL_STROKE_MASK;
 | 
											
												
													
														|  | 
 |  | +        if (fillStrokeMode === TextRenderingMode.STROKE ||
 | 
											
												
													
														|  | 
 |  | +            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
 | 
											
												
													
														|  | 
 |  | +          this.cachedGetSinglePixelWidth = null;
 | 
											
												
													
														|  | 
 |  | +          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        lineWidth /= scale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    transportReady: function PDFDataRangeTransport_transportReady() {
 |  | 
 | 
											
												
													
														|  | -      this._readyCapability.resolve();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (fontSizeScale !== 1.0) {
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(fontSizeScale, fontSizeScale);
 | 
											
												
													
														|  | 
 |  | +        lineWidth /= fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    requestDataRange:
 |  | 
 | 
											
												
													
														|  | -        function PDFDataRangeTransport_requestDataRange(begin, end) {
 |  | 
 | 
											
												
													
														|  | -      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.lineWidth = lineWidth;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    abort: function PDFDataRangeTransport_abort() {
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return PDFDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var x = 0, i;
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < glyphsLength; ++i) {
 | 
											
												
													
														|  | 
 |  | +        var glyph = glyphs[i];
 | 
											
												
													
														|  | 
 |  | +        if (isNum(glyph)) {
 | 
											
												
													
														|  | 
 |  | +          x += spacingDir * glyph * fontSize / 1000;
 | 
											
												
													
														|  | 
 |  | +          continue;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -PDFJS.PDFDataRangeTransport = PDFDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var restoreNeeded = false;
 | 
											
												
													
														|  | 
 |  | +        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
 | 
											
												
													
														|  | 
 |  | +        var character = glyph.fontChar;
 | 
											
												
													
														|  | 
 |  | +        var accent = glyph.accent;
 | 
											
												
													
														|  | 
 |  | +        var scaledX, scaledY, scaledAccentX, scaledAccentY;
 | 
											
												
													
														|  | 
 |  | +        var width = glyph.width;
 | 
											
												
													
														|  | 
 |  | +        if (vertical) {
 | 
											
												
													
														|  | 
 |  | +          var vmetric, vx, vy;
 | 
											
												
													
														|  | 
 |  | +          vmetric = glyph.vmetric || defaultVMetrics;
 | 
											
												
													
														|  | 
 |  | +          vx = glyph.vmetric ? vmetric[1] : width * 0.5;
 | 
											
												
													
														|  | 
 |  | +          vx = -vx * widthAdvanceScale;
 | 
											
												
													
														|  | 
 |  | +          vy = vmetric[2] * widthAdvanceScale;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
 |  | 
 | 
											
												
													
														|  | - * properties that can be read synchronously.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - * @alias PDFDocumentProxy
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
 |  | 
 | 
											
												
													
														|  | -  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
 |  | 
 | 
											
												
													
														|  | -    this.pdfInfo = pdfInfo;
 |  | 
 | 
											
												
													
														|  | -    this.transport = transport;
 |  | 
 | 
											
												
													
														|  | -    this.loadingTask = loadingTask;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {number} Total number of pages the PDF contains.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get numPages() {
 |  | 
 | 
											
												
													
														|  | -      return this.pdfInfo.numPages;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
 |  | 
 | 
											
												
													
														|  | -     * unique.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get fingerprint() {
 |  | 
 | 
											
												
													
														|  | -      return this.pdfInfo.fingerprint;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {number} pageNumber The page number to get. The first page is 1.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
 |  | 
 | 
											
												
													
														|  | -     * object.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getPage: function PDFDocumentProxy_getPage(pageNumber) {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getPage(pageNumber);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {{num: number, gen: number}} ref The page reference. Must have
 |  | 
 | 
											
												
													
														|  | -     *   the 'num' and 'gen' properties.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with the page index that is
 |  | 
 | 
											
												
													
														|  | -     * associated with the reference.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getPageIndex(ref);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with a lookup table for
 |  | 
 | 
											
												
													
														|  | -     * mapping named destinations to reference numbers.
 |  | 
 | 
											
												
													
														|  | -     *
 |  | 
 | 
											
												
													
														|  | -     * This can be slow for large documents: use getDestination instead
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getDestinations: function PDFDocumentProxy_getDestinations() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getDestinations();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {string} id The named destination to get.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with all information
 |  | 
 | 
											
												
													
														|  | -     * of the given named destination.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getDestination: function PDFDocumentProxy_getDestination(id) {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getDestination(id);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with a lookup table for
 |  | 
 | 
											
												
													
														|  | -     * mapping named attachments to their content.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getAttachments: function PDFDocumentProxy_getAttachments() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getAttachments();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with an array of all the
 |  | 
 | 
											
												
													
														|  | -     * JavaScript strings in the name tree.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getJavaScript: function PDFDocumentProxy_getJavaScript() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getJavaScript();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with an {Array} that is a
 |  | 
 | 
											
												
													
														|  | -     * tree outline (if it has one) of the PDF. The tree is in the format of:
 |  | 
 | 
											
												
													
														|  | -     * [
 |  | 
 | 
											
												
													
														|  | -     *  {
 |  | 
 | 
											
												
													
														|  | -     *   title: string,
 |  | 
 | 
											
												
													
														|  | -     *   bold: boolean,
 |  | 
 | 
											
												
													
														|  | -     *   italic: boolean,
 |  | 
 | 
											
												
													
														|  | -     *   color: rgb array,
 |  | 
 | 
											
												
													
														|  | -     *   dest: dest obj,
 |  | 
 | 
											
												
													
														|  | -     *   items: array of more items like this
 |  | 
 | 
											
												
													
														|  | -     *  },
 |  | 
 | 
											
												
													
														|  | -     *  ...
 |  | 
 | 
											
												
													
														|  | -     * ].
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getOutline: function PDFDocumentProxy_getOutline() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getOutline();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with an {Object} that has
 |  | 
 | 
											
												
													
														|  | -     * info and metadata properties.  Info is an {Object} filled with anything
 |  | 
 | 
											
												
													
														|  | -     * available in the information dictionary and similarly metadata is a
 |  | 
 | 
											
												
													
														|  | -     * {Metadata} object with information from the metadata section of the PDF.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getMetadata: function PDFDocumentProxy_getMetadata() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getMetadata();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with a TypedArray that has
 |  | 
 | 
											
												
													
														|  | -     * the raw data from the PDF.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getData: function PDFDocumentProxy_getData() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getData();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved when the document's data
 |  | 
 | 
											
												
													
														|  | -     * is loaded. It is resolved with an {Object} that contains the length
 |  | 
 | 
											
												
													
														|  | -     * property that indicates size of the PDF data in bytes.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.downloadInfoCapability.promise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise this is resolved with current stats about
 |  | 
 | 
											
												
													
														|  | -     * document structures (see {@link PDFDocumentStats}).
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getStats: function PDFDocumentProxy_getStats() {
 |  | 
 | 
											
												
													
														|  | -      return this.transport.getStats();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Cleans up resources allocated by the document, e.g. created @font-face.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    cleanup: function PDFDocumentProxy_cleanup() {
 |  | 
 | 
											
												
													
														|  | -      this.transport.startCleanup();
 |  | 
 | 
											
												
													
														|  | 
 |  | +          width = vmetric ? -vmetric[0] : width;
 | 
											
												
													
														|  | 
 |  | +          scaledX = vx / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +          scaledY = (x + vy) / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          scaledX = x / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +          scaledY = 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (font.remeasure && width > 0) {
 | 
											
												
													
														|  | 
 |  | +          // Some standard fonts may not have the exact width: rescale per
 | 
											
												
													
														|  | 
 |  | +          // character if measured width is greater than expected glyph width
 | 
											
												
													
														|  | 
 |  | +          // and subpixel-aa is enabled, otherwise just center the glyph.
 | 
											
												
													
														|  | 
 |  | +          var measuredWidth = ctx.measureText(character).width * 1000 /
 | 
											
												
													
														|  | 
 |  | +            fontSize * fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
 | 
											
												
													
														|  | 
 |  | +            var characterScaleX = width / measuredWidth;
 | 
											
												
													
														|  | 
 |  | +            restoreNeeded = true;
 | 
											
												
													
														|  | 
 |  | +            ctx.save();
 | 
											
												
													
														|  | 
 |  | +            ctx.scale(characterScaleX, 1);
 | 
											
												
													
														|  | 
 |  | +            scaledX /= characterScaleX;
 | 
											
												
													
														|  | 
 |  | +          } else if (width !== measuredWidth) {
 | 
											
												
													
														|  | 
 |  | +            scaledX += (width - measuredWidth) / 2000 *
 | 
											
												
													
														|  | 
 |  | +              fontSize / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (simpleFillText && !accent) {
 | 
											
												
													
														|  | 
 |  | +          // common case
 | 
											
												
													
														|  | 
 |  | +          ctx.fillText(character, scaledX, scaledY);
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          this.paintChar(character, scaledX, scaledY);
 | 
											
												
													
														|  | 
 |  | +          if (accent) {
 | 
											
												
													
														|  | 
 |  | +            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
 | 
											
												
													
														|  | 
 |  | +            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var charWidth = width * widthAdvanceScale + spacing * fontDirection;
 | 
											
												
													
														|  | 
 |  | +        x += charWidth;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (restoreNeeded) {
 | 
											
												
													
														|  | 
 |  | +          ctx.restore();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (vertical) {
 | 
											
												
													
														|  | 
 |  | +        current.y -= x * textHScale;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        current.x += x * textHScale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      ctx.restore();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Destroys current document instance and terminates worker.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    destroy: function PDFDocumentProxy_destroy() {
 |  | 
 | 
											
												
													
														|  | -      return this.loadingTask.destroy();
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return PDFDocumentProxy;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Page getTextContent parameters.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} getTextContentParameters
 |  | 
 | 
											
												
													
														|  | - * @param {boolean} normalizeWhitespace - replaces all occurrences of
 |  | 
 | 
											
												
													
														|  | - *   whitespace with standard spaces (0x20). The default value is `false`.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +    showType3Text: function CanvasGraphics_showType3Text(glyphs) {
 | 
											
												
													
														|  | 
 |  | +      // Type3 fonts - each glyph is a "mini-PDF"
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var current = this.current;
 | 
											
												
													
														|  | 
 |  | +      var font = current.font;
 | 
											
												
													
														|  | 
 |  | +      var fontSize = current.fontSize;
 | 
											
												
													
														|  | 
 |  | +      var fontDirection = current.fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var spacingDir = font.vertical ? 1 : -1;
 | 
											
												
													
														|  | 
 |  | +      var charSpacing = current.charSpacing;
 | 
											
												
													
														|  | 
 |  | +      var wordSpacing = current.wordSpacing;
 | 
											
												
													
														|  | 
 |  | +      var textHScale = current.textHScale * fontDirection;
 | 
											
												
													
														|  | 
 |  | +      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
 | 
											
												
													
														|  | 
 |  | +      var glyphsLength = glyphs.length;
 | 
											
												
													
														|  | 
 |  | +      var isTextInvisible =
 | 
											
												
													
														|  | 
 |  | +        current.textRenderingMode === TextRenderingMode.INVISIBLE;
 | 
											
												
													
														|  | 
 |  | +      var i, glyph, width, spacingLength;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Page text content.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} TextContent
 |  | 
 | 
											
												
													
														|  | - * @property {array} items - array of {@link TextItem}
 |  | 
 | 
											
												
													
														|  | - * @property {Object} styles - {@link TextStyles} objects, indexed by font
 |  | 
 | 
											
												
													
														|  | - *                    name.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isTextInvisible || fontSize === 0) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.cachedGetSinglePixelWidth = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Page text content part.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} TextItem
 |  | 
 | 
											
												
													
														|  | - * @property {string} str - text content.
 |  | 
 | 
											
												
													
														|  | - * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
 |  | 
 | 
											
												
													
														|  | - * @property {array} transform - transformation matrix.
 |  | 
 | 
											
												
													
														|  | - * @property {number} width - width in device space.
 |  | 
 | 
											
												
													
														|  | - * @property {number} height - height in device space.
 |  | 
 | 
											
												
													
														|  | - * @property {string} fontName - font name used by pdf.js for converted font.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.save();
 | 
											
												
													
														|  | 
 |  | +      ctx.transform.apply(ctx, current.textMatrix);
 | 
											
												
													
														|  | 
 |  | +      ctx.translate(current.x, current.y);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Text style.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} TextStyle
 |  | 
 | 
											
												
													
														|  | - * @property {number} ascent - font ascent.
 |  | 
 | 
											
												
													
														|  | - * @property {number} descent - font descent.
 |  | 
 | 
											
												
													
														|  | - * @property {boolean} vertical - text is in vertical mode.
 |  | 
 | 
											
												
													
														|  | - * @property {string} fontFamily - possible font family
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +      ctx.scale(textHScale, fontDirection);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Page annotation parameters.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} GetAnnotationsParameters
 |  | 
 | 
											
												
													
														|  | - * @param {string} intent - Determines the annotations that will be fetched,
 |  | 
 | 
											
												
													
														|  | - *                 can be either 'display' (viewable annotations) or 'print'
 |  | 
 | 
											
												
													
														|  | - *                 (printable annotations).
 |  | 
 | 
											
												
													
														|  | - *                 If the parameter is omitted, all annotations are fetched.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < glyphsLength; ++i) {
 | 
											
												
													
														|  | 
 |  | +        glyph = glyphs[i];
 | 
											
												
													
														|  | 
 |  | +        if (isNum(glyph)) {
 | 
											
												
													
														|  | 
 |  | +          spacingLength = spacingDir * glyph * fontSize / 1000;
 | 
											
												
													
														|  | 
 |  | +          this.ctx.translate(spacingLength, 0);
 | 
											
												
													
														|  | 
 |  | +          current.x += spacingLength * textHScale;
 | 
											
												
													
														|  | 
 |  | +          continue;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Page render parameters.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} RenderParameters
 |  | 
 | 
											
												
													
														|  | - * @property {Object} canvasContext - A 2D context of a DOM Canvas object.
 |  | 
 | 
											
												
													
														|  | - * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by
 |  | 
 | 
											
												
													
														|  | - *                                calling of PDFPage.getViewport method.
 |  | 
 | 
											
												
													
														|  | - * @property {string} intent - Rendering intent, can be 'display' or 'print'
 |  | 
 | 
											
												
													
														|  | - *                    (default value is 'display').
 |  | 
 | 
											
												
													
														|  | - * @property {Array}  transform - (optional) Additional transform, applied
 |  | 
 | 
											
												
													
														|  | - *                    just before viewport transform.
 |  | 
 | 
											
												
													
														|  | - * @property {Object} imageLayer - (optional) An object that has beginLayout,
 |  | 
 | 
											
												
													
														|  | - *                    endLayout and appendImage functions.
 |  | 
 | 
											
												
													
														|  | - * @property {function} continueCallback - (deprecated) A function that will be
 |  | 
 | 
											
												
													
														|  | - *                      called each time the rendering is paused.  To continue
 |  | 
 | 
											
												
													
														|  | - *                      rendering call the function that is the first argument
 |  | 
 | 
											
												
													
														|  | - *                      to the callback.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
 | 
											
												
													
														|  | 
 |  | +        var operatorList = font.charProcOperatorList[glyph.operatorListId];
 | 
											
												
													
														|  | 
 |  | +        if (!operatorList) {
 | 
											
												
													
														|  | 
 |  | +          warn('Type3 character \"' + glyph.operatorListId +
 | 
											
												
													
														|  | 
 |  | +               '\" is not available');
 | 
											
												
													
														|  | 
 |  | +          continue;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        this.processingType3 = glyph;
 | 
											
												
													
														|  | 
 |  | +        this.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(fontSize, fontSize);
 | 
											
												
													
														|  | 
 |  | +        ctx.transform.apply(ctx, fontMatrix);
 | 
											
												
													
														|  | 
 |  | +        this.executeOperatorList(operatorList);
 | 
											
												
													
														|  | 
 |  | +        this.restore();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * PDF page operator list.
 |  | 
 | 
											
												
													
														|  | - *
 |  | 
 | 
											
												
													
														|  | - * @typedef {Object} PDFOperatorList
 |  | 
 | 
											
												
													
														|  | - * @property {Array} fnArray - Array containing the operator functions.
 |  | 
 | 
											
												
													
														|  | - * @property {Array} argsArray - Array containing the arguments of the
 |  | 
 | 
											
												
													
														|  | - *                               functions.
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
 | 
											
												
													
														|  | 
 |  | +        width = transformed[0] * fontSize + spacing;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Proxy to a PDFPage in the worker thread.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - * @alias PDFPageProxy
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var PDFPageProxy = (function PDFPageProxyClosure() {
 |  | 
 | 
											
												
													
														|  | -  function PDFPageProxy(pageIndex, pageInfo, transport) {
 |  | 
 | 
											
												
													
														|  | -    this.pageIndex = pageIndex;
 |  | 
 | 
											
												
													
														|  | -    this.pageInfo = pageInfo;
 |  | 
 | 
											
												
													
														|  | -    this.transport = transport;
 |  | 
 | 
											
												
													
														|  | -    this.stats = new StatTimer();
 |  | 
 | 
											
												
													
														|  | -    this.stats.enabled = !!globalScope.PDFJS.enableStats;
 |  | 
 | 
											
												
													
														|  | -    this.commonObjs = transport.commonObjs;
 |  | 
 | 
											
												
													
														|  | -    this.objs = new PDFObjects();
 |  | 
 | 
											
												
													
														|  | -    this.cleanupAfterRender = false;
 |  | 
 | 
											
												
													
														|  | -    this.pendingCleanup = false;
 |  | 
 | 
											
												
													
														|  | -    this.intentStates = {};
 |  | 
 | 
											
												
													
														|  | -    this.destroyed = false;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {number} Page number of the page. First page is 1.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get pageNumber() {
 |  | 
 | 
											
												
													
														|  | -      return this.pageIndex + 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        ctx.translate(width, 0);
 | 
											
												
													
														|  | 
 |  | +        current.x += width * textHScale;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      this.processingType3 = null;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {number} The number of degrees the page is rotated clockwise.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get rotate() {
 |  | 
 | 
											
												
													
														|  | -      return this.pageInfo.rotate;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // Type3 fonts
 | 
											
												
													
														|  | 
 |  | +    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
 | 
											
												
													
														|  | 
 |  | +      // We can safely ignore this since the width should be the same
 | 
											
												
													
														|  | 
 |  | +      // as the width in the Widths array.
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Object} The reference that points to this page. It has 'num' and
 |  | 
 | 
											
												
													
														|  | -     * 'gen' properties.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get ref() {
 |  | 
 | 
											
												
													
														|  | -      return this.pageInfo.ref;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
 | 
											
												
													
														|  | 
 |  | +                                                                        yWidth,
 | 
											
												
													
														|  | 
 |  | +                                                                        llx,
 | 
											
												
													
														|  | 
 |  | +                                                                        lly,
 | 
											
												
													
														|  | 
 |  | +                                                                        urx,
 | 
											
												
													
														|  | 
 |  | +                                                                        ury) {
 | 
											
												
													
														|  | 
 |  | +      // TODO According to the spec we're also suppose to ignore any operators
 | 
											
												
													
														|  | 
 |  | +      // that set color or include images while processing this type3 font.
 | 
											
												
													
														|  | 
 |  | +      this.ctx.rect(llx, lly, urx - llx, ury - lly);
 | 
											
												
													
														|  | 
 |  | +      this.clip();
 | 
											
												
													
														|  | 
 |  | +      this.endPath();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    // Color
 | 
											
												
													
														|  | 
 |  | +    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
 | 
											
												
													
														|  | 
 |  | +      var pattern;
 | 
											
												
													
														|  | 
 |  | +      if (IR[0] === 'TilingPattern') {
 | 
											
												
													
														|  | 
 |  | +        var color = IR[1];
 | 
											
												
													
														|  | 
 |  | +        var baseTransform = this.baseTransform ||
 | 
											
												
													
														|  | 
 |  | +                            this.ctx.mozCurrentTransform.slice();
 | 
											
												
													
														|  | 
 |  | +        var self = this;
 | 
											
												
													
														|  | 
 |  | +        var canvasGraphicsFactory = {
 | 
											
												
													
														|  | 
 |  | +          createCanvasGraphics: function (ctx) {
 | 
											
												
													
														|  | 
 |  | +            return new CanvasGraphics(ctx, self.commonObjs, self.objs);
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  | 
 |  | +        pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory,
 | 
											
												
													
														|  | 
 |  | +                                    baseTransform);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        pattern = getShadingPatternFromIR(IR);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return pattern;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
 | 
											
												
													
														|  | 
 |  | +      this.current.strokeColor = this.getColorN_Pattern(arguments);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
 | 
											
												
													
														|  | 
 |  | +      this.current.fillColor = this.getColorN_Pattern(arguments);
 | 
											
												
													
														|  | 
 |  | +      this.current.patternFill = true;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Array} An array of the visible portion of the PDF page in the
 |  | 
 | 
											
												
													
														|  | -     * user space units - [x1, y1, x2, y2].
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    get view() {
 |  | 
 | 
											
												
													
														|  | -      return this.pageInfo.view;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
 | 
											
												
													
														|  | 
 |  | +      var color = Util.makeCssRgb(r, g, b);
 | 
											
												
													
														|  | 
 |  | +      this.ctx.strokeStyle = color;
 | 
											
												
													
														|  | 
 |  | +      this.current.strokeColor = color;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {number} scale The desired scale of the viewport.
 |  | 
 | 
											
												
													
														|  | -     * @param {number} rotate Degrees to rotate the viewport. If omitted this
 |  | 
 | 
											
												
													
														|  | -     * defaults to the page rotation.
 |  | 
 | 
											
												
													
														|  | -     * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties
 |  | 
 | 
											
												
													
														|  | -     * along with transforms required for rendering.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
 |  | 
 | 
											
												
													
														|  | -      if (arguments.length < 2) {
 |  | 
 | 
											
												
													
														|  | -        rotate = this.rotate;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
 | 
											
												
													
														|  | 
 |  | +      var color = Util.makeCssRgb(r, g, b);
 | 
											
												
													
														|  | 
 |  | +      this.ctx.fillStyle = color;
 | 
											
												
													
														|  | 
 |  | +      this.current.fillColor = color;
 | 
											
												
													
														|  | 
 |  | +      this.current.patternFill = false;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {GetAnnotationsParameters} params - Annotation parameters.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise that is resolved with an {Array} of the
 |  | 
 | 
											
												
													
														|  | -     * annotation objects.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getAnnotations: function PDFPageProxy_getAnnotations(params) {
 |  | 
 | 
											
												
													
														|  | -      var intent = (params && params.intent) || null;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (!this.annotationsPromise || this.annotationsIntent !== intent) {
 |  | 
 | 
											
												
													
														|  | -        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,
 |  | 
 | 
											
												
													
														|  | -                                                                intent);
 |  | 
 | 
											
												
													
														|  | -        this.annotationsIntent = intent;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      var pattern = getShadingPatternFromIR(patternIR);
 | 
											
												
													
														|  | 
 |  | +      ctx.fillStyle = pattern.getPattern(ctx, this, true);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var inv = ctx.mozCurrentTransformInverse;
 | 
											
												
													
														|  | 
 |  | +      if (inv) {
 | 
											
												
													
														|  | 
 |  | +        var canvas = ctx.canvas;
 | 
											
												
													
														|  | 
 |  | +        var width = canvas.width;
 | 
											
												
													
														|  | 
 |  | +        var height = canvas.height;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var bl = Util.applyTransform([0, 0], inv);
 | 
											
												
													
														|  | 
 |  | +        var br = Util.applyTransform([0, height], inv);
 | 
											
												
													
														|  | 
 |  | +        var ul = Util.applyTransform([width, 0], inv);
 | 
											
												
													
														|  | 
 |  | +        var ur = Util.applyTransform([width, height], inv);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
 | 
											
												
													
														|  | 
 |  | +        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
 | 
											
												
													
														|  | 
 |  | +        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
 | 
											
												
													
														|  | 
 |  | +        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        // HACK to draw the gradient onto an infinite rectangle.
 | 
											
												
													
														|  | 
 |  | +        // PDF gradients are drawn across the entire image while
 | 
											
												
													
														|  | 
 |  | +        // Canvas only allows gradients to be drawn in a rectangle
 | 
											
												
													
														|  | 
 |  | +        // The following bug should allow us to remove this.
 | 
											
												
													
														|  | 
 |  | +        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return this.annotationsPromise;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Begins the process of rendering a page to the desired context.
 |  | 
 | 
											
												
													
														|  | -     * @param {RenderParameters} params Page render parameters.
 |  | 
 | 
											
												
													
														|  | -     * @return {RenderTask} An object that contains the promise, which
 |  | 
 | 
											
												
													
														|  | -     *                      is resolved when the page finishes rendering.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    render: function PDFPageProxy_render(params) {
 |  | 
 | 
											
												
													
														|  | -      var stats = this.stats;
 |  | 
 | 
											
												
													
														|  | -      stats.time('Overall');
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // If there was a pending destroy cancel it so no cleanup happens during
 |  | 
 | 
											
												
													
														|  | -      // this call to render.
 |  | 
 | 
											
												
													
														|  | -      this.pendingCleanup = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Images
 | 
											
												
													
														|  | 
 |  | +    beginInlineImage: function CanvasGraphics_beginInlineImage() {
 | 
											
												
													
														|  | 
 |  | +      error('Should not call beginInlineImage');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    beginImageData: function CanvasGraphics_beginImageData() {
 | 
											
												
													
														|  | 
 |  | +      error('Should not call beginImageData');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
 | 
											
												
													
														|  | 
 |  | +                                                                        bbox) {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      this.baseTransformStack.push(this.baseTransform);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (!this.intentStates[renderingIntent]) {
 |  | 
 | 
											
												
													
														|  | -        this.intentStates[renderingIntent] = {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isArray(matrix) && 6 === matrix.length) {
 | 
											
												
													
														|  | 
 |  | +        this.transform.apply(this, matrix);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      var intentState = this.intentStates[renderingIntent];
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // If there's no displayReadyCapability yet, then the operatorList
 |  | 
 | 
											
												
													
														|  | -      // was never requested before. Make the request and create the promise.
 |  | 
 | 
											
												
													
														|  | -      if (!intentState.displayReadyCapability) {
 |  | 
 | 
											
												
													
														|  | -        intentState.receivingOperatorList = true;
 |  | 
 | 
											
												
													
														|  | -        intentState.displayReadyCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -        intentState.operatorList = {
 |  | 
 | 
											
												
													
														|  | -          fnArray: [],
 |  | 
 | 
											
												
													
														|  | -          argsArray: [],
 |  | 
 | 
											
												
													
														|  | -          lastChunk: false
 |  | 
 | 
											
												
													
														|  | -        };
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.baseTransform = this.ctx.mozCurrentTransform;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.stats.time('Page Request');
 |  | 
 | 
											
												
													
														|  | -        this.transport.messageHandler.send('RenderPageRequest', {
 |  | 
 | 
											
												
													
														|  | -          pageIndex: this.pageNumber - 1,
 |  | 
 | 
											
												
													
														|  | -          intent: renderingIntent
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isArray(bbox) && 4 === bbox.length) {
 | 
											
												
													
														|  | 
 |  | +        var width = bbox[2] - bbox[0];
 | 
											
												
													
														|  | 
 |  | +        var height = bbox[3] - bbox[1];
 | 
											
												
													
														|  | 
 |  | +        this.ctx.rect(bbox[0], bbox[1], width, height);
 | 
											
												
													
														|  | 
 |  | +        this.clip();
 | 
											
												
													
														|  | 
 |  | +        this.endPath();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  | 
 |  | +      this.baseTransform = this.baseTransformStack.pop();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    beginGroup: function CanvasGraphics_beginGroup(group) {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      var currentCtx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      // TODO non-isolated groups - according to Rik at adobe non-isolated
 | 
											
												
													
														|  | 
 |  | +      // group results aren't usually that different and they even have tools
 | 
											
												
													
														|  | 
 |  | +      // that ignore this setting. Notes from Rik on implmenting:
 | 
											
												
													
														|  | 
 |  | +      // - When you encounter an transparency group, create a new canvas with
 | 
											
												
													
														|  | 
 |  | +      // the dimensions of the bbox
 | 
											
												
													
														|  | 
 |  | +      // - copy the content from the previous canvas to the new canvas
 | 
											
												
													
														|  | 
 |  | +      // - draw as usual
 | 
											
												
													
														|  | 
 |  | +      // - remove the backdrop alpha:
 | 
											
												
													
														|  | 
 |  | +      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
 | 
											
												
													
														|  | 
 |  | +      // value of your transparency group and 'alphaBackdrop' the alpha of the
 | 
											
												
													
														|  | 
 |  | +      // backdrop
 | 
											
												
													
														|  | 
 |  | +      // - remove background color:
 | 
											
												
													
														|  | 
 |  | +      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
 | 
											
												
													
														|  | 
 |  | +      if (!group.isolated) {
 | 
											
												
													
														|  | 
 |  | +        info('TODO: Support non-isolated groups.');
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var internalRenderTask = new InternalRenderTask(complete, params,
 |  | 
 | 
											
												
													
														|  | -                                                      this.objs,
 |  | 
 | 
											
												
													
														|  | -                                                      this.commonObjs,
 |  | 
 | 
											
												
													
														|  | -                                                      intentState.operatorList,
 |  | 
 | 
											
												
													
														|  | -                                                      this.pageNumber);
 |  | 
 | 
											
												
													
														|  | -      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
 |  | 
 | 
											
												
													
														|  | -      if (!intentState.renderTasks) {
 |  | 
 | 
											
												
													
														|  | -        intentState.renderTasks = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // TODO knockout - supposedly possible with the clever use of compositing
 | 
											
												
													
														|  | 
 |  | +      // modes.
 | 
											
												
													
														|  | 
 |  | +      if (group.knockout) {
 | 
											
												
													
														|  | 
 |  | +        warn('Knockout groups not supported.');
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      intentState.renderTasks.push(internalRenderTask);
 |  | 
 | 
											
												
													
														|  | -      var renderTask = internalRenderTask.task;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Obsolete parameter support
 |  | 
 | 
											
												
													
														|  | -      if (params.continueCallback) {
 |  | 
 | 
											
												
													
														|  | -        deprecated('render is used with continueCallback parameter');
 |  | 
 | 
											
												
													
														|  | -        renderTask.onContinue = params.continueCallback;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var currentTransform = currentCtx.mozCurrentTransform;
 | 
											
												
													
														|  | 
 |  | +      if (group.matrix) {
 | 
											
												
													
														|  | 
 |  | +        currentCtx.transform.apply(currentCtx, group.matrix);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      assert(group.bbox, 'Bounding box is required.');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var self = this;
 |  | 
 | 
											
												
													
														|  | -      intentState.displayReadyCapability.promise.then(
 |  | 
 | 
											
												
													
														|  | -        function pageDisplayReadyPromise(transparency) {
 |  | 
 | 
											
												
													
														|  | -          if (self.pendingCleanup) {
 |  | 
 | 
											
												
													
														|  | -            complete();
 |  | 
 | 
											
												
													
														|  | -            return;
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          stats.time('Rendering');
 |  | 
 | 
											
												
													
														|  | -          internalRenderTask.initalizeGraphics(transparency);
 |  | 
 | 
											
												
													
														|  | -          internalRenderTask.operatorListChanged();
 |  | 
 | 
											
												
													
														|  | -        },
 |  | 
 | 
											
												
													
														|  | -        function pageDisplayReadPromiseError(reason) {
 |  | 
 | 
											
												
													
														|  | -          complete(reason);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      );
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Based on the current transform figure out how big the bounding box
 | 
											
												
													
														|  | 
 |  | +      // will actually be.
 | 
											
												
													
														|  | 
 |  | +      var bounds = Util.getAxialAlignedBoundingBox(
 | 
											
												
													
														|  | 
 |  | +                    group.bbox,
 | 
											
												
													
														|  | 
 |  | +                    currentCtx.mozCurrentTransform);
 | 
											
												
													
														|  | 
 |  | +      // Clip the bounding box to the current canvas.
 | 
											
												
													
														|  | 
 |  | +      var canvasBounds = [0,
 | 
											
												
													
														|  | 
 |  | +                          0,
 | 
											
												
													
														|  | 
 |  | +                          currentCtx.canvas.width,
 | 
											
												
													
														|  | 
 |  | +                          currentCtx.canvas.height];
 | 
											
												
													
														|  | 
 |  | +      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
 | 
											
												
													
														|  | 
 |  | +      // Use ceil in case we're between sizes so we don't create canvas that is
 | 
											
												
													
														|  | 
 |  | +      // too small and make the canvas at least 1x1 pixels.
 | 
											
												
													
														|  | 
 |  | +      var offsetX = Math.floor(bounds[0]);
 | 
											
												
													
														|  | 
 |  | +      var offsetY = Math.floor(bounds[1]);
 | 
											
												
													
														|  | 
 |  | +      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
 | 
											
												
													
														|  | 
 |  | +      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
 | 
											
												
													
														|  | 
 |  | +      var scaleX = 1, scaleY = 1;
 | 
											
												
													
														|  | 
 |  | +      if (drawnWidth > MAX_GROUP_SIZE) {
 | 
											
												
													
														|  | 
 |  | +        scaleX = drawnWidth / MAX_GROUP_SIZE;
 | 
											
												
													
														|  | 
 |  | +        drawnWidth = MAX_GROUP_SIZE;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (drawnHeight > MAX_GROUP_SIZE) {
 | 
											
												
													
														|  | 
 |  | +        scaleY = drawnHeight / MAX_GROUP_SIZE;
 | 
											
												
													
														|  | 
 |  | +        drawnHeight = MAX_GROUP_SIZE;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      function complete(error) {
 |  | 
 | 
											
												
													
														|  | -        var i = intentState.renderTasks.indexOf(internalRenderTask);
 |  | 
 | 
											
												
													
														|  | -        if (i >= 0) {
 |  | 
 | 
											
												
													
														|  | -          intentState.renderTasks.splice(i, 1);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var cacheId = 'groupAt' + this.groupLevel;
 | 
											
												
													
														|  | 
 |  | +      if (group.smask) {
 | 
											
												
													
														|  | 
 |  | +        // Using two cache entries is case if masks are used one after another.
 | 
											
												
													
														|  | 
 |  | +        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      var scratchCanvas = this.cachedCanvases.getCanvas(
 | 
											
												
													
														|  | 
 |  | +        cacheId, drawnWidth, drawnHeight, true);
 | 
											
												
													
														|  | 
 |  | +      var groupCtx = scratchCanvas.context;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (self.cleanupAfterRender) {
 |  | 
 | 
											
												
													
														|  | -          self.pendingCleanup = true;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        self._tryCleanup();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Since we created a new canvas that is just the size of the bounding box
 | 
											
												
													
														|  | 
 |  | +      // we have to translate the group ctx.
 | 
											
												
													
														|  | 
 |  | +      groupCtx.scale(1 / scaleX, 1 / scaleY);
 | 
											
												
													
														|  | 
 |  | +      groupCtx.translate(-offsetX, -offsetY);
 | 
											
												
													
														|  | 
 |  | +      groupCtx.transform.apply(groupCtx, currentTransform);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (error) {
 |  | 
 | 
											
												
													
														|  | -          internalRenderTask.capability.reject(error);
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          internalRenderTask.capability.resolve();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        stats.timeEnd('Rendering');
 |  | 
 | 
											
												
													
														|  | -        stats.timeEnd('Overall');
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (group.smask) {
 | 
											
												
													
														|  | 
 |  | +        // Saving state and cached mask to be used in setGState.
 | 
											
												
													
														|  | 
 |  | +        this.smaskStack.push({
 | 
											
												
													
														|  | 
 |  | +          canvas: scratchCanvas.canvas,
 | 
											
												
													
														|  | 
 |  | +          context: groupCtx,
 | 
											
												
													
														|  | 
 |  | +          offsetX: offsetX,
 | 
											
												
													
														|  | 
 |  | +          offsetY: offsetY,
 | 
											
												
													
														|  | 
 |  | +          scaleX: scaleX,
 | 
											
												
													
														|  | 
 |  | +          scaleY: scaleY,
 | 
											
												
													
														|  | 
 |  | +          subtype: group.smask.subtype,
 | 
											
												
													
														|  | 
 |  | +          backdrop: group.smask.backdrop,
 | 
											
												
													
														|  | 
 |  | +          transferMap: group.smask.transferMap || null
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        // Setup the current ctx so when the group is popped we draw it at the
 | 
											
												
													
														|  | 
 |  | +        // right location.
 | 
											
												
													
														|  | 
 |  | +        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
 | 
											
												
													
														|  | 
 |  | +        currentCtx.translate(offsetX, offsetY);
 | 
											
												
													
														|  | 
 |  | +        currentCtx.scale(scaleX, scaleY);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      return renderTask;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // The transparency group inherits all off the current graphics state
 | 
											
												
													
														|  | 
 |  | +      // except the blend mode, soft mask, and alpha constants.
 | 
											
												
													
														|  | 
 |  | +      copyCtxState(currentCtx, groupCtx);
 | 
											
												
													
														|  | 
 |  | +      this.ctx = groupCtx;
 | 
											
												
													
														|  | 
 |  | +      this.setGState([
 | 
											
												
													
														|  | 
 |  | +        ['BM', 'Normal'],
 | 
											
												
													
														|  | 
 |  | +        ['ca', 1],
 | 
											
												
													
														|  | 
 |  | +        ['CA', 1]
 | 
											
												
													
														|  | 
 |  | +      ]);
 | 
											
												
													
														|  | 
 |  | +      this.groupStack.push(currentCtx);
 | 
											
												
													
														|  | 
 |  | +      this.groupLevel++;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} A promise resolved with an {@link PDFOperatorList}
 |  | 
 | 
											
												
													
														|  | -     * object that represents page's operator list.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getOperatorList: function PDFPageProxy_getOperatorList() {
 |  | 
 | 
											
												
													
														|  | -      function operatorListChanged() {
 |  | 
 | 
											
												
													
														|  | -        if (intentState.operatorList.lastChunk) {
 |  | 
 | 
											
												
													
														|  | -          intentState.opListReadCapability.resolve(intentState.operatorList);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endGroup: function CanvasGraphics_endGroup(group) {
 | 
											
												
													
														|  | 
 |  | +      this.groupLevel--;
 | 
											
												
													
														|  | 
 |  | +      var groupCtx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      this.ctx = this.groupStack.pop();
 | 
											
												
													
														|  | 
 |  | +      // Turn off image smoothing to avoid sub pixel interpolation which can
 | 
											
												
													
														|  | 
 |  | +      // look kind of blurry for some pdfs.
 | 
											
												
													
														|  | 
 |  | +      if (this.ctx.imageSmoothingEnabled !== undefined) {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.imageSmoothingEnabled = false;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.mozImageSmoothingEnabled = false;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var renderingIntent = 'oplist';
 |  | 
 | 
											
												
													
														|  | -      if (!this.intentStates[renderingIntent]) {
 |  | 
 | 
											
												
													
														|  | -        this.intentStates[renderingIntent] = {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (group.smask) {
 | 
											
												
													
														|  | 
 |  | +        this.tempSMask = this.smaskStack.pop();
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.drawImage(groupCtx.canvas, 0, 0);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      var intentState = this.intentStates[renderingIntent];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (!intentState.opListReadCapability) {
 |  | 
 | 
											
												
													
														|  | -        var opListTask = {};
 |  | 
 | 
											
												
													
														|  | -        opListTask.operatorListChanged = operatorListChanged;
 |  | 
 | 
											
												
													
														|  | -        intentState.receivingOperatorList = true;
 |  | 
 | 
											
												
													
														|  | -        intentState.opListReadCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -        intentState.renderTasks = [];
 |  | 
 | 
											
												
													
														|  | -        intentState.renderTasks.push(opListTask);
 |  | 
 | 
											
												
													
														|  | -        intentState.operatorList = {
 |  | 
 | 
											
												
													
														|  | -          fnArray: [],
 |  | 
 | 
											
												
													
														|  | -          argsArray: [],
 |  | 
 | 
											
												
													
														|  | -          lastChunk: false
 |  | 
 | 
											
												
													
														|  | -        };
 |  | 
 | 
											
												
													
														|  | 
 |  | +    beginAnnotations: function CanvasGraphics_beginAnnotations() {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      this.current = new CanvasExtraState();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        this.transport.messageHandler.send('RenderPageRequest', {
 |  | 
 | 
											
												
													
														|  | -          pageIndex: this.pageIndex,
 |  | 
 | 
											
												
													
														|  | -          intent: renderingIntent
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.baseTransform) {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.setTransform.apply(this.ctx, this.baseTransform);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return intentState.opListReadCapability.promise;
 |  | 
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * @param {getTextContentParameters} params - getTextContent parameters.
 |  | 
 | 
											
												
													
														|  | -     * @return {Promise} That is resolved a {@link TextContent}
 |  | 
 | 
											
												
													
														|  | -     * object that represent the page text content.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getTextContent: function PDFPageProxy_getTextContent(params) {
 |  | 
 | 
											
												
													
														|  | -      var normalizeWhitespace = (params && params.normalizeWhitespace) || false;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      return this.transport.messageHandler.sendWithPromise('GetTextContent', {
 |  | 
 | 
											
												
													
														|  | -        pageIndex: this.pageNumber - 1,
 |  | 
 | 
											
												
													
														|  | -        normalizeWhitespace: normalizeWhitespace,
 |  | 
 | 
											
												
													
														|  | -      });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endAnnotations: function CanvasGraphics_endAnnotations() {
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Destroys page object.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    _destroy: function PDFPageProxy_destroy() {
 |  | 
 | 
											
												
													
														|  | -      this.destroyed = true;
 |  | 
 | 
											
												
													
														|  | -      this.transport.pageCache[this.pageIndex] = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
 | 
											
												
													
														|  | 
 |  | +                                                             matrix) {
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var waitOn = [];
 |  | 
 | 
											
												
													
														|  | -      Object.keys(this.intentStates).forEach(function(intent) {
 |  | 
 | 
											
												
													
														|  | -        var intentState = this.intentStates[intent];
 |  | 
 | 
											
												
													
														|  | -        intentState.renderTasks.forEach(function(renderTask) {
 |  | 
 | 
											
												
													
														|  | -          var renderCompleted = renderTask.capability.promise.
 |  | 
 | 
											
												
													
														|  | -            catch(function () {}); // ignoring failures
 |  | 
 | 
											
												
													
														|  | -          waitOn.push(renderCompleted);
 |  | 
 | 
											
												
													
														|  | -          renderTask.cancel();
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | -      this.objs.clear();
 |  | 
 | 
											
												
													
														|  | -      this.annotationsPromise = null;
 |  | 
 | 
											
												
													
														|  | -      this.pendingCleanup = false;
 |  | 
 | 
											
												
													
														|  | -      return Promise.all(waitOn);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (isArray(rect) && 4 === rect.length) {
 | 
											
												
													
														|  | 
 |  | +        var width = rect[2] - rect[0];
 | 
											
												
													
														|  | 
 |  | +        var height = rect[3] - rect[1];
 | 
											
												
													
														|  | 
 |  | +        this.ctx.rect(rect[0], rect[1], width, height);
 | 
											
												
													
														|  | 
 |  | +        this.clip();
 | 
											
												
													
														|  | 
 |  | +        this.endPath();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Cleans up resources allocated by the page. (deprecated)
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    destroy: function() {
 |  | 
 | 
											
												
													
														|  | -      deprecated('page destroy method, use cleanup() instead');
 |  | 
 | 
											
												
													
														|  | -      this.cleanup();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.transform.apply(this, transform);
 | 
											
												
													
														|  | 
 |  | +      this.transform.apply(this, matrix);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Cleans up resources allocated by the page.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    cleanup: function PDFPageProxy_cleanup() {
 |  | 
 | 
											
												
													
														|  | -      this.pendingCleanup = true;
 |  | 
 | 
											
												
													
														|  | -      this._tryCleanup();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    endAnnotation: function CanvasGraphics_endAnnotation() {
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * For internal use only. Attempts to clean up if rendering is in a state
 |  | 
 | 
											
												
													
														|  | -     * where that's possible.
 |  | 
 | 
											
												
													
														|  | -     * @ignore
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    _tryCleanup: function PDFPageProxy_tryCleanup() {
 |  | 
 | 
											
												
													
														|  | -      if (!this.pendingCleanup ||
 |  | 
 | 
											
												
													
														|  | -          Object.keys(this.intentStates).some(function(intent) {
 |  | 
 | 
											
												
													
														|  | -            var intentState = this.intentStates[intent];
 |  | 
 | 
											
												
													
														|  | -            return (intentState.renderTasks.length !== 0 ||
 |  | 
 | 
											
												
													
														|  | -                    intentState.receivingOperatorList);
 |  | 
 | 
											
												
													
														|  | -          }, this)) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
 | 
											
												
													
														|  | 
 |  | +      var domImage = this.objs.get(objId);
 | 
											
												
													
														|  | 
 |  | +      if (!domImage) {
 | 
											
												
													
														|  | 
 |  | +        warn('Dependent image isn\'t ready yet');
 | 
											
												
													
														|  |          return;
 |  |          return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      Object.keys(this.intentStates).forEach(function(intent) {
 |  | 
 | 
											
												
													
														|  | -        delete this.intentStates[intent];
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | -      this.objs.clear();
 |  | 
 | 
											
												
													
														|  | -      this.annotationsPromise = null;
 |  | 
 | 
											
												
													
														|  | -      this.pendingCleanup = false;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * For internal use only.
 |  | 
 | 
											
												
													
														|  | -     * @ignore
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
 |  | 
 | 
											
												
													
														|  | -                                                            intent) {
 |  | 
 | 
											
												
													
														|  | -      var intentState = this.intentStates[intent];
 |  | 
 | 
											
												
													
														|  | -      // TODO Refactor RenderPageRequest to separate rendering
 |  | 
 | 
											
												
													
														|  | -      // and operator list logic
 |  | 
 | 
											
												
													
														|  | -      if (intentState.displayReadyCapability) {
 |  | 
 | 
											
												
													
														|  | -        intentState.displayReadyCapability.resolve(transparency);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      // scale the image to the unit square
 | 
											
												
													
														|  | 
 |  | +      ctx.scale(1 / w, -1 / h);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
 | 
											
												
													
														|  | 
 |  | +                    0, -h, w, h);
 | 
											
												
													
														|  | 
 |  | +      if (this.imageLayer) {
 | 
											
												
													
														|  | 
 |  | +        var currentTransform = ctx.mozCurrentTransformInverse;
 | 
											
												
													
														|  | 
 |  | +        var position = this.getCanvasPosition(0, 0);
 | 
											
												
													
														|  | 
 |  | +        this.imageLayer.appendImage({
 | 
											
												
													
														|  | 
 |  | +          objId: objId,
 | 
											
												
													
														|  | 
 |  | +          left: position[0],
 | 
											
												
													
														|  | 
 |  | +          top: position[1],
 | 
											
												
													
														|  | 
 |  | +          width: w / currentTransform[0],
 | 
											
												
													
														|  | 
 |  | +          height: h / currentTransform[3]
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * For internal use only.
 |  | 
 | 
											
												
													
														|  | -     * @ignore
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
 |  | 
 | 
											
												
													
														|  | -                                                            intent) {
 |  | 
 | 
											
												
													
														|  | -      var intentState = this.intentStates[intent];
 |  | 
 | 
											
												
													
														|  | -      var i, ii;
 |  | 
 | 
											
												
													
														|  | -      // Add the new chunk to the current operator list.
 |  | 
 | 
											
												
													
														|  | -      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
 |  | 
 | 
											
												
													
														|  | -        intentState.operatorList.argsArray.push(
 |  | 
 | 
											
												
													
														|  | -          operatorListChunk.argsArray[i]);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Notify all the rendering tasks there are more operators to be consumed.
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < intentState.renderTasks.length; i++) {
 |  | 
 | 
											
												
													
														|  | -        intentState.renderTasks[i].operatorListChanged();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var width = img.width, height = img.height;
 | 
											
												
													
														|  | 
 |  | +      var fillColor = this.current.fillColor;
 | 
											
												
													
														|  | 
 |  | +      var isPatternFill = this.current.patternFill;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (operatorListChunk.lastChunk) {
 |  | 
 | 
											
												
													
														|  | -        intentState.receivingOperatorList = false;
 |  | 
 | 
											
												
													
														|  | -        this._tryCleanup();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var glyph = this.processingType3;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
 | 
											
												
													
														|  | 
 |  | +        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
 | 
											
												
													
														|  | 
 |  | +          glyph.compiled =
 | 
											
												
													
														|  | 
 |  | +            compileType3Glyph({data: img.data, width: width, height: height});
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          glyph.compiled = null;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return PDFPageProxy;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * PDF.js web worker abstraction, it controls instantiation of PDF documents and
 |  | 
 | 
											
												
													
														|  | - * WorkerTransport for them.  If creation of a web worker is not possible,
 |  | 
 | 
											
												
													
														|  | - * a "fake" worker will be used instead.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var PDFWorker = (function PDFWorkerClosure() {
 |  | 
 | 
											
												
													
														|  | -  var nextFakeWorkerId = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (glyph && glyph.compiled) {
 | 
											
												
													
														|  | 
 |  | +        glyph.compiled(ctx);
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  // Loads worker code into main thread.
 |  | 
 | 
											
												
													
														|  | -  function setupFakeWorkerGlobal() {
 |  | 
 | 
											
												
													
														|  | -    if (!PDFJS.fakeWorkerFilesLoadedCapability) {
 |  | 
 | 
											
												
													
														|  | -      PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -      // In the developer build load worker_loader which in turn loads all the
 |  | 
 | 
											
												
													
														|  | -      // other files and resolves the promise. In production only the
 |  | 
 | 
											
												
													
														|  | -      // pdf.worker.js file is needed.
 |  | 
 | 
											
												
													
														|  | -      var loader = fakeWorkerFilesLoader || function (callback) {
 |  | 
 | 
											
												
													
														|  | -        Util.loadScript(PDFJS.workerSrc, callback);
 |  | 
 | 
											
												
													
														|  | -      };
 |  | 
 | 
											
												
													
														|  | -      loader(function () {
 |  | 
 | 
											
												
													
														|  | -        PDFJS.fakeWorkerFilesLoadedCapability.resolve();
 |  | 
 | 
											
												
													
														|  | -      });
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return PDFJS.fakeWorkerFilesLoadedCapability.promise;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 | 
											
												
													
														|  | 
 |  | +                                                     width, height);
 | 
											
												
													
														|  | 
 |  | +      var maskCtx = maskCanvas.context;
 | 
											
												
													
														|  | 
 |  | +      maskCtx.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function PDFWorker(name) {
 |  | 
 | 
											
												
													
														|  | -    this.name = name;
 |  | 
 | 
											
												
													
														|  | -    this.destroyed = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      putBinaryImageMask(maskCtx, img);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this._readyCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -    this._port = null;
 |  | 
 | 
											
												
													
														|  | -    this._webWorker = null;
 |  | 
 | 
											
												
													
														|  | -    this._messageHandler = null;
 |  | 
 | 
											
												
													
														|  | -    this._initialize();
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      maskCtx.globalCompositeOperation = 'source-in';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  PDFWorker.prototype =  /** @lends PDFWorker.prototype */ {
 |  | 
 | 
											
												
													
														|  | -    get promise() {
 |  | 
 | 
											
												
													
														|  | -      return this._readyCapability.promise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      maskCtx.fillStyle = isPatternFill ?
 | 
											
												
													
														|  | 
 |  | +                          fillColor.getPattern(maskCtx, this) : fillColor;
 | 
											
												
													
														|  | 
 |  | +      maskCtx.fillRect(0, 0, width, height);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    get port() {
 |  | 
 | 
											
												
													
														|  | -      return this._port;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      maskCtx.restore();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    get messageHandler() {
 |  | 
 | 
											
												
													
														|  | -      return this._messageHandler;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.paintInlineImageXObject(maskCanvas.canvas);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    _initialize: function PDFWorker_initialize() {
 |  | 
 | 
											
												
													
														|  | -      // If worker support isn't disabled explicit and the browser has worker
 |  | 
 | 
											
												
													
														|  | -      // support, create a new web worker and test if it/the browser fullfills
 |  | 
 | 
											
												
													
														|  | -      // all requirements to run parts of pdf.js in a web worker.
 |  | 
 | 
											
												
													
														|  | -      // Right now, the requirement is, that an Uint8Array is still an
 |  | 
 | 
											
												
													
														|  | -      // Uint8Array as it arrives on the worker. (Chrome added this with v.15.)
 |  | 
 | 
											
												
													
														|  | -      if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
 |  | 
 | 
											
												
													
														|  | -        var workerSrc = PDFJS.workerSrc;
 |  | 
 | 
											
												
													
														|  | -        if (!workerSrc) {
 |  | 
 | 
											
												
													
														|  | -          error('No PDFJS.workerSrc specified');
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageMaskXObjectRepeat:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,
 | 
											
												
													
														|  | 
 |  | +                                                          scaleY, positions) {
 | 
											
												
													
														|  | 
 |  | +      var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +      var fillColor = this.current.fillColor;
 | 
											
												
													
														|  | 
 |  | +      var isPatternFill = this.current.patternFill;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        try {
 |  | 
 | 
											
												
													
														|  | -          // Some versions of FF can't create a worker on localhost, see:
 |  | 
 | 
											
												
													
														|  | -          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
 |  | 
 | 
											
												
													
														|  | -          var worker = new Worker(workerSrc);
 |  | 
 | 
											
												
													
														|  | -          var messageHandler = new MessageHandler('main', 'worker', worker);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 | 
											
												
													
														|  | 
 |  | +                                                     width, height);
 | 
											
												
													
														|  | 
 |  | +      var maskCtx = maskCanvas.context;
 | 
											
												
													
														|  | 
 |  | +      maskCtx.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -          messageHandler.on('test', function PDFWorker_test(data) {
 |  | 
 | 
											
												
													
														|  | -            if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -              this._readyCapability.reject(new Error('Worker was destroyed'));
 |  | 
 | 
											
												
													
														|  | -              messageHandler.destroy();
 |  | 
 | 
											
												
													
														|  | -              worker.terminate();
 |  | 
 | 
											
												
													
														|  | -              return; // worker was destroyed
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            var supportTypedArray = data && data.supportTypedArray;
 |  | 
 | 
											
												
													
														|  | -            if (supportTypedArray) {
 |  | 
 | 
											
												
													
														|  | -              this._messageHandler = messageHandler;
 |  | 
 | 
											
												
													
														|  | -              this._port = worker;
 |  | 
 | 
											
												
													
														|  | -              this._webWorker = worker;
 |  | 
 | 
											
												
													
														|  | -              if (!data.supportTransfers) {
 |  | 
 | 
											
												
													
														|  | -                PDFJS.postMessageTransfers = false;
 |  | 
 | 
											
												
													
														|  | -              }
 |  | 
 | 
											
												
													
														|  | -              this._readyCapability.resolve();
 |  | 
 | 
											
												
													
														|  | -            } else {
 |  | 
 | 
											
												
													
														|  | -              this._setupFakeWorker();
 |  | 
 | 
											
												
													
														|  | -              messageHandler.destroy();
 |  | 
 | 
											
												
													
														|  | -              worker.terminate();
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -          }.bind(this));
 |  | 
 | 
											
												
													
														|  | 
 |  | +      putBinaryImageMask(maskCtx, imgData);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -          messageHandler.on('console_log', function (data) {
 |  | 
 | 
											
												
													
														|  | -            console.log.apply(console, data);
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | -          messageHandler.on('console_error', function (data) {
 |  | 
 | 
											
												
													
														|  | -            console.error.apply(console, data);
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | 
 |  | +      maskCtx.globalCompositeOperation = 'source-in';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -          var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);
 |  | 
 | 
											
												
													
														|  | -          // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
 |  | 
 | 
											
												
													
														|  | -          // typed array. Also, checking if we can use transfers.
 |  | 
 | 
											
												
													
														|  | -          try {
 |  | 
 | 
											
												
													
														|  | -            messageHandler.send('test', testObj, [testObj.buffer]);
 |  | 
 | 
											
												
													
														|  | -          } catch (ex) {
 |  | 
 | 
											
												
													
														|  | -            info('Cannot use postMessage transfers');
 |  | 
 | 
											
												
													
														|  | -            testObj[0] = 0;
 |  | 
 | 
											
												
													
														|  | -            messageHandler.send('test', testObj);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          return;
 |  | 
 | 
											
												
													
														|  | -        } catch (e) {
 |  | 
 | 
											
												
													
														|  | -          info('The worker has been disabled.');
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      maskCtx.fillStyle = isPatternFill ?
 | 
											
												
													
														|  | 
 |  | +                          fillColor.getPattern(maskCtx, this) : fillColor;
 | 
											
												
													
														|  | 
 |  | +      maskCtx.fillRect(0, 0, width, height);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      maskCtx.restore();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = positions.length; i < ii; i += 2) {
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(1, -1);
 | 
											
												
													
														|  | 
 |  | +        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
 | 
											
												
													
														|  | 
 |  | +          0, -1, 1, 1);
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      // Either workers are disabled, not supported or have thrown an exception.
 |  | 
 | 
											
												
													
														|  | -      // Thus, we fallback to a faked worker.
 |  | 
 | 
											
												
													
														|  | -      this._setupFakeWorker();
 |  | 
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    _setupFakeWorker: function PDFWorker_setupFakeWorker() {
 |  | 
 | 
											
												
													
														|  | -      if (!globalScope.PDFJS.disableWorker) {
 |  | 
 | 
											
												
													
														|  | -        warn('Setting up fake worker.');
 |  | 
 | 
											
												
													
														|  | -        globalScope.PDFJS.disableWorker = true;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageMaskXObjectGroup:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintImageMaskXObjectGroup(images) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      setupFakeWorkerGlobal().then(function () {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          this._readyCapability.reject(new Error('Worker was destroyed'));
 |  | 
 | 
											
												
													
														|  | -          return;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var fillColor = this.current.fillColor;
 | 
											
												
													
														|  | 
 |  | +      var isPatternFill = this.current.patternFill;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = images.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        var image = images[i];
 | 
											
												
													
														|  | 
 |  | +        var width = image.width, height = image.height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // If we don't use a worker, just post/sendMessage to the main thread.
 |  | 
 | 
											
												
													
														|  | -        var port = {
 |  | 
 | 
											
												
													
														|  | -          _listeners: [],
 |  | 
 | 
											
												
													
														|  | -          postMessage: function (obj) {
 |  | 
 | 
											
												
													
														|  | -            var e = {data: obj};
 |  | 
 | 
											
												
													
														|  | -            this._listeners.forEach(function (listener) {
 |  | 
 | 
											
												
													
														|  | -              listener.call(this, e);
 |  | 
 | 
											
												
													
														|  | -            }, this);
 |  | 
 | 
											
												
													
														|  | -          },
 |  | 
 | 
											
												
													
														|  | -          addEventListener: function (name, listener) {
 |  | 
 | 
											
												
													
														|  | -            this._listeners.push(listener);
 |  | 
 | 
											
												
													
														|  | -          },
 |  | 
 | 
											
												
													
														|  | -          removeEventListener: function (name, listener) {
 |  | 
 | 
											
												
													
														|  | -            var i = this._listeners.indexOf(listener);
 |  | 
 | 
											
												
													
														|  | -            this._listeners.splice(i, 1);
 |  | 
 | 
											
												
													
														|  | -          },
 |  | 
 | 
											
												
													
														|  | -          terminate: function () {}
 |  | 
 | 
											
												
													
														|  | -        };
 |  | 
 | 
											
												
													
														|  | -        this._port = port;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
 | 
											
												
													
														|  | 
 |  | +                                                       width, height);
 | 
											
												
													
														|  | 
 |  | +        var maskCtx = maskCanvas.context;
 | 
											
												
													
														|  | 
 |  | +        maskCtx.save();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // All fake workers use the same port, making id unique.
 |  | 
 | 
											
												
													
														|  | -        var id = 'fake' + (nextFakeWorkerId++);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        putBinaryImageMask(maskCtx, image);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        // If the main thread is our worker, setup the handling for the
 |  | 
 | 
											
												
													
														|  | -        // messages -- the main thread sends to it self.
 |  | 
 | 
											
												
													
														|  | -        var workerHandler = new MessageHandler(id + '_worker', id, port);
 |  | 
 | 
											
												
													
														|  | -        PDFJS.WorkerMessageHandler.setup(workerHandler, port);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        maskCtx.globalCompositeOperation = 'source-in';
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var messageHandler = new MessageHandler(id, id + '_worker', port);
 |  | 
 | 
											
												
													
														|  | -        this._messageHandler = messageHandler;
 |  | 
 | 
											
												
													
														|  | -        this._readyCapability.resolve();
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        maskCtx.fillStyle = isPatternFill ?
 | 
											
												
													
														|  | 
 |  | +                            fillColor.getPattern(maskCtx, this) : fillColor;
 | 
											
												
													
														|  | 
 |  | +        maskCtx.fillRect(0, 0, width, height);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        maskCtx.restore();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.transform.apply(ctx, image.transform);
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(1, -1);
 | 
											
												
													
														|  | 
 |  | +        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
 | 
											
												
													
														|  | 
 |  | +                      0, -1, 1, 1);
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Destroys the worker instance.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    destroy: function PDFWorker_destroy() {
 |  | 
 | 
											
												
													
														|  | -      this.destroyed = true;
 |  | 
 | 
											
												
													
														|  | -      if (this._webWorker) {
 |  | 
 | 
											
												
													
														|  | -        // We need to terminate only web worker created resource.
 |  | 
 | 
											
												
													
														|  | -        this._webWorker.terminate();
 |  | 
 | 
											
												
													
														|  | -        this._webWorker = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
 | 
											
												
													
														|  | 
 |  | +      var imgData = this.objs.get(objId);
 | 
											
												
													
														|  | 
 |  | +      if (!imgData) {
 | 
											
												
													
														|  | 
 |  | +        warn('Dependent image isn\'t ready yet');
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this._port = null;
 |  | 
 | 
											
												
													
														|  | -      if (this._messageHandler) {
 |  | 
 | 
											
												
													
														|  | -        this._messageHandler.destroy();
 |  | 
 | 
											
												
													
														|  | -        this._messageHandler = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.paintInlineImageXObject(imgData);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    paintImageXObjectRepeat:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,
 | 
											
												
													
														|  | 
 |  | +                                                          positions) {
 | 
											
												
													
														|  | 
 |  | +      var imgData = this.objs.get(objId);
 | 
											
												
													
														|  | 
 |  | +      if (!imgData) {
 | 
											
												
													
														|  | 
 |  | +        warn('Dependent image isn\'t ready yet');
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return PDFWorker;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | -PDFJS.PDFWorker = PDFWorker;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +      var map = [];
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = positions.length; i < ii; i += 2) {
 | 
											
												
													
														|  | 
 |  | +        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],
 | 
											
												
													
														|  | 
 |  | +                 positions[i + 1]], x: 0, y: 0, w: width, h: height});
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.paintInlineImageXObjectGroup(imgData, map);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * For internal use only.
 |  | 
 | 
											
												
													
														|  | - * @ignore
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var WorkerTransport = (function WorkerTransportClosure() {
 |  | 
 | 
											
												
													
														|  | -  function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -    this.messageHandler = messageHandler;
 |  | 
 | 
											
												
													
														|  | -    this.loadingTask = loadingTask;
 |  | 
 | 
											
												
													
														|  | -    this.pdfDataRangeTransport = pdfDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -    this.commonObjs = new PDFObjects();
 |  | 
 | 
											
												
													
														|  | -    this.fontLoader = new FontLoader(loadingTask.docId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintInlineImageXObject:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintInlineImageXObject(imgData) {
 | 
											
												
													
														|  | 
 |  | +      var width = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var height = imgData.height;
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.destroyed = false;
 |  | 
 | 
											
												
													
														|  | -    this.destroyCapability = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this.save();
 | 
											
												
													
														|  | 
 |  | +      // scale the image to the unit square
 | 
											
												
													
														|  | 
 |  | +      ctx.scale(1 / width, -1 / height);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.pageCache = [];
 |  | 
 | 
											
												
													
														|  | -    this.pagePromises = [];
 |  | 
 | 
											
												
													
														|  | -    this.downloadInfoCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var currentTransform = ctx.mozCurrentTransformInverse;
 | 
											
												
													
														|  | 
 |  | +      var a = currentTransform[0], b = currentTransform[1];
 | 
											
												
													
														|  | 
 |  | +      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
 | 
											
												
													
														|  | 
 |  | +      var c = currentTransform[2], d = currentTransform[3];
 | 
											
												
													
														|  | 
 |  | +      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.setupMessageHandler();
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  WorkerTransport.prototype = {
 |  | 
 | 
											
												
													
														|  | -    destroy: function WorkerTransport_destroy() {
 |  | 
 | 
											
												
													
														|  | -      if (this.destroyCapability) {
 |  | 
 | 
											
												
													
														|  | -        return this.destroyCapability.promise;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var imgToPaint, tmpCanvas;
 | 
											
												
													
														|  | 
 |  | +      // instanceof HTMLElement does not work in jsdom node.js module
 | 
											
												
													
														|  | 
 |  | +      if (imgData instanceof HTMLElement || !imgData.data) {
 | 
											
												
													
														|  | 
 |  | +        imgToPaint = imgData;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage',
 | 
											
												
													
														|  | 
 |  | +                                                  width, height);
 | 
											
												
													
														|  | 
 |  | +        var tmpCtx = tmpCanvas.context;
 | 
											
												
													
														|  | 
 |  | +        putBinaryImageData(tmpCtx, imgData);
 | 
											
												
													
														|  | 
 |  | +        imgToPaint = tmpCanvas.canvas;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.destroyed = true;
 |  | 
 | 
											
												
													
														|  | -      this.destroyCapability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var waitOn = [];
 |  | 
 | 
											
												
													
														|  | -      // We need to wait for all renderings to be completed, e.g.
 |  | 
 | 
											
												
													
														|  | -      // timeout/rAF can take a long time.
 |  | 
 | 
											
												
													
														|  | -      this.pageCache.forEach(function (page) {
 |  | 
 | 
											
												
													
														|  | -        if (page) {
 |  | 
 | 
											
												
													
														|  | -          waitOn.push(page._destroy());
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      });
 |  | 
 | 
											
												
													
														|  | -      this.pageCache = [];
 |  | 
 | 
											
												
													
														|  | -      this.pagePromises = [];
 |  | 
 | 
											
												
													
														|  | -      var self = this;
 |  | 
 | 
											
												
													
														|  | -      // We also need to wait for the worker to finish its long running tasks.
 |  | 
 | 
											
												
													
														|  | -      var terminated = this.messageHandler.sendWithPromise('Terminate', null);
 |  | 
 | 
											
												
													
														|  | -      waitOn.push(terminated);
 |  | 
 | 
											
												
													
														|  | -      Promise.all(waitOn).then(function () {
 |  | 
 | 
											
												
													
														|  | -        self.fontLoader.clear();
 |  | 
 | 
											
												
													
														|  | -        if (self.pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -          self.pdfDataRangeTransport.abort();
 |  | 
 | 
											
												
													
														|  | -          self.pdfDataRangeTransport = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var paintWidth = width, paintHeight = height;
 | 
											
												
													
														|  | 
 |  | +      var tmpCanvasId = 'prescale1';
 | 
											
												
													
														|  | 
 |  | +      // Vertial or horizontal scaling shall not be more than 2 to not loose the
 | 
											
												
													
														|  | 
 |  | +      // pixels during drawImage operation, painting on the temporary canvas(es)
 | 
											
												
													
														|  | 
 |  | +      // that are twice smaller in size
 | 
											
												
													
														|  | 
 |  | +      while ((widthScale > 2 && paintWidth > 1) ||
 | 
											
												
													
														|  | 
 |  | +             (heightScale > 2 && paintHeight > 1)) {
 | 
											
												
													
														|  | 
 |  | +        var newWidth = paintWidth, newHeight = paintHeight;
 | 
											
												
													
														|  | 
 |  | +        if (widthScale > 2 && paintWidth > 1) {
 | 
											
												
													
														|  | 
 |  | +          newWidth = Math.ceil(paintWidth / 2);
 | 
											
												
													
														|  | 
 |  | +          widthScale /= paintWidth / newWidth;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        if (self.messageHandler) {
 |  | 
 | 
											
												
													
														|  | -          self.messageHandler.destroy();
 |  | 
 | 
											
												
													
														|  | -          self.messageHandler = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (heightScale > 2 && paintHeight > 1) {
 | 
											
												
													
														|  | 
 |  | +          newHeight = Math.ceil(paintHeight / 2);
 | 
											
												
													
														|  | 
 |  | +          heightScale /= paintHeight / newHeight;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        self.destroyCapability.resolve();
 |  | 
 | 
											
												
													
														|  | -      }, this.destroyCapability.reject);
 |  | 
 | 
											
												
													
														|  | -      return this.destroyCapability.promise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    setupMessageHandler:
 |  | 
 | 
											
												
													
														|  | -      function WorkerTransport_setupMessageHandler() {
 |  | 
 | 
											
												
													
														|  | -      var messageHandler = this.messageHandler;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      function updatePassword(password) {
 |  | 
 | 
											
												
													
														|  | -        messageHandler.send('UpdatePassword', password);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId,
 | 
											
												
													
														|  | 
 |  | +                                                  newWidth, newHeight);
 | 
											
												
													
														|  | 
 |  | +        tmpCtx = tmpCanvas.context;
 | 
											
												
													
														|  | 
 |  | +        tmpCtx.clearRect(0, 0, newWidth, newHeight);
 | 
											
												
													
														|  | 
 |  | +        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
 | 
											
												
													
														|  | 
 |  | +                                     0, 0, newWidth, newHeight);
 | 
											
												
													
														|  | 
 |  | +        imgToPaint = tmpCanvas.canvas;
 | 
											
												
													
														|  | 
 |  | +        paintWidth = newWidth;
 | 
											
												
													
														|  | 
 |  | +        paintHeight = newHeight;
 | 
											
												
													
														|  | 
 |  | +        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
 | 
											
												
													
														|  | 
 |  | +                                0, -height, width, height);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var pdfDataRangeTransport = this.pdfDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -      if (pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
 |  | 
 | 
											
												
													
														|  | -          messageHandler.send('OnDataRange', {
 |  | 
 | 
											
												
													
														|  | -            begin: begin,
 |  | 
 | 
											
												
													
														|  | -            chunk: chunk
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.imageLayer) {
 | 
											
												
													
														|  | 
 |  | +        var position = this.getCanvasPosition(0, -height);
 | 
											
												
													
														|  | 
 |  | +        this.imageLayer.appendImage({
 | 
											
												
													
														|  | 
 |  | +          imgData: imgData,
 | 
											
												
													
														|  | 
 |  | +          left: position[0],
 | 
											
												
													
														|  | 
 |  | +          top: position[1],
 | 
											
												
													
														|  | 
 |  | +          width: width / currentTransform[0],
 | 
											
												
													
														|  | 
 |  | +          height: height / currentTransform[3]
 | 
											
												
													
														|  |          });
 |  |          });
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.restore();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        pdfDataRangeTransport.addProgressListener(function(loaded) {
 |  | 
 | 
											
												
													
														|  | -          messageHandler.send('OnDataProgress', {
 |  | 
 | 
											
												
													
														|  | -            loaded: loaded
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintInlineImageXObjectGroup:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      var w = imgData.width;
 | 
											
												
													
														|  | 
 |  | +      var h = imgData.height;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {
 |  | 
 | 
											
												
													
														|  | -          messageHandler.send('OnDataRange', {
 |  | 
 | 
											
												
													
														|  | -            chunk: chunk
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);
 | 
											
												
													
														|  | 
 |  | +      var tmpCtx = tmpCanvas.context;
 | 
											
												
													
														|  | 
 |  | +      putBinaryImageData(tmpCtx, imgData);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        messageHandler.on('RequestDataRange',
 |  | 
 | 
											
												
													
														|  | -          function transportDataRange(data) {
 |  | 
 | 
											
												
													
														|  | -            pdfDataRangeTransport.requestDataRange(data.begin, data.end);
 |  | 
 | 
											
												
													
														|  | -          }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = map.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        var entry = map[i];
 | 
											
												
													
														|  | 
 |  | +        ctx.save();
 | 
											
												
													
														|  | 
 |  | +        ctx.transform.apply(ctx, entry.transform);
 | 
											
												
													
														|  | 
 |  | +        ctx.scale(1, -1);
 | 
											
												
													
														|  | 
 |  | +        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,
 | 
											
												
													
														|  | 
 |  | +                      0, -1, 1, 1);
 | 
											
												
													
														|  | 
 |  | +        if (this.imageLayer) {
 | 
											
												
													
														|  | 
 |  | +          var position = this.getCanvasPosition(entry.x, entry.y);
 | 
											
												
													
														|  | 
 |  | +          this.imageLayer.appendImage({
 | 
											
												
													
														|  | 
 |  | +            imgData: imgData,
 | 
											
												
													
														|  | 
 |  | +            left: position[0],
 | 
											
												
													
														|  | 
 |  | +            top: position[1],
 | 
											
												
													
														|  | 
 |  | +            width: w,
 | 
											
												
													
														|  | 
 |  | +            height: h
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        ctx.restore();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('GetDoc', function transportDoc(data) {
 |  | 
 | 
											
												
													
														|  | -        var pdfInfo = data.pdfInfo;
 |  | 
 | 
											
												
													
														|  | -        this.numPages = data.pdfInfo.numPages;
 |  | 
 | 
											
												
													
														|  | -        var loadingTask = this.loadingTask;
 |  | 
 | 
											
												
													
														|  | -        var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
 |  | 
 | 
											
												
													
														|  | -        this.pdfDocument = pdfDocument;
 |  | 
 | 
											
												
													
														|  | -        loadingTask._capability.resolve(pdfDocument);
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      messageHandler.on('NeedPassword',
 |  | 
 | 
											
												
													
														|  | -                        function transportNeedPassword(exception) {
 |  | 
 | 
											
												
													
														|  | -        var loadingTask = this.loadingTask;
 |  | 
 | 
											
												
													
														|  | -        if (loadingTask.onPassword) {
 |  | 
 | 
											
												
													
														|  | -          return loadingTask.onPassword(updatePassword,
 |  | 
 | 
											
												
													
														|  | -                                        PasswordResponses.NEED_PASSWORD);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new PasswordException(exception.message, exception.code));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintSolidColorImageMask:
 | 
											
												
													
														|  | 
 |  | +      function CanvasGraphics_paintSolidColorImageMask() {
 | 
											
												
													
														|  | 
 |  | +        this.ctx.fillRect(0, 0, 1, 1);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('IncorrectPassword',
 |  | 
 | 
											
												
													
														|  | -                        function transportIncorrectPassword(exception) {
 |  | 
 | 
											
												
													
														|  | -        var loadingTask = this.loadingTask;
 |  | 
 | 
											
												
													
														|  | -        if (loadingTask.onPassword) {
 |  | 
 | 
											
												
													
														|  | -          return loadingTask.onPassword(updatePassword,
 |  | 
 | 
											
												
													
														|  | -                                        PasswordResponses.INCORRECT_PASSWORD);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new PasswordException(exception.message, exception.code));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    paintXObject: function CanvasGraphics_paintXObject() {
 | 
											
												
													
														|  | 
 |  | +      warn('Unsupported \'paintXObject\' command.');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
 |  | 
 | 
											
												
													
														|  | -        this.loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new InvalidPDFException(exception.message));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Marked content
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
 |  | 
 | 
											
												
													
														|  | -        this.loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new MissingPDFException(exception.message));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    markPoint: function CanvasGraphics_markPoint(tag) {
 | 
											
												
													
														|  | 
 |  | +      // TODO Marked content.
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
 | 
											
												
													
														|  | 
 |  | +      // TODO Marked content.
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
 | 
											
												
													
														|  | 
 |  | +      // TODO Marked content.
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
 | 
											
												
													
														|  | 
 |  | +                                        tag, properties) {
 | 
											
												
													
														|  | 
 |  | +      // TODO Marked content.
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    endMarkedContent: function CanvasGraphics_endMarkedContent() {
 | 
											
												
													
														|  | 
 |  | +      // TODO Marked content.
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('UnexpectedResponse',
 |  | 
 | 
											
												
													
														|  | -                        function transportUnexpectedResponse(exception) {
 |  | 
 | 
											
												
													
														|  | -        this.loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new UnexpectedResponseException(exception.message, exception.status));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Compatibility
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('UnknownError',
 |  | 
 | 
											
												
													
														|  | -                        function transportUnknownError(exception) {
 |  | 
 | 
											
												
													
														|  | -        this.loadingTask._capability.reject(
 |  | 
 | 
											
												
													
														|  | -          new UnknownErrorException(exception.message, exception.details));
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    beginCompat: function CanvasGraphics_beginCompat() {
 | 
											
												
													
														|  | 
 |  | +      // TODO ignore undefined operators (should we do that anyway?)
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    endCompat: function CanvasGraphics_endCompat() {
 | 
											
												
													
														|  | 
 |  | +      // TODO stop ignoring undefined operators
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('DataLoaded', function transportPage(data) {
 |  | 
 | 
											
												
													
														|  | -        this.downloadInfoCapability.resolve(data);
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    // Helper functions
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('PDFManagerReady', function transportPage(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.pdfDataRangeTransport) {
 |  | 
 | 
											
												
													
														|  | -          this.pdfDataRangeTransport.transportReady();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    consumePath: function CanvasGraphics_consumePath() {
 | 
											
												
													
														|  | 
 |  | +      var ctx = this.ctx;
 | 
											
												
													
														|  | 
 |  | +      if (this.pendingClip) {
 | 
											
												
													
														|  | 
 |  | +        if (this.pendingClip === EO_CLIP) {
 | 
											
												
													
														|  | 
 |  | +          if (ctx.mozFillRule !== undefined) {
 | 
											
												
													
														|  | 
 |  | +            ctx.mozFillRule = 'evenodd';
 | 
											
												
													
														|  | 
 |  | +            ctx.clip();
 | 
											
												
													
														|  | 
 |  | +            ctx.mozFillRule = 'nonzero';
 | 
											
												
													
														|  | 
 |  | +          } else {
 | 
											
												
													
														|  | 
 |  | +            ctx.clip('evenodd');
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          ctx.clip();
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.pendingClip = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      ctx.beginPath();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
 | 
											
												
													
														|  | 
 |  | +      if (this.cachedGetSinglePixelWidth === null) {
 | 
											
												
													
														|  | 
 |  | +        var inverse = this.ctx.mozCurrentTransformInverse;
 | 
											
												
													
														|  | 
 |  | +        // max of the current horizontal and vertical scale
 | 
											
												
													
														|  | 
 |  | +        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(
 | 
											
												
													
														|  | 
 |  | +          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
 | 
											
												
													
														|  | 
 |  | +          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return this.cachedGetSinglePixelWidth;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
 | 
											
												
													
														|  | 
 |  | +      var transform = this.ctx.mozCurrentTransform;
 | 
											
												
													
														|  | 
 |  | +      return [
 | 
											
												
													
														|  | 
 |  | +        transform[0] * x + transform[2] * y + transform[4],
 | 
											
												
													
														|  | 
 |  | +        transform[1] * x + transform[3] * y + transform[5]
 | 
											
												
													
														|  | 
 |  | +      ];
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  for (var op in OPS) {
 | 
											
												
													
														|  | 
 |  | +    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  return CanvasGraphics;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +exports.CanvasGraphics = CanvasGraphics;
 | 
											
												
													
														|  | 
 |  | +exports.createScratchCanvas = createScratchCanvas;
 | 
											
												
													
														|  | 
 |  | +}));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('StartRenderPage', function transportRender(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        var page = this.pageCache[data.pageIndex];
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        page.stats.timeEnd('Page Request');
 |  | 
 | 
											
												
													
														|  | -        page._startRenderPage(data.transparency, data.intent);
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +(function (root, factory) {
 | 
											
												
													
														|  | 
 |  | +  {
 | 
											
												
													
														|  | 
 |  | +    factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil,
 | 
											
												
													
														|  | 
 |  | +      root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas,
 | 
											
												
													
														|  | 
 |  | +      root.pdfjsSharedGlobal);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}(this, function (exports, sharedUtil, displayFontLoader, displayCanvas,
 | 
											
												
													
														|  | 
 |  | +                  sharedGlobal, amdRequire) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('RenderPageChunk', function transportRender(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        var page = this.pageCache[data.pageIndex];
 |  | 
 | 
											
												
													
														|  | 
 |  | +var InvalidPDFException = sharedUtil.InvalidPDFException;
 | 
											
												
													
														|  | 
 |  | +var MessageHandler = sharedUtil.MessageHandler;
 | 
											
												
													
														|  | 
 |  | +var MissingPDFException = sharedUtil.MissingPDFException;
 | 
											
												
													
														|  | 
 |  | +var PasswordResponses = sharedUtil.PasswordResponses;
 | 
											
												
													
														|  | 
 |  | +var PasswordException = sharedUtil.PasswordException;
 | 
											
												
													
														|  | 
 |  | +var StatTimer = sharedUtil.StatTimer;
 | 
											
												
													
														|  | 
 |  | +var UnexpectedResponseException = sharedUtil.UnexpectedResponseException;
 | 
											
												
													
														|  | 
 |  | +var UnknownErrorException = sharedUtil.UnknownErrorException;
 | 
											
												
													
														|  | 
 |  | +var Util = sharedUtil.Util;
 | 
											
												
													
														|  | 
 |  | +var createPromiseCapability = sharedUtil.createPromiseCapability;
 | 
											
												
													
														|  | 
 |  | +var combineUrl = sharedUtil.combineUrl;
 | 
											
												
													
														|  | 
 |  | +var error = sharedUtil.error;
 | 
											
												
													
														|  | 
 |  | +var deprecated = sharedUtil.deprecated;
 | 
											
												
													
														|  | 
 |  | +var info = sharedUtil.info;
 | 
											
												
													
														|  | 
 |  | +var isArrayBuffer = sharedUtil.isArrayBuffer;
 | 
											
												
													
														|  | 
 |  | +var loadJpegStream = sharedUtil.loadJpegStream;
 | 
											
												
													
														|  | 
 |  | +var stringToBytes = sharedUtil.stringToBytes;
 | 
											
												
													
														|  | 
 |  | +var warn = sharedUtil.warn;
 | 
											
												
													
														|  | 
 |  | +var FontFaceObject = displayFontLoader.FontFaceObject;
 | 
											
												
													
														|  | 
 |  | +var FontLoader = displayFontLoader.FontLoader;
 | 
											
												
													
														|  | 
 |  | +var CanvasGraphics = displayCanvas.CanvasGraphics;
 | 
											
												
													
														|  | 
 |  | +var createScratchCanvas = displayCanvas.createScratchCanvas;
 | 
											
												
													
														|  | 
 |  | +var PDFJS = sharedGlobal.PDFJS;
 | 
											
												
													
														|  | 
 |  | +var globalScope = sharedGlobal.globalScope;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        page._renderPageChunk(data.operatorList, data.intent);
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('commonobj', function transportObj(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var id = data[0];
 |  | 
 | 
											
												
													
														|  | -        var type = data[1];
 |  | 
 | 
											
												
													
														|  | -        if (this.commonObjs.hasData(id)) {
 |  | 
 | 
											
												
													
														|  | -          return;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +var useRequireEnsure = false;
 | 
											
												
													
														|  | 
 |  | +if (typeof module !== 'undefined' && module.require) {
 | 
											
												
													
														|  | 
 |  | +  // node.js - disable worker and set require.ensure.
 | 
											
												
													
														|  | 
 |  | +  PDFJS.disableWorker = true;
 | 
											
												
													
														|  | 
 |  | +  if (typeof require.ensure === 'undefined') {
 | 
											
												
													
														|  | 
 |  | +    require.ensure = require('node-ensure');
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  useRequireEnsure = true;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +if (typeof __webpack_require__ !== 'undefined') {
 | 
											
												
													
														|  | 
 |  | +  // Webpack - get/bundle pdf.worker.js as additional file.
 | 
											
												
													
														|  | 
 |  | +  PDFJS.workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js');
 | 
											
												
													
														|  | 
 |  | +  useRequireEnsure = true;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +var fakeWorkerFilesLoader = useRequireEnsure && function (callback) {
 | 
											
												
													
														|  | 
 |  | +  require.ensure([], function () {
 | 
											
												
													
														|  | 
 |  | +    require('./pdf.worker.js');
 | 
											
												
													
														|  | 
 |  | +    callback();
 | 
											
												
													
														|  | 
 |  | +  });
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        switch (type) {
 |  | 
 | 
											
												
													
														|  | -          case 'Font':
 |  | 
 | 
											
												
													
														|  | -            var exportedData = data[2];
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            var font;
 |  | 
 | 
											
												
													
														|  | -            if ('error' in exportedData) {
 |  | 
 | 
											
												
													
														|  | -              var error = exportedData.error;
 |  | 
 | 
											
												
													
														|  | -              warn('Error during font loading: ' + error);
 |  | 
 | 
											
												
													
														|  | -              this.commonObjs.resolve(id, error);
 |  | 
 | 
											
												
													
														|  | -              break;
 |  | 
 | 
											
												
													
														|  | -            } else {
 |  | 
 | 
											
												
													
														|  | -              font = new FontFaceObject(exportedData);
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * The maximum allowed image size in total pixels e.g. width * height. Images
 | 
											
												
													
														|  | 
 |  | + * above this value will not be drawn. Use -1 for no limit.
 | 
											
												
													
														|  | 
 |  | + * @var {number}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?
 | 
											
												
													
														|  | 
 |  | +                      -1 : PDFJS.maxImageSize);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            this.fontLoader.bind(
 |  | 
 | 
											
												
													
														|  | -              [font],
 |  | 
 | 
											
												
													
														|  | -              function fontReady(fontObjs) {
 |  | 
 | 
											
												
													
														|  | -                this.commonObjs.resolve(id, font);
 |  | 
 | 
											
												
													
														|  | -              }.bind(this)
 |  | 
 | 
											
												
													
														|  | -            );
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'FontPath':
 |  | 
 | 
											
												
													
														|  | -            this.commonObjs.resolve(id, data[2]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          default:
 |  | 
 | 
											
												
													
														|  | -            error('Got unknown common object type ' + type);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * The url of where the predefined Adobe CMaps are located. Include trailing
 | 
											
												
													
														|  | 
 |  | + * slash.
 | 
											
												
													
														|  | 
 |  | + * @var {string}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('obj', function transportObj(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Specifies if CMaps are binary packed.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var id = data[0];
 |  | 
 | 
											
												
													
														|  | -        var pageIndex = data[1];
 |  | 
 | 
											
												
													
														|  | -        var type = data[2];
 |  | 
 | 
											
												
													
														|  | -        var pageProxy = this.pageCache[pageIndex];
 |  | 
 | 
											
												
													
														|  | -        var imageData;
 |  | 
 | 
											
												
													
														|  | -        if (pageProxy.objs.hasData(id)) {
 |  | 
 | 
											
												
													
														|  | -          return;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * By default fonts are converted to OpenType fonts and loaded via font face
 | 
											
												
													
														|  | 
 |  | + * rules. If disabled, the font will be rendered using a built in font renderer
 | 
											
												
													
														|  | 
 |  | + * that constructs the glyphs with primitive path commands.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?
 | 
											
												
													
														|  | 
 |  | +                         false : PDFJS.disableFontFace);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        switch (type) {
 |  | 
 | 
											
												
													
														|  | -          case 'JpegStream':
 |  | 
 | 
											
												
													
														|  | -            imageData = data[3];
 |  | 
 | 
											
												
													
														|  | -            loadJpegStream(id, imageData, pageProxy.objs);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'Image':
 |  | 
 | 
											
												
													
														|  | -            imageData = data[3];
 |  | 
 | 
											
												
													
														|  | -            pageProxy.objs.resolve(id, imageData);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Path for image resources, mainly for annotation icons. Include trailing
 | 
											
												
													
														|  | 
 |  | + * slash.
 | 
											
												
													
														|  | 
 |  | + * @var {string}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?
 | 
											
												
													
														|  | 
 |  | +                            '' : PDFJS.imageResourcesPath);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            // heuristics that will allow not to store large data
 |  | 
 | 
											
												
													
														|  | -            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
 |  | 
 | 
											
												
													
														|  | -            if (imageData && 'data' in imageData &&
 |  | 
 | 
											
												
													
														|  | -                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
 |  | 
 | 
											
												
													
														|  | -              pageProxy.cleanupAfterRender = true;
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          default:
 |  | 
 | 
											
												
													
														|  | -            error('Got unknown object type ' + type);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disable the web worker and run all code on the main thread. This will happen
 | 
											
												
													
														|  | 
 |  | + * automatically if the browser doesn't support workers or sending typed arrays
 | 
											
												
													
														|  | 
 |  | + * to workers.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableWorker = (PDFJS.disableWorker === undefined ?
 | 
											
												
													
														|  | 
 |  | +                       false : PDFJS.disableWorker);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('DocProgress', function transportDocProgress(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Path and filename of the worker file. Required when the worker is enabled in
 | 
											
												
													
														|  | 
 |  | + * development mode. If unspecified in the production build, the worker will be
 | 
											
												
													
														|  | 
 |  | + * loaded based on the location of the pdf.js file. It is recommended that
 | 
											
												
													
														|  | 
 |  | + * the workerSrc is set in a custom application to prevent issues caused by
 | 
											
												
													
														|  | 
 |  | + * third-party frameworks and libraries.
 | 
											
												
													
														|  | 
 |  | + * @var {string}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var loadingTask = this.loadingTask;
 |  | 
 | 
											
												
													
														|  | -        if (loadingTask.onProgress) {
 |  | 
 | 
											
												
													
														|  | -          loadingTask.onProgress({
 |  | 
 | 
											
												
													
														|  | -            loaded: data.loaded,
 |  | 
 | 
											
												
													
														|  | -            total: data.total
 |  | 
 | 
											
												
													
														|  | -          });
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disable range request loading of PDF files. When enabled and if the server
 | 
											
												
													
														|  | 
 |  | + * supports partial content requests then the PDF will be fetched in chunks.
 | 
											
												
													
														|  | 
 |  | + * Enabled (false) by default.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableRange = (PDFJS.disableRange === undefined ?
 | 
											
												
													
														|  | 
 |  | +                      false : PDFJS.disableRange);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('PageError', function transportError(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disable streaming of PDF file data. By default PDF.js attempts to load PDF
 | 
											
												
													
														|  | 
 |  | + * in chunks. This default behavior can be disabled.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableStream = (PDFJS.disableStream === undefined ?
 | 
											
												
													
														|  | 
 |  | +                       false : PDFJS.disableStream);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var page = this.pageCache[data.pageNum - 1];
 |  | 
 | 
											
												
													
														|  | -        var intentState = page.intentStates[data.intent];
 |  | 
 | 
											
												
													
														|  | -        if (intentState.displayReadyCapability) {
 |  | 
 | 
											
												
													
														|  | -          intentState.displayReadyCapability.reject(data.error);
 |  | 
 | 
											
												
													
														|  | -        } else {
 |  | 
 | 
											
												
													
														|  | -          error(data.error);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
 | 
											
												
													
														|  | 
 |  | + * will automatically keep fetching more data even if it isn't needed to display
 | 
											
												
													
														|  | 
 |  | + * the current page. This default behavior can be disabled.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * NOTE: It is also necessary to disable streaming, see above,
 | 
											
												
													
														|  | 
 |  | + *       in order for disabling of pre-fetching to work correctly.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?
 | 
											
												
													
														|  | 
 |  | +                          false : PDFJS.disableAutoFetch);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('UnsupportedFeature',
 |  | 
 | 
											
												
													
														|  | -          function transportUnsupportedFeature(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return; // Ignore any pending requests if the worker was terminated.
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        var featureId = data.featureId;
 |  | 
 | 
											
												
													
														|  | -        var loadingTask = this.loadingTask;
 |  | 
 | 
											
												
													
														|  | -        if (loadingTask.onUnsupportedFeature) {
 |  | 
 | 
											
												
													
														|  | -          loadingTask.onUnsupportedFeature(featureId);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        PDFJS.UnsupportedManager.notify(featureId);
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Enables special hooks for debugging PDF.js.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Enables transfer usage in postMessage for ArrayBuffers.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?
 | 
											
												
													
														|  | 
 |  | +                              true : PDFJS.postMessageTransfers);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      messageHandler.on('JpegDecode', function(data) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          return Promise.reject('Worker was terminated');
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disables URL.createObjectURL usage.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?
 | 
											
												
													
														|  | 
 |  | +                                false : PDFJS.disableCreateObjectURL);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var imageUrl = data[0];
 |  | 
 | 
											
												
													
														|  | -        var components = data[1];
 |  | 
 | 
											
												
													
														|  | -        if (components !== 3 && components !== 1) {
 |  | 
 | 
											
												
													
														|  | -          return Promise.reject(
 |  | 
 | 
											
												
													
														|  | -            new Error('Only 3 components or 1 component can be returned'));
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disables WebGL usage.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?
 | 
											
												
													
														|  | 
 |  | +                      true : PDFJS.disableWebGL);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        return new Promise(function (resolve, reject) {
 |  | 
 | 
											
												
													
														|  | -          var img = new Image();
 |  | 
 | 
											
												
													
														|  | -          img.onload = function () {
 |  | 
 | 
											
												
													
														|  | -            var width = img.width;
 |  | 
 | 
											
												
													
														|  | -            var height = img.height;
 |  | 
 | 
											
												
													
														|  | -            var size = width * height;
 |  | 
 | 
											
												
													
														|  | -            var rgbaLength = size * 4;
 |  | 
 | 
											
												
													
														|  | -            var buf = new Uint8Array(size * components);
 |  | 
 | 
											
												
													
														|  | -            var tmpCanvas = createScratchCanvas(width, height);
 |  | 
 | 
											
												
													
														|  | -            var tmpCtx = tmpCanvas.getContext('2d');
 |  | 
 | 
											
												
													
														|  | -            tmpCtx.drawImage(img, 0, 0);
 |  | 
 | 
											
												
													
														|  | -            var data = tmpCtx.getImageData(0, 0, width, height).data;
 |  | 
 | 
											
												
													
														|  | -            var i, j;
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Disables fullscreen support, and by extension Presentation Mode,
 | 
											
												
													
														|  | 
 |  | + * in browsers which support the fullscreen API.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ?
 | 
											
												
													
														|  | 
 |  | +                           false : PDFJS.disableFullscreen);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -            if (components === 3) {
 |  | 
 | 
											
												
													
														|  | -              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
 |  | 
 | 
											
												
													
														|  | -                buf[j] = data[i];
 |  | 
 | 
											
												
													
														|  | -                buf[j + 1] = data[i + 1];
 |  | 
 | 
											
												
													
														|  | -                buf[j + 2] = data[i + 2];
 |  | 
 | 
											
												
													
														|  | -              }
 |  | 
 | 
											
												
													
														|  | -            } else if (components === 1) {
 |  | 
 | 
											
												
													
														|  | -              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
 |  | 
 | 
											
												
													
														|  | -                buf[j] = data[i];
 |  | 
 | 
											
												
													
														|  | -              }
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            resolve({ data: buf, width: width, height: height});
 |  | 
 | 
											
												
													
														|  | -          };
 |  | 
 | 
											
												
													
														|  | -          img.onerror = function () {
 |  | 
 | 
											
												
													
														|  | -            reject(new Error('JpegDecode failed to load image'));
 |  | 
 | 
											
												
													
														|  | -          };
 |  | 
 | 
											
												
													
														|  | -          img.src = imageUrl;
 |  | 
 | 
											
												
													
														|  | -        });
 |  | 
 | 
											
												
													
														|  | -      }, this);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Enables CSS only zooming.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?
 | 
											
												
													
														|  | 
 |  | +                        false : PDFJS.useOnlyCssZoom);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getData: function WorkerTransport_getData() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetData', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Controls the logging level.
 | 
											
												
													
														|  | 
 |  | + * The constants from PDFJS.VERBOSITY_LEVELS should be used:
 | 
											
												
													
														|  | 
 |  | + * - errors
 | 
											
												
													
														|  | 
 |  | + * - warnings [default]
 | 
											
												
													
														|  | 
 |  | + * - infos
 | 
											
												
													
														|  | 
 |  | + * @var {number}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.verbosity = (PDFJS.verbosity === undefined ?
 | 
											
												
													
														|  | 
 |  | +                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getPage: function WorkerTransport_getPage(pageNumber, capability) {
 |  | 
 | 
											
												
													
														|  | -      if (pageNumber <= 0 || pageNumber > this.numPages ||
 |  | 
 | 
											
												
													
														|  | -          (pageNumber|0) !== pageNumber) {
 |  | 
 | 
											
												
													
														|  | -        return Promise.reject(new Error('Invalid page request'));
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * The maximum supported canvas size in total pixels e.g. width * height.
 | 
											
												
													
														|  | 
 |  | + * The default value is 4096 * 4096. Use -1 for no limit.
 | 
											
												
													
														|  | 
 |  | + * @var {number}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
 | 
											
												
													
														|  | 
 |  | +                         16777216 : PDFJS.maxCanvasPixels);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var pageIndex = pageNumber - 1;
 |  | 
 | 
											
												
													
														|  | -      if (pageIndex in this.pagePromises) {
 |  | 
 | 
											
												
													
														|  | -        return this.pagePromises[pageIndex];
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      var promise = this.messageHandler.sendWithPromise('GetPage', {
 |  | 
 | 
											
												
													
														|  | -        pageIndex: pageIndex
 |  | 
 | 
											
												
													
														|  | -      }).then(function (pageInfo) {
 |  | 
 | 
											
												
													
														|  | -        if (this.destroyed) {
 |  | 
 | 
											
												
													
														|  | -          throw new Error('Transport destroyed');
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        var page = new PDFPageProxy(pageIndex, pageInfo, this);
 |  | 
 | 
											
												
													
														|  | -        this.pageCache[pageIndex] = page;
 |  | 
 | 
											
												
													
														|  | -        return page;
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | -      this.pagePromises[pageIndex] = promise;
 |  | 
 | 
											
												
													
														|  | -      return promise;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * (Deprecated) Opens external links in a new window if enabled.
 | 
											
												
													
														|  | 
 |  | + * The default behavior opens external links in the PDF.js window.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * NOTE: This property has been deprecated, please use
 | 
											
												
													
														|  | 
 |  | + *       `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead.
 | 
											
												
													
														|  | 
 |  | + * @var {boolean}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.openExternalLinksInNewWindow = (
 | 
											
												
													
														|  | 
 |  | +  PDFJS.openExternalLinksInNewWindow === undefined ?
 | 
											
												
													
														|  | 
 |  | +    false : PDFJS.openExternalLinksInNewWindow);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Specifies the |target| attribute for external links.
 | 
											
												
													
														|  | 
 |  | + * The constants from PDFJS.LinkTarget should be used:
 | 
											
												
													
														|  | 
 |  | + *  - NONE [default]
 | 
											
												
													
														|  | 
 |  | + *  - SELF
 | 
											
												
													
														|  | 
 |  | + *  - BLANK
 | 
											
												
													
														|  | 
 |  | + *  - PARENT
 | 
											
												
													
														|  | 
 |  | + *  - TOP
 | 
											
												
													
														|  | 
 |  | + * @var {number}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ?
 | 
											
												
													
														|  | 
 |  | +                            PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetAnnotations', {
 |  | 
 | 
											
												
													
														|  | -        pageIndex: pageIndex,
 |  | 
 | 
											
												
													
														|  | -        intent: intent,
 |  | 
 | 
											
												
													
														|  | -      });
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Specifies the |rel| attribute for external links. Defaults to stripping
 | 
											
												
													
														|  | 
 |  | + * the referrer.
 | 
											
												
													
														|  | 
 |  | + * @var {string}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ?
 | 
											
												
													
														|  | 
 |  | +                         'noreferrer' : PDFJS.externalLinkRel);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getDestinations: function WorkerTransport_getDestinations() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetDestinations', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | +  * Determines if we can eval strings as JS. Primarily used to improve
 | 
											
												
													
														|  | 
 |  | +  * performance for font rendering.
 | 
											
												
													
														|  | 
 |  | +  * @var {boolean}
 | 
											
												
													
														|  | 
 |  | +  */
 | 
											
												
													
														|  | 
 |  | +PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ?
 | 
											
												
													
														|  | 
 |  | +                         true : PDFJS.isEvalSupported);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getDestination: function WorkerTransport_getDestination(id) {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetDestination', { id: id });
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Document initialization / loading parameters object.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} DocumentInitParameters
 | 
											
												
													
														|  | 
 |  | + * @property {string}     url   - The URL of the PDF.
 | 
											
												
													
														|  | 
 |  | + * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays
 | 
											
												
													
														|  | 
 |  | + *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,
 | 
											
												
													
														|  | 
 |  | + *   use atob() to convert it to a binary string first.
 | 
											
												
													
														|  | 
 |  | + * @property {Object}     httpHeaders - Basic authentication headers.
 | 
											
												
													
														|  | 
 |  | + * @property {boolean}    withCredentials - Indicates whether or not cross-site
 | 
											
												
													
														|  | 
 |  | + *   Access-Control requests should be made using credentials such as cookies
 | 
											
												
													
														|  | 
 |  | + *   or authorization headers. The default is false.
 | 
											
												
													
														|  | 
 |  | + * @property {string}     password - For decrypting password-protected PDFs.
 | 
											
												
													
														|  | 
 |  | + * @property {TypedArray} initialData - A typed array with the first portion or
 | 
											
												
													
														|  | 
 |  | + *   all of the pdf data. Used by the extension since some data is already
 | 
											
												
													
														|  | 
 |  | + *   loaded before the switch to range requests.
 | 
											
												
													
														|  | 
 |  | + * @property {number}     length - The PDF file length. It's used for progress
 | 
											
												
													
														|  | 
 |  | + *   reports and range requests operations.
 | 
											
												
													
														|  | 
 |  | + * @property {PDFDataRangeTransport} range
 | 
											
												
													
														|  | 
 |  | + * @property {number}     rangeChunkSize - Optional parameter to specify
 | 
											
												
													
														|  | 
 |  | + *   maximum number of bytes fetched per range request. The default value is
 | 
											
												
													
														|  | 
 |  | + *   2^16 = 65536.
 | 
											
												
													
														|  | 
 |  | + * @property {PDFWorker}  worker - The worker that will be used for the loading
 | 
											
												
													
														|  | 
 |  | + *   and parsing of the PDF data.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getAttachments: function WorkerTransport_getAttachments() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetAttachments', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} PDFDocumentStats
 | 
											
												
													
														|  | 
 |  | + * @property {Array} streamTypes - Used stream types in the document (an item
 | 
											
												
													
														|  | 
 |  | + *   is set to true if specific stream ID was used in the document).
 | 
											
												
													
														|  | 
 |  | + * @property {Array} fontTypes - Used font type in the document (an item is set
 | 
											
												
													
														|  | 
 |  | + *   to true if specific font ID was used in the document).
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getJavaScript: function WorkerTransport_getJavaScript() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetJavaScript', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * This is the main entry point for loading a PDF and interacting with it.
 | 
											
												
													
														|  | 
 |  | + * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
 | 
											
												
													
														|  | 
 |  | + * is used, which means it must follow the same origin rules that any XHR does
 | 
											
												
													
														|  | 
 |  | + * e.g. No cross domain requests without CORS.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src
 | 
											
												
													
														|  | 
 |  | + * Can be a url to where a PDF is located, a typed array (Uint8Array)
 | 
											
												
													
														|  | 
 |  | + * already populated with data or parameter object.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used
 | 
											
												
													
														|  | 
 |  | + * if you want to manually serve range requests for data in the PDF.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @param {function} passwordCallback (deprecated) It is used to request a
 | 
											
												
													
														|  | 
 |  | + * password if wrong or no password was provided. The callback receives two
 | 
											
												
													
														|  | 
 |  | + * parameters: function that needs to be called with new password and reason
 | 
											
												
													
														|  | 
 |  | + * (see {PasswordResponses}).
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @param {function} progressCallback (deprecated) It is used to be able to
 | 
											
												
													
														|  | 
 |  | + * monitor the loading progress of the PDF file (necessary to implement e.g.
 | 
											
												
													
														|  | 
 |  | + * a loading bar). The callback receives an {Object} with the properties:
 | 
											
												
													
														|  | 
 |  | + * {number} loaded and {number} total.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @return {PDFDocumentLoadingTask}
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.getDocument = function getDocument(src,
 | 
											
												
													
														|  | 
 |  | +                                         pdfDataRangeTransport,
 | 
											
												
													
														|  | 
 |  | +                                         passwordCallback,
 | 
											
												
													
														|  | 
 |  | +                                         progressCallback) {
 | 
											
												
													
														|  | 
 |  | +  var task = new PDFDocumentLoadingTask();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  // Support of the obsolete arguments (for compatibility with API v1.0)
 | 
											
												
													
														|  | 
 |  | +  if (arguments.length > 1) {
 | 
											
												
													
														|  | 
 |  | +    deprecated('getDocument is called with pdfDataRangeTransport, ' +
 | 
											
												
													
														|  | 
 |  | +               'passwordCallback or progressCallback argument');
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  if (pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {
 | 
											
												
													
														|  | 
 |  | +      // Not a PDFDataRangeTransport instance, trying to add missing properties.
 | 
											
												
													
														|  | 
 |  | +      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);
 | 
											
												
													
														|  | 
 |  | +      pdfDataRangeTransport.length = src.length;
 | 
											
												
													
														|  | 
 |  | +      pdfDataRangeTransport.initialData = src.initialData;
 | 
											
												
													
														|  | 
 |  | +      if (!pdfDataRangeTransport.abort) {
 | 
											
												
													
														|  | 
 |  | +        pdfDataRangeTransport.abort = function () {};
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    src = Object.create(src);
 | 
											
												
													
														|  | 
 |  | +    src.range = pdfDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  task.onPassword = passwordCallback || null;
 | 
											
												
													
														|  | 
 |  | +  task.onProgress = progressCallback || null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getOutline: function WorkerTransport_getOutline() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetOutline', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var source;
 | 
											
												
													
														|  | 
 |  | +  if (typeof src === 'string') {
 | 
											
												
													
														|  | 
 |  | +    source = { url: src };
 | 
											
												
													
														|  | 
 |  | +  } else if (isArrayBuffer(src)) {
 | 
											
												
													
														|  | 
 |  | +    source = { data: src };
 | 
											
												
													
														|  | 
 |  | +  } else if (src instanceof PDFDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +    source = { range: src };
 | 
											
												
													
														|  | 
 |  | +  } else {
 | 
											
												
													
														|  | 
 |  | +    if (typeof src !== 'object') {
 | 
											
												
													
														|  | 
 |  | +      error('Invalid parameter in getDocument, need either Uint8Array, ' +
 | 
											
												
													
														|  | 
 |  | +        'string or a parameter object');
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    if (!src.url && !src.data && !src.range) {
 | 
											
												
													
														|  | 
 |  | +      error('Invalid parameter object: need either .data, .range or .url');
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getMetadata: function WorkerTransport_getMetadata() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetMetadata', null).
 |  | 
 | 
											
												
													
														|  | -        then(function transportMetadata(results) {
 |  | 
 | 
											
												
													
														|  | -        return {
 |  | 
 | 
											
												
													
														|  | -          info: results[0],
 |  | 
 | 
											
												
													
														|  | -          metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null)
 |  | 
 | 
											
												
													
														|  | -        };
 |  | 
 | 
											
												
													
														|  | -      });
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    source = src;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getStats: function WorkerTransport_getStats() {
 |  | 
 | 
											
												
													
														|  | -      return this.messageHandler.sendWithPromise('GetStats', null);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  var params = {};
 | 
											
												
													
														|  | 
 |  | +  var rangeTransport = null;
 | 
											
												
													
														|  | 
 |  | +  var worker = null;
 | 
											
												
													
														|  | 
 |  | +  for (var key in source) {
 | 
											
												
													
														|  | 
 |  | +    if (key === 'url' && typeof window !== 'undefined') {
 | 
											
												
													
														|  | 
 |  | +      // The full path is required in the 'url' field.
 | 
											
												
													
														|  | 
 |  | +      params[key] = combineUrl(window.location.href, source[key]);
 | 
											
												
													
														|  | 
 |  | +      continue;
 | 
											
												
													
														|  | 
 |  | +    } else if (key === 'range') {
 | 
											
												
													
														|  | 
 |  | +      rangeTransport = source[key];
 | 
											
												
													
														|  | 
 |  | +      continue;
 | 
											
												
													
														|  | 
 |  | +    } else if (key === 'worker') {
 | 
											
												
													
														|  | 
 |  | +      worker = source[key];
 | 
											
												
													
														|  | 
 |  | +      continue;
 | 
											
												
													
														|  | 
 |  | +    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
 | 
											
												
													
														|  | 
 |  | +      // Converting string or array-like data to Uint8Array.
 | 
											
												
													
														|  | 
 |  | +      var pdfBytes = source[key];
 | 
											
												
													
														|  | 
 |  | +      if (typeof pdfBytes === 'string') {
 | 
											
												
													
														|  | 
 |  | +        params[key] = stringToBytes(pdfBytes);
 | 
											
												
													
														|  | 
 |  | +      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&
 | 
											
												
													
														|  | 
 |  | +                 !isNaN(pdfBytes.length)) {
 | 
											
												
													
														|  | 
 |  | +        params[key] = new Uint8Array(pdfBytes);
 | 
											
												
													
														|  | 
 |  | +      } else if (isArrayBuffer(pdfBytes)) {
 | 
											
												
													
														|  | 
 |  | +        params[key] = new Uint8Array(pdfBytes);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        error('Invalid PDF binary data: either typed array, string or ' +
 | 
											
												
													
														|  | 
 |  | +              'array-like object is expected in the data property.');
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      continue;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    params[key] = source[key];
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    startCleanup: function WorkerTransport_startCleanup() {
 |  | 
 | 
											
												
													
														|  | -      this.messageHandler.sendWithPromise('Cleanup', null).
 |  | 
 | 
											
												
													
														|  | -        then(function endCleanup() {
 |  | 
 | 
											
												
													
														|  | -        for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -          var page = this.pageCache[i];
 |  | 
 | 
											
												
													
														|  | -          if (page) {
 |  | 
 | 
											
												
													
														|  | -            page.cleanup();
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        this.commonObjs.clear();
 |  | 
 | 
											
												
													
														|  | -        this.fontLoader.clear();
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | 
 |  | +  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  if (!worker) {
 | 
											
												
													
														|  | 
 |  | +    // Worker was not provided -- creating and owning our own.
 | 
											
												
													
														|  | 
 |  | +    worker = new PDFWorker();
 | 
											
												
													
														|  | 
 |  | +    task._worker = worker;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  var docId = task.docId;
 | 
											
												
													
														|  | 
 |  | +  worker.promise.then(function () {
 | 
											
												
													
														|  | 
 |  | +    if (task.destroyed) {
 | 
											
												
													
														|  | 
 |  | +      throw new Error('Loading aborted');
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return WorkerTransport;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return _fetchDocument(worker, params, rangeTransport, docId).then(
 | 
											
												
													
														|  | 
 |  | +        function (workerId) {
 | 
											
												
													
														|  | 
 |  | +      if (task.destroyed) {
 | 
											
												
													
														|  | 
 |  | +        throw new Error('Loading aborted');
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      var messageHandler = new MessageHandler(docId, workerId, worker.port);
 | 
											
												
													
														|  | 
 |  | +      messageHandler.send('Ready', null);
 | 
											
												
													
														|  | 
 |  | +      var transport = new WorkerTransport(messageHandler, task, rangeTransport);
 | 
											
												
													
														|  | 
 |  | +      task._transport = transport;
 | 
											
												
													
														|  | 
 |  | +    });
 | 
											
												
													
														|  | 
 |  | +  }).catch(task._capability.reject);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return task;
 | 
											
												
													
														|  | 
 |  | +};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  | - * A PDF document and page is built of many objects. E.g. there are objects
 |  | 
 | 
											
												
													
														|  | - * for fonts, images, rendering code and such. These objects might get processed
 |  | 
 | 
											
												
													
														|  | - * inside of a worker. The `PDFObjects` implements some basic functions to
 |  | 
 | 
											
												
													
														|  | - * manage these objects.
 |  | 
 | 
											
												
													
														|  | - * @ignore
 |  | 
 | 
											
												
													
														|  | 
 |  | + * Starts fetching of specified PDF document/data.
 | 
											
												
													
														|  | 
 |  | + * @param {PDFWorker} worker
 | 
											
												
													
														|  | 
 |  | + * @param {Object} source
 | 
											
												
													
														|  | 
 |  | + * @param {PDFDataRangeTransport} pdfDataRangeTransport
 | 
											
												
													
														|  | 
 |  | + * @param {string} docId Unique document id, used as MessageHandler id.
 | 
											
												
													
														|  | 
 |  | + * @returns {Promise} The promise, which is resolved when worker id of
 | 
											
												
													
														|  | 
 |  | + *                    MessageHandler is known.
 | 
											
												
													
														|  | 
 |  | + * @private
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
												
													
														|  | -var PDFObjects = (function PDFObjectsClosure() {
 |  | 
 | 
											
												
													
														|  | -  function PDFObjects() {
 |  | 
 | 
											
												
													
														|  | -    this.objs = {};
 |  | 
 | 
											
												
													
														|  | 
 |  | +function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
 | 
											
												
													
														|  | 
 |  | +  if (worker.destroyed) {
 | 
											
												
													
														|  | 
 |  | +    return Promise.reject(new Error('Worker was destroyed'));
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  PDFObjects.prototype = {
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * Internal function.
 |  | 
 | 
											
												
													
														|  | -     * Ensures there is an object defined for `objId`.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    ensureObj: function PDFObjects_ensureObj(objId) {
 |  | 
 | 
											
												
													
														|  | -      if (this.objs[objId]) {
 |  | 
 | 
											
												
													
														|  | -        return this.objs[objId];
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  source.disableAutoFetch = PDFJS.disableAutoFetch;
 | 
											
												
													
														|  | 
 |  | +  source.disableStream = PDFJS.disableStream;
 | 
											
												
													
														|  | 
 |  | +  source.chunkedViewerLoading = !!pdfDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +  if (pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +    source.length = pdfDataRangeTransport.length;
 | 
											
												
													
														|  | 
 |  | +    source.initialData = pdfDataRangeTransport.initialData;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  return worker.messageHandler.sendWithPromise('GetDocRequest', {
 | 
											
												
													
														|  | 
 |  | +    docId: docId,
 | 
											
												
													
														|  | 
 |  | +    source: source,
 | 
											
												
													
														|  | 
 |  | +    disableRange: PDFJS.disableRange,
 | 
											
												
													
														|  | 
 |  | +    maxImageSize: PDFJS.maxImageSize,
 | 
											
												
													
														|  | 
 |  | +    cMapUrl: PDFJS.cMapUrl,
 | 
											
												
													
														|  | 
 |  | +    cMapPacked: PDFJS.cMapPacked,
 | 
											
												
													
														|  | 
 |  | +    disableFontFace: PDFJS.disableFontFace,
 | 
											
												
													
														|  | 
 |  | +    disableCreateObjectURL: PDFJS.disableCreateObjectURL,
 | 
											
												
													
														|  | 
 |  | +    verbosity: PDFJS.verbosity
 | 
											
												
													
														|  | 
 |  | +  }).then(function (workerId) {
 | 
											
												
													
														|  | 
 |  | +    if (worker.destroyed) {
 | 
											
												
													
														|  | 
 |  | +      throw new Error('Worker was destroyed');
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return workerId;
 | 
											
												
													
														|  | 
 |  | +  });
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var obj = {
 |  | 
 | 
											
												
													
														|  | -        capability: createPromiseCapability(),
 |  | 
 | 
											
												
													
														|  | -        data: null,
 |  | 
 | 
											
												
													
														|  | -        resolved: false
 |  | 
 | 
											
												
													
														|  | -      };
 |  | 
 | 
											
												
													
														|  | -      this.objs[objId] = obj;
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * PDF document loading operation.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + * @alias PDFDocumentLoadingTask
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
 | 
											
												
													
														|  | 
 |  | +  var nextDocumentId = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      return obj;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  /** @constructs PDFDocumentLoadingTask */
 | 
											
												
													
														|  | 
 |  | +  function PDFDocumentLoadingTask() {
 | 
											
												
													
														|  | 
 |  | +    this._capability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +    this._transport = null;
 | 
											
												
													
														|  | 
 |  | +    this._worker = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * If called *without* callback, this returns the data of `objId` but the
 |  | 
 | 
											
												
													
														|  | -     * object needs to be resolved. If it isn't, this function throws.
 |  | 
 | 
											
												
													
														|  | -     *
 |  | 
 | 
											
												
													
														|  | -     * If called *with* a callback, the callback is called with the data of the
 |  | 
 | 
											
												
													
														|  | -     * object once the object is resolved. That means, if you call this
 |  | 
 | 
											
												
													
														|  | -     * function and the object is already resolved, the callback gets called
 |  | 
 | 
											
												
													
														|  | -     * right away.
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Unique document loading task id -- used in MessageHandlers.
 | 
											
												
													
														|  | 
 |  | +     * @type {string}
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  | -    get: function PDFObjects_get(objId, callback) {
 |  | 
 | 
											
												
													
														|  | -      // If there is a callback, then the get can be async and the object is
 |  | 
 | 
											
												
													
														|  | -      // not required to be resolved right now
 |  | 
 | 
											
												
													
														|  | -      if (callback) {
 |  | 
 | 
											
												
													
														|  | -        this.ensureObj(objId).capability.promise.then(callback);
 |  | 
 | 
											
												
													
														|  | -        return null;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // If there isn't a callback, the user expects to get the resolved data
 |  | 
 | 
											
												
													
														|  | -      // directly.
 |  | 
 | 
											
												
													
														|  | -      var obj = this.objs[objId];
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      // If there isn't an object yet or the object isn't resolved, then the
 |  | 
 | 
											
												
													
														|  | -      // data isn't ready yet!
 |  | 
 | 
											
												
													
														|  | -      if (!obj || !obj.resolved) {
 |  | 
 | 
											
												
													
														|  | -        error('Requesting object that isn\'t resolved yet ' + objId);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      return obj.data;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.docId = 'd' + (nextDocumentId++);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Resolves the object `objId` with optional `data`.
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Shows if loading task is destroyed.
 | 
											
												
													
														|  | 
 |  | +     * @type {boolean}
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  | -    resolve: function PDFObjects_resolve(objId, data) {
 |  | 
 | 
											
												
													
														|  | -      var obj = this.ensureObj(objId);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      obj.resolved = true;
 |  | 
 | 
											
												
													
														|  | -      obj.data = data;
 |  | 
 | 
											
												
													
														|  | -      obj.capability.resolve(data);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    isResolved: function PDFObjects_isResolved(objId) {
 |  | 
 | 
											
												
													
														|  | -      var objs = this.objs;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (!objs[objId]) {
 |  | 
 | 
											
												
													
														|  | -        return false;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        return objs[objId].resolved;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    hasData: function PDFObjects_hasData(objId) {
 |  | 
 | 
											
												
													
														|  | -      return this.isResolved(objId);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.destroyed = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Returns the data of `objId` if object exists, null otherwise.
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    getData: function PDFObjects_getData(objId) {
 |  | 
 | 
											
												
													
														|  | -      var objs = this.objs;
 |  | 
 | 
											
												
													
														|  | -      if (!objs[objId] || !objs[objId].resolved) {
 |  | 
 | 
											
												
													
														|  | -        return null;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        return objs[objId].data;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    clear: function PDFObjects_clear() {
 |  | 
 | 
											
												
													
														|  | -      this.objs = {};
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return PDFObjects;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -/**
 |  | 
 | 
											
												
													
														|  | - * Allows controlling of the rendering tasks.
 |  | 
 | 
											
												
													
														|  | - * @class
 |  | 
 | 
											
												
													
														|  | - * @alias RenderTask
 |  | 
 | 
											
												
													
														|  | - */
 |  | 
 | 
											
												
													
														|  | -var RenderTask = (function RenderTaskClosure() {
 |  | 
 | 
											
												
													
														|  | -  function RenderTask(internalRenderTask) {
 |  | 
 | 
											
												
													
														|  | -    this._internalRenderTask = internalRenderTask;
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Callback to request a password if wrong or no password was provided.
 | 
											
												
													
														|  | 
 |  | +     * The callback receives two parameters: function that needs to be called
 | 
											
												
													
														|  | 
 |  | +     * with new password and reason (see {PasswordResponses}).
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    this.onPassword = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Callback for incremental rendering -- a function that will be called
 |  | 
 | 
											
												
													
														|  | -     * each time the rendering is paused.  To continue rendering call the
 |  | 
 | 
											
												
													
														|  | -     * function that is the first argument to the callback.
 |  | 
 | 
											
												
													
														|  | -     * @type {function}
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Callback to be able to monitor the loading progress of the PDF file
 | 
											
												
													
														|  | 
 |  | +     * (necessary to implement e.g. a loading bar). The callback receives
 | 
											
												
													
														|  | 
 |  | +     * an {Object} with the properties: {number} loaded and {number} total.
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  | -    this.onContinue = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.onProgress = null;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Callback to when unsupported feature is used. The callback receives
 | 
											
												
													
														|  | 
 |  | +     * an {PDFJS.UNSUPPORTED_FEATURES} argument.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    this.onUnsupportedFeature = null;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  RenderTask.prototype = /** @lends RenderTask.prototype */ {
 |  | 
 | 
											
												
													
														|  | 
 |  | +  PDFDocumentLoadingTask.prototype =
 | 
											
												
													
														|  | 
 |  | +      /** @lends PDFDocumentLoadingTask.prototype */ {
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Promise for rendering task completion.
 |  | 
 | 
											
												
													
														|  |       * @return {Promise}
 |  |       * @return {Promise}
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      get promise() {
 |  |      get promise() {
 | 
											
												
													
														|  | -      return this._internalRenderTask.capability.promise;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return this._capability.promise;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Cancels the rendering task. If the task is currently rendering it will
 |  | 
 | 
											
												
													
														|  | -     * not be cancelled until graphics pauses with a timeout. The promise that
 |  | 
 | 
											
												
													
														|  | -     * this object extends will resolved when cancelled.
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Aborts all network requests and destroys worker.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved after destruction activity
 | 
											
												
													
														|  | 
 |  | +     *                   is completed.
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  | -    cancel: function RenderTask_cancel() {
 |  | 
 | 
											
												
													
														|  | -      this._internalRenderTask.cancel();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    destroy: function () {
 | 
											
												
													
														|  | 
 |  | +      this.destroyed = true;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var transportDestroyed = !this._transport ? Promise.resolve() :
 | 
											
												
													
														|  | 
 |  | +        this._transport.destroy();
 | 
											
												
													
														|  | 
 |  | +      return transportDestroyed.then(function () {
 | 
											
												
													
														|  | 
 |  | +        this._transport = null;
 | 
											
												
													
														|  | 
 |  | +        if (this._worker) {
 | 
											
												
													
														|  | 
 |  | +          this._worker.destroy();
 | 
											
												
													
														|  | 
 |  | +          this._worker = null;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * Registers callbacks to indicate the rendering task completion.
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * Registers callbacks to indicate the document loading completion.
 | 
											
												
													
														|  |       *
 |  |       *
 | 
											
												
													
														|  | -     * @param {function} onFulfilled The callback for the rendering completion.
 |  | 
 | 
											
												
													
														|  | -     * @param {function} onRejected The callback for the rendering failure.
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * @param {function} onFulfilled The callback for the loading completion.
 | 
											
												
													
														|  | 
 |  | +     * @param {function} onRejected The callback for the loading failure.
 | 
											
												
													
														|  |       * @return {Promise} A promise that is resolved after the onFulfilled or
 |  |       * @return {Promise} A promise that is resolved after the onFulfilled or
 | 
											
												
													
														|  |       *                   onRejected callback.
 |  |       *                   onRejected callback.
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  | -    then: function RenderTask_then(onFulfilled, onRejected) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
 | 
											
												
													
														|  |        return this.promise.then.apply(this.promise, arguments);
 |  |        return this.promise.then.apply(this.promise, arguments);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return RenderTask;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return PDFDocumentLoadingTask;
 | 
											
												
													
														|  |  })();
 |  |  })();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  | - * For internal use only.
 |  | 
 | 
											
												
													
														|  | - * @ignore
 |  | 
 | 
											
												
													
														|  | 
 |  | + * Abstract class to support range requests file loading.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + * @alias PDFJS.PDFDataRangeTransport
 | 
											
												
													
														|  | 
 |  | + * @param {number} length
 | 
											
												
													
														|  | 
 |  | + * @param {Uint8Array} initialData
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
												
													
														|  | -var InternalRenderTask = (function InternalRenderTaskClosure() {
 |  | 
 | 
											
												
													
														|  | 
 |  | +var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {
 | 
											
												
													
														|  | 
 |  | +  function PDFDataRangeTransport(length, initialData) {
 | 
											
												
													
														|  | 
 |  | +    this.length = length;
 | 
											
												
													
														|  | 
 |  | +    this.initialData = initialData;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
 |  | 
 | 
											
												
													
														|  | -                              pageNumber) {
 |  | 
 | 
											
												
													
														|  | -    this.callback = callback;
 |  | 
 | 
											
												
													
														|  | -    this.params = params;
 |  | 
 | 
											
												
													
														|  | -    this.objs = objs;
 |  | 
 | 
											
												
													
														|  | -    this.commonObjs = commonObjs;
 |  | 
 | 
											
												
													
														|  | -    this.operatorListIdx = null;
 |  | 
 | 
											
												
													
														|  | -    this.operatorList = operatorList;
 |  | 
 | 
											
												
													
														|  | -    this.pageNumber = pageNumber;
 |  | 
 | 
											
												
													
														|  | -    this.running = false;
 |  | 
 | 
											
												
													
														|  | -    this.graphicsReadyCallback = null;
 |  | 
 | 
											
												
													
														|  | -    this.graphicsReady = false;
 |  | 
 | 
											
												
													
														|  | -    this.useRequestAnimationFrame = false;
 |  | 
 | 
											
												
													
														|  | -    this.cancelled = false;
 |  | 
 | 
											
												
													
														|  | -    this.capability = createPromiseCapability();
 |  | 
 | 
											
												
													
														|  | -    this.task = new RenderTask(this);
 |  | 
 | 
											
												
													
														|  | -    // caching this-bound methods
 |  | 
 | 
											
												
													
														|  | -    this._continueBound = this._continue.bind(this);
 |  | 
 | 
											
												
													
														|  | -    this._scheduleNextBound = this._scheduleNext.bind(this);
 |  | 
 | 
											
												
													
														|  | -    this._nextBound = this._next.bind(this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this._rangeListeners = [];
 | 
											
												
													
														|  | 
 |  | +    this._progressListeners = [];
 | 
											
												
													
														|  | 
 |  | +    this._progressiveReadListeners = [];
 | 
											
												
													
														|  | 
 |  | +    this._readyCapability = createPromiseCapability();
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  | 
 |  | +  PDFDataRangeTransport.prototype =
 | 
											
												
													
														|  | 
 |  | +      /** @lends PDFDataRangeTransport.prototype */ {
 | 
											
												
													
														|  | 
 |  | +    addRangeListener:
 | 
											
												
													
														|  | 
 |  | +        function PDFDataRangeTransport_addRangeListener(listener) {
 | 
											
												
													
														|  | 
 |  | +      this._rangeListeners.push(listener);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  InternalRenderTask.prototype = {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    addProgressListener:
 | 
											
												
													
														|  | 
 |  | +        function PDFDataRangeTransport_addProgressListener(listener) {
 | 
											
												
													
														|  | 
 |  | +      this._progressListeners.push(listener);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    initalizeGraphics:
 |  | 
 | 
											
												
													
														|  | -        function InternalRenderTask_initalizeGraphics(transparency) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    addProgressiveReadListener:
 | 
											
												
													
														|  | 
 |  | +        function PDFDataRangeTransport_addProgressiveReadListener(listener) {
 | 
											
												
													
														|  | 
 |  | +      this._progressiveReadListeners.push(listener);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.cancelled) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
 |  | 
 | 
											
												
													
														|  | -          globalScope.StepperManager.enabled) {
 |  | 
 | 
											
												
													
														|  | -        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
 |  | 
 | 
											
												
													
														|  | -        this.stepper.init(this.operatorList);
 |  | 
 | 
											
												
													
														|  | -        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
 | 
											
												
													
														|  | 
 |  | +      var listeners = this._rangeListeners;
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, n = listeners.length; i < n; ++i) {
 | 
											
												
													
														|  | 
 |  | +        listeners[i](begin, chunk);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var params = this.params;
 |  | 
 | 
											
												
													
														|  | -      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
 |  | 
 | 
											
												
													
														|  | -                                    this.objs, params.imageLayer);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
 | 
											
												
													
														|  | 
 |  | +      this._readyCapability.promise.then(function () {
 | 
											
												
													
														|  | 
 |  | +        var listeners = this._progressListeners;
 | 
											
												
													
														|  | 
 |  | +        for (var i = 0, n = listeners.length; i < n; ++i) {
 | 
											
												
													
														|  | 
 |  | +          listeners[i](loaded);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.gfx.beginDrawing(params.transform, params.viewport, transparency);
 |  | 
 | 
											
												
													
														|  | -      this.operatorListIdx = 0;
 |  | 
 | 
											
												
													
														|  | -      this.graphicsReady = true;
 |  | 
 | 
											
												
													
														|  | -      if (this.graphicsReadyCallback) {
 |  | 
 | 
											
												
													
														|  | -        this.graphicsReadyCallback();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    onDataProgressiveRead:
 | 
											
												
													
														|  | 
 |  | +        function PDFDataRangeTransport_onDataProgress(chunk) {
 | 
											
												
													
														|  | 
 |  | +      this._readyCapability.promise.then(function () {
 | 
											
												
													
														|  | 
 |  | +        var listeners = this._progressiveReadListeners;
 | 
											
												
													
														|  | 
 |  | +        for (var i = 0, n = listeners.length; i < n; ++i) {
 | 
											
												
													
														|  | 
 |  | +          listeners[i](chunk);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    transportReady: function PDFDataRangeTransport_transportReady() {
 | 
											
												
													
														|  | 
 |  | +      this._readyCapability.resolve();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    requestDataRange:
 | 
											
												
													
														|  | 
 |  | +        function PDFDataRangeTransport_requestDataRange(begin, end) {
 | 
											
												
													
														|  | 
 |  | +      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    abort: function PDFDataRangeTransport_abort() {
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return PDFDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +PDFJS.PDFDataRangeTransport = PDFDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
 | 
											
												
													
														|  | 
 |  | + * properties that can be read synchronously.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + * @alias PDFDocumentProxy
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
 | 
											
												
													
														|  | 
 |  | +  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
 | 
											
												
													
														|  | 
 |  | +    this.pdfInfo = pdfInfo;
 | 
											
												
													
														|  | 
 |  | +    this.transport = transport;
 | 
											
												
													
														|  | 
 |  | +    this.loadingTask = loadingTask;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {number} Total number of pages the PDF contains.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get numPages() {
 | 
											
												
													
														|  | 
 |  | +      return this.pdfInfo.numPages;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
 | 
											
												
													
														|  | 
 |  | +     * unique.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get fingerprint() {
 | 
											
												
													
														|  | 
 |  | +      return this.pdfInfo.fingerprint;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {number} pageNumber The page number to get. The first page is 1.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
 | 
											
												
													
														|  | 
 |  | +     * object.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getPage: function PDFDocumentProxy_getPage(pageNumber) {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getPage(pageNumber);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {{num: number, gen: number}} ref The page reference. Must have
 | 
											
												
													
														|  | 
 |  | +     *   the 'num' and 'gen' properties.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with the page index that is
 | 
											
												
													
														|  | 
 |  | +     * associated with the reference.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getPageIndex(ref);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with a lookup table for
 | 
											
												
													
														|  | 
 |  | +     * mapping named destinations to reference numbers.
 | 
											
												
													
														|  | 
 |  | +     *
 | 
											
												
													
														|  | 
 |  | +     * This can be slow for large documents: use getDestination instead
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getDestinations: function PDFDocumentProxy_getDestinations() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getDestinations();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {string} id The named destination to get.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with all information
 | 
											
												
													
														|  | 
 |  | +     * of the given named destination.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getDestination: function PDFDocumentProxy_getDestination(id) {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getDestination(id);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with a lookup table for
 | 
											
												
													
														|  | 
 |  | +     * mapping named attachments to their content.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getAttachments: function PDFDocumentProxy_getAttachments() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getAttachments();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with an array of all the
 | 
											
												
													
														|  | 
 |  | +     * JavaScript strings in the name tree.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getJavaScript: function PDFDocumentProxy_getJavaScript() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getJavaScript();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with an {Array} that is a
 | 
											
												
													
														|  | 
 |  | +     * tree outline (if it has one) of the PDF. The tree is in the format of:
 | 
											
												
													
														|  | 
 |  | +     * [
 | 
											
												
													
														|  | 
 |  | +     *  {
 | 
											
												
													
														|  | 
 |  | +     *   title: string,
 | 
											
												
													
														|  | 
 |  | +     *   bold: boolean,
 | 
											
												
													
														|  | 
 |  | +     *   italic: boolean,
 | 
											
												
													
														|  | 
 |  | +     *   color: rgb array,
 | 
											
												
													
														|  | 
 |  | +     *   dest: dest obj,
 | 
											
												
													
														|  | 
 |  | +     *   items: array of more items like this
 | 
											
												
													
														|  | 
 |  | +     *  },
 | 
											
												
													
														|  | 
 |  | +     *  ...
 | 
											
												
													
														|  | 
 |  | +     * ].
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getOutline: function PDFDocumentProxy_getOutline() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getOutline();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    cancel: function InternalRenderTask_cancel() {
 |  | 
 | 
											
												
													
														|  | -      this.running = false;
 |  | 
 | 
											
												
													
														|  | -      this.cancelled = true;
 |  | 
 | 
											
												
													
														|  | -      this.callback('cancelled');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with an {Object} that has
 | 
											
												
													
														|  | 
 |  | +     * info and metadata properties.  Info is an {Object} filled with anything
 | 
											
												
													
														|  | 
 |  | +     * available in the information dictionary and similarly metadata is a
 | 
											
												
													
														|  | 
 |  | +     * {Metadata} object with information from the metadata section of the PDF.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getMetadata: function PDFDocumentProxy_getMetadata() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getMetadata();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    operatorListChanged: function InternalRenderTask_operatorListChanged() {
 |  | 
 | 
											
												
													
														|  | -      if (!this.graphicsReady) {
 |  | 
 | 
											
												
													
														|  | -        if (!this.graphicsReadyCallback) {
 |  | 
 | 
											
												
													
														|  | -          this.graphicsReadyCallback = this._continueBound;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (this.stepper) {
 |  | 
 | 
											
												
													
														|  | -        this.stepper.updateOperatorList(this.operatorList);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (this.running) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this._continue();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with a TypedArray that has
 | 
											
												
													
														|  | 
 |  | +     * the raw data from the PDF.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getData: function PDFDocumentProxy_getData() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getData();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    _continue: function InternalRenderTask__continue() {
 |  | 
 | 
											
												
													
														|  | -      this.running = true;
 |  | 
 | 
											
												
													
														|  | -      if (this.cancelled) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (this.task.onContinue) {
 |  | 
 | 
											
												
													
														|  | -        this.task.onContinue.call(this.task, this._scheduleNextBound);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this._scheduleNext();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved when the document's data
 | 
											
												
													
														|  | 
 |  | +     * is loaded. It is resolved with an {Object} that contains the length
 | 
											
												
													
														|  | 
 |  | +     * property that indicates size of the PDF data in bytes.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.downloadInfoCapability.promise;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    _scheduleNext: function InternalRenderTask__scheduleNext() {
 |  | 
 | 
											
												
													
														|  | -      if (this.useRequestAnimationFrame) {
 |  | 
 | 
											
												
													
														|  | -        window.requestAnimationFrame(this._nextBound);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        Promise.resolve(undefined).then(this._nextBound);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise this is resolved with current stats about
 | 
											
												
													
														|  | 
 |  | +     * document structures (see {@link PDFDocumentStats}).
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getStats: function PDFDocumentProxy_getStats() {
 | 
											
												
													
														|  | 
 |  | +      return this.transport.getStats();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    _next: function InternalRenderTask__next() {
 |  | 
 | 
											
												
													
														|  | -      if (this.cancelled) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
 |  | 
 | 
											
												
													
														|  | -                                        this.operatorListIdx,
 |  | 
 | 
											
												
													
														|  | -                                        this._continueBound,
 |  | 
 | 
											
												
													
														|  | -                                        this.stepper);
 |  | 
 | 
											
												
													
														|  | -      if (this.operatorListIdx === this.operatorList.argsArray.length) {
 |  | 
 | 
											
												
													
														|  | -        this.running = false;
 |  | 
 | 
											
												
													
														|  | -        if (this.operatorList.lastChunk) {
 |  | 
 | 
											
												
													
														|  | -          this.gfx.endDrawing();
 |  | 
 | 
											
												
													
														|  | -          this.callback();
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Cleans up resources allocated by the document, e.g. created @font-face.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    cleanup: function PDFDocumentProxy_cleanup() {
 | 
											
												
													
														|  | 
 |  | +      this.transport.startCleanup();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Destroys current document instance and terminates worker.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    destroy: function PDFDocumentProxy_destroy() {
 | 
											
												
													
														|  | 
 |  | +      return this.loadingTask.destroy();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  return InternalRenderTask;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return PDFDocumentProxy;
 | 
											
												
													
														|  |  })();
 |  |  })();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  | - * (Deprecated) Global observer of unsupported feature usages. Use
 |  | 
 | 
											
												
													
														|  | - * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance.
 |  | 
 | 
											
												
													
														|  | 
 |  | + * Page getTextContent parameters.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} getTextContentParameters
 | 
											
												
													
														|  | 
 |  | + * @param {boolean} normalizeWhitespace - replaces all occurrences of
 | 
											
												
													
														|  | 
 |  | + *   whitespace with standard spaces (0x20). The default value is `false`.
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
												
													
														|  | -PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() {
 |  | 
 | 
											
												
													
														|  | -  var listeners = [];
 |  | 
 | 
											
												
													
														|  | -  return {
 |  | 
 | 
											
												
													
														|  | -    listen: function (cb) {
 |  | 
 | 
											
												
													
														|  | -      deprecated('Global UnsupportedManager.listen is used: ' +
 |  | 
 | 
											
												
													
														|  | -                 ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');
 |  | 
 | 
											
												
													
														|  | -      listeners.push(cb);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | -    notify: function (featureId) {
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = listeners.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        listeners[i](featureId);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -exports.getDocument = PDFJS.getDocument;
 |  | 
 | 
											
												
													
														|  | -exports.PDFDataRangeTransport = PDFDataRangeTransport;
 |  | 
 | 
											
												
													
														|  | -exports.PDFDocumentProxy = PDFDocumentProxy;
 |  | 
 | 
											
												
													
														|  | -exports.PDFPageProxy = PDFPageProxy;
 |  | 
 | 
											
												
													
														|  | -}));
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -(function (root, factory) {
 |  | 
 | 
											
												
													
														|  | -  {
 |  | 
 | 
											
												
													
														|  | -    factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -}(this, function (exports, sharedUtil) {
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -var ImageKind = sharedUtil.ImageKind;
 |  | 
 | 
											
												
													
														|  | -var OPS = sharedUtil.OPS;
 |  | 
 | 
											
												
													
														|  | -var Util = sharedUtil.Util;
 |  | 
 | 
											
												
													
														|  | -var isNum = sharedUtil.isNum;
 |  | 
 | 
											
												
													
														|  | -var isArray = sharedUtil.isArray;
 |  | 
 | 
											
												
													
														|  | -var warn = sharedUtil.warn;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var SVG_DEFAULTS = {
 |  | 
 | 
											
												
													
														|  | -  fontStyle: 'normal',
 |  | 
 | 
											
												
													
														|  | -  fontWeight: 'normal',
 |  | 
 | 
											
												
													
														|  | -  fillColor: '#000000'
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -var convertImgDataToPng = (function convertImgDataToPngClosure() {
 |  | 
 | 
											
												
													
														|  | -  var PNG_HEADER =
 |  | 
 | 
											
												
													
														|  | -    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var CHUNK_WRAPPER_SIZE = 12;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  var crcTable = new Int32Array(256);
 |  | 
 | 
											
												
													
														|  | -  for (var i = 0; i < 256; i++) {
 |  | 
 | 
											
												
													
														|  | -    var c = i;
 |  | 
 | 
											
												
													
														|  | -    for (var h = 0; h < 8; h++) {
 |  | 
 | 
											
												
													
														|  | -      if (c & 1) {
 |  | 
 | 
											
												
													
														|  | -        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        c = (c >> 1) & 0x7fffffff;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    crcTable[i] = c;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  function crc32(data, start, end) {
 |  | 
 | 
											
												
													
														|  | -    var crc = -1;
 |  | 
 | 
											
												
													
														|  | -    for (var i = start; i < end; i++) {
 |  | 
 | 
											
												
													
														|  | -      var a = (crc ^ data[i]) & 0xff;
 |  | 
 | 
											
												
													
														|  | -      var b = crcTable[a];
 |  | 
 | 
											
												
													
														|  | -      crc = (crc >>> 8) ^ b;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return crc ^ -1;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  function writePngChunk(type, body, data, offset) {
 |  | 
 | 
											
												
													
														|  | -    var p = offset;
 |  | 
 | 
											
												
													
														|  | -    var len = body.length;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    data[p] = len >> 24 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 1] = len >> 16 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 2] = len >> 8 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 3] = len & 0xff;
 |  | 
 | 
											
												
													
														|  | -    p += 4;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    data[p] = type.charCodeAt(0) & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 1] = type.charCodeAt(1) & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 2] = type.charCodeAt(2) & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 3] = type.charCodeAt(3) & 0xff;
 |  | 
 | 
											
												
													
														|  | -    p += 4;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    data.set(body, p);
 |  | 
 | 
											
												
													
														|  | -    p += body.length;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    var crc = crc32(data, offset + 4, p);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    data[p] = crc >> 24 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 1] = crc >> 16 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 2] = crc >> 8 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    data[p + 3] = crc & 0xff;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function adler32(data, start, end) {
 |  | 
 | 
											
												
													
														|  | -    var a = 1;
 |  | 
 | 
											
												
													
														|  | -    var b = 0;
 |  | 
 | 
											
												
													
														|  | -    for (var i = start; i < end; ++i) {
 |  | 
 | 
											
												
													
														|  | -      a = (a + (data[i] & 0xff)) % 65521;
 |  | 
 | 
											
												
													
														|  | -      b = (b + a) % 65521;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return (b << 16) | a;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Page text content.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} TextContent
 | 
											
												
													
														|  | 
 |  | + * @property {array} items - array of {@link TextItem}
 | 
											
												
													
														|  | 
 |  | + * @property {Object} styles - {@link TextStyles} objects, indexed by font
 | 
											
												
													
														|  | 
 |  | + *                    name.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function encode(imgData, kind) {
 |  | 
 | 
											
												
													
														|  | -    var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -    var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -    var bitDepth, colorType, lineSize;
 |  | 
 | 
											
												
													
														|  | -    var bytes = imgData.data;
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Page text content part.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} TextItem
 | 
											
												
													
														|  | 
 |  | + * @property {string} str - text content.
 | 
											
												
													
														|  | 
 |  | + * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
 | 
											
												
													
														|  | 
 |  | + * @property {array} transform - transformation matrix.
 | 
											
												
													
														|  | 
 |  | + * @property {number} width - width in device space.
 | 
											
												
													
														|  | 
 |  | + * @property {number} height - height in device space.
 | 
											
												
													
														|  | 
 |  | + * @property {string} fontName - font name used by pdf.js for converted font.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    switch (kind) {
 |  | 
 | 
											
												
													
														|  | -      case ImageKind.GRAYSCALE_1BPP:
 |  | 
 | 
											
												
													
														|  | -        colorType = 0;
 |  | 
 | 
											
												
													
														|  | -        bitDepth = 1;
 |  | 
 | 
											
												
													
														|  | -        lineSize = (width + 7) >> 3;
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      case ImageKind.RGB_24BPP:
 |  | 
 | 
											
												
													
														|  | -        colorType = 2;
 |  | 
 | 
											
												
													
														|  | -        bitDepth = 8;
 |  | 
 | 
											
												
													
														|  | -        lineSize = width * 3;
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      case ImageKind.RGBA_32BPP:
 |  | 
 | 
											
												
													
														|  | -        colorType = 6;
 |  | 
 | 
											
												
													
														|  | -        bitDepth = 8;
 |  | 
 | 
											
												
													
														|  | -        lineSize = width * 4;
 |  | 
 | 
											
												
													
														|  | -        break;
 |  | 
 | 
											
												
													
														|  | -      default:
 |  | 
 | 
											
												
													
														|  | -        throw new Error('invalid format');
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Text style.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} TextStyle
 | 
											
												
													
														|  | 
 |  | + * @property {number} ascent - font ascent.
 | 
											
												
													
														|  | 
 |  | + * @property {number} descent - font descent.
 | 
											
												
													
														|  | 
 |  | + * @property {boolean} vertical - text is in vertical mode.
 | 
											
												
													
														|  | 
 |  | + * @property {string} fontFamily - possible font family
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // prefix every row with predictor 0
 |  | 
 | 
											
												
													
														|  | -    var literals = new Uint8Array((1 + lineSize) * height);
 |  | 
 | 
											
												
													
														|  | -    var offsetLiterals = 0, offsetBytes = 0;
 |  | 
 | 
											
												
													
														|  | -    var y, i;
 |  | 
 | 
											
												
													
														|  | -    for (y = 0; y < height; ++y) {
 |  | 
 | 
											
												
													
														|  | -      literals[offsetLiterals++] = 0; // no prediction
 |  | 
 | 
											
												
													
														|  | -      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),
 |  | 
 | 
											
												
													
														|  | -                   offsetLiterals);
 |  | 
 | 
											
												
													
														|  | -      offsetBytes += lineSize;
 |  | 
 | 
											
												
													
														|  | -      offsetLiterals += lineSize;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Page annotation parameters.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} GetAnnotationsParameters
 | 
											
												
													
														|  | 
 |  | + * @param {string} intent - Determines the annotations that will be fetched,
 | 
											
												
													
														|  | 
 |  | + *                 can be either 'display' (viewable annotations) or 'print'
 | 
											
												
													
														|  | 
 |  | + *                 (printable annotations).
 | 
											
												
													
														|  | 
 |  | + *                 If the parameter is omitted, all annotations are fetched.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    if (kind === ImageKind.GRAYSCALE_1BPP) {
 |  | 
 | 
											
												
													
														|  | -      // inverting for B/W
 |  | 
 | 
											
												
													
														|  | -      offsetLiterals = 0;
 |  | 
 | 
											
												
													
														|  | -      for (y = 0; y < height; y++) {
 |  | 
 | 
											
												
													
														|  | -        offsetLiterals++; // skipping predictor
 |  | 
 | 
											
												
													
														|  | -        for (i = 0; i < lineSize; i++) {
 |  | 
 | 
											
												
													
														|  | -          literals[offsetLiterals++] ^= 0xFF;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Page render parameters.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} RenderParameters
 | 
											
												
													
														|  | 
 |  | + * @property {Object} canvasContext - A 2D context of a DOM Canvas object.
 | 
											
												
													
														|  | 
 |  | + * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by
 | 
											
												
													
														|  | 
 |  | + *                                calling of PDFPage.getViewport method.
 | 
											
												
													
														|  | 
 |  | + * @property {string} intent - Rendering intent, can be 'display' or 'print'
 | 
											
												
													
														|  | 
 |  | + *                    (default value is 'display').
 | 
											
												
													
														|  | 
 |  | + * @property {Array}  transform - (optional) Additional transform, applied
 | 
											
												
													
														|  | 
 |  | + *                    just before viewport transform.
 | 
											
												
													
														|  | 
 |  | + * @property {Object} imageLayer - (optional) An object that has beginLayout,
 | 
											
												
													
														|  | 
 |  | + *                    endLayout and appendImage functions.
 | 
											
												
													
														|  | 
 |  | + * @property {function} continueCallback - (deprecated) A function that will be
 | 
											
												
													
														|  | 
 |  | + *                      called each time the rendering is paused.  To continue
 | 
											
												
													
														|  | 
 |  | + *                      rendering call the function that is the first argument
 | 
											
												
													
														|  | 
 |  | + *                      to the callback.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var ihdr = new Uint8Array([
 |  | 
 | 
											
												
													
														|  | -      width >> 24 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      width >> 16 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      width >> 8 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      width & 0xff,
 |  | 
 | 
											
												
													
														|  | -      height >> 24 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      height >> 16 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      height >> 8 & 0xff,
 |  | 
 | 
											
												
													
														|  | -      height & 0xff,
 |  | 
 | 
											
												
													
														|  | -      bitDepth, // bit depth
 |  | 
 | 
											
												
													
														|  | -      colorType, // color type
 |  | 
 | 
											
												
													
														|  | -      0x00, // compression method
 |  | 
 | 
											
												
													
														|  | -      0x00, // filter method
 |  | 
 | 
											
												
													
														|  | -      0x00 // interlace method
 |  | 
 | 
											
												
													
														|  | -    ]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * PDF page operator list.
 | 
											
												
													
														|  | 
 |  | + *
 | 
											
												
													
														|  | 
 |  | + * @typedef {Object} PDFOperatorList
 | 
											
												
													
														|  | 
 |  | + * @property {Array} fnArray - Array containing the operator functions.
 | 
											
												
													
														|  | 
 |  | + * @property {Array} argsArray - Array containing the arguments of the
 | 
											
												
													
														|  | 
 |  | + *                               functions.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var len = literals.length;
 |  | 
 | 
											
												
													
														|  | -    var maxBlockLength = 0xFFFF;
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Proxy to a PDFPage in the worker thread.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + * @alias PDFPageProxy
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var PDFPageProxy = (function PDFPageProxyClosure() {
 | 
											
												
													
														|  | 
 |  | +  function PDFPageProxy(pageIndex, pageInfo, transport) {
 | 
											
												
													
														|  | 
 |  | +    this.pageIndex = pageIndex;
 | 
											
												
													
														|  | 
 |  | +    this.pageInfo = pageInfo;
 | 
											
												
													
														|  | 
 |  | +    this.transport = transport;
 | 
											
												
													
														|  | 
 |  | +    this.stats = new StatTimer();
 | 
											
												
													
														|  | 
 |  | +    this.stats.enabled = !!globalScope.PDFJS.enableStats;
 | 
											
												
													
														|  | 
 |  | +    this.commonObjs = transport.commonObjs;
 | 
											
												
													
														|  | 
 |  | +    this.objs = new PDFObjects();
 | 
											
												
													
														|  | 
 |  | +    this.cleanupAfterRender = false;
 | 
											
												
													
														|  | 
 |  | +    this.pendingCleanup = false;
 | 
											
												
													
														|  | 
 |  | +    this.intentStates = {};
 | 
											
												
													
														|  | 
 |  | +    this.destroyed = false;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {number} Page number of the page. First page is 1.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get pageNumber() {
 | 
											
												
													
														|  | 
 |  | +      return this.pageIndex + 1;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {number} The number of degrees the page is rotated clockwise.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get rotate() {
 | 
											
												
													
														|  | 
 |  | +      return this.pageInfo.rotate;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Object} The reference that points to this page. It has 'num' and
 | 
											
												
													
														|  | 
 |  | +     * 'gen' properties.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get ref() {
 | 
											
												
													
														|  | 
 |  | +      return this.pageInfo.ref;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Array} An array of the visible portion of the PDF page in the
 | 
											
												
													
														|  | 
 |  | +     * user space units - [x1, y1, x2, y2].
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get view() {
 | 
											
												
													
														|  | 
 |  | +      return this.pageInfo.view;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {number} scale The desired scale of the viewport.
 | 
											
												
													
														|  | 
 |  | +     * @param {number} rotate Degrees to rotate the viewport. If omitted this
 | 
											
												
													
														|  | 
 |  | +     * defaults to the page rotation.
 | 
											
												
													
														|  | 
 |  | +     * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties
 | 
											
												
													
														|  | 
 |  | +     * along with transforms required for rendering.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
 | 
											
												
													
														|  | 
 |  | +      if (arguments.length < 2) {
 | 
											
												
													
														|  | 
 |  | +        rotate = this.rotate;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {GetAnnotationsParameters} params - Annotation parameters.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved with an {Array} of the
 | 
											
												
													
														|  | 
 |  | +     * annotation objects.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getAnnotations: function PDFPageProxy_getAnnotations(params) {
 | 
											
												
													
														|  | 
 |  | +      var intent = (params && params.intent) || null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var deflateBlocks = Math.ceil(len / maxBlockLength);
 |  | 
 | 
											
												
													
														|  | -    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
 |  | 
 | 
											
												
													
														|  | -    var pi = 0;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = 0x78; // compression method and flags
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = 0x9c; // flags
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (!this.annotationsPromise || this.annotationsIntent !== intent) {
 | 
											
												
													
														|  | 
 |  | +        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,
 | 
											
												
													
														|  | 
 |  | +                                                                intent);
 | 
											
												
													
														|  | 
 |  | +        this.annotationsIntent = intent;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return this.annotationsPromise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Begins the process of rendering a page to the desired context.
 | 
											
												
													
														|  | 
 |  | +     * @param {RenderParameters} params Page render parameters.
 | 
											
												
													
														|  | 
 |  | +     * @return {RenderTask} An object that contains the promise, which
 | 
											
												
													
														|  | 
 |  | +     *                      is resolved when the page finishes rendering.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    render: function PDFPageProxy_render(params) {
 | 
											
												
													
														|  | 
 |  | +      var stats = this.stats;
 | 
											
												
													
														|  | 
 |  | +      stats.time('Overall');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var pos = 0;
 |  | 
 | 
											
												
													
														|  | -    while (len > maxBlockLength) {
 |  | 
 | 
											
												
													
														|  | -      // writing non-final DEFLATE blocks type 0 and length of 65535
 |  | 
 | 
											
												
													
														|  | -      idat[pi++] = 0x00;
 |  | 
 | 
											
												
													
														|  | -      idat[pi++] = 0xff;
 |  | 
 | 
											
												
													
														|  | -      idat[pi++] = 0xff;
 |  | 
 | 
											
												
													
														|  | -      idat[pi++] = 0x00;
 |  | 
 | 
											
												
													
														|  | -      idat[pi++] = 0x00;
 |  | 
 | 
											
												
													
														|  | -      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
 |  | 
 | 
											
												
													
														|  | -      pi += maxBlockLength;
 |  | 
 | 
											
												
													
														|  | -      pos += maxBlockLength;
 |  | 
 | 
											
												
													
														|  | -      len -= maxBlockLength;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // If there was a pending destroy cancel it so no cleanup happens during
 | 
											
												
													
														|  | 
 |  | +      // this call to render.
 | 
											
												
													
														|  | 
 |  | +      this.pendingCleanup = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // writing non-final DEFLATE blocks type 0
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = 0x01;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = len & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = len >> 8 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = (~len & 0xffff) & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat.set(literals.subarray(pos), pi);
 |  | 
 | 
											
												
													
														|  | -    pi += literals.length - pos;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    var adler = adler32(literals, 0, literals.length); // checksum
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = adler >> 24 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = adler >> 16 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = adler >> 8 & 0xff;
 |  | 
 | 
											
												
													
														|  | -    idat[pi++] = adler & 0xff;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (!this.intentStates[renderingIntent]) {
 | 
											
												
													
														|  | 
 |  | +        this.intentStates[renderingIntent] = {};
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      var intentState = this.intentStates[renderingIntent];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.
 |  | 
 | 
											
												
													
														|  | -    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +
 |  | 
 | 
											
												
													
														|  | -                    ihdr.length + idat.length;
 |  | 
 | 
											
												
													
														|  | -    var data = new Uint8Array(pngLength);
 |  | 
 | 
											
												
													
														|  | -    var offset = 0;
 |  | 
 | 
											
												
													
														|  | -    data.set(PNG_HEADER, offset);
 |  | 
 | 
											
												
													
														|  | -    offset += PNG_HEADER.length;
 |  | 
 | 
											
												
													
														|  | -    writePngChunk('IHDR', ihdr, data, offset);
 |  | 
 | 
											
												
													
														|  | -    offset += CHUNK_WRAPPER_SIZE + ihdr.length;
 |  | 
 | 
											
												
													
														|  | -    writePngChunk('IDATA', idat, data, offset);
 |  | 
 | 
											
												
													
														|  | -    offset += CHUNK_WRAPPER_SIZE + idat.length;
 |  | 
 | 
											
												
													
														|  | -    writePngChunk('IEND', new Uint8Array(0), data, offset);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // If there's no displayReadyCapability yet, then the operatorList
 | 
											
												
													
														|  | 
 |  | +      // was never requested before. Make the request and create the promise.
 | 
											
												
													
														|  | 
 |  | +      if (!intentState.displayReadyCapability) {
 | 
											
												
													
														|  | 
 |  | +        intentState.receivingOperatorList = true;
 | 
											
												
													
														|  | 
 |  | +        intentState.displayReadyCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +        intentState.operatorList = {
 | 
											
												
													
														|  | 
 |  | +          fnArray: [],
 | 
											
												
													
														|  | 
 |  | +          argsArray: [],
 | 
											
												
													
														|  | 
 |  | +          lastChunk: false
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return PDFJS.createObjectURL(data, 'image/png');
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.stats.time('Page Request');
 | 
											
												
													
														|  | 
 |  | +        this.transport.messageHandler.send('RenderPageRequest', {
 | 
											
												
													
														|  | 
 |  | +          pageIndex: this.pageNumber - 1,
 | 
											
												
													
														|  | 
 |  | +          intent: renderingIntent
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  return function convertImgDataToPng(imgData) {
 |  | 
 | 
											
												
													
														|  | -    var kind = (imgData.kind === undefined ?
 |  | 
 | 
											
												
													
														|  | -                ImageKind.GRAYSCALE_1BPP : imgData.kind);
 |  | 
 | 
											
												
													
														|  | -    return encode(imgData, kind);
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var internalRenderTask = new InternalRenderTask(complete, params,
 | 
											
												
													
														|  | 
 |  | +                                                      this.objs,
 | 
											
												
													
														|  | 
 |  | +                                                      this.commonObjs,
 | 
											
												
													
														|  | 
 |  | +                                                      intentState.operatorList,
 | 
											
												
													
														|  | 
 |  | +                                                      this.pageNumber);
 | 
											
												
													
														|  | 
 |  | +      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
 | 
											
												
													
														|  | 
 |  | +      if (!intentState.renderTasks) {
 | 
											
												
													
														|  | 
 |  | +        intentState.renderTasks = [];
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      intentState.renderTasks.push(internalRenderTask);
 | 
											
												
													
														|  | 
 |  | +      var renderTask = internalRenderTask.task;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var SVGExtraState = (function SVGExtraStateClosure() {
 |  | 
 | 
											
												
													
														|  | -  function SVGExtraState() {
 |  | 
 | 
											
												
													
														|  | -    this.fontSizeScale = 1;
 |  | 
 | 
											
												
													
														|  | -    this.fontWeight = SVG_DEFAULTS.fontWeight;
 |  | 
 | 
											
												
													
														|  | -    this.fontSize = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Obsolete parameter support
 | 
											
												
													
														|  | 
 |  | +      if (params.continueCallback) {
 | 
											
												
													
														|  | 
 |  | +        deprecated('render is used with continueCallback parameter');
 | 
											
												
													
														|  | 
 |  | +        renderTask.onContinue = params.continueCallback;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.textMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -    this.fontMatrix = FONT_IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -    this.leading = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var self = this;
 | 
											
												
													
														|  | 
 |  | +      intentState.displayReadyCapability.promise.then(
 | 
											
												
													
														|  | 
 |  | +        function pageDisplayReadyPromise(transparency) {
 | 
											
												
													
														|  | 
 |  | +          if (self.pendingCleanup) {
 | 
											
												
													
														|  | 
 |  | +            complete();
 | 
											
												
													
														|  | 
 |  | +            return;
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          stats.time('Rendering');
 | 
											
												
													
														|  | 
 |  | +          internalRenderTask.initalizeGraphics(transparency);
 | 
											
												
													
														|  | 
 |  | +          internalRenderTask.operatorListChanged();
 | 
											
												
													
														|  | 
 |  | +        },
 | 
											
												
													
														|  | 
 |  | +        function pageDisplayReadPromiseError(reason) {
 | 
											
												
													
														|  | 
 |  | +          complete(reason);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      );
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Current point (in user coordinates)
 |  | 
 | 
											
												
													
														|  | -    this.x = 0;
 |  | 
 | 
											
												
													
														|  | -    this.y = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      function complete(error) {
 | 
											
												
													
														|  | 
 |  | +        var i = intentState.renderTasks.indexOf(internalRenderTask);
 | 
											
												
													
														|  | 
 |  | +        if (i >= 0) {
 | 
											
												
													
														|  | 
 |  | +          intentState.renderTasks.splice(i, 1);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Start of text line (in text coordinates)
 |  | 
 | 
											
												
													
														|  | -    this.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -    this.lineY = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (self.cleanupAfterRender) {
 | 
											
												
													
														|  | 
 |  | +          self.pendingCleanup = true;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        self._tryCleanup();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Character and word spacing
 |  | 
 | 
											
												
													
														|  | -    this.charSpacing = 0;
 |  | 
 | 
											
												
													
														|  | -    this.wordSpacing = 0;
 |  | 
 | 
											
												
													
														|  | -    this.textHScale = 1;
 |  | 
 | 
											
												
													
														|  | -    this.textRise = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (error) {
 | 
											
												
													
														|  | 
 |  | +          internalRenderTask.capability.reject(error);
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          internalRenderTask.capability.resolve();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        stats.timeEnd('Rendering');
 | 
											
												
													
														|  | 
 |  | +        stats.timeEnd('Overall');
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Default foreground and background colors
 |  | 
 | 
											
												
													
														|  | -    this.fillColor = SVG_DEFAULTS.fillColor;
 |  | 
 | 
											
												
													
														|  | -    this.strokeColor = '#000000';
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return renderTask;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.fillAlpha = 1;
 |  | 
 | 
											
												
													
														|  | -    this.strokeAlpha = 1;
 |  | 
 | 
											
												
													
														|  | -    this.lineWidth = 1;
 |  | 
 | 
											
												
													
														|  | -    this.lineJoin = '';
 |  | 
 | 
											
												
													
														|  | -    this.lineCap = '';
 |  | 
 | 
											
												
													
														|  | -    this.miterLimit = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise resolved with an {@link PDFOperatorList}
 | 
											
												
													
														|  | 
 |  | +     * object that represents page's operator list.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getOperatorList: function PDFPageProxy_getOperatorList() {
 | 
											
												
													
														|  | 
 |  | +      function operatorListChanged() {
 | 
											
												
													
														|  | 
 |  | +        if (intentState.operatorList.lastChunk) {
 | 
											
												
													
														|  | 
 |  | +          intentState.opListReadCapability.resolve(intentState.operatorList);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.dashArray = [];
 |  | 
 | 
											
												
													
														|  | -    this.dashPhase = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var renderingIntent = 'oplist';
 | 
											
												
													
														|  | 
 |  | +      if (!this.intentStates[renderingIntent]) {
 | 
											
												
													
														|  | 
 |  | +        this.intentStates[renderingIntent] = {};
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      var intentState = this.intentStates[renderingIntent];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.dependencies = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (!intentState.opListReadCapability) {
 | 
											
												
													
														|  | 
 |  | +        var opListTask = {};
 | 
											
												
													
														|  | 
 |  | +        opListTask.operatorListChanged = operatorListChanged;
 | 
											
												
													
														|  | 
 |  | +        intentState.receivingOperatorList = true;
 | 
											
												
													
														|  | 
 |  | +        intentState.opListReadCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +        intentState.renderTasks = [];
 | 
											
												
													
														|  | 
 |  | +        intentState.renderTasks.push(opListTask);
 | 
											
												
													
														|  | 
 |  | +        intentState.operatorList = {
 | 
											
												
													
														|  | 
 |  | +          fnArray: [],
 | 
											
												
													
														|  | 
 |  | +          argsArray: [],
 | 
											
												
													
														|  | 
 |  | +          lastChunk: false
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Clipping
 |  | 
 | 
											
												
													
														|  | -    this.clipId = '';
 |  | 
 | 
											
												
													
														|  | -    this.pendingClip = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.transport.messageHandler.send('RenderPageRequest', {
 | 
											
												
													
														|  | 
 |  | +          pageIndex: this.pageIndex,
 | 
											
												
													
														|  | 
 |  | +          intent: renderingIntent
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      return intentState.opListReadCapability.promise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.maskId = '';
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param {getTextContentParameters} params - getTextContent parameters.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} That is resolved a {@link TextContent}
 | 
											
												
													
														|  | 
 |  | +     * object that represent the page text content.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getTextContent: function PDFPageProxy_getTextContent(params) {
 | 
											
												
													
														|  | 
 |  | +      var normalizeWhitespace = (params && params.normalizeWhitespace) || false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  SVGExtraState.prototype = {
 |  | 
 | 
											
												
													
														|  | -    clone: function SVGExtraState_clone() {
 |  | 
 | 
											
												
													
														|  | -      return Object.create(this);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return this.transport.messageHandler.sendWithPromise('GetTextContent', {
 | 
											
												
													
														|  | 
 |  | +        pageIndex: this.pageNumber - 1,
 | 
											
												
													
														|  | 
 |  | +        normalizeWhitespace: normalizeWhitespace,
 | 
											
												
													
														|  | 
 |  | +      });
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
 |  | 
 | 
											
												
													
														|  | -      this.x = x;
 |  | 
 | 
											
												
													
														|  | -      this.y = y;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -  };
 |  | 
 | 
											
												
													
														|  | -  return SVGExtraState;
 |  | 
 | 
											
												
													
														|  | -})();
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -var SVGGraphics = (function SVGGraphicsClosure() {
 |  | 
 | 
											
												
													
														|  | -  function createScratchSVG(width, height) {
 |  | 
 | 
											
												
													
														|  | -    var NS = 'http://www.w3.org/2000/svg';
 |  | 
 | 
											
												
													
														|  | -    var svg = document.createElementNS(NS, 'svg:svg');
 |  | 
 | 
											
												
													
														|  | -    svg.setAttributeNS(null, 'version', '1.1');
 |  | 
 | 
											
												
													
														|  | -    svg.setAttributeNS(null, 'width', width + 'px');
 |  | 
 | 
											
												
													
														|  | -    svg.setAttributeNS(null, 'height', height + 'px');
 |  | 
 | 
											
												
													
														|  | -    svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
 |  | 
 | 
											
												
													
														|  | -    return svg;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Destroys page object.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    _destroy: function PDFPageProxy_destroy() {
 | 
											
												
													
														|  | 
 |  | +      this.destroyed = true;
 | 
											
												
													
														|  | 
 |  | +      this.transport.pageCache[this.pageIndex] = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function opListToTree(opList) {
 |  | 
 | 
											
												
													
														|  | -    var opTree = [];
 |  | 
 | 
											
												
													
														|  | -    var tmp = [];
 |  | 
 | 
											
												
													
														|  | -    var opListLen = opList.length;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var waitOn = [];
 | 
											
												
													
														|  | 
 |  | +      Object.keys(this.intentStates).forEach(function(intent) {
 | 
											
												
													
														|  | 
 |  | +        var intentState = this.intentStates[intent];
 | 
											
												
													
														|  | 
 |  | +        intentState.renderTasks.forEach(function(renderTask) {
 | 
											
												
													
														|  | 
 |  | +          var renderCompleted = renderTask.capability.promise.
 | 
											
												
													
														|  | 
 |  | +            catch(function () {}); // ignoring failures
 | 
											
												
													
														|  | 
 |  | +          waitOn.push(renderCompleted);
 | 
											
												
													
														|  | 
 |  | +          renderTask.cancel();
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  | 
 |  | +      this.objs.clear();
 | 
											
												
													
														|  | 
 |  | +      this.annotationsPromise = null;
 | 
											
												
													
														|  | 
 |  | +      this.pendingCleanup = false;
 | 
											
												
													
														|  | 
 |  | +      return Promise.all(waitOn);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    for (var x = 0; x < opListLen; x++) {
 |  | 
 | 
											
												
													
														|  | -      if (opList[x].fn === 'save') {
 |  | 
 | 
											
												
													
														|  | -        opTree.push({'fnId': 92, 'fn': 'group', 'items': []});
 |  | 
 | 
											
												
													
														|  | -        tmp.push(opTree);
 |  | 
 | 
											
												
													
														|  | -        opTree = opTree[opTree.length - 1].items;
 |  | 
 | 
											
												
													
														|  | -        continue;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Cleans up resources allocated by the page. (deprecated)
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    destroy: function() {
 | 
											
												
													
														|  | 
 |  | +      deprecated('page destroy method, use cleanup() instead');
 | 
											
												
													
														|  | 
 |  | +      this.cleanup();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if(opList[x].fn === 'restore') {
 |  | 
 | 
											
												
													
														|  | -        opTree = tmp.pop();
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        opTree.push(opList[x]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Cleans up resources allocated by the page.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    cleanup: function PDFPageProxy_cleanup() {
 | 
											
												
													
														|  | 
 |  | +      this.pendingCleanup = true;
 | 
											
												
													
														|  | 
 |  | +      this._tryCleanup();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * For internal use only. Attempts to clean up if rendering is in a state
 | 
											
												
													
														|  | 
 |  | +     * where that's possible.
 | 
											
												
													
														|  | 
 |  | +     * @ignore
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    _tryCleanup: function PDFPageProxy_tryCleanup() {
 | 
											
												
													
														|  | 
 |  | +      if (!this.pendingCleanup ||
 | 
											
												
													
														|  | 
 |  | +          Object.keys(this.intentStates).some(function(intent) {
 | 
											
												
													
														|  | 
 |  | +            var intentState = this.intentStates[intent];
 | 
											
												
													
														|  | 
 |  | +            return (intentState.renderTasks.length !== 0 ||
 | 
											
												
													
														|  | 
 |  | +                    intentState.receivingOperatorList);
 | 
											
												
													
														|  | 
 |  | +          }, this)) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    return opTree;
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -  /**
 |  | 
 | 
											
												
													
														|  | -   * Formats float number.
 |  | 
 | 
											
												
													
														|  | -   * @param value {number} number to format.
 |  | 
 | 
											
												
													
														|  | -   * @returns {string}
 |  | 
 | 
											
												
													
														|  | -   */
 |  | 
 | 
											
												
													
														|  | -  function pf(value) {
 |  | 
 | 
											
												
													
														|  | -    if (value === (value | 0)) { // integer number
 |  | 
 | 
											
												
													
														|  | -      return value.toString();
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    var s = value.toFixed(10);
 |  | 
 | 
											
												
													
														|  | -    var i = s.length - 1;
 |  | 
 | 
											
												
													
														|  | -    if (s[i] !== '0') {
 |  | 
 | 
											
												
													
														|  | -      return s;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    // removing trailing zeros
 |  | 
 | 
											
												
													
														|  | -    do {
 |  | 
 | 
											
												
													
														|  | -      i--;
 |  | 
 | 
											
												
													
														|  | -    } while (s[i] === '0');
 |  | 
 | 
											
												
													
														|  | -    return s.substr(0, s[i] === '.' ? i : i + 1);
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  /**
 |  | 
 | 
											
												
													
														|  | -   * Formats transform matrix. The standard rotation, scale and translate
 |  | 
 | 
											
												
													
														|  | -   * matrices are replaced by their shorter forms, and for identity matrix
 |  | 
 | 
											
												
													
														|  | -   * returns empty string to save the memory.
 |  | 
 | 
											
												
													
														|  | -   * @param m {Array} matrix to format.
 |  | 
 | 
											
												
													
														|  | -   * @returns {string}
 |  | 
 | 
											
												
													
														|  | -   */
 |  | 
 | 
											
												
													
														|  | -  function pm(m) {
 |  | 
 | 
											
												
													
														|  | -    if (m[4] === 0 && m[5] === 0) {
 |  | 
 | 
											
												
													
														|  | -      if (m[1] === 0 && m[2] === 0) {
 |  | 
 | 
											
												
													
														|  | -        if (m[0] === 1 && m[3] === 1) {
 |  | 
 | 
											
												
													
														|  | -          return '';
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
 |  | 
 | 
											
												
													
														|  | 
 |  | +      Object.keys(this.intentStates).forEach(function(intent) {
 | 
											
												
													
														|  | 
 |  | +        delete this.intentStates[intent];
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  | 
 |  | +      this.objs.clear();
 | 
											
												
													
														|  | 
 |  | +      this.annotationsPromise = null;
 | 
											
												
													
														|  | 
 |  | +      this.pendingCleanup = false;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * For internal use only.
 | 
											
												
													
														|  | 
 |  | +     * @ignore
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
 | 
											
												
													
														|  | 
 |  | +                                                            intent) {
 | 
											
												
													
														|  | 
 |  | +      var intentState = this.intentStates[intent];
 | 
											
												
													
														|  | 
 |  | +      // TODO Refactor RenderPageRequest to separate rendering
 | 
											
												
													
														|  | 
 |  | +      // and operator list logic
 | 
											
												
													
														|  | 
 |  | +      if (intentState.displayReadyCapability) {
 | 
											
												
													
														|  | 
 |  | +        intentState.displayReadyCapability.resolve(transparency);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * For internal use only.
 | 
											
												
													
														|  | 
 |  | +     * @ignore
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
 | 
											
												
													
														|  | 
 |  | +                                                            intent) {
 | 
											
												
													
														|  | 
 |  | +      var intentState = this.intentStates[intent];
 | 
											
												
													
														|  | 
 |  | +      var i, ii;
 | 
											
												
													
														|  | 
 |  | +      // Add the new chunk to the current operator list.
 | 
											
												
													
														|  | 
 |  | +      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
 | 
											
												
													
														|  | 
 |  | +        intentState.operatorList.argsArray.push(
 | 
											
												
													
														|  | 
 |  | +          operatorListChunk.argsArray[i]);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      if (m[0] === m[3] && m[1] === -m[2]) {
 |  | 
 | 
											
												
													
														|  | -        var a = Math.acos(m[0]) * 180 / Math.PI;
 |  | 
 | 
											
												
													
														|  | -        return 'rotate(' + pf(a) + ')';
 |  | 
 | 
											
												
													
														|  | 
 |  | +      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      // Notify all the rendering tasks there are more operators to be consumed.
 | 
											
												
													
														|  | 
 |  | +      for (i = 0; i < intentState.renderTasks.length; i++) {
 | 
											
												
													
														|  | 
 |  | +        intentState.renderTasks[i].operatorListChanged();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    } else {
 |  | 
 | 
											
												
													
														|  | -      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
 |  | 
 | 
											
												
													
														|  | -        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (operatorListChunk.lastChunk) {
 | 
											
												
													
														|  | 
 |  | +        intentState.receivingOperatorList = false;
 | 
											
												
													
														|  | 
 |  | +        this._tryCleanup();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +
 |  | 
 | 
											
												
													
														|  | -      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return PDFPageProxy;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  function SVGGraphics(commonObjs, objs) {
 |  | 
 | 
											
												
													
														|  | -    this.current = new SVGExtraState();
 |  | 
 | 
											
												
													
														|  | -    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
 |  | 
 | 
											
												
													
														|  | -    this.transformStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.extraStack = [];
 |  | 
 | 
											
												
													
														|  | -    this.commonObjs = commonObjs;
 |  | 
 | 
											
												
													
														|  | -    this.objs = objs;
 |  | 
 | 
											
												
													
														|  | -    this.pendingEOFill = false;
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * PDF.js web worker abstraction, it controls instantiation of PDF documents and
 | 
											
												
													
														|  | 
 |  | + * WorkerTransport for them.  If creation of a web worker is not possible,
 | 
											
												
													
														|  | 
 |  | + * a "fake" worker will be used instead.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var PDFWorker = (function PDFWorkerClosure() {
 | 
											
												
													
														|  | 
 |  | +  var nextFakeWorkerId = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    this.embedFonts = false;
 |  | 
 | 
											
												
													
														|  | -    this.embeddedFonts = {};
 |  | 
 | 
											
												
													
														|  | -    this.cssStyle = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  // Loads worker code into main thread.
 | 
											
												
													
														|  | 
 |  | +  function setupFakeWorkerGlobal() {
 | 
											
												
													
														|  | 
 |  | +    if (!PDFJS.fakeWorkerFilesLoadedCapability) {
 | 
											
												
													
														|  | 
 |  | +      PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +      // In the developer build load worker_loader which in turn loads all the
 | 
											
												
													
														|  | 
 |  | +      // other files and resolves the promise. In production only the
 | 
											
												
													
														|  | 
 |  | +      // pdf.worker.js file is needed.
 | 
											
												
													
														|  | 
 |  | +      var loader = fakeWorkerFilesLoader || function (callback) {
 | 
											
												
													
														|  | 
 |  | +        Util.loadScript(PDFJS.workerSrc, callback);
 | 
											
												
													
														|  | 
 |  | +      };
 | 
											
												
													
														|  | 
 |  | +      loader(function () {
 | 
											
												
													
														|  | 
 |  | +        PDFJS.fakeWorkerFilesLoadedCapability.resolve();
 | 
											
												
													
														|  | 
 |  | +      });
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    return PDFJS.fakeWorkerFilesLoadedCapability.promise;
 | 
											
												
													
														|  |    }
 |  |    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  var NS = 'http://www.w3.org/2000/svg';
 |  | 
 | 
											
												
													
														|  | -  var XML_NS = 'http://www.w3.org/XML/1998/namespace';
 |  | 
 | 
											
												
													
														|  | -  var XLINK_NS = 'http://www.w3.org/1999/xlink';
 |  | 
 | 
											
												
													
														|  | -  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
 |  | 
 | 
											
												
													
														|  | -  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
 |  | 
 | 
											
												
													
														|  | -  var clipCount = 0;
 |  | 
 | 
											
												
													
														|  | -  var maskCount = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function PDFWorker(name) {
 | 
											
												
													
														|  | 
 |  | +    this.name = name;
 | 
											
												
													
														|  | 
 |  | +    this.destroyed = false;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -  SVGGraphics.prototype = {
 |  | 
 | 
											
												
													
														|  | -    save: function SVGGraphics_save() {
 |  | 
 | 
											
												
													
														|  | -      this.transformStack.push(this.transformMatrix);
 |  | 
 | 
											
												
													
														|  | -      var old = this.current;
 |  | 
 | 
											
												
													
														|  | -      this.extraStack.push(old);
 |  | 
 | 
											
												
													
														|  | -      this.current = old.clone();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this._readyCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +    this._port = null;
 | 
											
												
													
														|  | 
 |  | +    this._webWorker = null;
 | 
											
												
													
														|  | 
 |  | +    this._messageHandler = null;
 | 
											
												
													
														|  | 
 |  | +    this._initialize();
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    restore: function SVGGraphics_restore() {
 |  | 
 | 
											
												
													
														|  | -      this.transformMatrix = this.transformStack.pop();
 |  | 
 | 
											
												
													
														|  | -      this.current = this.extraStack.pop();
 |  | 
 | 
											
												
													
														|  | 
 |  | +  PDFWorker.prototype =  /** @lends PDFWorker.prototype */ {
 | 
											
												
													
														|  | 
 |  | +    get promise() {
 | 
											
												
													
														|  | 
 |  | +      return this._readyCapability.promise;
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.tgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | -      this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    get port() {
 | 
											
												
													
														|  | 
 |  | +      return this._port;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    group: function SVGGraphics_group(items) {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -      this.executeOpTree(items);
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +    get messageHandler() {
 | 
											
												
													
														|  | 
 |  | +      return this._messageHandler;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
 |  | 
 | 
											
												
													
														|  | -      var fnArray = operatorList.fnArray;
 |  | 
 | 
											
												
													
														|  | -      var fnArrayLen = fnArray.length;
 |  | 
 | 
											
												
													
														|  | -      var argsArray = operatorList.argsArray;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    _initialize: function PDFWorker_initialize() {
 | 
											
												
													
														|  | 
 |  | +      // If worker support isn't disabled explicit and the browser has worker
 | 
											
												
													
														|  | 
 |  | +      // support, create a new web worker and test if it/the browser fullfills
 | 
											
												
													
														|  | 
 |  | +      // all requirements to run parts of pdf.js in a web worker.
 | 
											
												
													
														|  | 
 |  | +      // Right now, the requirement is, that an Uint8Array is still an
 | 
											
												
													
														|  | 
 |  | +      // Uint8Array as it arrives on the worker. (Chrome added this with v.15.)
 | 
											
												
													
														|  | 
 |  | +      if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
 | 
											
												
													
														|  | 
 |  | +        var workerSrc = PDFJS.workerSrc;
 | 
											
												
													
														|  | 
 |  | +        if (!workerSrc) {
 | 
											
												
													
														|  | 
 |  | +          error('No PDFJS.workerSrc specified');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var self = this;
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0; i < fnArrayLen; i++) {
 |  | 
 | 
											
												
													
														|  | -        if (OPS.dependency === fnArray[i]) {
 |  | 
 | 
											
												
													
														|  | -          var deps = argsArray[i];
 |  | 
 | 
											
												
													
														|  | -          for (var n = 0, nn = deps.length; n < nn; n++) {
 |  | 
 | 
											
												
													
														|  | -            var obj = deps[n];
 |  | 
 | 
											
												
													
														|  | -            var common = obj.substring(0, 2) === 'g_';
 |  | 
 | 
											
												
													
														|  | -            var promise;
 |  | 
 | 
											
												
													
														|  | -            if (common) {
 |  | 
 | 
											
												
													
														|  | -              promise = new Promise(function(resolve) {
 |  | 
 | 
											
												
													
														|  | -                self.commonObjs.get(obj, resolve);
 |  | 
 | 
											
												
													
														|  | -              });
 |  | 
 | 
											
												
													
														|  | 
 |  | +        try {
 | 
											
												
													
														|  | 
 |  | +          // Some versions of FF can't create a worker on localhost, see:
 | 
											
												
													
														|  | 
 |  | +          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
 | 
											
												
													
														|  | 
 |  | +          var worker = new Worker(workerSrc);
 | 
											
												
													
														|  | 
 |  | +          var messageHandler = new MessageHandler('main', 'worker', worker);
 | 
											
												
													
														|  | 
 |  | +          messageHandler.on('test', function PDFWorker_test(data) {
 | 
											
												
													
														|  | 
 |  | +            if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +              this._readyCapability.reject(new Error('Worker was destroyed'));
 | 
											
												
													
														|  | 
 |  | +              messageHandler.destroy();
 | 
											
												
													
														|  | 
 |  | +              worker.terminate();
 | 
											
												
													
														|  | 
 |  | +              return; // worker was destroyed
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            var supportTypedArray = data && data.supportTypedArray;
 | 
											
												
													
														|  | 
 |  | +            if (supportTypedArray) {
 | 
											
												
													
														|  | 
 |  | +              this._messageHandler = messageHandler;
 | 
											
												
													
														|  | 
 |  | +              this._port = worker;
 | 
											
												
													
														|  | 
 |  | +              this._webWorker = worker;
 | 
											
												
													
														|  | 
 |  | +              if (!data.supportTransfers) {
 | 
											
												
													
														|  | 
 |  | +                PDFJS.postMessageTransfers = false;
 | 
											
												
													
														|  | 
 |  | +              }
 | 
											
												
													
														|  | 
 |  | +              this._readyCapability.resolve();
 | 
											
												
													
														|  |              } else {
 |  |              } else {
 | 
											
												
													
														|  | -              promise = new Promise(function(resolve) {
 |  | 
 | 
											
												
													
														|  | -                self.objs.get(obj, resolve);
 |  | 
 | 
											
												
													
														|  | -              });
 |  | 
 | 
											
												
													
														|  | 
 |  | +              this._setupFakeWorker();
 | 
											
												
													
														|  | 
 |  | +              messageHandler.destroy();
 | 
											
												
													
														|  | 
 |  | +              worker.terminate();
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  | -            this.current.dependencies.push(promise);
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | 
 |  | +          }.bind(this));
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +          messageHandler.on('console_log', function (data) {
 | 
											
												
													
														|  | 
 |  | +            console.log.apply(console, data);
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +          messageHandler.on('console_error', function (data) {
 | 
											
												
													
														|  | 
 |  | +            console.error.apply(console, data);
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +          messageHandler.on('ready', function (data) {
 | 
											
												
													
														|  | 
 |  | +            if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +              this._readyCapability.reject(new Error('Worker was destroyed'));
 | 
											
												
													
														|  | 
 |  | +              messageHandler.destroy();
 | 
											
												
													
														|  | 
 |  | +              worker.terminate();
 | 
											
												
													
														|  | 
 |  | +              return; // worker was destroyed
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +              sendTest();
 | 
											
												
													
														|  | 
 |  | +            } catch (e)  {
 | 
											
												
													
														|  | 
 |  | +              // We need fallback to a faked worker.
 | 
											
												
													
														|  | 
 |  | +              this._setupFakeWorker();
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +          }.bind(this));
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +          var sendTest = function () {
 | 
											
												
													
														|  | 
 |  | +            var testObj = new Uint8Array(
 | 
											
												
													
														|  | 
 |  | +              [PDFJS.postMessageTransfers ? 255 : 0]);
 | 
											
												
													
														|  | 
 |  | +            // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
 | 
											
												
													
														|  | 
 |  | +            // typed array. Also, checking if we can use transfers.
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +              messageHandler.send('test', testObj, [testObj.buffer]);
 | 
											
												
													
														|  | 
 |  | +            } catch (ex) {
 | 
											
												
													
														|  | 
 |  | +              info('Cannot use postMessage transfers');
 | 
											
												
													
														|  | 
 |  | +              testObj[0] = 0;
 | 
											
												
													
														|  | 
 |  | +              messageHandler.send('test', testObj);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +          };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +          // It might take time for worker to initialize (especially when AMD
 | 
											
												
													
														|  | 
 |  | +          // loader is used). We will try to send test immediately, and then
 | 
											
												
													
														|  | 
 |  | +          // when 'ready' message will arrive. The worker shall process only
 | 
											
												
													
														|  | 
 |  | +          // first received 'test'.
 | 
											
												
													
														|  | 
 |  | +          sendTest();
 | 
											
												
													
														|  | 
 |  | +          return;
 | 
											
												
													
														|  | 
 |  | +        } catch (e) {
 | 
											
												
													
														|  | 
 |  | +          info('The worker has been disabled.');
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      return Promise.all(this.current.dependencies);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // Either workers are disabled, not supported or have thrown an exception.
 | 
											
												
													
														|  | 
 |  | +      // Thus, we fallback to a faked worker.
 | 
											
												
													
														|  | 
 |  | +      this._setupFakeWorker();
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    _setupFakeWorker: function PDFWorker_setupFakeWorker() {
 | 
											
												
													
														|  | 
 |  | +      if (!globalScope.PDFJS.disableWorker) {
 | 
											
												
													
														|  | 
 |  | +        warn('Setting up fake worker.');
 | 
											
												
													
														|  | 
 |  | +        globalScope.PDFJS.disableWorker = true;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      setupFakeWorkerGlobal().then(function () {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          this._readyCapability.reject(new Error('Worker was destroyed'));
 | 
											
												
													
														|  | 
 |  | +          return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // If we don't use a worker, just post/sendMessage to the main thread.
 | 
											
												
													
														|  | 
 |  | +        var port = {
 | 
											
												
													
														|  | 
 |  | +          _listeners: [],
 | 
											
												
													
														|  | 
 |  | +          postMessage: function (obj) {
 | 
											
												
													
														|  | 
 |  | +            var e = {data: obj};
 | 
											
												
													
														|  | 
 |  | +            this._listeners.forEach(function (listener) {
 | 
											
												
													
														|  | 
 |  | +              listener.call(this, e);
 | 
											
												
													
														|  | 
 |  | +            }, this);
 | 
											
												
													
														|  | 
 |  | +          },
 | 
											
												
													
														|  | 
 |  | +          addEventListener: function (name, listener) {
 | 
											
												
													
														|  | 
 |  | +            this._listeners.push(listener);
 | 
											
												
													
														|  | 
 |  | +          },
 | 
											
												
													
														|  | 
 |  | +          removeEventListener: function (name, listener) {
 | 
											
												
													
														|  | 
 |  | +            var i = this._listeners.indexOf(listener);
 | 
											
												
													
														|  | 
 |  | +            this._listeners.splice(i, 1);
 | 
											
												
													
														|  | 
 |  | +          },
 | 
											
												
													
														|  | 
 |  | +          terminate: function () {}
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  | 
 |  | +        this._port = port;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // All fake workers use the same port, making id unique.
 | 
											
												
													
														|  | 
 |  | +        var id = 'fake' + (nextFakeWorkerId++);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        // If the main thread is our worker, setup the handling for the
 | 
											
												
													
														|  | 
 |  | +        // messages -- the main thread sends to it self.
 | 
											
												
													
														|  | 
 |  | +        var workerHandler = new MessageHandler(id + '_worker', id, port);
 | 
											
												
													
														|  | 
 |  | +        PDFJS.WorkerMessageHandler.setup(workerHandler, port);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var messageHandler = new MessageHandler(id, id + '_worker', port);
 | 
											
												
													
														|  | 
 |  | +        this._messageHandler = messageHandler;
 | 
											
												
													
														|  | 
 |  | +        this._readyCapability.resolve();
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    transform: function SVGGraphics_transform(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      var transformMatrix = [a, b, c, d, e, f];
 |  | 
 | 
											
												
													
														|  | -      this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,
 |  | 
 | 
											
												
													
														|  | -                                                  transformMatrix);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Destroys the worker instance.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    destroy: function PDFWorker_destroy() {
 | 
											
												
													
														|  | 
 |  | +      this.destroyed = true;
 | 
											
												
													
														|  | 
 |  | +      if (this._webWorker) {
 | 
											
												
													
														|  | 
 |  | +        // We need to terminate only web worker created resource.
 | 
											
												
													
														|  | 
 |  | +        this._webWorker.terminate();
 | 
											
												
													
														|  | 
 |  | +        this._webWorker = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this._port = null;
 | 
											
												
													
														|  | 
 |  | +      if (this._messageHandler) {
 | 
											
												
													
														|  | 
 |  | +        this._messageHandler.destroy();
 | 
											
												
													
														|  | 
 |  | +        this._messageHandler = null;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  return PDFWorker;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +PDFJS.PDFWorker = PDFWorker;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.tgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * For internal use only.
 | 
											
												
													
														|  | 
 |  | + * @ignore
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var WorkerTransport = (function WorkerTransportClosure() {
 | 
											
												
													
														|  | 
 |  | +  function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +    this.messageHandler = messageHandler;
 | 
											
												
													
														|  | 
 |  | +    this.loadingTask = loadingTask;
 | 
											
												
													
														|  | 
 |  | +    this.pdfDataRangeTransport = pdfDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +    this.commonObjs = new PDFObjects();
 | 
											
												
													
														|  | 
 |  | +    this.fontLoader = new FontLoader(loadingTask.docId);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
 |  | 
 | 
											
												
													
														|  | -      this.svg = createScratchSVG(viewport.width, viewport.height);
 |  | 
 | 
											
												
													
														|  | -      this.viewport = viewport;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.destroyed = false;
 | 
											
												
													
														|  | 
 |  | +    this.destroyCapability = null;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      return this.loadDependencies(operatorList).then(function () {
 |  | 
 | 
											
												
													
														|  | -        this.transformMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -        this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
 |  | 
 | 
											
												
													
														|  | -        this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
 |  | 
 | 
											
												
													
														|  | -        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | -        this.defs = document.createElementNS(NS, 'svg:defs');
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.defs);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.svg.appendChild(this.pgrp);
 |  | 
 | 
											
												
													
														|  | -        var opTree = this.convertOpList(operatorList);
 |  | 
 | 
											
												
													
														|  | -        this.executeOpTree(opTree);
 |  | 
 | 
											
												
													
														|  | -        return this.svg;
 |  | 
 | 
											
												
													
														|  | -      }.bind(this));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    this.pageCache = [];
 | 
											
												
													
														|  | 
 |  | +    this.pagePromises = [];
 | 
											
												
													
														|  | 
 |  | +    this.downloadInfoCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    this.setupMessageHandler();
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +  WorkerTransport.prototype = {
 | 
											
												
													
														|  | 
 |  | +    destroy: function WorkerTransport_destroy() {
 | 
											
												
													
														|  | 
 |  | +      if (this.destroyCapability) {
 | 
											
												
													
														|  | 
 |  | +        return this.destroyCapability.promise;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.destroyed = true;
 | 
											
												
													
														|  | 
 |  | +      this.destroyCapability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var waitOn = [];
 | 
											
												
													
														|  | 
 |  | +      // We need to wait for all renderings to be completed, e.g.
 | 
											
												
													
														|  | 
 |  | +      // timeout/rAF can take a long time.
 | 
											
												
													
														|  | 
 |  | +      this.pageCache.forEach(function (page) {
 | 
											
												
													
														|  | 
 |  | +        if (page) {
 | 
											
												
													
														|  | 
 |  | +          waitOn.push(page._destroy());
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      });
 | 
											
												
													
														|  | 
 |  | +      this.pageCache = [];
 | 
											
												
													
														|  | 
 |  | +      this.pagePromises = [];
 | 
											
												
													
														|  | 
 |  | +      var self = this;
 | 
											
												
													
														|  | 
 |  | +      // We also need to wait for the worker to finish its long running tasks.
 | 
											
												
													
														|  | 
 |  | +      var terminated = this.messageHandler.sendWithPromise('Terminate', null);
 | 
											
												
													
														|  | 
 |  | +      waitOn.push(terminated);
 | 
											
												
													
														|  | 
 |  | +      Promise.all(waitOn).then(function () {
 | 
											
												
													
														|  | 
 |  | +        self.fontLoader.clear();
 | 
											
												
													
														|  | 
 |  | +        if (self.pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +          self.pdfDataRangeTransport.abort();
 | 
											
												
													
														|  | 
 |  | +          self.pdfDataRangeTransport = null;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        if (self.messageHandler) {
 | 
											
												
													
														|  | 
 |  | +          self.messageHandler.destroy();
 | 
											
												
													
														|  | 
 |  | +          self.messageHandler = null;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        self.destroyCapability.resolve();
 | 
											
												
													
														|  | 
 |  | +      }, this.destroyCapability.reject);
 | 
											
												
													
														|  | 
 |  | +      return this.destroyCapability.promise;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    convertOpList: function SVGGraphics_convertOpList(operatorList) {
 |  | 
 | 
											
												
													
														|  | -      var argsArray = operatorList.argsArray;
 |  | 
 | 
											
												
													
														|  | -      var fnArray = operatorList.fnArray;
 |  | 
 | 
											
												
													
														|  | -      var fnArrayLen  = fnArray.length;
 |  | 
 | 
											
												
													
														|  | -      var REVOPS = [];
 |  | 
 | 
											
												
													
														|  | -      var opList = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    setupMessageHandler:
 | 
											
												
													
														|  | 
 |  | +      function WorkerTransport_setupMessageHandler() {
 | 
											
												
													
														|  | 
 |  | +      var messageHandler = this.messageHandler;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      for (var op in OPS) {
 |  | 
 | 
											
												
													
														|  | -        REVOPS[OPS[op]] = op;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      function updatePassword(password) {
 | 
											
												
													
														|  | 
 |  | +        messageHandler.send('UpdatePassword', password);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      for (var x = 0; x < fnArrayLen; x++) {
 |  | 
 | 
											
												
													
														|  | -        var fnId = fnArray[x];
 |  | 
 | 
											
												
													
														|  | -        opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      return opListToTree(opList);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var pdfDataRangeTransport = this.pdfDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +      if (pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
 | 
											
												
													
														|  | 
 |  | +          messageHandler.send('OnDataRange', {
 | 
											
												
													
														|  | 
 |  | +            begin: begin,
 | 
											
												
													
														|  | 
 |  | +            chunk: chunk
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    executeOpTree: function SVGGraphics_executeOpTree(opTree) {
 |  | 
 | 
											
												
													
														|  | -      var opTreeLen = opTree.length;
 |  | 
 | 
											
												
													
														|  | -      for(var x = 0; x < opTreeLen; x++) {
 |  | 
 | 
											
												
													
														|  | -        var fn = opTree[x].fn;
 |  | 
 | 
											
												
													
														|  | -        var fnId = opTree[x].fnId;
 |  | 
 | 
											
												
													
														|  | -        var args = opTree[x].args;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        pdfDataRangeTransport.addProgressListener(function(loaded) {
 | 
											
												
													
														|  | 
 |  | +          messageHandler.send('OnDataProgress', {
 | 
											
												
													
														|  | 
 |  | +            loaded: loaded
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        switch (fnId | 0) {
 |  | 
 | 
											
												
													
														|  | -          case OPS.beginText:
 |  | 
 | 
											
												
													
														|  | -            this.beginText();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setLeading:
 |  | 
 | 
											
												
													
														|  | -            this.setLeading(args);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setLeadingMoveText:
 |  | 
 | 
											
												
													
														|  | -            this.setLeadingMoveText(args[0], args[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setFont:
 |  | 
 | 
											
												
													
														|  | -            this.setFont(args);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.showText:
 |  | 
 | 
											
												
													
														|  | -            this.showText(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.showSpacedText:
 |  | 
 | 
											
												
													
														|  | -            this.showText(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.endText:
 |  | 
 | 
											
												
													
														|  | -            this.endText();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.moveText:
 |  | 
 | 
											
												
													
														|  | -            this.moveText(args[0], args[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setCharSpacing:
 |  | 
 | 
											
												
													
														|  | -            this.setCharSpacing(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setWordSpacing:
 |  | 
 | 
											
												
													
														|  | -            this.setWordSpacing(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setHScale:
 |  | 
 | 
											
												
													
														|  | -            this.setHScale(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setTextMatrix:
 |  | 
 | 
											
												
													
														|  | -            this.setTextMatrix(args[0], args[1], args[2],
 |  | 
 | 
											
												
													
														|  | -                               args[3], args[4], args[5]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setLineWidth:
 |  | 
 | 
											
												
													
														|  | -            this.setLineWidth(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setLineJoin:
 |  | 
 | 
											
												
													
														|  | -            this.setLineJoin(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setLineCap:
 |  | 
 | 
											
												
													
														|  | -            this.setLineCap(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setMiterLimit:
 |  | 
 | 
											
												
													
														|  | -            this.setMiterLimit(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setFillRGBColor:
 |  | 
 | 
											
												
													
														|  | -            this.setFillRGBColor(args[0], args[1], args[2]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setStrokeRGBColor:
 |  | 
 | 
											
												
													
														|  | -            this.setStrokeRGBColor(args[0], args[1], args[2]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setDash:
 |  | 
 | 
											
												
													
														|  | -            this.setDash(args[0], args[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.setGState:
 |  | 
 | 
											
												
													
														|  | -            this.setGState(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.fill:
 |  | 
 | 
											
												
													
														|  | -            this.fill();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.eoFill:
 |  | 
 | 
											
												
													
														|  | -            this.eoFill();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.stroke:
 |  | 
 | 
											
												
													
														|  | -            this.stroke();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.fillStroke:
 |  | 
 | 
											
												
													
														|  | -            this.fillStroke();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.eoFillStroke:
 |  | 
 | 
											
												
													
														|  | -            this.eoFillStroke();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.clip:
 |  | 
 | 
											
												
													
														|  | -            this.clip('nonzero');
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.eoClip:
 |  | 
 | 
											
												
													
														|  | -            this.clip('evenodd');
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintSolidColorImageMask:
 |  | 
 | 
											
												
													
														|  | -            this.paintSolidColorImageMask();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintJpegXObject:
 |  | 
 | 
											
												
													
														|  | -            this.paintJpegXObject(args[0], args[1], args[2]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintImageXObject:
 |  | 
 | 
											
												
													
														|  | -            this.paintImageXObject(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintInlineImageXObject:
 |  | 
 | 
											
												
													
														|  | -            this.paintInlineImageXObject(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintImageMaskXObject:
 |  | 
 | 
											
												
													
														|  | -            this.paintImageMaskXObject(args[0]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintFormXObjectBegin:
 |  | 
 | 
											
												
													
														|  | -            this.paintFormXObjectBegin(args[0], args[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.paintFormXObjectEnd:
 |  | 
 | 
											
												
													
														|  | -            this.paintFormXObjectEnd();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.closePath:
 |  | 
 | 
											
												
													
														|  | -            this.closePath();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.closeStroke:
 |  | 
 | 
											
												
													
														|  | -            this.closeStroke();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.closeFillStroke:
 |  | 
 | 
											
												
													
														|  | -            this.closeFillStroke();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.nextLine:
 |  | 
 | 
											
												
													
														|  | -            this.nextLine();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.transform:
 |  | 
 | 
											
												
													
														|  | -            this.transform(args[0], args[1], args[2], args[3],
 |  | 
 | 
											
												
													
														|  | -                           args[4], args[5]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.constructPath:
 |  | 
 | 
											
												
													
														|  | -            this.constructPath(args[0], args[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.endPath:
 |  | 
 | 
											
												
													
														|  | -            this.endPath();
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 92:
 |  | 
 | 
											
												
													
														|  | -            this.group(opTree[x].items);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          default:
 |  | 
 | 
											
												
													
														|  | -            warn('Unimplemented method '+ fn);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {
 | 
											
												
													
														|  | 
 |  | +          messageHandler.send('OnDataRange', {
 | 
											
												
													
														|  | 
 |  | +            chunk: chunk
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        messageHandler.on('RequestDataRange',
 | 
											
												
													
														|  | 
 |  | +          function transportDataRange(data) {
 | 
											
												
													
														|  | 
 |  | +            pdfDataRangeTransport.requestDataRange(data.begin, data.end);
 | 
											
												
													
														|  | 
 |  | +          }, this);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
 |  | 
 | 
											
												
													
														|  | -      this.current.wordSpacing = wordSpacing;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('GetDoc', function transportDoc(data) {
 | 
											
												
													
														|  | 
 |  | +        var pdfInfo = data.pdfInfo;
 | 
											
												
													
														|  | 
 |  | +        this.numPages = data.pdfInfo.numPages;
 | 
											
												
													
														|  | 
 |  | +        var loadingTask = this.loadingTask;
 | 
											
												
													
														|  | 
 |  | +        var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
 | 
											
												
													
														|  | 
 |  | +        this.pdfDocument = pdfDocument;
 | 
											
												
													
														|  | 
 |  | +        loadingTask._capability.resolve(pdfDocument);
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
 |  | 
 | 
											
												
													
														|  | -      this.current.charSpacing = charSpacing;
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('NeedPassword',
 | 
											
												
													
														|  | 
 |  | +                        function transportNeedPassword(exception) {
 | 
											
												
													
														|  | 
 |  | +        var loadingTask = this.loadingTask;
 | 
											
												
													
														|  | 
 |  | +        if (loadingTask.onPassword) {
 | 
											
												
													
														|  | 
 |  | +          return loadingTask.onPassword(updatePassword,
 | 
											
												
													
														|  | 
 |  | +                                        PasswordResponses.NEED_PASSWORD);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new PasswordException(exception.message, exception.code));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    nextLine: function SVGGraphics_nextLine() {
 |  | 
 | 
											
												
													
														|  | -      this.moveText(0, this.current.leading);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('IncorrectPassword',
 | 
											
												
													
														|  | 
 |  | +                        function transportIncorrectPassword(exception) {
 | 
											
												
													
														|  | 
 |  | +        var loadingTask = this.loadingTask;
 | 
											
												
													
														|  | 
 |  | +        if (loadingTask.onPassword) {
 | 
											
												
													
														|  | 
 |  | +          return loadingTask.onPassword(updatePassword,
 | 
											
												
													
														|  | 
 |  | +                                        PasswordResponses.INCORRECT_PASSWORD);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new PasswordException(exception.message, exception.code));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
 | 
											
												
													
														|  | 
 |  | +        this.loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new InvalidPDFException(exception.message));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
 | 
											
												
													
														|  | 
 |  | +        this.loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new MissingPDFException(exception.message));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.xcoords = [];
 |  | 
 | 
											
												
													
														|  | -      current.tspan = document.createElementNS(NS, 'svg:tspan');
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-size',
 |  | 
 | 
											
												
													
														|  | -                                   pf(current.fontSize) + 'px');
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('UnexpectedResponse',
 | 
											
												
													
														|  | 
 |  | +                        function transportUnexpectedResponse(exception) {
 | 
											
												
													
														|  | 
 |  | +        this.loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new UnexpectedResponseException(exception.message, exception.status));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.txtElement = document.createElementNS(NS, 'svg:text');
 |  | 
 | 
											
												
													
														|  | -      current.txtElement.appendChild(current.tspan);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('UnknownError',
 | 
											
												
													
														|  | 
 |  | +                        function transportUnknownError(exception) {
 | 
											
												
													
														|  | 
 |  | +        this.loadingTask._capability.reject(
 | 
											
												
													
														|  | 
 |  | +          new UnknownErrorException(exception.message, exception.details));
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    beginText: function SVGGraphics_beginText() {
 |  | 
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX = 0;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY = 0;
 |  | 
 | 
											
												
													
														|  | -      this.current.textMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -      this.current.lineMatrix = IDENTITY_MATRIX;
 |  | 
 | 
											
												
													
														|  | -      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
 |  | 
 | 
											
												
													
														|  | -      this.current.txtElement = document.createElementNS(NS, 'svg:text');
 |  | 
 | 
											
												
													
														|  | -      this.current.txtgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.current.xcoords = [];
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('DataLoaded', function transportPage(data) {
 | 
											
												
													
														|  | 
 |  | +        this.downloadInfoCapability.resolve(data);
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    moveText: function SVGGraphics_moveText(x, y) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      this.current.x = this.current.lineX += x;
 |  | 
 | 
											
												
													
														|  | -      this.current.y = this.current.lineY += y;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('PDFManagerReady', function transportPage(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.pdfDataRangeTransport) {
 | 
											
												
													
														|  | 
 |  | +          this.pdfDataRangeTransport.transportReady();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.xcoords = [];
 |  | 
 | 
											
												
													
														|  | -      current.tspan = document.createElementNS(NS, 'svg:tspan');
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-size',
 |  | 
 | 
											
												
													
														|  | -                                   pf(current.fontSize) + 'px');
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('StartRenderPage', function transportRender(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        var page = this.pageCache[data.pageIndex];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    showText: function SVGGraphics_showText(glyphs) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var font = current.font;
 |  | 
 | 
											
												
													
														|  | -      var fontSize = current.fontSize;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        page.stats.timeEnd('Page Request');
 | 
											
												
													
														|  | 
 |  | +        page._startRenderPage(data.transparency, data.intent);
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (fontSize === 0) {
 |  | 
 | 
											
												
													
														|  | -        return;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('RenderPageChunk', function transportRender(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        var page = this.pageCache[data.pageIndex];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var charSpacing = current.charSpacing;
 |  | 
 | 
											
												
													
														|  | -      var wordSpacing = current.wordSpacing;
 |  | 
 | 
											
												
													
														|  | -      var fontDirection = current.fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var textHScale = current.textHScale * fontDirection;
 |  | 
 | 
											
												
													
														|  | -      var glyphsLength = glyphs.length;
 |  | 
 | 
											
												
													
														|  | -      var vertical = font.vertical;
 |  | 
 | 
											
												
													
														|  | -      var widthAdvanceScale = fontSize * current.fontMatrix[0];
 |  | 
 | 
											
												
													
														|  | 
 |  | +        page._renderPageChunk(data.operatorList, data.intent);
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var x = 0, i;
 |  | 
 | 
											
												
													
														|  | -      for (i = 0; i < glyphsLength; ++i) {
 |  | 
 | 
											
												
													
														|  | -        var glyph = glyphs[i];
 |  | 
 | 
											
												
													
														|  | -        if (glyph === null) {
 |  | 
 | 
											
												
													
														|  | -          // word break
 |  | 
 | 
											
												
													
														|  | -          x += fontDirection * wordSpacing;
 |  | 
 | 
											
												
													
														|  | -          continue;
 |  | 
 | 
											
												
													
														|  | -        } else if (isNum(glyph)) {
 |  | 
 | 
											
												
													
														|  | -          x += -glyph * fontSize * 0.001;
 |  | 
 | 
											
												
													
														|  | -          continue;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('commonobj', function transportObj(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        current.xcoords.push(current.x + x * textHScale);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var width = glyph.width;
 |  | 
 | 
											
												
													
														|  | -        var character = glyph.fontChar;
 |  | 
 | 
											
												
													
														|  | -        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
 |  | 
 | 
											
												
													
														|  | -        x += charWidth;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var id = data[0];
 | 
											
												
													
														|  | 
 |  | +        var type = data[1];
 | 
											
												
													
														|  | 
 |  | +        if (this.commonObjs.hasData(id)) {
 | 
											
												
													
														|  | 
 |  | +          return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        current.tspan.textContent += character;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (vertical) {
 |  | 
 | 
											
												
													
														|  | -        current.y -= x * textHScale;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        current.x += x * textHScale;
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        switch (type) {
 | 
											
												
													
														|  | 
 |  | +          case 'Font':
 | 
											
												
													
														|  | 
 |  | +            var exportedData = data[2];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'x',
 |  | 
 | 
											
												
													
														|  | -                                   current.xcoords.map(pf).join(' '));
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'font-size',
 |  | 
 | 
											
												
													
														|  | -                                   pf(current.fontSize) + 'px');
 |  | 
 | 
											
												
													
														|  | -      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
 |  | 
 | 
											
												
													
														|  | -        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
 |  | 
 | 
											
												
													
														|  | -        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      if (current.fillColor !== SVG_DEFAULTS.fillColor) {
 |  | 
 | 
											
												
													
														|  | -        current.tspan.setAttributeNS(null, 'fill', current.fillColor);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +            var font;
 | 
											
												
													
														|  | 
 |  | +            if ('error' in exportedData) {
 | 
											
												
													
														|  | 
 |  | +              var error = exportedData.error;
 | 
											
												
													
														|  | 
 |  | +              warn('Error during font loading: ' + error);
 | 
											
												
													
														|  | 
 |  | +              this.commonObjs.resolve(id, error);
 | 
											
												
													
														|  | 
 |  | +              break;
 | 
											
												
													
														|  | 
 |  | +            } else {
 | 
											
												
													
														|  | 
 |  | +              font = new FontFaceObject(exportedData);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            this.fontLoader.bind(
 | 
											
												
													
														|  | 
 |  | +              [font],
 | 
											
												
													
														|  | 
 |  | +              function fontReady(fontObjs) {
 | 
											
												
													
														|  | 
 |  | +                this.commonObjs.resolve(id, font);
 | 
											
												
													
														|  | 
 |  | +              }.bind(this)
 | 
											
												
													
														|  | 
 |  | +            );
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'FontPath':
 | 
											
												
													
														|  | 
 |  | +            this.commonObjs.resolve(id, data[2]);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          default:
 | 
											
												
													
														|  | 
 |  | +            error('Got unknown common object type ' + type);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('obj', function transportObj(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var id = data[0];
 | 
											
												
													
														|  | 
 |  | +        var pageIndex = data[1];
 | 
											
												
													
														|  | 
 |  | +        var type = data[2];
 | 
											
												
													
														|  | 
 |  | +        var pageProxy = this.pageCache[pageIndex];
 | 
											
												
													
														|  | 
 |  | +        var imageData;
 | 
											
												
													
														|  | 
 |  | +        if (pageProxy.objs.hasData(id)) {
 | 
											
												
													
														|  | 
 |  | +          return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        switch (type) {
 | 
											
												
													
														|  | 
 |  | +          case 'JpegStream':
 | 
											
												
													
														|  | 
 |  | +            imageData = data[3];
 | 
											
												
													
														|  | 
 |  | +            loadJpegStream(id, imageData, pageProxy.objs);
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          case 'Image':
 | 
											
												
													
														|  | 
 |  | +            imageData = data[3];
 | 
											
												
													
														|  | 
 |  | +            pageProxy.objs.resolve(id, imageData);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            // heuristics that will allow not to store large data
 | 
											
												
													
														|  | 
 |  | +            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
 | 
											
												
													
														|  | 
 |  | +            if (imageData && 'data' in imageData &&
 | 
											
												
													
														|  | 
 |  | +                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
 | 
											
												
													
														|  | 
 |  | +              pageProxy.cleanupAfterRender = true;
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            break;
 | 
											
												
													
														|  | 
 |  | +          default:
 | 
											
												
													
														|  | 
 |  | +            error('Got unknown object type ' + type);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('DocProgress', function transportDocProgress(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        var loadingTask = this.loadingTask;
 | 
											
												
													
														|  | 
 |  | +        if (loadingTask.onProgress) {
 | 
											
												
													
														|  | 
 |  | +          loadingTask.onProgress({
 | 
											
												
													
														|  | 
 |  | +            loaded: data.loaded,
 | 
											
												
													
														|  | 
 |  | +            total: data.total
 | 
											
												
													
														|  | 
 |  | +          });
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.txtElement.setAttributeNS(null, 'transform',
 |  | 
 | 
											
												
													
														|  | -                                        pm(current.textMatrix) +
 |  | 
 | 
											
												
													
														|  | -                                        ' scale(1, -1)' );
 |  | 
 | 
											
												
													
														|  | -      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
 |  | 
 | 
											
												
													
														|  | -      current.txtElement.appendChild(current.tspan);
 |  | 
 | 
											
												
													
														|  | -      current.txtgrp.appendChild(current.txtElement);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('PageError', function transportError(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.tgrp.appendChild(current.txtElement);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var page = this.pageCache[data.pageNum - 1];
 | 
											
												
													
														|  | 
 |  | +        var intentState = page.intentStates[data.intent];
 | 
											
												
													
														|  | 
 |  | +        if (intentState.displayReadyCapability) {
 | 
											
												
													
														|  | 
 |  | +          intentState.displayReadyCapability.reject(data.error);
 | 
											
												
													
														|  | 
 |  | +        } else {
 | 
											
												
													
														|  | 
 |  | +          error(data.error);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('UnsupportedFeature',
 | 
											
												
													
														|  | 
 |  | +          function transportUnsupportedFeature(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return; // Ignore any pending requests if the worker was terminated.
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        var featureId = data.featureId;
 | 
											
												
													
														|  | 
 |  | +        var loadingTask = this.loadingTask;
 | 
											
												
													
														|  | 
 |  | +        if (loadingTask.onUnsupportedFeature) {
 | 
											
												
													
														|  | 
 |  | +          loadingTask.onUnsupportedFeature(featureId);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        PDFJS.UnsupportedManager.notify(featureId);
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
 |  | 
 | 
											
												
													
														|  | -      this.setLeading(-y);
 |  | 
 | 
											
												
													
														|  | -      this.moveText(x, y);
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      messageHandler.on('JpegDecode', function(data) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          return Promise.reject('Worker was terminated');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
 |  | 
 | 
											
												
													
														|  | -      if (!this.cssStyle) {
 |  | 
 | 
											
												
													
														|  | -        this.cssStyle = document.createElementNS(NS, 'svg:style');
 |  | 
 | 
											
												
													
														|  | -        this.cssStyle.setAttributeNS(null, 'type', 'text/css');
 |  | 
 | 
											
												
													
														|  | -        this.defs.appendChild(this.cssStyle);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var imageUrl = data[0];
 | 
											
												
													
														|  | 
 |  | +        var components = data[1];
 | 
											
												
													
														|  | 
 |  | +        if (components !== 3 && components !== 1) {
 | 
											
												
													
														|  | 
 |  | +          return Promise.reject(
 | 
											
												
													
														|  | 
 |  | +            new Error('Only 3 components or 1 component can be returned'));
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
 |  | 
 | 
											
												
													
														|  | -      this.cssStyle.textContent +=
 |  | 
 | 
											
												
													
														|  | -        '@font-face { font-family: "' + fontObj.loadedName + '";' +
 |  | 
 | 
											
												
													
														|  | -        ' src: url(' + url + '); }\n';
 |  | 
 | 
											
												
													
														|  | 
 |  | +        return new Promise(function (resolve, reject) {
 | 
											
												
													
														|  | 
 |  | +          var img = new Image();
 | 
											
												
													
														|  | 
 |  | +          img.onload = function () {
 | 
											
												
													
														|  | 
 |  | +            var width = img.width;
 | 
											
												
													
														|  | 
 |  | +            var height = img.height;
 | 
											
												
													
														|  | 
 |  | +            var size = width * height;
 | 
											
												
													
														|  | 
 |  | +            var rgbaLength = size * 4;
 | 
											
												
													
														|  | 
 |  | +            var buf = new Uint8Array(size * components);
 | 
											
												
													
														|  | 
 |  | +            var tmpCanvas = createScratchCanvas(width, height);
 | 
											
												
													
														|  | 
 |  | +            var tmpCtx = tmpCanvas.getContext('2d');
 | 
											
												
													
														|  | 
 |  | +            tmpCtx.drawImage(img, 0, 0);
 | 
											
												
													
														|  | 
 |  | +            var data = tmpCtx.getImageData(0, 0, width, height).data;
 | 
											
												
													
														|  | 
 |  | +            var i, j;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +            if (components === 3) {
 | 
											
												
													
														|  | 
 |  | +              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
 | 
											
												
													
														|  | 
 |  | +                buf[j] = data[i];
 | 
											
												
													
														|  | 
 |  | +                buf[j + 1] = data[i + 1];
 | 
											
												
													
														|  | 
 |  | +                buf[j + 2] = data[i + 2];
 | 
											
												
													
														|  | 
 |  | +              }
 | 
											
												
													
														|  | 
 |  | +            } else if (components === 1) {
 | 
											
												
													
														|  | 
 |  | +              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
 | 
											
												
													
														|  | 
 |  | +                buf[j] = data[i];
 | 
											
												
													
														|  | 
 |  | +              }
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            resolve({ data: buf, width: width, height: height});
 | 
											
												
													
														|  | 
 |  | +          };
 | 
											
												
													
														|  | 
 |  | +          img.onerror = function () {
 | 
											
												
													
														|  | 
 |  | +            reject(new Error('JpegDecode failed to load image'));
 | 
											
												
													
														|  | 
 |  | +          };
 | 
											
												
													
														|  | 
 |  | +          img.src = imageUrl;
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +      }, this);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setFont: function SVGGraphics_setFont(details) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var fontObj = this.commonObjs.get(details[0]);
 |  | 
 | 
											
												
													
														|  | -      var size = details[1];
 |  | 
 | 
											
												
													
														|  | -      this.current.font = fontObj;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getData: function WorkerTransport_getData() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetData', null);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (this.embedFonts && fontObj.data &&
 |  | 
 | 
											
												
													
														|  | -          !this.embeddedFonts[fontObj.loadedName]) {
 |  | 
 | 
											
												
													
														|  | -        this.addFontStyle(fontObj);
 |  | 
 | 
											
												
													
														|  | -        this.embeddedFonts[fontObj.loadedName] = fontObj;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getPage: function WorkerTransport_getPage(pageNumber, capability) {
 | 
											
												
													
														|  | 
 |  | +      if (pageNumber <= 0 || pageNumber > this.numPages ||
 | 
											
												
													
														|  | 
 |  | +          (pageNumber|0) !== pageNumber) {
 | 
											
												
													
														|  | 
 |  | +        return Promise.reject(new Error('Invalid page request'));
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      current.fontMatrix = (fontObj.fontMatrix ?
 |  | 
 | 
											
												
													
														|  | -                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
 |  | 
 | 
											
												
													
														|  | -                                 (fontObj.bold ? 'bold' : 'normal');
 |  | 
 | 
											
												
													
														|  | -      var italic = fontObj.italic ? 'italic' : 'normal';
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (size < 0) {
 |  | 
 | 
											
												
													
														|  | -        size = -size;
 |  | 
 | 
											
												
													
														|  | -        current.fontDirection = -1;
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        current.fontDirection = 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var pageIndex = pageNumber - 1;
 | 
											
												
													
														|  | 
 |  | +      if (pageIndex in this.pagePromises) {
 | 
											
												
													
														|  | 
 |  | +        return this.pagePromises[pageIndex];
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      current.fontSize = size;
 |  | 
 | 
											
												
													
														|  | -      current.fontFamily = fontObj.loadedName;
 |  | 
 | 
											
												
													
														|  | -      current.fontWeight = bold;
 |  | 
 | 
											
												
													
														|  | -      current.fontStyle = italic;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      current.tspan = document.createElementNS(NS, 'svg:tspan');
 |  | 
 | 
											
												
													
														|  | -      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
 |  | 
 | 
											
												
													
														|  | -      current.xcoords = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var promise = this.messageHandler.sendWithPromise('GetPage', {
 | 
											
												
													
														|  | 
 |  | +        pageIndex: pageIndex
 | 
											
												
													
														|  | 
 |  | +      }).then(function (pageInfo) {
 | 
											
												
													
														|  | 
 |  | +        if (this.destroyed) {
 | 
											
												
													
														|  | 
 |  | +          throw new Error('Transport destroyed');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        var page = new PDFPageProxy(pageIndex, pageInfo, this);
 | 
											
												
													
														|  | 
 |  | +        this.pageCache[pageIndex] = page;
 | 
											
												
													
														|  | 
 |  | +        return page;
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  | 
 |  | +      this.pagePromises[pageIndex] = promise;
 | 
											
												
													
														|  | 
 |  | +      return promise;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endText: function SVGGraphics_endText() {
 |  | 
 | 
											
												
													
														|  | -      if (this.current.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        this.cgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      this.tgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Path properties
 |  | 
 | 
											
												
													
														|  | -    setLineWidth: function SVGGraphics_setLineWidth(width) {
 |  | 
 | 
											
												
													
														|  | -      this.current.lineWidth = width;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetAnnotations', {
 | 
											
												
													
														|  | 
 |  | +        pageIndex: pageIndex,
 | 
											
												
													
														|  | 
 |  | +        intent: intent,
 | 
											
												
													
														|  | 
 |  | +      });
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setLineCap: function SVGGraphics_setLineCap(style) {
 |  | 
 | 
											
												
													
														|  | -      this.current.lineCap = LINE_CAP_STYLES[style];
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getDestinations: function WorkerTransport_getDestinations() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetDestinations', null);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setLineJoin: function SVGGraphics_setLineJoin(style) {
 |  | 
 | 
											
												
													
														|  | -      this.current.lineJoin = LINE_JOIN_STYLES[style];
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getDestination: function WorkerTransport_getDestination(id) {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetDestination', { id: id });
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
 |  | 
 | 
											
												
													
														|  | -      this.current.miterLimit = limit;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getAttachments: function WorkerTransport_getAttachments() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetAttachments', null);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
 |  | 
 | 
											
												
													
														|  | -      var color = Util.makeCssRgb(r, g, b);
 |  | 
 | 
											
												
													
														|  | -      this.current.strokeColor = color;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getJavaScript: function WorkerTransport_getJavaScript() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetJavaScript', null);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
 |  | 
 | 
											
												
													
														|  | -      var color = Util.makeCssRgb(r, g, b);
 |  | 
 | 
											
												
													
														|  | -      this.current.fillColor = color;
 |  | 
 | 
											
												
													
														|  | -      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
 |  | 
 | 
											
												
													
														|  | -      this.current.xcoords = [];
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getOutline: function WorkerTransport_getOutline() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetOutline', null);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  | -    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
 |  | 
 | 
											
												
													
														|  | -      this.current.dashArray = dashArray;
 |  | 
 | 
											
												
													
														|  | -      this.current.dashPhase = dashPhase;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    getMetadata: function WorkerTransport_getMetadata() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetMetadata', null).
 | 
											
												
													
														|  | 
 |  | +        then(function transportMetadata(results) {
 | 
											
												
													
														|  | 
 |  | +        return {
 | 
											
												
													
														|  | 
 |  | +          info: results[0],
 | 
											
												
													
														|  | 
 |  | +          metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null)
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  | 
 |  | +      });
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    constructPath: function SVGGraphics_constructPath(ops, args) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var x = current.x, y = current.y;
 |  | 
 | 
											
												
													
														|  | -      current.path = document.createElementNS(NS, 'svg:path');
 |  | 
 | 
											
												
													
														|  | -      var d = [];
 |  | 
 | 
											
												
													
														|  | -      var opLength = ops.length;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    getStats: function WorkerTransport_getStats() {
 | 
											
												
													
														|  | 
 |  | +      return this.messageHandler.sendWithPromise('GetStats', null);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      for (var i = 0, j = 0; i < opLength; i++) {
 |  | 
 | 
											
												
													
														|  | -        switch (ops[i] | 0) {
 |  | 
 | 
											
												
													
														|  | -          case OPS.rectangle:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            var width = args[j++];
 |  | 
 | 
											
												
													
														|  | -            var height = args[j++];
 |  | 
 | 
											
												
													
														|  | -            var xw = x + width;
 |  | 
 | 
											
												
													
														|  | -            var yh = y + height;
 |  | 
 | 
											
												
													
														|  | -            d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),
 |  | 
 | 
											
												
													
														|  | -                   'L', pf(x), pf(yh), 'Z');
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.moveTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            d.push('M', pf(x), pf(y));
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.lineTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j++];
 |  | 
 | 
											
												
													
														|  | -            y = args[j++];
 |  | 
 | 
											
												
													
														|  | -            d.push('L', pf(x) , pf(y));
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo:
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 4];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 5];
 |  | 
 | 
											
												
													
														|  | -            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),
 |  | 
 | 
											
												
													
														|  | -                   pf(args[j + 3]), pf(x), pf(y));
 |  | 
 | 
											
												
													
														|  | -            j += 6;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo2:
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 2];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 3];
 |  | 
 | 
											
												
													
														|  | -            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),
 |  | 
 | 
											
												
													
														|  | -                   pf(args[j + 2]), pf(args[j + 3]));
 |  | 
 | 
											
												
													
														|  | -            j += 4;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.curveTo3:
 |  | 
 | 
											
												
													
														|  | -            x = args[j + 2];
 |  | 
 | 
											
												
													
														|  | -            y = args[j + 3];
 |  | 
 | 
											
												
													
														|  | -            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
 |  | 
 | 
											
												
													
														|  | -                   pf(x), pf(y));
 |  | 
 | 
											
												
													
														|  | -            j += 4;
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case OPS.closePath:
 |  | 
 | 
											
												
													
														|  | -            d.push('Z');
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    startCleanup: function WorkerTransport_startCleanup() {
 | 
											
												
													
														|  | 
 |  | +      this.messageHandler.sendWithPromise('Cleanup', null).
 | 
											
												
													
														|  | 
 |  | +        then(function endCleanup() {
 | 
											
												
													
														|  | 
 |  | +        for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +          var page = this.pageCache[i];
 | 
											
												
													
														|  | 
 |  | +          if (page) {
 | 
											
												
													
														|  | 
 |  | +            page.cleanup();
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'd', d.join(' '));
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-miterlimit',
 |  | 
 | 
											
												
													
														|  | -                                  pf(current.miterLimit));
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-width',
 |  | 
 | 
											
												
													
														|  | -                                  pf(current.lineWidth) + 'px');
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-dasharray',
 |  | 
 | 
											
												
													
														|  | -                                  current.dashArray.map(pf).join(' '));
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'stroke-dashoffset',
 |  | 
 | 
											
												
													
														|  | -                                  pf(current.dashPhase) + 'px');
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'fill', 'none');
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.commonObjs.clear();
 | 
											
												
													
														|  | 
 |  | +        this.fontLoader.clear();
 | 
											
												
													
														|  | 
 |  | +      }.bind(this));
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return WorkerTransport;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.tgrp.appendChild(current.path);
 |  | 
 | 
											
												
													
														|  | -      if (current.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        this.cgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * A PDF document and page is built of many objects. E.g. there are objects
 | 
											
												
													
														|  | 
 |  | + * for fonts, images, rendering code and such. These objects might get processed
 | 
											
												
													
														|  | 
 |  | + * inside of a worker. The `PDFObjects` implements some basic functions to
 | 
											
												
													
														|  | 
 |  | + * manage these objects.
 | 
											
												
													
														|  | 
 |  | + * @ignore
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var PDFObjects = (function PDFObjectsClosure() {
 | 
											
												
													
														|  | 
 |  | +  function PDFObjects() {
 | 
											
												
													
														|  | 
 |  | +    this.objs = {};
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  PDFObjects.prototype = {
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Internal function.
 | 
											
												
													
														|  | 
 |  | +     * Ensures there is an object defined for `objId`.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    ensureObj: function PDFObjects_ensureObj(objId) {
 | 
											
												
													
														|  | 
 |  | +      if (this.objs[objId]) {
 | 
											
												
													
														|  | 
 |  | +        return this.objs[objId];
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      // Saving a reference in current.element so that it can be addressed
 |  | 
 | 
											
												
													
														|  | -      // in 'fill' and 'stroke'
 |  | 
 | 
											
												
													
														|  | -      current.element = current.path;
 |  | 
 | 
											
												
													
														|  | -      current.setCurrentPoint(x, y);
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      var obj = {
 | 
											
												
													
														|  | 
 |  | +        capability: createPromiseCapability(),
 | 
											
												
													
														|  | 
 |  | +        data: null,
 | 
											
												
													
														|  | 
 |  | +        resolved: false
 | 
											
												
													
														|  | 
 |  | +      };
 | 
											
												
													
														|  | 
 |  | +      this.objs[objId] = obj;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      return obj;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    endPath: function SVGGraphics_endPath() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      if (current.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        this.cgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * If called *without* callback, this returns the data of `objId` but the
 | 
											
												
													
														|  | 
 |  | +     * object needs to be resolved. If it isn't, this function throws.
 | 
											
												
													
														|  | 
 |  | +     *
 | 
											
												
													
														|  | 
 |  | +     * If called *with* a callback, the callback is called with the data of the
 | 
											
												
													
														|  | 
 |  | +     * object once the object is resolved. That means, if you call this
 | 
											
												
													
														|  | 
 |  | +     * function and the object is already resolved, the callback gets called
 | 
											
												
													
														|  | 
 |  | +     * right away.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get: function PDFObjects_get(objId, callback) {
 | 
											
												
													
														|  | 
 |  | +      // If there is a callback, then the get can be async and the object is
 | 
											
												
													
														|  | 
 |  | +      // not required to be resolved right now
 | 
											
												
													
														|  | 
 |  | +      if (callback) {
 | 
											
												
													
														|  | 
 |  | +        this.ensureObj(objId).capability.promise.then(callback);
 | 
											
												
													
														|  | 
 |  | +        return null;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.tgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    clip: function SVGGraphics_clip(type) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      // Add current path to clipping path
 |  | 
 | 
											
												
													
														|  | -      current.clipId = 'clippath' + clipCount;
 |  | 
 | 
											
												
													
														|  | -      clipCount++;
 |  | 
 | 
											
												
													
														|  | -      this.clippath = document.createElementNS(NS, 'svg:clipPath');
 |  | 
 | 
											
												
													
														|  | -      this.clippath.setAttributeNS(null, 'id', current.clipId);
 |  | 
 | 
											
												
													
														|  | -      var clipElement = current.element.cloneNode();
 |  | 
 | 
											
												
													
														|  | -      if (type === 'evenodd') {
 |  | 
 | 
											
												
													
														|  | -        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
 |  | 
 | 
											
												
													
														|  | 
 |  | +      // If there isn't a callback, the user expects to get the resolved data
 | 
											
												
													
														|  | 
 |  | +      // directly.
 | 
											
												
													
														|  | 
 |  | +      var obj = this.objs[objId];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      // If there isn't an object yet or the object isn't resolved, then the
 | 
											
												
													
														|  | 
 |  | +      // data isn't ready yet!
 | 
											
												
													
														|  | 
 |  | +      if (!obj || !obj.resolved) {
 | 
											
												
													
														|  | 
 |  | +        error('Requesting object that isn\'t resolved yet ' + objId);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
 |  | 
 | 
											
												
													
														|  | -      this.clippath.appendChild(clipElement);
 |  | 
 | 
											
												
													
														|  | -      this.defs.appendChild(this.clippath);
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      // Create a new group with that attribute
 |  | 
 | 
											
												
													
														|  | -      current.pendingClip = true;
 |  | 
 | 
											
												
													
														|  | -      this.cgrp = document.createElementNS(NS, 'svg:g');
 |  | 
 | 
											
												
													
														|  | -      this.cgrp.setAttributeNS(null, 'clip-path',
 |  | 
 | 
											
												
													
														|  | -                               'url(#' + current.clipId + ')');
 |  | 
 | 
											
												
													
														|  | -      this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      return obj.data;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    closePath: function SVGGraphics_closePath() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var d = current.path.getAttributeNS(null, 'd');
 |  | 
 | 
											
												
													
														|  | -      d += 'Z';
 |  | 
 | 
											
												
													
														|  | -      current.path.setAttributeNS(null, 'd', d);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Resolves the object `objId` with optional `data`.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    resolve: function PDFObjects_resolve(objId, data) {
 | 
											
												
													
														|  | 
 |  | +      var obj = this.ensureObj(objId);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      obj.resolved = true;
 | 
											
												
													
														|  | 
 |  | +      obj.data = data;
 | 
											
												
													
														|  | 
 |  | +      obj.capability.resolve(data);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setLeading: function SVGGraphics_setLeading(leading) {
 |  | 
 | 
											
												
													
														|  | -      this.current.leading = -leading;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    isResolved: function PDFObjects_isResolved(objId) {
 | 
											
												
													
														|  | 
 |  | +      var objs = this.objs;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      if (!objs[objId]) {
 | 
											
												
													
														|  | 
 |  | +        return false;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        return objs[objId].resolved;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setTextRise: function SVGGraphics_setTextRise(textRise) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textRise = textRise;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    hasData: function PDFObjects_hasData(objId) {
 | 
											
												
													
														|  | 
 |  | +      return this.isResolved(objId);
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setHScale: function SVGGraphics_setHScale(scale) {
 |  | 
 | 
											
												
													
														|  | -      this.current.textHScale = scale / 100;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Returns the data of `objId` if object exists, null otherwise.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    getData: function PDFObjects_getData(objId) {
 | 
											
												
													
														|  | 
 |  | +      var objs = this.objs;
 | 
											
												
													
														|  | 
 |  | +      if (!objs[objId] || !objs[objId].resolved) {
 | 
											
												
													
														|  | 
 |  | +        return null;
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        return objs[objId].data;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    setGState: function SVGGraphics_setGState(states) {
 |  | 
 | 
											
												
													
														|  | -      for (var i = 0, ii = states.length; i < ii; i++) {
 |  | 
 | 
											
												
													
														|  | -        var state = states[i];
 |  | 
 | 
											
												
													
														|  | -        var key = state[0];
 |  | 
 | 
											
												
													
														|  | -        var value = state[1];
 |  | 
 | 
											
												
													
														|  | 
 |  | +    clear: function PDFObjects_clear() {
 | 
											
												
													
														|  | 
 |  | +      this.objs = {};
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +  return PDFObjects;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        switch (key) {
 |  | 
 | 
											
												
													
														|  | -          case 'LW':
 |  | 
 | 
											
												
													
														|  | -            this.setLineWidth(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'LC':
 |  | 
 | 
											
												
													
														|  | -            this.setLineCap(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'LJ':
 |  | 
 | 
											
												
													
														|  | -            this.setLineJoin(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'ML':
 |  | 
 | 
											
												
													
														|  | -            this.setMiterLimit(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'D':
 |  | 
 | 
											
												
													
														|  | -            this.setDash(value[0], value[1]);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'RI':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'FL':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'Font':
 |  | 
 | 
											
												
													
														|  | -            this.setFont(value);
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'CA':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'ca':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'BM':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -          case 'SMask':
 |  | 
 | 
											
												
													
														|  | -            break;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Allows controlling of the rendering tasks.
 | 
											
												
													
														|  | 
 |  | + * @class
 | 
											
												
													
														|  | 
 |  | + * @alias RenderTask
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var RenderTask = (function RenderTaskClosure() {
 | 
											
												
													
														|  | 
 |  | +  function RenderTask(internalRenderTask) {
 | 
											
												
													
														|  | 
 |  | +    this._internalRenderTask = internalRenderTask;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Callback for incremental rendering -- a function that will be called
 | 
											
												
													
														|  | 
 |  | +     * each time the rendering is paused.  To continue rendering call the
 | 
											
												
													
														|  | 
 |  | +     * function that is the first argument to the callback.
 | 
											
												
													
														|  | 
 |  | +     * @type {function}
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    this.onContinue = null;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  RenderTask.prototype = /** @lends RenderTask.prototype */ {
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Promise for rendering task completion.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise}
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    get promise() {
 | 
											
												
													
														|  | 
 |  | +      return this._internalRenderTask.capability.promise;
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    fill: function SVGGraphics_fill() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      current.element.setAttributeNS(null, 'fill', current.fillColor);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Cancels the rendering task. If the task is currently rendering it will
 | 
											
												
													
														|  | 
 |  | +     * not be cancelled until graphics pauses with a timeout. The promise that
 | 
											
												
													
														|  | 
 |  | +     * this object extends will resolved when cancelled.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    cancel: function RenderTask_cancel() {
 | 
											
												
													
														|  | 
 |  | +      this._internalRenderTask.cancel();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    stroke: function SVGGraphics_stroke() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      current.element.setAttributeNS(null, 'stroke', current.strokeColor);
 |  | 
 | 
											
												
													
														|  | -      current.element.setAttributeNS(null, 'fill', 'none');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * Registers callbacks to indicate the rendering task completion.
 | 
											
												
													
														|  | 
 |  | +     *
 | 
											
												
													
														|  | 
 |  | +     * @param {function} onFulfilled The callback for the rendering completion.
 | 
											
												
													
														|  | 
 |  | +     * @param {function} onRejected The callback for the rendering failure.
 | 
											
												
													
														|  | 
 |  | +     * @return {Promise} A promise that is resolved after the onFulfilled or
 | 
											
												
													
														|  | 
 |  | +     *                   onRejected callback.
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    then: function RenderTask_then(onFulfilled, onRejected) {
 | 
											
												
													
														|  | 
 |  | +      return this.promise.then.apply(this.promise, arguments);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  return RenderTask;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * For internal use only.
 | 
											
												
													
														|  | 
 |  | + * @ignore
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +var InternalRenderTask = (function InternalRenderTaskClosure() {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    eoFill: function SVGGraphics_eoFill() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      current.element.setAttributeNS(null, 'fill', current.fillColor);
 |  | 
 | 
											
												
													
														|  | -      current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
 | 
											
												
													
														|  | 
 |  | +                              pageNumber) {
 | 
											
												
													
														|  | 
 |  | +    this.callback = callback;
 | 
											
												
													
														|  | 
 |  | +    this.params = params;
 | 
											
												
													
														|  | 
 |  | +    this.objs = objs;
 | 
											
												
													
														|  | 
 |  | +    this.commonObjs = commonObjs;
 | 
											
												
													
														|  | 
 |  | +    this.operatorListIdx = null;
 | 
											
												
													
														|  | 
 |  | +    this.operatorList = operatorList;
 | 
											
												
													
														|  | 
 |  | +    this.pageNumber = pageNumber;
 | 
											
												
													
														|  | 
 |  | +    this.running = false;
 | 
											
												
													
														|  | 
 |  | +    this.graphicsReadyCallback = null;
 | 
											
												
													
														|  | 
 |  | +    this.graphicsReady = false;
 | 
											
												
													
														|  | 
 |  | +    this.useRequestAnimationFrame = false;
 | 
											
												
													
														|  | 
 |  | +    this.cancelled = false;
 | 
											
												
													
														|  | 
 |  | +    this.capability = createPromiseCapability();
 | 
											
												
													
														|  | 
 |  | +    this.task = new RenderTask(this);
 | 
											
												
													
														|  | 
 |  | +    // caching this-bound methods
 | 
											
												
													
														|  | 
 |  | +    this._continueBound = this._continue.bind(this);
 | 
											
												
													
														|  | 
 |  | +    this._scheduleNextBound = this._scheduleNext.bind(this);
 | 
											
												
													
														|  | 
 |  | +    this._nextBound = this._next.bind(this);
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    fillStroke: function SVGGraphics_fillStroke() {
 |  | 
 | 
											
												
													
														|  | -      // Order is important since stroke wants fill to be none.
 |  | 
 | 
											
												
													
														|  | -      // First stroke, then if fill needed, it will be overwritten.
 |  | 
 | 
											
												
													
														|  | -      this.stroke();
 |  | 
 | 
											
												
													
														|  | -      this.fill();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  InternalRenderTask.prototype = {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    eoFillStroke: function SVGGraphics_eoFillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
 |  | 
 | 
											
												
													
														|  | -      this.fillStroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +    initalizeGraphics:
 | 
											
												
													
														|  | 
 |  | +        function InternalRenderTask_initalizeGraphics(transparency) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    closeStroke: function SVGGraphics_closeStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.closePath();
 |  | 
 | 
											
												
													
														|  | -      this.stroke();
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.cancelled) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
 | 
											
												
													
														|  | 
 |  | +          globalScope.StepperManager.enabled) {
 | 
											
												
													
														|  | 
 |  | +        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
 | 
											
												
													
														|  | 
 |  | +        this.stepper.init(this.operatorList);
 | 
											
												
													
														|  | 
 |  | +        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    closeFillStroke: function SVGGraphics_closeFillStroke() {
 |  | 
 | 
											
												
													
														|  | -      this.closePath();
 |  | 
 | 
											
												
													
														|  | -      this.fillStroke();
 |  | 
 | 
											
												
													
														|  | 
 |  | +      var params = this.params;
 | 
											
												
													
														|  | 
 |  | +      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
 | 
											
												
													
														|  | 
 |  | +                                    this.objs, params.imageLayer);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +      this.gfx.beginDrawing(params.transform, params.viewport, transparency);
 | 
											
												
													
														|  | 
 |  | +      this.operatorListIdx = 0;
 | 
											
												
													
														|  | 
 |  | +      this.graphicsReady = true;
 | 
											
												
													
														|  | 
 |  | +      if (this.graphicsReadyCallback) {
 | 
											
												
													
														|  | 
 |  | +        this.graphicsReadyCallback();
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintSolidColorImageMask:
 |  | 
 | 
											
												
													
														|  | -        function SVGGraphics_paintSolidColorImageMask() {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var rect = document.createElementNS(NS, 'svg:rect');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'x', '0');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'y', '0');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'width', '1px');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'height', '1px');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'fill', current.fillColor);
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.appendChild(rect);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    cancel: function InternalRenderTask_cancel() {
 | 
											
												
													
														|  | 
 |  | +      this.running = false;
 | 
											
												
													
														|  | 
 |  | +      this.cancelled = true;
 | 
											
												
													
														|  | 
 |  | +      this.callback('cancelled');
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var imgObj = this.objs.get(objId);
 |  | 
 | 
											
												
													
														|  | -      var imgEl = document.createElementNS(NS, 'svg:image');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'x', '0');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'y', pf(-h));
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'transform',
 |  | 
 | 
											
												
													
														|  | -                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
 |  | 
 | 
											
												
													
														|  | 
 |  | +    operatorListChanged: function InternalRenderTask_operatorListChanged() {
 | 
											
												
													
														|  | 
 |  | +      if (!this.graphicsReady) {
 | 
											
												
													
														|  | 
 |  | +        if (!this.graphicsReadyCallback) {
 | 
											
												
													
														|  | 
 |  | +          this.graphicsReadyCallback = this._continueBound;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      this.tgrp.appendChild(imgEl);
 |  | 
 | 
											
												
													
														|  | -      if (current.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        this.cgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.stepper) {
 | 
											
												
													
														|  | 
 |  | +        this.stepper.updateOperatorList(this.operatorList);
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
 |  | 
 | 
											
												
													
														|  | -      var imgData = this.objs.get(objId);
 |  | 
 | 
											
												
													
														|  | -      if (!imgData) {
 |  | 
 | 
											
												
													
														|  | -        warn('Dependent image isn\'t ready yet');
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.running) {
 | 
											
												
													
														|  |          return;
 |  |          return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      this.paintInlineImageXObject(imgData);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      this._continue();
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintInlineImageXObject:
 |  | 
 | 
											
												
													
														|  | -        function SVGGraphics_paintInlineImageXObject(imgData, mask) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var imgSrc = convertImgDataToPng(imgData);
 |  | 
 | 
											
												
													
														|  | -      var cliprect = document.createElementNS(NS, 'svg:rect');
 |  | 
 | 
											
												
													
														|  | -      cliprect.setAttributeNS(null, 'x', '0');
 |  | 
 | 
											
												
													
														|  | -      cliprect.setAttributeNS(null, 'y', '0');
 |  | 
 | 
											
												
													
														|  | -      cliprect.setAttributeNS(null, 'width', pf(width));
 |  | 
 | 
											
												
													
														|  | -      cliprect.setAttributeNS(null, 'height', pf(height));
 |  | 
 | 
											
												
													
														|  | -      current.element = cliprect;
 |  | 
 | 
											
												
													
														|  | -      this.clip('nonzero');
 |  | 
 | 
											
												
													
														|  | -      var imgEl = document.createElementNS(NS, 'svg:image');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'x', '0');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'y', pf(-height));
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
 |  | 
 | 
											
												
													
														|  | -      imgEl.setAttributeNS(null, 'transform',
 |  | 
 | 
											
												
													
														|  | -                           'scale(' + pf(1 / width) + ' ' +
 |  | 
 | 
											
												
													
														|  | -                           pf(-1 / height) + ')');
 |  | 
 | 
											
												
													
														|  | -      if (mask) {
 |  | 
 | 
											
												
													
														|  | -        mask.appendChild(imgEl);
 |  | 
 | 
											
												
													
														|  | -      } else {
 |  | 
 | 
											
												
													
														|  | -        this.tgrp.appendChild(imgEl);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    _continue: function InternalRenderTask__continue() {
 | 
											
												
													
														|  | 
 |  | +      this.running = true;
 | 
											
												
													
														|  | 
 |  | +      if (this.cancelled) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | -      if (current.pendingClip) {
 |  | 
 | 
											
												
													
														|  | -        this.cgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.cgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +      if (this.task.onContinue) {
 | 
											
												
													
														|  | 
 |  | +        this.task.onContinue.call(this.task, this._scheduleNextBound);
 | 
											
												
													
														|  |        } else {
 |  |        } else {
 | 
											
												
													
														|  | -        this.pgrp.appendChild(this.tgrp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this._scheduleNext();
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintImageMaskXObject:
 |  | 
 | 
											
												
													
														|  | -        function SVGGraphics_paintImageMaskXObject(imgData) {
 |  | 
 | 
											
												
													
														|  | -      var current = this.current;
 |  | 
 | 
											
												
													
														|  | -      var width = imgData.width;
 |  | 
 | 
											
												
													
														|  | -      var height = imgData.height;
 |  | 
 | 
											
												
													
														|  | -      var fillColor = current.fillColor;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      current.maskId = 'mask' + maskCount++;
 |  | 
 | 
											
												
													
														|  | -      var mask = document.createElementNS(NS, 'svg:mask');
 |  | 
 | 
											
												
													
														|  | -      mask.setAttributeNS(null, 'id', current.maskId);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      var rect = document.createElementNS(NS, 'svg:rect');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'x', '0');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'y', '0');
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'width', pf(width));
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'height', pf(height));
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'fill', fillColor);
 |  | 
 | 
											
												
													
														|  | -      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');
 |  | 
 | 
											
												
													
														|  | -      this.defs.appendChild(mask);
 |  | 
 | 
											
												
													
														|  | -      this.tgrp.appendChild(rect);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      this.paintInlineImageXObject(imgData, mask);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    _scheduleNext: function InternalRenderTask__scheduleNext() {
 | 
											
												
													
														|  | 
 |  | +      if (this.useRequestAnimationFrame) {
 | 
											
												
													
														|  | 
 |  | +        window.requestAnimationFrame(this._nextBound);
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        Promise.resolve(undefined).then(this._nextBound);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintFormXObjectBegin:
 |  | 
 | 
											
												
													
														|  | -        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
 |  | 
 | 
											
												
													
														|  | -      this.save();
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -      if (isArray(matrix) && matrix.length === 6) {
 |  | 
 | 
											
												
													
														|  | -        this.transform(matrix[0], matrix[1], matrix[2],
 |  | 
 | 
											
												
													
														|  | -                       matrix[3], matrix[4], matrix[5]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    _next: function InternalRenderTask__next() {
 | 
											
												
													
														|  | 
 |  | +      if (this.cancelled) {
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
 | 
											
												
													
														|  | 
 |  | +                                        this.operatorListIdx,
 | 
											
												
													
														|  | 
 |  | +                                        this._continueBound,
 | 
											
												
													
														|  | 
 |  | +                                        this.stepper);
 | 
											
												
													
														|  | 
 |  | +      if (this.operatorListIdx === this.operatorList.argsArray.length) {
 | 
											
												
													
														|  | 
 |  | +        this.running = false;
 | 
											
												
													
														|  | 
 |  | +        if (this.operatorList.lastChunk) {
 | 
											
												
													
														|  | 
 |  | +          this.gfx.endDrawing();
 | 
											
												
													
														|  | 
 |  | +          this.callback();
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -      if (isArray(bbox) && bbox.length === 4) {
 |  | 
 | 
											
												
													
														|  | -        var width = bbox[2] - bbox[0];
 |  | 
 | 
											
												
													
														|  | -        var height = bbox[3] - bbox[1];
 |  | 
 | 
											
												
													
														|  | 
 |  | +  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        var cliprect = document.createElementNS(NS, 'svg:rect');
 |  | 
 | 
											
												
													
														|  | -        cliprect.setAttributeNS(null, 'x', bbox[0]);
 |  | 
 | 
											
												
													
														|  | -        cliprect.setAttributeNS(null, 'y', bbox[1]);
 |  | 
 | 
											
												
													
														|  | -        cliprect.setAttributeNS(null, 'width', pf(width));
 |  | 
 | 
											
												
													
														|  | -        cliprect.setAttributeNS(null, 'height', pf(height));
 |  | 
 | 
											
												
													
														|  | -        this.current.element = cliprect;
 |  | 
 | 
											
												
													
														|  | -        this.clip('nonzero');
 |  | 
 | 
											
												
													
														|  | -        this.endPath();
 |  | 
 | 
											
												
													
														|  | -      }
 |  | 
 | 
											
												
													
														|  | -    },
 |  | 
 | 
											
												
													
														|  | 
 |  | +  return InternalRenderTask;
 | 
											
												
													
														|  | 
 |  | +})();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    paintFormXObjectEnd:
 |  | 
 | 
											
												
													
														|  | -        function SVGGraphics_paintFormXObjectEnd() {
 |  | 
 | 
											
												
													
														|  | -      this.restore();
 |  | 
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * (Deprecated) Global observer of unsupported feature usages. Use
 | 
											
												
													
														|  | 
 |  | + * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance.
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() {
 | 
											
												
													
														|  | 
 |  | +  var listeners = [];
 | 
											
												
													
														|  | 
 |  | +  return {
 | 
											
												
													
														|  | 
 |  | +    listen: function (cb) {
 | 
											
												
													
														|  | 
 |  | +      deprecated('Global UnsupportedManager.listen is used: ' +
 | 
											
												
													
														|  | 
 |  | +                 ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');
 | 
											
												
													
														|  | 
 |  | +      listeners.push(cb);
 | 
											
												
													
														|  | 
 |  | +    },
 | 
											
												
													
														|  | 
 |  | +    notify: function (featureId) {
 | 
											
												
													
														|  | 
 |  | +      for (var i = 0, ii = listeners.length; i < ii; i++) {
 | 
											
												
													
														|  | 
 |  | +        listeners[i](featureId);
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  | -  return SVGGraphics;
 |  | 
 | 
											
												
													
														|  |  })();
 |  |  })();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -PDFJS.SVGGraphics = SVGGraphics;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -exports.SVGGraphics = SVGGraphics;
 |  | 
 | 
											
												
													
														|  | 
 |  | +exports.getDocument = PDFJS.getDocument;
 | 
											
												
													
														|  | 
 |  | +exports.PDFDataRangeTransport = PDFDataRangeTransport;
 | 
											
												
													
														|  | 
 |  | +exports.PDFDocumentProxy = PDFDocumentProxy;
 | 
											
												
													
														|  | 
 |  | +exports.PDFPageProxy = PDFPageProxy;
 | 
											
												
													
														|  |  }));
 |  |  }));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 |