| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766 | 
							- /**
 
-  * @licstart The following is the entire license notice for the
 
-  * Javascript code in this page
 
-  *
 
-  * Copyright 2017 Mozilla Foundation
 
-  *
 
-  * Licensed under the Apache License, Version 2.0 (the "License");
 
-  * you may not use this file except in compliance with the License.
 
-  * You may obtain a copy of the License at
 
-  *
 
-  *     http://www.apache.org/licenses/LICENSE-2.0
 
-  *
 
-  * Unless required by applicable law or agreed to in writing, software
 
-  * distributed under the License is distributed on an "AS IS" BASIS,
 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-  * See the License for the specific language governing permissions and
 
-  * limitations under the License.
 
-  *
 
-  * @licend The above is the entire license notice for the
 
-  * Javascript code in this page
 
-  */
 
- 'use strict';
 
- Object.defineProperty(exports, "__esModule", {
 
-   value: true
 
- });
 
- exports.CanvasGraphics = undefined;
 
- var _util = require('../shared/util');
 
- var _pattern_helper = require('./pattern_helper');
 
- var MIN_FONT_SIZE = 16;
 
- var MAX_FONT_SIZE = 100;
 
- var MAX_GROUP_SIZE = 4096;
 
- var MIN_WIDTH_FACTOR = 0.65;
 
- var COMPILE_TYPE3_GLYPHS = true;
 
- var MAX_SIZE_TO_COMPILE = 1000;
 
- var FULL_CHUNK_HEIGHT = 16;
 
- var IsLittleEndianCached = {
 
-   get value() {
 
-     return (0, _util.shadow)(IsLittleEndianCached, 'value', (0, _util.isLittleEndian)());
 
-   }
 
- };
 
- function addContextCurrentTransform(ctx) {
 
-   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;
 
-     ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
 
-     ctx._transformStack = [];
 
-     Object.defineProperty(ctx, 'mozCurrentTransform', {
 
-       get: function getCurrentTransform() {
 
-         return this._transformMatrix;
 
-       }
 
-     });
 
-     Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
 
-       get: function getCurrentTransformInverse() {
 
-         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;
 
-         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];
 
-       }
 
-     });
 
-     ctx.save = function ctxSave() {
 
-       var old = this._transformMatrix;
 
-       this._transformStack.push(old);
 
-       this._transformMatrix = old.slice(0, 6);
 
-       this._originalSave();
 
-     };
 
-     ctx.restore = function ctxRestore() {
 
-       var prev = this._transformStack.pop();
 
-       if (prev) {
 
-         this._transformMatrix = prev;
 
-         this._originalRestore();
 
-       }
 
-     };
 
-     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);
 
-     };
 
-     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._originalScale(x, y);
 
-     };
 
-     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]];
 
-       ctx._originalTransform(a, b, c, d, e, f);
 
-     };
 
-     ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
 
-       this._transformMatrix = [a, b, c, d, e, f];
 
-       ctx._originalSetTransform(a, b, c, d, e, f);
 
-     };
 
-     ctx.rotate = function ctxRotate(angle) {
 
-       var cosValue = Math.cos(angle);
 
-       var sinValue = Math.sin(angle);
 
-       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]];
 
-       this._originalRotate(angle);
 
-     };
 
-   }
 
- }
 
- var CachedCanvases = function CachedCanvasesClosure() {
 
-   function CachedCanvases(canvasFactory) {
 
-     this.canvasFactory = canvasFactory;
 
-     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];
 
-         this.canvasFactory.reset(canvasEntry, width, height);
 
-         canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
 
-       } else {
 
-         canvasEntry = this.canvasFactory.create(width, height);
 
-         this.cache[id] = canvasEntry;
 
-       }
 
-       if (trackTransform) {
 
-         addContextCurrentTransform(canvasEntry.context);
 
-       }
 
-       return canvasEntry;
 
-     },
 
-     clear: function clear() {
 
-       for (var id in this.cache) {
 
-         var canvasEntry = this.cache[id];
 
-         this.canvasFactory.destroy(canvasEntry);
 
-         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]);
 
-   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;
 
-     }
 
-   }
 
-   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;
 
-     }
 
-     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;
 
-     }
 
-     if (count > POINT_TO_PROCESS_LIMIT) {
 
-       return null;
 
-     }
 
-   }
 
-   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;
 
-   }
 
-   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];
 
-     var type = points[p],
 
-         p0 = p,
 
-         pp;
 
-     do {
 
-       var step = steps[type];
 
-       do {
 
-         p += step;
 
-       } while (!points[p]);
 
-       pp = points[p];
 
-       if (pp !== 5 && pp !== 10) {
 
-         type = pp;
 
-         points[p] = 0;
 
-       } else {
 
-         type = pp & 0x33 * type >> 4;
 
-         points[p] &= type >> 2 | type << 2;
 
-       }
 
-       coords.push(p % width1);
 
-       coords.push(p / width1 | 0);
 
-       --count;
 
-     } while (p0 !== p);
 
-     outlines.push(coords);
 
-     --i;
 
-   }
 
-   var drawOutline = function drawOutline(c) {
 
-     c.save();
 
-     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();
 
-   };
 
-   return drawOutline;
 
- }
 
- var CanvasExtraState = function CanvasExtraStateClosure() {
 
-   function CanvasExtraState() {
 
-     this.alphaIsShape = false;
 
-     this.fontSize = 0;
 
-     this.fontSizeScale = 1;
 
-     this.textMatrix = _util.IDENTITY_MATRIX;
 
-     this.textMatrixScale = 1;
 
-     this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
 
-     this.leading = 0;
 
-     this.x = 0;
 
-     this.y = 0;
 
-     this.lineX = 0;
 
-     this.lineY = 0;
 
-     this.charSpacing = 0;
 
-     this.wordSpacing = 0;
 
-     this.textHScale = 1;
 
-     this.textRenderingMode = _util.TextRenderingMode.FILL;
 
-     this.textRise = 0;
 
-     this.fillColor = '#000000';
 
-     this.strokeColor = '#000000';
 
-     this.patternFill = false;
 
-     this.fillAlpha = 1;
 
-     this.strokeAlpha = 1;
 
-     this.lineWidth = 1;
 
-     this.activeSMask = null;
 
-     this.resumeSMaskCtx = null;
 
-   }
 
-   CanvasExtraState.prototype = {
 
-     clone: function CanvasExtraState_clone() {
 
-       return Object.create(this);
 
-     },
 
-     setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
 
-       this.x = x;
 
-       this.y = y;
 
-     }
 
-   };
 
-   return CanvasExtraState;
 
- }();
 
- var CanvasGraphics = function CanvasGraphicsClosure() {
 
-   var EXECUTION_TIME = 15;
 
-   var EXECUTION_STEPS = 10;
 
-   function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, 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.canvasFactory = canvasFactory;
 
-     this.webGLContext = webGLContext;
 
-     this.imageLayer = imageLayer;
 
-     this.groupStack = [];
 
-     this.processingType3 = null;
 
-     this.baseTransform = null;
 
-     this.baseTransformStack = [];
 
-     this.groupLevel = 0;
 
-     this.smaskStack = [];
 
-     this.smaskCounter = 0;
 
-     this.tempSMask = null;
 
-     this.cachedCanvases = new CachedCanvases(this.canvasFactory);
 
-     if (canvasCtx) {
 
-       addContextCurrentTransform(canvasCtx);
 
-     }
 
-     this.cachedGetSinglePixelWidth = null;
 
-   }
 
-   function putBinaryImageData(ctx, imgData) {
 
-     if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
 
-       ctx.putImageData(imgData, 0, 0);
 
-       return;
 
-     }
 
-     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 chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 
-     var srcPos = 0,
 
-         destPos;
 
-     var src = imgData.data;
 
-     var dest = chunkImgData.data;
 
-     var i, j, thisChunkHeight, elemsInThisChunk;
 
-     if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {
 
-       var srcLength = src.byteLength;
 
-       var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
 
-       var dest32DataLength = dest32.length;
 
-       var fullSrcDiff = width + 7 >> 3;
 
-       var white = 0xFFFFFFFF;
 
-       var black = IsLittleEndianCached.value ? 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;
 
-             }
 
-             dest32[destPos++] = srcByte & mask ? white : black;
 
-             mask >>= 1;
 
-           }
 
-         }
 
-         while (destPos < dest32DataLength) {
 
-           dest32[destPos++] = 0;
 
-         }
 
-         ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
 
-       }
 
-     } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {
 
-       j = 0;
 
-       elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
 
-       for (i = 0; i < fullChunks; i++) {
 
-         dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
 
-         srcPos += elemsInThisChunk;
 
-         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 === _util.ImageKind.RGB_24BPP) {
 
-       thisChunkHeight = FULL_CHUNK_HEIGHT;
 
-       elemsInThisChunk = width * thisChunkHeight;
 
-       for (i = 0; i < totalChunks; i++) {
 
-         if (i >= fullChunks) {
 
-           thisChunkHeight = partialChunkHeight;
 
-           elemsInThisChunk = width * thisChunkHeight;
 
-         }
 
-         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 {
 
-       throw new Error('bad image kind: ' + imgData.kind);
 
-     }
 
-   }
 
-   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 chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
 
-     var srcPos = 0;
 
-     var src = imgData.data;
 
-     var dest = chunkImgData.data;
 
-     for (var i = 0; i < totalChunks; i++) {
 
-       var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
 
-       var destPos = 3;
 
-       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 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;
 
-     }
 
-   }
 
-   function resetCtxToDefault(ctx) {
 
-     ctx.strokeStyle = '#000000';
 
-     ctx.fillStyle = '#000000';
 
-     ctx.fillRule = 'nonzero';
 
-     ctx.globalAlpha = 1;
 
-     ctx.lineWidth = 1;
 
-     ctx.lineCap = 'butt';
 
-     ctx.lineJoin = 'miter';
 
-     ctx.miterLimit = 10;
 
-     ctx.globalCompositeOperation = 'source-over';
 
-     ctx.font = '10px sans-serif';
 
-     if (ctx.setLineDash !== undefined) {
 
-       ctx.setLineDash([]);
 
-       ctx.lineDashOffset = 0;
 
-     }
 
-   }
 
-   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;
 
-       }
 
-     }
 
-   }
 
-   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;
 
-     }
 
-   }
 
-   function composeSMaskLuminosity(maskData, layerData, transferMap) {
 
-     var length = maskData.length;
 
-     for (var i = 3; i < length; i += 4) {
 
-       var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;
 
-       layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;
 
-     }
 
-   }
 
-   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;
 
-     var composeFn;
 
-     if (subtype === 'Luminosity') {
 
-       composeFn = composeSMaskLuminosity;
 
-     } else {
 
-       composeFn = composeSMaskAlpha;
 
-     }
 
-     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);
 
-       if (hasBackdrop) {
 
-         composeSMaskBackdrop(maskData.data, r0, g0, b0);
 
-       }
 
-       composeFn(maskData.data, layerData.data, transferMap);
 
-       maskCtx.putImageData(layerData, 0, row);
 
-     }
 
-   }
 
-   function composeSMask(ctx, smask, layerCtx, webGLContext) {
 
-     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 && webGLContext.isEnabled) {
 
-       var composed = webGLContext.composeSMask({
 
-         layer: layerCtx.canvas,
 
-         mask: mask,
 
-         properties: {
 
-           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 = {};
 
-   CanvasGraphics.prototype = {
 
-     beginDrawing: function beginDrawing(_ref) {
 
-       var transform = _ref.transform,
 
-           viewport = _ref.viewport,
 
-           transparency = _ref.transparency,
 
-           _ref$background = _ref.background,
 
-           background = _ref$background === undefined ? null : _ref$background;
 
-       var width = this.ctx.canvas.width;
 
-       var height = this.ctx.canvas.height;
 
-       this.ctx.save();
 
-       this.ctx.fillStyle = background || 'rgb(255, 255, 255)';
 
-       this.ctx.fillRect(0, 0, width, height);
 
-       this.ctx.restore();
 
-       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();
 
-         this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);
 
-       }
 
-       this.ctx.save();
 
-       resetCtxToDefault(this.ctx);
 
-       if (transform) {
 
-         this.ctx.transform.apply(this.ctx, transform);
 
-       }
 
-       this.ctx.transform.apply(this.ctx, viewport.transform);
 
-       this.baseTransform = this.ctx.mozCurrentTransform.slice();
 
-       if (this.imageLayer) {
 
-         this.imageLayer.beginLayout();
 
-       }
 
-     },
 
-     executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {
 
-       var argsArray = operatorList.argsArray;
 
-       var fnArray = operatorList.fnArray;
 
-       var i = executionStartIdx || 0;
 
-       var argsArrayLen = argsArray.length;
 
-       if (argsArrayLen === i) {
 
-         return i;
 
-       }
 
-       var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function';
 
-       var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
 
-       var steps = 0;
 
-       var commonObjs = this.commonObjs;
 
-       var objs = this.objs;
 
-       var fnId;
 
-       while (true) {
 
-         if (stepper !== undefined && i === stepper.nextBreakPoint) {
 
-           stepper.breakIt(i, continueCallback);
 
-           return i;
 
-         }
 
-         fnId = fnArray[i];
 
-         if (fnId !== _util.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;
 
-             if (!objsPool.isResolved(depObjId)) {
 
-               objsPool.get(depObjId, continueCallback);
 
-               return i;
 
-             }
 
-           }
 
-         }
 
-         i++;
 
-         if (i === argsArrayLen) {
 
-           return i;
 
-         }
 
-         if (chunkOperations && ++steps > EXECUTION_STEPS) {
 
-           if (Date.now() > endTime) {
 
-             continueCallback();
 
-             return i;
 
-           }
 
-           steps = 0;
 
-         }
 
-       }
 
-     },
 
-     endDrawing: function CanvasGraphics_endDrawing() {
 
-       if (this.current.activeSMask !== null) {
 
-         this.endSMaskGroup();
 
-       }
 
-       this.ctx.restore();
 
-       if (this.transparentCanvas) {
 
-         this.ctx = this.compositeCtx;
 
-         this.ctx.save();
 
-         this.ctx.setTransform(1, 0, 0, 1, 0, 0);
 
-         this.ctx.drawImage(this.transparentCanvas, 0, 0);
 
-         this.ctx.restore();
 
-         this.transparentCanvas = null;
 
-       }
 
-       this.cachedCanvases.clear();
 
-       this.webGLContext.clear();
 
-       if (this.imageLayer) {
 
-         this.imageLayer.endLayout();
 
-       }
 
-     },
 
-     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;
 
-       }
 
-     },
 
-     setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {},
 
-     setFlatness: function CanvasGraphics_setFlatness(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':
 
-             this.ctx.globalCompositeOperation = value;
 
-             break;
 
-           case 'SMask':
 
-             if (this.current.activeSMask) {
 
-               if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {
 
-                 this.suspendSMaskGroup();
 
-               } else {
 
-                 this.endSMaskGroup();
 
-               }
 
-             }
 
-             this.current.activeSMask = value ? this.tempSMask : null;
 
-             if (this.current.activeSMask) {
 
-               this.beginSMaskGroup();
 
-             }
 
-             this.tempSMask = null;
 
-             break;
 
-         }
 
-       }
 
-     },
 
-     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);
 
-       var currentCtx = this.ctx;
 
-       var currentTransform = currentCtx.mozCurrentTransform;
 
-       this.ctx.save();
 
-       var groupCtx = scratchCanvas.context;
 
-       groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
 
-       groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
 
-       groupCtx.transform.apply(groupCtx, currentTransform);
 
-       activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;
 
-       copyCtxState(currentCtx, groupCtx);
 
-       this.ctx = groupCtx;
 
-       this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
 
-       this.groupStack.push(currentCtx);
 
-       this.groupLevel++;
 
-     },
 
-     suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {
 
-       var groupCtx = this.ctx;
 
-       this.groupLevel--;
 
-       this.ctx = this.groupStack.pop();
 
-       composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
 
-       this.ctx.restore();
 
-       this.ctx.save();
 
-       copyCtxState(groupCtx, this.ctx);
 
-       this.current.resumeSMaskCtx = groupCtx;
 
-       var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);
 
-       this.ctx.transform.apply(this.ctx, deltaTransform);
 
-       groupCtx.save();
 
-       groupCtx.setTransform(1, 0, 0, 1, 0, 0);
 
-       groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);
 
-       groupCtx.restore();
 
-     },
 
-     resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {
 
-       var groupCtx = this.current.resumeSMaskCtx;
 
-       var currentCtx = this.ctx;
 
-       this.ctx = groupCtx;
 
-       this.groupStack.push(currentCtx);
 
-       this.groupLevel++;
 
-     },
 
-     endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
 
-       var groupCtx = this.ctx;
 
-       this.groupLevel--;
 
-       this.ctx = this.groupStack.pop();
 
-       composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
 
-       this.ctx.restore();
 
-       copyCtxState(groupCtx, this.ctx);
 
-       var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);
 
-       this.ctx.transform.apply(this.ctx, deltaTransform);
 
-     },
 
-     save: function CanvasGraphics_save() {
 
-       this.ctx.save();
 
-       var old = this.current;
 
-       this.stateStack.push(old);
 
-       this.current = old.clone();
 
-       this.current.resumeSMaskCtx = null;
 
-     },
 
-     restore: function CanvasGraphics_restore() {
 
-       if (this.current.resumeSMaskCtx) {
 
-         this.resumeSMaskGroup();
 
-       }
 
-       if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {
 
-         this.endSMaskGroup();
 
-       }
 
-       if (this.stateStack.length !== 0) {
 
-         this.current = this.stateStack.pop();
 
-         this.ctx.restore();
 
-         this.pendingClip = null;
 
-         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;
 
-     },
 
-     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 _util.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 _util.OPS.moveTo:
 
-             x = args[j++];
 
-             y = args[j++];
 
-             ctx.moveTo(x, y);
 
-             break;
 
-           case _util.OPS.lineTo:
 
-             x = args[j++];
 
-             y = args[j++];
 
-             ctx.lineTo(x, y);
 
-             break;
 
-           case _util.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 _util.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 _util.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 _util.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;
 
-       ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
 
-       ctx.globalAlpha = this.current.strokeAlpha;
 
-       if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {
 
-         ctx.save();
 
-         ctx.strokeStyle = strokeColor.getPattern(ctx, this);
 
-         ctx.stroke();
 
-         ctx.restore();
 
-       } else {
 
-         ctx.stroke();
 
-       }
 
-       if (consumePath) {
 
-         this.consumePath();
 
-       }
 
-       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) {
 
-         ctx.fill('evenodd');
 
-         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();
 
-     },
 
-     clip: function CanvasGraphics_clip() {
 
-       this.pendingClip = NORMAL_CLIP;
 
-     },
 
-     eoClip: function CanvasGraphics_eoClip() {
 
-       this.pendingClip = EO_CLIP;
 
-     },
 
-     beginText: function CanvasGraphics_beginText() {
 
-       this.current.textMatrix = _util.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) {
 
-         throw new Error('Can\'t find font for ' + fontRefName);
 
-       }
 
-       current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;
 
-       if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
 
-         (0, _util.warn)('Invalid font matrix for font ' + fontRefName);
 
-       }
 
-       if (size < 0) {
 
-         size = -size;
 
-         current.fontDirection = -1;
 
-       } else {
 
-         current.fontDirection = 1;
 
-       }
 
-       this.current.font = fontObj;
 
-       this.current.fontSize = size;
 
-       if (fontObj.isType3Font) {
 
-         return;
 
-       }
 
-       var name = fontObj.loadedName || 'sans-serif';
 
-       var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal';
 
-       var italic = fontObj.italic ? 'italic' : 'normal';
 
-       var typeface = '"' + name + '", ' + fontObj.fallbackName;
 
-       var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
 
-       this.current.fontSizeScale = size / browserFontSize;
 
-       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);
 
-       this.current.x = this.current.lineX = 0;
 
-       this.current.y = this.current.lineY = 0;
 
-     },
 
-     nextLine: function CanvasGraphics_nextLine() {
 
-       this.moveText(0, this.current.leading);
 
-     },
 
-     paintChar: function paintChar(character, x, y, patternTransform) {
 
-       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 & _util.TextRenderingMode.FILL_STROKE_MASK;
 
-       var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
 
-       var patternFill = current.patternFill && font.data;
 
-       var addToPath;
 
-       if (font.disableFontFace || isAddToPathSet || patternFill) {
 
-         addToPath = font.getPathGenerator(this.commonObjs, character);
 
-       }
 
-       if (font.disableFontFace || patternFill) {
 
-         ctx.save();
 
-         ctx.translate(x, y);
 
-         ctx.beginPath();
 
-         addToPath(ctx, fontSize);
 
-         if (patternTransform) {
 
-           ctx.setTransform.apply(ctx, patternTransform);
 
-         }
 
-         if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
 
-           ctx.fill();
 
-         }
 
-         if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
 
-           ctx.stroke();
 
-         }
 
-         ctx.restore();
 
-       } else {
 
-         if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
 
-           ctx.fillText(character, x, y);
 
-         }
 
-         if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
 
-           ctx.strokeText(character, x, y);
 
-         }
 
-       }
 
-       if (isAddToPathSet) {
 
-         var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
 
-         paths.push({
 
-           transform: ctx.mozCurrentTransform,
 
-           x: x,
 
-           y: y,
 
-           fontSize: fontSize,
 
-           addToPath: addToPath
 
-         });
 
-       }
 
-     },
 
-     get isFontSubpixelAAEnabled() {
 
-       var ctx = this.canvasFactory.create(10, 10).context;
 
-       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 (0, _util.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;
 
-       }
 
-       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 === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;
 
-       ctx.save();
 
-       var patternTransform = void 0;
 
-       if (current.patternFill) {
 
-         ctx.save();
 
-         var pattern = current.fillColor.getPattern(ctx, this);
 
-         patternTransform = ctx.mozCurrentTransform;
 
-         ctx.restore();
 
-         ctx.fillStyle = pattern;
 
-       }
 
-       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 & _util.TextRenderingMode.FILL_STROKE_MASK;
 
-         if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
 
-           this.cachedGetSinglePixelWidth = null;
 
-           lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
 
-         }
 
-       } else {
 
-         lineWidth /= scale;
 
-       }
 
-       if (fontSizeScale !== 1.0) {
 
-         ctx.scale(fontSizeScale, fontSizeScale);
 
-         lineWidth /= fontSizeScale;
 
-       }
 
-       ctx.lineWidth = lineWidth;
 
-       var x = 0,
 
-           i;
 
-       for (i = 0; i < glyphsLength; ++i) {
 
-         var glyph = glyphs[i];
 
-         if ((0, _util.isNum)(glyph)) {
 
-           x += spacingDir * glyph * fontSize / 1000;
 
-           continue;
 
-         }
 
-         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;
 
-           width = vmetric ? -vmetric[0] : width;
 
-           scaledX = vx / fontSizeScale;
 
-           scaledY = (x + vy) / fontSizeScale;
 
-         } else {
 
-           scaledX = x / fontSizeScale;
 
-           scaledY = 0;
 
-         }
 
-         if (font.remeasure && width > 0) {
 
-           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 (glyph.isInFont || font.missingFile) {
 
-           if (simpleFillText && !accent) {
 
-             ctx.fillText(character, scaledX, scaledY);
 
-           } else {
 
-             this.paintChar(character, scaledX, scaledY, patternTransform);
 
-             if (accent) {
 
-               scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
 
-               scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
 
-               this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);
 
-             }
 
-           }
 
-         }
 
-         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();
 
-     },
 
-     showType3Text: function CanvasGraphics_showType3Text(glyphs) {
 
-       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 || _util.FONT_IDENTITY_MATRIX;
 
-       var glyphsLength = glyphs.length;
 
-       var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;
 
-       var i, glyph, width, spacingLength;
 
-       if (isTextInvisible || fontSize === 0) {
 
-         return;
 
-       }
 
-       this.cachedGetSinglePixelWidth = null;
 
-       ctx.save();
 
-       ctx.transform.apply(ctx, current.textMatrix);
 
-       ctx.translate(current.x, current.y);
 
-       ctx.scale(textHScale, fontDirection);
 
-       for (i = 0; i < glyphsLength; ++i) {
 
-         glyph = glyphs[i];
 
-         if ((0, _util.isNum)(glyph)) {
 
-           spacingLength = spacingDir * glyph * fontSize / 1000;
 
-           this.ctx.translate(spacingLength, 0);
 
-           current.x += spacingLength * textHScale;
 
-           continue;
 
-         }
 
-         var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
 
-         var operatorList = font.charProcOperatorList[glyph.operatorListId];
 
-         if (!operatorList) {
 
-           (0, _util.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 transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);
 
-         width = transformed[0] * fontSize + spacing;
 
-         ctx.translate(width, 0);
 
-         current.x += width * textHScale;
 
-       }
 
-       ctx.restore();
 
-       this.processingType3 = null;
 
-     },
 
-     setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},
 
-     setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {
 
-       this.ctx.rect(llx, lly, urx - llx, ury - lly);
 
-       this.clip();
 
-       this.endPath();
 
-     },
 
-     getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
 
-       var _this = this;
 
-       var pattern;
 
-       if (IR[0] === 'TilingPattern') {
 
-         var color = IR[1];
 
-         var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();
 
-         var canvasGraphicsFactory = {
 
-           createCanvasGraphics: function createCanvasGraphics(ctx) {
 
-             return new CanvasGraphics(ctx, _this.commonObjs, _this.objs, _this.canvasFactory, _this.webGLContext);
 
-           }
 
-         };
 
-         pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);
 
-       } else {
 
-         pattern = (0, _pattern_helper.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;
 
-     },
 
-     setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
 
-       var color = _util.Util.makeCssRgb(r, g, b);
 
-       this.ctx.strokeStyle = color;
 
-       this.current.strokeColor = color;
 
-     },
 
-     setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
 
-       var color = _util.Util.makeCssRgb(r, g, b);
 
-       this.ctx.fillStyle = color;
 
-       this.current.fillColor = color;
 
-       this.current.patternFill = false;
 
-     },
 
-     shadingFill: function CanvasGraphics_shadingFill(patternIR) {
 
-       var ctx = this.ctx;
 
-       this.save();
 
-       var pattern = (0, _pattern_helper.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.Util.applyTransform([0, 0], inv);
 
-         var br = _util.Util.applyTransform([0, height], inv);
 
-         var ul = _util.Util.applyTransform([width, 0], inv);
 
-         var ur = _util.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 {
 
-         this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
 
-       }
 
-       this.restore();
 
-     },
 
-     beginInlineImage: function CanvasGraphics_beginInlineImage() {
 
-       (0, _util.unreachable)('Should not call beginInlineImage');
 
-     },
 
-     beginImageData: function CanvasGraphics_beginImageData() {
 
-       (0, _util.unreachable)('Should not call beginImageData');
 
-     },
 
-     paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {
 
-       this.save();
 
-       this.baseTransformStack.push(this.baseTransform);
 
-       if (Array.isArray(matrix) && matrix.length === 6) {
 
-         this.transform.apply(this, matrix);
 
-       }
 
-       this.baseTransform = this.ctx.mozCurrentTransform;
 
-       if (Array.isArray(bbox) && bbox.length === 4) {
 
-         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;
 
-       if (!group.isolated) {
 
-         (0, _util.info)('TODO: Support non-isolated groups.');
 
-       }
 
-       if (group.knockout) {
 
-         (0, _util.warn)('Knockout groups not supported.');
 
-       }
 
-       var currentTransform = currentCtx.mozCurrentTransform;
 
-       if (group.matrix) {
 
-         currentCtx.transform.apply(currentCtx, group.matrix);
 
-       }
 
-       if (!group.bbox) {
 
-         throw new Error('Bounding box is required.');
 
-       }
 
-       var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);
 
-       var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
 
-       bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
 
-       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;
 
-       }
 
-       var cacheId = 'groupAt' + this.groupLevel;
 
-       if (group.smask) {
 
-         cacheId += '_smask_' + this.smaskCounter++ % 2;
 
-       }
 
-       var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
 
-       var groupCtx = scratchCanvas.context;
 
-       groupCtx.scale(1 / scaleX, 1 / scaleY);
 
-       groupCtx.translate(-offsetX, -offsetY);
 
-       groupCtx.transform.apply(groupCtx, currentTransform);
 
-       if (group.smask) {
 
-         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,
 
-           startTransformInverse: null
 
-         });
 
-       } else {
 
-         currentCtx.setTransform(1, 0, 0, 1, 0, 0);
 
-         currentCtx.translate(offsetX, offsetY);
 
-         currentCtx.scale(scaleX, scaleY);
 
-       }
 
-       copyCtxState(currentCtx, groupCtx);
 
-       this.ctx = groupCtx;
 
-       this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
 
-       this.groupStack.push(currentCtx);
 
-       this.groupLevel++;
 
-       this.current.activeSMask = null;
 
-     },
 
-     endGroup: function CanvasGraphics_endGroup(group) {
 
-       this.groupLevel--;
 
-       var groupCtx = this.ctx;
 
-       this.ctx = this.groupStack.pop();
 
-       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);
 
-       }
 
-       this.restore();
 
-     },
 
-     beginAnnotations: function CanvasGraphics_beginAnnotations() {
 
-       this.save();
 
-       if (this.baseTransform) {
 
-         this.ctx.setTransform.apply(this.ctx, this.baseTransform);
 
-       }
 
-     },
 
-     endAnnotations: function CanvasGraphics_endAnnotations() {
 
-       this.restore();
 
-     },
 
-     beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {
 
-       this.save();
 
-       resetCtxToDefault(this.ctx);
 
-       this.current = new CanvasExtraState();
 
-       if (Array.isArray(rect) && rect.length === 4) {
 
-         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();
 
-       }
 
-       this.transform.apply(this, transform);
 
-       this.transform.apply(this, matrix);
 
-     },
 
-     endAnnotation: function CanvasGraphics_endAnnotation() {
 
-       this.restore();
 
-     },
 
-     paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
 
-       var domImage = this.objs.get(objId);
 
-       if (!domImage) {
 
-         (0, _util.warn)('Dependent image isn\'t ready yet');
 
-         return;
 
-       }
 
-       this.save();
 
-       var ctx = this.ctx;
 
-       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();
 
-     },
 
-     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 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;
 
-         }
 
-       }
 
-       if (glyph && glyph.compiled) {
 
-         glyph.compiled(ctx);
 
-         return;
 
-       }
 
-       var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
 
-       var maskCtx = maskCanvas.context;
 
-       maskCtx.save();
 
-       putBinaryImageMask(maskCtx, img);
 
-       maskCtx.globalCompositeOperation = 'source-in';
 
-       maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
 
-       maskCtx.fillRect(0, 0, width, height);
 
-       maskCtx.restore();
 
-       this.paintInlineImageXObject(maskCanvas.canvas);
 
-     },
 
-     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;
 
-       var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
 
-       var maskCtx = maskCanvas.context;
 
-       maskCtx.save();
 
-       putBinaryImageMask(maskCtx, imgData);
 
-       maskCtx.globalCompositeOperation = 'source-in';
 
-       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();
 
-       }
 
-     },
 
-     paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {
 
-       var ctx = this.ctx;
 
-       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;
 
-         var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
 
-         var maskCtx = maskCanvas.context;
 
-         maskCtx.save();
 
-         putBinaryImageMask(maskCtx, image);
 
-         maskCtx.globalCompositeOperation = 'source-in';
 
-         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();
 
-       }
 
-     },
 
-     paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
 
-       var imgData = this.objs.get(objId);
 
-       if (!imgData) {
 
-         (0, _util.warn)('Dependent image isn\'t ready yet');
 
-         return;
 
-       }
 
-       this.paintInlineImageXObject(imgData);
 
-     },
 
-     paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {
 
-       var imgData = this.objs.get(objId);
 
-       if (!imgData) {
 
-         (0, _util.warn)('Dependent image isn\'t ready yet');
 
-         return;
 
-       }
 
-       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);
 
-     },
 
-     paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {
 
-       var width = imgData.width;
 
-       var height = imgData.height;
 
-       var ctx = this.ctx;
 
-       this.save();
 
-       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;
 
-       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;
 
-       }
 
-       var paintWidth = width,
 
-           paintHeight = height;
 
-       var tmpCanvasId = 'prescale1';
 
-       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;
 
-         }
 
-         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]
 
-         });
 
-       }
 
-       this.restore();
 
-     },
 
-     paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
 
-       var ctx = this.ctx;
 
-       var w = imgData.width;
 
-       var h = imgData.height;
 
-       var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);
 
-       var tmpCtx = tmpCanvas.context;
 
-       putBinaryImageData(tmpCtx, imgData);
 
-       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();
 
-       }
 
-     },
 
-     paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {
 
-       this.ctx.fillRect(0, 0, 1, 1);
 
-     },
 
-     paintXObject: function CanvasGraphics_paintXObject() {
 
-       (0, _util.warn)('Unsupported \'paintXObject\' command.');
 
-     },
 
-     markPoint: function CanvasGraphics_markPoint(tag) {},
 
-     markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},
 
-     beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {},
 
-     beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {},
 
-     endMarkedContent: function CanvasGraphics_endMarkedContent() {},
 
-     beginCompat: function CanvasGraphics_beginCompat() {},
 
-     endCompat: function CanvasGraphics_endCompat() {},
 
-     consumePath: function CanvasGraphics_consumePath() {
 
-       var ctx = this.ctx;
 
-       if (this.pendingClip) {
 
-         if (this.pendingClip === EO_CLIP) {
 
-           ctx.clip('evenodd');
 
-         } else {
 
-           ctx.clip();
 
-         }
 
-         this.pendingClip = null;
 
-       }
 
-       ctx.beginPath();
 
-     },
 
-     getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
 
-       if (this.cachedGetSinglePixelWidth === null) {
 
-         this.ctx.save();
 
-         var inverse = this.ctx.mozCurrentTransformInverse;
 
-         this.ctx.restore();
 
-         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 _util.OPS) {
 
-     CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];
 
-   }
 
-   return CanvasGraphics;
 
- }();
 
- exports.CanvasGraphics = CanvasGraphics;
 
 
  |