diff --git a/yagicard/__init__.py b/yagicard/__init__.py index f437244..504e52f 100755 --- a/yagicard/__init__.py +++ b/yagicard/__init__.py @@ -44,6 +44,25 @@ class Images (): def __setitem__ (self, key, value): self.images[key] = value +class SymbolDrawer (): + def __init__ (self, size, direction="ltr"): + self.direction = direction + self.image = Image.new("RGBA", size) + self.symbol_pos = (0, 0) + + def add_symbol (self, symbol): + if isinstance(symbol, str): + symbol = symbols[symbol] + + self.image.paste(symbol, self.symbol_pos) + if self.direction == "ltr": + self.symbol_pos = (self.symbol_pos[0] + symbol.width, self.symbol_pos[1]) + elif self.direction == "ttb": + self.symbol_pos = (self.symbol_pos[0], self.symbol_pos[1] + symbol.height) + + def draw_onto (self, target_image, dest): + target_image.alpha_composite(self.image, dest) + images = Images(IMAGES_DIRECTORY) symbols = Images(SYMBOLS_DIRECTORY) @@ -118,20 +137,15 @@ def draw_symbols (image, draw, field): height = field.get("height", image.height) direction = field.get("direction", "ltr") - symbols_image = Image.new(image.mode, (width, height)) + symbol_drawer = SymbolDrawer((width, height), direction) symbol_pos = (0, 0) for symbol_name in symbol_text.split(" "): if symbol_name: symbol = symbols[symbol_name] - symbols_image.paste(symbol, symbol_pos) - - if direction == "ltr": - symbol_pos = (symbol_pos[0] + symbol.width, symbol_pos[1]) - elif direction == "ttb": - symbol_pos = (symbol_pos[0], symbol_pos[1] + symbol.height) + symbol_drawer.add_symbol(symbol) - image.alpha_composite(symbols_image, (field.get("x"), field.get("y"))) + symbol_drawer.draw_onto(image, (field.get("x"), field.get("y"))) def rescale_text_for_sizes (*args): def scaler (value):