1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CopyRight = '''
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2010 VMware, Inc.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * The above copyright notice and this permission notice (including the
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * next paragraph) shall be included in all copies or substantial portions
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * of the Software.
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch **************************************************************************/
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/**
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * @file
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SRGB translation.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @author Brian Paul <brianp@vmware.com>
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @author Michal Krol <michal@vmware.com>
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * @author Jose Fonseca <jfonseca@vmware.com>
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) */
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)'''
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import math
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochdef srgb_to_linear(x):
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if x <= 0.04045:
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        return x / 12.92
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return math.pow((x + 0.055) / 1.055, 2.4)
50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def linear_to_srgb(x):
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if x >= 0.0031308:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1.055 * math.pow(x, 0.41666) - 0.055
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 12.92 * x
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def generate_srgb_tables():
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'const float'
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'util_format_srgb_8unorm_to_linear_float_table[256] = {'
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    for j in range(0, 256, 4):
623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        print '   ',
633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        for i in range(j, j + 4):
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch            print '%.7e,' % (srgb_to_linear(i / 255.0),),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print '};'
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    print 'const uint8_t'
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'util_format_srgb_to_linear_8unorm_table[256] = {'
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for j in range(0, 256, 16):
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print '   ',
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        for i in range(j, j + 16):
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            print '%3u,' % (int(srgb_to_linear(i / 255.0) * 255.0 + 0.5),),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print '};'
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'const uint8_t'
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'util_format_linear_to_srgb_8unorm_table[256] = {'
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for j in range(0, 256, 16):
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print '   ',
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        for i in range(j, j + 16):
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            print '%3u,' % (int(linear_to_srgb(i / 255.0) * 255.0 + 0.5),),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    print '};'
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    print
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def main():
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print '/* This file is autogenerated by u_format_srgb.py. Do not edit directly. */'
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This will print the copyright message on the top of this file
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print CopyRight.strip()
933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    print
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print '#include "u_format_srgb.h"'
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    print
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generate_srgb_tables()
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    main()
101bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch