diff --git a/hypn0/hypn0_site/services/halftone.py b/hypn0/hypn0_site/services/halftone.py index 69842b3..cfdc99e 100644 --- a/hypn0/hypn0_site/services/halftone.py +++ b/hypn0/hypn0_site/services/halftone.py @@ -29,9 +29,16 @@ def generate_shape_def(shape: str, radius: int, shape_id: str) -> str: r = radius match shape: case "ring": - stroke_width = max(1.0, r * 0.35) - inner_r = max(0.5, r - stroke_width / 2.0) - return f'' + inner_r = max(1, round(r * 0.55)) + if inner_r >= r: + inner_r = max(0, r - 1) + if inner_r == 0: + return f'' + return ( + f'' + ) case "square": size = r * 2 @@ -63,7 +70,7 @@ def generate_shape_def(shape: str, radius: int, shape_id: str) -> str: case "cross": arm = max(1, round(r * 0.35)) - return f'' + return f'' case "line": th = max(1, round(r * 0.25)) @@ -74,10 +81,11 @@ def generate_shape_def(shape: str, radius: int, shape_id: str) -> str: return f'' case "heart": - scale_f = r / 12.0 + r_top = round(r * 0.3) + r_mid = round(r * 0.4) return ( - f'' + f'' ) case "circle" | _: diff --git a/hypn0/hypn0_site/tests.py b/hypn0/hypn0_site/tests.py index 221c9fb..68fb4e3 100644 --- a/hypn0/hypn0_site/tests.py +++ b/hypn0/hypn0_site/tests.py @@ -85,6 +85,16 @@ class HalftoneServiceTests(BaseMediaTestCase): self.assertIn("", svg) self.assertIn("", svg) + # Проверяем структуру кольца: путь с вырезанным отверстием (evenodd) + ring_svg = generate_halftone_svg(self.img, cols=20, max_radius=8, shape="ring") + self.assertIn('fill-rule="evenodd"', ring_svg) + self.assertIn('