Browse Source

interiors: finish base code and tests

Bastien Sevajol 6 years ago
parent
commit
5e10df0b65
3 changed files with 33 additions and 0 deletions
  1. 19 0
      opencc/simulation/interior.py
  2. 1 0
      requirements.txt
  3. 13 0
      tests/gui/test_interiors.py

+ 19 - 0
opencc/simulation/interior.py View File

@@ -1,6 +1,7 @@
1 1
 # coding: utf-8
2 2
 import typing
3 3
 
4
+from PIL.PngImagePlugin import PngImageFile
4 5
 from synergine2_xyz.map import TMXMap
5 6
 from synergine2_xyz.utils import get_direct_around_positions_of_position
6 7
 
@@ -87,3 +88,21 @@ class InteriorManager(object):
87 88
                 if where_position in interior and interior not in interiors:
88 89
                     interiors.append(interior)
89 90
         return interiors
91
+
92
+    def update_image_for_interiors(
93
+        self,
94
+        image: PngImageFile,
95
+        interiors: typing.List[typing.List[typing.Tuple[int, int]]],
96
+        tile_width: int,
97
+        tile_height: int,
98
+    ) -> None:
99
+        # TODO BS 20171213: Optimization can be done: keep in cache modifications on image instead change it entirely
100
+        pixels = image.load()
101
+
102
+        for interior in interiors:
103
+            for tile_x, tile_y in interior:
104
+                start_x = tile_x * tile_width
105
+                start_y = tile_y * tile_height
106
+                for x in range(start_x, start_x+tile_width):
107
+                    for y in range(start_y, start_y+tile_height):
108
+                        pixels[x, y] = (0, 0, 0, 0)

+ 1 - 0
requirements.txt View File

@@ -9,6 +9,7 @@ py==1.5.2
9 9
 pyglet==1.3.0
10 10
 pytest==3.3.0
11 11
 python-dateutil==2.6.1
12
+Pillow==4.3.0
12 13
 PyYAML==3.12
13 14
 redis==2.10.6
14 15
 six==1.11.0

+ 13 - 0
tests/gui/test_interiors.py View File

@@ -1,5 +1,6 @@
1 1
 # coding: utf-8
2 2
 from synergine2_xyz.map import TMXMap
3
+from PIL import Image
3 4
 
4 5
 from opencc.simulation.interior import InteriorManager
5 6
 
@@ -112,6 +113,7 @@ def test_interiors_zones__active_zones():
112 113
     interiors = manager.get_interiors(where_positions=[(0, 1), (4, 2)])
113 114
 
114 115
     assert 2 == len(interiors)
116
+    interiors = sorted(interiors)
115 117
 
116 118
     assert (0, 1) in interiors[0]
117 119
     assert (1, 1) in interiors[0]
@@ -128,3 +130,14 @@ def test_interiors_zones__active_zones():
128 130
     assert (3, 3) in interiors[1]
129 131
     assert (4, 3) in interiors[1]
130 132
     assert 6 == len(interiors[1])
133
+
134
+
135
+def test_interiors_zones__make_image_transparent__just_replace():
136
+    map_ = TMXMap('tests/fixtures/one_interior.tmx')
137
+    manager = InteriorManager(map_)
138
+    interiors = manager.get_interiors()
139
+    image = Image.open('tests/fixtures/white_40x40.png')
140
+    after_image_bytes = Image.open('tests/fixtures/white_one_interior_40x40.png').tobytes()
141
+
142
+    manager.update_image_for_interiors(image, interiors, 8, 8)
143
+    assert after_image_bytes == image.tobytes()