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('