[Pkg-javascript-commits] [pdf.js] 170/246: Uses float number formatter to print numbers in SVG
David Prévot
taffit at moszumanska.debian.org
Sun Sep 7 15:36:37 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository pdf.js.
commit dae92b9cc786b0148b7c7032e2201e2e61a69603
Author: Yury Delendik <ydelendik at mozilla.com>
Date: Mon Aug 11 11:18:32 2014 -0500
Uses float number formatter to print numbers in SVG
---
src/display/svg.js | 213 +++++++++++++++++++++++++++++++++--------------------
1 file changed, 133 insertions(+), 80 deletions(-)
diff --git a/src/display/svg.js b/src/display/svg.js
index 6d2a023..a45f7d3 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -229,7 +229,7 @@ var SVGExtraState = (function SVGExtraStateClosure() {
// Are soft masks and alpha values shapes or opacities?
this.fontSizeScale = 1;
this.fontWeight = 'normal';
- this.fontSize = 'normal';
+ this.fontSize = 0;
this.textMatrix = IDENTITY_MATRIX;
this.fontMatrix = FONT_IDENTITY_MATRIX;
@@ -281,32 +281,81 @@ var SVGExtraState = (function SVGExtraStateClosure() {
return SVGExtraState;
})();
-function opListToTree(opList) {
- var opTree = [];
- var saveIdx = [];
- var restIdx = [];
- var tmp = [];
- var items = [];
- var opListLen = opList.length;
-
- 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;
+var SVGGraphics = (function SVGGraphicsClosure(ctx) {
+ function opListToTree(opList) {
+ var opTree = [];
+ var saveIdx = [];
+ var restIdx = [];
+ var tmp = [];
+ var items = [];
+ var opListLen = opList.length;
+
+ 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;
+ }
+
+ if(opList[x].fn === 'restore') {
+ opTree = tmp.pop();
+ } else {
+ opTree.push(opList[x]);
+ }
+ }
+ 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);
+ }
- if(opList[x].fn === 'restore') {
- opTree = tmp.pop();
+ /**
+ * 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 {
- opTree.push(opList[x]);
+ 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]) + ')';
}
- return opTree;
-}
-var SVGGraphics = (function SVGGraphicsClosure(ctx) {
function SVGGraphics(commonObjs, objs) {
this.current = new SVGExtraState();
@@ -341,8 +390,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.current = this.extraStack.pop();
this.tgrp = document.createElementNS(NS, 'svg:g');
- this.tgrp.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix + ')');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
this.pgrp.appendChild(this.tgrp);
},
@@ -387,8 +435,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
transformMatrix);
this.tgrp = document.createElementNS(NS, 'svg:g');
- this.tgrp.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix + ')');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
},
beginDrawing: function SVGGraphics_beginDrawing(viewport, pageNum,
@@ -398,11 +445,9 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.viewport = viewport;
this.transformMatrix = IDENTITY_MATRIX;
this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
- this.pgrp.setAttributeNS(null, 'transform',
- 'matrix(' + viewport.transform +')');
+ this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
- this.tgrp.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix +')');
+ 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);
@@ -477,16 +522,16 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
args[3], args[4], args[5]);
break;
case OPS.setLineWidth:
- this.setLineWidth(args);
+ this.setLineWidth(args[0]);
break;
case OPS.setLineJoin:
- this.setLineJoin(args);
+ this.setLineJoin(args[0]);
break;
case OPS.setLineCap:
- this.setLineCap(args);
+ this.setLineCap(args[0]);
break;
case OPS.setMiterLimit:
- this.setMiterLimit(args);
+ this.setMiterLimit(args[0]);
break;
case OPS.setFillRGBColor:
this.setFillRGBColor(args[0], args[1], args[2]);
@@ -591,8 +636,9 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
current.xcoords = [];
current.tspan = document.createElementNS(NS, 'svg:tspan');
current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
- current.tspan.setAttributeNS(null, 'font-size', current.fontSize + 'px');
- current.tspan.setAttributeNS(null, 'y', -current.y);
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
current.txtElement = document.createElementNS(NS, 'svg:text');
current.txtElement.appendChild(current.tspan);
@@ -617,8 +663,9 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
current.xcoords = [];
current.tspan = document.createElementNS(NS, 'svg:tspan');
current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
- current.tspan.setAttributeNS(null, 'font-size', current.fontSize + 'px');
- current.tspan.setAttributeNS(null, 'y', -current.y);
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
},
showText: function SVGGraphics_showText(glyphs) {
@@ -666,17 +713,20 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
current.x += x * textHScale;
}
- current.tspan.setAttributeNS(null, 'x', current.xcoords.join(' '));
- current.tspan.setAttributeNS(null, 'y', -current.y);
+ 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', current.fontSize + 'px');
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
current.tspan.setAttributeNS(null, 'stroke', 'none');
current.tspan.setAttributeNS(null, 'fill', current.fillColor);
current.txtElement.setAttributeNS(null, 'transform',
- 'matrix(' + current.textMatrix + ') scale(1, -1)' );
+ pm(current.textMatrix) +
+ ' scale(1, -1)' );
current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
current.txtElement.appendChild(current.tspan);
current.txtgrp.appendChild(current.txtElement);
@@ -717,7 +767,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
current.fontStyle = italic;
current.tspan = document.createElementNS(NS, 'svg:tspan');
- current.tspan.setAttributeNS(null, 'y', -current.y);
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
current.xcoords = [];
},
@@ -728,8 +778,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.pgrp.appendChild(this.tgrp);
}
this.tgrp = document.createElementNS(NS, 'svg:g');
- this.tgrp.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix + ')');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
},
// Path properties
@@ -777,34 +826,38 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
var height = args[j++];
var xw = x + width;
var yh = y + height;
- d.push('M', x , y, 'L', xw , y, 'L', xw, yh, 'L', x, yh, 'Z');
+ 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', x, y);
+ d.push('M', pf(x), pf(y));
break;
case OPS.lineTo:
x = args[j++];
y = args[j++];
- d.push('L', x , y);
+ d.push('L', pf(x) , pf(y));
break;
case OPS.curveTo:
x = args[j + 4];
y = args[j + 5];
- d.push('C', args[j], args[j + 1], args[j + 2], args[j + 3], x, y);
+ 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', x, y, args[j], args[j + 1], args[j + 2], 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', args[j], args[j + 1], x, y, x, y);
+ d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
+ pf(x), pf(y));
j += 4;
break;
case OPS.closePath:
@@ -814,14 +867,15 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
}
current.path.setAttributeNS(null, 'd', d.join(' '));
current.path.setAttributeNS(null, 'stroke-miterlimit',
- current.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',
- current.lineWidth + 'px');
- current.path.setAttributeNS(null, 'stroke-dasharray', current.dashArray);
+ pf(current.lineWidth) + 'px');
+ current.path.setAttributeNS(null, 'stroke-dasharray',
+ current.dashArray.map(pf).join(' '));
current.path.setAttributeNS(null, 'stroke-dashoffset',
- current.dashPhase + 'px');
+ pf(current.dashPhase) + 'px');
current.path.setAttributeNS(null, 'fill', 'none');
this.tgrp.appendChild(current.path);
@@ -846,8 +900,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
this.pgrp.appendChild(this.tgrp);
}
this.tgrp = document.createElementNS(NS, 'svg:g');
- this.tgrp.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix + ')');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
},
clip: function SVGGraphics_clip(type) {
@@ -863,8 +916,7 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
} else {
clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
}
- this.clippath.setAttributeNS(null, 'transform',
- 'matrix(' + this.transformMatrix + ')');
+ this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
this.clippath.appendChild(clipElement);
this.defs.appendChild(this.clippath);
@@ -979,10 +1031,10 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
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 + 'px');
- rect.setAttributeNS(null, 'height', 1 + 'px');
+ 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);
},
@@ -994,10 +1046,10 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
imgEl.setAttributeNS(XLINK_NS, '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', -h);
- imgEl.setAttributeNS(null, 'transform', 'scale(' + 1 / w +
- ' ' + -1 / h + ')');
+ imgEl.setAttributeNS(null, 'x', '0');
+ imgEl.setAttributeNS(null, 'y', pf(-h));
+ imgEl.setAttributeNS(null, 'transform',
+ 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
this.tgrp.appendChild(imgEl);
if (current.pendingClip) {
@@ -1026,20 +1078,21 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
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', width);
- cliprect.setAttributeNS(null, 'height', height);
+ 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, 'href', imgSrc);
- imgEl.setAttributeNS(null, 'x', 0);
- imgEl.setAttributeNS(null, 'y', -height);
- imgEl.setAttributeNS(null, 'width', width + 'px');
- imgEl.setAttributeNS(null, 'height', height + 'px');
- imgEl.setAttributeNS(null, 'transform', 'scale(' + (1 / width) +
- ', ' + (-1 / height) + ')');
+ 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 {
@@ -1068,10 +1121,10 @@ var SVGGraphics = (function SVGGraphicsClosure(ctx) {
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', width);
- rect.setAttributeNS(null, 'height', height);
+ 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);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git
More information about the Pkg-javascript-commits
mailing list