fix: ядро (07) починка колечек и сердечек. Оптимизированы кресты...
This commit is contained in:
@@ -29,9 +29,16 @@ def generate_shape_def(shape: str, radius: int, shape_id: str) -> str:
|
|||||||
r = radius
|
r = radius
|
||||||
match shape:
|
match shape:
|
||||||
case "ring":
|
case "ring":
|
||||||
stroke_width = max(1.0, r * 0.35)
|
inner_r = max(1, round(r * 0.55))
|
||||||
inner_r = max(0.5, r - stroke_width / 2.0)
|
if inner_r >= r:
|
||||||
return f'<circle id="{shape_id}" r="{inner_r:.1f}" fill="none" stroke="currentColor" stroke-width="{stroke_width:.1f}"/>'
|
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":
|
case "square":
|
||||||
size = r * 2
|
size = r * 2
|
||||||
@@ -63,7 +70,7 @@ def generate_shape_def(shape: str, radius: int, shape_id: str) -> str:
|
|||||||
|
|
||||||
case "cross":
|
case "cross":
|
||||||
arm = max(1, round(r * 0.35))
|
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":
|
case "line":
|
||||||
th = max(1, round(r * 0.25))
|
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}"/>'
|
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":
|
case "heart":
|
||||||
scale_f = r / 12.0
|
r_top = round(r * 0.3)
|
||||||
|
r_mid = round(r * 0.4)
|
||||||
return (
|
return (
|
||||||
f'<path id="{shape_id}" class="shape" transform="scale({scale_f:.3f}) translate(-12, -12)" '
|
f'<path id="{shape_id}" class="shape" '
|
||||||
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'd="M0,{r}C{-r},{r_mid} {-r},{-r} 0,{-r_top}C{r},{-r} {r},{r_mid} 0,{r}Z"/>'
|
||||||
)
|
)
|
||||||
|
|
||||||
case "circle" | _:
|
case "circle" | _:
|
||||||
|
|||||||
@@ -85,6 +85,16 @@ class HalftoneServiceTests(BaseMediaTestCase):
|
|||||||
self.assertIn("</svg>", svg)
|
self.assertIn("</svg>", svg)
|
||||||
self.assertIn("<defs>", 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):
|
def test_generate_static_blink_zero(self):
|
||||||
svg = generate_halftone_svg(self.img, cols=20, blink=0)
|
svg = generate_halftone_svg(self.img, cols=20, blink=0)
|
||||||
self.assertIn("animation:none", svg)
|
self.assertIn("animation:none", svg)
|
||||||
|
|||||||
Reference in New Issue
Block a user