texmode = [
  "GPUTextureMode::Palette4Bit",
  "GPUTextureMode::Palette8Bit",
  "GPUTextureMode::Direct16Bit",
  "GPUTextureMode::Direct16Bit",

  "GPUTextureMode::RawPalette4Bit",
  "GPUTextureMode::RawPalette8Bit",
  "GPUTextureMode::RawDirect16Bit",
  "GPUTextureMode::RawDirect16Bit",

  "GPUTextureMode::Disabled"
]

transparentmode = [
  "GPUTransparencyMode::HalfBackgroundPlusHalfForeground",
  "GPUTransparencyMode::BackgroundPlusForeground",
  "GPUTransparencyMode::BackgroundMinusForeground",
  "GPUTransparencyMode::BackgroundPlusQuarterForeground",
  "GPUTransparencyMode::Disabled"
]

bools = ["false", "true"]


"""
print("const GPU_SW_Backend::DrawRectangleFunction GPU_SW_Backend::s_rectangle_draw_functions[%d][%d][2] = {" % (len(texmode), len(transparentmode)))
for texture in range(len(texmode)):
  print("  { // %s" % texmode[texture])
  for transparency in range(len(transparentmode)):
    print("    { // %s" % transparentmode[transparency])
    for check_mask in range(2):
      line = "&GPU_SW_Backend::DrawRectangle<%s, %s, %s>" % (texmode[texture], transparentmode[transparency], bools[check_mask])
      print("      %s%s" % (line, "," if check_mask == 0 else ""))
    print("    }%s" % ("," if transparency < (len(transparentmode) - 1) else ""))
  print("  }%s" % ("," if texture < (len(texmode) - 1) else ""))
print("};")
"""

"""
print("const GPU_SW_Backend::DrawTriangleFunction GPU_SW_Backend::s_triangle_draw_functions[2][%d][%d][2][2] = {" % (len(texmode), len(transparentmode)))
for shading in range(2):
  print("  { // shading %s" % bools[shading])
  for texture in range(len(texmode)):
    print("    { // %s" % texmode[texture])
    for transparency in range(len(transparentmode)):
      print("      { // %s" % transparentmode[transparency])
      for dither in range(2):
        print("        { // dither %s" % bools[dither])
        for check_mask in range(2):
          line = "&GPU_SW_Backend::DrawTriangle<%s, %s, %s, %s, %s>" % (bools[shading], texmode[texture], transparentmode[transparency], bools[dither], bools[check_mask])
          print("          %s%s" % (line, "," if check_mask == 0 else ""))
        print("        }%s" % ("," if dither == 0 else ""))
      print("      }%s" % ("," if transparency < (len(transparentmode) - 1) else ""))
    print("    }%s" % ("," if texture < (len(texmode) - 1) else ""))
  print("  }%s" % ("," if shading == 0 else ""))
print("};")
"""

print("const GPU_SW_Backend::DrawLineFunction GPU_SW_Backend::s_line_draw_functions[2][%d][2][2] = {" % (len(transparentmode)))
for shading in range(2):
  print("  { // shading %s" % bools[shading])
  for transparency in range(len(transparentmode)):
    print("      { // %s" % transparentmode[transparency])
    for dither in range(2):
      print("        { // dither %s" % bools[dither])
      for check_mask in range(2):
        line = "&GPU_SW_Backend::DrawLine<%s, %s, %s, %s>" % (bools[shading], transparentmode[transparency], bools[dither], bools[check_mask])
        print("          %s%s" % (line, "," if check_mask == 0 else ""))
      print("        }%s" % ("," if dither == 0 else ""))
    print("      }%s" % ("," if transparency < (len(transparentmode) - 1) else ""))
  print("  }%s" % ("," if shading == 0 else ""))
print("};")