File: convert_3dlut.py

package info (click to toggle)
intel-gpu-tools 2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 64,504 kB
  • sloc: xml: 781,458; ansic: 378,272; python: 8,407; yacc: 2,781; perl: 1,196; sh: 1,177; lex: 487; asm: 227; lisp: 35; makefile: 30
file content (94 lines) | stat: -rwxr-xr-x 2,709 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python3
# SPDX-License-Identifier: (GPL-2.0 OR MIT)

## Copyright (C) 2024 Advanced Micro Devices, Inc.         ##
## Author: Alex Hung <alex.hung@amd.com>                   ##

import sys, os, argparse
import numpy as np
import pprint

import pprint

class Color:
    def __init__(self, r, g, b):
        self.r = r
        self.g = g
        self.b = b
    def __str__(self):
        r = self.r
        g = self.g
        b = self.b
        rgb = "\t{ " + ".red = {0:05f}, .green = {1:05f}, .blue = {2:05f}".format(r, g, b) + " },"
        return rgb

def print_lut(ind, lut):
    for i, v in enumerate(lut):
        if (i - ind) % (17 * 17) == 0:
            print(str(i) + " " + v)
            #print(v)

def parse_lut_file(file_path, max_value=4095):
    lut = []

    try:
        with open(file_path, "r") as file:
            for line in file:
                values = line.strip().split()  # Split values by spaces or tabs
                if len(values) == 3:
                    r, g, b = map(float, values)  # Convert to floats
                    r = r / max_value
                    g = g / max_value
                    b = b / max_value
                    color = Color(r, g, b)
                    lut.append(color)
                else:
                    print(f"Skipping invalid line: '{line.strip()}'")
    except FileNotFoundError:
        print(f"File '{file_path}' not found.")

    return lut

def fill_3d_array(lut, size=17):
    lut3d = np.zeros((size, size, size), dtype=object)

    for i in range(size):
        for j in range(size):
            for k in range(size):
                index = i * (size ** 2) +  j * size + k
                color = lut[index]
                lut3d[i][j][k] = color
    return lut3d

def print_3d_array_rgb(lut3d, size=17):
    for i in range(size):
        for j in range(size):
            for k in range(size):
                print(lut3d[i][j][k])

def print_3d_array_bgr(lut3d, size=17):
    for i in range(size):
        for j in range(size):
            for k in range(size):
                print(lut3d[k][j][i])

def main():

    parser = argparse.ArgumentParser(description='Convert integer values in a 3D LUT file to IGT format.')
    parser.add_argument("-f", "--input", help="3D LUT file", required=True)
    parser.add_argument("-t", "--traversal", help="traversal order", required=True)
    args = parser.parse_args()

    lut = parse_lut_file(args.input)
    lut3d = fill_3d_array(lut)

    if args.traversal.lower() == "rgb":
        print_3d_array_rgb(lut3d)
    elif args.traversal.lower() == "bgr":
        print_3d_array_bgr(lut3d)

    return 0

if __name__ == "__main__":
    ret = main()
    sys.exit(ret)