def log2(n): return { 1: 0, 2: 1, 4: 2, 8: 3, 16: 4, 32: 5, 64: 6, 128: 7, 256: 8, 512: 9, 1024: 10, }[n] def from_xy(x, y, width, height): # maximum texture size : 1024x1024 # maximum 1-dimensional index: 0xfffff # bits : 19-0 # y bits: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 # x bits: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 width_max = log2(width) height_max = log2(height) twiddle_ix = 0 for i in range(20 // 2): if (i < width_max and i < height_max): twiddle_ix |= ((y >> i) & 1) << (i * 2 + 0) twiddle_ix |= ((x >> i) & 1) << (i * 2 + 1) elif (i < width_max): twiddle_ix |= ((x >> i) & 1) << (i + height_max) elif (i < height_max): twiddle_ix |= ((y >> i) & 1) << (i + width_max) else: break return twiddle_ix def npot(v): v -= 1; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v += 1; return v def texture(dst, src, width, height): #pot_height = npot(height) max_twiddle_ix = -1 for y in range(height): for x in range(width): twiddle_ix = from_xy(x, y, width, height) value = src[y * width + x] dst[twiddle_ix] = value if twiddle_ix > max_twiddle_ix: max_twiddle_ix = twiddle_ix return max_twiddle_ix