From dd89e74d8790bb19da89fba68cabfedfd3b73347 Mon Sep 17 00:00:00 2001 From: Samuele Santi Date: Sun, 1 Dec 2013 14:20:35 +0100 Subject: [PATCH] First commit of the library --- .gitignore | 5 +++ apyx/__init__.py | 90 +++++++++++++++++++++++++++++++++++++++++++++ apyx/templates.py | 34 +++++++++++++++++ fonts/slkscr.ttf | Bin 0 -> 18336 bytes fonts/slkscrb.ttf | Bin 0 -> 16172 bytes fonts/slkscre.ttf | Bin 0 -> 18444 bytes fonts/slkscreb.ttf | Bin 0 -> 16276 bytes setup.py | 26 +++++++++++++ 8 files changed, 155 insertions(+) create mode 100644 .gitignore create mode 100644 apyx/__init__.py create mode 100644 apyx/templates.py create mode 100644 fonts/slkscr.ttf create mode 100644 fonts/slkscrb.ttf create mode 100644 fonts/slkscre.ttf create mode 100644 fonts/slkscreb.ttf create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3d48c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*~ +*.pyc +/.ropeproject +.\#* +/output/* diff --git a/apyx/__init__.py b/apyx/__init__.py new file mode 100644 index 0000000..886af59 --- /dev/null +++ b/apyx/__init__.py @@ -0,0 +1,90 @@ +""" +Antipixels generator script +""" + +from __future__ import print_function + +import copy + +from PIL import Image, ImageFont, ImageDraw + + +def create_antipixel(cfg): + font = ImageFont.truetype(cfg['base']['font_path'], size=8) + width, height = cfg['base']['size'] + avail_space = width - 4 # padding: 2px on each side + image = Image.new('RGB', cfg['base']['size']) + draw = ImageDraw.Draw(image) + parts = copy.deepcopy(cfg['parts']) # so we can safely alter + + ##-------------------------------------------------- + ## Prepare sizing + + even_parts = [] + for part in parts: + part['text_width'] = draw.textsize(part['text'], font=font)[0] + part_sizing = part.get('sizing', 'even') + if part_sizing == 'even': + ## Keep track as we'll need later.. + even_parts.append(part) + elif part_sizing == 'fixed': + avail_space -= part['width'] + else: + raise ValueError("Invalid sizing: " + part_sizing) + avail_space -= len(parts) # spacing + all_text_space = sum(x['text_width'] for x in even_parts) + if all_text_space > avail_space: + raise ValueError("Not enough space to fit text!") + for part in even_parts: + # Give space proportional + part['sizing'] = 'fixed' + part['width'] = int(round(1.0 * part['text_width'] * + avail_space / all_text_space)) + + ##-------------------------------------------------- + ## Draw background + + draw.rectangle( + [(0, 0), (image.size[0] - 1, image.size[1] - 1)], + outline=cfg['base']['outline'], + fill=cfg['base']['background']) + + ##-------------------------------------------------- + ## Draw rectangles, with text + + # Vertical bounds + vmin, vmax = 2, image.size[1] - 3 + # Horizontal offset + offset = 2 + for part in parts: + draw.rectangle( + [(offset, vmin), (offset + part['width'], vmax)], + fill=part['background']) + + text_align = part.get('align', 'center') + if text_align == 'left': + text_offset = 1 + elif text_align == 'right': + text_offset = part['width'] - part['text_width'] + elif text_align == 'center': + text_offset = round((part['width'] - part['text_width']) / 2.0) + else: + raise ValueError("Invalid alignment: " + text_align) + + draw.text((offset + text_offset, vmin + 1), + part['text'], fill=part['color'], font=font) + + offset += part['width'] + offset += 1 # space between rectangles + + ##-------------------------------------------------- + ## Draw outline to make sure we clear overflows.. + + draw.rectangle( + [(0, 0), (image.size[0] - 1, image.size[1] - 1)], + outline=cfg['base']['outline']) + draw.rectangle( + [(1, 1), (image.size[0] - 2, image.size[1] - 2)], + outline=cfg['base']['background']) + + return image diff --git a/apyx/templates.py b/apyx/templates.py new file mode 100644 index 0000000..46438a8 --- /dev/null +++ b/apyx/templates.py @@ -0,0 +1,34 @@ +""" +Some templates for common antipixel patterns +""" + + +def twoparts_even(text1, fg1, bg1, text2, fg2, bg2, a1='center', a2='center'): + return { + 'parts': [ + dict(text=text1, background=bg1, color=fg1, sizing='even', + align=a1), + dict(text=text2, background=bg2, color=fg2, sizing='even', + align=a2), + ], + } + + +def twoparts_even_centered(text1, fg1, bg1, text2, fg2, bg2): + return twoparts_even(text1, fg1, bg1, text2, fg2, bg2, 'right', 'left') + + +def twoparts_even_altcolor(text1, text2, col1, col2): + return twoparts_even(text1, col2, col1, text2, col1, col2) + + +def twoparts_even_centered_altcolor(text1, text2, col1, col2): + return twoparts_even_centered(text1, col2, col1, text2, col1, col2) + + +def onepart(text, fg, bg): + return { + 'parts': [ + dict(text=text, background=bg, color=fg, sizing='even'), + ], + } diff --git a/fonts/slkscr.ttf b/fonts/slkscr.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e2dd974b1e31e1e50e0fa939fd0123bee9f95d80 GIT binary patch literal 18336 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 IJ^ax8FU~ke7ytkO literal 0 HcmV?d00001 diff --git a/fonts/slkscrb.ttf b/fonts/slkscrb.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ae4425ddabf65d729318736cab2435f47ebe45fa GIT binary patch literal 16172 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 literal 0 HcmV?d00001 diff --git a/fonts/slkscre.ttf b/fonts/slkscre.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1e2be59a7f0e2139ba0e244285392b2c0276a99c GIT binary patch literal 18444 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 literal 0 HcmV?d00001 diff --git a/fonts/slkscreb.ttf b/fonts/slkscreb.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cd68f57166472cfffd940e64504a9fa2be6c925c GIT binary patch literal 16276 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

xE9xArBO=_?!`1w*w&e6+%!jA z(xfPh<2rL&tv&X+FwrrBIB6se7@i~n#4@S0cuFEo6t)fK87Jn5OA?A1qYnrKR^71TZGRvNW<0Tj|iVcQJYw9FBgv?waZdNW$Ry&iC3o7WQJu+dK1 z37XPwhYcUPl}0VTl1LMUZNfYoZF9sWZHkJqkubN_+L>e0?gWB*G&`+M3$}JTVbh0h zrBREIgqk!_*tSA89dpDb9g2#v*{9Rjaq^T3TdLS zZAWan=7>wWl%&pIyS{pR5^-UVhdqtB)$8;+2({OXTLE+{jaq^j3TdLS?Zj+)=7>vr zlvabkPGj}NP}x8eh3#0K&4fAPk_k$?$=_IW^>+9;Ha;0i xlGHnsy~$oZNhT-joe