from __future__ import print_function

CopyRight = '''
/**************************************************************************
 *
 * Copyright 2010 VMware, Inc.
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 **************************************************************************/

/**
 * @file
 * SRGB translation.
 *
 * @author Brian Paul <brianp@vmware.com>
 * @author Michal Krol <michal@vmware.com>
 * @author Jose Fonseca <jfonseca@vmware.com>
 */
'''


import math
import struct


def srgb_to_linear(x):
    if x <= 0.04045:
        return x / 12.92
    else:
        return math.pow((x + 0.055) / 1.055, 2.4)


def linear_to_srgb(x):
    if x >= 0.0031308:
        return 1.055 * math.pow(x, 0.41666666) - 0.055
    else:
        return 12.92 * x


def generate_srgb_tables():
    print('const float')
    print('util_format_srgb_8unorm_to_linear_float_table[256] = {')
    for j in range(0, 256, 4):
        print('   ', end=' ')
        print(' '.join(['%.7e,' % srgb_to_linear(i / 255.0) for i in range(j, j + 4)]))
    print('};')
    print()
    print('const uint8_t')
    print('util_format_srgb_to_linear_8unorm_table[256] = {')
    for j in range(0, 256, 16):
        print('   ', end=' ')
        print(' '.join(['%3u,' % int(srgb_to_linear(i / 255.0) * 255.0 + 0.5) for i in range(j, j + 16)]))
    print('};')
    print()
    print('const uint8_t')
    print('util_format_linear_to_srgb_8unorm_table[256] = {')
    for j in range(0, 256, 16):
        print('   ', end=' ')
        print(' '.join(['%3u,' % int(linear_to_srgb(i / 255.0) * 255.0 + 0.5) for i in range(j, j + 16)]))
    print('};')
    print()

# calculate the table interpolation values used in float linear to unorm8 srgb
    numexp = 13
    mantissa_msb = 3
# stepshift is just used to only use every x-th float to make things faster,
# 5 is largest value which still gives exact same table as 0
    stepshift = 5
    nbuckets = numexp << mantissa_msb
    bucketsize = (1 << (23 - mantissa_msb)) >> stepshift
    mantshift = 12
    valtable = []
    sum_aa = float(bucketsize)
    sum_ab = 0.0
    sum_bb = 0.0
    for i in range(0, bucketsize):
        j = (i << stepshift) >> mantshift
        sum_ab += j
        sum_bb += j*j
    inv_det = 1.0 / (sum_aa * sum_bb - sum_ab * sum_ab)

    for bucket in range(0, nbuckets):
        start = ((127 - numexp) << 23) + bucket*(bucketsize << stepshift)
        sum_a = 0.0
        sum_b = 0.0

        for i in range(0, bucketsize):
            j = (i << stepshift) >> mantshift
            fint = start + (i << stepshift)
            ffloat = struct.unpack('f', struct.pack('I', fint))[0]
            val = linear_to_srgb(ffloat) * 255.0 + 0.5
            sum_a += val
            sum_b += j*val

        solved_a = inv_det * (sum_bb*sum_a - sum_ab*sum_b)
        solved_b = inv_det * (sum_aa*sum_b - sum_ab*sum_a)

        scaled_a = solved_a * 65536.0 / 512.0
        scaled_b = solved_b * 65536.0

        int_a = int(scaled_a + 0.5)
        int_b = int(scaled_b + 0.5)

        valtable.append((int_a << 16) + int_b)

    print('const unsigned')
    print('util_format_linear_to_srgb_helper_table[104] = {')

    for j in range(0, nbuckets, 4):
        print('   ', end=' ')
        print(' '.join(['0x%08x,' % valtable[i] for i in range(j, j + 4)]))
    print('};')
    print()

def main():
    print('/* This file is autogenerated by u_format_srgb.py. Do not edit directly. */')
    print()
    # This will print the copyright message on the top of this file
    print(CopyRight.strip())
    print()
    print('#include "format_srgb.h"')
    print()
    generate_srgb_tables()


if __name__ == '__main__':
    main()
