fix: ядро (07) починка колечек и сердечек. Оптимизированы кресты...

This commit is contained in:
2026-09-05 19:04:40 +03:00
parent e71bb0fb35
commit 287a9ce284
2 changed files with 25 additions and 7 deletions
+15 -7
View File
@@ -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'<circle id="{shape_id}" r="{inner_r:.1f}" fill="none" stroke="currentColor" stroke-width="{stroke_width:.1f}"/>'
inner_r = max(1, round(r * 0.55))
if inner_r >= r:
inner_r = max(0, r - 1)
if inner_r == 0:
return f'<circle id="{shape_id}" class="shape" r="{r}"/>'
return (
f'<path id="{shape_id}" class="shape" fill-rule="evenodd" '
f'd="M0,{-r}A{r},{r} 0 100,{r}A{r},{r} 0 100,{-r}'
f'M0,{-inner_r} A{inner_r},{inner_r} 0 100,{inner_r}A{inner_r},{inner_r} 0 100,{-inner_r}Z"/>'
)
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'<path id="{shape_id}" class="shape" d="M{-arm},{-r} H{arm} V{-arm} H{r} V{arm} H{arm} V{r} H{-arm} V{arm} H{-r} V{-arm} H{-arm} Z"/>'
return f'<path id="{shape_id}" class="shape" d="M{-arm},{-r}H{arm}V{-arm}H{r}V{arm}H{arm}V{r}H{-arm}V{arm}H{-r}V{-arm}H{-arm}Z"/>'
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'<path id="{shape_id}" class="shape" d="M{-r},0 Q{-r/2:.1f},{-r} 0,0 T{r},0" fill="none" stroke="currentColor" stroke-width="{th:.1f}"/>'
case "heart":
scale_f = r / 12.0
r_top = round(r * 0.3)
r_mid = round(r * 0.4)
return (
f'<path id="{shape_id}" class="shape" transform="scale({scale_f:.3f}) translate(-12, -12)" '
f'd="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>'
f'<path id="{shape_id}" class="shape" '
f'd="M0,{r}C{-r},{r_mid} {-r},{-r} 0,{-r_top}C{r},{-r} {r},{r_mid} 0,{r}Z"/>'
)
case "circle" | _:
+10
View File
@@ -85,6 +85,16 @@ class HalftoneServiceTests(BaseMediaTestCase):
self.assertIn("</svg>", svg)
self.assertIn("<defs>", 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('<path id="s', ring_svg)
# Проверяем структуру сердечка: путь без атрибута transform
heart_svg = generate_halftone_svg(self.img, cols=20, max_radius=8, shape="heart")
self.assertIn('<path id="s', heart_svg)
self.assertNotIn('transform="scale', heart_svg)
def test_generate_static_blink_zero(self):
svg = generate_halftone_svg(self.img, cols=20, blink=0)
self.assertIn("animation:none", svg)