mirror of
https://github.com/1j01/textual-paint.git
synced 2024-10-27 01:41:29 +03:00
Use minimum rect size to define character cell size
This commit is contained in:
parent
56f8d47036
commit
4fc5efd34e
@ -27,6 +27,7 @@
|
|||||||
"bezier",
|
"bezier",
|
||||||
"Bresenham",
|
"Bresenham",
|
||||||
"Bresenham's",
|
"Bresenham's",
|
||||||
|
"bucketization",
|
||||||
"cmdpxl",
|
"cmdpxl",
|
||||||
"dasharray",
|
"dasharray",
|
||||||
"Deutsch",
|
"Deutsch",
|
||||||
|
@ -1213,7 +1213,11 @@ class AnsiArtDocument:
|
|||||||
if len(rects) == 0:
|
if len(rects) == 0:
|
||||||
raise ValueError("No rect elements found in SVG.")
|
raise ValueError("No rect elements found in SVG.")
|
||||||
# Remove any rects that contain other rects.
|
# Remove any rects that contain other rects.
|
||||||
# This targets just any background/border rects framing the grid.
|
# This targets any background/border rects framing the grid.
|
||||||
|
# TODO: fix combinatorial explosion (maybe sort by size and do something fancier with that?)
|
||||||
|
# Collision bucketization could apply here, but seems like overkill.
|
||||||
|
# And what would be the bucket size? 1/10th of the smallest rect?
|
||||||
|
# We haven't determined the cell size yet.
|
||||||
def rect_contains(outer_rect: ET.Element, inner_rect: ET.Element) -> bool:
|
def rect_contains(outer_rect: ET.Element, inner_rect: ET.Element) -> bool:
|
||||||
return (
|
return (
|
||||||
float(outer_rect.attrib["x"]) <= float(inner_rect.attrib["x"]) and
|
float(outer_rect.attrib["x"]) <= float(inner_rect.attrib["x"]) and
|
||||||
@ -1235,10 +1239,12 @@ class AnsiArtDocument:
|
|||||||
# This could technically happen if there are two rects of the same size and position.
|
# This could technically happen if there are two rects of the same size and position.
|
||||||
assert len(rects) > 0, "No rect elements after removing rects containing other rects."
|
assert len(rects) > 0, "No rect elements after removing rects containing other rects."
|
||||||
|
|
||||||
# Find the cell size.
|
# Find the cell size. Rects can span multiple cells, so we need to find the smallest rect.
|
||||||
# TODO: use spacing, not average size. Partially done below.
|
# TODO: handle case that there's no 1x1 cell rect.
|
||||||
cell_width = sum(float(rect.attrib["width"]) for rect in rects) / len(rects)
|
# TODO: use spacing rather than size. Partially done below.
|
||||||
cell_height = sum(float(rect.attrib["height"]) for rect in rects) / len(rects)
|
# This starts with a guess, and then is refined after guessing the document bounds.
|
||||||
|
cell_width = min(float(rect.attrib["width"]) for rect in rects)
|
||||||
|
cell_height = min(float(rect.attrib["height"]) for rect in rects)
|
||||||
# Find the document bounds.
|
# Find the document bounds.
|
||||||
min_x = min(float(rect.attrib["x"]) for rect in rects)
|
min_x = min(float(rect.attrib["x"]) for rect in rects)
|
||||||
min_y = min(float(rect.attrib["y"]) for rect in rects)
|
min_y = min(float(rect.attrib["y"]) for rect in rects)
|
||||||
@ -1279,6 +1285,7 @@ class AnsiArtDocument:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
for rect in rects:
|
for rect in rects:
|
||||||
|
# TODO: fill in multiple cells for spanned rects
|
||||||
x = (float(rect.attrib["x"]) + float(rect.attrib["width"])/2)
|
x = (float(rect.attrib["x"]) + float(rect.attrib["width"])/2)
|
||||||
y = (float(rect.attrib["y"]) + float(rect.attrib["height"])/2)
|
y = (float(rect.attrib["y"]) + float(rect.attrib["height"])/2)
|
||||||
add_debug_marker(x, y, "red")
|
add_debug_marker(x, y, "red")
|
||||||
|
Loading…
Reference in New Issue
Block a user