This commit is contained in:
Artur Adib 2012-02-14 14:48:58 -05:00
parent e00aa8e90b
commit 048e40b869
2 changed files with 75 additions and 9 deletions

View File

@ -104,23 +104,33 @@ var Page = (function PageClosure() {
return shadow(this, 'mediaBox', obj); return shadow(this, 'mediaBox', obj);
}, },
get view() { get view() {
var obj = this.inheritPageProp('CropBox'); var cropBox = this.inheritPageProp('CropBox');
var view = { var view = {
x: 0, x: 0,
y: 0, y: 0,
width: this.width, width: this.width,
height: this.height height: this.height
}; };
if (!isArray(cropBox) || cropBox.length !== 4)
return shadow(this, 'cropBox', view);
var mediaBox = this.mediaBox; var mediaBox = this.mediaBox;
var offsetX = mediaBox[0], offsetY = mediaBox[1]; var offsetX = mediaBox[0], offsetY = mediaBox[1];
if (isArray(obj) && obj.length == 4) {
var tl = this.rotatePoint(obj[0] - offsetX, obj[1] - offsetY); // From the spec, 6th ed., p.963:
var br = this.rotatePoint(obj[2] - offsetX, obj[3] - offsetY); // "The crop, bleed, trim, and art boxes should not ordinarily
// extend beyond the boundaries of the media box. If they do, they are
// effectively reduced to their intersection with the media box."
cropBox = Util.intersect(cropBox, mediaBox);
if (!cropBox)
return shadow(this, 'cropBox', view);
var tl = this.rotatePoint(cropBox[0] - offsetX, cropBox[1] - offsetY);
var br = this.rotatePoint(cropBox[2] - offsetX, cropBox[3] - offsetY);
view.x = Math.min(tl.x, br.x); view.x = Math.min(tl.x, br.x);
view.y = Math.min(tl.y, br.y); view.y = Math.min(tl.y, br.y);
view.width = Math.abs(tl.x - br.x); view.width = Math.abs(tl.x - br.x);
view.height = Math.abs(tl.y - br.y); view.height = Math.abs(tl.y - br.y);
}
return shadow(this, 'cropBox', view); return shadow(this, 'cropBox', view);
}, },

View File

@ -111,6 +111,62 @@ var Util = (function UtilClosure() {
]; ];
} }
// Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
// For coordinate systems whose origin lies in the bottom-left, this
// means normalization to (BL,TR) ordering. For systems with origin in the
// top-left, this means (TL,BR) ordering.
Util.normalizeRect = function normalizeRect(rect) {
var r = rect.slice(0); // clone rect
if (rect[0] > rect[2]) {
r[0] = rect[2];
r[2] = rect[0];
}
if (rect[1] > rect[3]) {
r[1] = rect[3];
r[3] = rect[1];
}
return r;
}
// Returns a rectangle [x1, y1, x2, y2] corresponding to the
// intersection of rect1 and rect2. If no intersection, returns 'false'
// The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
Util.intersect = function intersect(rect1, rect2) {
function compare(a, b) {
return a - b;
};
// Order points along the axes
var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
result = [];
rect1 = Util.normalizeRect(rect1);
rect2 = Util.normalizeRect(rect2);
// X: first and second points belong to different rectangles?
if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
(orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
// Intersection must be between second and third points
result[0] = orderedX[1];
result[2] = orderedX[2];
} else {
return false;
}
// Y: first and second points belong to different rectangles?
if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
(orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
// Intersection must be between second and third points
result[1] = orderedY[1];
result[3] = orderedY[2];
} else {
return false;
}
return result;
}
Util.sign = function sign(num) { Util.sign = function sign(num) {
return num < 0 ? -1 : 1; return num < 0 ? -1 : 1;
}; };