1#!/usr/bin/python
2
3import struct
4
5def half(i):
6 fs, fe, fm = ((i >> 31) & 0x1, (i >> 23) & 0xff, i & 0x7fffff)
7 s, e, m = (fs, 0, 0)
8
9 if (fe == 0x0):
10  pass
11 if ((fe == 0xff) and (fm == 0x0)):
12  e = 31
13 elif (fe == 0xff):
14  m = 1
15  e = 31
16 else:
17  exp = fe - 127;
18  if (exp < -24):
19   pass
20  elif (exp < -14):
21   temp = 10 - (-14 - exp)
22   m = 2**temp + (m >> (23 - temp))
23  elif (exp > 15):
24   e = 31
25  else:
26   e = exp + 15
27   m = fm >> 13
28
29 return ((s << 15) | (e << 10) | m)
30
31def texgen(pix):
32
33 tex = []
34
35 for i in range(0,pix,4):
36
37  a = i / float(pix)
38  a2 = a ** 2
39  a3 = a ** 3
40
41  w0 = 1 / 6.0 * (-a3 + 3 * a2 + -3 * a + 1)
42  w1 = 1 / 6.0 * (3 * a3 + -6 * a2 + 4)
43  w2 = 1 / 6.0 * (-3 * a3 + 3 * a2 + 3 * a + 1)
44  w3 = 1 / 6.0 * a3
45
46  tex.append(-(1 - (w1 / (w0 + w1)) + a))
47  tex.append(1 + (w3 / (w2 + w3)) - a)
48  tex.append(w0 + w1)
49  tex.append(w2 + w3)
50
51 return tex
52
53def printrow(l, offset):
54
55 seq = [ struct.unpack('<I',struct.pack('f',i))[0] for i in l[offset:offset+4] ]
56 seq = [ hex(half(i)) for i in seq ]
57 return "\t" + ", ".join(seq) + ","
58
59def maketable(pix):
60
61 l = texgen(pix)
62
63 print "static const uint16_t bicubic_tex_" + str(pix) + "[] = {"
64
65 for i in range(0, pix, 4):
66
67  print printrow(l, i)
68
69 print "\t0 };\n"
70
71maketable(512)
72maketable(2048)
73