-PageCrop = namedtuple("PageCrop", ["left", "bottom", "right", "top"], defaults=[0,0,0,0])
+class PageCrop:
+
+ def __init__(self, left_cm=0, bottom_cm=0, right_cm=0, top_cm=0):
+ self.left_cm = left_cm
+ self.bottom_cm = bottom_cm
+ self.right_cm = right_cm
+ self.top_cm = top_cm
+ self.left = float(self.left_cm) * POINTS_PER_CM
+ self.bottom = float(self.bottom_cm) * POINTS_PER_CM
+ self.right = float(self.right_cm) * POINTS_PER_CM
+ self.top = float(self.top_cm) * POINTS_PER_CM
+ zoom_horizontal = A4_WIDTH / (A4_WIDTH - self.left - self.right)
+ zoom_vertical = A4_HEIGHT / (A4_HEIGHT - self.bottom - self.top)
+ if (zoom_horizontal > 1 and zoom_vertical < 1) or (zoom_horizontal < 1 and zoom_vertical > 1):
+ raise HandledException("-c: crops would create opposing zoom directions")
+ elif zoom_horizontal + zoom_vertical > 2:
+ self.zoom = min(zoom_horizontal, zoom_vertical)
+ else:
+ self.zoom = max(zoom_horizontal, zoom_vertical)
+
+ def __str__(self):
+ return str(vars(self))
+
+ @property
+ def format_in_cm(self):
+ return f"left {self.left_cm}cm, bottom {self.bottom_cm}cm, right {self.right_cm}cm, top {self.top_cm}cm"
+
+ @property
+ def remaining_width(self):
+ return A4_WIDTH - self.left - self.right
+
+ @property
+ def remaining_height(self):
+ return A4_HEIGHT - self.bottom - self.top
+
+ def give_mirror(self):
+ return PageCrop(left_cm=self.right_cm, bottom_cm=self.bottom_cm, right_cm=self.left_cm, top_cm=self.top_cm)
+
+
+class PrintableMargin:
+
+ def __init__(self, size_cm):
+ self.size = size_cm * POINTS_PER_CM
+ self.zoom = (A4_WIDTH - 2 * self.size)/A4_WIDTH
+