Skip to content

Commit 0e47b7d

Browse files
author
Daniel Dotsenko
committed
Removing dependency on sprintf.js
It was observably slow. direct numeber formatting + string concatenation (although not as pretty) is drastically faster. We need faster (sepectially for mobile and other underpowered browsers)
1 parent b77e69d commit 0e47b7d

9 files changed

Lines changed: 104 additions & 201 deletions

File tree

doc/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ <h2><a href="symbols/jsPDF.html">jsPDF</a></h2>
212212
</div>
213213
<div class="fineprint" style="clear:both">
214214

215-
Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Tue Feb 21 2012 17:56:10 GMT-0800 (PST)
215+
Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Wed Feb 22 2012 00:56:23 GMT-0800 (PST)
216216
</div>
217217
</body>
218218
</html>

examples/basic.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
<script type="text/javascript" src="js/jquery/jquery-1.7.1.min.js"></script>
99
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.17.custom.min.js"></script>
1010
<script type="text/javascript" src="../libs/base64.js"></script>
11-
<script type="text/javascript" src="../libs/sprintf.js"></script>
1211
<script type="text/javascript" src="../jspdf.js"></script>
1312
<script type="text/javascript" src="js/basic.js"></script>
1413

examples/downloadify.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<title>jsPDF</title>
55
<link rel="stylesheet" type="text/css" href="css/main.css">
66
<script type="text/javascript" src="../libs/base64.js"></script>
7-
<script type="text/javascript" src="../libs/sprintf.js"></script>
87
<script type="text/javascript" src="../jspdf.js"></script>
98
<script type="text/javascript" src="../libs/downloadify/js/swfobject.js"></script>
109
<script type="text/javascript" src="../libs/downloadify/js/downloadify.min.js"></script>

examples/jaxer.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<script runat="server" type="text/javascript" src="../libs/base64.js"></script>
2-
<script runat="server" type="text/javascript" src="../libs/sprintf.js"></script>
32
<script runat="server" type="text/javascript" src="../jspdf.js"></script>
43
<script runat="server" autoload="true" type="text/javascript">
54

jspdf.js

Lines changed: 102 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,29 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
7878
, fontType = NORMAL // Default type
7979
, textColor = "0 g"
8080

81+
/////////////////////
8182
// Private functions
83+
/////////////////////
84+
// simplified (speedier) replacement for sprintf's %.2f conversion
85+
, f2 = function(number){
86+
return number.toFixed(2)
87+
}
88+
// simplified (speedier) replacement for sprintf's %.3f conversion
89+
, f3 = function(number){
90+
return number.toFixed(3)
91+
}
92+
// simplified (speedier) replacement for sprintf's %02d
93+
, padd2 = function(number) {
94+
var n = (number).toFixed(0)
95+
if ( number < 10 ) return '0' + n
96+
else return n
97+
}
98+
// simplified (speedier) replacement for sprintf's %02d
99+
, padd10 = function(number) {
100+
var n = (number).toFixed(0)
101+
if (n.length < 10) return new Array( 11 - n.length ).join( '0' ) + n
102+
else return n
103+
}
82104
, out = function(string) {
83105
if(outToPages /* set by beginPage */) {
84106
pages[page].push(string)
@@ -123,7 +145,7 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
123145
}
124146
out(kids + ']')
125147
out('/Count ' + page)
126-
out(sprintf('/MediaBox [0 0 %.2f %.2f]', wPt, hPt))
148+
out('/MediaBox [0 0 '+f2(wPt)+' '+f2(hPt)+']')
127149
out('>>')
128150
out('endobj');
129151
}
@@ -206,15 +228,17 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
206228
out('/Creator (' + pdfEscape(documentProperties.creator) + ')')
207229
}
208230
var created = new Date()
209-
out('/CreationDate (D:' + sprintf(
210-
'%02d%02d%02d%02d%02d%02d'
211-
, created.getFullYear()
212-
, (created.getMonth() + 1)
213-
, created.getDate()
214-
, created.getHours()
215-
, created.getMinutes()
216-
, created.getSeconds()
217-
) + ')')
231+
out('/CreationDate (D:' +
232+
[
233+
created.getFullYear()
234+
, padd2(created.getMonth() + 1)
235+
, padd2(created.getDate())
236+
, padd2(created.getHours())
237+
, padd2(created.getMinutes())
238+
, padd2(created.getSeconds())
239+
].join('')+
240+
')'
241+
)
218242
}
219243
, putCatalog = function () {
220244
out('/Type /Catalog')
@@ -237,7 +261,7 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
237261
, _addPage = function() {
238262
beginPage()
239263
// Set line width
240-
out(sprintf('%.2f w', (lineWidth * k)))
264+
out(f2(lineWidth * k) + ' w')
241265
// Set draw color
242266
out(drawColor)
243267
}
@@ -282,7 +306,7 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
282306
out('0 ' + (objectNumber + 1))
283307
out('0000000000 65535 f ')
284308
for (var i=1; i <= objectNumber; i++) {
285-
out(sprintf('%010d 00000 n ', offsets[i]))
309+
out(padd10(offsets[i]) + ' 00000 n ')
286310
}
287311
// Trailer
288312
out('trailer')
@@ -362,14 +386,21 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
362386
getFont() + ' ' + fontSize + ' Tf\n' +
363387
fontSize + ' TL\n' +
364388
textColor +
365-
sprintf('\n%.2f %.2f Td\n(', x * k, (pageHeight - y) * k) +
389+
'\n' + f2(x * k) + ' ' + f2((pageHeight - y) * k) + ' Td\n(' +
366390
str +
367391
') Tj\nET'
368392
)
369393
return _jsPDF
370394
},
371395
line: function(x1, y1, x2, y2) {
372-
var str = sprintf('%.2f %.2f m %.2f %.2f l S',x1 * k, (pageHeight - y1) * k, x2 * k, (pageHeight - y2) * k)
396+
var str = [
397+
f2(x1 * k)
398+
, f2((pageHeight - y1) * k)
399+
,'m'
400+
, f2(x2 * k)
401+
, f2((pageHeight - y2) * k)
402+
, 'l S'
403+
].join(' ')
373404
out(str)
374405
return _jsPDF
375406
},
@@ -380,7 +411,14 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
380411
} else if (style === 'FD' || style === 'DF') {
381412
op = 'B'
382413
}
383-
out(sprintf('%.2f %.2f %.2f %.2f re %s', x * k, (pageHeight - y) * k, w * k, -h * k, op))
414+
out([
415+
f2(x * k)
416+
, f2((pageHeight - y) * k)
417+
, f2(w * k)
418+
, f2(-h * k)
419+
, 're'
420+
, op
421+
].join(' '))
384422
return _jsPDF
385423
},
386424
ellipse: function(x, y, rx, ry, style) {
@@ -391,25 +429,48 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
391429
op = 'B'
392430
}
393431
var lx = 4/3*(Math.SQRT2-1)*rx
394-
var ly = 4/3*(Math.SQRT2-1)*ry
395-
out(sprintf('%.2f %.2f m %.2f %.2f %.2f %.2f %.2f %.2f c',
396-
(x+rx)*k, (pageHeight-y)*k,
397-
(x+rx)*k, (pageHeight-(y-ly))*k,
398-
(x+lx)*k, (pageHeight-(y-ry))*k,
399-
x*k, (pageHeight-(y-ry))*k))
400-
out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c',
401-
(x-lx)*k, (pageHeight-(y-ry))*k,
402-
(x-rx)*k, (pageHeight-(y-ly))*k,
403-
(x-rx)*k, (pageHeight-y)*k));
404-
out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c',
405-
(x-rx)*k, (pageHeight-(y+ly))*k,
406-
(x-lx)*k, (pageHeight-(y+ry))*k,
407-
x*k, (pageHeight-(y+ry))*k))
408-
out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c %s',
409-
(x+lx)*k, (pageHeight-(y+ry))*k,
410-
(x+rx)*k, (pageHeight-(y+ly))*k,
411-
(x+rx)*k, (pageHeight-y)*k,
412-
op))
432+
, ly = 4/3*(Math.SQRT2-1)*ry
433+
434+
out([
435+
f2((x+rx)*k)
436+
, f2((pageHeight-y)*k)
437+
, 'm'
438+
, f2((x+rx)*k)
439+
, f2((pageHeight-(y-ly))*k)
440+
, f2((x+lx)*k)
441+
, f2((pageHeight-(y-ry))*k)
442+
, f2(x*k)
443+
, f2((pageHeight-(y-ry))*k)
444+
, 'c'
445+
].join(' '))
446+
out([
447+
f2((x-lx)*k)
448+
, f2((pageHeight-(y-ry))*k)
449+
, f2((x-rx)*k)
450+
, f2((pageHeight-(y-ly))*k)
451+
, f2((x-rx)*k)
452+
, f2((pageHeight-y)*k)
453+
, 'c'
454+
].join(' '))
455+
out([
456+
f2((x-rx)*k)
457+
, f2((pageHeight-(y+ly))*k)
458+
, f2((x-lx)*k)
459+
, f2((pageHeight-(y+ry))*k)
460+
, f2(x*k)
461+
, f2((pageHeight-(y+ry))*k)
462+
, 'c'
463+
].join(' '))
464+
out([
465+
f2((x+lx)*k)
466+
, f2((pageHeight-(y+ry))*k)
467+
, f2((x+rx)*k)
468+
, f2((pageHeight-(y+ly))*k)
469+
, f2((x+rx)*k)
470+
, f2((pageHeight-y)*k)
471+
,'c'
472+
, op
473+
].join(' '))
413474
return _jsPDF
414475
},
415476
circle: function(x, y, r, style) {
@@ -463,34 +524,34 @@ var jsPDF = function(/** String */ orientation, /** String */ unit, /** String *
463524
return _jsPDF
464525
},
465526
setLineWidth: function(width) {
466-
out(sprintf('%.2f w', (width * k)))
527+
out((width * k).toFixed(2) + ' w')
467528
return _jsPDF
468529
},
469530
setDrawColor: function(r,g,b) {
470531
var color
471532
if ((r===0 && g===0 && b===0) || (typeof g === 'undefined')) {
472-
color = sprintf('%.3f G', r/255)
533+
color = f3(r/255) + ' G'
473534
} else {
474-
color = sprintf('%.3f %.3f %.3f RG', r/255, g/255, b/255)
535+
color = [f3(r/255), f3(g/255), f3(b/255), 'RG'].join(' ')
475536
}
476537
out(color)
477538
return _jsPDF
478539
},
479540
setFillColor: function(r,g,b) {
480541
var color
481542
if ((r===0 && g===0 && b===0) || (typeof g === 'undefined')) {
482-
color = sprintf('%.3f g', r/255)
543+
color = f3(r/255) + ' g'
483544
} else {
484-
color = sprintf('%.3f %.3f %.3f rg', r/255, g/255, b/255)
545+
color = [f3(r/255), f3(g/255), f3(b/255), 'rg'].join(' ')
485546
}
486547
out(color)
487548
return _jsPDF
488549
},
489550
setTextColor: function(r,g,b) {
490551
if ((r===0 && g===0 && b===0) || (typeof g === 'undefined')) {
491-
textColor = sprintf('%.3f g', r/255)
552+
textColor = f3(r/255) + ' g'
492553
} else {
493-
textColor = sprintf('%.3f %.3f %.3f rg', r/255, g/255, b/255)
554+
textColor = [f3(r/255), f3(g/255), f3(b/255), 'rg'].join(' ')
494555
}
495556
return _jsPDF
496557
}

0 commit comments

Comments
 (0)