diff --git a/synthesis/segment/segments.py b/synthesis/segment/segments.py index e69de29..be069e3 100644 --- a/synthesis/segment/segments.py +++ b/synthesis/segment/segments.py @@ -0,0 +1,36 @@ +from cv_analysis.utils.rectangle import Rectangle +from synthesis.segment.content_rectangle import ContentRectangle +from synthesis.segment.plot import RandomPlot +from synthesis.segment.text_block import TextBlock +from synthesis.text.font import pick_random_font_available_on_system + + +def generate_random_plot(rectangle: Rectangle) -> ContentRectangle: + block = RandomPlot(*rectangle.coords) + block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor + block.generate_random_plot(rectangle) + return block + + +def generate_recursive_random_table(rectangle: Rectangle, **kwargs) -> ContentRectangle: + from synthesis.segment.table.table import RecursiveRandomTable + + block = RecursiveRandomTable(*rectangle.coords, **kwargs) + if isinstance(rectangle, RecursiveRandomTable): + block.content = rectangle.content if rectangle.content else None # TODO: Refactor + block.generate_random_table() + return block + + +def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle: + block = TextBlock( + *rectangle.coords, + font=pick_random_font_available_on_system( + includes=("serif", "sans-serif", "bold"), + excludes=("mono", "italic", "oblique", "cursive"), + ), + font_size=30, # TODO: De-hardcode font size... Seems to have no effect on top of that + ) + block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor + block.put_text(text, rectangle) + return block diff --git a/synthesis/segment/table/table.py b/synthesis/segment/table/table.py index ce763e9..7c380ba 100644 --- a/synthesis/segment/table/table.py +++ b/synthesis/segment/table/table.py @@ -16,77 +16,13 @@ from cv_analysis.utils.rectangle import Rectangle from cv_analysis.utils.spacial import area from synthesis.random import rnd, possibly from synthesis.segment.content_rectangle import ContentRectangle -from synthesis.segment.plot import RandomPlot, pick_colormap +from synthesis.segment.plot import pick_colormap from synthesis.segment.random_content_rectangle import RandomContentRectangle +from synthesis.segment.segments import generate_random_plot, generate_recursive_random_table, generate_text_block from synthesis.segment.table.cell import Cell -from synthesis.segment.text_block import TextBlock -from synthesis.text.font import pick_random_font_available_on_system from synthesis.text.text import generate_random_words, generate_random_number -def generate_random_plot(rectangle: Rectangle) -> ContentRectangle: - block = RandomPlot(*rectangle.coords) - block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor - block.generate_random_plot(rectangle) - return block - - -def generate_recursive_random_table(rectangle: Rectangle, **kwargs) -> ContentRectangle: - block = RecursiveRandomTable(*rectangle.coords, **kwargs) - if isinstance(rectangle, RecursiveRandomTable): - block.content = rectangle.content if rectangle.content else None # TODO: Refactor - block.generate_random_table() - return block - - -class Size(Enum): - SMALL = 120 - MEDIUM = 180 - LARGE = 300 - - -def get_size_class(rectangle: Rectangle): - size = get_size(rectangle) - if size < Size.SMALL.value: - return Size.SMALL - elif size < Size.LARGE.value: - return Size.MEDIUM - else: - return Size.LARGE - - -def get_size(rectangle: Rectangle): - size = sqrt(area(rectangle)) - return size - - -def get_random_color_complementing_color_map(colormap): - def color_complement(r, g, b): - """Reference: https://stackoverflow.com/a/40234924""" - - def hilo(a, b, c): - if c < b: - b, c = c, b - if b < a: - a, b = b, a - if c < b: - b, c = c, b - return a + c - - k = hilo(r, g, b) - return tuple(k - u for u in (r, g, b)) - - color = colormap(0.2)[:3] - color = [int(255 * v) for v in color] - color = color_complement(*color) - return color - - -@lru_cache(maxsize=None) -def get_random_background_color(): - return tuple([*get_random_color_complementing_color_map(pick_colormap()), rnd.randint(100, 210)]) - - class RecursiveRandomTable(RandomContentRectangle): def __init__(self, x1, y1, x2, y2, border_width=1, layout: str = None, double_rule=False): """A table with a random number of rows and columns, and random content in each cell. @@ -283,18 +219,38 @@ class RecursiveRandomTable(RandomContentRectangle): return column_name -def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle: - block = TextBlock( - *rectangle.coords, - font=pick_random_font_available_on_system( - includes=("serif", "sans-serif", "bold"), - excludes=("mono", "italic", "oblique", "cursive"), - ), - font_size=30, # TODO: De-hardcode font size... Seems to have no effect on top of that - ) - block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor - block.put_text(text, rectangle) - return block +@lru_cache(maxsize=None) +def get_random_background_color(): + return tuple([*get_random_color_complementing_color_map(pick_colormap()), rnd.randint(100, 210)]) + + +def get_random_color_complementing_color_map(colormap): + def color_complement(r, g, b): + """Reference: https://stackoverflow.com/a/40234924""" + + def hilo(a, b, c): + if c < b: + b, c = c, b + if b < a: + a, b = b, a + if c < b: + b, c = c, b + return a + c + + k = hilo(r, g, b) + return tuple(k - u for u in (r, g, b)) + + color = colormap(0.2)[:3] + color = [int(255 * v) for v in color] + color = color_complement(*color) + return color + + +def paste_contents(page, contents: Iterable[ContentRectangle]): + page = deepcopy(page) + for content in contents: + paste_content(page, content) + return page def paste_content(page, content_box: ContentRectangle): @@ -303,8 +259,23 @@ def paste_content(page, content_box: ContentRectangle): return page -def paste_contents(page, contents: Iterable[ContentRectangle]): - page = deepcopy(page) - for content in contents: - paste_content(page, content) - return page +def get_size_class(rectangle: Rectangle): + size = get_size(rectangle) + if size < Size.SMALL.value: + return Size.SMALL + elif size < Size.LARGE.value: + return Size.MEDIUM + else: + return Size.LARGE + + +def get_size(rectangle: Rectangle): + size = sqrt(area(rectangle)) + return size + + +class Size(Enum): + # FIXME: this has to scale with the DPI + SMALL = 120 + MEDIUM = 180 + LARGE = 300 diff --git a/test/fixtures/page_generation/page.py b/test/fixtures/page_generation/page.py index 9c83ef2..4a21c17 100644 --- a/test/fixtures/page_generation/page.py +++ b/test/fixtures/page_generation/page.py @@ -17,7 +17,8 @@ from synthesis.partitioner.two_column import TwoColumnPagePartitioner from synthesis.random import rnd, probably from synthesis.segment.content_rectangle import ContentRectangle from cv_analysis.utils.geometric import is_square_like -from synthesis.segment.table.table import generate_random_plot, generate_recursive_random_table, paste_contents +from synthesis.segment.table.table import paste_contents +from synthesis.segment.segments import generate_random_plot, generate_recursive_random_table from synthesis.segment.text_block import TextBlock from synthesis.text.text_block_generator.caption import CaptionGenerator from synthesis.text.font import pick_random_font_available_on_system