summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-05-09 14:22:51 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-05-16 12:48:07 +0200
commit756835b8388c93b30831c84b7208a47d6849920d (patch)
tree2b621371626f3281cf8fdabe4d87eda2eebb492d /docs
parentf4cb197ad36f5ea3ab834abb41d2641daf152622 (diff)
downloadmupdf-756835b8388c93b30831c84b7208a47d6849920d.tar.xz
js: Add Shade.bound function and bbox device example.
Diffstat (limited to 'docs')
-rw-r--r--docs/examples/bbox-device.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/docs/examples/bbox-device.js b/docs/examples/bbox-device.js
new file mode 100644
index 00000000..52d2cb4a
--- /dev/null
+++ b/docs/examples/bbox-device.js
@@ -0,0 +1,91 @@
+function BBoxDevice(bbox) {
+ function extend(x,y) {
+ if (x < bbox[0]) bbox[0] = x;
+ if (x > bbox[2]) bbox[2] = x;
+ if (y < bbox[1]) bbox[1] = y;
+ if (y > bbox[3]) bbox[3] = y;
+ }
+ function extendPoint(m, px, py) {
+ var x = px * m[0] + py * m[2] + m[4];
+ var y = px * m[1] + py * m[3] + m[5];
+ extend(x, y);
+ }
+ function extendRect(m, r) {
+ var x0 = r[0], y0 = r[1];
+ var x1 = r[2], y1 = r[3];
+ extendPoint(m, x0, y0);
+ extendPoint(m, x1, y0);
+ extendPoint(m, x0, y1);
+ extendPoint(m, x1, y1);
+ }
+ function PathBounder(ctm) {
+ return {
+ moveTo: function (x,y) { extendPoint(ctm, x, y) },
+ lineTo: function (x,y) { extendPoint(ctm, x, y) },
+ curveTo: function (x1,y1,x2,y2,x3,y3) {
+ extendPoint(ctm, x1, y1);
+ extendPoint(ctm, x2, y2);
+ extendPoint(ctm, x3, y3);
+ },
+ };
+ }
+ function TextBounder(ctm) {
+ return {
+ showGlyph: function (font,trm,gid,ucs,wmode,bidi) {
+ var bbox = [ 0, -0.2, font.advanceGlyph(gid, 0), 0.8 ];
+ extendRect(Concat(trm, ctm), bbox);
+ },
+ };
+ }
+ return {
+ fillPath: function (path, evenOdd, ctm, colorSpace, color, alpha) {
+ path.walk(new PathBounder(ctm));
+ },
+ clipPath: function (path, evenOdd, ctm) {
+ path.walk(new PathBounder(ctm));
+ },
+ strokePath: function (path, stroke, ctm, colorSpace, color, alpha) {
+ path.walk(new PathBounder(ctm));
+ },
+ clipStrokePath: function (path, stroke, ctm) {
+ path.walk(new PathBounder(ctm));
+ },
+ fillText: function (text, ctm, colorSpace, color, alpha) {
+ text.walk(new TextBounder(ctm));
+ },
+ clipText: function (text, ctm) {
+ text.walk(new TextBounder(ctm));
+ },
+ strokeText: function (text, stroke, ctm, colorSpace, color, alpha) {
+ text.walk(new TextBounder(ctm));
+ },
+ clipStrokeText: function (text, stroke, ctm) {
+ text.walk(new TextBounder(ctm));
+ },
+ ignoreText: function (text, ctm) {
+ text.walk(new TextBounder(ctm));
+ },
+ fillShade: function (shade, ctm, alpha) {
+ var bbox = shade.bound(ctm);
+ extend(bbox[0], bbox[1]);
+ extend(bbox[2], bbox[3]);
+ },
+ fillImage: function (image, ctm, alpha) {
+ extendRect(ctm, [0,0,1,1]);
+ },
+ fillImageMask: function (image, ctm, colorSpace, color, alpha) {
+ extendRect(ctm, [0,0,1,1]);
+ },
+ };
+}
+
+if (argv.length != 3)
+ print("usage: mutool run bbox-device.js document.pdf pageNumber")
+else {
+ var doc = new Document(argv[1]);
+ var page = doc.loadPage(parseInt(argv[2])-1);
+ var bbox = [Infinity, Infinity, -Infinity, -Infinity];
+ page.run(new BBoxDevice(bbox), Identity);
+ print("original bbox:", page.bound());
+ print("computed bbox:", bbox.map(function (x) { return Math.round(x); }));
+}