Merge pull request #4999 from pramodhkp/saverestore

[SVG] Optimization of save/restore usage, Addition of paint methods
This commit is contained in:
Yury Delendik 2014-06-24 12:24:33 -05:00
commit cd79ac84af
2 changed files with 42 additions and 15 deletions

View File

@ -53,7 +53,7 @@ PDFJS.getDocument(url).then(function(pdf) {
}; };
// the next page fetch will start only after this page rendering is done // the next page fetch will start only after this page rendering is done
return page.getOperatorList().then(function (opList) { return page.getOperatorList().then(function (opList) {
var svgGfx = new SVGGraphics(page.commonObjs); var svgGfx = new SVGGraphics(page.commonObjs, page.objs);
return svgGfx.loadDependencies(opList).then(function (values) { return svgGfx.loadDependencies(opList).then(function (values) {
return svgGfx.beginDrawing(renderContext.viewport, return svgGfx.beginDrawing(renderContext.viewport,
renderContext.pageNum, renderContext.container, opList); renderContext.pageNum, renderContext.container, opList);

View File

@ -104,18 +104,20 @@ function opListToTree(opList) {
var SVGGraphics = (function SVGGraphicsClosure(ctx) { var SVGGraphics = (function SVGGraphicsClosure(ctx) {
function SVGGraphics(commonObjs) { function SVGGraphics(commonObjs, objs) {
this.current = new SVGExtraState(); this.current = new SVGExtraState();
this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
this.transformStack = []; this.transformStack = [];
this.extraStack = []; this.extraStack = [];
this.commonObjs = commonObjs; this.commonObjs = commonObjs;
this.objs = objs;
this.pendingEOFill = false; this.pendingEOFill = false;
} }
var NS = 'http://www.w3.org/2000/svg'; var NS = 'http://www.w3.org/2000/svg';
var XML_NS = 'http://www.w3.org/XML/1998/namespace'; 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_CAP_STYLES = ['butt', 'round', 'square'];
var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
var NORMAL_CLIP = {}; var NORMAL_CLIP = {};
@ -134,7 +136,6 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.current = this.extraStack.pop(); this.current = this.extraStack.pop();
this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp = document.createElementNS(NS, 'svg:g');
this.tgrp.setAttributeNS(null, 'id', 'transform');
this.tgrp.setAttributeNS(null, 'transform', this.tgrp.setAttributeNS(null, 'transform',
'matrix(' + this.transformMatrix + ')'); 'matrix(' + this.transformMatrix + ')');
this.pgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.tgrp);
@ -158,10 +159,15 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
for (var n = 0, nn = deps.length; n < nn; n++) { for (var n = 0, nn = deps.length; n < nn; n++) {
var obj = deps[n]; var obj = deps[n];
var common = obj.substring(0, 2) === 'g_'; var common = obj.substring(0, 2) === 'g_';
var promise;
if (common) { if (common) {
var promise = new Promise(function(resolve) { promise = new Promise(function(resolve) {
self.commonObjs.get(obj, resolve); self.commonObjs.get(obj, resolve);
}); });
} else {
promise = new Promise(function(resolve) {
self.objs.get(obj, resolve);
});
} }
this.current.dependencies.push(promise); this.current.dependencies.push(promise);
} }
@ -176,7 +182,6 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
transformMatrix); transformMatrix);
this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp = document.createElementNS(NS, 'svg:g');
this.tgrp.setAttributeNS(null, 'id', 'transform');
this.tgrp.setAttributeNS(null, 'transform', this.tgrp.setAttributeNS(null, 'transform',
'matrix(' + this.transformMatrix + ')'); 'matrix(' + this.transformMatrix + ')');
this.pgrp.appendChild(this.tgrp); this.pgrp.appendChild(this.tgrp);
@ -302,6 +307,12 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
case OPS.fillStroke: case OPS.fillStroke:
this.fillStroke(); this.fillStroke();
break; break;
case OPS.paintSolidColorImageMask:
this.paintSolidColorImageMask();
break;
case OPS.paintJpegXObject:
this.paintJpegXObject(args[0], args[1], args[2]);
break;
case OPS.closePath: case OPS.closePath:
this.closePath(); this.closePath();
break; break;
@ -385,7 +396,6 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
}, },
showText: function SVGGraphics_showText(glyphs) { showText: function SVGGraphics_showText(glyphs) {
this.save();
var current = this.current; var current = this.current;
var font = current.font; var font = current.font;
var fontSize = current.fontSize; var fontSize = current.fontSize;
@ -438,13 +448,10 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
'matrix(' + current.textMatrix + ') scale(1, -1)' ); 'matrix(' + current.textMatrix + ') scale(1, -1)' );
current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
current.txtElement.appendChild(current.tspan); current.txtElement.appendChild(current.tspan);
current.txtgrp.setAttributeNS(null, 'id', 'text');
current.txtgrp.appendChild(current.txtElement); current.txtgrp.appendChild(current.txtElement);
this.tgrp.appendChild(current.txtElement); this.tgrp.appendChild(current.txtElement);
this.restore();
}, },
setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
@ -644,28 +651,22 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
}, },
fill: function SVGGraphics_fill() { fill: function SVGGraphics_fill() {
this.save();
var current = this.current; var current = this.current;
current.element.setAttributeNS(null, 'fill', current.fillColor); current.element.setAttributeNS(null, 'fill', current.fillColor);
this.tgrp.appendChild(current.element); this.tgrp.appendChild(current.element);
this.restore();
}, },
stroke: function SVGGraphics_stroke() { stroke: function SVGGraphics_stroke() {
this.save();
var current = this.current; var current = this.current;
current.element.setAttributeNS(null, 'stroke', current.strokeColor); current.element.setAttributeNS(null, 'stroke', current.strokeColor);
current.element.setAttributeNS(null, 'fill', 'none'); current.element.setAttributeNS(null, 'fill', 'none');
this.tgrp.appendChild(current.element); this.tgrp.appendChild(current.element);
this.restore();
}, },
eoFill: function SVGGraphics_eoFill() { eoFill: function SVGGraphics_eoFill() {
this.save();
var current = this.current; var current = this.current;
current.element.setAttributeNS(null, 'fill', current.fillColor); current.element.setAttributeNS(null, 'fill', current.fillColor);
current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
this.restore();
}, },
fillStroke: function SVGGraphics_fillStroke() { fillStroke: function SVGGraphics_fillStroke() {
@ -682,6 +683,32 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.closePath(); this.closePath();
this.fillStroke(); this.fillStroke();
}, },
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', 1);
rect.setAttributeNS(null, 'height', 1);
rect.setAttributeNS(null, 'fill', current.fillColor);
this.tgrp.appendChild(rect);
},
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, 'href', imgObj.src);
imgEl.setAttributeNS(null, 'width', imgObj.width);
imgEl.setAttributeNS(null, 'height', imgObj.height);
imgEl.setAttributeNS(null, 'x', 0);
imgEl.setAttributeNS(null, 'y', -h);
imgEl.setAttributeNS(null, 'transform', 'scale(' + 1 / w +
' ' + -1 / h + ')');
this.tgrp.appendChild(imgEl);
},
}; };
return SVGGraphics; return SVGGraphics;
})(); })();