33from .. import LayeredImage
44
55
6+ def get_left_part (left_parts , r , c , solid , scale ):
7+ left = np .ones_like (r , dtype = np .uint8 ) * ((c >= - 32 * scale ) * (c <= 0 * scale ))
8+
9+ # Top limit - not applicable to solid parts
10+ if not solid :
11+ if left_parts // 2 == 0 :
12+ left *= r * 2 + c >= 0 * scale
13+ elif left_parts // 2 == 1 :
14+ left *= r * 4 + c >= 0 * scale
15+ elif left_parts // 2 == 2 :
16+ left *= r * 4 + c * 3 >= - 32 * scale
17+ else :
18+ assert left_parts // 2 == 3
19+ left *= r * 2 + c >= - 16 * scale
20+
21+ if left_parts % 4 == 0 :
22+ left *= r * 2 - c <= 64 * scale
23+ elif left_parts % 4 == 1 :
24+ left *= r * 4 - c <= 96 * scale
25+ elif left_parts % 4 == 2 :
26+ left *= r * 4 - c * 3 <= 128 * scale
27+ else :
28+ assert left_parts % 4 == 3
29+ left *= r * 2 - c <= 48 * scale
30+
31+ return left
32+
33+
634def make_foundation_subimage (
735 img : LayeredImage , scale , left_parts , right_parts , cut_inside , zshift , solid
836) -> LayeredImage :
@@ -11,60 +39,11 @@ def make_foundation_subimage(
1139 c = np .arange (img .w )[np .newaxis ] + img .xofs - scale + 0.5
1240
1341 alphamask = np .zeros ((img .h , img .w ), dtype = np .uint8 )
14- ones = np .ones ((img .h , img .w ), dtype = np .uint8 )
1542 if left_parts is not None :
16- left = ones * (c >= - 32 * scale ) * (c <= 0 * scale )
17-
18- # Top limit - not applicable to solid parts
19- if not solid :
20- if left_parts // 2 == 0 :
21- left *= r * 2 + c >= 0 * scale
22- elif left_parts // 2 == 1 :
23- left *= r * 4 + c >= 0 * scale
24- elif left_parts // 2 == 2 :
25- left *= r * 4 + c * 3 >= - 32 * scale
26- else :
27- assert left_parts // 2 == 3
28- left *= r * 2 + c >= - 16 * scale
29-
30- if left_parts % 4 == 0 :
31- left *= r * 2 - c <= 64 * scale
32- elif left_parts % 4 == 1 :
33- left *= r * 4 - c <= 96 * scale
34- elif left_parts % 4 == 2 :
35- left *= r * 4 - c * 3 <= 128 * scale
36- else :
37- assert left_parts % 4 == 3
38- left *= r * 2 - c <= 48 * scale
39-
40- alphamask = np .maximum (alphamask , left )
43+ alphamask = np .maximum (alphamask , get_left_part (left_parts , r , c , solid , scale ))
4144
4245 if right_parts is not None :
43- right = ones * (c >= 0 * scale ) * (c <= 32 * scale )
44-
45- # Top limit - not applicable to solid parts
46- if not solid :
47- if right_parts // 2 == 0 :
48- right *= r * 2 - c >= 0 * scale
49- elif right_parts // 2 == 1 :
50- right *= r * 4 - c >= 0 * scale
51- elif right_parts // 2 == 2 :
52- right *= r * 4 - c * 3 >= - 32 * scale
53- else :
54- assert right_parts // 2 == 3
55- right *= r * 2 - c >= - 16 * scale
56-
57- if right_parts % 4 == 0 :
58- right *= r * 2 + c <= 64 * scale
59- elif right_parts % 4 == 1 :
60- right *= r * 4 + c <= 96 * scale
61- elif right_parts % 4 == 2 :
62- right *= r * 4 + c * 3 <= 128 * scale
63- else :
64- assert right_parts % 4 == 3
65- right *= r * 2 + c <= 48 * scale
66-
67- alphamask = np .maximum (alphamask , right )
46+ alphamask = np .maximum (alphamask , get_left_part (right_parts , r , - c , solid , scale ))
6847
6948 if cut_inside :
7049 # FIXME
0 commit comments