]> de.git.xonotic.org Git - xonotic/mediasource.git/blob - gfx/luma_add/colors/draw-collage.py
Revise the Luma documentation files
[xonotic/mediasource.git] / gfx / luma_add / colors / draw-collage.py
1 #!/usr/bin/env python
2
3 """
4 Draws a collage of colorized icons, with colors from colors.txt
5 Usage: ./draw-collage.py OUTFILE
6 """
7
8 from __future__ import division
9
10 import base64
11 import io
12 import sys
13
14 from PIL import Image
15 from PIL import ImageChops
16 from PIL import ImageColor
17 from PIL import ImageDraw
18 from PIL import ImageFont
19
20
21 OUT_FILE = sys.argv[1]
22
23 COLOR_FILE = "colors.txt"
24 ICON_FILE  = "icon.tga"
25
26 FONT_SIZE  = 16
27 FONT_COLOR = ImageColor.getrgb("#ffffff")
28 FONT_FILE  = io.BytesIO(base64.b64decode(b"""
29 d09GRgABAAAAAAUUAAwAAAAAB4gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABkAAAAEMAAABg
30 JRUnJmNtYXAAAAHsAAAAMwAAADwAqwBwY3Z0IAAAAiAAAAAEAAAABAACAChnYXNwAAAFDAAAAAgAAAAI
31 //8AA2dseWYAAAJMAAAB+QAAA+a7QJukaGVhZAAAARwAAAA2AAAANg3su5RoaGVhAAABVAAAABsAAAAk
32 AGIAGGhtdHgAAAHUAAAAGAAAACwAaAAqbG9jYQAAAiQAAAAoAAAAKAi0CaRtYXhwAAABcAAAAB4AAAAg
33 AFgAT25hbWUAAARIAAAAqwAAATwTBjdRcG9zdAAABPQAAAAWAAAAIP/5AAUAAQAAAAEAAMM3GptfDzz1
34 AAsAQAAAAADXUDESAAAAANdcTRUAAgAAACAAMAAAAAgAAgAAAAAAAHjaY2BkYGBw+P8BSKowgIACUAQV
35 MAMARxECeQB42mNgZGBgEGaQY2BmAAEmIGYEizkw6IEEAAhTAKgAAHjaLcWBBYBAFADQ96ujgJsgh4M4
36 hAZomuZppIYKgAo9eAY1TgmLhvF/1st00gQgAKB8XFaH7bllu4wAVUMRLwuVBoIAeNpjUGFgYgABFSBm
37 YeAAYlyQAwAP7gCTeNpjYGBgAmJmIBYBkoxgmoVBA0izAWlGoKwlQ9r//0C+AUPi////L/9fAxQFAwCT
38 agkVAAACACgAAAAoACgAKABNAF8AfACdALMAzQDuAQABMAFRAXIBiwGjAbwB3QHzeNptU42OmkAQHj5m
39 AAkiAiv2Ynv2aMrFXlpSQsyPL63P01foGzRJZ27hpM3FldXNzverBH0RlXSikGL6fg3ox+UWM/3+eY3k
40 1+UWQj/SNbRjseNbHAV/LrfAzodxcN0wtijyLDud8JUUhRXvSC+KtiFHdB7PQ+PitmuG89i1caPfXcxS
41 ipQBCujiFKk8ia4IOAK7cBWuKKBEkfaKlHgU145tnKQRB6tjuHp51uPgjW1LNOgdo/B8sRscyxaoUYnu
42 +0qQgSUX5LycrIn83HifNgDeAWWpauCEWRzbuL1lzbyWBUI26VPK0VRyjqxmTtIHabg4/KNzc2dzrRtm
43 ot1B9RlHgZozDYcIC/xqylFdLcPkqEQVVnOSpXyOOFzpdGSxzqxzgoMOjueRDyWKZ06f5JGXfa21rY+v
44 PJ2vbNnaOO3M1hzzxDgvH4l/KncGJPbE+y4MV+EM3DAN0RsJoNLwIZdXI+sIOfCG8EWzawyhPw9jb0X1
45 jWv7rleUtleUSqe30gTWmtYcgeUxQnFH6ClWl2QlmYjOZ8iaX1UCZZ/JgzD20L4WnJ6xUQqnVHHbszhY
46 ZXDTff6fwVxav2awNWXsVen9rI9wAL3ryvxMHJ1ZVErLZm8/4aBGYfOyScF1Ckz/j0/Ue0+zRqV1iWxQ
47 oCi+CSPlA/0FDP9QAgAAAHjaVcwzQwQAAAXgL5tLWOKa3XqNWUvG2cafj8fp+WFITo+u3iHMU+ddhs3X
48 ebdxq3XeY9p2nfe2dfrMOqnz/jZ/zLjHOh/3KuZGUElQTlTKojNB1T99JiVty75rQWFFCW8d/qIt6zbd
49 C8rJi0pLNd1FAQGbTR1RUJBxbMOGDzlBbwqiSoI+pCUlpaXkrUvLCduQUfQuIerD51/nTVTKhpqgnLSN
50 //9vR8ImfAB42mNgZgCD/98YWIAUIwMaAAAu5AH+AAAAAAAB//8AAg==
51 """))
52
53 POSITIONS = (
54         (0.2500, 0.250), (0.2500, 1.375), (0.2500, 2.500), (0.2500, 3.625),
55         (0.8125, 4.750), (1.3750, 3.625), (1.3750, 2.500), (1.3750, 1.375),
56         (1.9375, 0.250), (2.5000, 1.375), (2.5000, 2.500), (2.5000, 3.625),
57         (3.0625, 4.750), (3.6250, 3.625), (3.6250, 2.500), (3.6250, 1.375),
58         (4.1875, 0.250), (4.7500, 1.375), (4.7500, 2.500), (4.7500, 3.625),
59         (5.3125, 4.750), (5.8750, 3.625), (5.8750, 2.500), (5.8750, 1.375),
60         (5.8750, 0.250),
61 )
62
63
64 # Load colors
65 colors = []
66 with open(COLOR_FILE) as stream:
67         for line in stream:
68                 colors.append(line.split()[0])
69
70 # Load files
71 font = ImageFont.truetype(FONT_FILE, FONT_SIZE)
72 icon = Image.open(ICON_FILE).convert("RGBA")
73 iconW, iconH = icon.size
74
75 # Prepare collage image
76 collage = Image.new("RGBA", (int(7.125*iconW), int(6.0*iconH)))
77 collageDraw = ImageDraw.Draw(collage)
78
79 # Draw collage
80 for position, rgbString in zip(POSITIONS, colors):
81
82         x = int(position[0] * iconW)
83         y = int(position[1] * iconH)
84
85         # Draw colorized icon
86         addColor = ImageColor.getrgb("#" + rgbString + "00")
87         addImage = Image.new("RGBA", icon.size, addColor)
88         sumImage = ImageChops.add(icon, addImage)
89
90         collage.alpha_composite(sumImage, (x, y))
91
92         # Draw text label
93         labelColor = ImageColor.getrgb("#" + rgbString + "ff")
94         textW, textH = collageDraw.textsize(rgbString, font)
95         labelW = textW + 5
96         labelH = textH + 2
97         labelX = x + (iconW - labelW) // 2
98         labelY = y + iconH - (labelH // 2)
99         labelRect = (labelX, labelY, labelX + labelW, labelY + labelH)
100         textPos = (labelX + 3, labelY)
101
102         collageDraw.rectangle(labelRect, labelColor)
103         collageDraw.text(textPos, rgbString, FONT_COLOR, font)
104
105 collage.save(OUT_FILE)