From 712d67414f46cf8db0a04a35ad03c3e5ed73433c Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 28 Jan 2026 22:54:23 +0100 Subject: [PATCH] tinydisplay: Convert Python scripts to Python 3 --- panda/src/tinydisplay/store_pixel.py | 64 ++++++++++++------------ panda/src/tinydisplay/ztriangle.py | 73 ++++++++++++++-------------- 2 files changed, 69 insertions(+), 68 deletions(-) mode change 100644 => 100755 panda/src/tinydisplay/store_pixel.py diff --git a/panda/src/tinydisplay/store_pixel.py b/panda/src/tinydisplay/store_pixel.py old mode 100644 new mode 100755 index 10e5151bf8..4aa1a7b111 --- a/panda/src/tinydisplay/store_pixel.py +++ b/panda/src/tinydisplay/store_pixel.py @@ -48,68 +48,68 @@ def getFname(op_a, op_b, mask): # We write the code that actually instantiates the various # pixel-storing functions to store_pixel_code.h. -code = open('store_pixel_code.h', 'wb') -print >> code, '/* This file is generated code--do not edit. See store_pixel.py. */' -print >> code, '' +code = open('store_pixel_code.h', 'w') +print('/* This file is generated code--do not edit. See store_pixel.py. */', file=code) +print('', file=code) # The external reference for the table containing the above function # pointers gets written here. -table = open('store_pixel_table.h', 'wb') -print >> table, '/* This file is generated code--do not edit. See store_pixel.py. */' -print >> table, '' +table = open('store_pixel_table.h', 'w') +print('/* This file is generated code--do not edit. See store_pixel.py. */', file=table) +print('', file=table) for op_a in Operands: for op_b in Operands: for mask in range(0, 16): fname = getFname(op_a, op_b, mask) - print >> code, '#define FNAME(name) %s' % (fname) + print('#define FNAME(name) %s' % (fname), file=code) if mask & (1 | 2 | 3): - print >> code, '#define FNAME_S(name) %s_s' % (fname) + print('#define FNAME_S(name) %s_s' % (fname), file=code) - print >> code, '#define OP_A(f, i) ((unsigned int)(%s))' % (CodeTable[op_a]) - print >> code, '#define OP_B(f, i) ((unsigned int)(%s))' % (CodeTable[op_b]) + print('#define OP_A(f, i) ((unsigned int)(%s))' % (CodeTable[op_a]), file=code) + print('#define OP_B(f, i) ((unsigned int)(%s))' % (CodeTable[op_b]), file=code) for b in range(0, 4): if (mask & (1 << b)): - print >> code, "#define STORE_PIXEL_%s(fr, r) STORE_PIX_CLAMP(r)" % (b) + print("#define STORE_PIXEL_%s(fr, r) STORE_PIX_CLAMP(r)" % (b), file=code) else: - print >> code, "#define STORE_PIXEL_%s(fr, r) (fr)" % (b) - print >> code, '#include "store_pixel.h"' - print >> code, '' + print("#define STORE_PIXEL_%s(fr, r) (fr)" % (b), file=code) + print('#include "store_pixel.h"', file=code) + print('', file=code) # Now, generate the table of function pointers. arraySize = '[%s][%s][16]' % (len(Operands), len(Operands)) -print >> table, 'extern const ZB_storePixelFunc store_pixel_funcs%s;' % (arraySize) -print >> code, 'const ZB_storePixelFunc store_pixel_funcs%s = {' % (arraySize) +print('extern const ZB_storePixelFunc store_pixel_funcs%s;' % (arraySize), file=table) +print('const ZB_storePixelFunc store_pixel_funcs%s = {' % (arraySize), file=code) for op_a in Operands: - print >> code, ' {' + print(' {', file=code) for op_b in Operands: - print >> code, ' {' + print(' {', file=code) for mask in range(0, 16): fname = getFname(op_a, op_b, mask) - print >> code, ' %s,' % (fname) - print >> code, ' },' - print >> code, ' },' -print >> code, '};' + print(' %s,' % (fname), file=code) + print(' },', file=code) + print(' },', file=code) +print('};', file=code) -print >> code +print('', file=code) # Now do this again, but for the sRGB function pointers. -print >> table, 'extern const ZB_storePixelFunc store_pixel_funcs_sRGB%s;' % (arraySize) -print >> code, 'const ZB_storePixelFunc store_pixel_funcs_sRGB%s = {' % (arraySize) +print('extern const ZB_storePixelFunc store_pixel_funcs_sRGB%s;' % (arraySize), file=table) +print('const ZB_storePixelFunc store_pixel_funcs_sRGB%s = {' % (arraySize), file=code) for op_a in Operands: - print >> code, ' {' + print(' {', file=code) for op_b in Operands: - print >> code, ' {' + print(' {', file=code) for mask in range(0, 16): fname = getFname(op_a, op_b, mask) if mask & (1 | 2 | 3): - print >> code, ' %s_s,' % (fname) + print(' %s_s,' % (fname), file=code) else: - print >> code, ' %s,' % (fname) - print >> code, ' },' - print >> code, ' },' -print >> code, '};' + print(' %s,' % (fname), file=code) + print(' },', file=code) + print(' },', file=code) +print('};', file=code) diff --git a/panda/src/tinydisplay/ztriangle.py b/panda/src/tinydisplay/ztriangle.py index e0e5f9a848..1c26434376 100755 --- a/panda/src/tinydisplay/ztriangle.py +++ b/panda/src/tinydisplay/ztriangle.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ This simple Python script can be run to generate ztriangle_code_*.h, ztriangle_table.*, and ztriangle_*.cxx, which are a poor man's form of generated code to cover the explosion of @@ -34,6 +34,7 @@ Options = [ ] # The total number of different combinations of the various Options, above. +from functools import reduce OptionsCount = reduce(lambda a, b: a * b, map(lambda o: len(o), Options)) # The various combinations of these options are explicit within @@ -99,7 +100,7 @@ ZTriangleStub = """ """ ops = [0] * len(Options) -class DoneException: +class DoneException(Exception): pass # We write the code that actually instantiates the various @@ -148,11 +149,11 @@ def getFref(ops): def closeCode(): """ Close the previously-opened code file. """ if code: - print >> code, '' - print >> code, 'ZB_fillTriangleFunc ztriangle_code_%s[%s] = {' % (codeSeg, len(fnameList)) + print('', file=code) + print('ZB_fillTriangleFunc ztriangle_code_%s[%s] = {' % (codeSeg, len(fnameList)), file=code) for fname in fnameList: - print >> code, ' %s,' % (fname) - print >> code, '};' + print(' %s,' % (fname), file=code) + print('};', file=code) code.close() @@ -173,13 +174,13 @@ def openCode(count): fnameList = [] # Open a new file. - code = open('ztriangle_code_%s.h' % (codeSeg), 'wb') - print >> code, '/* This file is generated code--do not edit. See ztriangle.py. */' - print >> code, '' + code = open('ztriangle_code_%s.h' % (codeSeg), 'w') + print('/* This file is generated code--do not edit. See ztriangle.py. */', file=code) + print('', file=code) # Also generate ztriangle_*.cxx, to include the above file. - zt = open('ztriangle_%s.cxx' % (codeSeg), 'wb') - print >> zt, ZTriangleStub % (codeSeg) + zt = open('ztriangle_%s.cxx' % (codeSeg), 'w') + print(ZTriangleStub % (codeSeg), file=zt) # First, generate the code. count = 0 @@ -189,14 +190,14 @@ try: for i in range(len(ops)): keyword = Options[i][ops[i]] - print >> code, CodeTable[keyword] + print(CodeTable[keyword], file=code) # This reference gets just the initial fname: omitting the # ExtraOptions, which are implicit in ztriangle_two.h. fname = getFname(ops) - print >> code, '#define FNAME(name) %s_ ## name' % (fname) - print >> code, '#include "ztriangle_two.h"' - print >> code, '' + print('#define FNAME(name) %s_ ## name' % (fname), file=code) + print('#include "ztriangle_two.h"', file=code) + print('', file=code) # We store the full fnames generated by the above lines # (including the ExtraOptions) in the fnameDict and fnameList @@ -220,22 +221,22 @@ closeCode() # The external reference for the table containing the above function # pointers gets written here. -table_decl = open('ztriangle_table.h', 'wb') -print >> table_decl, '/* This file is generated code--do not edit. See ztriangle.py. */' -print >> table_decl, '' +table_decl = open('ztriangle_table.h', 'w') +print('/* This file is generated code--do not edit. See ztriangle.py. */', file=table_decl) +print('', file=table_decl) # The actual table definition gets written here. -table_def = open('ztriangle_table.cxx', 'wb') -print >> table_def, '/* This file is generated code--do not edit. See ztriangle.py. */' -print >> table_def, '' -print >> table_def, '#include "pandabase.h"' -print >> table_def, '#include "zbuffer.h"' -print >> table_def, '#include "ztriangle_table.h"' -print >> table_def, '' +table_def = open('ztriangle_table.cxx', 'w') +print('/* This file is generated code--do not edit. See ztriangle.py. */', file=table_def) +print('', file=table_def) +print('#include "pandabase.h"', file=table_def) +print('#include "zbuffer.h"', file=table_def) +print('#include "ztriangle_table.h"', file=table_def) +print('', file=table_def) for i in range(NumSegments): - print >> table_def, 'extern ZB_fillTriangleFunc ztriangle_code_%s[];' % (i + 1) -print >> table_def, '' + print('extern ZB_fillTriangleFunc ztriangle_code_%s[];' % (i + 1), file=table_def) +print('', file=table_def) def writeTableEntry(ops): indent = ' ' * (len(ops) + 1) @@ -245,27 +246,27 @@ def writeTableEntry(ops): if i + 1 == len(FullOptions): # The last level: write out the actual function names. for j in range(numOps - 1): - print >> table_def, indent + getFref(ops + [j]) + ',' - print >> table_def, indent + getFref(ops + [numOps - 1]) + print(indent + getFref(ops + [j]) + ',', file=table_def) + print(indent + getFref(ops + [numOps - 1]), file=table_def) else: # Intermediate levels: write out a nested reference. for j in range(numOps - 1): - print >> table_def, indent + '{' + print(indent + '{', file=table_def) writeTableEntry(ops + [j]) - print >> table_def, indent + '},' - print >> table_def, indent + '{' + print(indent + '},', file=table_def) + print(indent + '{', file=table_def) writeTableEntry(ops + [numOps - 1]) - print >> table_def, indent + '}' + print(indent + '}', file=table_def) arraySizeList = [] for opList in FullOptions: arraySizeList.append('[%s]' % (len(opList))) arraySize = ''.join(arraySizeList) -print >> table_def, 'const ZB_fillTriangleFunc fill_tri_funcs%s = {' % (arraySize) -print >> table_decl, 'extern const ZB_fillTriangleFunc fill_tri_funcs%s;' % (arraySize) +print('const ZB_fillTriangleFunc fill_tri_funcs%s = {' % (arraySize), file=table_def) +print('extern const ZB_fillTriangleFunc fill_tri_funcs%s;' % (arraySize), file=table_decl) writeTableEntry([]) -print >> table_def, '};' +print('};', file=table_def)