Add function tile_bbox and corresponding test.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 15:54:56 +0000 (17:54 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Fri, 28 Jun 2019 15:54:56 +0000 (17:54 +0200)
gimp_passport.py
test_gimp_passport.py

index be48714..8f815ee 100644 (file)
@@ -61,6 +61,25 @@ def num_tiles_xy(paper_size: Tuple[float, float], tile_size: Tuple[float, float]
     return tuple(num_tiles(ps, ts, margin, spacing) for ps, ts in zip(paper_size, tile_size))
 
 
+def tile_bbox(x: int, y: int, tile_size: Tuple[int, int], margin: int, spacing: int) -> Tuple[int, int, int, int]:
+    """Returns the bounding box of the tile with indexes x and y. x=0 is the leftmost tile, y=0 is the topmost tile.
+    All length units have to be the same (e.g. millimeter or pixel).
+
+    :param x: 0 based horizontal tile number (0 is leftmost)
+    :param y: 0 based vertical tile number (0 is topmost)
+    :param tile_size: tuple with tile width and height
+    :param margin: space between paper border and first tile
+    :param spacing: space between tiles
+    :return: (left, top, right, bottom)
+    """
+    width, height = tile_size
+    left = margin + x * (width + spacing)
+    right = left + width
+    top = margin + y * (height + spacing)
+    bottom = top + height
+    return left, top, right, bottom
+
+
 def line(img: Image, pos: int, axis: int) -> Image:
     """Creates a horizontal (axis == 0) or vertical (axis == 1) line over the whole
     width or height of the image.
index 505b1ef..df3a8ee 100644 (file)
@@ -1,7 +1,7 @@
 import os
 import unittest
 from PIL import Image, ImageDraw
-from gimp_passport import mm_to_pixel, num_tiles, num_tiles_xy, line, make_passport, tile, \
+from gimp_passport import mm_to_pixel, num_tiles, num_tiles_xy, tile_bbox, line, make_passport, tile, \
     downsample_large, main
 
 
@@ -37,6 +37,21 @@ class TestMakePassport(unittest.TestCase):
         self.assertEqual((2, 2), num_tiles_xy((45., 10.), (15., 4.), 0., 2.))
         self.assertEqual((2, 1), num_tiles_xy((45., 10.), (15., 5.), 1., 1.))
 
+    def test_tile_bbox(self):
+        margin = 4
+        spacing = 3
+        width = 9
+        height = 15
+        self.assertEqual((margin, margin, margin + width, margin + height),
+                tile_bbox(0, 0, (width, height), margin, spacing))
+        self.assertEqual((margin + width + spacing, margin, margin + 2 * width + spacing, margin + height),
+            tile_bbox(1, 0, (width, height), margin, spacing))
+        self.assertEqual((margin, margin + height + spacing, margin + width, margin + 2 * height + spacing),
+            tile_bbox(0, 1, (width, height), margin, spacing))
+        self.assertEqual((margin + 2 * width + 2 * spacing, margin + 2 * height + 2 * spacing,
+            margin + 3 * width + 2 * spacing, margin + 3 * height + 2 * spacing),
+            tile_bbox(2, 2, (width, height), margin, spacing))
+
     def test_line(self):
         img = Image.new('RGB', (100, 60))
         line(img, 30, 0)