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