home · contact · privacy
Refactor line drawing. master
authorPlom Heller <plom@plomlompom.com>
Fri, 10 Apr 2026 03:30:09 +0000 (05:30 +0200)
committerPlom Heller <plom@plomlompom.com>
Fri, 10 Apr 2026 03:30:09 +0000 (05:30 +0200)
bookmaker.py

index 7b4583260a5aff23cf0431b32110a7fd02c50393..92e7a38f7a15b472a237276d4822860d53993c24 100755 (executable)
@@ -159,6 +159,25 @@ class Page:
         c.save()
         self._pypdf.merge_page(PdfReader(packet).pages[0])
 
+    def draw_orth_lines(
+            self,
+            lines: tuple[tuple[bool, float], ...],
+            rgb_color: tuple[float, float, float] = (0.0, 0.0, 0.0),
+            line_width: float = 2.0,
+            ) -> None:
+        'Draw horizontal or vertical lines.'
+        min_x, min_y, max_x, max_y = self._pypdf.mediabox
+        full_lines = []
+        for is_horizontal, position in lines:
+            if is_horizontal:
+                x0, x1 = min_x, max_x
+                y0 = y1 = position
+            else:
+                y0, y1 = min_y, max_y
+                x0 = x1 = position
+            full_lines += [(x0, y0, x1, y1)]
+        self.draw_lines(full_lines, rgb_color, line_width)
+
     def draw_borders(
             self,
             rgb_color: tuple[float, float, float] = (0.0, 0.0, 0.0),
@@ -166,12 +185,10 @@ class Page:
             ) -> None:
         'Draw border lines around mediabox.'
         min_x, min_y, max_x, max_y = self._pypdf.mediabox
-        self.draw_lines(((min_x, min_y, min_x, max_y),   # left
-                         (min_x, min_y, max_x, min_y),   # bottom
-                         (max_x, min_y, max_x, max_y),   # right
-                         (min_x, max_y, max_x, max_y)),  # top
-                        rgb_color,
-                        line_width)
+        self.draw_orth_lines(
+                ((False, min_x), (True, min_y), (False, max_x), (True, max_y)),
+                rgb_color,
+                line_width)
 
 
 class PageCrop:
@@ -721,12 +738,9 @@ def ornate_nup4(
     'Apply nup4 line guides onto new_page.'
     if arg_analyze:
         new_page.draw_borders((0.5, 1.0, 1.0))
-    new_page.draw_lines(
-            ((0, new_page.box['top']/2,
-              new_page.box['right'], new_page.box['top']/2),
-             (new_page.box['right']/2, new_page.box['top'],
-              new_page.box['right']/2, new_page.box['bottom'])),
-            line_width=0.1)
+    new_page.draw_orth_lines(((True, new_page.box['top']/2),
+                              (False, new_page.box['right']/2)),
+                             line_width=0.1)
     printable_offset_x = nup4_geometry.margin
     printable_offset_y = nup4_geometry.margin * A4_HEIGHT / A4_WIDTH
     new_page.scale(nup4_geometry.shrink_for_margin)
@@ -736,10 +750,9 @@ def ornate_nup4(
     x_left_spine_limit = A4_WIDTH/2 * nup4_geometry.shrink_for_spine
     x_right_spine_limit = A4_WIDTH - x_left_spine_limit
     if arg_analyze:
-        new_page.draw_lines(
-                ((x_left_spine_limit, A4_HEIGHT, x_left_spine_limit, 0),
-                 (x_right_spine_limit, A4_HEIGHT, x_right_spine_limit, 0)),
-                line_width=0.1, rgb_color=(1.0, 0.5, 1.0))
+        new_page.draw_orth_lines(((False, x_left_spine_limit,),
+                                  (False, x_right_spine_limit)),
+                                 line_width=0.1, rgb_color=(1.0, 0.5, 1.0))
     if is_front_page:
         draw_cut(new_page, x_left_spine_limit, 1)
         draw_cut(new_page, x_right_spine_limit, -1)