return shadow(this, 'mediaBox',
((IsArray(obj) && obj.length == 4) ? obj : null));
},
+ get annotations() {
+ return shadow(this, 'annotations', this.inheritPageProp('Annots'));
+ },
get width() {
var mediaBox = this.mediaBox;
var rotate = this.rotate;
rotate: this.rotate });
gfx.execute(this.code, xref, resources);
gfx.endDrawing();
+ },
+ rotatePoint: function (x, y) {
+ var rotate = this.rotate;
+ switch (rotate) {
+ default:
+ case 0:
+ return {x: x, y: this.height - y};
+ case 180:
+ return {x: this.width - x, y: y};
+ case 90:
+ return {x: this.width - y, y: this.height - x};
+ case 270:
+ return {x: y, y: x};
+ }
+ },
+ getLinks: function(scale) {
+ var xref = this.xref;
+ var annotations = xref.fetchIfRef(this.annotations);
+ var i, n = annotations.length;
+ var links = [];
+ for (i = 0; i < n; ++i) {
+ var annotation = xref.fetch(annotations[i]);
+ if (!IsDict(annotation, 'Annot'))
+ continue;
+ var subtype = annotation.get("Subtype");
+ if (!IsName(subtype) || subtype.name != 'Link')
+ continue;
+ var rect = annotation.get("Rect");
+ var topLeftCorner = this.rotatePoint(rect[0], rect[1]);
+ var bottomRightCorner = this.rotatePoint(rect[2], rect[3]);
+
+ var link = {};
+ link.x = scale * Math.min(topLeftCorner.x, bottomRightCorner.x);
+ link.y = scale * Math.min(topLeftCorner.y, bottomRightCorner.y);
+ link.width = scale * Math.abs(topLeftCorner.x - bottomRightCorner.x);
+ link.height = scale * Math.abs(topLeftCorner.y - bottomRightCorner.y);
+ var a = annotation.get("A");
+ if (a) {
+ switch(a.get("S").name) {
+ case "URI":
+ link.url = a.get("URI");
+ break;
+ default:
+ TODO("other link types");
+ break;
+ }
+ }
+ links.push(link);
+ }
+ return links;
}
};
div.removeChild(div.lastChild);
};
+ function setupLinks(canvas, content, scale) {
+ var links = content.getLinks(scale);
+ var currentLink = null;
+ if (links.length > 0)
+ {
+ canvas.addEventListener('mousemove', function(e) {
+ var x = e.pageX;
+ var y = e.pageY;
+ for (var p = canvas; p; p = p.offsetParent) {
+ x -= p.offsetLeft;
+ y -= p.offsetTop;
+ }
+ for (var i = 0; i < links.length; i++) {
+ var link = links[i];
+ if (!link.url)
+ continue;
+ if (link.x <= x && link.y <= y &&
+ x < link.x + link.width && y < link.y + link.height) {
+ currentLink = link;
+ canvas.style.cursor = 'pointer';
+ return;
+ }
+ }
+ currentLink = null;
+ canvas.style.cursor = 'default';
+ }, false);
+ canvas.addEventListener('mousedown', function(e) {
+ window.location.href = currentLink.url;
+ }, false);
+ }
+ }
+
this.draw = function() {
if (div.hasChildNodes()) {
this.updateStats();
stats.begin = Date.now();
this.content.startRendering(ctx, this.updateStats);
+ setupLinks(canvas, this.content, this.scale);
+
return true;
};