1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#!/usr/bin/env python3
"""Generate ggaze loader test fixtures (run manually; outputs are committed).
Produces, under the directory passed as argv[1] (or beside this script):
plain.jpg 6x3 JPEG, EXIF Orientation = 1 -> loader yields 6x3
rot6.jpg 8x4 JPEG, EXIF Orientation = 6 -> loader yields 4x8
small.png 5x2 PNG (no orientation) -> loader yields 5x2
Uses only the Python stdlib + cjpeg + exiftool.
"""
import os
import struct
import subprocess
import sys
import zlib
def write_ppm(path, w, h):
# Distinct-ish RGB so frames are not blank.
data = bytearray()
for y in range(h):
for x in range(w):
data += bytes((x * 30 % 256, y * 60 % 256, (x + y) * 17 % 256))
with open(path, "wb") as f:
f.write(b"P6\n%d %d\n255\n" % (w, h))
f.write(bytes(data))
def write_png(path, w, h, alpha=False):
sig = b"\x89PNG\r\n\x1a\n"
color_type = 6 if alpha else 2 # 6 = RGBA, 2 = RGB
channels = 4 if alpha else 3
def chunk(typ, data):
return (struct.pack(">I", len(data)) + typ + data
+ struct.pack(">I", zlib.crc32(typ + data) & 0xffffffff))
ihdr = struct.pack(">IIBBBBB", w, h, 8, color_type, 0, 0, 0)
raw = bytearray()
for y in range(h):
raw.append(0) # filter: none
for x in range(w):
r = (x * 50) % 256
g = (y * 90) % 256
b = (x * 7 + y * 11) % 256
if alpha:
a = (255 - (x + y) * 30) % 256 # varied alpha
raw += bytes((r, g, b, a))
else:
raw += bytes((r, g, b))
idat = zlib.compress(bytes(raw))
with open(path, "wb") as f:
f.write(sig + chunk(b"IHDR", ihdr) + chunk(b"IDAT", idat)
+ chunk(b"IEND", b""))
def main():
out = sys.argv[1] if len(sys.argv) > 1 else os.path.dirname(
os.path.abspath(__file__))
# plain.jpg: 6x3, orientation 1
write_ppm(os.path.join(out, "_plain.ppm"), 6, 3)
subprocess.run(["cjpeg", "-quality", "90", "-outfile",
os.path.join(out, "plain.jpg"),
os.path.join(out, "_plain.ppm")], check=True)
subprocess.run(["exiftool", "-overwrite_original", "-Orientation#=1",
os.path.join(out, "plain.jpg")], check=True)
# rot6.jpg: 8x4, orientation 6 (rotate 90 CW -> displayed 4x8)
write_ppm(os.path.join(out, "_rot6.ppm"), 8, 4)
subprocess.run(["cjpeg", "-quality", "90", "-outfile",
os.path.join(out, "rot6.jpg"),
os.path.join(out, "_rot6.ppm")], check=True)
subprocess.run(["exiftool", "-overwrite_original", "-Orientation#=6",
os.path.join(out, "rot6.jpg")], check=True)
# small.png: 5x2 RGB
write_png(os.path.join(out, "small.png"), 5, 2, alpha=False)
# rgba.png: 5x2 RGBA (exercises the has-alpha branch of texture_from_pixbuf)
write_png(os.path.join(out, "rgba.png"), 5, 2, alpha=True)
# tidy intermediates
for p in ("_plain.ppm", "_rot6.ppm"):
try:
os.remove(os.path.join(out, p))
except FileNotFoundError:
pass
print("fixtures generated in", out)
if __name__ == "__main__":
main()
|