﻿// basisu_tool.cpp
// Copyright (C) 2019-2025 Binomial LLC. All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#if _MSC_VER
// For sprintf(), strcpy() 
#define _CRT_SECURE_NO_WARNINGS (1)
#pragma warning(disable:4505) //  unreferenced function with internal linkage has been removed
#pragma warning(disable:4189) // local variable is initialized but not referenced
#pragma warning(disable:4100) // unreferenced formal parameter
#endif

#include "transcoder/basisu.h"
#include "transcoder/basisu_transcoder_internal.h"
#include "encoder/basisu_enc.h"
#include "encoder/basisu_xbc7_encode.h"
#include "transcoder/basisu_xbc7_decoder.h"
#include "encoder/basisu_etc.h"
#include "encoder/basisu_gpu_texture.h"
#include "encoder/basisu_frontend.h"
#include "encoder/basisu_backend.h"
#include "encoder/basisu_comp.h"
#include "transcoder/basisu_transcoder.h"
#include "encoder/basisu_ssim.h"
#include "encoder/basisu_opencl.h"
#include "encoder/basisu_astc_ldr_common.h"

#define MINIZ_HEADER_FILE_ONLY
#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES
#include "encoder/basisu_miniz.h"

#include <queue>
#include <array>
#include <initializer_list>
#include <filesystem>

#include "encoder/basisu_resampler.h"
#include "encoder/basisu_resampler_filters.h"
#include "basisu_text_image.h"
#include "encoder/basisu_dds_export.h"
#include "encoder/pvpngreader.h"

#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
// Work around Win11 debug console bug. DO NOT SHIP SET TO 1.
#define CLEAR_WIN32_CONSOLE 0
#endif

// Set BASISU_CATCH_EXCEPTIONS if you want exceptions to crash the app, otherwise main() catches them.
#ifndef BASISU_CATCH_EXCEPTIONS
	#define BASISU_CATCH_EXCEPTIONS 0
#endif

using namespace basisu;
using namespace buminiz;

#define BASISU_TOOL_VERSION "2.50.0"

#if defined(DEBUG)
#pragma message("DEBUG defined")
#endif

#if defined(_DEBUG)
#pragma message("_DEBUG defined")
#endif

#ifndef NDEBUG
#if !defined(DEBUG) && !defined(_DEBUG)
#pragma message("NDEBUG is NOT defined, but DEBUG or _DEBUG are also NOT defined, which isn't ideal as extra debug assertion checks will not be compiled.")
#endif
#endif

// Define to lower the -test and -test_hdr tolerances
//#define USE_TIGHTER_TEST_TOLERANCES

// Only enable to verify SAN is working.
//#define FORCE_SAN_FAILURE

enum tool_mode
{
	cDefault,
	cCompress,
	cValidate,
	cInfo,
	cUnpack,
	cCompare,
	cCompareHVS,
	cHDRCompare,
	cImageDumpStats,
	cVersion,
	cBench,
	cCompSize,
	cTestLDR,
	cTestHDR_4x4,
	cTestHDR_6x6,
	cTestHDR_6x6i,
	cTestXUASTCLDR,
	cTestCodecs,
	cTestCodecsGen,
	cCLBench,
	cSplitImage,
	cCombineImages,
	cExtractChannel,
	cExtractSwizzle,
	cExtractRegion,
	cTextToPng,
	cPngToText,
	cTonemapImage,
	cDDS,
	cExportDDS,
	cExportKTX,
	cTinyDDSInfo,
	cKTXInfo,
	cBenchmarkSingle,
	cBenchmarkSweep
};

static void print_usage()
{
	printf("\nUsage: basisu filename [filename ...] <options>\n");

	puts(
#include "basisu_tool_help.h"
	);
}

static bool load_listing_file(const std::string &f, basisu::vector<std::string> &filenames)
{
	std::string filename(f);
	filename.erase(0, 1);

	FILE *pFile = nullptr;
#ifdef _WIN32
	fopen_s(&pFile, filename.c_str(), "r");
#else
	pFile = fopen(filename.c_str(), "r");
#endif

	if (!pFile)
	{
		error_printf("Failed opening listing file: \"%s\"\n", filename.c_str());
		return false;
	}

	uint32_t total_filenames = 0;

	for ( ; ; )
	{
		char buf[3072];
		buf[0] = '\0';

		char *p = fgets(buf, sizeof(buf), pFile);
		if (!p)
		{
			if (ferror(pFile))
			{
				error_printf("Failed reading from listing file: \"%s\"\n", filename.c_str());

				fclose(pFile);
				return false;
			}
			else
				break;
		}

		std::string read_filename(p);
		while (read_filename.size())
		{
			if (read_filename[0] == ' ')
				read_filename.erase(0, 1);
			else 
				break;
		}

		while (read_filename.size())
		{
			const char c = read_filename.back();
			if ((c == ' ') || (c == '\n') || (c == '\r'))
				read_filename.erase(read_filename.size() - 1, 1);
			else 
				break;
		}

		if (read_filename.size())
		{
			filenames.push_back(read_filename);
			total_filenames++;
		}
	}

	fclose(pFile);

	printf("Successfully read %u filenames(s) from listing file \"%s\"\n", total_filenames, filename.c_str());

	return true;
}

// Command line option matching helper. Recognizes an option by its canonical
// name (given with a single leading dash, e.g. "-etc1s"), accepting both the
// "-name" and Unix-style "--name" forms, case-insensitively.
static inline bool opt_match(const char *pArg, const char *pName)
{
	if (strcasecmp(pArg, pName) == 0)
		return true;
	// Accept the "--name" variant when the canonical name is "-name".
	if ((pArg[0] == '-') && (pArg[1] == '-') && (pName[0] == '-') && (strcasecmp(pArg + 1, pName) == 0))
		return true;
	return false;
}

// Same, but matches against any of several alias names, e.g.
// opt_match(pArg, { "-uastc", "-uastc_ldr", "-uastc_ldr_4x4" }).
static inline bool opt_match(const char *pArg, std::initializer_list<const char *> names)
{
	for (const char *pName : names)
		if (opt_match(pArg, pName))
			return true;
	return false;
}

// Optional sRGB<->linear transform applied by the -extract_* modes.
enum extract_color_xform
{
	cExtractXformNone = 0,
	cExtractXformToLinear,	// treat input as sRGB, output linear light
	cExtractXformToSRGB		// treat input as linear light, output sRGB
};

// True if the argument is a non-empty run of decimal digits (an unsigned integer). Used to decide whether an
// optional region rectangle follows a command, so that a positional filename beginning with a digit (e.g.
// "5texture.png") is NOT mistaken for a region coordinate.
static bool arg_is_unsigned_int(const char* pArg)
{
	if ((!pArg) || (!pArg[0]))
		return false;
	for (const char* p = pArg; *p; p++)
		if ((*p < '0') || (*p > '9'))
			return false;
	return true;
}

// Maps a single channel token to a source channel index in [0,3] (R/G/B/A), or -1 if it is not a valid channel.
static int channel_token_to_index(char c)
{
	switch (c)
	{
	case 'r': case 'R': case '0': return 0;
	case 'g': case 'G': case '1': return 1;
	case 'b': case 'B': case '2': return 2;
	case 'a': case 'A': case '3': return 3;
	default: return -1;
	}
}

// Parses a -benchmark_single format token into a basis_tex_format (definition is down by codec_benchmark()).
static bool parse_benchmark_tex_format(const std::string& s, basist::basis_tex_format& out_fmt);

class command_line_params
{
	BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(command_line_params);

#define REMAINING_ARGS_CHECK(n) if (num_remaining_args < (n)) { error_printf("Error: Expected %u values to follow %s!\n", n, pArg); return false; }

	bool check_for_general_options(const char** arg_v, const char* pArg, int arg_index, const int num_remaining_args, int& arg_count)
	{
		BASISU_NOTE_UNUSED(arg_v);
		BASISU_NOTE_UNUSED(arg_index);
		BASISU_NOTE_UNUSED(num_remaining_args);
		BASISU_NOTE_UNUSED(arg_count);

		if (opt_match(pArg, "-wasi_threads"))
		{
			REMAINING_ARGS_CHECK(1);
			int num_threads = atoi(arg_v[arg_index + 1]);
			if ((num_threads < 0) || (num_threads > 256))
			{
				error_printf("Invalid number of threads\n");
				exit(EXIT_FAILURE);
			}
			set_num_wasi_threads(num_threads);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-higher_quality_transcoding"))
		{
			m_higher_quality_transcoding = true;
			return true;
		}
		else if (opt_match(pArg, "-no_fast_xuastc_ldr_bc7_transcoding"))
		{
			m_xuastc_ldr_disable_bc7_transcoding = true;
			return true;
		}
		else if (opt_match(pArg, "-fast_xuastc_ldr_bc7_transcoding"))
		{
			m_xuastc_ldr_disable_bc7_transcoding = false;
			return true;
		}
		else if (opt_match(pArg, "-no_etc1s_chroma_filtering"))
		{
			m_no_etc1s_transcoding_chroma_filtering = true;
			return true;
		}
		else if (opt_match(pArg, "-transcode_force_deblocking"))
		{
			m_transcode_force_deblocking = true;
			return true;
		}
		else if (opt_match(pArg, {"-transcode_disable_deblocking", "-transcode_no_deblocking"}))
		{
			m_transcode_disable_deblocking = true;
			return true;
		}
		
		return false;
	}

	bool check_for_xuastc_options(const char** arg_v, const char* pArg, int arg_index, const int num_remaining_args, int& arg_count)
	{
		// New unified -quality level which works across all codecs
		if (opt_match(pArg, "-quality"))
		{
			REMAINING_ARGS_CHECK(1);
			m_quality_level = clamp<int>(atoi(arg_v[arg_index + 1]), 1, 100);
			arg_count++;
			return true;
		}
		// New unified -effort level, which works across all codecs
		else if (opt_match(pArg, "-effort"))
		{
			REMAINING_ARGS_CHECK(1);
			m_effort_level = clamp<int>(atoi(arg_v[arg_index + 1]), 0, 10);
			//m_comp_params.m_xuastc_ldr_effort_level = atoi(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if ((opt_match(pArg, "-xuastc_debug_block")))
		{
			REMAINING_ARGS_CHECK(2);
			m_comp_params.m_xuastc_ldr_debug_block_x = clamp<int>(atoi(arg_v[arg_index + 1]), 0, 4096);
			m_comp_params.m_xuastc_ldr_debug_block_y = clamp<int>(atoi(arg_v[arg_index + 2]), 0, 4096);
			
			arg_count += 2;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_blurring", "-xuastc_ldr_blurring"})) // experimental, not recommended, very slow
		{
			m_comp_params.m_xuastc_ldr_blurring = true;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_no_blurring", "-xuastc_ldr_no_blurring"})) // experimental, not recommended, very slow
		{
			m_comp_params.m_xuastc_ldr_blurring = false;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_use_auto_comp", "-xuastc_ldr_use_auto_comp"}))
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cAuto;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_use_basisu", "-xuastc_ldr_use_basisu"}))
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cBasisU;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_use_astcenc", "-xuastc_ldr_use_astcenc"})) // experimental/development, must be enabled at compilation time by setting BASISU_SUPPORT_ASTCENC=1
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cASTCENC;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_use_astcf", "-xuastc_ldr_use_astcf"}))
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cASTCF;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_merge_astcenc", "-xuastc_ldr_merge_astcenc"})) // experimental/development, must be enabled at compilation time by setting BASISU_SUPPORT_ASTCENC=1
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cBasisU_and_ASTCENC;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_merge_astcf", "-xuastc_ldr_merge_astcf"})) // experimental/development, must be enabled at compilation time by setting BASISU_SUPPORT_ASTCENC=1
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cBasisU_and_ASTCF;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_merge_all", "-xuastc_ldr_merge_all"})) // experimental/development, must be enabled at compilation time by setting BASISU_SUPPORT_ASTCENC=1
		{
			m_comp_params.m_xuastc_ldr_astc_comp_selection = (int)xuastc_ldr_astc_comp_selection::cUseAll;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_no_deblocking", "-xuastc_ldr_no_deblocking"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cDisabled;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_largest", "-xuastc_ldr_deblocking_largest"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cUseSCDAndFilteringOnlyLargestBlocks; // codec default
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_all", "-xuastc_ldr_deblocking_all"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cUseSCDAndFilteringAllBlockSizes;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_scd_no_filtering", "-xuastc_ldr_deblocking_scd_no_filtering"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cUseSCDNoFiltering;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_no_scd_filtering_largest", "-xuastc_ldr_deblocking_no_scd_filtering_largest"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cNoSCDButEnableFilteringOnLargestBlocks;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_no_scd_filtering_all", "-xuastc_ldr_deblocking_no_scd_filtering_all"}))
		{
			m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cNoSCDButEnableFilteringOnAllBlocks;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_deblocking_num_passes", "-xuastc_ldr_deblocking_num_passes"}))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_xuastc_ldr_num_deblocking_passes = clamp(atoi(arg_v[arg_index + 1]), 2, 256);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_sharpen", "-xuastc_ldr_sharpen"}))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_xuastc_ldr_sharpen_amount = (float)atof(arg_v[arg_index + 1]);
			arg_count++;

			// setting to 0 disables
			if (m_comp_params.m_xuastc_ldr_sharpen_amount <= 0.0f)
				m_comp_params.m_xuastc_ldr_sharpen_mode = (int)xuastc_ldr_sharpen_mode::cDisabled;
			else
				m_comp_params.m_xuastc_ldr_sharpen_mode = (int)xuastc_ldr_sharpen_mode::cAllBlockSizes; // if they've specified -xuastc_sharpen, they want it no matter what block size

			return true;
		}
		else if (opt_match(pArg, {"-xuastc_no_sharpen", "-xuastc_ldr_no_sharpen"}))
		{
			m_comp_params.m_xuastc_ldr_sharpen_mode = (int)xuastc_ldr_sharpen_mode::cDisabled;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_weights", "-xuastc_ldr_weights", "-weights"}))
		{
			REMAINING_ARGS_CHECK(4);
			m_comp_params.m_ldr_channel_weights[0] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 1]), 1.0f, 1024.0f);
			m_comp_params.m_ldr_channel_weights[1] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 2]), 1.0f, 1024.0f);
			m_comp_params.m_ldr_channel_weights[2] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 3]), 1.0f, 1024.0f);
			m_comp_params.m_ldr_channel_weights[3] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 4]), 1.0f, 1024.0f);
			arg_count += 4;
			return true;
		}
		else if (opt_match(pArg, "-ls_min_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_min_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-ls_min_alpha_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_min_alpha_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-ls_thresh_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_thresh_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-ls_thresh_alpha_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_thresh_alpha_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-ls_thresh_edge_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_thresh_edge_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-ls_thresh_edge_alpha_psnr"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ls_thresh_edge_alpha_psnr = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_arith", "-xuastc_ldr_arith"}))
		{
			m_comp_params.m_xuastc_ldr_syntax = (int)basist::astc_ldr_t::xuastc_ldr_syntax::cFullArith;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_zstd", "-xuastc_ldr_zstd"}))
		{
			m_comp_params.m_xuastc_ldr_syntax = (int)basist::astc_ldr_t::xuastc_ldr_syntax::cFullZStd;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_hybrid", "-xuastc_ldr_hybrid"}))
		{
			m_comp_params.m_xuastc_ldr_syntax = (int)basist::astc_ldr_t::xuastc_ldr_syntax::cHybridArithZStd;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_heavy_subset_usage", "-xuastc_ldr_heavy_subset_usage"}))
		{
			m_comp_params.m_xuastc_ldr_heavy_subset_usage = true;
			return true;
		}
		else if (opt_match(pArg, {"-xuastc_no_heavy_subset_usage", "-xuastc_ldr_no_heavy_subset_usage"}))
		{
			m_comp_params.m_xuastc_ldr_heavy_subset_usage = false;
			return true;
		}
		else if (opt_match(pArg, "-xy"))
		{
			m_comp_params.m_xuastc_ldr_use_lossy_supercompression = true;
			return true;
		}
		else if (opt_match(pArg, "-xyd"))
		{
			m_comp_params.m_xuastc_ldr_use_lossy_supercompression = false;
			return true;
		}
		else if (opt_match(pArg, "-xs"))
		{
			m_comp_params.m_xuastc_ldr_force_disable_subsets = true;
			return true;
		}
		else if (opt_match(pArg, "-xsu"))
		{
			m_comp_params.m_xuastc_ldr_force_disable_subsets = false;
			return true;
		}
		else if (opt_match(pArg, "-xp"))
		{
			m_comp_params.m_xuastc_ldr_force_disable_rgb_dual_plane = true;
			return true;
		}
		else if (opt_match(pArg, "-xpu"))
		{
			m_comp_params.m_xuastc_ldr_force_disable_rgb_dual_plane = false;
			return true;
		}
		else if (opt_match(pArg, "-ts"))
		{
			m_comp_params.m_perceptual = true;
			m_comp_params.m_ktx2_and_basis_srgb_transfer_function = true;
			return true;
		}
		else if (opt_match(pArg, "-tl"))
		{
			m_comp_params.m_perceptual = false;
			m_comp_params.m_ktx2_and_basis_srgb_transfer_function = false;
			return true;
		}
		// Supercompressed XUASTC LDR 4x4-12x12
		else if (opt_match(pArg, {"-ldr_4x4i", "-xuastc_ldr_4x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_4x4);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_5x4i", "-xuastc_ldr_5x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_5x4);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_5x5i", "-xuastc_ldr_5x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_5x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_6x5i", "-xuastc_ldr_6x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_6x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_6x6i", "-xuastc_ldr_6x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_6x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x5i", "-xuastc_ldr_8x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_8x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x6i", "-xuastc_ldr_8x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_8x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x5i", "-xuastc_ldr_10x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_10x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x6i", "-xuastc_ldr_10x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_10x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x8i", "-xuastc_ldr_8x8"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_8x8);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x8i", "-xuastc_ldr_10x8"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_10x8);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x10i", "-xuastc_ldr_10x10"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_10x10);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_12x10i", "-xuastc_ldr_12x10"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_12x10);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_12x12i", "-xuastc_ldr_12x12"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUASTC_LDR_12x12);
			return true;
		}
		else if (opt_match(pArg, "-xubc7"))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cXUBC7);
			return true;
		}
		else if (opt_match(pArg, {"-xubc7_rdo", "-xubc7_rdo_level"}))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_xubc7_rdo_level = clamp(atoi(arg_v[arg_index + 1]), 0, 100);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, {"-xubc7_stripes", "-xubc7_num_stripes"}))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_xubc7_num_stripes = clamp(atoi(arg_v[arg_index + 1]), 1, 16);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-xubc7_bc7f"))
		{
			m_comp_params.m_xubc7_encoder = (int)basisu::xbc7::bc7_encoder_type::cBC7F;
			return true;
		}
		else if (opt_match(pArg, {"-xubc7_bc7e_scalar", "-xubc7_bc7e"}))
		{
			m_comp_params.m_xubc7_encoder = (int)basisu::xbc7::bc7_encoder_type::cBC7E_Scalar;
			return true;
		}
		else if (opt_match(pArg, "-xubc7_bc7e_scalar_level"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_xubc7_encoder = (int)basisu::xbc7::bc7_encoder_type::cBC7E_Scalar;
			m_comp_params.m_xubc7_bc7e_scalar_level = clamp(atoi(arg_v[arg_index + 1]), (int)basisu::xbc7::BC7E_SCALAR_MIN_LEVEL, (int)basisu::xbc7::BC7E_SCALAR_MAX_LEVEL);
			arg_count++;
			return true;
		}
		// Plain ASTC LDR 4x4-12x12
		else if (opt_match(pArg, {"-ldr_4x4", "-astc_ldr_4x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_4x4);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_5x4", "-astc_ldr_5x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_5x4);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_5x5", "-astc_ldr_5x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_5x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_6x5", "-astc_ldr_6x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_6x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_6x6", "-astc_ldr_6x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_6x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x5", "-astc_ldr_8x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_8x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x6", "-astc_ldr_8x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_8x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x5", "-astc_ldr_10x5"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_10x5);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x6", "-astc_ldr_10x6"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_10x6);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_8x8", "-astc_ldr_8x8"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_8x8);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x8", "-astc_ldr_10x8"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_10x8);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_10x10", "-astc_ldr_10x10"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_10x10);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_12x10", "-astc_ldr_12x10"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_12x10);
			return true;
		}
		else if (opt_match(pArg, {"-ldr_12x12", "-astc_ldr_12x12"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_LDR_12x12);
			return true;
		}

		return false;
	}

	// -dds (basic DX10 DDS writer) options. Kept in its own function so the big option chain in parse() stays
	// under the compiler's block-nesting limit. See basisu_dds_export.h.
	bool check_for_dds_options(const char** arg_v, const char* pArg, int arg_index, const int num_remaining_args, int& arg_count)
	{
		if (opt_match(pArg, "-dds"))
		{
			m_mode = cDDS;
			return true;
		}
		else if (opt_match(pArg, "-dds_format"))
		{
			REMAINING_ARGS_CHECK(1);
			m_dds_format = arg_v[arg_index + 1];
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-dds_bc7f"))
		{
			m_dds_bc7_encoder = cDDSBC7Encoder_BC7F;
			return true;
		}
		else if (opt_match(pArg, {"-dds_bc7e_scalar", "-dds_bc7e"}))
		{
			m_dds_bc7_encoder = cDDSBC7Encoder_BC7E_Scalar;
			return true;
		}
		else if (opt_match(pArg, "-dds_bc7f_level"))
		{
			REMAINING_ARGS_CHECK(1);
			m_dds_bc7_encoder = cDDSBC7Encoder_BC7F;
			m_dds_bc7f_level = clamp(atoi(arg_v[arg_index + 1]), 0, 2);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-dds_bc7e_scalar_level"))
		{
			REMAINING_ARGS_CHECK(1);
			m_dds_bc7_encoder = cDDSBC7Encoder_BC7E_Scalar;
			m_dds_bc7e_scalar_level = clamp(atoi(arg_v[arg_index + 1]), 0, 6);
			arg_count++;
			return true;
		}

		return false;
	}

	bool check_for_hdr_options(const char** arg_v, const char* pArg, int arg_index, const int num_remaining_args, int& arg_count)
	{
		if (opt_match(pArg, {"-hdr", "-hdr_4x4", "-uastc_hdr_4x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cUASTC_HDR_4x4);
			return true;
		}
		else if (opt_match(pArg, "-rec_2020"))
		{
			m_comp_params.m_astc_hdr_6x6_options.m_rec2020_bt2100_color_gamut = true;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6i_16_compatibility"))
		{
			// UASTC HDR 6x6i: Write v1.60 compatible files vs. 2.0.
			m_comp_params.m_astc_hdr_6x6_options.m_write_basisu_1_6_compatible_files = true;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6i_20_compatibility"))
		{
			// UASTC HDR 6x6i: Write v2.00 compatible files vs. 2.0.
			m_comp_params.m_astc_hdr_6x6_options.m_write_basisu_1_6_compatible_files = false;
			return true;
		}
		else if (opt_match(pArg, {"-hdr_6x6", "-astc_hdr_6x6"}))
		{
			// max quality (if -lambda=0) or RDO UASTC HDR 6x6
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_HDR_6x6);
			return true;
		}
		else if (opt_match(pArg, {"-hdr_6x6i", "-uastc_hdr_6x6", "-uastc_hdr_6x6i"}))
		{
			// intermediate format UASTC HDR 6x6
			m_comp_params.set_format_mode(basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE);
			return true;
		}
		else if (opt_match(pArg, "-lambda"))
		{
			REMAINING_ARGS_CHECK(1);

			// Set UASTC HDR 6x6's lambda
			m_comp_params.m_astc_hdr_6x6_options.m_lambda = (float)atof(arg_v[arg_index + 1]);

			if (m_comp_params.m_astc_hdr_6x6_options.m_lambda < 0.0f)
			{
				fmt_error_printf("-lambda: value must be >= 0.0f\n");
				return false;
			}

			// Also set UASTC LDR 4x4's lambda
			m_comp_params.m_rdo_uastc_ldr_4x4_quality_scalar = (float)atof(arg_v[arg_index + 1]);
			m_comp_params.m_rdo_uastc_ldr_4x4 = true;

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_jnd"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_astc_hdr_6x6_options.m_jnd_optimization = true;
			m_comp_params.m_astc_hdr_6x6_options.m_jnd_delta_itp_thresh = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_level"))
		{
			REMAINING_ARGS_CHECK(1);
			const int level = atoi(arg_v[arg_index + 1]);
			m_comp_params.m_astc_hdr_6x6_options.set_user_level(level);
			m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_HDR_6x6);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6i_level"))
		{
			REMAINING_ARGS_CHECK(1);
			const int level = atoi(arg_v[arg_index + 1]);
			m_comp_params.m_astc_hdr_6x6_options.set_user_level(level);
			m_comp_params.set_format_mode(basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_extra_pats"))
		{
			m_comp_params.m_astc_hdr_6x6_options.m_extra_patterns_flag = true;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_brute_force_pats"))
		{
			m_comp_params.m_astc_hdr_6x6_options.m_brute_force_partition_matching = true;
			return true;
		}
		else if (opt_match(pArg, {"-hdr_6x6_comp_levels", "-hdr_6x6i_comp_levels"}))
		{
			REMAINING_ARGS_CHECK(2);

			// Intended for low-level/development/testing
			const int lo_level = clamp<int>(atoi(arg_v[arg_index + 1]), 0, astc_6x6_hdr::ASTC_HDR_6X6_MAX_COMP_LEVEL);
			const int hi_level = clamp<int>(atoi(arg_v[arg_index + 2]), 0, astc_6x6_hdr::ASTC_HDR_6X6_MAX_COMP_LEVEL);

			m_comp_params.m_astc_hdr_6x6_options.m_master_comp_level = minimum(lo_level, hi_level);
			m_comp_params.m_astc_hdr_6x6_options.m_highest_comp_level = maximum(lo_level, hi_level);
			
			if (opt_match(pArg, "-hdr_6x6_comp_levels"))
				m_comp_params.set_format_mode(basist::basis_tex_format::cASTC_HDR_6x6);
			else
				m_comp_params.set_format_mode(basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE);

			m_used_old_style_codec_config_param = true;

			arg_count += 2;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_no_gaussian"))
		{
			m_comp_params.m_astc_hdr_6x6_options.m_gaussian1_fallback = false;
			m_comp_params.m_astc_hdr_6x6_options.m_gaussian2_fallback = false;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_gaussian1"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_astc_hdr_6x6_options.m_gaussian1_strength = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_6x6_gaussian2"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_astc_hdr_6x6_options.m_gaussian2_strength = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, {"-hdr_ldr_no_srgb_to_linear", "-hdr_ldr_upconversion_no_srgb_to_linear"}))
		{
			m_comp_params.m_ldr_hdr_upconversion_srgb_to_linear = false;
			return true;
		}
		else if (opt_match(pArg, "-hdr_ldr_upconversion_black_bias"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ldr_hdr_upconversion_black_bias = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_ldr_upconversion_nit_multiplier"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_ldr_hdr_upconversion_nit_multiplier = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-hdr_uber_mode"))
		{
			m_comp_params.m_uastc_hdr_4x4_options.m_allow_uber_mode = true;
			return true;
		}
		else if (opt_match(pArg, "-hdr_ultra_quant"))
		{
			m_comp_params.m_uastc_hdr_4x4_options.m_ultra_quant = true;
			return true;
		}
		else if (opt_match(pArg, "-hdr_favor_astc"))
		{
			m_comp_params.m_hdr_favor_astc = true;
			return true;
		}

		return false;
	}

	// ETC1S or UASTC LDR 4x4 specific options
	bool check_for_etc1s_or_uastc_options(const char** arg_v, const char* pArg, int arg_index, const int num_remaining_args, int& arg_count)
	{
		if (opt_match(pArg, {"-etc1s", "-ldr"}))
		{
			// -ldr selects the LDR/SDR default codec (ETC1S), symmetric with -hdr.
			m_comp_params.set_format_mode(basist::basis_tex_format::cETC1S);
			return true;
		}
		else if (opt_match(pArg, {"-uastc", "-uastc_ldr", "-uastc_ldr_4x4"}))
		{
			m_comp_params.set_format_mode(basist::basis_tex_format::cUASTC_LDR_4x4);
			return true;
		}
		else if (opt_match(pArg, "-uastc_level"))
		{
			REMAINING_ARGS_CHECK(1);

			int uastc_level = atoi(arg_v[arg_index + 1]);

			uastc_level = clamp<int>(uastc_level, 0, TOTAL_PACK_UASTC_LEVELS - 1);

			static_assert(TOTAL_PACK_UASTC_LEVELS == 5, "TOTAL_PACK_UASTC_LEVELS==5");
			static const uint32_t s_level_flags[TOTAL_PACK_UASTC_LEVELS] = { cPackUASTCLevelFastest, cPackUASTCLevelFaster, cPackUASTCLevelDefault, cPackUASTCLevelSlower, cPackUASTCLevelVerySlow };

			m_comp_params.m_pack_uastc_ldr_4x4_flags &= ~cPackUASTCLevelMask;
			m_comp_params.m_pack_uastc_ldr_4x4_flags |= s_level_flags[uastc_level];

			m_comp_params.m_uastc_hdr_4x4_options.set_quality_level(uastc_level);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_l"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_rdo_uastc_ldr_4x4_quality_scalar = (float)atof(arg_v[arg_index + 1]);
			m_comp_params.m_rdo_uastc_ldr_4x4 = true;

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_d"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_rdo_uastc_ldr_4x4_dict_size = atoi(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_b"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_rdo_uastc_ldr_4x4_max_smooth_block_error_scale = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_s"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_rdo_uastc_ldr_4x4_smooth_block_max_std_dev = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_f"))
		{
			m_comp_params.m_rdo_uastc_ldr_4x4_favor_simpler_modes_in_rdo_mode = false;
			return true;
		}
		else if (opt_match(pArg, "-uastc_rdo_m"))
		{
			m_comp_params.m_rdo_uastc_ldr_4x4_multithreading = false;
			return true;
		}
		else if (opt_match(pArg, "-validate_etc1s"))
		{
			m_comp_params.m_validate_etc1s = true;
			return true;
		}
		else if (opt_match(pArg, "-comp_level"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_etc1s_compression_level = atoi(arg_v[arg_index + 1]);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-max_endpoints"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_etc1s_max_endpoint_clusters = clamp<int>(atoi(arg_v[arg_index + 1]), 1, BASISU_MAX_ENDPOINT_CLUSTERS);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-max_selectors"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_etc1s_max_selector_clusters = clamp<int>(atoi(arg_v[arg_index + 1]), 1, BASISU_MAX_SELECTOR_CLUSTERS);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
#if 0
		else if (opt_match(pArg, "-gen_global_codebooks"))
		{
			// TODO
		}
#endif
		else if (opt_match(pArg, "-use_global_codebooks"))
		{
			REMAINING_ARGS_CHECK(1);
			m_etc1s_use_global_codebooks_file = arg_v[arg_index + 1];
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-etc1_only"))
		{
			m_etc1_only = true;
			m_unpack_format_only = (int)basist::transcoder_texture_format::cTFETC1_RGB;
			return true;
		}
		else if (opt_match(pArg, "-disable_hierarchical_endpoint_codebooks"))
		{
			m_comp_params.m_disable_hierarchical_endpoint_codebooks = true;
			return true;
		}
		else if (opt_match(pArg, "-q")) // old-style ETC1S -q X option, prefer -quality instead
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_quality_level = clamp<int>(atoi(arg_v[arg_index + 1]), BASISU_QUALITY_MIN, BASISU_QUALITY_MAX);

			m_used_old_style_codec_config_param = true;

			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-no_selector_rdo"))
		{
			m_comp_params.m_no_selector_rdo = true;
			return true;
		}
		else if (opt_match(pArg, "-selector_rdo_thresh"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_selector_rdo_thresh = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}
		else if (opt_match(pArg, "-no_endpoint_rdo"))
		{
			m_comp_params.m_no_endpoint_rdo = true;
			return true;
		}
		else if (opt_match(pArg, "-endpoint_rdo_thresh"))
		{
			REMAINING_ARGS_CHECK(1);
			m_comp_params.m_endpoint_rdo_thresh = (float)atof(arg_v[arg_index + 1]);
			arg_count++;
			return true;
		}

		return false;
	}

public:
	command_line_params() :
		m_mode(cDefault),
		m_benchmark_fmt(basist::basis_tex_format::cXUASTC_LDR_6x6),
		m_benchmark_effort(0),
		m_benchmark_quality(100),
		m_benchmark_path("../test_files/kodim"),
		m_benchmark_first(1),
		m_benchmark_last(24),
		m_benchmark_path_set(false),
		m_benchmark_range_set(false),
		m_benchmark_linear(false),
		m_benchmark_xubc7_encoder(0),
		m_benchmark_xuastc_profile(0),
		m_benchmark_sweep_block_set(false),
		m_benchmark_sweep_block_lo(0), m_benchmark_sweep_block_hi(0),
		m_benchmark_sweep_effort_lo(3), m_benchmark_sweep_effort_hi(3),
		m_benchmark_sweep_quality_lo(10), m_benchmark_sweep_quality_hi(10),
		m_benchmark_sweep_csv("benchmark_sweep.csv"),
		m_ktx2_mode(true),
		m_ktx2_zstandard(true),
		m_ktx2_zstandard_level(6),
		m_ktx2_animdata_duration(1),
		m_ktx2_animdata_timescale(15),
		m_ktx2_animdata_loopcount(0),
		m_unpack_format_only(-1),
		m_multifile_first(0),
		m_multifile_num(0),
		m_max_threads(1024), // surely this is high enough
		m_individual(true),
		m_no_ktx(false),
		m_ktx_only(false),
		m_write_out(false),
		m_etc1_only(false),
		m_fuzz_testing(false),
		m_compare_ssim(false),
		m_compare_plot(false),
		m_dump_image_stats(false),
		m_dump_pixel_x(-1),
		m_dump_pixel_y(-1),
		m_dump_block_x(-1),
		m_dump_block_y(-1),
		m_stats_region_x(-1),
		m_stats_region_y(-1),
		m_stats_region_w(-1),
		m_stats_region_h(-1),
		m_extract_channel(-1),
		m_extract_region_x(-1),
		m_extract_region_y(-1),
		m_extract_region_w(-1),
		m_extract_region_h(-1),
		m_parallel_compression(false),
		m_tonemap_dither_flag(false),
		m_xuastc_ldr_disable_bc7_transcoding(false),
		m_no_etc1s_transcoding_chroma_filtering(false),
		m_higher_quality_transcoding(false), 
		m_transcode_force_deblocking(false), 
		m_transcode_disable_deblocking(false), 
		m_effort_level(-1),
		m_quality_level(-1),
		m_used_old_style_codec_config_param(false)
	{
		// This command line tool defaults to ETC1S level 1, not 2 which is the API default (for backwards compat).
		m_comp_params.m_etc1s_compression_level = maximum<int>((int)BASISU_DEFAULT_ETC1S_COMPRESSION_LEVEL - 1, 0);
		
		m_comp_params.m_uastc_hdr_4x4_options.set_quality_level(uastc_hdr_4x4_codec_options::cDefaultLevel);

		// Default to sRGB colorspace metrics/transfer functions (independent of the code defaults).
		m_comp_params.m_perceptual = true;
		m_comp_params.m_ktx2_and_basis_srgb_transfer_function = true;

		m_test_file_dir = "../test_files";
	}

	bool parse(int arg_c, const char **arg_v)
	{
		int arg_index = 1;
		while (arg_index < arg_c)
		{
			const char *pArg = arg_v[arg_index];
			const int num_remaining_args = arg_c - (arg_index + 1);
			int arg_count = 1;

			if (opt_match(pArg, {"-help", "--help"}))
			{
				print_usage();
				exit(EXIT_SUCCESS);
			}
			
			if (check_for_etc1s_or_uastc_options(arg_v, pArg, arg_index, num_remaining_args, arg_count))
			{
			}
			else if (check_for_hdr_options(arg_v, pArg, arg_index, num_remaining_args, arg_count))
			{
			}
			else if (check_for_xuastc_options(arg_v, pArg, arg_index, num_remaining_args, arg_count))
			{
			}
			else if (check_for_general_options(arg_v, pArg, arg_index, num_remaining_args, arg_count))
			{
			}
			else if (check_for_dds_options(arg_v, pArg, arg_index, num_remaining_args, arg_count))
			{
			}
			else if (opt_match(pArg, "-ktx2"))
			{
				m_ktx2_mode = true;
			}
			else if (opt_match(pArg, "-basis"))
			{
				m_ktx2_mode = false;
			}
			else if (opt_match(pArg, "-ktx2_no_zstandard"))
			{
				m_ktx2_zstandard = false;
			}
			else if (opt_match(pArg, "-ktx2_zstandard_level"))
			{
				REMAINING_ARGS_CHECK(1);
				m_ktx2_zstandard_level = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-ktx2_animdata_duration"))
			{
				REMAINING_ARGS_CHECK(1);
				m_ktx2_animdata_duration = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-ktx2_animdata_timescale"))
			{
				REMAINING_ARGS_CHECK(1);
				m_ktx2_animdata_timescale = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-ktx2_animdata_loopcount"))
			{
				REMAINING_ARGS_CHECK(1);
				m_ktx2_animdata_loopcount = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-compress"))
				m_mode = cCompress;
			else if (opt_match(pArg, "-compare"))
				m_mode = cCompare;
			else if (opt_match(pArg, "-compare_hvs"))
				m_mode = cCompareHVS;
			else if (opt_match(pArg, {"-hdr_compare", "-compare_hdr"}))
				m_mode = cHDRCompare;
			else if (opt_match(pArg, "-dump_image_stats"))
			{
				m_mode = cImageDumpStats;
				m_dump_image_stats = true;

				// Optional region: -dump_image_stats <x> <y> <w> <h>. If the next argument looks like a
				// number then all four must follow; otherwise the stats cover the whole image.
				if ((num_remaining_args >= 1) && arg_is_unsigned_int(arg_v[arg_index + 1]))
				{
					REMAINING_ARGS_CHECK(4);
					m_stats_region_x = atoi(arg_v[arg_index + 1]);
					m_stats_region_y = atoi(arg_v[arg_index + 2]);
					m_stats_region_w = atoi(arg_v[arg_index + 3]);
					m_stats_region_h = atoi(arg_v[arg_index + 4]);
					arg_count += 4;
					if ((m_stats_region_x < 0) || (m_stats_region_y < 0) || (m_stats_region_w <= 0) || (m_stats_region_h <= 0))
					{
						error_printf("-dump_image_stats region requires non-negative x,y and positive w,h: -dump_image_stats <x> <y> <w> <h>\n");
						return false;
					}
				}
			}
			else if (opt_match(pArg, "-dump_pixel"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cImageDumpStats;
				m_dump_pixel_x = atoi(arg_v[arg_index + 1]);
				m_dump_pixel_y = atoi(arg_v[arg_index + 2]);
				arg_count += 2;
				if ((m_dump_pixel_x < 0) || (m_dump_pixel_y < 0))
				{
					error_printf("-dump_pixel requires two non-negative integer coordinates: -dump_pixel <x> <y>\n");
					return false;
				}
			}
			else if (opt_match(pArg, "-dump_block"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cImageDumpStats;
				m_dump_block_x = atoi(arg_v[arg_index + 1]);
				m_dump_block_y = atoi(arg_v[arg_index + 2]);
				arg_count += 2;
				if ((m_dump_block_x < 0) || (m_dump_block_y < 0))
				{
					error_printf("-dump_block requires two non-negative integer block coordinates: -dump_block <bx> <by>\n");
					return false;
				}
			}
			else if (opt_match(pArg, "-split"))
				m_mode = cSplitImage;
			else if (opt_match(pArg, "-combine"))
				m_mode = cCombineImages;
			else if (opt_match(pArg, "-extract_channel"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cExtractChannel;

				// Channel: r/g/b/a (case-insensitive) or 0..3. Always assign (don't leave a stale value from a prior -extract_channel).
				const char* pCh = arg_v[arg_index + 1];
				m_extract_channel = ((pCh[0] != '\0') && (pCh[1] == '\0')) ? channel_token_to_index(pCh[0]) : -1;
				if (m_extract_channel < 0)
				{
					error_printf("-extract_channel requires a channel (r/g/b/a or 0..3): -extract_channel <c> <out.png> [x y w h]\n");
					return false;
				}

				m_extract_filename = arg_v[arg_index + 2];
				arg_count += 2;

				// Optional region: -extract_channel <c> <out.png> <x> <y> <w> <h>.
				if ((num_remaining_args >= 3) && arg_is_unsigned_int(arg_v[arg_index + 3]))
				{
					REMAINING_ARGS_CHECK(6);
					m_extract_region_x = atoi(arg_v[arg_index + 3]);
					m_extract_region_y = atoi(arg_v[arg_index + 4]);
					m_extract_region_w = atoi(arg_v[arg_index + 5]);
					m_extract_region_h = atoi(arg_v[arg_index + 6]);
					arg_count += 4;
					if ((m_extract_region_x < 0) || (m_extract_region_y < 0) || (m_extract_region_w <= 0) || (m_extract_region_h <= 0))
					{
						error_printf("-extract_channel region requires non-negative x,y and positive w,h: -extract_channel <c> <out.png> <x> <y> <w> <h>\n");
						return false;
					}
				}
			}
			else if (opt_match(pArg, "-extract_swizzle"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cExtractSwizzle;

				// Swizzle: comma-separated source channels for output R,G,B,A, e.g. "0,1,2,3" (identity) or "r,g,b,a" or "2,1,0".
				// Each token selects a source channel in [0,3]; 1..4 tokens. Any output channel not listed passes through unchanged.
				const char* p = arg_v[arg_index + 1];
				int count = 0;
				bool swizzle_ok = true;
				while (*p)
				{
					const int idx = channel_token_to_index(*p);
					if ((idx < 0) || (count >= 4))
					{
						swizzle_ok = false;
						break;
					}
					m_extract_swizzle[count++] = idx;
					p++;
					if (*p == ',')
					{
						p++;
						if (*p == '\0') { swizzle_ok = false; break; }	// trailing comma
					}
					else if (*p != '\0')
					{
						swizzle_ok = false;	// token longer than a single channel char
						break;
					}
				}
				if (!swizzle_ok || (count == 0))
				{
					error_printf("-extract_swizzle requires 1 to 4 comma-separated source channels (each r/g/b/a or 0..3), e.g. \"0,1,2,3\"\n");
					return false;
				}
				m_extract_swizzle_count = count;

				m_extract_filename = arg_v[arg_index + 2];
				arg_count += 2;

				// Optional region: -extract_swizzle <swizzle> <out.png> <x> <y> <w> <h>.
				if ((num_remaining_args >= 3) && arg_is_unsigned_int(arg_v[arg_index + 3]))
				{
					REMAINING_ARGS_CHECK(6);
					m_extract_region_x = atoi(arg_v[arg_index + 3]);
					m_extract_region_y = atoi(arg_v[arg_index + 4]);
					m_extract_region_w = atoi(arg_v[arg_index + 5]);
					m_extract_region_h = atoi(arg_v[arg_index + 6]);
					arg_count += 4;
					if ((m_extract_region_x < 0) || (m_extract_region_y < 0) || (m_extract_region_w <= 0) || (m_extract_region_h <= 0))
					{
						error_printf("-extract_swizzle region requires non-negative x,y and positive w,h: -extract_swizzle <swizzle> <out.png> <x> <y> <w> <h>\n");
						return false;
					}
				}
			}
			else if (opt_match(pArg, "-extract_region"))
			{
				REMAINING_ARGS_CHECK(5);
				m_mode = cExtractRegion;
				m_extract_filename = arg_v[arg_index + 1];
				m_extract_region_x = atoi(arg_v[arg_index + 2]);
				m_extract_region_y = atoi(arg_v[arg_index + 3]);
				m_extract_region_w = atoi(arg_v[arg_index + 4]);
				m_extract_region_h = atoi(arg_v[arg_index + 5]);
				arg_count += 5;
				if ((m_extract_region_x < 0) || (m_extract_region_y < 0) || (m_extract_region_w <= 0) || (m_extract_region_h <= 0))
				{
					error_printf("-extract_region requires non-negative x,y and positive w,h: -extract_region <out.png> <x> <y> <w> <h>\n");
					return false;
				}
			}
			// Optional color transforms applied by the -extract_* modes (modifiers; order vs. the -extract_* option does not matter).
			else if (opt_match(pArg, "-extract_to_linear"))
				m_extract_color_xform = cExtractXformToLinear;
			else if (opt_match(pArg, "-extract_to_srgb"))
				m_extract_color_xform = cExtractXformToSRGB;
			else if (opt_match(pArg, "-extract_xform_alpha"))
				m_extract_xform_alpha = true;
			else if (opt_match(pArg, "-text_to_png"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cTextToPng;
				m_text_image_in = arg_v[arg_index + 1];
				m_text_image_out = arg_v[arg_index + 2];
				arg_count += 2;
			}
			else if (opt_match(pArg, "-png_to_text"))
			{
				REMAINING_ARGS_CHECK(2);
				m_mode = cPngToText;
				m_text_image_in = arg_v[arg_index + 1];
				m_text_image_out = arg_v[arg_index + 2];
				arg_count += 2;
			}
			else if (opt_match(pArg, "-tonemap"))
				m_mode = cTonemapImage;
			else if (opt_match(pArg, "-export_dds"))
			{
				REMAINING_ARGS_CHECK(1);
				m_mode = cExportDDS;
				m_export_dds_format = arg_v[arg_index + 1];
				arg_count++;
			}
			else if (opt_match(pArg, "-export_ktx"))
			{
				REMAINING_ARGS_CHECK(1);
				m_mode = cExportKTX;
				m_export_ktx_format = arg_v[arg_index + 1];
				arg_count++;
			}
			// -benchmark_single <FORMAT> <EFFORT> <QUALITY>: developer codec_benchmark() single run (not in help text yet).
			// FORMAT is any codec name with underscores, e.g. XUASTC_LDR_4x4..12x12, XUBC7, ETC1S, ASTC_LDR_6x6, UASTC_LDR_4x4.
			else if (opt_match(pArg, "-benchmark_single"))
			{
				REMAINING_ARGS_CHECK(3);
				m_mode = cBenchmarkSingle;
				if (!parse_benchmark_tex_format(arg_v[arg_index + 1], m_benchmark_fmt))
				{
					error_printf("-benchmark_single: unrecognized format \"%s\"\n", arg_v[arg_index + 1]);
					return false;
				}
				// Clamp to the same ranges as -effort [0,10] and -quality [1,100] (matches lines above); also keeps the cast non-negative.
				m_benchmark_effort = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 2]), 0, 10);
				m_benchmark_quality = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 3]), 1, 100);
				arg_count += 3;
			}
			// Optional overrides for -benchmark_single's base path and file index range (defaults: "../test_files/kodim", 1..24).
			else if (opt_match(pArg, "-benchmark_path"))
			{
				REMAINING_ARGS_CHECK(1);
				m_benchmark_path = arg_v[arg_index + 1];
				m_benchmark_path_set = true;
				arg_count++;
			}
			else if (opt_match(pArg, "-benchmark_range"))
			{
				REMAINING_ARGS_CHECK(2);
				m_benchmark_first = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, 1000000);
				m_benchmark_last = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 2]), 0, 1000000);
				if (m_benchmark_last < m_benchmark_first) // keep first<=last so codec_benchmark's (last-first+1) can't underflow
					std::swap(m_benchmark_first, m_benchmark_last);
				m_benchmark_range_set = true;
				arg_count += 2;
			}
			else if (opt_match(pArg, "-benchmark_linear"))
				m_benchmark_linear = true;
			// XUBC7-only BC7 base encoder: 0 = bc7f (default), 1-7 = bc7e_scalar level 0-6 (ignored for non-XUBC7 formats).
			else if (opt_match(pArg, "-benchmark_xubc7_encoder"))
			{
				REMAINING_ARGS_CHECK(1);
				m_benchmark_xubc7_encoder = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, (int)basisu::cFlagXUBC7BaseEncoderMask);
				arg_count++;
			}
			// XUASTC LDR entropy syntax/profile: 0 = full arith (default), 1 = hybrid, 2 = full zstd (ignored for non-XUASTC formats).
			else if (opt_match(pArg, "-benchmark_xuastc_profile"))
			{
				REMAINING_ARGS_CHECK(1);
				m_benchmark_xuastc_profile = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, (int)basist::astc_ldr_t::xuastc_ldr_syntax::cTotal - 1);
				arg_count++;
			}
			// -benchmark_sweep <FORMAT>: sweep block size/effort/quality for one codec, dumping a CSV (see benchmark_sweep_mode()).
			else if (opt_match(pArg, "-benchmark_sweep"))
			{
				REMAINING_ARGS_CHECK(1);
				m_mode = cBenchmarkSweep;
				if (!parse_benchmark_tex_format(arg_v[arg_index + 1], m_benchmark_fmt))
				{
					error_printf("-benchmark_sweep: unrecognized format \"%s\"\n", arg_v[arg_index + 1]);
					return false;
				}
				arg_count++;
			}
			// -benchmark_sweep axis ranges (inclusive low/high). Block index [0,5] (4x4..12x12 squares); effort [0,10]; quality [0,10] (x10 -> [1,100]).
			else if (opt_match(pArg, "-benchmark_sweep_block"))
			{
				REMAINING_ARGS_CHECK(2);
				m_benchmark_sweep_block_set = true;
				m_benchmark_sweep_block_lo = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, 5);
				m_benchmark_sweep_block_hi = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 2]), 0, 5);
				arg_count += 2;
			}
			else if (opt_match(pArg, "-benchmark_sweep_effort"))
			{
				REMAINING_ARGS_CHECK(2);
				m_benchmark_sweep_effort_lo = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, 10);
				m_benchmark_sweep_effort_hi = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 2]), 0, 10);
				arg_count += 2;
			}
			else if (opt_match(pArg, "-benchmark_sweep_quality"))
			{
				REMAINING_ARGS_CHECK(2);
				m_benchmark_sweep_quality_lo = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 1]), 0, 10);
				m_benchmark_sweep_quality_hi = (uint32_t)clamp<int>(atoi(arg_v[arg_index + 2]), 0, 10);
				arg_count += 2;
			}
			else if (opt_match(pArg, "-benchmark_sweep_csv"))
			{
				REMAINING_ARGS_CHECK(1);
				m_benchmark_sweep_csv = arg_v[arg_index + 1];
				arg_count++;
			}
			else if (opt_match(pArg, "-tinydds_info"))	// opt_match also accepts the "--tinydds_info" form
				m_mode = cTinyDDSInfo;
			else if (opt_match(pArg, "-ktx_info"))
				m_mode = cKTXInfo;
			else if (opt_match(pArg, "-unpack"))
				m_mode = cUnpack;
			else if (opt_match(pArg, "-validate"))
				m_mode = cValidate;
			else if (opt_match(pArg, "-info"))
				m_mode = cInfo;
			else if (opt_match(pArg, {"-version", "--version"}))
				m_mode = cVersion;
			else if (opt_match(pArg, "-compare_ssim"))
				m_compare_ssim = true;
			else if (opt_match(pArg, "-compare_plot"))
				m_compare_plot = true;
			else if (opt_match(pArg, "-bench"))
				m_mode = cBench;
			else if (opt_match(pArg, "-comp_size"))
				m_mode = cCompSize;
			else if (opt_match(pArg, {"-test", "-test_ldr"}))
				m_mode = cTestLDR;
			else if (opt_match(pArg, {"-test_xuastc", "-test_xuastc_ldr"}))
				m_mode = cTestXUASTCLDR;
			else if (opt_match(pArg, {"-test_xuastc_dump", "-test_xuastc_ldr_dump"}))
			{
				// Run the XUASTC LDR test across all block sizes and print the expected-value
				// tables (for copy/paste into the code) instead of validating.
				m_mode = cTestXUASTCLDR;
				m_xuastc_test_dump = true;
			}
			else if (opt_match(pArg, "-test_hdr_4x4"))
				m_mode = cTestHDR_4x4;
			else if (opt_match(pArg, "-test_hdr_6x6"))
				m_mode = cTestHDR_6x6;
			else if (opt_match(pArg, "-test_hdr_6x6i"))
				m_mode = cTestHDR_6x6i;
			else if (opt_match(pArg, "-test_codecs"))
			{
				// Sweep all LDR+HDR codecs vs the golden .inl table. Optional trailing codec
				// filter (not beginning with '-'), e.g. "-test_codecs XUASTC".
				m_mode = cTestCodecs;
				if ((num_remaining_args >= 1) && (arg_v[arg_index + 1][0] != '-'))
				{
					m_codec_filter = std::string(arg_v[arg_index + 1]);
					arg_count++;
				}
			}
			else if (opt_match(pArg, "-test_codecs_gen"))
			{
				// (Re)generate the golden .inl table. Optional trailing output filename, then an
				// optional codec filter, both not beginning with '-'.
				m_mode = cTestCodecsGen;
				if ((num_remaining_args >= 1) && (arg_v[arg_index + 1][0] != '-'))
				{
					m_test_codecs_gen_filename = std::string(arg_v[arg_index + 1]);
					arg_count++;

					if ((num_remaining_args >= 2) && (arg_v[arg_index + 2][0] != '-'))
					{
						m_codec_filter = std::string(arg_v[arg_index + 2]);
						arg_count++;
					}
				}
			}
			else if (opt_match(pArg, "-clbench"))
				m_mode = cCLBench;
			else if (opt_match(pArg, "-test_dir"))
			{
				REMAINING_ARGS_CHECK(1);
				m_test_file_dir = std::string(arg_v[arg_index + 1]);
				m_test_dir_explicit = true;
				arg_count++;
			}
			else if (opt_match(pArg, "-no_sse"))
			{
#if BASISU_SUPPORT_SSE
				g_cpu_supports_sse41 = false;
#endif
			}
			else if (opt_match(pArg, {"-no_status_output", "-quiet"}))
			{
				m_comp_params.m_status_output = false;
			}
			else if (opt_match(pArg, "-file"))
			{
				REMAINING_ARGS_CHECK(1);
				m_input_filenames.push_back(std::string(arg_v[arg_index + 1]));
				arg_count++;
			}
			else if (opt_match(pArg, "-alpha_file"))
			{
				REMAINING_ARGS_CHECK(1);
				m_input_alpha_filenames.push_back(std::string(arg_v[arg_index + 1]));
				arg_count++;
			}
			else if (opt_match(pArg, "-multifile_printf"))
			{
				REMAINING_ARGS_CHECK(1);
				m_multifile_printf = std::string(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-multifile_first"))
			{
				REMAINING_ARGS_CHECK(1);
				m_multifile_first = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-multifile_num"))
			{
				REMAINING_ARGS_CHECK(1);
				m_multifile_num = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-resample"))
			{
				REMAINING_ARGS_CHECK(2);
				m_comp_params.m_resample_width = atoi(arg_v[arg_index + 1]);
				m_comp_params.m_resample_height = atoi(arg_v[arg_index + 2]);
				arg_count += 2;
			}
			else if (opt_match(pArg, "-resample_factor"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_resample_factor = (float)atof(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, { "-output_file", "-out_file" }))
			{
				REMAINING_ARGS_CHECK(1);
				m_output_filename = arg_v[arg_index + 1];
				arg_count++;
			}
			else if (opt_match(pArg, { "-output_path", "-out_path" } ))
			{
				REMAINING_ARGS_CHECK(1);
				m_output_path = arg_v[arg_index + 1];
				arg_count++;
			}
			else if (opt_match(pArg, "-debug"))
			{
				m_comp_params.m_debug = true;
				enable_debug_printf(true);
			}
			else if (opt_match(pArg, "-verbose"))
			{
				// -verbose is shorthand for -debug -stats
				m_comp_params.m_debug = true;
				enable_debug_printf(true);
				m_comp_params.m_compute_stats = true;
				m_comp_params.m_psnr_hvs_m_stats = true;
			}
			else if (opt_match(pArg, "-validate_output"))
			{
				m_comp_params.m_validate_output_data = true;
			}
			else if (opt_match(pArg, "-debug_images"))
				m_comp_params.m_debug_images = true;
			else if (opt_match(pArg, {"-stats", "-image_stats"}))
			{
				m_comp_params.m_compute_stats = true;
				m_comp_params.m_psnr_hvs_m_stats = true;
			}
			else if (opt_match(pArg, "-no_stats"))
			{
				// Turn stats back off (e.g. to override -verbose or -csv_file, which enable them).
				m_comp_params.m_compute_stats = false;
				m_comp_params.m_psnr_hvs_m_stats = false;
			}
			else if (opt_match(pArg, "-y_flip"))
				m_comp_params.m_y_flip = true;
			else if (opt_match(pArg, {"-normal_map", "-texture"}))
			{
				// Normal map/plain texture preset - disable all fancy things, linear weights, no sharpening largest blocks, no deblocking awareness.
				m_comp_params.set_srgb_options(false);
								
				m_comp_params.m_no_selector_rdo = true;
				m_comp_params.m_no_endpoint_rdo = true;

				m_comp_params.set_ldr_srgb_channel_weights(false);

				m_comp_params.m_xuastc_ldr_sharpen_mode = (int)xuastc_ldr_sharpen_mode::cDisabled;
				m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cDisabled;

				// TODO: Once we support some sort of angular metric, enable them for -normal_map.
			}
			else if (opt_match(pArg, "-photo"))
			{
				// Photo preset (the codec's defaults, opposite of -normal_map/-texture)
				m_comp_params.set_srgb_options(true);

				// -normal_map sets these to true, this preset sets them to false
				m_comp_params.m_no_selector_rdo = false;
				m_comp_params.m_no_endpoint_rdo = false;

				m_comp_params.set_ldr_srgb_channel_weights(true);

				m_comp_params.m_xuastc_ldr_sharpen_mode = (int)xuastc_ldr_sharpen_mode::cDisabled;
				m_comp_params.m_xuastc_ldr_deblocking_mode = (int)xuastc_ldr_deblocking_mode::cUseSCDAndFilteringOnlyLargestBlocks;
			}
			else if (opt_match(pArg, "-linear"))
			{
				// linear preset (opposite of -srgb)
				m_comp_params.set_srgb_options(false);

				m_comp_params.set_ldr_srgb_channel_weights(false);
			}
			else if (opt_match(pArg, "-srgb"))
			{
				// sRGB preset (opposite of -linear)
				m_comp_params.set_srgb_options(true);

				m_comp_params.set_ldr_srgb_channel_weights(true);
			}
			else if (opt_match(pArg, "-no_alpha"))
				m_comp_params.m_check_for_alpha = false;
			else if (opt_match(pArg, "-force_alpha"))
				m_comp_params.m_force_alpha = true;
			else if (opt_match(pArg, {"-separate_rg_to_color_alpha", "-seperate_rg_to_color_alpha"})) // was mispelled for a while - whoops!
			{
				m_comp_params.m_swizzle[0] = 0;
				m_comp_params.m_swizzle[1] = 0;
				m_comp_params.m_swizzle[2] = 0;
				m_comp_params.m_swizzle[3] = 1;
			}
			else if (opt_match(pArg, "-swizzle"))
			{
				REMAINING_ARGS_CHECK(1);
				const char *swizzle = arg_v[arg_index + 1];
				if (strlen(swizzle) != 4)
				{
					error_printf("Swizzle requires exactly 4 characters (each one of [rgba] or [0123])\n");
					return false;
				}
				for (int i=0; i<4; ++i)
				{
					if ((tolower(swizzle[i]) == 'r') || (swizzle[i] == '0'))
						m_comp_params.m_swizzle[i] = 0;
					else if ((tolower(swizzle[i]) == 'g') || (swizzle[i] == '1'))
						m_comp_params.m_swizzle[i] = 1;
					else if ((tolower(swizzle[i]) == 'b') || (swizzle[i] == '2'))
						m_comp_params.m_swizzle[i] = 2;
					else if ((tolower(swizzle[i]) == 'a') || (swizzle[i] == '3'))
						m_comp_params.m_swizzle[i] = 3;
					else
					{
						error_printf("Swizzle must be one of [rgba] or [0123]");
						return false;
					}
				}
				arg_count++;
			}
			else if (opt_match(pArg, "-renorm"))
				m_comp_params.m_renormalize = true;
			else if (opt_match(pArg, {"-no_multithreading", "-no_threading", "-no_threads"}))
			{
				m_comp_params.m_multithreading = false;
			}
			else if (opt_match(pArg, "-parallel"))
			{
				m_parallel_compression = true;
			}
			else if (opt_match(pArg, "-max_threads"))
			{
				REMAINING_ARGS_CHECK(1);
				m_max_threads = maximum(1, atoi(arg_v[arg_index + 1]));
				arg_count++;
			}
			else if (opt_match(pArg, "-mipmap"))
				m_comp_params.m_mip_gen = true;
			else if (opt_match(pArg, {"-no_ktx", "-no_dds"}))
				m_no_ktx = true;
			else if (opt_match(pArg, {"-ktx_only", "-dds_only"}))
				m_ktx_only = true;
			else if (opt_match(pArg, "-write_out"))
				m_write_out = true;
			else if (opt_match(pArg, "-tonemap_dither"))
				m_tonemap_dither_flag = true;
			else if (opt_match(pArg, "-format_only"))
			{
				REMAINING_ARGS_CHECK(1);
				m_unpack_format_only = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-opencl"))
			{
				m_comp_params.m_use_opencl = true;
			}
			else if (opt_match(pArg, "-opencl_serialize"))
			{
			}
			else if (opt_match(pArg, "-mip_scale"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_mip_scale = (float)atof(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-mip_filter"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_mip_filter = arg_v[arg_index + 1];
				// TODO: Check filter 
				arg_count++;
			}
			else if (opt_match(pArg, "-mip_renorm"))
				m_comp_params.m_mip_renormalize = true;
			else if (opt_match(pArg, "-mip_clamp"))
				m_comp_params.m_mip_wrapping = false;
			else if (opt_match(pArg, "-mip_fast"))
				m_comp_params.m_mip_fast = true;
			else if (opt_match(pArg, "-mip_slow"))
				m_comp_params.m_mip_fast = false;
			else if (opt_match(pArg, "-mip_smallest"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_mip_smallest_dimension = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-mip_srgb"))
				m_comp_params.m_mip_srgb = true;
			else if (opt_match(pArg, "-mip_linear"))
				m_comp_params.m_mip_srgb = false;
			else if (opt_match(pArg, "-userdata0"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_userdata0 = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-userdata1"))
			{
				REMAINING_ARGS_CHECK(1);
				m_comp_params.m_userdata1 = atoi(arg_v[arg_index + 1]);
				arg_count++;
			}
			else if (opt_match(pArg, "-framerate"))
			{
				REMAINING_ARGS_CHECK(1);
				double fps = atof(arg_v[arg_index + 1]);
				double us_per_frame = 0;
				if (fps > 0)
					us_per_frame = 1000000.0f / fps;

				m_comp_params.m_us_per_frame = clamp<int>(static_cast<int>(us_per_frame + .5f), 0, basist::cBASISMaxUSPerFrame);
				arg_count++;
			}
			else if (opt_match(pArg, "-cubemap"))
			{
				m_comp_params.m_tex_type = basist::cBASISTexTypeCubemapArray;
				m_individual = false;
			}
			else if (opt_match(pArg, "-tex_type"))
			{
				REMAINING_ARGS_CHECK(1);
				const char* pType = arg_v[arg_index + 1];

				if (strcasecmp(pType, "2d") == 0)
					m_comp_params.m_tex_type = basist::cBASISTexType2D;
				else if (strcasecmp(pType, "2darray") == 0)
				{
					m_comp_params.m_tex_type = basist::cBASISTexType2DArray;
					m_individual = false;
				}
				else if (strcasecmp(pType, "3d") == 0)
				{
					m_comp_params.m_tex_type = basist::cBASISTexTypeVolume;
					m_individual = false;
				}
				else if (strcasecmp(pType, "cubemap") == 0)
				{
					m_comp_params.m_tex_type = basist::cBASISTexTypeCubemapArray;
					m_individual = false;
				}
				else if (strcasecmp(pType, "video") == 0)
				{
					m_comp_params.m_tex_type = basist::cBASISTexTypeVideoFrames;
					m_individual = false;
				}
				else
				{
					error_printf("Invalid texture type: %s\n", pType);
					return false;
				}
				arg_count++;
			}
			else if (opt_match(pArg, "-individual"))
				m_individual = true;
			else if (opt_match(pArg, {"-tex_array", "-texarray"}))
				m_individual = false;
			else if (opt_match(pArg, "-fuzz_testing"))
				m_fuzz_testing = true;
			else if (opt_match(pArg, "-csv_file"))
			{
				REMAINING_ARGS_CHECK(1);
				m_csv_file = arg_v[arg_index + 1];
				m_comp_params.m_compute_stats = true;
				m_comp_params.m_psnr_hvs_m_stats = true;

				arg_count++;
			}
			else if (pArg[0] == '-')
			{
				error_printf("Unrecognized command line option: %s\n", pArg);
				return false;
			}
			else
			{
				// Let's assume it's a source filename, so globbing works
				//error_printf("Unrecognized command line option: %s\n", pArg);
				m_input_filenames.push_back(pArg);
			}

			arg_index += arg_count;
			assert(arg_index <= arg_c);
		}

		const bool lossy_supercompression_changed = m_comp_params.m_xuastc_ldr_use_lossy_supercompression.was_changed();
		const bool lossy_supercompression_value = m_comp_params.m_xuastc_ldr_use_lossy_supercompression;
						
		if (m_comp_params.m_quality_level != -1) // they set the old-style "-q X" option, which is the legacy ETC1S-specific quality level which ranges from [1,255]
		{
			m_comp_params.m_etc1s_max_endpoint_clusters = 0;
			m_comp_params.m_etc1s_max_selector_clusters = 0;
						
			if (basis_tex_format_is_xuastc_ldr(m_comp_params.get_format_mode()))
			{
				printf("WARNING: Using \"-q [1,255]\" is not recommended for XUASTC LDR, instead use \"-quality [1,100]\"\n");

				// -q also controls XUASTC LDR/XUBC7 weight grid DCT quality level
				if (m_comp_params.m_quality_level < 100)
					m_comp_params.m_xuastc_ldr_use_dct = true;

				// Automatically enable lossy XUASTC supercompression if DCT is enabled.
				if ((!lossy_supercompression_changed) && (m_comp_params.m_quality_level < 100))
					m_comp_params.m_xuastc_ldr_use_lossy_supercompression = true;
			}
			else if (basis_tex_format_is_xubc7(m_comp_params.get_format_mode()))
			{
				printf("WARNING: Using \"-q [1,255]\" is not recommended for XUBC7, instead use \"-quality [1,100]\"\n");
			}
		}
		else if ((!m_comp_params.m_etc1s_max_endpoint_clusters) || (!m_comp_params.m_etc1s_max_selector_clusters))
		{
			m_comp_params.m_etc1s_max_endpoint_clusters = 0;
			m_comp_params.m_etc1s_max_selector_clusters = 0;

			// Don't slam to 128 unless it's ETC1S
			if (m_comp_params.get_format_mode() == basist::basis_tex_format::cETC1S)
				m_comp_params.m_quality_level = 128;
		}
		
		// Ensure mip_srgb is set to match the perceptual flag if the user didn't explicitly set it.
		if (!m_comp_params.m_mip_srgb.was_changed())
		{
			// They didn't specify what colorspace to do mipmap filtering in, so choose sRGB if they've specified that the texture is sRGB.
			// 4/26/2026: m_mip_srgb now defaults to true, unsure if this is needed now.
			if (m_comp_params.m_perceptual)
				m_comp_params.m_mip_srgb = true;
			else
				m_comp_params.m_mip_srgb = false;
		}

		// Handle new-style unified effort and quality levels across all codecs.
		// We have so many codecs now that it's necessary to unify the primary quality/effort controls otherwise it's too confusing.
		// If they've specified either -effort or -quality, assume they want the new unified API.
		// If they haven't specified either, they get the old parameters/options.
		if ((m_effort_level != -1) || (m_quality_level != -1))
		{
			if (m_used_old_style_codec_config_param)
			{
				fmt_printf("WARNING: Mixing old and new-style (-effort and/or -quality) codec configuration parameters.\nNew-style parameters may overwrite your old-style codec configuration settings.\nPrefer using -effort X and -quality X.\n");
			}
						
			// Set the new-style effort/quality level, but importantly don't override any settings already changed if they haven't explictly specified -effort or -quality.
			m_comp_params.set_format_mode_and_quality_effort(m_comp_params.get_format_mode(), m_quality_level, m_effort_level, false);

			// Allow the user to override the lossy supercompression setting, independent of the quality/effort levels.
			if (lossy_supercompression_changed)
			{
				m_comp_params.m_xuastc_ldr_use_lossy_supercompression = lossy_supercompression_value;
			}
		}
								
		return true;
	}

	bool process_listing_files()
	{
		basisu::vector<std::string> new_input_filenames;
		for (uint32_t i = 0; i < m_input_filenames.size(); i++)
		{
			if (m_input_filenames[i][0] == '@')
			{
				if (!load_listing_file(m_input_filenames[i], new_input_filenames))
					return false;
			}
			else
				new_input_filenames.push_back(m_input_filenames[i]);
		}
		new_input_filenames.swap(m_input_filenames);

		basisu::vector<std::string> new_input_alpha_filenames;
		for (uint32_t i = 0; i < m_input_alpha_filenames.size(); i++)
		{
			if (m_input_alpha_filenames[i][0] == '@')
			{
				if (!load_listing_file(m_input_alpha_filenames[i], new_input_alpha_filenames))
					return false;
			}
			else
				new_input_alpha_filenames.push_back(m_input_alpha_filenames[i]);
		}
		new_input_alpha_filenames.swap(m_input_alpha_filenames);
		
		return true;
	}

	basis_compressor_params m_comp_params;
		
	tool_mode m_mode;

	// -benchmark_single <FORMAT> <EFFORT> <QUALITY> parameters (cBenchmarkSingle).
	basist::basis_tex_format m_benchmark_fmt;
	uint32_t m_benchmark_effort;
	uint32_t m_benchmark_quality;
	// Optional overrides for the codec_benchmark() base path and file index range: -benchmark_path, -benchmark_range.
	// The _set flags record whether the user explicitly overrode them (so HDR can fall back to its own default set).
	std::string m_benchmark_path;
	uint32_t m_benchmark_first;
	uint32_t m_benchmark_last;
	bool m_benchmark_path_set;
	bool m_benchmark_range_set;
	// -benchmark_linear: use linear (not sRGB/perceptual) metrics for the benchmark. Default is sRGB.
	bool m_benchmark_linear;
	// -benchmark_xubc7_encoder [0,7]: XUBC7-only BC7 base encoder selection. 0 = bc7f (default), 1-7 = bc7e_scalar level 0-6.
	uint32_t m_benchmark_xubc7_encoder;
	// -benchmark_xuastc_profile [0,2]: XUASTC LDR entropy syntax/profile. 0 = full arith (default), 1 = hybrid, 2 = full zstd.
	uint32_t m_benchmark_xuastc_profile;
	// -benchmark_sweep axis ranges (cBenchmarkSweep). Block index [0,5] (4x4..12x12 squares), effort [0,10], quality [0,10] (x10 -> [1,100]).
	bool m_benchmark_sweep_block_set;
	uint32_t m_benchmark_sweep_block_lo, m_benchmark_sweep_block_hi;
	uint32_t m_benchmark_sweep_effort_lo, m_benchmark_sweep_effort_hi;
	uint32_t m_benchmark_sweep_quality_lo, m_benchmark_sweep_quality_hi;
	std::string m_benchmark_sweep_csv;

	bool m_ktx2_mode;
	bool m_ktx2_zstandard;
	int m_ktx2_zstandard_level;
	uint32_t m_ktx2_animdata_duration;
	uint32_t m_ktx2_animdata_timescale;
	uint32_t m_ktx2_animdata_loopcount;
		
	basisu::vector<std::string> m_input_filenames;
	basisu::vector<std::string> m_input_alpha_filenames;

	std::string m_output_filename;
	std::string m_output_path;

	// Target texture format string for -export_dds (e.g. "BC1", "BC7", "RGBA32").
	std::string m_export_dds_format;

	// Target output format string for -dds (e.g. "bc7", "a8r8g8b8"); see basisu_dds_export.h.
	std::string m_dds_format;

	// -dds BC7 packer options (defaults mean "not specified" -> use the dds_export_params default). See basisu_dds_export.h.
	dds_bc7_encoder m_dds_bc7_encoder = cDDSBC7Encoder_Default;	// which BC7 packer
	int m_dds_bc7f_level = -1;			// 0 = analytical, 1 = partially analytical, 2 = non analytical (bc7f); -1 = unset
	int m_dds_bc7e_scalar_level = -1;	// 0..6 (bc7e_scalar); -1 = unset

	// Target texture format string for -export_ktx (e.g. "BC7", "ETC2", "ASTC_6x6").
	std::string m_export_ktx_format;

	int m_unpack_format_only;

	std::string m_multifile_printf;
	uint32_t m_multifile_first;
	uint32_t m_multifile_num;

	std::string m_csv_file;

	std::string m_etc1s_use_global_codebooks_file;

	std::string m_test_file_dir;
	bool m_test_dir_explicit = false;	// true if -test_dir was explicitly given (so -test_codecs can default to test_files)

	// When true, -test_xuastc runs the compressor across all block sizes and prints the
	// expected-value tables (to copy/paste into the code) instead of validating.
	bool m_xuastc_test_dump = false;

	// -test_codecs: optional codec name filter (token-boundary, case-insensitive), e.g. "ETC1S", "XUASTC", "ASTC", "HDR".
	std::string m_codec_filter;
	// -test_codecs_gen: output .inl path (defaults to "basisu_tool_test_codecs.inl").
	std::string m_test_codecs_gen_filename;

	uint32_t m_max_threads;
		
	bool m_individual;
	bool m_no_ktx;
	bool m_ktx_only;
	bool m_write_out;
	bool m_etc1_only;
	bool m_fuzz_testing;
	bool m_compare_ssim;
	bool m_compare_plot;

	// -dump_image_stats / -dump_pixel / -dump_block (diagnostic image inspection; see image_stats_mode())
	bool m_dump_image_stats;
	int m_dump_pixel_x, m_dump_pixel_y;		// -1 == not requested
	int m_dump_block_x, m_dump_block_y;		// -1 == not requested (4x4 texel block coords)
	int m_stats_region_x, m_stats_region_y, m_stats_region_w, m_stats_region_h;	// -1 == stats cover the whole image; otherwise restrict to this rectangle
	int m_extract_channel;					// -extract_channel: 0=R,1=G,2=B,3=A; -1 == not requested
	int m_extract_swizzle[4] = { 0, 1, 2, 3 };	// -extract_swizzle: source channel index feeding each output R/G/B/A (identity by default)
	int m_extract_swizzle_count = -1;		// number of swizzle tokens given (1..4); -1 == not requested. Output channels >= count pass through unchanged
	std::string m_extract_filename;			// output PNG for -extract_channel / -extract_swizzle / -extract_region
	int m_extract_region_x, m_extract_region_y, m_extract_region_w, m_extract_region_h;	// region rectangle; w<=0 means "whole image" (optional for -extract_channel/-extract_swizzle, required for -extract_region)
	int m_extract_color_xform = cExtractXformNone;	// optional sRGB<->linear transform applied to the extracted output
	bool m_extract_xform_alpha = false;		// default: transform RGB only (A passes through); true == also transform the alpha channel
	std::string m_text_image_in, m_text_image_out;	// -text_to_png / -png_to_text: input and output filenames (see basisu_text_image.h)
	bool m_parallel_compression;
	bool m_tonemap_dither_flag;
	bool m_xuastc_ldr_disable_bc7_transcoding;
	bool m_no_etc1s_transcoding_chroma_filtering;
	bool m_higher_quality_transcoding;
	bool m_transcode_force_deblocking;
	bool m_transcode_disable_deblocking; 
	
	int m_effort_level;
	int m_quality_level; // new-style -quality X
	bool m_used_old_style_codec_config_param; // true if the user has specified low-level or old-style codec configuration parameters
};

static bool expand_multifile(command_line_params &opts)
{
	if (!opts.m_multifile_printf.size())
		return true;
	
	if (!opts.m_multifile_num)
	{
		error_printf("-multifile_printf specified, but not -multifile_num\n");
		return false;
	}
	
	std::string fmt(opts.m_multifile_printf);
	// Workaround for MSVC debugger issues. Questionable to leave in here.
	size_t x = fmt.find_first_of('!');
	if (x != std::string::npos)
		fmt[x] = '%';

	if (string_find_right(fmt, '%') == -1)
	{
		error_printf("Must include C-style printf() format character '%%' in -multifile_printf string\n");
		return false;
	}
		
	for (uint32_t i = opts.m_multifile_first; i < opts.m_multifile_first + opts.m_multifile_num; i++)
	{
		char buf[1024];
#ifdef _WIN32		
		sprintf_s(buf, sizeof(buf), fmt.c_str(), i);
#else
		snprintf(buf, sizeof(buf), fmt.c_str(), i);
#endif		

		if (buf[0])
			opts.m_input_filenames.push_back(buf);
	}

	return true;
}

struct basis_data
{
	basis_data() : 
		m_transcoder() 
	{
	}
	uint8_vec m_file_data;
	basist::basisu_transcoder m_transcoder;
};

static basis_data *load_basis_file(const char *pInput_filename, bool force_etc1s)
{
	basis_data* p = new basis_data;
	uint8_vec &basis_data = p->m_file_data;
	if (!basisu::read_file_to_vec(pInput_filename, basis_data))
	{
		error_printf("Failed reading file \"%s\"\n", pInput_filename);
		delete p;
		return nullptr;
	}
	printf("\nInput file \"%s\"\n", pInput_filename);
	if (!basis_data.size())
	{
		error_printf("File is empty!\n");
		delete p;
		return nullptr;
	}
	if (basis_data.size() > UINT32_MAX)
	{
		error_printf("File is too large!\n");
		delete p;
		return nullptr;
	}
	if (force_etc1s)
	{
		if (p->m_transcoder.get_basis_tex_format((const void*)&p->m_file_data[0], (uint32_t)p->m_file_data.size()) != basist::basis_tex_format::cETC1S)
		{
			error_printf("Global codebook file must be in ETC1S format!\n");
			delete p;
			return nullptr;
		}
	}
	if (!p->m_transcoder.start_transcoding(&basis_data[0], (uint32_t)basis_data.size()))
	{
		error_printf("start_transcoding() failed!\n");
		delete p;
		return nullptr;
	}
	return p;
}

static uint32_t get_transcode_flags_from_options(const command_line_params& opts)
{
	uint32_t transcode_flags = opts.m_higher_quality_transcoding ? basist::cDecodeFlagsHighQuality : 0;

	if (opts.m_transcode_disable_deblocking)
		transcode_flags |= basist::cDecodeFlagsNoDeblockFiltering;
	else if (opts.m_transcode_force_deblocking)
		transcode_flags |= basist::cDecodeFlagsForceDeblockFiltering;

	if (opts.m_no_etc1s_transcoding_chroma_filtering)
		transcode_flags |= basist::cDecodeFlagsNoETC1SChromaFiltering;
	if (opts.m_xuastc_ldr_disable_bc7_transcoding)
		transcode_flags |= basist::cDecodeFlagXUASTCLDRDisableFastBC7Transcoding;

	return transcode_flags;
}

static bool compress_mode(command_line_params &opts)
{
	uint32_t num_threads = 1;

	if (opts.m_comp_params.m_multithreading)
	{
		// We use std::thread::hardware_concurrency() as a hint to determine the default # of threads to put into a pool.
		num_threads = get_num_hardware_threads();
		if (num_threads < 1)
			num_threads = 1;
		if (num_threads > opts.m_max_threads)
			num_threads = opts.m_max_threads;
	}

	// num_threads is the total thread pool size, *including* the calling thread. So 1=no extra threads.
	job_pool compressor_jpool(opts.m_parallel_compression ? 1 : num_threads);
	if (!opts.m_parallel_compression)
		opts.m_comp_params.m_pJob_pool = &compressor_jpool;
		
	if (!expand_multifile(opts))
	{
		error_printf("-multifile expansion failed!\n");
		return false;
	}

	if (!opts.m_input_filenames.size())
	{
		error_printf("No input files to process!\n");
		return false;
	}
		
	basis_data* pGlobal_codebook_data = nullptr;
	if (opts.m_etc1s_use_global_codebooks_file.size())
	{
		pGlobal_codebook_data = load_basis_file(opts.m_etc1s_use_global_codebooks_file.c_str(), true);
		if (!pGlobal_codebook_data)
			return false;

		printf("Loaded global codebooks from .basis file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str());
	}
						
	basis_compressor_params &params = opts.m_comp_params;

	if (opts.m_ktx2_mode)
	{
		params.m_create_ktx2_file = true;
		if (opts.m_ktx2_zstandard)
			params.m_ktx2_uastc_supercompression = basist::KTX2_SS_ZSTANDARD;
		else
			params.m_ktx2_uastc_supercompression = basist::KTX2_SS_NONE;
				
		if (params.m_tex_type == basist::basis_texture_type::cBASISTexTypeVideoFrames)
		{
			// Create KTXanimData key value entry
			// TODO: Move this to basisu_comp.h
			basist::key_value kv;

			const char* pAD = "KTXanimData";
			kv.m_key.resize(strlen(pAD) + 1);
			strcpy((char*)kv.m_key.data(), pAD);
			
			basist::ktx2_animdata ad;
			ad.m_duration = opts.m_ktx2_animdata_duration;
			ad.m_timescale = opts.m_ktx2_animdata_timescale;
			ad.m_loopcount = opts.m_ktx2_animdata_loopcount;

			kv.m_value.resize(sizeof(ad));
			memcpy(kv.m_value.data(), &ad, sizeof(ad));

			params.m_key_values.push_back(kv);
		}
		
		// TODO- expose this to command line.
		params.m_ktx2_zstd_supercompression_level = opts.m_ktx2_zstandard_level;
	}

	params.m_read_source_images = true;
	params.m_write_output_basis_or_ktx2_files = true;
	params.m_pGlobal_codebooks = pGlobal_codebook_data ? &pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder() : nullptr; 
	
	// Get the transcode/decode flags used when validating the output by calling the transcoder from the options.
	params.m_transcode_flags = get_transcode_flags_from_options(opts);
	
	FILE *pCSV_file = nullptr;
	if (opts.m_csv_file.size())
	{
		//pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "a");
		pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "w");
		if (!pCSV_file)
		{
			error_printf("Failed opening CVS file \"%s\"\n", opts.m_csv_file.c_str());
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}
		fprintf(pCSV_file, "Filename, Size, Slices, Width, Height, HasAlpha, BitsPerTexel, Slice0RGBAvgPSNR, Slice0RGBAAvgPSNR, Slice0Luma709PSNR, Slice0BestETC1SLuma709PSNR, Q, CL, Time, RGBAvgPSNRMin, RGBAvgPSNRAvg, AAvgPSNRMin, AAvgPSNRAvg, Luma709PSNRMin, Luma709PSNRAvg\n");
	}

	printf("Processing %u total file(s)\n", (uint32_t)opts.m_input_filenames.size());
				
	interval_timer all_tm;
	all_tm.start();

	basisu::vector<basis_compressor_params> comp_params_vec;

	const size_t total_files = (opts.m_individual ? opts.m_input_filenames.size() : 1U);
	bool result = true;

	if ((opts.m_individual) && (opts.m_output_filename.size()))
	{
		if (total_files > 1)
		{
			error_printf("-output_file specified in individual mode, but multiple input files have been specified which would cause the output file to be written multiple times.\n");
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}
	}

	uint32_t total_successes = 0, total_failures = 0;

	for (size_t file_index = 0; file_index < total_files; file_index++)
	{
		if (opts.m_individual)
		{
			params.m_source_filenames.resize(1);
			params.m_source_filenames[0] = opts.m_input_filenames[file_index];

			if (file_index < opts.m_input_alpha_filenames.size())
			{
				params.m_source_alpha_filenames.resize(1);
				params.m_source_alpha_filenames[0] = opts.m_input_alpha_filenames[file_index];

				if (params.m_status_output)
					printf("Processing source file \"%s\", alpha file \"%s\"\n", params.m_source_filenames[0].c_str(), params.m_source_alpha_filenames[0].c_str());
			}
			else
			{
				params.m_source_alpha_filenames.resize(0);

				if (params.m_status_output)
					printf("Processing source file \"%s\"\n", params.m_source_filenames[0].c_str());
			}
		}
		else
		{
			params.m_source_filenames = opts.m_input_filenames;
			params.m_source_alpha_filenames = opts.m_input_alpha_filenames;
		}
								
		if (opts.m_output_filename.size())
			params.m_out_filename = opts.m_output_filename;
		else
		{
			std::string filename;

			string_get_filename(opts.m_input_filenames[file_index].c_str(), filename);
			string_remove_extension(filename);

			if (opts.m_ktx2_mode)
				filename += ".ktx2";
			else
				filename += ".basis";

			if (opts.m_output_path.size())
				string_combine_path(filename, opts.m_output_path.c_str(), filename.c_str());

			params.m_out_filename = filename;
		}

		if (opts.m_parallel_compression)
		{
			comp_params_vec.push_back(params);
		}
		else
		{
			basis_compressor c;

			if (!c.init(opts.m_comp_params))
			{
				error_printf("basis_compressor::init() failed!\n");

				if (pCSV_file)
				{
					fclose(pCSV_file);
					pCSV_file = nullptr;
				}

				delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
				return false;
			}

			interval_timer tm;
			tm.start();

			basis_compressor::error_code ec = c.process();

			tm.stop();

			if (ec == basis_compressor::cECSuccess)
			{
				total_successes++;

				if (params.m_status_output)
				{
					fmt_printf("Compression succeeded to file \"{}\" size {} bytes in {3.3} secs, {3.3} bits/texel\n",
						params.m_out_filename.c_str(),
						opts.m_ktx2_mode ? (uint64_t)c.get_output_ktx2_file().size() : (uint64_t)c.get_output_basis_file().size(),
						tm.get_elapsed_secs(),
						opts.m_ktx2_mode ? c.get_ktx2_bits_per_texel() : c.get_basis_bits_per_texel());
				}
			}
			else
			{
				total_failures++;

				result = false;

				if (!params.m_status_output)
				{
					error_printf("Compression failed on file \"%s\"\n", params.m_out_filename.c_str());
				}

				bool exit_flag = true;

				switch (ec)
				{
				case basis_compressor::cECFailedInvalidParameters:
				{
					error_printf("Invalid compressor parameters (internal error)\n");
					
					if (opts.m_individual)
						exit_flag = false;

					break;
				}
				case basis_compressor::cECFailedReadingSourceImages:
				{
					error_printf("Compressor failed reading a source image!\n");

					if (opts.m_individual)
						exit_flag = false;

					break;
				}
				case basis_compressor::cECFailedValidating:
					error_printf("Compressor failed 2darray/cubemap/video validation checks!\n");
					break;
				case basis_compressor::cECFailedEncodeUASTC:
					error_printf("Compressor UASTC encode failed!\n");
					break;
				case basis_compressor::cECFailedFrontEnd:
					error_printf("Compressor frontend stage failed!\n");
					break;
				case basis_compressor::cECFailedFrontendExtract:
					error_printf("Compressor frontend data extraction failed!\n");
					break;
				case basis_compressor::cECFailedBackend:
					error_printf("Compressor backend stage failed!\n");
					break;
				case basis_compressor::cECFailedCreateBasisFile:
					error_printf("Compressor failed creating Basis file data!\n");
					break;
				case basis_compressor::cECFailedWritingOutput:
					error_printf("Compressor failed writing to output Basis file!\n");
					break;
				case basis_compressor::cECFailedUASTCRDOPostProcess:
					error_printf("Compressor failed during the UASTC post process step!\n");
					break;
				case basis_compressor::cECFailedCreateKTX2File:
					error_printf("Compressor failed creating KTX2 file data!\n");
					break;
				default:
					error_printf("basis_compress::process() failed!\n");
					break;
				}

				if (exit_flag)
				{
					if (pCSV_file)
					{
						fclose(pCSV_file);
						pCSV_file = nullptr;
					}

					delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
					return false;
				}
			}

			if ((pCSV_file) && (c.get_stats().size()))
			{
				if (c.get_stats().size())
				{
					float rgb_avg_psnr_min = 1e+9f, rgb_avg_psnr_avg = 0.0f;
					float a_avg_psnr_min = 1e+9f, a_avg_psnr_avg = 0.0f;
					float luma_709_psnr_min = 1e+9f, luma_709_psnr_avg = 0.0f;

					for (size_t slice_index = 0; slice_index < c.get_stats().size(); slice_index++)
					{
						rgb_avg_psnr_min = basisu::minimum(rgb_avg_psnr_min, c.get_stats()[slice_index].m_basis_rgb_avg_psnr);
						rgb_avg_psnr_avg += c.get_stats()[slice_index].m_basis_rgb_avg_psnr;

						a_avg_psnr_min = basisu::minimum(a_avg_psnr_min, c.get_stats()[slice_index].m_basis_a_avg_psnr);
						a_avg_psnr_avg += c.get_stats()[slice_index].m_basis_a_avg_psnr;

						luma_709_psnr_min = basisu::minimum(luma_709_psnr_min, c.get_stats()[slice_index].m_basis_luma_709_psnr);
						luma_709_psnr_avg += c.get_stats()[slice_index].m_basis_luma_709_psnr;
					}

					rgb_avg_psnr_avg /= c.get_stats().size();
					a_avg_psnr_avg /= c.get_stats().size();
					luma_709_psnr_avg /= c.get_stats().size();

					fprintf(pCSV_file, "\"%s\", %u, %u, %u, %u, %u, %f, %f, %f, %f, %f, %u, %u, %f, %f, %f, %f, %f, %f, %f\n",
						params.m_out_filename.c_str(),
						(uint32_t)c.get_basis_file_size(),
						(uint32_t)c.get_stats().size(),
						c.get_stats()[0].m_width, c.get_stats()[0].m_height, (uint32_t)c.get_any_source_image_has_alpha(),
						c.get_basis_bits_per_texel(),
						c.get_stats()[0].m_basis_rgb_avg_psnr,
						c.get_stats()[0].m_basis_rgba_avg_psnr,
						c.get_stats()[0].m_basis_luma_709_psnr,
						c.get_stats()[0].m_best_etc1s_luma_709_psnr,
						params.m_quality_level, (int)params.m_etc1s_compression_level, tm.get_elapsed_secs(),
						rgb_avg_psnr_min, rgb_avg_psnr_avg,
						a_avg_psnr_min, a_avg_psnr_avg,
						luma_709_psnr_min, luma_709_psnr_avg);
					fflush(pCSV_file);
				}
			}

			//if ((opts.m_individual) && (params.m_status_output))
			//	printf("\n");

		} // if (opts.m_parallel_compression)

	} // file_index

	if (opts.m_parallel_compression)
	{
		basisu::vector<parallel_results> results;

		bool any_failed = basis_parallel_compress(
			num_threads,
			comp_params_vec,
			results);
		BASISU_NOTE_UNUSED(any_failed);
				
		for (uint32_t i = 0; i < comp_params_vec.size(); i++)
		{
			if (results[i].m_error_code != basis_compressor::cECSuccess)
			{
				result = false;

				total_failures++;

				error_printf("File %u (first source image: \"%s\", output file: \"%s\") failed with error code %i!\n", i, 
					comp_params_vec[i].m_source_filenames[0].c_str(), 
					comp_params_vec[i].m_out_filename.c_str(),
					(int)results[i].m_error_code);
			}
			else
			{
				total_successes++;
			}
		}
				
	} // if (opts.m_parallel_compression)

	printf("Total successes: %u failures: %u\n", total_successes, total_failures);
		
	all_tm.stop();

	if (total_files > 1)
		printf("Total compression time: %3.3f secs\n", all_tm.get_elapsed_secs());

	if (pCSV_file)
	{
		fclose(pCSV_file);
		pCSV_file = nullptr;
	}
	delete pGlobal_codebook_data; 
	pGlobal_codebook_data = nullptr;

	return result;
}

static bool unpack_and_validate_ktx2_file(
	uint32_t file_index,
	const std::string& base_filename,
	uint8_vec& ktx2_file_data,
	command_line_params& opts,
	FILE* pCSV_file,
	basis_data* pGlobal_codebook_data,
	uint32_t& total_unpack_warnings,
	uint32_t& total_pvrtc_nonpow2_warnings)
{
	BASISU_NOTE_UNUSED(pCSV_file);
	BASISU_NOTE_UNUSED(file_index);

	const bool validate_flag = (opts.m_mode == cValidate);

	if (ktx2_file_data.size() > UINT32_MAX)
	{
		error_printf("KTX2 file too large!\n");
		return false;
	}

	basist::ktx2_transcoder dec;

	if (!dec.init(ktx2_file_data.data(), ktx2_file_data.size_u32()))
	{
		error_printf("ktx2_transcoder::init() failed! File either uses an unsupported feature, is invalid, was corrupted, or this is a bug.\n");
		return false;
	}

	if (!dec.start_transcoding())
	{
		error_printf("ktx2_transcoder::start_transcoding() failed! File either uses an unsupported feature, is invalid, was corrupted, or this is a bug.\n");
		return false;
	}
		
	printf("Resolution: %ux%u\n", dec.get_width(), dec.get_height());
	fmt_printf("Block size: {}x{}\n", dec.get_block_width(), dec.get_block_height());
	printf("Mipmap Levels: %u\n", dec.get_levels());
	printf("Texture Array Size (layers): %u\n", dec.get_layers());
	printf("Total Faces: %u (%s)\n", dec.get_faces(), (dec.get_faces() == 6) ? "CUBEMAP" : "2D");
	printf("Is Texture Video: %u\n", dec.is_video());
	
	if (dec.is_hdr())
		fmt_printf("LDR to HDR upconversion nit multiplier: {}\n", dec.get_ldr_hdr_upconversion_nit_multiplier());
	
	printf("Deblocking filter ID: %u\n", dec.get_deblocking_filter_index());

	const bool is_etc1s = (dec.get_basis_tex_format() == basist::basis_tex_format::cETC1S);
	
	bool is_hdr = false;
	//bool is_xuastc_ldr = false, is_astc_ldr = false;

	std::string fmt_str_temp;

	const char* pFmt_str = nullptr;
	switch (dec.get_basis_tex_format())
	{
	case basist::basis_tex_format::cETC1S:
	{
		pFmt_str = "ETC1S";
		break;
	}
	case basist::basis_tex_format::cUASTC_LDR_4x4:
	{
		pFmt_str = "UASTC_LDR_4x4";
		break;
	}
	case basist::basis_tex_format::cUASTC_HDR_4x4:
	{
		is_hdr = true;
		pFmt_str = "UASTC_HDR_4x4";
		break;
	}
	case basist::basis_tex_format::cASTC_HDR_6x6:
	{
		is_hdr = true;
		pFmt_str = "ASTC_HDR_6x6";
		break;
	}
	case basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE:
	{
		is_hdr = true;
		pFmt_str = "UASTC_HDR_6x6_INTERMEDIATE";
		break;
	}
	case basist::basis_tex_format::cXUASTC_LDR_4x4:
	case basist::basis_tex_format::cXUASTC_LDR_5x4:
	case basist::basis_tex_format::cXUASTC_LDR_5x5:
	case basist::basis_tex_format::cXUASTC_LDR_6x5:
	case basist::basis_tex_format::cXUASTC_LDR_6x6:
	case basist::basis_tex_format::cXUASTC_LDR_8x5:
	case basist::basis_tex_format::cXUASTC_LDR_8x6:
	case basist::basis_tex_format::cXUASTC_LDR_10x5:
	case basist::basis_tex_format::cXUASTC_LDR_10x6:
	case basist::basis_tex_format::cXUASTC_LDR_8x8:
	case basist::basis_tex_format::cXUASTC_LDR_10x8:
	case basist::basis_tex_format::cXUASTC_LDR_10x10:
	case basist::basis_tex_format::cXUASTC_LDR_12x10:
	case basist::basis_tex_format::cXUASTC_LDR_12x12:
	{
		//is_xuastc_ldr = true;

		uint32_t block_width = 0, block_height = 0;
		basist::get_basis_tex_format_block_size(dec.get_basis_tex_format(), block_width, block_height);
		fmt_str_temp = fmt_string("XUASTC_LDR_{}x{}", block_width, block_height);
		pFmt_str = fmt_str_temp.c_str();
		break;
	}
	case basist::basis_tex_format::cASTC_LDR_4x4:
	case basist::basis_tex_format::cASTC_LDR_5x4:
	case basist::basis_tex_format::cASTC_LDR_5x5:
	case basist::basis_tex_format::cASTC_LDR_6x5:
	case basist::basis_tex_format::cASTC_LDR_6x6:
	case basist::basis_tex_format::cASTC_LDR_8x5:
	case basist::basis_tex_format::cASTC_LDR_8x6:
	case basist::basis_tex_format::cASTC_LDR_10x5:
	case basist::basis_tex_format::cASTC_LDR_10x6:
	case basist::basis_tex_format::cASTC_LDR_8x8:
	case basist::basis_tex_format::cASTC_LDR_10x8:
	case basist::basis_tex_format::cASTC_LDR_10x10:
	case basist::basis_tex_format::cASTC_LDR_12x10:
	case basist::basis_tex_format::cASTC_LDR_12x12:
	{
		//is_astc_ldr = true;

		uint32_t block_width = 0, block_height = 0;
		basist::get_basis_tex_format_block_size(dec.get_basis_tex_format(), block_width, block_height);
		fmt_str_temp = fmt_string("ASTC_LDR_{}x{}", block_width, block_height);
		pFmt_str = fmt_str_temp.c_str();
		break;
	}
	case basist::basis_tex_format::cXUBC7:
	{
		pFmt_str = "XUBC7";
		break;
	}
	default:
	{
		fmt_error_printf("Unknown/invalid format!\n");

		assert(0);
		return false;
	}
	}
			
	printf("KTX2 Supercompression Scheme: ");
	switch (dec.get_header().m_supercompression_scheme)
	{
	case basist::KTX2_SS_NONE: printf("NONE\n"); break;
	case basist::KTX2_SS_BASISLZ: printf("BASISLZ\n"); break;
	case basist::KTX2_SS_ZSTANDARD: printf("ZSTANDARD\n"); break;
	case basist::KTX2_SS_DEFLATE: printf("DEFLATE\n"); break;
	case basist::KTX2_SS_UASTC_HDR_6x6I: printf("UASTC_HDR_6x6I\n"); break;
	case basist::KTX2_SS_XUASTC_LDR: printf("XUASTC_LDR\n"); break;
	case basist::KTX2_SS_XUBC7: printf("XUBC7\n"); break;
	default:
		error_printf("Invalid/unknown/unsupported\n");
		return false;
	}

	printf("Library Supercompression Format: %s\n", pFmt_str);

	printf("Has Alpha: %u\n", (uint32_t)dec.get_has_alpha());
	
	printf("\nKTX2 header vk_format: 0x%X (decimal %u)\n", (uint32_t)dec.get_header().m_vk_format, (uint32_t)dec.get_header().m_vk_format);
	
	printf("\nData Format Descriptor (DFD):\n");
	printf("DFD length in bytes: %zu\n", dec.get_dfd().size());
	printf("DFD color model: %u\n", dec.get_dfd_color_model());
	printf("DFD color primaries: %u (%s)\n", dec.get_dfd_color_primaries(), basist::ktx2_get_df_color_primaries_str(dec.get_dfd_color_primaries()));
	printf("DFD transfer func: %u (%s)\n", dec.get_dfd_transfer_func(),
		(dec.get_dfd_transfer_func() == basist::KTX2_KHR_DF_TRANSFER_LINEAR) ? "LINEAR" : ((dec.get_dfd_transfer_func() == basist::KTX2_KHR_DF_TRANSFER_SRGB) ? "SRGB" : "?"));
	printf("DFD flags: %u\n", dec.get_dfd_flags());
	printf("DFD samples: %u\n", dec.get_dfd_total_samples());
	if (is_etc1s)
	{
		printf("DFD chan0: %s\n", basist::ktx2_get_etc1s_df_channel_id_str(dec.get_dfd_channel_id0()));
		if (dec.get_dfd_total_samples() == 2)
			printf("DFD chan1: %s\n", basist::ktx2_get_etc1s_df_channel_id_str(dec.get_dfd_channel_id1()));
	}
	else
	{
		printf("DFD chan0: %s\n", basist::ktx2_get_uastc_df_channel_id_str(dec.get_dfd_channel_id0()));
	}

	// For proper ASTC decoding we must know which ASTC decode profile to apply (sRGB or linear).
	const bool actual_ktx2_srgb_transfer_func = (dec.get_dfd_transfer_func() == basist::KTX2_KHR_DF_TRANSFER_SRGB);
		
	printf("DFD hex values:\n");
	for (uint32_t i = 0; i < dec.get_dfd().size(); i++)
	{
		printf("0x%X", dec.get_dfd()[i]);
		if ((i + 1) != dec.get_dfd().size())
			printf(",");
		if ((i & 3) == 3)
			printf("\n");
	}
	printf("\n");

	// the sRGB transfer function to use while unpacking astc content (ideally we want this to always match what we used during astc encoding)
	bool srgb_transfer_func_astc_unpacking = actual_ktx2_srgb_transfer_func;

	// the sRGB transfer function to use when writing out files (we want to indicate to the caller if the data is sRGB or linear)
	bool srgb_transfer_func_astc_writing = actual_ktx2_srgb_transfer_func;
		
	const bool is_uastc_ldr_4x4 = (dec.get_basis_tex_format() == basist::basis_tex_format::cUASTC_LDR_4x4);
	
	if ((is_etc1s) || (is_uastc_ldr_4x4))
	{
		// The ETC1S and UASTC LDR 4x4 transcoders supply ASTC LDR 4x4 data assuming the decoder will NOT be using the sRGB read decode profile, which is likely the most common case (in geospatial rendering scenarios).
		// Note XUASTC/UASTC LDR 4x4-12x12 supports both linear and sRGB decode profiles throughout the entire pipeline (encoding/transcoding/decoding to raw pixels).
		srgb_transfer_func_astc_unpacking = false;
		
		// This matches the behavior of our original tools. It ensures astcenc uses linear by default when reading our transcoded .KTX files.
		srgb_transfer_func_astc_writing = false;

		if (actual_ktx2_srgb_transfer_func)
			printf("Note: ETC1S/UASTC LDR 4x4 will always be decoded by this tool using the ASTC linear decode profile, regardless of the KTX2/.basis DFD transfer function field.\n");
	}

	printf("Total key values: %zu\n", dec.get_key_values().size());
	for (uint32_t i = 0; i < dec.get_key_values().size(); i++)
	{
		printf("%u. Key: \"%s\", Value length in bytes: %zu", i, (const char*)dec.get_key_values()[i].m_key.data(), dec.get_key_values()[i].m_value.size());

		if (dec.get_key_values()[i].m_value.size() > 256)
			continue;
		
		bool is_ascii = true;
		for (uint32_t j = 0; j < dec.get_key_values()[i].m_value.size(); j++)
		{
			uint8_t c = dec.get_key_values()[i].m_value[j];
			if (!(
				(!c) ||
				((c >= ' ') && (c < 0x80))  
				))
			{
				is_ascii = false;
				break;
			}
		}

		if (is_ascii)
		{
			uint8_vec s(dec.get_key_values()[i].m_value);
			s.push_back(0);
			printf(" Value String: \"%s\"", (const char *)s.data());
		}
		else
		{
			printf(" Value Bytes: ");
			for (uint32_t j = 0; j < dec.get_key_values()[i].m_value.size(); j++)
			{
				if (j)
					printf(",");
				printf("0x%X", dec.get_key_values()[i].m_value[j]);
			}
		}
		printf("\n");
	}

	if (is_etc1s)
	{
		printf("ETC1S header:\n");

		printf("Endpoint Count: %u, Selector Count: %u, Endpoint Length: %u, Selector Length: %u, Tables Length: %u, Extended Length: %u\n",
			(uint32_t)dec.get_etc1s_header().m_endpoint_count, (uint32_t)dec.get_etc1s_header().m_selector_count,
			(uint32_t)dec.get_etc1s_header().m_endpoints_byte_length, (uint32_t)dec.get_etc1s_header().m_selectors_byte_length,
			(uint32_t)dec.get_etc1s_header().m_tables_byte_length, (uint32_t)dec.get_etc1s_header().m_extended_byte_length);

		printf("Total ETC1S image descs: %zu\n", dec.get_etc1s_image_descs().size());
		for (uint32_t i = 0; i < dec.get_etc1s_image_descs().size(); i++)
		{
			printf("%u. Flags: 0x%X, RGB Ofs: %u Len: %u, Alpha Ofs: %u, Len: %u\n", i,
				(uint32_t)dec.get_etc1s_image_descs()[i].m_image_flags,
				(uint32_t)dec.get_etc1s_image_descs()[i].m_rgb_slice_byte_offset, (uint32_t)dec.get_etc1s_image_descs()[i].m_rgb_slice_byte_length,
				(uint32_t)dec.get_etc1s_image_descs()[i].m_alpha_slice_byte_offset, (uint32_t)dec.get_etc1s_image_descs()[i].m_alpha_slice_byte_length);
		}
	}

	printf("Levels:\n");
	for (uint32_t i = 0; i < dec.get_levels(); i++)
	{
		fmt_printf("{}. Offset: {}, Length: {}, Uncompressed Length: {}\n",
			i, dec.get_level_index()[i].m_byte_offset.get_uint64(),
			dec.get_level_index()[i].m_byte_length.get_uint64(),
			dec.get_level_index()[i].m_uncompressed_byte_length.get_uint64());
	}

	const uint32_t total_layers = maximum<uint32_t>(1, dec.get_layers());

	fmt_printf("Image level info:\n");

	for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
	{
		for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
		{
			for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
			{
				basist::ktx2_image_level_info level_info;

				if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
				{
					error_printf("Failed retrieving image level information (%u %u %u)!\n", layer_index, level_index, face_index);
					return false;
				}
				
				fmt_printf("--- Level Index: {}, Layer Index: {}, Face Index: {}\n",
					level_info.m_level_index, level_info.m_layer_index, level_info.m_face_index);
				
				fmt_printf("Orig width/height: {}x{}\n", level_info.m_orig_width, level_info.m_orig_height);
				fmt_printf("Width/height: {}x{}\n", level_info.m_width, level_info.m_height);
				fmt_printf("Block width/height: {}x{}\n", level_info.m_block_width, level_info.m_block_height);
				fmt_printf("Num blocks: {}x{}, Total blocks: {}\n", level_info.m_num_blocks_x, level_info.m_num_blocks_y, level_info.m_total_blocks);
				fmt_printf("Alpha flag: {}, I-frame flag: {}\n", level_info.m_alpha_flag, level_info.m_iframe_flag);
			}
		}
	}

	fmt_printf("\n");

	if (opts.m_mode == cInfo)
	{
		return true;
	}

	// gpu_images[format][face][layer][level]

	basisu::vector< gpu_image_vec > gpu_images[(int)basist::transcoder_texture_format::cTFTotalTextureFormats][6];

	int first_format = 0;
	int last_format = (int)basist::transcoder_texture_format::cTFTotalTextureFormats;

	if (opts.m_unpack_format_only > -1)
	{
		first_format = opts.m_unpack_format_only;
		last_format = first_format + 1;
	}

	uint32_t transcode_flags = get_transcode_flags_from_options(opts);
					
	for (int format_iter = first_format; format_iter < last_format; format_iter++)
	{
		basist::transcoder_texture_format tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

		if (basist::basis_transcoder_format_is_uncompressed(tex_fmt))
			continue;

		if (!basis_is_format_supported(tex_fmt, dec.get_basis_tex_format()))
			continue;

		if (tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
			continue;

		for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
		{
			gpu_images[(int)tex_fmt][face_index].resize(total_layers);

			for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				gpu_images[(int)tex_fmt][face_index][layer_index].resize(dec.get_levels());
		}
	}

	// Now transcode the file to all supported texture formats and save mipmapped KTX/DDS files
	for (int format_iter = first_format; format_iter < last_format; format_iter++)
	{
		const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

		if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt))
			continue;
		if (!basis_is_format_supported(transcoder_tex_fmt, dec.get_basis_tex_format()))
			continue;
		if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
			continue;

		for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
		{
			for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
			{
				for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
				{
					basist::ktx2_image_level_info level_info;

					if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
					{
						error_printf("Failed retrieving image level information (%u %u %u)!\n", layer_index, level_index, face_index);
						return false;
					}

					if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA))
					{
						if (!is_pow2(level_info.m_orig_width) || !is_pow2(level_info.m_orig_height))
						{
							total_pvrtc_nonpow2_warnings++;

							printf("Warning: Will not transcode image %u level %u res %ux%u to PVRTC1 (one or more dimension is not a power of 2)\n", layer_index, level_index, level_info.m_width, level_info.m_height);

							// Can't transcode this image level to PVRTC because it's not a pow2 (we're going to support transcoding non-pow2 to the next larger pow2 soon)
							continue;
						}
					}

					basisu::texture_format tex_fmt = basis_get_basisu_texture_format(transcoder_tex_fmt);

					gpu_image& gi = gpu_images[(int)transcoder_tex_fmt][face_index][layer_index][level_index];
					gi.init(tex_fmt, level_info.m_orig_width, level_info.m_orig_height);

					// Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output.
					fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes());
										
					interval_timer tm;
					tm.start();

					if (!dec.transcode_image_level(level_index, layer_index, face_index, gi.get_ptr(), gi.get_total_blocks(), transcoder_tex_fmt, transcode_flags))
					{
						error_printf("Failed transcoding image level (%u %u %u %u)!\n", layer_index, level_index, face_index, format_iter);
						return false;
					}

					double total_time = tm.get_elapsed_ms();

					printf("Transcode of layer %u level %u face %u res %ux%u format %s succeeded in %3.3f ms\n", layer_index, level_index, face_index, 
						level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_time);
				}

			} // format_iter

		} // level_index

	} // image_info

	// Return if we're just validating that transcoding succeeds
	if (validate_flag)
		return true;

	// Now write KTX/DDS/ASTC files and unpack them to individual PNG's/EXR's
	const bool is_cubemap = (dec.get_faces() > 1);
	const bool is_array = (total_layers > 1);
	const bool is_cubemap_array = is_cubemap && is_array;
	const bool is_mipmapped = dec.get_levels() > 1;
	BASISU_NOTE_UNUSED(is_cubemap_array);
	BASISU_NOTE_UNUSED(is_mipmapped);
	
	// The maximum Direct3D array size is 2048.
	const uint32_t MAX_DDS_TEXARRAY_SIZE = 2048;

	for (int format_iter = first_format; format_iter < last_format; format_iter++)
	{
		const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);
		const basisu::texture_format tex_fmt = basis_get_basisu_texture_format(transcoder_tex_fmt);
				
		if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt))
			continue;
		if (!basis_is_format_supported(transcoder_tex_fmt, dec.get_basis_tex_format()))
			continue;
		if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
			continue;

		const bool is_fmt_astc = basis_is_transcoder_texture_format_astc(transcoder_tex_fmt);

		// TODO: Could write DDS texture arrays.
		
		// No KTX tool that we know of supports cubemap arrays, so write individual cubemap files for each layer.
		if ((!opts.m_no_ktx) && (is_cubemap))
		{
			// Write a separate compressed texture file for each layer in a texarray.
			for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
			{
				basisu::vector<gpu_image_vec> cubemap;
				for (uint32_t face_index = 0; face_index < 6; face_index++)
					cubemap.push_back(gpu_images[format_iter][face_index][layer_index]);

				// Write KTX1 file
				{
					std::string ktx_filename(base_filename + string_format("_transcoded_cubemap_%s_layer_%u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), layer_index));

					if (!write_compressed_texture_file(ktx_filename.c_str(), cubemap, true, is_fmt_astc ? srgb_transfer_func_astc_writing : actual_ktx2_srgb_transfer_func))
					{
						error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str());
						return false;
					}
					printf("Wrote .KTX cubemap file \"%s\"\n", ktx_filename.c_str());
				}
								
				// Write .DDS file
				if (does_dds_support_format(cubemap[0][0].get_format()))
				{
					std::string dds_filename(base_filename + string_format("_transcoded_cubemap_%s_layer_%u.dds", basist::basis_get_format_name(transcoder_tex_fmt), layer_index));

					if (!write_compressed_texture_file(dds_filename.c_str(), cubemap, true, actual_ktx2_srgb_transfer_func))
					{
						error_printf("Failed writing DDS file \"%s\"!\n", dds_filename.c_str());
						return false;
					}
					printf("Wrote .DDS cubemap file \"%s\"\n", dds_filename.c_str());
				}
			} // layer_index
		}

		// For texture arrays, let's be adventurous and write a DDS texture array file. RenderDoc and DDSView (DirectXTex) can view them. (Only RenderDoc allows viewing them entirely.)
		if ((!opts.m_no_ktx) && (is_array) && (total_layers <= MAX_DDS_TEXARRAY_SIZE))
		{
			if (does_dds_support_format(tex_fmt))
			{
				basisu::vector<gpu_image_vec> tex_array;
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
						tex_array.push_back(gpu_images[format_iter][face_index][layer_index]);

				std::string dds_filename(base_filename + string_format("_transcoded_array_%s.dds", basist::basis_get_format_name(transcoder_tex_fmt)));

				if (!write_compressed_texture_file(dds_filename.c_str(), tex_array, is_cubemap, actual_ktx2_srgb_transfer_func))
				{
					error_printf("Failed writing DDS file \"%s\"!\n", dds_filename.c_str());
					return false;
				}
				printf("Wrote .DDS texture array file \"%s\"\n", dds_filename.c_str());
			}
		}

		// Now unpack each layer and face individually and write KTX/DDS/ASTC/PNG/EXR/OUT files for each
		for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
		{
			for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
			{
				gpu_image_vec& gi = gpu_images[format_iter][face_index][layer_index];

				if (!gi.size())
					continue;

				uint32_t level;
				for (level = 0; level < gi.size(); level++)
					if (!gi[level].get_total_blocks())
						break;

				if (level < gi.size())
					continue;

				// Write separate compressed KTX/DDS textures with mipmap levels for each individual texarray layer and face.
				if (!opts.m_no_ktx)
				{
					// Write KTX
					{
						std::string ktx_filename;
						if (is_cubemap)
							ktx_filename = base_filename + string_format("_transcoded_%s_face_%u_layer_%04u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
						else
							ktx_filename = base_filename + string_format("_transcoded_%s_layer_%04u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), layer_index);

						if (!write_compressed_texture_file(ktx_filename.c_str(), gi, is_fmt_astc ? srgb_transfer_func_astc_writing : actual_ktx2_srgb_transfer_func))
						{
							error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str());
							return false;
						}
						printf("Wrote .KTX file \"%s\"\n", ktx_filename.c_str());
					}

					// Write DDS if it supports this texture format
					if (does_dds_support_format(gi[0].get_format()))
					{
						std::string dds_filename;
						if (is_cubemap)
							dds_filename = base_filename + string_format("_transcoded_%s_face_%u_layer_%04u.dds", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
						else
							dds_filename = base_filename + string_format("_transcoded_%s_layer_%04u.dds", basist::basis_get_format_name(transcoder_tex_fmt), layer_index);

						if (!write_compressed_texture_file(dds_filename.c_str(), gi, actual_ktx2_srgb_transfer_func))
						{
							error_printf("Failed writing DDS file \"%s\"!\n", dds_filename.c_str());
							return false;
						}
						printf("Wrote .DDS file \"%s\"\n", dds_filename.c_str());
					}
				}

				// Now unpack and save PNG/EXR files
				for (uint32_t level_index = 0; level_index < gi.size(); level_index++)
				{
					basist::ktx2_image_level_info level_info;

					if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
					{
						error_printf("Failed retrieving image level information (%u %u %u)!\n", layer_index, level_index, face_index);
						return false;
					}

					if (basist::basis_transcoder_format_is_hdr(transcoder_tex_fmt))
					{
						imagef u;

						if (!gi[level_index].unpack_hdr(u))
						{
							printf("Warning: Failed unpacking HDR GPU texture data (%u %u %u %u). Unpacking as much as possible.\n", format_iter, layer_index, level_index, face_index);
							total_unpack_warnings++;
						}

						if (!opts.m_ktx_only)
						{
							std::string rgb_filename;
							if (gi.size() > 1)
								rgb_filename = base_filename + string_format("_hdr_unpacked_rgb_%s_level_%u_face_%u_layer_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								rgb_filename = base_filename + string_format("_hdr_unpacked_rgb_%s_face_%u_layer_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);

							if (!write_exr(rgb_filename.c_str(), u, 3, 0))
							{
								error_printf("Failed writing to EXR file \"%s\"\n", rgb_filename.c_str());
								delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
								return false;
							}
							printf("Wrote .EXR file \"%s\"\n", rgb_filename.c_str());
						}

						// Save .astc
						if ((!opts.m_ktx_only) && basist::basis_is_transcoder_texture_format_astc(transcoder_tex_fmt))
						{
							std::string astc_filename;
							if (gi.size() > 1)
								astc_filename = base_filename + string_format("_unpacked_%s_level_%u_face_%u_layer_%04u.astc", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								astc_filename = base_filename + string_format("_unpacked_%s_face_%u_layer_%04u.astc", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);

							const gpu_image& level_g = gi[level_index];

							if (!write_astc_file(astc_filename.c_str(), level_g.get_ptr(), level_g.get_block_width(), level_g.get_block_height(), level_info.m_width, level_info.m_height))
							{
								error_printf("Failed writing to .ASTC file \"%s\"\n", astc_filename.c_str());
								return false;
							}
							printf("Wrote .ASTC file \"%s\"\n", astc_filename.c_str());
						}
					}
					else
					{
						image u;
						if (!gi[level_index].unpack(u, srgb_transfer_func_astc_unpacking))
						{
							printf("Warning: Failed unpacking GPU texture data (%u %u %u %u). Unpacking as much as possible.\n", format_iter, layer_index, level_index, face_index);
							total_unpack_warnings++;
						}
						//u.crop(level_info.m_orig_width, level_info.m_orig_height);

						bool write_png = true;

						// Save PNG (ignoring alpha)
						if ((!opts.m_ktx_only) && (write_png))
						{
							std::string rgb_filename;
							if (gi.size() > 1)
								rgb_filename = base_filename + string_format("_unpacked_rgb_%s_level_%u_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								rgb_filename = base_filename + string_format("_unpacked_rgb_%s_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
							if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
								delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());
						}
												
						// Save alpha
						if (basis_transcoder_format_has_alpha(transcoder_tex_fmt) && (!opts.m_ktx_only) && (write_png))
						{
							std::string a_filename;
							if (gi.size() > 1)
								a_filename = base_filename + string_format("_unpacked_a_%s_level_%u_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								a_filename = base_filename + string_format("_unpacked_a_%s_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
							if (!save_png(a_filename, u, cImageSaveGrayscale, 3))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());

							std::string rgba_filename;
							if (gi.size() > 1)
								rgba_filename = base_filename + string_format("_unpacked_rgba_%s_level_%u_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								rgba_filename = base_filename + string_format("_unpacked_rgba_%s_face_%u_layer_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
							if (!save_png(rgba_filename, u))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgba_filename.c_str());
						}

						// Save .astc
						if ((!opts.m_ktx_only) && basist::basis_is_transcoder_texture_format_astc(transcoder_tex_fmt))
						{
							std::string astc_filename;
							if (gi.size() > 1)
								astc_filename = base_filename + string_format("_unpacked_%s_level_%u_face_%u_layer_%04u.astc", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								astc_filename = base_filename + string_format("_unpacked_%s_face_%u_layer_%04u.astc", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);

							const gpu_image& level_g = gi[level_index];

							if (!write_astc_file(astc_filename.c_str(), level_g.get_ptr(), level_g.get_block_width(), level_g.get_block_height(), level_info.m_width, level_info.m_height))
							{
								error_printf("Failed writing to .ASTC file \"%s\"\n", astc_filename.c_str());
								return false;
							}
							printf("Wrote .ASTC file \"%s\"\n", astc_filename.c_str());
						}

						// Save .OUT
						if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFFXT1_RGB) && (opts.m_write_out))
						{
							std::string out_filename;
							if (gi.size() > 1)
								out_filename = base_filename + string_format("_unpacked_rgb_%s_level_%u_face_%u_layer_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index);
							else
								out_filename = base_filename + string_format("_unpacked_rgb_%s_face_%u_layer_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index);
							if (!write_3dfx_out_file(out_filename.c_str(), gi[level_index]))
							{
								error_printf("Failed writing to OUT file \"%s\"\n", out_filename.c_str());
								return false;
							}
							printf("Wrote .OUT file \"%s\"\n", out_filename.c_str());
						}
						
					} // is_hdr

				} // level_index

			} // face_index

		} // layer_index

	} // format_iter

	if ((opts.m_unpack_format_only == -1) && (!validate_flag))
	{
		if (is_hdr)
		{
			// RGBA HALF
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA_HALF;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;

						basisu::vector<basist::half_float> half_img(total_pixels * 4);

						fill_buffer_with_random_bytes(&half_img[0], half_img.size_in_bytes());

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, half_img.data(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						double total_transcode_time = tm.get_elapsed_ms();

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n", 
							level_index, layer_index, face_index, 
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							// TODO: HDR alpha support
							imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

							for (uint32_t y = 0; y < level_info.m_orig_height; y++)
								for (uint32_t x = 0; x < level_info.m_orig_width; x++)
									for (uint32_t c = 0; c < 4; c++)
										float_img(x, y)[c] = basist::half_to_float(half_img[(x + y * level_info.m_orig_width) * 4 + c]);

							std::string rgb_filename(base_filename + fmt_string("_hdr_unpacked_rgba_{}_level_{}_face_{}_layer_{04}.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
							{
								fmt_error_printf("Failed writing to .EXR file \"{}\"\n", rgb_filename.c_str());
								return false;
							}
							fmt_printf("Wrote .EXR file \"{}\"\n", rgb_filename.c_str());
						}

					} // face_index
				} // layer_index 
			} // level_index

			// RGB HALF
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB_HALF;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;

						basisu::vector<basist::half_float> half_img(total_pixels * 3);

						fill_buffer_with_random_bytes(&half_img[0], half_img.size_in_bytes());

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, half_img.data(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						double total_transcode_time = tm.get_elapsed_ms();

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n",
							level_index, layer_index, face_index,
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							// TODO: HDR alpha support
							imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

							for (uint32_t y = 0; y < level_info.m_orig_height; y++)
								for (uint32_t x = 0; x < level_info.m_orig_width; x++)
									for (uint32_t c = 0; c < 3; c++)
										float_img(x, y)[c] = basist::half_to_float(half_img[(x + y * level_info.m_orig_width) * 3 + c]);

							std::string rgb_filename(base_filename + fmt_string("_hdr_unpacked_rgb_{}_level_{}_face_{}_layer_{04}.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
							{
								fmt_error_printf("Failed writing to .EXR file \"{}\"\n", rgb_filename.c_str());
								return false;
							}
							fmt_printf("Wrote .EXR file \"{}\"\n", rgb_filename.c_str());
						}

					} // face_index
				} // layer_index 
			} // level_index

			// RGB_9E5
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB_9E5;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;

						basisu::vector<uint32_t> rgb9e5_img(total_pixels);

						fill_buffer_with_random_bytes(&rgb9e5_img[0], rgb9e5_img.size_in_bytes());

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, rgb9e5_img.data(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						double total_transcode_time = tm.get_elapsed_ms();

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n",
							level_index, layer_index, face_index,
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							// TODO: HDR alpha support
							imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

							for (uint32_t y = 0; y < level_info.m_orig_height; y++)
								for (uint32_t x = 0; x < level_info.m_orig_width; x++)
									astc_helpers::unpack_rgb9e5(rgb9e5_img[x + y * level_info.m_orig_width], float_img(x, y)[0], float_img(x, y)[1], float_img(x, y)[2]);

							std::string rgb_filename(base_filename + fmt_string("_hdr_unpacked_rgb_{}_level_{}_face_{}_layer_{04}.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
							{
								fmt_error_printf("Failed writing to .EXR file \"{}\"\n", rgb_filename.c_str());
								return false;
							}
							fmt_printf("Wrote .EXR file \"{}\"\n", rgb_filename.c_str());
						}

					} // face_index
				} // layer_index 
			} // level_index
						
		}
		else
		{
			// RGBA 32bpp
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA32;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;

						image img(level_info.m_orig_width, level_info.m_orig_height);

						fill_buffer_with_random_bytes(img.get_ptr(), img.get_total_pixels() * sizeof(color_rgba));

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						double total_transcode_time = tm.get_elapsed_ms();

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n",
							level_index, layer_index, face_index,
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							std::string rgba_filename(base_filename + fmt_string("_unpacked_rgba_{}_level_{}_face_{}_layer{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(rgba_filename, img))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", rgba_filename.c_str());
								return false;
							}

							std::string rgb_filename(base_filename + fmt_string("_unpacked_rgb_{}_level_{}_face_{}_layer{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", rgb_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

							std::string a_filename(base_filename + fmt_string("_unpacked_a_{}_{}_{}_{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(a_filename, img, cImageSaveGrayscale, 3))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", a_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());
						}

					} // face_index
				} // layer_index 
			} // level_index

			// RGB565
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB565;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;
						
						basisu::vector<uint16_t> packed_img(total_pixels);
												
						fill_buffer_with_random_bytes(packed_img.get_ptr(), packed_img.size_in_bytes());

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, packed_img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}
												
						double total_transcode_time = tm.get_elapsed_ms();

						image img(level_info.m_orig_width, level_info.m_orig_height);

						for (uint32_t y = 0; y < level_info.m_orig_height; y++)
						{
							for (uint32_t x = 0; x < level_info.m_orig_width; x++)
							{
								const uint16_t p = packed_img[x + y * level_info.m_orig_width];
								uint32_t r = p >> 11, g = (p >> 5) & 63, b = p & 31;
								r = (r << 3) | (r >> 2);
								g = (g << 2) | (g >> 4);
								b = (b << 3) | (b >> 2);
								img(x, y).set(r, g, b, 255);
							}
						}

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n",
							level_index, layer_index, face_index,
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							std::string rgb_filename(base_filename + fmt_string("_unpacked_rgb_{}_level_{}_face_{}_layer{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", rgb_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

						}

					} // face_index
				} // layer_index 
			} // level_index

			// RGBA4444
			for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++)
			{
				for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++)
				{
					for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++)
					{
						const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA4444;

						basist::ktx2_image_level_info level_info;

						if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index))
						{
							fmt_error_printf("Failed retrieving image level information ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;

						basisu::vector<uint16_t> packed_img(total_pixels);

						fill_buffer_with_random_bytes(packed_img.get_ptr(), packed_img.size_in_bytes());

						interval_timer tm;
						tm.start();

						if (!dec.transcode_image_level(level_index, layer_index, face_index, packed_img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags))
						{
							fmt_error_printf("Failed transcoding image level ({} {} {})!\n", layer_index, level_index, face_index);
							return false;
						}

						double total_transcode_time = tm.get_elapsed_ms();

						image img(level_info.m_orig_width, level_info.m_orig_height);

						for (uint32_t y = 0; y < level_info.m_orig_height; y++)
						{
							for (uint32_t x = 0; x < level_info.m_orig_width; x++)
							{
								const uint16_t p = packed_img[x + y * level_info.m_orig_width];
								uint32_t r = p >> 12, g = (p >> 8) & 15, b = (p >> 4) & 15, a = p & 15;
								r = (r << 4) | r;
								g = (g << 4) | g;
								b = (b << 4) | b;
								a = (a << 4) | a;
								img(x, y).set(r, g, b, a);
							}
						}

						fmt_printf("Transcode of level {} layer {} face {} res {}x{} format {} succeeded in {} ms\n",
							level_index, layer_index, face_index,
							level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

						if ((!validate_flag) && (!opts.m_ktx_only))
						{
							std::string rgba_filename(base_filename + fmt_string("_unpacked_rgba_{}_level_{}_face_{}_layer{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(rgba_filename, img))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", rgba_filename.c_str());
								return false;
							}

							std::string rgb_filename(base_filename + fmt_string("_unpacked_rgb_{}_level_{}_face_{}_layer{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", rgb_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

							std::string a_filename(base_filename + fmt_string("_unpacked_a_{}_{}_{}_{04}.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index));
							if (!save_png(a_filename, img, cImageSaveGrayscale, 3))
							{
								error_printf("Failed writing to .PNG file \"%s\"\n", a_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());
						}

					} // face_index
				} // layer_index 
			} // level_index
		}
	}

	return true;
}

static bool vec_is_ascii(const uint8_vec& v)
{
	bool is_ascii = true;

	for (uint32_t j = 0; j < v.size(); j++)
	{
		uint8_t c = v[j];
		if (!c)
			break;

		if ((c < 32) || (c > 127))
		{
			is_ascii = false;
			break;
		}
	} // j

	return is_ascii;
}

static bool unpack_and_validate_basis_file(
	uint32_t file_index,
	const std::string &base_filename,
	uint8_vec &basis_file_data,
	command_line_params& opts, 
	FILE *pCSV_file,
	basis_data* pGlobal_codebook_data,
	uint32_t &total_unpack_warnings,
	uint32_t &total_pvrtc_nonpow2_warnings)
{
	const bool validate_flag = (opts.m_mode == cValidate);

	basist::basisu_transcoder dec;

	if (pGlobal_codebook_data)
	{
		dec.set_global_codebooks(&pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder());
	}

	if (!opts.m_fuzz_testing)
	{
		// Skip the full validation, which CRC16's the entire file.

		// Validate the file - note this isn't necessary for transcoding
		if (!dec.validate_file_checksums(&basis_file_data[0], (uint32_t)basis_file_data.size(), true))
		{
			error_printf("File version is unsupported, or file failed one or more CRC checks!\n");
			
			return false;
		}
	}

	printf("File version and CRC checks succeeded\n");

	basist::basisu_file_info fileinfo;
	if (!dec.get_file_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), fileinfo))
	{
		error_printf("Failed retrieving Basis file information!\n");
		return false;
	}

	assert(fileinfo.m_total_images == fileinfo.m_image_mipmap_levels.size());
	assert(fileinfo.m_total_images == dec.get_total_images(&basis_file_data[0], (uint32_t)basis_file_data.size()));

	printf("File info:\n");
	printf("  Version: %X\n", fileinfo.m_version);
	printf("  Total header size: %u\n", fileinfo.m_total_header_size);
	printf("  Total selectors: %u\n", fileinfo.m_total_selectors);
	printf("  Selector codebook size: %u\n", fileinfo.m_selector_codebook_size);
	printf("  Total endpoints: %u\n", fileinfo.m_total_endpoints);
	printf("  Endpoint codebook size: %u\n", fileinfo.m_endpoint_codebook_size);
	printf("  Tables size: %u\n", fileinfo.m_tables_size);
	printf("  Slices size: %u\n", fileinfo.m_slices_size);
	fmt_printf("  Block Dimensions: {}x{}\n", fileinfo.m_block_width, fileinfo.m_block_height);

	bool is_hdr = false;

	std::string fmt_str_temp;
	
	const char* pFmt_str = nullptr;
	switch (fileinfo.m_tex_format)
	{
	case basist::basis_tex_format::cETC1S:
	{
		pFmt_str = "ETC1S";
		break;
	}
	case basist::basis_tex_format::cUASTC_LDR_4x4:
	{
		pFmt_str = "UASTC_LDR_4x4";
		break;
	}
	case basist::basis_tex_format::cUASTC_HDR_4x4:
	{
		is_hdr = true;
		pFmt_str = "UASTC_HDR_4x4";
		break;
	}
	case basist::basis_tex_format::cASTC_HDR_6x6:
	{
		is_hdr = true;
		pFmt_str = "ASTC_HDR_6x6";
		break;
	}
	case basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE:
	{
		is_hdr = true;
		pFmt_str = "UASTC_HDR_6x6_INTERMEDIATE";
		break;
	}
	case basist::basis_tex_format::cXUASTC_LDR_4x4:
	case basist::basis_tex_format::cXUASTC_LDR_5x4:
	case basist::basis_tex_format::cXUASTC_LDR_5x5:
	case basist::basis_tex_format::cXUASTC_LDR_6x5:
	case basist::basis_tex_format::cXUASTC_LDR_6x6:
	case basist::basis_tex_format::cXUASTC_LDR_8x5:
	case basist::basis_tex_format::cXUASTC_LDR_8x6:
	case basist::basis_tex_format::cXUASTC_LDR_10x5:
	case basist::basis_tex_format::cXUASTC_LDR_10x6:
	case basist::basis_tex_format::cXUASTC_LDR_8x8:
	case basist::basis_tex_format::cXUASTC_LDR_10x8:
	case basist::basis_tex_format::cXUASTC_LDR_10x10:
	case basist::basis_tex_format::cXUASTC_LDR_12x10:
	case basist::basis_tex_format::cXUASTC_LDR_12x12:
	{
		uint32_t block_width = 0, block_height = 0;
		basist::get_basis_tex_format_block_size(fileinfo.m_tex_format, block_width, block_height);
		fmt_str_temp = fmt_string("XUASTC_LDR_{}x{}", block_width, block_height);
		pFmt_str = fmt_str_temp.c_str();
		break;
	}
	case basist::basis_tex_format::cASTC_LDR_4x4:
	case basist::basis_tex_format::cASTC_LDR_5x4:
	case basist::basis_tex_format::cASTC_LDR_5x5:
	case basist::basis_tex_format::cASTC_LDR_6x5:
	case basist::basis_tex_format::cASTC_LDR_6x6:
	case basist::basis_tex_format::cASTC_LDR_8x5:
	case basist::basis_tex_format::cASTC_LDR_8x6:
	case basist::basis_tex_format::cASTC_LDR_10x5:
	case basist::basis_tex_format::cASTC_LDR_10x6:
	case basist::basis_tex_format::cASTC_LDR_8x8:
	case basist::basis_tex_format::cASTC_LDR_10x8:
	case basist::basis_tex_format::cASTC_LDR_10x10:
	case basist::basis_tex_format::cASTC_LDR_12x10:
	case basist::basis_tex_format::cASTC_LDR_12x12:
	{
		uint32_t block_width = 0, block_height = 0;
		basist::get_basis_tex_format_block_size(fileinfo.m_tex_format, block_width, block_height);
		fmt_str_temp = fmt_string("ASTC_LDR_{}x{}", block_width, block_height);
		pFmt_str = fmt_str_temp.c_str();
		break;
	}
	case basist::basis_tex_format::cXUBC7:
	{
		pFmt_str = "XUBC7";
		break;
	}
	default:
	{
		fmt_error_printf("Invalid/unknown format!\n");
		
		assert(0);
		return false;
	}
	}

	fmt_printf("  Texture format: {}\n", pFmt_str);
		
	printf("  Texture type: %s\n", basist::basis_get_texture_type_name(fileinfo.m_tex_type));
	printf("  us per frame: %u (%f fps)\n", fileinfo.m_us_per_frame, fileinfo.m_us_per_frame ? (1.0f / ((float)fileinfo.m_us_per_frame / 1000000.0f)) : 0.0f);
	printf("  Total slices: %u\n", (uint32_t)fileinfo.m_slice_info.size());
	printf("  Total images: %i\n", fileinfo.m_total_images);
	printf("  Y Flipped: %u, Has alpha slices: %u, sRGB: %u\n", fileinfo.m_y_flipped, fileinfo.m_has_alpha_slices, fileinfo.m_srgb);
	printf("  userdata0: 0x%X userdata1: 0x%X\n", fileinfo.m_userdata0, fileinfo.m_userdata1);
	printf("  Per-image mipmap levels: ");
	for (uint32_t i = 0; i < fileinfo.m_total_images; i++)
		printf("%u ", fileinfo.m_image_mipmap_levels[i]);
	printf("\n");

	basist::key_value_vec key_values;
	if (!dec.get_key_values(&basis_file_data[0], (uint32_t)basis_file_data.size(), key_values))
	{
		error_printf("get_key_values() failed!\n");
		return false;
	}

	fmt_printf("\nTotal key value fields: {}\n", key_values.size_u32());

	if (key_values.size())\
	{
		for (uint32_t k = 0; k < key_values.size(); k++)
		{
			// Always zero terminated, always at least 1 character
			if (vec_is_ascii(key_values[k].m_key))
				fmt_printf(" {}. \"{}\" - {} bytes: ", k, (const char*)key_values[k].m_key.get_ptr(), key_values[k].m_value.size_u32());
			else
				fmt_printf(" {}. [Key not ASCII] - {} bytes: ", k, (const char*)key_values[k].m_key.get_ptr(), key_values[k].m_value.size_u32()); // shouldn't happen, but just in case - we could print as hex

			const uint8_vec& val = key_values[k].m_value;

			// val will always be empty, or it's guaranteed to be zero terminated (we always add an additional 0 at the end)
			if (val.size() >= 100)
			{
				fmt_printf("[too large to print]\n");
				continue;
			}

			if (vec_is_ascii(val))
			{
				fmt_printf("\"{}\"\n", (const char*)val.get_ptr());
			}
			else
			{
				for (uint32_t j = 0; j < val.size(); j++)
				{
					fmt_printf("0x{X} ", val[j]);

					if ((j & 15) == 15)
						fmt_printf("\n");
				} // j

				fmt_printf("\n");
			}

		} // k

		//fmt_printf("\n");
	}

	// the sRGB transfer function to use while astc unpacking (we want this to ideally match what we used during astc encoding)
	bool srgb_transfer_func_astc_unpacking = fileinfo.m_srgb; 
	
	// the sRGB transfer function to use when writing out files (we want to indicate to the caller if the data is sRGB or linear)
	bool srgb_transfer_func_astc_writing = fileinfo.m_srgb; 
	
	const bool is_etc1s = (fileinfo.m_tex_format == basist::basis_tex_format::cETC1S);
	const bool is_uastc_ldr_4x4 = (fileinfo.m_tex_format == basist::basis_tex_format::cUASTC_LDR_4x4);
	if ((is_etc1s) || (is_uastc_ldr_4x4))
	{
		// The ETC1S and UASTC LDR 4x4 transcoders supply ASTC LDR 4x4 data assuming the decoder will NOT be using the sRGB read decode profile, which is likely the most common case (in geospatial rendering scenarios).
		// Note XUASTC/UASTC LDR 4x4-12x12 supports both linear and sRGB decode profiles throughout the entire pipeline (encoding/transcoding/decoding to raw pixels).
		srgb_transfer_func_astc_unpacking = false;
		
		// This matches the behavior of our original tools. It ensures astcenc uses linear by default when reading our transcoded .KTX files.
		srgb_transfer_func_astc_writing = false;

		if (fileinfo.m_srgb)
			printf("Note: ETC1S/UASTC LDR 4x4 will always be decoded by this tool using the ASTC linear decode profile, regardless of the KTX2/.basis DFD transfer function field.\n");
	}
	
	uint32_t total_texels = 0;

	printf("\nImage info:\n");
	for (uint32_t i = 0; i < fileinfo.m_total_images; i++)
	{
		basist::basisu_image_info ii;
		if (!dec.get_image_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), ii, i))
		{
			error_printf("get_image_info() failed!\n");
			return false;
		}

		printf("Image %u: MipLevels: %u OrigDim: %ux%u, BlockDim: %ux%u, FirstSlice: %u, HasAlpha: %u\n", i, ii.m_total_levels, ii.m_orig_width, ii.m_orig_height,
			ii.m_num_blocks_x, ii.m_num_blocks_y, ii.m_first_slice_index, (uint32_t)ii.m_alpha_flag);

		total_texels += ii.m_width * ii.m_height;
	}

	printf("\nSlice info:\n");

	for (uint32_t i = 0; i < fileinfo.m_slice_info.size(); i++)
	{
		const basist::basisu_slice_info& sliceinfo = fileinfo.m_slice_info[i];
		printf("%u: OrigWidthHeight: %ux%u, NumBlocks: %ux%u, BlockSize: %ux%u, TotalBlocks: %u, Compressed size: %u, Image: %u, Level: %u, UnpackedCRC16: 0x%X, alpha: %u, iframe: %i\n",
			i,
			sliceinfo.m_orig_width, sliceinfo.m_orig_height,
			sliceinfo.m_num_blocks_x, sliceinfo.m_num_blocks_y,
			sliceinfo.m_block_width, sliceinfo.m_block_height,
			sliceinfo.m_total_blocks,
			sliceinfo.m_compressed_size,
			sliceinfo.m_image_index, sliceinfo.m_level_index,
			sliceinfo.m_unpacked_slice_crc16,
			(uint32_t)sliceinfo.m_alpha_flag,
			(uint32_t)sliceinfo.m_iframe_flag);
	}
	printf("\n");

	size_t comp_size = 0;
	void* pComp_data = tdefl_compress_mem_to_heap(&basis_file_data[0], basis_file_data.size(), &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES);
	mz_free(pComp_data);

	const float basis_bits_per_texel = basis_file_data.size() * 8.0f / total_texels;
	const float comp_bits_per_texel = comp_size * 8.0f / total_texels;

	printf("Original size: %u, bits per texel: %3.3f\nCompressed size (Deflate): %u, bits per texel: %3.3f\n", (uint32_t)basis_file_data.size(), basis_bits_per_texel, (uint32_t)comp_size, comp_bits_per_texel);

	if (opts.m_mode == cInfo)
	{
		return true;
	}

	if ((fileinfo.m_etc1s) && (fileinfo.m_selector_codebook_size == 0) && (fileinfo.m_endpoint_codebook_size == 0))
	{
		// File is ETC1S and uses global codebooks - make sure we loaded one
		if (!pGlobal_codebook_data)
		{
			error_printf("ETC1S file uses global codebooks, but none were loaded (see the -use_global_codebooks option)\n");
			return false;
		}

		if ((pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder().get_endpoints().size() != fileinfo.m_total_endpoints) ||
			(pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder().get_selectors().size() != fileinfo.m_total_selectors))
		{
			error_printf("Supplied global codebook is not compatible with this file\n");
			return false;
		}
	}

	interval_timer tm;
	tm.start();

	if (!dec.start_transcoding(&basis_file_data[0], (uint32_t)basis_file_data.size()))
	{
		error_printf("start_transcoding() failed!\n");
		return false;
	}

	const double start_transcoding_time_ms = tm.get_elapsed_ms();

	printf("start_transcoding time: %3.3f ms\n", start_transcoding_time_ms);

	basisu::vector< gpu_image_vec > gpu_images[(int)basist::transcoder_texture_format::cTFTotalTextureFormats];
	
	double total_format_transcoding_time_ms[(int)basist::transcoder_texture_format::cTFTotalTextureFormats];
	clear_obj(total_format_transcoding_time_ms);

	int first_format = 0;
	int last_format = (int)basist::transcoder_texture_format::cTFTotalTextureFormats;

	if (opts.m_unpack_format_only > -1)
	{
		first_format = opts.m_unpack_format_only;
		last_format = first_format + 1;
	}

	if ((pCSV_file) && (file_index == 0))
	{
		std::string desc;
		desc = "filename,basis_bitrate,comp_bitrate,images,levels,slices,start_transcoding_time,";
		for (int format_iter = first_format; format_iter < last_format; format_iter++)
		{
			const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

			if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format))
				continue;
			if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
				continue;

			desc += std::string(basis_get_format_name(transcoder_tex_fmt));
			if (format_iter != last_format - 1)
				desc += ",";
		}
		fprintf(pCSV_file, "%s\n", desc.c_str());
	}

	for (int format_iter = first_format; format_iter < last_format; format_iter++)
	{
		basist::transcoder_texture_format tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

		if (basist::basis_transcoder_format_is_uncompressed(tex_fmt))
			continue;

		if (!basis_is_format_supported(tex_fmt, fileinfo.m_tex_format))
			continue;

		if (tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
			continue;

		gpu_images[(int)tex_fmt].resize(fileinfo.m_total_images);

		for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			gpu_images[(int)tex_fmt][image_index].resize(fileinfo.m_image_mipmap_levels[image_index]);
	}

	uint32_t transcode_flags = get_transcode_flags_from_options(opts);

	// Now transcode the file to all supported texture formats and save mipmapped KTX files
	for (int format_iter = first_format; format_iter < last_format; format_iter++)
	{
		const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

		if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt))
			continue;
		if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format))
			continue;
		if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
			continue;

		for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
		{
			for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
			{
				basist::basisu_image_level_info level_info;

				if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
				{
					error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
					return false;
				}

				if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA))
				{
					if (!is_pow2(level_info.m_orig_width) || !is_pow2(level_info.m_orig_height))
					{
						total_pvrtc_nonpow2_warnings++;

						printf("Warning: Will not transcode image %u level %u res %ux%u to PVRTC1 (one or more dimension is not a power of 2)\n", image_index, level_index, level_info.m_width, level_info.m_height);

						// Can't transcode this image level to PVRTC because it's not a pow2 (we're going to support transcoding non-pow2 to the next "larger" pow2 soon)
						continue;
					}
				}

				basisu::texture_format tex_fmt = basis_get_basisu_texture_format(transcoder_tex_fmt);

				fmt_printf("Transcoding format: {}\n", (uint32_t)tex_fmt);

				gpu_image& gi = gpu_images[(int)transcoder_tex_fmt][image_index][level_index];
				gi.init(tex_fmt, level_info.m_orig_width, level_info.m_orig_height);

				// Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output.
				fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes());
								
				tm.start();

				if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, gi.get_ptr(), gi.get_total_blocks(), transcoder_tex_fmt, transcode_flags))
				{
					error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, format_iter);
					return false;
				}

				double total_transcode_time = tm.get_elapsed_ms();

				total_format_transcoding_time_ms[format_iter] += total_transcode_time;

				printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

			} // format_iter

		} // level_index

	} // image_info

	// Upack UASTC LDR 4x4 files seperately, to validate we can transcode slices to UASTC LDR 4x4 and unpack them to pixels.
	// This is a special path because UASTC LDR 4x4 is not yet a valid transcoder_texture_format, but a lower-level block_format.
	if (fileinfo.m_tex_format == basist::basis_tex_format::cUASTC_LDR_4x4)
	{
		for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
		{
			for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
			{
				basist::basisu_image_level_info level_info;

				if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
				{
					error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
					return false;
				}

				gpu_image gi;
				gi.init(basisu::texture_format::cUASTC4x4, level_info.m_orig_width, level_info.m_orig_height);

				// Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output.
				fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes());
								
				tm.start();

				if (!dec.transcode_slice(
					&basis_file_data[0], (uint32_t)basis_file_data.size(), 
					level_info.m_first_slice_index, gi.get_ptr(), gi.get_total_blocks(), basist::block_format::cUASTC_4x4, gi.get_bytes_per_block(), transcode_flags))
				{
					error_printf("Failed transcoding image level (%u %u) to UASTC!\n", image_index, level_index);
					return false;
				}

				double total_transcode_time = tm.get_elapsed_ms();

				printf("Transcode of image %u level %u res %ux%u format UASTC_4x4 succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, total_transcode_time);

				if ((!validate_flag) && (!opts.m_ktx_only))
				{
					image u;
					if (!gi.unpack(u, srgb_transfer_func_astc_unpacking))
					{
						error_printf("Warning: Failed unpacking GPU texture data (%u %u). \n", image_index, level_index);
						return false;
					}
					//u.crop(level_info.m_orig_width, level_info.m_orig_height);

					std::string rgb_filename;
					if (fileinfo.m_image_mipmap_levels[image_index] > 1)
						rgb_filename = base_filename + string_format("_unpacked_rgb_UASTC_4x4_%u_%04u.png", level_index, image_index);
					else
						rgb_filename = base_filename + string_format("_unpacked_rgb_UASTC_4x4_%04u.png", image_index);

					if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha))
					{
						error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
						delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
						return false;
					}
					printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

					std::string alpha_filename;
					if (fileinfo.m_image_mipmap_levels[image_index] > 1)
						alpha_filename = base_filename + string_format("_unpacked_a_UASTC_4x4_%u_%04u.png", level_index, image_index);
					else
						alpha_filename = base_filename + string_format("_unpacked_a_UASTC_4x4_%04u.png", image_index);
					if (!save_png(alpha_filename, u, cImageSaveGrayscale, 3))
					{
						error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
						delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
						return false;
					}
					printf("Wrote .PNG file \"%s\"\n", alpha_filename.c_str());

				}
			}
		}
	}

	if (!validate_flag)
	{
		// Now write KTX files and unpack them to individual PNG's/EXR's

		for (int format_iter = first_format; format_iter < last_format; format_iter++)
		{
			const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

			if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt))
				continue;
			if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format))
				continue;
			if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
				continue;

			const bool is_fmt_astc = basis_is_transcoder_texture_format_astc(transcoder_tex_fmt);

			if ((!opts.m_no_ktx) && (fileinfo.m_tex_type == basist::cBASISTexTypeCubemapArray))
			{
				// No KTX tool that we know of supports cubemap arrays, so write individual cubemap files.
				for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index += 6)
				{
					basisu::vector<gpu_image_vec> cubemap;
					for (uint32_t i = 0; i < 6; i++)
						cubemap.push_back(gpu_images[format_iter][image_index + i]);

					// KTX1
					{
						std::string ktx_filename(base_filename + string_format("_transcoded_cubemap_%s_%u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), image_index / 6));
						if (!write_compressed_texture_file(ktx_filename.c_str(), cubemap, true, is_fmt_astc ? srgb_transfer_func_astc_writing : fileinfo.m_srgb))
						{
							error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str());
							return false;
						}
						printf("Wrote .KTX file \"%s\"\n", ktx_filename.c_str());
					}

					// DDS
					if (does_dds_support_format(cubemap[0][0].get_format()))
					{
						std::string dds_filename(base_filename + string_format("_transcoded_cubemap_%s_%u.dds", basist::basis_get_format_name(transcoder_tex_fmt), image_index / 6));
						if (!write_compressed_texture_file(dds_filename.c_str(), cubemap, true, fileinfo.m_srgb))
						{
							error_printf("Failed writing DDS file \"%s\"!\n", dds_filename.c_str());
							return false;
						}
						printf("Wrote .DDS file \"%s\"\n", dds_filename.c_str());
					}
				}
			}

			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				gpu_image_vec& gi = gpu_images[format_iter][image_index];

				if (!gi.size())
					continue;

				uint32_t level;
				for (level = 0; level < gi.size(); level++)
					if (!gi[level].get_total_blocks())
						break;

				if (level < gi.size())
					continue;

				if ((!opts.m_no_ktx) && (fileinfo.m_tex_type != basist::cBASISTexTypeCubemapArray))
				{
					// KTX1
					{
						std::string ktx_filename(base_filename + string_format("_transcoded_%s_%04u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), image_index));
						if (!write_compressed_texture_file(ktx_filename.c_str(), gi, is_fmt_astc ? srgb_transfer_func_astc_writing : fileinfo.m_srgb))
						{
							error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str());
							return false;
						}
						printf("Wrote .KTX file \"%s\"\n", ktx_filename.c_str());
					}

					// DDS
					if (does_dds_support_format(gi[0].get_format()))
					{
						std::string dds_filename(base_filename + string_format("_transcoded_%s_%04u.dds", basist::basis_get_format_name(transcoder_tex_fmt), image_index));
						if (!write_compressed_texture_file(dds_filename.c_str(), gi, fileinfo.m_srgb))
						{
							error_printf("Failed writing DDS file \"%s\"!\n", dds_filename.c_str());
							return false;
						}
						printf("Wrote .DDS file \"%s\"\n", dds_filename.c_str());
					}
				}

				for (uint32_t level_index = 0; level_index < gi.size(); level_index++)
				{
					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					if (basist::basis_transcoder_format_is_hdr(transcoder_tex_fmt))
					{
						imagef u;

						if (!gi[level_index].unpack_hdr(u))
						{
							printf("Warning: Failed unpacking GPU texture data (%u %u %u). Unpacking as much as possible.\n", format_iter, image_index, level_index);
							total_unpack_warnings++;
						}

						if (!opts.m_ktx_only)
						{
							std::string rgb_filename;
							if (gi.size() > 1)
								rgb_filename = base_filename + string_format("_hdr_unpacked_rgb_%s_%u_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index);
							else
								rgb_filename = base_filename + string_format("_hdr_unpacked_rgb_%s_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), image_index);

							if (!write_exr(rgb_filename.c_str(), u, 3, 0))
							{
								error_printf("Failed writing to EXR file \"%s\"\n", rgb_filename.c_str());
								delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
								return false;
							}
							printf("Wrote .EXR file \"%s\"\n", rgb_filename.c_str());
						}
					}
					else
					{
						image u;
						if (!gi[level_index].unpack(u, srgb_transfer_func_astc_unpacking))
						{
							printf("Warning: Failed unpacking GPU texture data (%u %u %u). Unpacking as much as possible.\n", format_iter, image_index, level_index);
							total_unpack_warnings++;
						}
						//u.crop(level_info.m_orig_width, level_info.m_orig_height);

						bool write_png = true;

						if ((!opts.m_ktx_only) && (write_png))
						{
							std::string rgb_filename;
							if (gi.size() > 1)
								rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index);
							else
								rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index);
							if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
								delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());
						}

						if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFFXT1_RGB) && (opts.m_write_out))
						{
							std::string out_filename;
							if (gi.size() > 1)
								out_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index);
							else
								out_filename = base_filename + string_format("_unpacked_rgb_%s_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), image_index);
							if (!write_3dfx_out_file(out_filename.c_str(), gi[level_index]))
							{
								error_printf("Failed writing to OUT file \"%s\"\n", out_filename.c_str());
								return false;
							}
							printf("Wrote .OUT file \"%s\"\n", out_filename.c_str());
						}

						if (basis_transcoder_format_has_alpha(transcoder_tex_fmt) && (!opts.m_ktx_only) && (write_png))
						{
							std::string a_filename;
							if (gi.size() > 1)
								a_filename = base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index);
							else
								a_filename = base_filename + string_format("_unpacked_a_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index);
							if (!save_png(a_filename, u, cImageSaveGrayscale, 3))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());

							std::string rgba_filename;
							if (gi.size() > 1)
								rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index);
							else
								rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index);
							if (!save_png(rgba_filename, u))
							{
								error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str());
								return false;
							}
							printf("Wrote .PNG file \"%s\"\n", rgba_filename.c_str());
						}
					
					} // is_hdr

				} // level_index

			} // image_index

		} // format_iter

	} // if (!validate_flag)

	uint32_t max_mipmap_levels = 0;

	//if (!opts.m_etc1_only)
	if ((opts.m_unpack_format_only == -1) && (!validate_flag))
	{
		if (is_hdr)
		{
			// Now unpack to RGBA_HALF using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA_HALF;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;
					basisu::vector<basist::half_float> half_img(total_pixels * 4);

					fill_buffer_with_random_bytes(&half_img[0], half_img.size_in_bytes());

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, 
						half_img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags, level_info.m_orig_width, nullptr, level_info.m_orig_height))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						// TODO: HDR alpha support
						imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

						for (uint32_t y = 0; y < level_info.m_orig_height; y++)
							for (uint32_t x = 0; x < level_info.m_orig_width; x++)
								for (uint32_t c = 0; c < 4; c++)
									float_img(x, y)[c] = basist::half_to_float(half_img[(x + y * level_info.m_orig_width) * 4 + c]);

						std::string rgb_filename(base_filename + string_format("_hdr_unpacked_rgba_%s_%u_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
						{
							error_printf("Failed writing to EXR file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .EXR file \"%s\"\n", rgb_filename.c_str());
					}

				} // level_index
			} // image_index

			// Now unpack to RGB_HALF using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB_HALF;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;
					basisu::vector<basist::half_float> half_img(total_pixels * 3);

					fill_buffer_with_random_bytes(&half_img[0], half_img.size_in_bytes());

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index,
						half_img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags, level_info.m_orig_width, nullptr, level_info.m_orig_height))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						// TODO: HDR alpha support
						imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

						for (uint32_t y = 0; y < level_info.m_orig_height; y++)
							for (uint32_t x = 0; x < level_info.m_orig_width; x++)
								for (uint32_t c = 0; c < 3; c++)
									float_img(x, y)[c] = basist::half_to_float(half_img[(x + y * level_info.m_orig_width) * 3 + c]);

						std::string rgb_filename(base_filename + string_format("_hdr_unpacked_rgb_%s_%u_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
						{
							error_printf("Failed writing to EXR file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .EXR file \"%s\"\n", rgb_filename.c_str());
					}

				} // level_index
			} // image_index

			// Now unpack to RGB_9E5 using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB_9E5;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					const uint32_t total_pixels = level_info.m_orig_width * level_info.m_orig_height;
					basisu::vector<uint32_t> rgb9e5_img(total_pixels);

					fill_buffer_with_random_bytes(&rgb9e5_img[0], rgb9e5_img.size_in_bytes());

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index,
						rgb9e5_img.get_ptr(), total_pixels, transcoder_tex_fmt, transcode_flags, level_info.m_orig_width, nullptr, level_info.m_orig_height))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						// TODO: Write KTX or DDS
						imagef float_img(level_info.m_orig_width, level_info.m_orig_height);

						for (uint32_t y = 0; y < level_info.m_orig_height; y++)
							for (uint32_t x = 0; x < level_info.m_orig_width; x++)
								astc_helpers::unpack_rgb9e5(rgb9e5_img[x + y * level_info.m_orig_width], float_img(x, y)[0], float_img(x, y)[1], float_img(x, y)[2]);

						std::string rgb_filename(base_filename + string_format("_hdr_unpacked_rgb_%s_%u_%04u.exr", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!write_exr(rgb_filename.c_str(), float_img, 3, 0))
						{
							error_printf("Failed writing to EXR file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .EXR file \"%s\"\n", rgb_filename.c_str());
					}

				} // level_index
			} // image_index
		}
		else
		{
			// Now unpack to RGBA using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA32;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					image img(level_info.m_orig_width, level_info.m_orig_height);

					fill_buffer_with_random_bytes(&img(0, 0), img.get_total_pixels() * sizeof(uint32_t));

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &img(0, 0).r, img.get_total_pixels(), transcoder_tex_fmt, transcode_flags, img.get_pitch(), nullptr, img.get_height()))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						std::string rgba_filename(base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(rgba_filename, img))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", rgba_filename.c_str());

						std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

						std::string a_filename(base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(a_filename, img, cImageSaveGrayscale, 3))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());
					}

				} // level_index
			} // image_index

			// Now unpack to RGB565 using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB565;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					basisu::vector<uint16_t> packed_img(level_info.m_orig_width * level_info.m_orig_height);

					fill_buffer_with_random_bytes(&packed_img[0], packed_img.size() * sizeof(uint16_t));

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &packed_img[0], (uint32_t)packed_img.size(), transcoder_tex_fmt, transcode_flags, level_info.m_orig_width, nullptr, level_info.m_orig_height))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					image img(level_info.m_orig_width, level_info.m_orig_height);
					for (uint32_t y = 0; y < level_info.m_orig_height; y++)
					{
						for (uint32_t x = 0; x < level_info.m_orig_width; x++)
						{
							const uint16_t p = packed_img[x + y * level_info.m_orig_width];
							uint32_t r = p >> 11, g = (p >> 5) & 63, b = p & 31;
							r = (r << 3) | (r >> 2);
							g = (g << 2) | (g >> 4);
							b = (b << 3) | (b >> 2);
							img(x, y).set(r, g, b, 255);
						}
					}

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());
					}

				} // level_index
			} // image_index

			// Now unpack to RGBA4444 using the transcoder itself to do the unpacking to raster images
			for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++)
			{
				for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++)
				{
					max_mipmap_levels = basisu::maximum(max_mipmap_levels, fileinfo.m_image_mipmap_levels[image_index]);

					const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA4444;

					basist::basisu_image_level_info level_info;

					if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index))
					{
						error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index);
						return false;
					}

					basisu::vector<uint16_t> packed_img(level_info.m_orig_width * level_info.m_orig_height);

					fill_buffer_with_random_bytes(&packed_img[0], packed_img.size() * sizeof(uint16_t));

					tm.start();

					if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &packed_img[0], (uint32_t)packed_img.size(), transcoder_tex_fmt, transcode_flags, level_info.m_orig_width, nullptr, level_info.m_orig_height))
					{
						error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt);
						return false;
					}

					double total_transcode_time = tm.get_elapsed_ms();

					total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time;

					image img(level_info.m_orig_width, level_info.m_orig_height);
					for (uint32_t y = 0; y < level_info.m_orig_height; y++)
					{
						for (uint32_t x = 0; x < level_info.m_orig_width; x++)
						{
							const uint16_t p = packed_img[x + y * level_info.m_orig_width];
							uint32_t r = p >> 12, g = (p >> 8) & 15, b = (p >> 4) & 15, a = p & 15;
							r = (r << 4) | r;
							g = (g << 4) | g;
							b = (b << 4) | b;
							a = (a << 4) | a;
							img(x, y).set(r, g, b, a);
						}
					}

					printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time);

					if ((!validate_flag) && (!opts.m_ktx_only))
					{
						std::string rgba_filename(base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(rgba_filename, img))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", rgba_filename.c_str());

						std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", rgb_filename.c_str());

						std::string a_filename(base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index));
						if (!save_png(a_filename, img, cImageSaveGrayscale, 3))
						{
							error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str());
							return false;
						}
						printf("Wrote .PNG file \"%s\"\n", a_filename.c_str());
					}

				} // level_index
			} // image_index
		
		} // is_hdr

	} // if ((opts.m_unpack_format_only == -1) && (!validate_flag))

	if (pCSV_file)
	{
		fprintf(pCSV_file, "%s, %3.3f, %3.3f, %u, %u, %u, %3.3f, ",
			base_filename.c_str(),
			basis_bits_per_texel,
			comp_bits_per_texel,
			fileinfo.m_total_images,
			max_mipmap_levels,
			(uint32_t)fileinfo.m_slice_info.size(),
			start_transcoding_time_ms);

		for (int format_iter = first_format; format_iter < last_format; format_iter++)
		{
			const basist::transcoder_texture_format transcoder_tex_fmt = static_cast<basist::transcoder_texture_format>(format_iter);

			if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format))
				continue;
			if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT)
				continue;

			fprintf(pCSV_file, "%3.3f", total_format_transcoding_time_ms[format_iter]);
			if (format_iter != (last_format - 1))
				fprintf(pCSV_file, ",");
		}
		fprintf(pCSV_file, "\n");
	}

	return true;
}

// Unpacks a Microsoft DDS file (DX9/DX10) using basist::dds_transcoder, bringing it up to the .ktx2/.basis bar.
// The DDS transcoder is LDR-only, so it transcodes the source to each DDS-supported target format and:
//  (1) for the 12 block-compressed targets (BC1/3/4/5/7, ETC1/2, EAC R11/RG11, ASTC 4x4, PVRTC1) -- writes the
//      GPU container files (per-image whole-mip-chain, plus cubemap and DDS texture-array shapes; .KTX for all,
//      .DDS for BC1-7 only), AND round-trips each transcoded block image back to RGBA as one _unpacked_rgba_ PNG;
//  (2) for the 3 uncompressed targets (RGBA32, RGB565, RGBA4444) -- writes one _unpacked_rgba_ PNG each (the
//      RGBA32 decode is the source ground truth).
// -validate runs the full pipeline (transcode AND round-trip unpack, so a broken unpack path is caught too) but
// writes nothing. Honors -output_path, -no_ktx (skip GPU container files), -ktx_only (skip PNGs), and
// -unpack_format_only N (restrict to the single transcoder format whose enum index == N). BC6H/HDR DDS is future work (post v2.5).
static bool unpack_and_validate_dds_file(
	const std::string& base_filename,
	uint8_vec& dds_file_data,
	command_line_params& opts,
	uint32_t& total_unpack_warnings,
	uint32_t& total_pvrtc_nonpow2_warnings)
{
	if (dds_file_data.size() > UINT32_MAX)
	{
		error_printf("DDS file too large!\n");
		return false;
	}

	basist::dds_transcoder dec;

	if (!dec.init(dds_file_data.data(), dds_file_data.size_u32()))
	{
		error_printf("dds_transcoder::init() failed! File either uses an unsupported feature, is invalid, was corrupted, or this is a bug.\n");
		return false;
	}

	if (!dec.start_transcoding())
	{
		error_printf("dds_transcoder::start_transcoding() failed!\n");
		return false;
	}

	const uint32_t levels = dec.get_levels();
	const uint32_t faces = dec.get_faces();
	const uint32_t num_layers = dec.get_layers();			// 0 == not an array (ktx2 convention)
	const uint32_t eff_layers = num_layers ? num_layers : 1;
	const basist::transcoder_texture_format src_fmt = dec.get_format();
	const char* pFmt_name = basist::basis_get_format_name(src_fmt);

	printf("Resolution: %ux%u\n", dec.get_width(), dec.get_height());
	printf("Mipmap Levels: %u\n", levels);
	printf("Texture Array Size (layers): %u\n", num_layers);
	printf("Total Faces: %u (%s)\n", faces, (faces == 6) ? "CUBEMAP" : "2D");
	printf("DDS source format: %s\n", basisu::get_dds_format_string(dec.get_dds_format()));
	printf("Contained format: %s\n", pFmt_name);
	// For uncompressed sources the "Contained format" is the CLOSEST-matching transcoder format, not necessarily
	// the .DDS's physical pixel layout (e.g. an A8R8G8B8/X8R8G8B8 or B5G5R5A1 file reports RGBA32 / RGBA4444).
	// The exact physical layout is shown above on the "DDS source format" line.
	if (dec.get_source_kind() == basist::dds_transcoder::source_kind::cUncompressed)
		printf("  (note: 'Contained format' is the closest matching transcoder format; use -tinydds_info for the full DDS header)\n");
	printf("Has Alpha: %u, sRGB: %u\n", dec.get_has_alpha(), dec.is_srgb() ? 1 : 0);

	// -info reports metadata only. -unpack writes files; -validate just decodes every image to exercise the path.
	if (opts.m_mode == cInfo)
		return true;
	const bool write_files = (opts.m_mode == cUnpack);
	const bool validating = (opts.m_mode == cValidate);
	const bool write_gpu_files = write_files && !opts.m_no_ktx;	// _transcoded_ .ktx/.dds container files
	const bool write_png = write_files && !opts.m_ktx_only;		// decoded _unpacked_rgba_ PNGs
	const bool srgb = dec.is_srgb();
	const bool status_output = opts.m_comp_params.m_status_output;	// -no_status_output / -quiet silences progress

	// -validate exercises every codec like -unpack but writes nothing. We go further than the .ktx2/.basis
	// validate (which only verifies the transcode-to-GPU step): we also round-trip the block data back to pixels
	// below, so a broken unpack path is caught too.
	bool any_format_matched = false;	// for the -unpack_format_only "nothing produced" warning

	const bool is_cubemap = (faces == 6);
	const bool is_array = (num_layers != 0);						// ktx2 convention: 0 == not an array
	const uint32_t MAX_DDS_TEXARRAY_SIZE = 2048;				// Direct3D maximum array size

	// NOTE: the DDS transcoder is currently LDR-only (sources: BC1-5 / BC7 / uncompressed). BC6H/HDR DDS support
	// is planned for a future release (post v2.5); when it lands, the HDR target formats (BC6H, ASTC HDR,
	// RGBA_HALF, RGB_9E5) and their EXR outputs would be added here, mirroring unpack_and_validate_ktx2_file().

	// Block-compressed transcoder targets the DDS transcoder's get_target_info() accepts. Each goes to .ktx;
	// BC1-7 additionally goes to .dds (does_dds_support_format). Listing them explicitly (rather than iterating
	// the whole enum like the .ktx2/.basis unpackers) keeps us to exactly what the DDS transcoder can produce.
	static const basist::transcoder_texture_format s_compressed_formats[] =
	{
		basist::transcoder_texture_format::cTFBC1_RGB, basist::transcoder_texture_format::cTFBC3_RGBA,
		basist::transcoder_texture_format::cTFBC4_R, basist::transcoder_texture_format::cTFBC5_RG,
		basist::transcoder_texture_format::cTFBC7_RGBA, basist::transcoder_texture_format::cTFETC1_RGB,
		basist::transcoder_texture_format::cTFETC2_RGBA, basist::transcoder_texture_format::cTFETC2_EAC_R11,
		basist::transcoder_texture_format::cTFETC2_EAC_RG11, basist::transcoder_texture_format::cTFASTC_4x4_RGBA,
		basist::transcoder_texture_format::cTFPVRTC1_4_RGB, basist::transcoder_texture_format::cTFPVRTC1_4_RGBA
	};

	// Uncompressed LDR transcoder targets the DDS transcoder accepts. These have no GPU-container writer; we
	// transcode them to pixels and write a single _unpacked_rgba_ PNG each (RGBA32 also serves as ground truth).
	static const basist::transcoder_texture_format s_uncompressed_formats[] =
	{
		basist::transcoder_texture_format::cTFRGBA32,
		basist::transcoder_texture_format::cTFRGB565,
		basist::transcoder_texture_format::cTFRGBA4444
	};

	// -unpack_format_only N restricts processing to the single transcoder format whose enum index == N
	// (consistent with the .ktx2/.basis unpackers). Formats not in our supported tables simply produce nothing.
	const int only_fmt = opts.m_unpack_format_only;

	// PVRTC1 needs power-of-2 dims; warn up front so the user understands the per-image skips below.
	if (!is_pow2(dec.get_width()) || !is_pow2(dec.get_height()))
		printf("Warning: dimensions %ux%u are not a power of 2 -- PVRTC1 output will be skipped (it requires power-of-2 dimensions).\n", dec.get_width(), dec.get_height());

	// ============================ Block-compressed targets ============================
	// For each format: transcode every (layer, face) into a full mip chain, round-trip each level back to RGBA
	// (one _unpacked_rgba_ PNG), and write the GPU container files in per-image / cubemap / texture-array shapes.
	for (basist::transcoder_texture_format tex_fmt : s_compressed_formats)
	{
		if ((only_fmt > -1) && ((int)tex_fmt != only_fmt))
			continue;
		any_format_matched = true;

		const basisu::texture_format gpu_fmt = basis_get_basisu_texture_format(tex_fmt);
		const char* pTarget_fmt_name = basist::basis_get_format_name(tex_fmt);
		const bool dds_ok = does_dds_support_format(gpu_fmt);
		const bool ktx_ok = does_ktx_support_format(gpu_fmt);
		if (!dds_ok && !ktx_ok)
			continue;

		// Transcoded mip chains, indexed [layer * faces + face]. Built for both -unpack and -validate so
		// -validate exercises every codec; only -unpack actually writes anything below.
		basisu::vector<gpu_image_vec> chains;
		chains.resize(eff_layers * faces);

		bool format_complete = true;	// false if any image dropped a level (PVRTC1 on non-power-of-2 dims)

		for (uint32_t layer = 0; layer < eff_layers; layer++)
		{
			for (uint32_t face = 0; face < faces; face++)
			{
				gpu_image_vec& chain = chains[layer * faces + face];

				for (uint32_t level = 0; level < levels; level++)
				{
					basist::ktx2_image_level_info level_info;
					if (!dec.get_image_level_info(level_info, level, layer, face))
					{
						error_printf("dds_transcoder::get_image_level_info() failed (layer %u, face %u, level %u)\n", layer, face, level);
						return false;
					}

					gpu_image gi(gpu_fmt, level_info.m_orig_width, level_info.m_orig_height);
					// Pre-fill with pseudo-random bytes so a transcoder that fails to write part of the output
					// is detectable (matches the .ktx2 unpacker's under-write detection).
					fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes());

					if (status_output)
						printf("Transcoding to %s: layer %u, face %u, level %u, res %ux%u\n", pTarget_fmt_name, layer, face, level, level_info.m_orig_width, level_info.m_orig_height);

					interval_timer tm;
					tm.start();
					const bool transcode_ok = dec.transcode_image_level(level, layer, face, gi.get_ptr(), gi.get_total_blocks(), tex_fmt);
					const double transcode_ms = tm.get_elapsed_ms();

					if (!transcode_ok)
					{
						// PVRTC1 on non-power-of-2 dims is an expected skip (warned up front), NOT a failure. Any
						// other transcode failure is a real error -> fail (so -validate catches a broken codec path).
						if ((tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA))
						{
							total_pvrtc_nonpow2_warnings++;
							format_complete = false;
							break;	// can't build a partial mip chain -- drop this whole image
						}
						error_printf("Failed transcoding image to %s (layer %u, face %u, level %u)\n", pTarget_fmt_name, layer, face, level);
						return false;
					}

					if (status_output)
						printf("Transcode to %s succeeded in %3.3f ms\n", pTarget_fmt_name, transcode_ms);

					chain.push_back(gi);
				}
			}
		}

		// (a) Round-trip each transcoded block image back to RGBA. We always do the unpack when -validate (to
		// exercise the unpack path), and write one _unpacked_rgba_ PNG only when actually unpacking to files.
		if (write_png || validating)
		{
			for (uint32_t layer = 0; layer < eff_layers; layer++)
			{
				for (uint32_t face = 0; face < faces; face++)
				{
					const gpu_image_vec& chain = chains[layer * faces + face];
					for (uint32_t level = 0; level < chain.size(); level++)
					{
						image img;
						if (!chain[level].unpack(img, srgb))
						{
							// Under -unpack, mirror the .ktx2 unpacker: a failed round-trip unpack is a warning, and
							// we unpack as much as possible. Under -validate it's a hard failure (catching it is the point).
							error_printf("Failed unpacking %s block data to pixels (layer %u, face %u, level %u)\n", pTarget_fmt_name, layer, face, level);
							if (validating)
								return false;
							total_unpack_warnings++;
							continue;
						}

						if (!write_png)
							continue;	// -validate: exercised the unpack above, but don't write a file

						std::string fn = (levels > 1)
							? base_filename + string_format("_unpacked_rgba_%s_level_%u_face_%u_layer_%04u.png", pTarget_fmt_name, level, face, layer)
							: base_filename + string_format("_unpacked_rgba_%s_face_%u_layer_%04u.png", pTarget_fmt_name, face, layer);
						if (!save_png(fn, img)) { error_printf("Failed writing to PNG file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .PNG file \"%s\"\n", fn.c_str());
					}
				}
			}
		}

		// (b) GPU container files: cubemap (per layer), texture array (one DDS), and per-image whole-mip-chain.
		// Skipped entirely if any image was incomplete (format_complete == false), since the chains don't line up.
		if (write_gpu_files && format_complete)
		{
			// Cubemap: one file per layer holding all 6 faces (KTX for any format, DDS for BC1-7).
			if (is_cubemap)
			{
				for (uint32_t layer = 0; layer < eff_layers; layer++)
				{
					basisu::vector<gpu_image_vec> cubemap;
					for (uint32_t face = 0; face < 6; face++)
						cubemap.push_back(chains[layer * faces + face]);

					if (ktx_ok)
					{
						std::string fn = base_filename + string_format("_transcoded_cubemap_%s_layer_%u.ktx", pTarget_fmt_name, layer);
						if (!write_compressed_texture_file(fn.c_str(), cubemap, true, srgb)) { error_printf("Failed writing KTX file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .KTX cubemap file \"%s\"\n", fn.c_str());
					}
					if (dds_ok)
					{
						std::string fn = base_filename + string_format("_transcoded_cubemap_%s_layer_%u.dds", pTarget_fmt_name, layer);
						if (!write_compressed_texture_file(fn.c_str(), cubemap, true, srgb)) { error_printf("Failed writing DDS file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .DDS cubemap file \"%s\"\n", fn.c_str());
					}
				}
			}

			// Texture array: a single DDS holding every layer x face (DDS only, matching the .ktx2 unpacker).
			if (is_array && dds_ok && (eff_layers <= MAX_DDS_TEXARRAY_SIZE))
			{
				basisu::vector<gpu_image_vec> tex_array;
				for (uint32_t layer = 0; layer < eff_layers; layer++)
					for (uint32_t face = 0; face < faces; face++)
						tex_array.push_back(chains[layer * faces + face]);

				std::string fn = base_filename + string_format("_transcoded_array_%s.dds", pTarget_fmt_name);
				if (!write_compressed_texture_file(fn.c_str(), tex_array, is_cubemap, srgb)) { error_printf("Failed writing DDS file \"%s\"\n", fn.c_str()); return false; }
				printf("Wrote .DDS texture array file \"%s\"\n", fn.c_str());
			}

			// Per-image whole-mip-chain files (one per layer/face).
			for (uint32_t layer = 0; layer < eff_layers; layer++)
			{
				for (uint32_t face = 0; face < faces; face++)
				{
					const gpu_image_vec& chain = chains[layer * faces + face];
					if (!chain.size())
						continue;

					if (ktx_ok)
					{
						std::string fn = is_cubemap
							? base_filename + string_format("_transcoded_%s_face_%u_layer_%04u.ktx", pTarget_fmt_name, face, layer)
							: base_filename + string_format("_transcoded_%s_layer_%04u.ktx", pTarget_fmt_name, layer);
						if (!write_compressed_texture_file(fn.c_str(), chain, srgb)) { error_printf("Failed writing KTX file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .KTX file \"%s\"\n", fn.c_str());
					}
					if (dds_ok)
					{
						std::string fn = is_cubemap
							? base_filename + string_format("_transcoded_%s_face_%u_layer_%04u.dds", pTarget_fmt_name, face, layer)
							: base_filename + string_format("_transcoded_%s_layer_%04u.dds", pTarget_fmt_name, layer);
						if (!write_compressed_texture_file(fn.c_str(), chain, srgb)) { error_printf("Failed writing DDS file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .DDS file \"%s\"\n", fn.c_str());
					}
				}
			}
		}
	}

	// ============================ Uncompressed LDR targets ============================
	// Transcode the source to each uncompressed pixel format and write one _unpacked_rgba_ PNG per image. This
	// exercises those transcode paths (for -validate) and the RGBA32 decode also serves as the corruption canary.
	for (basist::transcoder_texture_format tex_fmt : s_uncompressed_formats)
	{
		if ((only_fmt > -1) && ((int)tex_fmt != only_fmt))
			continue;
		any_format_matched = true;

		const char* pTarget_fmt_name = basist::basis_get_format_name(tex_fmt);

		for (uint32_t layer = 0; layer < eff_layers; layer++)
		{
			for (uint32_t face = 0; face < faces; face++)
			{
				for (uint32_t level = 0; level < levels; level++)
				{
					basist::ktx2_image_level_info level_info;
					if (!dec.get_image_level_info(level_info, level, layer, face))
					{
						error_printf("dds_transcoder::get_image_level_info() failed (layer %u, face %u, level %u)\n", layer, face, level);
						return false;
					}

					const uint32_t mw = level_info.m_orig_width, mh = level_info.m_orig_height;
					image img(mw, mh);

					if (status_output)
						printf("Transcoding to %s: layer %u, face %u, level %u, res %ux%u\n", pTarget_fmt_name, layer, face, level, mw, mh);

					interval_timer tm;
					double transcode_ms = 0.0;

					if (tex_fmt == basist::transcoder_texture_format::cTFRGBA32)
					{
						// Direct RGBA decode of the source -- the ground-truth pixels (and a corruption canary when
						// -unpack_format_only selects RGBA32; otherwise the compressed loop above fails first).
						// Pre-fill with random bytes to detect a partial (under-)write, like the .ktx2 unpacker.
						fill_buffer_with_random_bytes(img.get_ptr(), (size_t)img.get_total_pixels() * sizeof(color_rgba));
						tm.start();
						const bool transcode_ok = dec.transcode_image_level(level, layer, face, img.get_ptr(), img.get_total_pixels(), tex_fmt, 0, mw, mh);
						transcode_ms = tm.get_elapsed_ms();
						if (!transcode_ok)
						{
							error_printf("Failed decoding image to RGBA32 (layer %u, face %u, level %u) -- invalid or corrupt DDS data\n", layer, face, level);
							return false;
						}
					}
					else
					{
						// 16-bpp packed formats: transcode into a uint16 buffer, then expand to 8-bit RGBA for the PNG.
						basisu::vector<uint16_t> packed(mw * mh);
						// Pre-fill with random bytes to detect a partial (under-)write, like the .ktx2 unpacker.
						fill_buffer_with_random_bytes(packed.data(), packed.size() * sizeof(uint16_t));
						tm.start();
						const bool transcode_ok = dec.transcode_image_level(level, layer, face, packed.data(), (uint32_t)packed.size(), tex_fmt, 0, mw, mh);
						transcode_ms = tm.get_elapsed_ms();
						if (!transcode_ok)
						{
							error_printf("Failed transcoding image to %s (layer %u, face %u, level %u)\n", pTarget_fmt_name, layer, face, level);
							return false;
						}

						for (uint32_t y = 0; y < mh; y++)
						{
							for (uint32_t x = 0; x < mw; x++)
							{
								const uint16_t p = packed[x + y * mw];
								if (tex_fmt == basist::transcoder_texture_format::cTFRGB565)
								{
									uint32_t r = p >> 11, g = (p >> 5) & 63, b = p & 31;
									r = (r << 3) | (r >> 2);
									g = (g << 2) | (g >> 4);
									b = (b << 3) | (b >> 2);
									img(x, y).set(r, g, b, 255);
								}
								else // cTFRGBA4444
								{
									uint32_t r = p >> 12, g = (p >> 8) & 15, b = (p >> 4) & 15, a = p & 15;
									img(x, y).set((r << 4) | r, (g << 4) | g, (b << 4) | b, (a << 4) | a);
								}
							}
						}
					}

					if (status_output)
						printf("Transcode to %s succeeded in %3.3f ms\n", pTarget_fmt_name, transcode_ms);

					if (write_png)
					{
						std::string fn = (levels > 1)
							? base_filename + string_format("_unpacked_rgba_%s_level_%u_face_%u_layer_%04u.png", pTarget_fmt_name, level, face, layer)
							: base_filename + string_format("_unpacked_rgba_%s_face_%u_layer_%04u.png", pTarget_fmt_name, face, layer);
						if (!save_png(fn, img)) { error_printf("Failed writing to PNG file \"%s\"\n", fn.c_str()); return false; }
						printf("Wrote .PNG file \"%s\"\n", fn.c_str());
					}
				}
			}
		}
	}

	// -unpack_format_only asked for a format that isn't a DDS-transcodable target -- say so rather than
	// silently succeeding with no output.
	if ((only_fmt > -1) && !any_format_matched)
		printf("Warning: -unpack_format_only %d is not a DDS-transcodable format; no files were produced.\n", only_fmt);

	return true;
}

// Prints basic header info about a PNG file (used by -info). Uses pv_png::get_png_info (no full decode).
static bool print_png_info(const char* pInput_filename, const uint8_vec& file_data)
{
	pv_png::png_info info;
	if (!pv_png::get_png_info(file_data.data(), file_data.size(), info))
	{
		error_printf("Failed parsing PNG file \"%s\"\n", pInput_filename);
		return false;
	}

	const char* pColor_type = "?";
	switch (info.m_color_type)
	{
	case pv_png::PNG_COLOR_TYPE_GREYSCALE:			pColor_type = "Grayscale"; break;
	case pv_png::PNG_COLOR_TYPE_TRUECOLOR:			pColor_type = "Truecolor (RGB)"; break;
	case pv_png::PNG_COLOR_TYPE_PALETTIZED:			pColor_type = "Palettized"; break;
	case pv_png::PNG_COLOR_TYPE_GREYSCALE_ALPHA:	pColor_type = "Grayscale+Alpha"; break;
	case pv_png::PNG_COLOR_TYPE_TRUECOLOR_ALPHA:	pColor_type = "Truecolor+Alpha (RGBA)"; break;
	default: break;
	}

	printf("Dimensions: %ux%u\n", info.m_width, info.m_height);
	printf("Channels (incl. transparency): %u\n", info.m_num_chans);
	printf("Bit depth: %u\n", info.m_bit_depth);
	printf("Color type: %u (%s)\n", info.m_color_type, pColor_type);
	printf("Colorkey transparency (tRNS): %u\n", info.m_has_trns);
	if (info.m_has_gamma)
		printf("Gamma (gAMA): %f\n", info.m_gamma_value / 100000.0f);

	return true;
}

static bool unpack_and_validate_mode(command_line_params &opts)
{
	interval_timer tm;
	tm.start();

	//const bool validate_flag = (opts.m_mode == cValidate);
		
	basis_data* pGlobal_codebook_data = nullptr;
	if (opts.m_etc1s_use_global_codebooks_file.size())
	{
		pGlobal_codebook_data = load_basis_file(opts.m_etc1s_use_global_codebooks_file.c_str(), true);
		if (!pGlobal_codebook_data)
		{
			error_printf("Failed loading global codebook data from file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str());
			return false;
		}
		printf("Loaded global codebooks from file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str());
	}

	if (!opts.m_input_filenames.size())
	{
		error_printf("No input files to process!\n");
		delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
		return false;
	}

	FILE* pCSV_file = nullptr;
	if ((opts.m_csv_file.size()) && (opts.m_mode == cValidate))
	{
		pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "w");
		if (!pCSV_file)
		{
			error_printf("Failed opening CVS file \"%s\"\n", opts.m_csv_file.c_str());
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}
		//fprintf(pCSV_file, "Filename, Size, Slices, Width, Height, HasAlpha, BitsPerTexel, Slice0RGBAvgPSNR, Slice0RGBAAvgPSNR, Slice0Luma709PSNR, Slice0BestETC1SLuma709PSNR, Q, CL, Time, RGBAvgPSNRMin, RGBAvgPSNRAvg, AAvgPSNRMin, AAvgPSNRAvg, Luma709PSNRMin, Luma709PSNRAvg\n");
	}

	uint32_t total_unpack_warnings = 0;
	uint32_t total_pvrtc_nonpow2_warnings = 0;

	for (uint32_t file_index = 0; file_index < opts.m_input_filenames.size(); file_index++)
	{
		const char* pInput_filename = opts.m_input_filenames[file_index].c_str();

		std::string base_filename;
		string_split_path(pInput_filename, nullptr, nullptr, &base_filename, nullptr);

		// Honor -output_path when unpacking: both the .basis and .KTX2 unpackers
		// build all their output filenames by prefixing base_filename, so prefixing
		// the output directory here redirects every unpacked file.
		if (opts.m_output_path.size())
			string_combine_path(base_filename, opts.m_output_path.c_str(), base_filename.c_str());

		uint8_vec file_data;
		if (!basisu::read_file_to_vec(pInput_filename, file_data))
		{
			error_printf("Failed reading file \"%s\"\n", pInput_filename);
			if (pCSV_file) fclose(pCSV_file);
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}

		if (!file_data.size())
		{
			error_printf("File is empty!\n");
			if (pCSV_file) fclose(pCSV_file);
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}

		if (file_data.size() > UINT32_MAX)
		{
			error_printf("File is too large!\n");
			if (pCSV_file) fclose(pCSV_file);
			delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr;
			return false;
		}
		
		bool is_ktx2 = false;
		if (file_data.size() >= sizeof(basist::g_ktx2_file_identifier))
			is_ktx2 = (memcmp(file_data.data(), basist::g_ktx2_file_identifier, sizeof(basist::g_ktx2_file_identifier)) == 0);

		// Microsoft DDS magic ("DDS ", 0x20534444 little-endian).
		bool is_dds = false;
		if (file_data.size() >= 4)
			is_dds = (memcmp(file_data.data(), "DDS ", 4) == 0);

		// KTX1 (.ktx) 12-byte identifier. KTX1 holds already-compressed GPU data we can't transcode here,
		// so we just print its header info (via print_ktx_info), regardless of mode.
		static const uint8_t s_ktx1_identifier[12] = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A };
		const bool is_ktx1 = (file_data.size() >= 12) && (memcmp(file_data.data(), s_ktx1_identifier, 12) == 0);

		// .basis container 2-byte signature ("sB", i.e. cBASISSigValue stored little-endian).
		bool is_basis = false;
		if (file_data.size() >= 2)
			is_basis = ((file_data[0] | (file_data[1] << 8)) == basist::basis_file_header::cBASISSigValue);

		// PNG 8-byte signature.
		static const uint8_t s_png_identifier[8] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
		const bool is_png = (file_data.size() >= 8) && (memcmp(file_data.data(), s_png_identifier, 8) == 0);

		// Detect by magic, not extension, so each file in a mixed input list routes correctly. The fallback
		// (else) path below still attempts a .basis parse for an unrecognized file, which fails with a clear error.
		const char* pFormat = is_ktx2 ? "KTX2" : (is_ktx1 ? "KTX1" : (is_dds ? "DDS" : (is_basis ? ".basis" : (is_png ? "PNG" : "unknown"))));
		printf("\nInput file \"%s\", Format: %s\n", pInput_filename, pFormat);

		bool status;
		if (is_ktx2)
		{
			status = unpack_and_validate_ktx2_file(
				file_index,
				base_filename,
				file_data,
				opts,
				pCSV_file,
				pGlobal_codebook_data,
				total_unpack_warnings,
				total_pvrtc_nonpow2_warnings);
		}
		else if (is_dds)
		{
			status = unpack_and_validate_dds_file(
				base_filename,
				file_data,
				opts,
				total_unpack_warnings,
				total_pvrtc_nonpow2_warnings);
		}
		else if (is_ktx1)
		{
			// KTX1 holds already-compressed GPU data this tool can't transcode. -info dumps the header
			// (same as -ktx_info); -unpack/-validate are unsupported and fail with a clear error rather
			// than a misleading "Success".
			if (opts.m_mode == cInfo)
			{
				status = print_ktx_info(pInput_filename);
			}
			else
			{
				error_printf("KTX1 (.ktx) files can't be unpacked or validated yet -- use -info (or -ktx_info) for header info\n");
				status = false;
			}
		}
		else if (is_png)
		{
			// PNG is a source image, not a GPU texture container: -info dumps its header; unpack/validate don't apply.
			if (opts.m_mode == cInfo)
			{
				status = print_png_info(pInput_filename, file_data);
			}
			else
			{
				error_printf("PNG files can't be unpacked or validated (they're source images, not GPU textures) -- use -info for header info\n");
				status = false;
			}
		}
		else
		{
			status = unpack_and_validate_basis_file(
				file_index,
				base_filename,
				file_data,
				opts,
				pCSV_file,
				pGlobal_codebook_data,
				total_unpack_warnings,
				total_pvrtc_nonpow2_warnings);
		}

		if (!status)
		{
			if (pCSV_file) 
				fclose(pCSV_file);

			delete pGlobal_codebook_data; 
			pGlobal_codebook_data = nullptr;

			return false;
		}

	} // file_index

	if (total_pvrtc_nonpow2_warnings)
		printf("Warning: %u images could not be transcoded to PVRTC1 because one or both dimensions were not a power of 2\n", total_pvrtc_nonpow2_warnings);

	if (total_unpack_warnings)
		printf("ATTENTION: %u total images had invalid GPU texture data!\n", total_unpack_warnings);
	else
		printf("Success\n");

	debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs());

	if (pCSV_file)
	{
		fclose(pCSV_file);
		pCSV_file = nullptr;
	}
	delete pGlobal_codebook_data; 
	pGlobal_codebook_data = nullptr;

	return true;
}

static bool hdr_compare_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 2)
	{
		error_printf("Must specify two PNG filenames using -file\n");
		return false;
	}

	imagef a, b;

	if (!load_image_hdr(opts.m_input_filenames[0].c_str(), a))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height());

	if (!load_image_hdr(opts.m_input_filenames[1].c_str(), b))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height());

	if ((a.get_width() != b.get_width()) || (a.get_height() != b.get_height()))
	{
		printf("Images don't have the same dimensions - cropping input images to smallest common dimensions\n");

		uint32_t w = minimum(a.get_width(), b.get_width());
		uint32_t h = minimum(a.get_height(), b.get_height());

		a.crop(w, h);
		b.crop(w, h);
	}

	printf("Comparison image res: %ux%u\n", a.get_width(), a.get_height());

	image_metrics im;
		
	im.calc_half(a, b, 0, 1, true);
	im.print("R      ");

	im.calc_half(a, b, 1, 1, true);
	im.print("G      ");

	im.calc_half(a, b, 2, 1, true);
	im.print("B      ");

	im.calc_half(a, b, 0, 3, true);
	im.print("RGB    ");

	return true;
}

// Reference-free image diagnostics: per-channel RGBA statistics, plus optional single-pixel / 4x4-block dumps.
// Intended to make image problems (e.g. a dropped/constant channel, an all-opaque or all-zero alpha, an
// unexpected channel swizzle) obvious WITHOUT needing a second image to diff against. LDR/8-bit inputs only
// for now (PNG/TGA/QOI/etc); HDR (.exr/.hdr) support can be added later.
static bool image_stats_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("Must specify at least one image filename using -file\n");
		return false;
	}

	const bool do_stats = opts.m_dump_image_stats;
	const bool do_dump_pixel = (opts.m_dump_pixel_x >= 0) && (opts.m_dump_pixel_y >= 0);
	const bool do_dump_block = (opts.m_dump_block_x >= 0) && (opts.m_dump_block_y >= 0);

	bool any_failed = false;

	for (uint32_t file_index = 0; file_index < opts.m_input_filenames.size(); file_index++)
	{
		const char* pFilename = opts.m_input_filenames[file_index].c_str();

		std::string ext(string_get_extension(opts.m_input_filenames[file_index]));
		if ((strcasecmp(ext.c_str(), "exr") == 0) || (strcasecmp(ext.c_str(), "hdr") == 0))
		{
			error_printf("Skipping HDR image \"%s\" (-image_stats/-dump_* are LDR/8-bit only for now)\n", pFilename);
			any_failed = true;
			continue;
		}

		image img;
		if (!load_image(pFilename, img))
		{
			error_printf("Failed loading image from file \"%s\"!\n", pFilename);
			any_failed = true;
			continue;
		}

		const uint32_t width = img.get_width(), height = img.get_height();
		printf("\nImage \"%s\": %ux%u (%llu pixels), loader reports has_alpha: %u\n",
			pFilename, width, height, (unsigned long long)((uint64_t)width * height), img.has_alpha());

		// ---- Per-channel statistics (single pass over the pixels) ----
		if (do_stats)
		{
			// Resolve the region to gather stats over: the whole image by default, or the user's rectangle
			// (-dump_image_stats <x> <y> <w> <h>). The rectangle must lie fully inside the image.
			uint32_t region_x0 = 0, region_y0 = 0, region_w = width, region_h = height;
			bool region_valid = true;
			if (opts.m_stats_region_w > 0)
			{
				region_x0 = (uint32_t)opts.m_stats_region_x;
				region_y0 = (uint32_t)opts.m_stats_region_y;
				region_w = (uint32_t)opts.m_stats_region_w;
				region_h = (uint32_t)opts.m_stats_region_h;

				if (((uint64_t)region_x0 + region_w > width) || ((uint64_t)region_y0 + region_h > height))
				{
					error_printf("stats region (%u,%u) %ux%u is out of range (image is %ux%u)\n",
						region_x0, region_y0, region_w, region_h, width, height);
					any_failed = true;
					region_valid = false;
				}
				else
				{
					printf("  Stats restricted to region (%u,%u) %ux%u  [x %u..%u, y %u..%u]\n",
						region_x0, region_y0, region_w, region_h,
						region_x0, region_x0 + region_w - 1, region_y0, region_y0 + region_h - 1);
				}
			}

			if (region_valid)
			{
			const uint32_t region_x1 = region_x0 + region_w, region_y1 = region_y0 + region_h;
			const uint64_t total_pixels = (uint64_t)region_w * region_h;

			uint32_t chan_min[4] = { 255, 255, 255, 255 };
			uint32_t chan_max[4] = { 0, 0, 0, 0 };
			double chan_sum[4] = { 0, 0, 0, 0 };
			double chan_sum_sq[4] = { 0, 0, 0, 0 };
			bool seen[4][256];
			memset(seen, 0, sizeof(seen));
			uint64_t alpha_lt_255 = 0, alpha_eq_0 = 0;
			bool premult_possible = true; // true while R,G,B <= A holds for every pixel (a hint of premultiplied alpha)
			bool rgb_identical = true;    // true while R==G==B for every pixel (effectively grayscale / duplicated channel)

			for (uint32_t y = region_y0; y < region_y1; y++)
			{
				for (uint32_t x = region_x0; x < region_x1; x++)
				{
					const color_rgba& c = img(x, y);
					for (uint32_t ch = 0; ch < 4; ch++)
					{
						const uint32_t v = c[ch];
						if (v < chan_min[ch]) chan_min[ch] = v;
						if (v > chan_max[ch]) chan_max[ch] = v;
						chan_sum[ch] += (double)v;
						chan_sum_sq[ch] += (double)v * (double)v;
						seen[ch][v] = true;
					}
					if (c.a < 255) alpha_lt_255++;
					if (c.a == 0) alpha_eq_0++;
					if ((c.r > c.a) || (c.g > c.a) || (c.b > c.a)) premult_possible = false;
					if ((c.r != c.g) || (c.g != c.b)) rgb_identical = false;
				}
			}

			printf("  Chan |  Min |  Max |        Mean |        Variance |     StdDev | Unique | Notes\n");
			static const char chan_names[4] = { 'R', 'G', 'B', 'A' };
			for (uint32_t ch = 0; ch < 4; ch++)
			{
				const double mean = total_pixels ? (chan_sum[ch] / (double)total_pixels) : 0.0;
				double var = total_pixels ? (chan_sum_sq[ch] / (double)total_pixels - mean * mean) : 0.0;
				if (var < 0.0) var = 0.0; // guard against tiny negative floating point error
				const double stddev = sqrt(var);
				uint32_t unique = 0;
				for (uint32_t v = 0; v < 256; v++) unique += seen[ch][v] ? 1u : 0u;

				char notes[64]; notes[0] = '\0';
				if (chan_min[ch] == chan_max[ch])
					snprintf(notes, sizeof(notes), "CONSTANT = %u", chan_min[ch]);

				printf("  %c    | %4u | %4u | %11.4f | %15.4f | %10.4f | %6u | %s\n",
					chan_names[ch], chan_min[ch], chan_max[ch], mean, var, stddev, unique, notes);
			}

			// Alpha-focused summary -- a frequent source of bugs.
			printf("  Alpha: ");
			if (chan_min[3] == 255)
				printf("fully opaque (all 255)\n");
			else if (chan_max[3] == 0)
				printf("fully transparent (all 0)\n");
			else
				printf("varies [%u..%u]; %llu px (%.2f%%) < 255, %llu px (%.2f%%) == 0\n",
					chan_min[3], chan_max[3],
					(unsigned long long)alpha_lt_255, total_pixels ? (100.0 * (double)alpha_lt_255 / (double)total_pixels) : 0.0,
					(unsigned long long)alpha_eq_0, total_pixels ? (100.0 * (double)alpha_eq_0 / (double)total_pixels) : 0.0);

			// Flags that commonly indicate a problem.
			if (img.has_alpha() && (chan_min[3] == 255))
				printf("  Note: image has an alpha channel but every alpha value is 255 (effectively opaque).\n");
			if ((chan_min[3] != 255) && premult_possible)
				printf("  Note: every pixel has R,G,B <= A -- the image may use premultiplied alpha.\n");
			for (uint32_t ch = 0; ch < 3; ch++)
				if (chan_min[ch] == chan_max[ch])
					printf("  Note: %c channel is constant (%u) everywhere -- possible dropped/unused channel.\n", chan_names[ch], chan_min[ch]);
			if (rgb_identical)
				printf("  Note: R, G, B are identical for every pixel -- image is effectively grayscale (or a duplicated/swizzled channel).\n");
			} // region_valid
		}

		// ---- Single-pixel dump ----
		if (do_dump_pixel)
		{
			const uint32_t px = (uint32_t)opts.m_dump_pixel_x, py = (uint32_t)opts.m_dump_pixel_y;
			if ((px >= width) || (py >= height))
				printf("  dump_pixel: (%u,%u) is out of range (image is %ux%u)\n", px, py, width, height);
			else
			{
				const color_rgba& c = img(px, py);
				printf("  Pixel (%u,%u): R=%3u G=%3u B=%3u A=%3u  (hex 0x%02X%02X%02X%02X)\n",
					px, py, c.r, c.g, c.b, c.a, c.r, c.g, c.b, c.a);
			}
		}

		// ---- 4x4 texel-block dump: source texels [bx*4..bx*4+3] x [by*4..by*4+3] (matches the 4x4 grid the
		//      block codecs use, so you can line this up against a transcoded/decoded block). ----
		if (do_dump_block)
		{
			const uint32_t bx = (uint32_t)opts.m_dump_block_x, by = (uint32_t)opts.m_dump_block_y;
			const uint32_t num_blocks_x = (width + 3) / 4, num_blocks_y = (height + 3) / 4;
			if ((bx >= num_blocks_x) || (by >= num_blocks_y))
				printf("  dump_block: block (%u,%u) out of range (image has %ux%u 4x4 blocks)\n", bx, by, num_blocks_x, num_blocks_y);
			else
			{
				printf("  4x4 block (%u,%u) -> texels (%u,%u)..(%u,%u)  [R,G,B,A]:\n", bx, by, bx * 4, by * 4, bx * 4 + 3, by * 4 + 3);
				for (uint32_t ty = 0; ty < 4; ty++)
				{
					const uint32_t sy = by * 4 + ty;
					printf("   ");
					for (uint32_t tx = 0; tx < 4; tx++)
					{
						const uint32_t sx = bx * 4 + tx;
						if ((sx < width) && (sy < height))
						{
							const color_rgba& c = img(sx, sy);
							printf(" [%3u,%3u,%3u,%3u]", c.r, c.g, c.b, c.a);
						}
						else
							printf(" [  -- oob  --  ]");
					}
					printf("\n");
				}
			}
		}
	}

	return !any_failed;
}

static bool compare_mode(command_line_params &opts)
{
	if (opts.m_input_filenames.size() != 2)
	{
		error_printf("Must specify two PNG filenames using -file\n");
		return false;
	}

	std::string ext0(string_get_extension(opts.m_input_filenames[0]));
	if ((strcasecmp(ext0.c_str(), "exr") == 0) || (strcasecmp(ext0.c_str(), "hdr") == 0))
	{
		error_printf("Can't compare HDR image files with this option. Use -hdr_compare instead.\n");
		return false;
	}

	std::string ext1(string_get_extension(opts.m_input_filenames[1]));
	if ((strcasecmp(ext1.c_str(), "exr") == 0) || (strcasecmp(ext1.c_str(), "hdr") == 0))
	{
		error_printf("Can't compare HDR image files with this option. Use -hdr_compare instead.\n");
		return false;
	}

	image a, b;
	if (!load_image(opts.m_input_filenames[0].c_str(), a))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha());

	if (!load_image(opts.m_input_filenames[1].c_str(), b))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height(), b.has_alpha());

	if ((a.get_width() != b.get_width()) || (a.get_height() != b.get_height()))
	{
		printf("Images don't have the same dimensions - cropping input images to smallest common dimensions\n");

		uint32_t w = minimum(a.get_width(), b.get_width());
		uint32_t h = minimum(a.get_height(), b.get_height());

		a.crop(w, h);
		b.crop(w, h);
	}

	printf("Comparison image res: %ux%u\n", a.get_width(), a.get_height());

	image_metrics im;
	im.calc(a, b, 0, 3);
	im.print("RGB    ");

	im.calc(a, b, 0, 4);
	im.print("RGBA   ");

	im.calc(a, b, 0, 1);
	im.print("R      ");

	im.calc(a, b, 1, 1);
	im.print("G      ");

	im.calc(a, b, 2, 1);
	im.print("B      ");

	im.calc(a, b, 3, 1);
	im.print("A      ");

	im.calc(a, b, 0, 0);
	im.print("Y 709  " );

	im.calc(a, b, 0, 0, true, true);
	im.print("Y 601  " );
	
	if (opts.m_compare_ssim)
	{
		vec4F s_rgb(compute_ssim(a, b, false, false));

		printf("R SSIM: %f\n", s_rgb[0]);
		printf("G SSIM: %f\n", s_rgb[1]);
		printf("B SSIM: %f\n", s_rgb[2]);
		printf("RGB Avg SSIM: %f\n", (s_rgb[0] + s_rgb[1] + s_rgb[2]) / 3.0f);
		printf("A SSIM: %f\n", s_rgb[3]);

		vec4F s_y_709(compute_ssim(a, b, true, false));
		printf("Y 709 SSIM: %f\n", s_y_709[0]);

		vec4F s_y_601(compute_ssim(a, b, true, true));
		printf("Y 601 SSIM: %f\n", s_y_601[0]);
	}

	image delta_img(a.get_width(), a.get_height());

	const int X = 2;

	for (uint32_t y = 0; y < a.get_height(); y++)
	{
		for (uint32_t x = 0; x < a.get_width(); x++)
		{
			color_rgba &d = delta_img(x, y);

			for (int c = 0; c < 4; c++)
				d[c] = (uint8_t)clamp<int>((a(x, y)[c] - b(x, y)[c]) * X + 128, 0, 255);
		} // x
	} // y

	fmt_printf("\nPSNR-HVS and PSNR-HVS-M metrics:\n");
	psnr_hvs_metrics hvs_metrics;
	psnr_hvs_compute_metrics(a, b, hvs_metrics);
	psnr_hvs_print_metrics(hvs_metrics);
	fmt_printf("\n");

	save_png("a_rgb.png", a, cImageSaveIgnoreAlpha);
	save_png("a_alpha.png", a, cImageSaveGrayscale, 3);
	printf("Wrote a_rgb.png and a_alpha.png\n");

	save_png("b_rgb.png", b, cImageSaveIgnoreAlpha);
	save_png("b_alpha.png", b, cImageSaveGrayscale, 3);
	printf("Wrote b_rgb.png and b_alpha.png\n");

	save_png("delta_img_rgb.png", delta_img, cImageSaveIgnoreAlpha);
	printf("Wrote delta_img_rgb.png\n");
	
	save_png("delta_img_a.png", delta_img, cImageSaveGrayscale, 3);
	printf("Wrote delta_img_a.png\n");

	if (opts.m_compare_plot)
	{
		uint32_t bins[5][512];
		clear_obj(bins);

		running_stat delta_stats[5];
		basisu::rand rm;

		double avg[5];
		clear_obj(avg);

		for (uint32_t y = 0; y < a.get_height(); y++)
		{
			for (uint32_t x = 0; x < a.get_width(); x++)
			{
				//color_rgba& d = delta_img(x, y);

				for (int c = 0; c < 4; c++)
				{
					int delta = a(x, y)[c] - b(x, y)[c];

					//delta = clamp<int>((int)std::round(rm.gaussian(70.0f, 10.0f)), -255, 255);

					bins[c][delta + 256]++;
					delta_stats[c].push(delta);

					avg[c] += delta;
				}

				int y_delta = a(x, y).get_709_luma() - b(x, y).get_709_luma();
				bins[4][y_delta + 256]++;
				delta_stats[4].push(y_delta);

				avg[4] += y_delta;

			} // x
		} // y

		for (uint32_t i = 0; i <= 4; i++)
			avg[i] /= a.get_total_pixels();

		printf("\n");

		//bins[2][256+-255] = 100000;
		//bins[2][256-56] = 50000;

		const uint32_t X_SIZE = 128, Y_SIZE = 40;

		for (uint32_t c = 0; c <= 4; c++)
		{
			std::vector<uint8_t> plot[Y_SIZE + 1];
			for (uint32_t i = 0; i < Y_SIZE; i++)
			{
				plot[i].resize(X_SIZE + 2);
				memset(plot[i].data(), ' ', X_SIZE + 1);
			}

			uint32_t max_val = 0;
			int max_val_bin_index = 0;
			int lowest_bin_index = INT_MAX, highest_bin_index = INT_MIN;
			double avg_val = 0;
			double total_val = 0;
			running_stat bin_stats;

			for (int y = -255; y <= 255; y++)
			{
				uint32_t val = bins[c][256 + y];
				if (!val)
					continue;

				bin_stats.push(y);

				total_val += (double)val;

				lowest_bin_index = minimum(lowest_bin_index, y);
				highest_bin_index = maximum(highest_bin_index, y);

				if (val > max_val)
				{
					max_val = val;
					max_val_bin_index = y;
				}
				avg_val += y * (double)val;
			}
			avg_val /= total_val;

			int lo_limit = -(int)X_SIZE / 2;
			int hi_limit = X_SIZE / 2;
			for (int x = lo_limit; x <= hi_limit; x++)
			{
				uint32_t total = 0;
				if (x == lo_limit)
				{
					for (int i = -255; i <= lo_limit; i++)
						total += bins[c][256 + i];
				}
				else if (x == hi_limit)
				{
					for (int i = hi_limit; i <= 255; i++)
						total += bins[c][256 + i];
				}
				else
				{
					total = bins[c][256 + x];
				}

				uint32_t height = max_val ? (total * Y_SIZE + max_val - 1) / max_val : 0;

				if (height)
				{
					for (uint32_t y = (Y_SIZE - 1) - (height - 1); y <= (Y_SIZE - 1); y++)
						plot[y][x + X_SIZE / 2] = '*';
				}
			}

			printf("%c delta histogram: total samples: %5.0f, max bin value: %u index: %i (%3.3f%% of total), range %i [%i,%i], weighted mean: %f\n", "RGBAY"[c], total_val, max_val, max_val_bin_index, max_val * 100.0f / total_val, highest_bin_index - lowest_bin_index + 1, lowest_bin_index, highest_bin_index, avg_val);
			printf("bin mean: %f, bin std deviation: %f, non-zero bins: %u\n", bin_stats.get_mean(), bin_stats.get_std_dev(), bin_stats.get_num());
			printf("delta mean: %f, delta std deviation: %f\n", delta_stats[c].get_mean(), delta_stats[c].get_std_dev());
			printf("\n");

			for (uint32_t y = 0; y < Y_SIZE; y++)
				printf("%s\n", (char*)plot[y].data());

			char tics[1024];
			tics[0] = '\0';
			char tics2[1024];
			tics2[0] = '\0';

			for (int x = 0; x <= (int)X_SIZE; x++)
			{
				char buf[64];
				if (x == X_SIZE / 2)
				{
					while ((int)strlen(tics) < x)
						strcat(tics, ".");

					while ((int)strlen(tics2) < x)
						strcat(tics2, " ");

					snprintf(buf, sizeof(buf), "0");
					strcat(tics, buf);
				}
				else if (((x & 7) == 0) || (x == X_SIZE))
				{
					while ((int)strlen(tics) < x)
						strcat(tics, ".");

					while ((int)strlen(tics2) < x)
						strcat(tics2, " ");

					int v = (x - (int)X_SIZE / 2);
					snprintf(buf, sizeof(buf), "%i", v / 10);
					strcat(tics, buf);

					if (v < 0)
					{
						if (-v < 10)
							snprintf(buf, sizeof(buf), "%i", v % 10);
						else
							snprintf(buf, sizeof(buf), " %i", -v % 10);
					}
					else
						snprintf(buf, sizeof(buf), "%i", v % 10);
					strcat(tics2, buf);
				}
				else
				{
					while ((int)strlen(tics) < x)
						strcat(tics, ".");
				}
			}
			printf("%s\n", tics);
			printf("%s\n", tics2);

			printf("\n");
		}

	} // display_plot

	return true;
}

// -compare_hvs: computes and prints standard image metrics plus PSNR-HVS / PSNR-HVS-M for two LDR images (specified via
// -file). Uses the same psnr_hvs_compute_metrics()/print sequence the old dev test code used - the details matter.
static bool compare_hvs_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 2)
	{
		error_printf("Must specify two PNG filenames using -file\n");
		return false;
	}

	for (uint32_t i = 0; i < 2; i++)
	{
		std::string ext(string_get_extension(opts.m_input_filenames[i]));
		if ((strcasecmp(ext.c_str(), "exr") == 0) || (strcasecmp(ext.c_str(), "hdr") == 0))
		{
			error_printf("Can't compare HDR image files with this option (LDR only).\n");
			return false;
		}
	}

	image a, b;
	if (!load_png(opts.m_input_filenames[0].c_str(), a))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}
	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha());

	if (!load_png(opts.m_input_filenames[1].c_str(), b))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str());
		return false;
	}
	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height(), b.has_alpha());

	if ((a.get_width() != b.get_width()) || (a.get_height() != b.get_height()))
	{
		printf("Images don't have the same dimensions - cropping input images to smallest common dimensions\n");

		uint32_t w = minimum(a.get_width(), b.get_width());
		uint32_t h = minimum(a.get_height(), b.get_height());

		a.crop(w, h);
		b.crop(w, h);
	}

	fmt_printf("Resolution: {}x{}\n", a.get_width(), a.get_height());

	print_image_metrics(a, b);

	psnr_hvs_metrics hvs_metrics;
	if (!psnr_hvs_compute_metrics(a, b, hvs_metrics))
	{
		error_printf("psnr_hvs_compute_metrics() failed!\n");
		return false;
	}
	psnr_hvs_print_metrics(hvs_metrics);

	return true;
}

static bool split_image_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify one image filename using -file\n");
		return false;
	}

	image a;
	if (!load_image(opts.m_input_filenames[0].c_str(), a))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha());

	if (!save_png("split_rgb.png", a, cImageSaveIgnoreAlpha))
	{
		fprintf(stderr, "Failed writing file split_rgb.png\n");
		return false;
	}
	printf("Wrote file split_rgb.png\n");

	for (uint32_t i = 0; i < 4; i++)
	{
		char buf[256];
		snprintf(buf, sizeof(buf), "split_%c.png", "RGBA"[i]);
		if (!save_png(buf, a, cImageSaveGrayscale, i))
		{
			fprintf(stderr, "Failed writing file %s\n", buf);
			return false;
		}
		printf("Wrote file %s\n", buf);
	}
	
	return true;
}

static bool combine_images_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 2)
	{
		error_printf("Must specify two image filename using -file\n");
		return false;
	}

	image a, b;
	if (!load_image(opts.m_input_filenames[0].c_str(), a))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha());

	if (!load_image(opts.m_input_filenames[1].c_str(), b))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str());
		return false;
	}

	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height(), b.has_alpha());

	const uint32_t width = minimum(a.get_width(), b.get_width());
	const uint32_t height = minimum(a.get_height(), b.get_height());

	image combined_img(width, height);
	for (uint32_t y = 0; y < height; y++)
	{
		for (uint32_t x = 0; x < width; x++)
		{
			combined_img(x, y) = a(x, y);
			combined_img(x, y).a = b(x, y).g;
		}
	}

	const char* pOutput_filename = "combined.png";
	if (opts.m_output_filename.size())
		pOutput_filename = opts.m_output_filename.c_str();
		
	if (!save_png(pOutput_filename, combined_img))
	{
		fprintf(stderr, "Failed writing file %s\n", pOutput_filename);
		return false;
	}
	printf("Wrote file %s\n", pOutput_filename);

	return true;
}

// Resolves the optional rectangle for the -extract_* modes against an image's dimensions.
// If no region was given (region_w <= 0), returns the whole image. Returns false (with a message) if the rectangle lies outside the image.
static bool resolve_extract_region(const command_line_params& opts, uint32_t width, uint32_t height,
	uint32_t& out_x, uint32_t& out_y, uint32_t& out_w, uint32_t& out_h)
{
	if (opts.m_extract_region_w <= 0)
	{
		out_x = 0; out_y = 0; out_w = width; out_h = height;
		return true;
	}

	out_x = (uint32_t)opts.m_extract_region_x;
	out_y = (uint32_t)opts.m_extract_region_y;
	out_w = (uint32_t)opts.m_extract_region_w;
	out_h = (uint32_t)opts.m_extract_region_h;

	if (((uint64_t)out_x + out_w > width) || ((uint64_t)out_y + out_h > height))
	{
		error_printf("Region (%u,%u) %ux%u is out of range (image is %ux%u)\n", out_x, out_y, out_w, out_h, width, height);
		return false;
	}
	return true;
}

// Applies one sRGB<->linear transform to an 8-bit value. The transform functions take/return normalized [0,1]
// (and assert that range), so we normalize, transform, then round-to-nearest back to 8-bit.
static uint8_t apply_extract_xform_u8(uint8_t v, int xform)
{
	const float f = (float)v * (1.0f / 255.0f);	// exactly within [0,1] for v in [0,255]
	const float g = (xform == cExtractXformToLinear) ? srgb_to_linear(f) : linear_to_srgb(f);
	const int q = (int)(g * 255.0f + 0.5f);		// round to nearest
	return (uint8_t)clamp<int>(q, 0, 255);
}

// Applies the optional color transform to an output image in place: RGB always, alpha only if xform_alpha is set.
static void apply_extract_xform_image(image& img, int xform, bool xform_alpha)
{
	if (xform == cExtractXformNone)
		return;
	const uint32_t num_channels = xform_alpha ? 4u : 3u;
	for (uint32_t y = 0; y < img.get_height(); y++)
		for (uint32_t x = 0; x < img.get_width(); x++)
		{
			color_rgba& c = img(x, y);
			for (uint32_t ch = 0; ch < num_channels; ch++)
				c[ch] = apply_extract_xform_u8(c[ch], xform);
		}
}

// Human-readable suffix describing the active transform (for the "Wrote ..." messages).
static const char* extract_xform_desc(int xform)
{
	if (xform == cExtractXformToLinear) return " [sRGB->linear]";
	if (xform == cExtractXformToSRGB) return " [linear->sRGB]";
	return "";
}

static bool extract_channel_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify one image filename using -file\n");
		return false;
	}

	image img;
	if (!load_image(opts.m_input_filenames[0].c_str(), img))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	const uint32_t width = img.get_width(), height = img.get_height();
	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), width, height, img.has_alpha());

	uint32_t rx, ry, rw, rh;
	if (!resolve_extract_region(opts, width, height, rx, ry, rw, rh))
		return false;

	// Copy the (possibly cropped) region; only the requested channel is later written out as grayscale.
	const uint32_t channel = (uint32_t)opts.m_extract_channel;
	image out_img(rw, rh);
	for (uint32_t y = 0; y < rh; y++)
		for (uint32_t x = 0; x < rw; x++)
			out_img(x, y) = img(rx + x, ry + y);

	// Optional sRGB<->linear transform on just the extracted channel. Alpha is only transformed if -extract_xform_alpha was given,
	// so for the alpha channel the transform may be requested but not actually applied (reflected in the message below).
	const bool channel_is_alpha = (channel == 3);
	const bool xform_applied = (opts.m_extract_color_xform != cExtractXformNone) && (!channel_is_alpha || opts.m_extract_xform_alpha);
	if (xform_applied)
	{
		for (uint32_t y = 0; y < rh; y++)
			for (uint32_t x = 0; x < rw; x++)
				out_img(x, y)[channel] = apply_extract_xform_u8(out_img(x, y)[channel], opts.m_extract_color_xform);
	}

	if (!save_png(opts.m_extract_filename.c_str(), out_img, cImageSaveGrayscale, channel))
	{
		error_printf("Failed writing file %s\n", opts.m_extract_filename.c_str());
		return false;
	}

	printf("Wrote channel %c of region (%u,%u) %ux%u as grayscale to \"%s\"%s\n",
		"RGBA"[channel], rx, ry, rw, rh, opts.m_extract_filename.c_str(), xform_applied ? extract_xform_desc(opts.m_extract_color_xform) : "");
	return true;
}

static bool extract_swizzle_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify one image filename using -file\n");
		return false;
	}

	image img;
	if (!load_image(opts.m_input_filenames[0].c_str(), img))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	const uint32_t width = img.get_width(), height = img.get_height();
	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), width, height, img.has_alpha());

	uint32_t rx, ry, rw, rh;
	if (!resolve_extract_region(opts, width, height, rx, ry, rw, rh))
		return false;

	// Build the per-output-channel source map: listed channels are swizzled, the rest pass through unchanged (identity).
	uint32_t src_chan[4] = { 0, 1, 2, 3 };
	for (int i = 0; i < opts.m_extract_swizzle_count; i++)
		src_chan[i] = (uint32_t)opts.m_extract_swizzle[i];

	image out_img(rw, rh);
	for (uint32_t y = 0; y < rh; y++)
	{
		for (uint32_t x = 0; x < rw; x++)
		{
			const color_rgba& s = img(rx + x, ry + y);
			color_rgba& d = out_img(x, y);
			for (uint32_t c = 0; c < 4; c++)
				d[c] = s[src_chan[c]];
		}
	}

	// Optional sRGB<->linear transform: RGB always, alpha only with -extract_xform_alpha.
	apply_extract_xform_image(out_img, opts.m_extract_color_xform, opts.m_extract_xform_alpha);

	if (!save_png(opts.m_extract_filename.c_str(), out_img))
	{
		error_printf("Failed writing file %s\n", opts.m_extract_filename.c_str());
		return false;
	}

	printf("Wrote swizzle R<-%c G<-%c B<-%c A<-%c of region (%u,%u) %ux%u to \"%s\"%s\n",
		"RGBA"[src_chan[0]], "RGBA"[src_chan[1]], "RGBA"[src_chan[2]], "RGBA"[src_chan[3]],
		rx, ry, rw, rh, opts.m_extract_filename.c_str(), extract_xform_desc(opts.m_extract_color_xform));
	return true;
}

static bool extract_region_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify one image filename using -file\n");
		return false;
	}

	image img;
	if (!load_image(opts.m_input_filenames[0].c_str(), img))
	{
		error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	const uint32_t width = img.get_width(), height = img.get_height();
	printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), width, height, img.has_alpha());

	uint32_t rx, ry, rw, rh;
	if (!resolve_extract_region(opts, width, height, rx, ry, rw, rh))
		return false;

	image out_img(rw, rh);
	for (uint32_t y = 0; y < rh; y++)
		for (uint32_t x = 0; x < rw; x++)
			out_img(x, y) = img(rx + x, ry + y);

	// Optional sRGB<->linear transform: RGB always, alpha only with -extract_xform_alpha.
	apply_extract_xform_image(out_img, opts.m_extract_color_xform, opts.m_extract_xform_alpha);

	if (!save_png(opts.m_extract_filename.c_str(), out_img))
	{
		error_printf("Failed writing file %s\n", opts.m_extract_filename.c_str());
		return false;
	}

	printf("Wrote region (%u,%u) %ux%u to \"%s\"%s\n", rx, ry, rw, rh, opts.m_extract_filename.c_str(), extract_xform_desc(opts.m_extract_color_xform));
	return true;
}

static bool tonemap_image_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify one LDR image filename using -file\n");
		return false;
	}

	imagef hdr_img;
	if (!load_image_hdr(opts.m_input_filenames[0].c_str(), hdr_img, opts.m_comp_params.m_ldr_hdr_upconversion_srgb_to_linear))
	{
		error_printf("Failed loading LDR image from file \"%s\"!\n", opts.m_input_filenames[0].c_str());
		return false;
	}

	hdr_img.clean_astc_hdr_pixels(1e+30f);

	const uint32_t width = hdr_img.get_width(), height = hdr_img.get_height();

	printf("Loaded \"%s\", %ux%u\n", opts.m_input_filenames[0].c_str(), width, height);

	std::string output_filename;
	string_get_filename(opts.m_input_filenames[0].c_str(), output_filename);
	string_remove_extension(output_filename);
	if (!output_filename.size())
		output_filename = "tonemapped";

	if (opts.m_output_path.size())
		string_combine_path(output_filename, opts.m_output_path.c_str(), output_filename.c_str());

	const char* pBasename = output_filename.c_str();
	
	image srgb_img(width, height);
	image lin_img(width, height);

	for (uint32_t y = 0; y < height; y++)
	{
		for (uint32_t x = 0; x < width; x++)
		{
			vec4F p(hdr_img(x, y));

			p[0] = clamp(p[0], 0.0f, 1.0f);
			p[1] = clamp(p[1], 0.0f, 1.0f);
			p[2] = clamp(p[2], 0.0f, 1.0f);
						
			{
				int rc = (int)std::round(linear_to_srgb(p[0]) * 255.0f);
				int gc = (int)std::round(linear_to_srgb(p[1]) * 255.0f);
				int bc = (int)std::round(linear_to_srgb(p[2]) * 255.0f);

				srgb_img.set_clipped(x, y, color_rgba(rc, gc, bc, 255));
			}

			{
				int rc = (int)std::round(p[0] * 255.0f);
				int gc = (int)std::round(p[1] * 255.0f);
				int bc = (int)std::round(p[2] * 255.0f);

				lin_img.set_clipped(x, y, color_rgba(rc, gc, bc, 255));
			}
		}
	}

	{
		const std::string filename(string_format("%s_linear_clamped_to_srgb.png", pBasename));
		save_png(filename.c_str(), srgb_img);
		printf("Wrote .PNG file %s\n", filename.c_str());
	}

	{
		const std::string filename(string_format("%s_linear_clamped.png", pBasename));
		save_png(filename.c_str(), lin_img);
		printf("Wrote .PNG file %s\n", filename.c_str());
	}

	{
		const std::string filename(string_format("%s_compressive_tonemapped.png", pBasename));
		image compressive_tonemapped_img;

		bool status = tonemap_image_compressive(compressive_tonemapped_img, hdr_img);
		if (!status)
		{
			error_printf("tonemap_image_compressive() failed (invalid half-float input)\n");
		}
		else
		{
			save_png(filename.c_str(), compressive_tonemapped_img);
			printf("Wrote .PNG file %s\n", filename.c_str());
		}
	}

	image tonemapped_img;

	for (int e = -6; e <= 6; e++)
	{
		const float scale = powf(2.0f, (float)e);
				
		tonemap_image_reinhard(tonemapped_img, hdr_img, scale, opts.m_tonemap_dither_flag);

		std::string filename(string_format("%s_reinhard_tonemapped_scale_%f.png", pBasename, scale));
		save_png(filename.c_str(), tonemapped_img, cImageSaveIgnoreAlpha);
		printf("Wrote .PNG file %s\n", filename.c_str());
	}

	return true;
}

static bool bench_mode(command_line_params& opts)
{
	BASISU_NOTE_UNUSED(opts);
	error_printf("Unsupported\n");
	return false;
}

static uint32_t compute_miniz_compressed_size(const char* pFilename, uint32_t &orig_size)
{
	orig_size = 0;

	uint8_vec buf;
	if (!read_file_to_vec(pFilename, buf))
		return 0;

	if (!buf.size())
		return 0;

	if (buf.size() > UINT32_MAX)
	{
		fprintf(stderr, "compute_miniz_compressed_size: File \"%s\" too large!\n", pFilename);
		return 0;
	}

	orig_size = buf.size_u32();

	size_t comp_size = 0;
	void* pComp_data = tdefl_compress_mem_to_heap(&buf[0], buf.size(), &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES);

	mz_free(pComp_data);

	return (uint32_t)comp_size;
}

static bool compsize_mode(command_line_params& opts)
{
	if (opts.m_input_filenames.size() != 1)
	{
		error_printf("Must specify a filename using -file\n");
		return false;
	}

	uint32_t orig_size;
	uint32_t comp_size = compute_miniz_compressed_size(opts.m_input_filenames[0].c_str(), orig_size);
	printf("Original file size: %u bytes\n", orig_size);
	printf("miniz compressed size: %u bytes\n", comp_size);

	return true;
}

const struct etc1s_uastc_4x4_ldr_test_file
{
	const char* m_pFilename;
	uint32_t m_etc1s_size;
	float m_etc1s_psnr;
	float m_uastc_psnr;
	
	uint32_t m_etc1s_128_size;
    float m_etc1s_128_psnr;
} g_etc1s_uastc_4x4_ldr_test_files[] = 
{
	{ "black_1x1.png", 220, 100.0f, 100.0f, 220, 100.0f },
	{ "kodim01.png", 31003, 27.40f, 44.14f, 58385, 30.356064f },
	{ "kodim02.png", 28560, 32.20f, 41.06f, 51442, 34.713940f },
	{ "kodim03.png", 23442, 32.57f, 44.87f, 49548, 36.709675f },
	{ "kodim04.png", 28287, 31.76f, 43.02f, 57034, 34.864861f },
	{ "kodim05.png", 32677, 25.94f, 40.28f, 65742, 29.935091f },
	{ "kodim06.png", 27367, 28.66f, 44.57f, 54994, 32.294220f },
	{ "kodim07.png", 26649, 31.51f, 43.94f, 53374, 35.576595f },
	{ "kodim08.png", 31164, 25.28f, 41.15f, 63516, 29.509914f },
	{ "kodim09.png", 24808, 32.05f, 45.85f, 51402, 35.985966f },
	{ "kodim10.png", 27278, 32.20f, 45.77f, 54322, 36.395000f },
	{ "kodim11.png", 26610, 29.22f, 43.68f, 55526, 33.468971f },
	{ "kodim12.png", 25133, 32.96f, 46.77f, 51503, 36.722233f },
	{ "kodim13.png", 31635, 24.25f, 41.25f, 62660, 27.588623f },
	{ "kodim14.png", 31193, 27.81f, 39.65f, 62897, 31.206463f },
	{ "kodim15.png", 25559, 31.26f, 42.87f, 53424, 35.026314f },
	{ "kodim16.png", 26925, 32.21f, 47.78f, 51354, 35.555458f },
	{ "kodim17.png", 29365, 31.40f, 45.66f, 55675, 35.909283f },
	{ "kodim18.png", 30960, 27.46f, 41.54f, 62388, 31.348171f },
	{ "kodim19.png", 27920, 29.69f, 44.95f, 55098, 33.613987f },
	{ "kodim20.png", 21135, 31.30f, 45.31f, 47160, 35.759407f },
	{ "kodim21.png", 25974, 28.53f, 44.45f, 54799, 32.415817f },
	{ "kodim22.png", 29111, 29.85f, 42.63f, 60994, 33.495415f },
	{ "kodim23.png", 23825, 31.69f, 45.11f, 53614, 36.223492f },
	{ "kodim24.png", 29644, 26.75f, 40.61f, 58909, 31.522869f },
	{ "white_1x1.png", 220, 100.0f, 100.0f, 220, 100.000000f },
	{ "wikipedia.png", 38992, 24.10f, 30.47f, 69608, 27.630802f },
	{ "alpha0.png", 807, 100.0f, 56.16f, 810, 100.000000f }
};

static bool test_mode_ldr(command_line_params& opts)
{
	uint32_t total_mismatches = 0;

	// TODO: Record min/max/avgs
	// TODO: Add another ETC1S quality level

	// Minor differences in how floating point code is optimized can result in slightly different generated files.
#ifdef USE_TIGHTER_TEST_TOLERANCES
	const float ETC1S_PSNR_THRESHOLD = .125f;
	const float UASTC_PSNR_THRESHOLD = .125f;
#else
	const float ETC1S_PSNR_THRESHOLD = .3f;
	const float UASTC_PSNR_THRESHOLD = .3f;
#endif
	const float ETC1S_FILESIZE_THRESHOLD = .045f;

	for (uint32_t i = 0; i < std::size(g_etc1s_uastc_4x4_ldr_test_files); i++)
	{
		const auto& test_file = g_etc1s_uastc_4x4_ldr_test_files[i];

		std::string filename(opts.m_test_file_dir);
		if (filename.size())
		{
			filename.push_back('/');
		}
		filename += std::string(test_file.m_pFilename);

		basisu::vector<image> source_images(1);

		image& source_image = source_images[0];
		if (!load_png(filename.c_str(), source_image))
		{
			error_printf("Failed loading test image \"%s\"\n", filename.c_str());
			return false;
		}

		printf("Loaded file \"%s\", dimensions %ux%u has alpha: %u\n", filename.c_str(), source_image.get_width(), source_image.get_height(), source_image.has_alpha());

		image_stats stats;

		uint32_t flags_and_quality;
		float uastc_rdo_quality = 0.0f;
		size_t data_size = 0;

		// Test ETC1S
		flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagPrintStats | cFlagPrintStatus;
		
		{
			printf("**** Testing ETC1S non-OpenCL level 1\n");

			// Level 1
			void* pData = basis_compress(basist::basis_tex_format::cETC1S, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
			if (!pData)
			{
				error_printf("basis_compress() failed!\n");
				return false;
			}
			basis_free_data(pData);

			printf("ETC1S level 1 Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr);

			float file_size_ratio = fabs((data_size / (float)test_file.m_etc1s_size) - 1.0f);
			if (file_size_ratio > ETC1S_FILESIZE_THRESHOLD)
			{
				error_printf("Expected ETC1S file size was %u, but got %u instead!\n", test_file.m_etc1s_size, (uint32_t)data_size);
				total_mismatches++;
			}

			if (fabs(stats.m_basis_rgba_avg_psnr - test_file.m_etc1s_psnr) > ETC1S_PSNR_THRESHOLD)
			{
				error_printf("Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n", test_file.m_etc1s_psnr, stats.m_basis_rgba_avg_psnr);
				total_mismatches++;
			}
		}

		{
			printf("**** Testing ETC1S non-OpenCL level 128\n");

			// Test ETC1S level 128
			flags_and_quality |= 128;

			void* pData = basis_compress(basist::basis_tex_format::cETC1S, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
			if (!pData)
			{
				error_printf("basis_compress() failed!\n");
				return false;
			}
			basis_free_data(pData);

			printf("ETC1S level 128 Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr);

			float file_size_ratio = fabs((data_size / (float)test_file.m_etc1s_128_size) - 1.0f);
			if (file_size_ratio > ETC1S_FILESIZE_THRESHOLD)
			{
				error_printf("Expected ETC1S file size was %u, but got %u instead!\n", test_file.m_etc1s_128_size, (uint32_t)data_size);
				total_mismatches++;
			}

			if (fabs(stats.m_basis_rgba_avg_psnr - test_file.m_etc1s_128_psnr) > ETC1S_PSNR_THRESHOLD)
			{
				error_printf("Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n", test_file.m_etc1s_128_psnr, stats.m_basis_rgba_avg_psnr);
				total_mismatches++;
			}
		}

		if (opencl_is_available())
		{
			printf("**** Testing ETC1S OpenCL level 1\n");

			// Test ETC1S OpenCL level 1
			flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagUseOpenCL | cFlagPrintStats | cFlagPrintStatus;

			void *pData = basis_compress(basist::basis_tex_format::cETC1S, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
			if (!pData)
			{
				error_printf("basis_compress() failed!\n");
				return false;
			}
			basis_free_data(pData);

			printf("ETC1S+OpenCL Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr);

			float file_size_ratio = fabs((data_size / (float)test_file.m_etc1s_size) - 1.0f);
			if (file_size_ratio > .04f)
			{
				error_printf("Expected ETC1S+OpenCL file size was %u, but got %u instead!\n", test_file.m_etc1s_size, (uint32_t)data_size);
				total_mismatches++;
			}

			if (test_file.m_etc1s_psnr == 100.0f)
			{
				// TODO
				if (stats.m_basis_rgba_avg_psnr < 69.0f)
				{
					error_printf("Expected ETC1S+OpenCL RGBA Avg PSNR was %f, but got %f instead!\n", test_file.m_etc1s_psnr, stats.m_basis_rgba_avg_psnr);
					total_mismatches++;
				}
			}
			else if (fabs(stats.m_basis_rgba_avg_psnr - test_file.m_etc1s_psnr) > .2f)
			{
				error_printf("Expected ETC1S+OpenCL RGBA Avg PSNR was %f, but got %f instead!\n", test_file.m_etc1s_psnr, stats.m_basis_rgba_avg_psnr);
				total_mismatches++;
			}
		}

		// Test UASTC
		{
			printf("**** Testing UASTC LDR 4x4\n");

			flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagPrintStats | cFlagPrintStatus;

			void* pData = basis_compress(basist::basis_tex_format::cUASTC_LDR_4x4, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
			if (!pData)
			{
				error_printf("basis_compress() failed!\n");
				return false;
			}
			basis_free_data(pData);

			printf("UASTC Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr);

			if (fabs(stats.m_basis_rgba_avg_psnr - test_file.m_uastc_psnr) > UASTC_PSNR_THRESHOLD)
			{
				error_printf("Expected UASTC RGBA Avg PSNR was %f, but got %f instead!\n", test_file.m_etc1s_psnr, stats.m_basis_rgba_avg_psnr);
				total_mismatches++;
			}
		}
	}

	printf("Total LDR mismatches: %u\n", total_mismatches);

	bool result = true;
	if (total_mismatches)
	{
		error_printf("LDR test FAILED\n");
		result = false;
	}
	else
	{
		printf("LDR test succeeded\n");
	}

	return result;
}

const uint32_t MAX_ASTC_HDR_4x4_TEST_LEVEL = 4;

struct hdr_test_file
{
	const char* m_pFilename;
	float m_level_psnr_astc[MAX_ASTC_HDR_4x4_TEST_LEVEL + 1];
	float m_level_psnr_bc6h[MAX_ASTC_HDR_4x4_TEST_LEVEL + 1];
};

static const hdr_test_file g_hdr_4x4_test_files[] =
{
	{ "black_1x1.png", { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f }, { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f } },
	{ "atrium.exr", { 38.630527f,39.037231f,39.561947f,39.604759f,40.181847f }, { 38.218285f,38.801189f,39.232151f,39.271103f,39.689102f } },
	{ "backyard.exr", { 39.930801f,39.894077f,40.001156f,40.020653f,40.233330f }, { 39.125782f,39.504299f,39.602329f,39.621807f,39.804798f } },
	{ "Desk.exr", { 23.786697f,24.840689f,25.399199f,25.476711f,26.183117f }, { 23.523026f,24.634579f,25.172062f,25.242109f,25.930155f } },
	{ "atrium.exr", { 38.630527f,39.037231f,39.561947f,39.604759f,40.181847f }, { 38.218285f,38.801189f,39.232151f,39.271103f,39.689102f } },
	{ "yucca.exr", { 33.830448f,34.716824f,34.941631f,35.032707f,35.377048f }, { 33.530876f,34.388000f,34.614750f,34.706139f,35.021336f } },
	{ "tough.png", { 30.077433f,32.829239f,33.760094f,35.076836f,38.015430f }, { 30.042871f,32.868286f,33.872608f,34.709766f,37.002869f } },
	{ "kodim03.png", { 44.012009f,44.699100f,44.914505f,45.099625f,45.585442f }, { 43.358746f,44.380592f,44.552963f,44.728668f,45.161995f } },
	{ "kodim18.png", { 40.636051f,40.661617f,40.807407f,40.855389f,41.059860f }, { 40.235321f,40.500309f,40.628899f,40.666466f,40.814095f } },
	{ "kodim23.png", { 43.154652f,43.808632f,44.074600f,44.188736f,44.576088f }, { 42.515514f,43.478119f,43.710693f,43.826859f,44.179974f } }
};

static const hdr_test_file g_hdr_6x6_test_files[] =
{
	{ "black_1x1.png", { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f }, { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f } },
	{ "atrium.exr", { 30.959572f,30.959572f,30.770338f,30.772770f,31.128767f }, { 30.882959f,30.882959f,30.612440f,30.598936f,30.895250f } },
	{ "backyard.exr", { 31.784214f,31.784214f,31.791901f,31.803551f,31.944782f }, { 31.591133f,31.591133f,31.597143f,31.591780f,31.732521f } },
	{ "Desk.exr", { 16.434078f,16.434078f,17.116821f,17.119164f,17.473869f }, { 16.378624f,16.378624f,16.720890f,16.720837f,16.989027f } },
	{ "atrium.exr", { 30.959572f,30.959572f,30.770338f,30.772770f,31.128767f }, { 30.882959f,30.882959f,30.612440f,30.598936f,30.895250f } },
	{ "yucca.exr", { 28.273916f,28.273916f,28.855904f,28.878124f,29.159794f }, { 27.989918f,27.989918f,28.310234f,28.293547f,28.570906f } },
	{ "tough.png", { 26.233910f,26.233910f,27.691349f,27.709543f,28.563215f }, { 25.678591f,25.678591f,26.385843f,26.392776f,26.868755f } },
	{ "kodim03.png", { 38.326469f,38.326469f,38.436966f,38.471195f,38.595867f }, { 37.782318f,37.782318f,37.837765f,37.847427f,37.938293f } },
	{ "kodim18.png", { 32.514179f,32.514179f,32.408348f,32.392838f,32.517056f }, { 32.434414f,32.434414f,32.321037f,32.299664f,32.424305f } },
	{ "kodim23.png", { 36.778912f,36.778912f,36.861130f,36.879044f,37.061916f }, { 36.433865f,36.433865f,36.466240f,36.460670f,36.623734f } },
};

static const hdr_test_file g_hdr_6x6i_test_files[] =
{
	{ "black_1x1.png", { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f }, { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f } },
	{ "atrium.exr", { 30.959572f,30.959572f,30.770338f,30.772770f,31.128767f }, { 30.882959f,30.882959f,30.612440f,30.598936f,30.895250f } },
	{ "backyard.exr", { 31.784214f,31.784214f,31.791901f,31.803551f,31.944782f }, { 31.591133f,31.591133f,31.597143f,31.591780f,31.732521f } },
	{ "Desk.exr", { 16.434078f,16.434078f,17.116821f,17.119164f,17.473869f }, { 16.378624f,16.378624f,16.720890f,16.720837f,16.989027f } },
	{ "atrium.exr", { 30.959572f,30.959572f,30.770338f,30.772770f,31.128767f }, { 30.882959f,30.882959f,30.612440f,30.598936f,30.895250f } },
	{ "yucca.exr", { 28.273916f,28.273916f,28.855904f,28.878124f,29.159794f }, { 27.989918f,27.989918f,28.310234f,28.293547f,28.570906f } },
	{ "tough.png", { 26.233910f,26.233910f,27.691349f,27.709543f,28.563215f }, { 25.678591f,25.678591f,26.385843f,26.392776f,26.868755f } },
	{ "kodim03.png", { 38.326469f,38.326469f,38.436966f,38.471195f,38.595867f }, { 37.782318f,37.782318f,37.837765f,37.847427f,37.938293f } },
	{ "kodim18.png", { 32.514179f,32.514179f,32.408348f,32.392838f,32.517056f }, { 32.434414f,32.434414f,32.321037f,32.299664f,32.424305f } },
	{ "kodim23.png", { 36.778912f,36.778912f,36.861130f,36.879044f,37.061916f }, { 36.433865f,36.433865f,36.466240f,36.460670f,36.623734f } },
};

static const hdr_test_file g_hdr_6x6i_l_test_files[] =
{
	{ "black_1x1.png", { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f }, { 1000.000000f,1000.000000f,1000.000000f,1000.000000f,1000.000000f } },
	{ "atrium.exr", { 30.870792f,30.891232f,30.621367f,30.623915f,30.975077f }, { 30.792868f,30.800392f,30.463884f,30.454252f,30.764057f } },
	{ "backyard.exr", { 31.341709f,31.305914f,31.310831f,31.316299f,31.430468f }, { 31.179270f,31.146502f,31.150509f,31.140987f,31.252031f } },
	{ "Desk.exr", { 16.445023f,16.457247f,17.120258f,17.122082f,17.468046f }, { 16.382484f,16.391695f,16.726139f,16.725529f,16.985308f } },
	{ "atrium.exr", { 30.870792f,30.891232f,30.621367f,30.623915f,30.975077f }, { 30.792868f,30.800392f,30.463884f,30.454252f,30.764057f } },
	{ "yucca.exr", { 28.193764f,28.203444f,28.750029f,28.770260f,29.046646f }, { 27.918747f,27.925451f,28.228069f,28.217707f,28.486164f } },
	{ "tough.png", { 25.630802f,25.532228f,27.172880f,27.189053f,28.139309f }, { 25.160349f,25.056414f,26.012842f,26.018627f,26.592100f } },
	{ "kodim03.png", { 36.871231f,36.667595f,36.741497f,36.806915f,36.872837f }, { 36.500050f,36.309052f,36.360775f,36.404907f,36.454163f } },
	{ "kodim18.png", { 32.275890f,32.219872f,32.162785f,32.163559f,32.268921f }, { 32.201065f,32.143383f,32.078678f,32.073696f,32.188496f } },
	{ "kodim23.png", { 35.954903f,35.869717f,35.914257f,35.956097f,36.107834f }, { 35.681644f,35.612144f,35.616695f,35.638779f,35.797539f } },
};

static bool test_mode_hdr(command_line_params& opts, basist::basis_tex_format tex_fmt, uint32_t num_test_files, const hdr_test_file *pTest_files, float lambda)
{
	BASISU_ASSUME(uastc_hdr_4x4_codec_options::cMaxLevel == 4);

	fmt_printf("test_mode_hdr: Testing basis_tex_format {}, lambda {}\n", (uint32_t)tex_fmt, lambda);

	uint32_t total_mismatches = 0;
					
#ifdef USE_TIGHTER_TEST_TOLERANCES
	// The PSNR's above were created with a MSVC compiled executable, x64. Hopefully this is not too low a threshold.
	const float PSNR_THRESHOLD = .125f;
#else
	// Minor differences in how floating point code is optimized can result in slightly different generated files.
	const float PSNR_THRESHOLD = .3f;
#endif
	
	double highest_delta = 0.0f;

	// TODO: This doesn't test all 6x6 levels, but that's fine for now.
	basisu::vector2D<float> astc_psnr(num_test_files, MAX_ASTC_HDR_4x4_TEST_LEVEL + 1);
	basisu::vector2D<float> bc6h_psnr(num_test_files, MAX_ASTC_HDR_4x4_TEST_LEVEL + 1);

	for (uint32_t i = 0; i < num_test_files; i++)
	{
		std::string filename(opts.m_test_file_dir);
		if (filename.size())
		{
			filename.push_back('/');
		}
		filename += std::string(pTest_files[i].m_pFilename);

		basisu::vector<imagef> source_imagesf(1);

		imagef& source_image = source_imagesf[0];
		if (!load_image_hdr(filename.c_str(), source_image))
		{
			error_printf("Failed loading test image \"%s\"\n", filename.c_str());
			return false;
		}

		printf("Loaded file \"%s\", dimensions %ux%u\n", filename.c_str(), source_image.get_width(), source_image.get_height());
				
		for (uint32_t uastc_hdr_level = 0; uastc_hdr_level <= MAX_ASTC_HDR_4x4_TEST_LEVEL; uastc_hdr_level++)
		{
			image_stats stats;

			uint32_t flags_and_quality;
			size_t data_size = 0;

			printf("**** Testing UASTC HDR Level %u\n", uastc_hdr_level);

			flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0);// | cFlagPrintStats | cFlagPrintStatus;
			flags_and_quality |= uastc_hdr_level;

			void* pData = basis_compress(tex_fmt,
				source_imagesf, flags_and_quality, lambda, 
				&data_size, &stats);
			if (!pData)
			{
				error_printf("basis_compress() failed!\n");
				return false;
			}
			basis_free_data(pData);

			double delta1, delta2;

			printf("ASTC PSNR: %f (expected %f, delta %f), BC6H PSNR: %f (expected %f, delta %f)\n", 
				stats.m_basis_rgb_avg_astc_hdr_log2_psnr, pTest_files[i].m_level_psnr_astc[uastc_hdr_level], delta1 = fabs(stats.m_basis_rgb_avg_astc_hdr_log2_psnr - pTest_files[i].m_level_psnr_astc[uastc_hdr_level]),
				stats.m_basis_rgb_avg_bc6h_log2_psnr, pTest_files[i].m_level_psnr_bc6h[uastc_hdr_level], delta2 = fabs(stats.m_basis_rgb_avg_bc6h_log2_psnr - pTest_files[i].m_level_psnr_bc6h[uastc_hdr_level]));

			highest_delta = maximum(highest_delta, delta1);
			highest_delta = maximum(highest_delta, delta2);

			if (fabs(stats.m_basis_rgb_avg_astc_hdr_log2_psnr - pTest_files[i].m_level_psnr_astc[uastc_hdr_level]) > PSNR_THRESHOLD)
			{
				error_printf("Expected UASTC HDR RGB Avg PSNR was %f, but got %f instead!\n", pTest_files[i].m_level_psnr_astc[uastc_hdr_level], stats.m_basis_rgb_avg_astc_hdr_log2_psnr);
				total_mismatches++;
			}

			if (fabs(stats.m_basis_rgb_avg_bc6h_log2_psnr - pTest_files[i].m_level_psnr_bc6h[uastc_hdr_level]) > PSNR_THRESHOLD)
			{
				error_printf("Expected UASTC/ASTC->BC6H HDR RGB Avg PSNR was %f, but got %f instead!\n", pTest_files[i].m_level_psnr_bc6h[uastc_hdr_level], stats.m_basis_rgb_avg_bc6h_log2_psnr);
				total_mismatches++;
			}

			astc_psnr(i, uastc_hdr_level) = stats.m_basis_rgb_avg_astc_hdr_log2_psnr;
			bc6h_psnr(i, uastc_hdr_level) = stats.m_basis_rgb_avg_bc6h_log2_psnr;
		}
	}

	printf("Total HDR mismatches: %u\n", total_mismatches);
	printf("Highest delta: %f\n", highest_delta);

	bool result = true;
	if (total_mismatches)
	{
		error_printf("HDR test FAILED\n");
		result = false;
	}
	else
	{
		printf("HDR test succeeded\n");
	}

#if 0
	for (uint32_t i = 0; i < num_test_files; i++)
	{
		printf("{ \"%s\", { ", pTest_files[i].m_pFilename);
		for (uint32_t uastc_hdr_level = 0; uastc_hdr_level <= 4; uastc_hdr_level++)
			printf("%ff%c", astc_psnr(i, uastc_hdr_level), (uastc_hdr_level < 4) ? ',' : ' ');

		printf("}, { ");

		for (uint32_t uastc_hdr_level = 0; uastc_hdr_level <= 4; uastc_hdr_level++)
			printf("%ff%c", bc6h_psnr(i, uastc_hdr_level), (uastc_hdr_level < 4) ? ',' : ' ');
		printf("} },\n");
	} // i
#endif

	for (uint32_t uastc_hdr_level = 0; uastc_hdr_level <= MAX_ASTC_HDR_4x4_TEST_LEVEL; uastc_hdr_level++)
	{
		float tot_astc = 0.0f, tot_bc6h = 0.0f;
		for (uint32_t i = 0; i < num_test_files; i++)
		{
			tot_astc += astc_psnr(i, uastc_hdr_level);
			tot_bc6h += bc6h_psnr(i, uastc_hdr_level);
		}

		tot_astc /= (float)num_test_files;
		tot_bc6h /= (float)num_test_files;

		fmt_printf("Level: {}, Avg. ASTC PSNR: {}, Avg. BC6H PSNR: {}\n", uastc_hdr_level, tot_astc, tot_bc6h);
	}

	return result;
}

const uint32_t XUASTC_LDR_TEST_FILE_NUM_RUNS = 3;

struct xuastc_ldr_test_file
{
	const char* m_pFilename;

	struct test_run
	{
		float m_dct_q;
		uint32_t m_comp_size;
		float m_rgba_psnr;
	};

	test_run m_test_runs[XUASTC_LDR_TEST_FILE_NUM_RUNS];
};

xuastc_ldr_test_file g_xuastc_ldr_test_files_6x6[] =
{
	{ "black_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 143338, 37.631470f },  { 75.000000f, 132606, 34.858498f },  { 35.000000f, 112536, 31.930468f } } },
	{ "kodim02.png", { { 100.000000f, 136308, 40.657822f },  { 75.000000f, 101839, 38.057598f },  { 35.000000f, 81085, 36.128090f } } },
	{ "kodim03.png", { { 100.000000f, 133461, 43.046989f },  { 75.000000f, 86361, 39.970840f },  { 35.000000f, 69200, 37.480732f } } },
	{ "kodim04.png", { { 100.000000f, 139788, 41.014957f },  { 75.000000f, 101258, 38.003296f },  { 35.000000f, 83902, 35.965012f } } },
	{ "kodim05.png", { { 100.000000f, 148943, 36.247421f },  { 75.000000f, 138468, 34.564281f },  { 35.000000f, 122126, 31.844128f } } },
	{ "kodim06.png", { { 100.000000f, 137452, 39.072002f },  { 75.000000f, 113603, 36.145702f },  { 35.000000f, 93972, 33.209007f } } },
	{ "kodim07.png", { { 100.000000f, 137948, 41.442890f },  { 75.000000f, 98386, 39.420319f },  { 35.000000f, 83659, 37.224255f } } },
	{ "kodim08.png", { { 100.000000f, 147884, 36.300182f },  { 75.000000f, 134661, 34.453938f },  { 35.000000f, 118202, 31.751554f } } },
	{ "kodim09.png", { { 100.000000f, 136609, 42.575459f },  { 75.000000f, 83721, 39.448776f },  { 35.000000f, 68192, 37.360222f } } },
	{ "kodim10.png", { { 100.000000f, 138614, 42.184914f },  { 75.000000f, 94047, 39.332645f },  { 35.000000f, 77621, 37.126518f } } },
	{ "kodim11.png", { { 100.000000f, 139548, 39.074104f },  { 75.000000f, 113306, 36.617252f },  { 35.000000f, 91571, 34.055752f } } },
	{ "kodim12.png", { { 100.000000f, 134259, 43.179798f },  { 75.000000f, 90453, 39.607330f },  { 35.000000f, 70234, 37.351040f } } },
	{ "kodim13.png", { { 100.000000f, 144618, 34.267788f },  { 75.000000f, 141867, 32.225410f },  { 35.000000f, 120881, 29.205767f } } },
	{ "kodim14.png", { { 100.000000f, 143775, 37.229355f },  { 75.000000f, 129872, 35.301926f },  { 35.000000f, 109048, 33.015049f } } },
	{ "kodim15.png", { { 100.000000f, 136213, 40.758198f },  { 75.000000f, 92132, 38.082176f },  { 35.000000f, 73418, 35.928169f } } },
	{ "kodim16.png", { { 100.000000f, 135975, 42.594410f },  { 75.000000f, 103275, 38.658211f },  { 35.000000f, 83547, 35.843338f } } },
	{ "kodim17.png", { { 100.000000f, 140399, 40.927052f },  { 75.000000f, 100822, 38.284622f },  { 35.000000f, 83755, 35.921692f } } },
	{ "kodim18.png", { { 100.000000f, 145298, 36.728806f },  { 75.000000f, 122486, 34.681892f },  { 35.000000f, 102720, 32.151287f } } },
	{ "kodim19.png", { { 100.000000f, 140296, 40.024555f },  { 75.000000f, 107528, 36.965836f },  { 35.000000f, 89350, 34.593811f } } },
	{ "kodim20.png", { { 100.000000f, 122203, 41.429142f },  { 75.000000f, 79399, 38.525173f },  { 35.000000f, 62388, 36.222507f } } },
	{ "kodim21.png", { { 100.000000f, 140177, 38.664650f },  { 75.000000f, 104123, 36.225704f },  { 35.000000f, 85020, 33.629925f } } },
	{ "kodim22.png", { { 100.000000f, 143846, 38.921207f },  { 75.000000f, 114520, 36.468395f },  { 35.000000f, 94574, 34.228367f } } },
	{ "kodim23.png", { { 100.000000f, 139961, 42.794750f },  { 75.000000f, 89146, 40.377716f },  { 35.000000f, 75422, 38.508953f } } },
	{ "kodim24.png", { { 100.000000f, 140310, 36.486050f },  { 75.000000f, 120326, 34.828285f },  { 35.000000f, 102832, 32.087605f } } },
	{ "white_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 190480, 32.429928f },  { 75.000000f, 173407, 32.292751f },  { 35.000000f, 168150, 31.088394f } } },
	//{ "alpha0.png", { { 100.000000f, 1389, 49.883366f },  { 75.000000f, 1385, 49.125038f },  { 35.000000f, 1479, 42.865246f } } } // alpha0.png is minor nightmare for testing XUASTC LDR because it's very sensitive to tiny FP differences
};

xuastc_ldr_test_file g_xuastc_ldr_test_files_4x4[] =
{
	{ "black_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 310218, 47.030079f },  { 75.000000f, 255162, 38.170372f },  { 35.000000f, 210620, 34.740185f } } },
	{ "kodim02.png", { { 100.000000f, 294357, 47.193066f },  { 75.000000f, 194442, 40.707787f },  { 35.000000f, 163870, 38.593933f } } },
	{ "kodim03.png", { { 100.000000f, 283110, 49.651531f },  { 75.000000f, 169617, 42.514809f },  { 35.000000f, 137983, 39.903645f } } },
	{ "kodim04.png", { { 100.000000f, 301581, 47.235493f },  { 75.000000f, 197552, 40.555023f },  { 35.000000f, 170542, 38.400024f } } },
	{ "kodim05.png", { { 100.000000f, 322641, 43.768642f },  { 75.000000f, 265551, 38.349422f },  { 35.000000f, 229721, 34.853809f } } },
	{ "kodim06.png", { { 100.000000f, 297732, 46.904057f },  { 75.000000f, 222107, 39.441322f },  { 35.000000f, 183761, 36.179142f } } },
	{ "kodim07.png", { { 100.000000f, 296921, 47.893196f },  { 75.000000f, 193982, 42.567802f },  { 35.000000f, 164339, 39.916515f } } },
	{ "kodim08.png", { { 100.000000f, 321301, 44.123753f },  { 75.000000f, 266214, 38.408657f },  { 35.000000f, 227531, 34.939663f } } },
	{ "kodim09.png", { { 100.000000f, 297129, 49.033165f },  { 75.000000f, 173342, 41.962223f },  { 35.000000f, 141332, 39.750557f } } },
	{ "kodim10.png", { { 100.000000f, 299737, 48.689640f },  { 75.000000f, 185178, 41.973049f },  { 35.000000f, 156008, 39.650200f } } },
	{ "kodim11.png", { { 100.000000f, 299730, 46.588585f },  { 75.000000f, 215553, 39.980545f },  { 35.000000f, 180852, 36.994793f } } },
	{ "kodim12.png", { { 100.000000f, 289459, 49.914066f },  { 75.000000f, 175999, 42.131413f },  { 35.000000f, 145621, 39.855633f } } },
	{ "kodim13.png", { { 100.000000f, 317109, 43.169689f },  { 75.000000f, 274743, 36.435371f },  { 35.000000f, 230455, 32.394821f } } },
	{ "kodim14.png", { { 100.000000f, 311466, 44.403767f },  { 75.000000f, 241362, 38.612110f },  { 35.000000f, 206563, 35.850140f } } },
	{ "kodim15.png", { { 100.000000f, 290996, 47.307865f },  { 75.000000f, 181963, 40.791069f },  { 35.000000f, 147984, 38.407547f } } },
	{ "kodim16.png", { { 100.000000f, 293439, 49.771076f },  { 75.000000f, 198284, 41.343952f },  { 35.000000f, 163840, 38.560184f } } },
	{ "kodim17.png", { { 100.000000f, 303429, 48.048100f },  { 75.000000f, 194161, 41.256020f },  { 35.000000f, 166376, 38.627644f } } },
	{ "kodim18.png", { { 100.000000f, 316790, 43.609463f },  { 75.000000f, 237898, 38.175785f },  { 35.000000f, 205271, 35.113762f } } },
	{ "kodim19.png", { { 100.000000f, 305786, 47.092293f },  { 75.000000f, 213024, 39.941761f },  { 35.000000f, 184103, 37.369053f } } },
	{ "kodim20.png", { { 100.000000f, 259950, 48.652317f },  { 75.000000f, 155659, 41.508587f },  { 35.000000f, 124257, 38.938896f } } },
	{ "kodim21.png", { { 100.000000f, 303954, 46.846046f },  { 75.000000f, 209365, 39.592907f },  { 35.000000f, 172113, 36.425140f } } },
	{ "kodim22.png", { { 100.000000f, 312642, 45.427174f },  { 75.000000f, 221411, 39.440510f },  { 35.000000f, 189278, 36.970325f } } },
	{ "kodim23.png", { { 100.000000f, 298345, 48.780674f },  { 75.000000f, 175964, 42.915535f },  { 35.000000f, 148486, 40.830143f } } },
	{ "kodim24.png", { { 100.000000f, 302608, 44.029816f },  { 75.000000f, 229249, 39.054703f },  { 35.000000f, 196935, 35.450607f } } },
	{ "white_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 360418, 39.591961f },  { 75.000000f, 335408, 38.473557f },  { 35.000000f, 318023, 35.556229f } } },
};
xuastc_ldr_test_file g_xuastc_ldr_test_files_5x4[] =
{
	{ "black_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 249211, 44.451683f },  { 75.000000f, 210509, 36.881168f },  { 35.000000f, 168587, 33.625820f } } },
	{ "kodim02.png", { { 100.000000f, 238603, 45.184010f },  { 75.000000f, 159386, 39.738209f },  { 35.000000f, 129436, 37.669529f } } },
	{ "kodim03.png", { { 100.000000f, 230397, 47.695618f },  { 75.000000f, 136798, 41.549713f },  { 35.000000f, 110021, 39.007256f } } },
	{ "kodim04.png", { { 100.000000f, 244119, 45.411850f },  { 75.000000f, 159148, 39.640678f },  { 35.000000f, 135726, 37.497944f } } },
	{ "kodim05.png", { { 100.000000f, 260814, 41.621056f },  { 75.000000f, 219953, 37.053875f },  { 35.000000f, 187075, 33.647770f } } },
	{ "kodim06.png", { { 100.000000f, 240122, 44.883125f },  { 75.000000f, 179382, 38.298389f },  { 35.000000f, 146560, 35.105358f } } },
	{ "kodim07.png", { { 100.000000f, 241474, 45.955803f },  { 75.000000f, 157918, 41.505169f },  { 35.000000f, 134039, 38.954472f } } },
	{ "kodim08.png", { { 100.000000f, 259620, 41.868359f },  { 75.000000f, 218900, 37.081158f },  { 35.000000f, 185281, 33.697517f } } },
	{ "kodim09.png", { { 100.000000f, 240072, 47.183537f },  { 75.000000f, 136701, 41.090607f },  { 35.000000f, 111111, 38.871655f } } },
	{ "kodim10.png", { { 100.000000f, 242688, 46.832684f },  { 75.000000f, 148827, 41.053978f },  { 35.000000f, 124419, 38.726421f } } },
	{ "kodim11.png", { { 100.000000f, 243015, 44.532112f },  { 75.000000f, 175753, 38.829491f },  { 35.000000f, 144384, 35.890057f } } },
	{ "kodim12.png", { { 100.000000f, 234426, 47.991623f },  { 75.000000f, 141044, 41.192932f },  { 35.000000f, 115000, 38.965549f } } },
	{ "kodim13.png", { { 100.000000f, 253290, 40.965210f },  { 75.000000f, 226116, 35.000126f },  { 35.000000f, 184823, 31.168385f } } },
	{ "kodim14.png", { { 100.000000f, 252166, 42.261086f },  { 75.000000f, 198054, 37.443531f },  { 35.000000f, 165845, 34.783745f } } },
	{ "kodim15.png", { { 100.000000f, 236533, 45.223949f },  { 75.000000f, 146577, 39.803493f },  { 35.000000f, 118822, 37.435871f } } },
	{ "kodim16.png", { { 100.000000f, 237555, 47.910408f },  { 75.000000f, 161093, 40.372368f },  { 35.000000f, 131482, 37.610260f } } },
	{ "kodim17.png", { { 100.000000f, 245639, 46.034199f },  { 75.000000f, 155299, 40.225517f },  { 35.000000f, 132135, 37.615314f } } },
	{ "kodim18.png", { { 100.000000f, 256813, 41.648430f },  { 75.000000f, 194254, 36.990253f },  { 35.000000f, 164193, 33.996323f } } },
	{ "kodim19.png", { { 100.000000f, 247269, 45.170345f },  { 75.000000f, 170744, 38.804966f },  { 35.000000f, 144924, 36.359180f } } },
	{ "kodim20.png", { { 100.000000f, 213141, 46.714931f },  { 75.000000f, 125433, 40.431580f },  { 35.000000f, 98170, 37.925316f } } },
	{ "kodim21.png", { { 100.000000f, 244810, 44.717579f },  { 75.000000f, 168321, 38.396568f },  { 35.000000f, 135060, 35.355556f } } },
	{ "kodim22.png", { { 100.000000f, 252431, 43.553535f },  { 75.000000f, 179142, 38.341515f },  { 35.000000f, 150546, 35.956043f } } },
	{ "kodim23.png", { { 100.000000f, 242860, 46.938763f },  { 75.000000f, 142099, 42.049194f },  { 35.000000f, 119089, 39.947498f } } },
	{ "kodim24.png", { { 100.000000f, 244829, 41.747345f },  { 75.000000f, 189205, 37.679653f },  { 35.000000f, 159214, 34.212723f } } },
	{ "white_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 307678, 37.244614f },  { 75.000000f, 282188, 36.445412f },  { 35.000000f, 269165, 33.900223f } } },
};
xuastc_ldr_test_file g_xuastc_ldr_test_files_8x8[] =
{
	{ "black_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 82815, 33.129543f },  { 75.000000f, 80163, 32.320469f },  { 35.000000f, 72960, 30.570271f } } },
	{ "kodim02.png", { { 100.000000f, 78367, 37.343704f },  { 75.000000f, 64920, 36.143528f },  { 35.000000f, 51500, 34.768459f } } },
	{ "kodim03.png", { { 100.000000f, 77599, 39.404751f },  { 75.000000f, 55460, 38.039928f },  { 35.000000f, 44970, 36.254837f } } },
	{ "kodim04.png", { { 100.000000f, 80792, 37.649517f },  { 75.000000f, 64576, 36.303604f },  { 35.000000f, 54242, 34.725628f } } },
	{ "kodim05.png", { { 100.000000f, 84711, 32.105507f },  { 75.000000f, 84081, 31.671597f },  { 35.000000f, 76634, 30.126841f } } },
	{ "kodim06.png", { { 100.000000f, 79855, 34.817501f },  { 75.000000f, 69603, 33.753742f },  { 35.000000f, 61087, 31.827003f } } },
	{ "kodim07.png", { { 100.000000f, 79449, 37.754784f },  { 75.000000f, 62135, 37.021587f },  { 35.000000f, 53152, 35.554993f } } },
	{ "kodim08.png", { { 100.000000f, 84365, 31.781384f },  { 75.000000f, 81169, 31.304081f },  { 35.000000f, 74352, 29.816698f } } },
	{ "kodim09.png", { { 100.000000f, 78971, 38.773418f },  { 75.000000f, 53689, 37.463520f },  { 35.000000f, 43699, 35.936676f } } },
	{ "kodim10.png", { { 100.000000f, 80147, 38.478813f },  { 75.000000f, 59821, 37.286610f },  { 35.000000f, 49992, 35.712532f } } },
	{ "kodim11.png", { { 100.000000f, 80255, 35.045494f },  { 75.000000f, 70796, 34.217140f },  { 35.000000f, 60030, 32.591511f } } },
	{ "kodim12.png", { { 100.000000f, 78152, 39.493549f },  { 75.000000f, 58381, 37.853058f },  { 35.000000f, 46241, 36.070549f } } },
	{ "kodim13.png", { { 100.000000f, 83603, 29.707319f },  { 75.000000f, 83231, 29.235767f },  { 35.000000f, 77262, 27.668018f } } },
	{ "kodim14.png", { { 100.000000f, 82796, 33.518745f },  { 75.000000f, 80312, 32.885574f },  { 35.000000f, 70597, 31.453365f } } },
	{ "kodim15.png", { { 100.000000f, 79262, 37.283611f },  { 75.000000f, 59147, 36.219261f },  { 35.000000f, 48554, 34.670193f } } },
	{ "kodim16.png", { { 100.000000f, 78792, 38.528458f },  { 75.000000f, 65336, 36.765572f },  { 35.000000f, 54384, 34.544426f } } },
	{ "kodim17.png", { { 100.000000f, 81297, 37.139481f },  { 75.000000f, 65278, 36.174728f },  { 35.000000f, 55032, 34.575806f } } },
	{ "kodim18.png", { { 100.000000f, 83288, 32.887947f },  { 75.000000f, 75361, 32.249966f },  { 35.000000f, 65759, 30.717367f } } },
	{ "kodim19.png", { { 100.000000f, 80857, 36.188713f },  { 75.000000f, 65937, 34.959888f },  { 35.000000f, 56324, 33.180534f } } },
	{ "kodim20.png", { { 100.000000f, 72423, 37.353615f },  { 75.000000f, 49889, 36.328712f },  { 35.000000f, 41065, 34.822941f } } },
	{ "kodim21.png", { { 100.000000f, 80646, 34.472473f },  { 75.000000f, 63150, 33.743328f },  { 35.000000f, 52850, 32.177635f } } },
	{ "kodim22.png", { { 100.000000f, 82579, 35.452717f },  { 75.000000f, 71076, 34.477604f },  { 35.000000f, 60499, 32.928665f } } },
	{ "kodim23.png", { { 100.000000f, 80795, 39.518650f },  { 75.000000f, 57122, 38.509109f },  { 35.000000f, 48485, 37.112495f } } },
	{ "kodim24.png", { { 100.000000f, 80427, 32.505745f },  { 75.000000f, 73730, 32.054939f },  { 35.000000f, 65558, 30.470564f } } },
	{ "white_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 112186, 29.022635f },  { 75.000000f, 109799, 29.001532f },  { 35.000000f, 109059, 28.538498f } } },
};
xuastc_ldr_test_file g_xuastc_ldr_test_files_10x5[] =
{
	{ "black_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 105404, 34.920200f },  { 75.000000f, 100965, 33.497791f },  { 35.000000f, 90611, 31.226894f } } },
	{ "kodim02.png", { { 100.000000f, 99914, 38.595970f },  { 75.000000f, 80665, 36.986778f },  { 35.000000f, 64270, 35.383049f } } },
	{ "kodim03.png", { { 100.000000f, 98251, 40.790932f },  { 75.000000f, 67869, 38.898525f },  { 35.000000f, 54886, 36.762691f } } },
	{ "kodim04.png", { { 100.000000f, 102414, 38.946281f },  { 75.000000f, 79893, 37.033978f },  { 35.000000f, 66785, 35.246025f } } },
	{ "kodim05.png", { { 100.000000f, 108302, 33.642941f },  { 75.000000f, 104798, 32.862797f },  { 35.000000f, 95050, 30.865231f } } },
	{ "kodim06.png", { { 100.000000f, 101243, 36.626984f },  { 75.000000f, 85666, 34.866810f },  { 35.000000f, 71982, 32.394196f } } },
	{ "kodim07.png", { { 100.000000f, 101129, 39.211941f },  { 75.000000f, 76369, 38.055550f },  { 35.000000f, 65894, 36.308075f } } },
	{ "kodim08.png", { { 100.000000f, 107566, 33.244900f },  { 75.000000f, 101592, 32.423939f },  { 35.000000f, 92874, 30.506023f } } },
	{ "kodim09.png", { { 100.000000f, 100574, 40.205162f },  { 75.000000f, 63935, 38.267521f },  { 35.000000f, 52720, 36.494003f } } },
	{ "kodim10.png", { { 100.000000f, 101792, 39.791870f },  { 75.000000f, 74618, 38.100864f },  { 35.000000f, 60932, 36.214828f } } },
	{ "kodim11.png", { { 100.000000f, 101858, 36.660149f },  { 75.000000f, 86801, 35.305096f },  { 35.000000f, 72462, 33.252529f } } },
	{ "kodim12.png", { { 100.000000f, 99075, 40.883018f },  { 75.000000f, 69568, 38.559566f },  { 35.000000f, 54291, 36.616749f } } },
	{ "kodim13.png", { { 100.000000f, 106502, 31.561871f },  { 75.000000f, 106013, 30.642658f },  { 35.000000f, 95531, 28.429173f } } },
	{ "kodim14.png", { { 100.000000f, 105379, 35.074528f },  { 75.000000f, 98775, 33.989864f },  { 35.000000f, 84924, 32.170376f } } },
	{ "kodim15.png", { { 100.000000f, 100550, 38.506466f },  { 75.000000f, 73302, 36.981686f },  { 35.000000f, 60268, 35.197380f } } },
	{ "kodim16.png", { { 100.000000f, 99833, 40.386166f },  { 75.000000f, 79010, 37.707489f },  { 35.000000f, 63900, 35.129288f } } },
	{ "kodim17.png", { { 100.000000f, 102975, 38.561710f },  { 75.000000f, 79270, 37.071556f },  { 35.000000f, 66965, 35.134377f } } },
	{ "kodim18.png", { { 100.000000f, 107301, 34.268379f },  { 75.000000f, 95912, 33.241734f },  { 35.000000f, 83236, 31.308125f } } },
	{ "kodim19.png", { { 100.000000f, 103796, 37.636776f },  { 75.000000f, 82419, 35.821537f },  { 35.000000f, 69996, 33.751148f } } },
	{ "kodim20.png", { { 100.000000f, 91331, 38.943798f },  { 75.000000f, 61619, 37.297562f },  { 35.000000f, 49093, 35.451199f } } },
	{ "kodim21.png", { { 100.000000f, 102857, 36.242493f },  { 75.000000f, 77121, 34.898647f },  { 35.000000f, 64434, 32.857597f } } },
	{ "kodim22.png", { { 100.000000f, 104989, 36.767838f },  { 75.000000f, 88040, 35.332642f },  { 35.000000f, 74724, 33.503368f } } },
	{ "kodim23.png", { { 100.000000f, 102295, 40.710884f },  { 75.000000f, 71039, 39.289032f },  { 35.000000f, 60360, 37.647507f } } },
	{ "kodim24.png", { { 100.000000f, 102518, 34.120747f },  { 75.000000f, 92503, 33.321411f },  { 35.000000f, 81974, 31.218332f } } },
	{ "white_1x1.png", { { 100.000000f, 142, 100.000000f },  { 75.000000f, 143, 100.000000f },  { 35.000000f, 143, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 138617, 30.214272f },  { 75.000000f, 130237, 30.166813f },  { 35.000000f, 127678, 29.492228f } } },
};
xuastc_ldr_test_file g_xuastc_ldr_test_files_10x10[] =
{
	{ "black_1x1.png", { { 100.000000f, 164, 100.000000f },  { 75.000000f, 165, 100.000000f },  { 35.000000f, 165, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 53866, 30.283733f },  { 75.000000f, 53616, 30.075840f },  { 35.000000f, 50347, 29.163128f } } },
	{ "kodim02.png", { { 100.000000f, 51026, 35.123016f },  { 75.000000f, 46980, 34.621269f },  { 35.000000f, 37703, 33.580551f } } },
	{ "kodim03.png", { { 100.000000f, 51031, 36.793110f },  { 75.000000f, 41431, 36.207535f },  { 35.000000f, 34960, 35.044708f } } },
	{ "kodim04.png", { { 100.000000f, 53041, 35.332870f },  { 75.000000f, 46533, 34.796043f },  { 35.000000f, 39862, 33.541615f } } },
	{ "kodim05.png", { { 100.000000f, 55189, 29.119299f },  { 75.000000f, 55108, 29.015081f },  { 35.000000f, 51969, 28.237648f } } },
	{ "kodim06.png", { { 100.000000f, 51951, 31.890593f },  { 75.000000f, 48228, 31.475647f },  { 35.000000f, 43607, 30.357023f } } },
	{ "kodim07.png", { { 100.000000f, 51629, 35.143024f },  { 75.000000f, 45495, 34.901260f },  { 35.000000f, 39163, 33.916348f } } },
	{ "kodim08.png", { { 100.000000f, 54592, 28.505661f },  { 75.000000f, 54535, 28.359890f },  { 35.000000f, 51421, 27.674751f } } },
	{ "kodim09.png", { { 100.000000f, 51854, 35.922009f },  { 75.000000f, 40015, 35.579926f },  { 35.000000f, 34664, 34.545792f } } },
	{ "kodim10.png", { { 100.000000f, 52237, 35.590847f },  { 75.000000f, 44712, 35.157581f },  { 35.000000f, 37465, 34.189934f } } },
	{ "kodim11.png", { { 100.000000f, 53091, 32.386562f },  { 75.000000f, 49709, 32.083656f },  { 35.000000f, 43594, 31.182316f } } },
	{ "kodim12.png", { { 100.000000f, 50822, 36.772594f },  { 75.000000f, 43481, 36.005375f },  { 35.000000f, 35465, 34.854721f } } },
	{ "kodim13.png", { { 100.000000f, 54490, 26.917747f },  { 75.000000f, 54727, 26.806589f },  { 35.000000f, 52410, 26.057467f } } },
	{ "kodim14.png", { { 100.000000f, 54156, 30.993803f },  { 75.000000f, 53868, 30.794903f },  { 35.000000f, 50038, 29.964369f } } },
	{ "kodim15.png", { { 100.000000f, 52157, 35.004284f },  { 75.000000f, 43205, 34.554562f },  { 35.000000f, 36555, 33.478485f } } },
	{ "kodim16.png", { { 100.000000f, 51024, 35.731007f },  { 75.000000f, 46169, 34.875183f },  { 35.000000f, 40174, 33.368984f } } },
	{ "kodim17.png", { { 100.000000f, 53562, 34.584801f },  { 75.000000f, 46775, 34.203426f },  { 35.000000f, 40370, 33.207817f } } },
	{ "kodim18.png", { { 100.000000f, 54710, 30.220909f },  { 75.000000f, 52152, 30.071476f },  { 35.000000f, 47304, 29.228931f } } },
	{ "kodim19.png", { { 100.000000f, 52609, 33.399029f },  { 75.000000f, 46521, 32.911697f },  { 35.000000f, 40742, 31.708160f } } },
	{ "kodim20.png", { { 100.000000f, 48131, 34.454784f },  { 75.000000f, 38410, 34.073807f },  { 35.000000f, 32410, 33.349335f } } },
	{ "kodim21.png", { { 100.000000f, 52704, 31.636679f },  { 75.000000f, 45878, 31.425013f },  { 35.000000f, 39147, 30.604250f } } },
	{ "kodim22.png", { { 100.000000f, 53864, 33.018543f },  { 75.000000f, 49948, 32.652431f },  { 35.000000f, 42747, 31.578960f } } },
	{ "kodim23.png", { { 100.000000f, 52922, 36.926800f },  { 75.000000f, 42386, 36.554390f },  { 35.000000f, 36771, 35.552139f } } },
	{ "kodim24.png", { { 100.000000f, 52621, 29.655001f },  { 75.000000f, 51282, 29.539488f },  { 35.000000f, 46518, 28.826057f } } },
	{ "white_1x1.png", { { 100.000000f, 164, 100.000000f },  { 75.000000f, 165, 100.000000f },  { 35.000000f, 165, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 86446, 26.514196f },  { 75.000000f, 82331, 26.514242f },  { 35.000000f, 83217, 26.387506f } } },
};
xuastc_ldr_test_file g_xuastc_ldr_test_files_12x12[] =
{
	{ "black_1x1.png", { { 100.000000f, 164, 100.000000f },  { 75.000000f, 165, 100.000000f },  { 35.000000f, 165, 100.000000f } } },
	{ "kodim01.png", { { 100.000000f, 37797, 28.798088f },  { 75.000000f, 37597, 28.722265f },  { 35.000000f, 36100, 28.216297f } } },
	{ "kodim02.png", { { 100.000000f, 35764, 33.883194f },  { 75.000000f, 34288, 33.613396f },  { 35.000000f, 28049, 32.870983f } } },
	{ "kodim03.png", { { 100.000000f, 35991, 35.376232f },  { 75.000000f, 30705, 35.071907f },  { 35.000000f, 26302, 34.256138f } } },
	{ "kodim04.png", { { 100.000000f, 37256, 33.985607f },  { 75.000000f, 34480, 33.726845f },  { 35.000000f, 30001, 32.846050f } } },
	{ "kodim05.png", { { 100.000000f, 38362, 27.451393f },  { 75.000000f, 38445, 27.405621f },  { 35.000000f, 37828, 27.075932f } } },
	{ "kodim06.png", { { 100.000000f, 36824, 30.414103f },  { 75.000000f, 35002, 30.223726f },  { 35.000000f, 32224, 29.430540f } } },
	{ "kodim07.png", { { 100.000000f, 36160, 33.560291f },  { 75.000000f, 33870, 33.467850f },  { 35.000000f, 29863, 32.859840f } } },
	{ "kodim08.png", { { 100.000000f, 37995, 26.794462f },  { 75.000000f, 38093, 26.760965f },  { 35.000000f, 37094, 26.328840f } } },
	{ "kodim09.png", { { 100.000000f, 36401, 34.493057f },  { 75.000000f, 29870, 34.332375f },  { 35.000000f, 26454, 33.613277f } } },
	{ "kodim10.png", { { 100.000000f, 36501, 33.844082f },  { 75.000000f, 32742, 33.686195f },  { 35.000000f, 28238, 33.049423f } } },
	{ "kodim11.png", { { 100.000000f, 37149, 30.947369f },  { 75.000000f, 36099, 30.802794f },  { 35.000000f, 32881, 30.267765f } } },
	{ "kodim12.png", { { 100.000000f, 35849, 35.354534f },  { 75.000000f, 33053, 34.918404f },  { 35.000000f, 26873, 34.069679f } } },
	{ "kodim13.png", { { 100.000000f, 37949, 25.461622f },  { 75.000000f, 37959, 25.415657f },  { 35.000000f, 38216, 25.047762f } } },
	{ "kodim14.png", { { 100.000000f, 37660, 29.483248f },  { 75.000000f, 37843, 29.437609f },  { 35.000000f, 36214, 28.999678f } } },
	{ "kodim15.png", { { 100.000000f, 36649, 33.611992f },  { 75.000000f, 31835, 33.415279f },  { 35.000000f, 27625, 32.736401f } } },
	{ "kodim16.png", { { 100.000000f, 35972, 34.145802f },  { 75.000000f, 33835, 33.685509f },  { 35.000000f, 29950, 32.574253f } } },
	{ "kodim17.png", { { 100.000000f, 37435, 33.135811f },  { 75.000000f, 34680, 32.991879f },  { 35.000000f, 30935, 32.323273f } } },
	{ "kodim18.png", { { 100.000000f, 37958, 28.844978f },  { 75.000000f, 37232, 28.796362f },  { 35.000000f, 34487, 28.304411f } } },
	{ "kodim19.png", { { 100.000000f, 36608, 31.887293f },  { 75.000000f, 34105, 31.679951f },  { 35.000000f, 29955, 30.871086f } } },
	{ "kodim20.png", { { 100.000000f, 34010, 32.896221f },  { 75.000000f, 28133, 32.748100f },  { 35.000000f, 24280, 32.296890f } } },
	{ "kodim21.png", { { 100.000000f, 36704, 30.122864f },  { 75.000000f, 34125, 30.046625f },  { 35.000000f, 29272, 29.595934f } } },
	{ "kodim22.png", { { 100.000000f, 37758, 31.691223f },  { 75.000000f, 35986, 31.529528f },  { 35.000000f, 32299, 30.867397f } } },
	{ "kodim23.png", { { 100.000000f, 37121, 35.387283f },  { 75.000000f, 31453, 35.222927f },  { 35.000000f, 27471, 34.600704f } } },
	{ "kodim24.png", { { 100.000000f, 36877, 28.162710f },  { 75.000000f, 36580, 28.106171f },  { 35.000000f, 34104, 27.782391f } } },
	{ "white_1x1.png", { { 100.000000f, 164, 100.000000f },  { 75.000000f, 165, 100.000000f },  { 35.000000f, 165, 100.000000f } } },
	{ "wikipedia.png", { { 100.000000f, 64288, 24.992327f },  { 75.000000f, 62309, 24.994276f },  { 35.000000f, 61714, 24.962925f } } },
};


static bool test_mode_xuastc_ldr(command_line_params& opts)
{
	uint32_t total_mismatches = 0;

	// Minor differences in how floating point code is optimized can result in slightly different generated files.

	// XUASTC LDR's IDCT is currently float - at low q's and high (>48) dB's tiny differences during decompression are noticeable
	const float XUASTC_PSNR_THRESHOLD = 1.0f;
	const float XUASTC_FILESIZE_THRESHOLD = .045f;

	// Dump mode (-test_xuastc_dump): run the compressor across all block sizes and print the
	// expected-value tables (copy/paste into the code below), then return without validating.
	// Uses g_xuastc_ldr_test_files_6x6 for the shared file list (filenames + DCT q's).
	if (opts.m_xuastc_test_dump)
	{
		const struct { basist::basis_tex_format m_fmt; const char* m_pName; } block_sizes[] =
		{
			{ basist::basis_tex_format::cXUASTC_LDR_4x4, "4x4" },
			{ basist::basis_tex_format::cXUASTC_LDR_5x4, "5x4" },
			{ basist::basis_tex_format::cXUASTC_LDR_6x6, "6x6" },
			{ basist::basis_tex_format::cXUASTC_LDR_8x8, "8x8" },
			{ basist::basis_tex_format::cXUASTC_LDR_10x5, "10x5" },
			{ basist::basis_tex_format::cXUASTC_LDR_10x10, "10x10" },
			{ basist::basis_tex_format::cXUASTC_LDR_12x12, "12x12" },
		};

		const uint32_t effort_level = 8;
		const bool use_srgb_metrics = false; // false = linear (1,1,1,1) weights

		for (uint32_t bs = 0; bs < std::size(block_sizes); bs++)
		{
			fmt_printf("\nxuastc_ldr_test_file g_xuastc_ldr_test_files_{}[] =\n{{\n", block_sizes[bs].m_pName);

			for (uint32_t i = 0; i < std::size(g_xuastc_ldr_test_files_6x6); i++)
			{
				const auto& test_file = g_xuastc_ldr_test_files_6x6[i];

				std::string filename(opts.m_test_file_dir);
				if (filename.size())
					filename.push_back('/');
				filename += std::string(test_file.m_pFilename);

				basisu::vector<image> source_images(1);
				if (!load_png(filename.c_str(), source_images[0]))
				{
					error_printf("Failed loading test image \"%s\"\n", filename.c_str());
					return false;
				}

				uint32_t run_sizes[XUASTC_LDR_TEST_FILE_NUM_RUNS];
				float run_psnrs[XUASTC_LDR_TEST_FILE_NUM_RUNS];

				for (uint32_t run_index = 0; run_index < XUASTC_LDR_TEST_FILE_NUM_RUNS; run_index++)
				{
					const auto& test_run = test_file.m_test_runs[run_index];

					uint32_t flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagPrintStats | cFlagPrintStatus | (use_srgb_metrics ? cFlagSRGB : 0);
					flags_and_quality |= effort_level;

					float uastc_rdo_quality = (test_run.m_dct_q < 100.0f) ? test_run.m_dct_q : 0.0f;
					size_t data_size = 0;
					image_stats stats;

					void* pData = basis_compress(block_sizes[bs].m_fmt, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
					if (!pData)
					{
						error_printf("basis_compress() failed!\n");
						return false;
					}
					basis_free_data(pData);

					run_sizes[run_index] = (uint32_t)data_size;
					run_psnrs[run_index] = stats.m_basis_rgba_avg_psnr;
				}

				fmt_printf("\t{{ \"{}\", {{", test_file.m_pFilename);
				for (uint32_t run_index = 0; run_index < XUASTC_LDR_TEST_FILE_NUM_RUNS; run_index++)
				{
					fmt_printf(" {{ {}f, {}, {}f }", test_file.m_test_runs[run_index].m_dct_q, run_sizes[run_index], run_psnrs[run_index]);
					if (run_index != (XUASTC_LDR_TEST_FILE_NUM_RUNS - 1))
						fmt_printf(", ");
				}
				fmt_printf(" } },\n");
			}

			fmt_printf("};\n");
		}

		return true;
	}

	const bool use_srgb_metrics = false; // false = linear (1,1,1,1) weights, true = sRGB perceptual (9,11,1,11)
	const uint32_t effort_level = 8;

	// Validate each block size against its stored expected-value table.
	struct block_size_test
	{
		basist::basis_tex_format m_fmt;
		const char* m_pName;
		const xuastc_ldr_test_file* m_pFiles;
		uint32_t m_num_files;
	};

	const block_size_test block_sizes[] =
	{
		{ basist::basis_tex_format::cXUASTC_LDR_4x4, "4x4", g_xuastc_ldr_test_files_4x4, (uint32_t)std::size(g_xuastc_ldr_test_files_4x4) },
		{ basist::basis_tex_format::cXUASTC_LDR_5x4, "5x4", g_xuastc_ldr_test_files_5x4, (uint32_t)std::size(g_xuastc_ldr_test_files_5x4) },
		{ basist::basis_tex_format::cXUASTC_LDR_6x6, "6x6", g_xuastc_ldr_test_files_6x6, (uint32_t)std::size(g_xuastc_ldr_test_files_6x6) },
		{ basist::basis_tex_format::cXUASTC_LDR_8x8, "8x8", g_xuastc_ldr_test_files_8x8, (uint32_t)std::size(g_xuastc_ldr_test_files_8x8) },
		{ basist::basis_tex_format::cXUASTC_LDR_10x5, "10x5", g_xuastc_ldr_test_files_10x5, (uint32_t)std::size(g_xuastc_ldr_test_files_10x5) },
		{ basist::basis_tex_format::cXUASTC_LDR_10x10, "10x10", g_xuastc_ldr_test_files_10x10, (uint32_t)std::size(g_xuastc_ldr_test_files_10x10) },
		{ basist::basis_tex_format::cXUASTC_LDR_12x12, "12x12", g_xuastc_ldr_test_files_12x12, (uint32_t)std::size(g_xuastc_ldr_test_files_12x12) },
	};

	for (uint32_t bs = 0; bs < std::size(block_sizes); bs++)
	{
		const block_size_test& bsize = block_sizes[bs];

		for (uint32_t i = 0; i < bsize.m_num_files; i++)
		{
			const xuastc_ldr_test_file& test_file = bsize.m_pFiles[i];

			std::string filename(opts.m_test_file_dir);
			if (filename.size())
				filename.push_back('/');
			filename += std::string(test_file.m_pFilename);

			basisu::vector<image> source_images(1);
			image& source_image = source_images[0];
			if (!load_png(filename.c_str(), source_image))
			{
				error_printf("Failed loading test image \"%s\"\n", filename.c_str());
				return false;
			}

			printf("Loaded file \"%s\", dimensions %ux%u has alpha: %u\n", filename.c_str(), source_image.get_width(), source_image.get_height(), source_image.has_alpha());

			image_stats stats;

			for (uint32_t run_index = 0; run_index < XUASTC_LDR_TEST_FILE_NUM_RUNS; run_index++)
			{
				const auto& test_run = test_file.m_test_runs[run_index];

				uint32_t flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagPrintStats | cFlagPrintStatus | (use_srgb_metrics ? cFlagSRGB : 0);
				flags_and_quality |= effort_level;

				float uastc_rdo_quality = (test_run.m_dct_q < 100.0f) ? test_run.m_dct_q : 0.0f;
				size_t data_size = 0;

				fmt_printf("**** Testing XUASTC LDR {}, DCT q {}, effort {}\n", bsize.m_pName, test_run.m_dct_q, effort_level);

				void* pData = basis_compress(bsize.m_fmt, source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
				if (!pData)
				{
					error_printf("basis_compress() failed!\n");
					return false;
				}
				basis_free_data(pData);

				fmt_printf("XUASTC Size: {} (expected {}), RGBA PSNR: {3.3} dB (expected {3.3} dB)\n",
					(uint32_t)data_size, test_run.m_comp_size,
					stats.m_basis_rgba_avg_psnr, test_run.m_rgba_psnr);

				float file_size_ratio = fabs((data_size / (float)test_run.m_comp_size) - 1.0f);
				if (file_size_ratio > XUASTC_FILESIZE_THRESHOLD)
				{
					fmt_error_printf("Mismatch: XUASTC LDR {} expected file size {}, but got {} instead!\n", bsize.m_pName, test_run.m_comp_size, (uint32_t)data_size);
					total_mismatches++;
				}

				if (fabs(stats.m_basis_rgba_avg_psnr - test_run.m_rgba_psnr) > XUASTC_PSNR_THRESHOLD)
				{
					fmt_error_printf("Mismatch: XUASTC LDR {} expected RGBA Avg PSNR {}, but got {} instead!\n", bsize.m_pName, test_run.m_rgba_psnr, stats.m_basis_rgba_avg_psnr);
					total_mismatches++;
				}
			}
		}
	}

	printf("Total XUASTC LDR mismatches: %u\n", total_mismatches);

	bool result = true;
	if (total_mismatches)
	{
		error_printf("XUASTC LDR test FAILED\n");
		result = false;
	}
	else
	{
		printf("XUASTC LDR test succeeded\n");
	}

	return result;
}

static bool clbench_mode(command_line_params& opts)
{
	BASISU_NOTE_UNUSED(opts);
	
	bool opencl_failed = false;
	bool use_cl = basis_benchmark_etc1s_opencl(&opencl_failed);
	if (use_cl)
		printf("OpenCL ETC1S encoding is faster on this machine\n");
	else
	{
		if (opencl_failed)
			printf("OpenCL failed!\n");
		printf("CPU ETC1S encoding is faster on this machine\n");
	}

	return true;
}

// ---------------------------------------------------------------------------------------------------------------------
// -test_codecs / -test_codecs_gen
//
// Sweeps every supported LDR and HDR codec across a quality x effort grid, driving the basis_compressor DIRECTLY
// (filenames in, m_compute_stats + m_validate_output_data on). The compressor transcodes each result to >=2 formats and
// computes their PSNRs. -test_codecs_gen writes the golden expected values to basisu_tool_test_codecs.inl; -test_codecs
// re-runs the sweep and compares against that table (with build/OS/compiler-divergence tolerances).
// ---------------------------------------------------------------------------------------------------------------------

struct codec_test_case
{
	const char* m_pFilename;
	basist::basis_tex_format m_fmt;
	int m_quality;			// [1,100]
	int m_effort;			// [0,100]
	bool m_hdr;
	uint32_t m_size;		// expected KTX2 size, bytes
	float m_rgb_psnr;		// LDR: native RGB Avg | HDR: native ASTC-HDR log2
	float m_rgba_psnr;		// LDR: native RGBA Avg | HDR: -1 (n/a)
	float m_2nd_psnr;		// LDR: transcoded BC7 RGBA Avg | HDR: transcoded BC6H log2
};

#include "basisu_tool_test_codecs.inl"

// The codec sweep (also used to emit the golden table). Order is LDR codecs first, then HDR.
struct codec_sweep_desc { basist::basis_tex_format m_fmt; const char* m_pEnum_name; bool m_hdr; };
static const codec_sweep_desc g_codec_sweep[] =
{
	{ basist::basis_tex_format::cETC1S,						"cETC1S",						false },
	{ basist::basis_tex_format::cUASTC_LDR_4x4,				"cUASTC_LDR_4x4",				false },
	{ basist::basis_tex_format::cXUBC7,						"cXUBC7",						false },
	{ basist::basis_tex_format::cASTC_LDR_4x4,				"cASTC_LDR_4x4",				false },
	{ basist::basis_tex_format::cASTC_LDR_6x6,				"cASTC_LDR_6x6",				false },
	{ basist::basis_tex_format::cASTC_LDR_10x10,			"cASTC_LDR_10x10",				false },
	{ basist::basis_tex_format::cASTC_LDR_12x12,			"cASTC_LDR_12x12",				false },
	{ basist::basis_tex_format::cXUASTC_LDR_4x4,			"cXUASTC_LDR_4x4",				false },
	{ basist::basis_tex_format::cXUASTC_LDR_6x6,			"cXUASTC_LDR_6x6",				false },
	{ basist::basis_tex_format::cXUASTC_LDR_10x10,			"cXUASTC_LDR_10x10",			false },
	{ basist::basis_tex_format::cXUASTC_LDR_12x12,			"cXUASTC_LDR_12x12",			false },
	{ basist::basis_tex_format::cUASTC_HDR_4x4,				"cUASTC_HDR_4x4",				true },
	{ basist::basis_tex_format::cASTC_HDR_6x6,				"cASTC_HDR_6x6",				true },
	{ basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE,"cUASTC_HDR_6x6_INTERMEDIATE",	true },
};

static const char* g_codec_ldr_test_files[] = { "kodim03.png", "kodim23.png", "kodim18.png", "alpha0.png", "wikipedia.png", "black_1x1.png" };
static const char* g_codec_hdr_test_files[] = { "Desk.exr", "atrium.exr", "yucca.exr", "kodim18.png" }; // kodim18.png is auto-upconverted LDR->linear->100 nit HDR
static const int g_codec_test_qualities[] = { 10, 25, 50, 75, 100 };
static const int g_codec_test_efforts[] = { 0, 3, 6 };

// Case-insensitive token-boundary match: filter matches at the start of pName or immediately after a '_'.
// So "ASTC" matches "ASTC_LDR_4x4" but NOT "XUASTC_LDR_4x4"/"UASTC_HDR_4x4"; "XUASTC" matches all XUASTC sizes; "HDR" matches all *_HDR_*.
static bool codec_name_matches_filter(const char* pName, const std::string& filter)
{
	if (filter.empty())
		return true;
	std::string n(pName), f(filter);
	for (char& c : n) c = (char)toupper((uint8_t)c);
	for (char& c : f) c = (char)toupper((uint8_t)c);
	size_t pos = 0;
	while ((pos = n.find(f, pos)) != std::string::npos)
	{
		if ((pos == 0) || (n[pos - 1] == '_'))
			return true;
		pos++;
	}
	return false;
}

// Short (no leading 'c') enum name for a format, for filtering/reporting.
static const char* codec_short_name(basist::basis_tex_format fmt)
{
	for (const auto& d : g_codec_sweep)
		if (d.m_fmt == fmt)
			return d.m_pEnum_name + 1; // skip leading 'c'
	return "?";
}

// Pull the headline (native) + 2nd-format PSNRs out of an image_stats, per LDR/HDR.
static void codec_extract_psnrs(const basisu::image_stats& s, bool hdr, float& rgb, float& rgba, float& second)
{
	if (hdr)
	{
		rgb = s.m_basis_rgb_avg_astc_hdr_log2_psnr;
		rgba = -1.0f;
		second = s.m_basis_rgb_avg_bc6h_log2_psnr;
	}
	else
	{
		rgb = s.m_basis_rgb_avg_psnr;
		rgba = s.m_basis_rgba_avg_psnr;
		second = s.m_bc7_rgba_avg_psnr;
	}
}

// Run one case via the compressor directly. Returns false on compress failure.
static bool run_codec_test_case(basisu::job_pool& jp, const std::string& dir, const char* pFilename,
	basist::basis_tex_format fmt, [[maybe_unused]] bool hdr, int quality, int effort,
	uint32_t& out_size, basisu::image_stats& out_stats, double& out_time_ms)
{
	out_time_ms = 0.0;

	std::string path(dir);
	if (path.size())
		path.push_back('/');
	path += pFilename;

	basis_compressor_params params;
	params.m_pJob_pool = &jp;
	params.m_multithreading = true;
	params.m_read_source_images = true;					// let the compressor load the file (and upconvert LDR->HDR when m_hdr is set)
	params.m_source_filenames.push_back(path);
	params.m_create_ktx2_file = true;					// measure the .KTX2 file size
	params.m_write_output_basis_or_ktx2_files = false;	// keep it in memory only
	params.m_compute_stats = true;						// fill image_stats (native + transcoded BC7/BC6H PSNRs)
	params.m_print_stats = false;
	params.m_validate_output_data = true;				// validate the encoded output
	params.m_perceptual = true;							// sRGB-style metrics (held constant for gen + run)
	params.m_status_output = false;
	params.m_debug = false;

	// Sets m_hdr/m_uastc and maps quality[1,100]/effort[0,100] to the codec's low-level knobs.
	if (!params.set_format_mode_and_quality_effort(fmt, quality, effort, true))
		return false;

	interval_timer tm;
	tm.start();

	basis_compressor comp;
	if (!comp.init(params))
		return false;

	if (comp.process() != basis_compressor::cECSuccess)
		return false;

	out_time_ms = tm.get_elapsed_ms();

	out_size = (uint32_t)comp.get_output_ktx2_file().size();

	const basisu::vector<basisu::image_stats>& sv = comp.get_stats();
	if (!sv.size())
		return false;
	out_stats = sv[0];

	return true;
}

static uint32_t codec_test_num_threads()
{
	//uint32_t n = std::thread::hardware_concurrency();
	uint32_t n = get_num_hardware_threads();
	return n ? n : 1;
}

// Returns the path prefix to the repo root so -test_codecs works whether run from the repo
// root ("") or the bin/ subdir ("../"). Probes for test_files/kodim03.png.
static std::string codec_test_root_prefix()
{
	FILE* f = fopen_safe("test_files/kodim03.png", "rb");
	if (f) { fclose(f); return ""; }
	f = fopen_safe("../test_files/kodim03.png", "rb");
	if (f) { fclose(f); return "../"; }
	return ""; // fallback: repo-root-relative
}

static bool test_codecs_generate(command_line_params& opts)
{
	const std::string dir = opts.m_test_dir_explicit ? opts.m_test_file_dir : (codec_test_root_prefix() + "test_files");
	const std::string out_path = opts.m_test_codecs_gen_filename.size() ? opts.m_test_codecs_gen_filename : (codec_test_root_prefix() + "basisu_tool_test_codecs.inl");

	fmt_printf("Generating codec test table: dir \"{}\", output \"{}\"", dir, out_path);
	if (opts.m_codec_filter.size())
		fmt_printf(", codec filter \"{}\"", opts.m_codec_filter);
	fmt_printf("\n");

	FILE* pFile = fopen_safe(out_path.c_str(), "wb");
	if (!pFile)
	{
		error_printf("Failed creating output file \"%s\"\n", out_path.c_str());
		return false;
	}

	fprintf(pFile, "// basisu_tool_test_codecs.inl\n");
	fprintf(pFile, "//\n// AUTO-GENERATED by: basisu -test_codecs_gen [outfile.inl] [-test_dir <dir>] [codec_filter]\n");
	fprintf(pFile, "// Do NOT edit by hand. Regenerate whenever a codec changes its output.\n");
	fprintf(pFile, "//\n// Row: file, basis_tex_format, quality[1,100], effort[0,100], is_hdr, ktx2_size,\n");
	fprintf(pFile, "//      rgb_psnr (LDR native RGB | HDR ASTC-HDR log2), rgba_psnr (LDR native RGBA | HDR -1),\n");
	fprintf(pFile, "//      2nd_psnr (LDR BC7 RGBA | HDR BC6H log2).\n//\n");
	fprintf(pFile, "static const codec_test_case g_codec_test_cases[] =\n{\n");

	basisu::job_pool jp(codec_test_num_threads());

	uint32_t total = 0, fails = 0;

	for (const auto& codec : g_codec_sweep)
	{
		if (!codec_name_matches_filter(codec.m_pEnum_name + 1, opts.m_codec_filter))
			continue;
				
		const char* const* pFiles = codec.m_hdr ? g_codec_hdr_test_files : g_codec_ldr_test_files;
		const uint32_t num_files = codec.m_hdr ? (uint32_t)std::size(g_codec_hdr_test_files) : (uint32_t)std::size(g_codec_ldr_test_files);

		fprintf(pFile, "\t// ---- %s ----\n", codec.m_pEnum_name + 1);

		for (uint32_t fi = 0; fi < num_files; fi++)
		{
			for (int q : g_codec_test_qualities)
			{
				for (int e : g_codec_test_efforts)
				{
					uint32_t size = 0;
					basisu::image_stats stats;
					double elapsed_ms = 0.0;

					if (!run_codec_test_case(jp, dir, pFiles[fi], codec.m_fmt, codec.m_hdr, q, e, size, stats, elapsed_ms))
					{
						fmt_printf("COMPRESS FAILED: {} {} q{} e{}\n", codec.m_pEnum_name + 1, pFiles[fi], q, e);
						fprintf(pFile, "\t// COMPRESS FAILED: { \"%s\", basist::basis_tex_format::%s, %d, %d, %s },\n",
							pFiles[fi], codec.m_pEnum_name, q, e, codec.m_hdr ? "true" : "false");
						fails++;
						total++;
						continue;
					}

					float rgb, rgba, second;
					codec_extract_psnrs(stats, codec.m_hdr, rgb, rgba, second);

					// Progress: print every ~10 runs unless the user passed -quiet/-no_status_output (m_status_output==false).
					if (opts.m_comp_params.m_status_output && ((total % 10) == 0))
						fmt_printf("[{}] {} q{} e{} {}  size {} rgb {}\n", total, codec.m_pEnum_name + 1, q, e, pFiles[fi], size, rgb);

					fprintf(pFile, "\t{ \"%s\", basist::basis_tex_format::%s, %d, %d, %s, %u, %.4ff, %.4ff, %.4ff },\n",
						pFiles[fi], codec.m_pEnum_name, q, e, codec.m_hdr ? "true" : "false", size, rgb, rgba, second);

					total++;
				}
			}
		}
	}

	fprintf(pFile, "};\n");
	fclose(pFile);

	fmt_printf("\nWrote {} cases ({} compress failures) to \"{}\"\n", total, fails, out_path);
	return fails == 0;
}

static bool test_codecs_run(command_line_params& opts)
{
	const std::string dir = opts.m_test_dir_explicit ? opts.m_test_file_dir : (codec_test_root_prefix() + "test_files");

#ifdef USE_TIGHTER_TEST_TOLERANCES
	const float PSNR_THRESHOLD = .125f;
	const float XUASTC_PSNR_THRESHOLD = .5f;
#else
	const float PSNR_THRESHOLD = 5.0f;
	const float XUASTC_PSNR_THRESHOLD = 5.0f;	// XUASTC LDR has more cross-build variance (matches test_mode_xuastc_ldr)
#endif
	const float FILESIZE_THRESHOLD = .045f;		// 4.5% relative, matches the other -test modes
	// Tiny outputs (e.g. the XUASTC LDR runs on small alpha test images) jitter by a large RELATIVE amount across
	// builds (MSVC vs clang) for a small absolute byte delta, tripping the 4.5% check spuriously. For golden sizes
	// below this many bytes, relax to a much looser relative threshold so those don't fail the build.
	const uint32_t SMALL_FILESIZE_BYTES = 2048;
	const float SMALL_FILESIZE_THRESHOLD = .50f;	// 50% relative, for golden sizes < SMALL_FILESIZE_BYTES
	const float LDR_SENTINEL_PSNR = 99.0f;		// lossless/degenerate inputs store ~100; don't require an exact match
	const float HDR_SENTINEL_PSNR = 200.0f;

	if (opts.m_codec_filter.size())
		fmt_printf("Codec filter: \"{}\"\n", opts.m_codec_filter);

	basisu::job_pool jp(codec_test_num_threads());

	const uint32_t kNumFmts = (uint32_t)basist::basis_tex_format::cTotalFormats;
	basisu::vector<float> highest_psnr_delta(kNumFmts);
	basisu::vector<float> highest_size_ratio(kNumFmts);
	basisu::vector<uint8_t> fmt_used(kNumFmts);
	basisu::vector<double> codec_total_ms(kNumFmts);	// per-codec compression time accumulators
	basisu::vector<double> codec_max_ms(kNumFmts);
	basisu::vector<uint32_t> codec_count(kNumFmts);
	for (uint32_t i = 0; i < kNumFmts; i++) { highest_psnr_delta[i] = 0.0f; highest_size_ratio[i] = 0.0f; fmt_used[i] = 0; codec_total_ms[i] = 0.0; codec_max_ms[i] = 0.0; codec_count[i] = 0; }

	uint32_t total = 0, tested = 0, mismatches = 0, run_fails = 0, total_skipped = 0;

	for (const codec_test_case& tc : g_codec_test_cases)
	{
		total++;

		if (!codec_name_matches_filter(codec_short_name(tc.m_fmt), opts.m_codec_filter))
			continue;

		if constexpr (sizeof(void*) == sizeof(uint32_t))
		{
			// TODO: disable testing some codecs in 32-bit builds to avoid running out of memory (remove once 32-bit memory issue is addressed)
			if (basist::basis_tex_format_is_xuastc_ldr(tc.m_fmt) || basis_tex_format_is_astc_ldr(tc.m_fmt))
			{
				uint32_t block_width = 0, block_height = 0;
				basist::get_basis_tex_format_block_size(tc.m_fmt, block_width, block_height);
				if ((block_width < 6) || (block_height < 6))
				{
					fmt_printf("WARNING: Skipping XUASTC/ASTC format with block size {}x{} to avoid running out of memory in 32-bit builds\n", block_width, block_height);
					total_skipped++;
					continue;
				}
			}
		}

		tested++;

		uint32_t size = 0;
		basisu::image_stats stats;
		double elapsed_ms = 0.0;

		if (!run_codec_test_case(jp, dir, tc.m_pFilename, tc.m_fmt, tc.m_hdr, tc.m_quality, tc.m_effort, size, stats, elapsed_ms))
		{
			error_printf("COMPRESS FAILED: %s %s q%d e%d\n", codec_short_name(tc.m_fmt), tc.m_pFilename, tc.m_quality, tc.m_effort);
			run_fails++;
			continue;
		}

		float rgb, rgba, second;
		codec_extract_psnrs(stats, tc.m_hdr, rgb, rgba, second);

		// Progress: print every ~10 runs unless the user passed -quiet/-no_status_output (m_status_output==false).
		if (opts.m_comp_params.m_status_output && ((tested == 1) || ((tested % 10) == 0)))
			printf("  [%u] %-26s %-14s q%d e%d  size=%u rgb=%.2f%s  time=%.1fms\n",
				tested, codec_short_name(tc.m_fmt), tc.m_pFilename, tc.m_quality, tc.m_effort, size, rgb, tc.m_hdr ? " (log2)" : "", elapsed_ms);

		const float psnr_thresh = basist::basis_tex_format_is_xuastc_ldr(tc.m_fmt) ? XUASTC_PSNR_THRESHOLD : PSNR_THRESHOLD;
		const float sentinel = tc.m_hdr ? HDR_SENTINEL_PSNR : LDR_SENTINEL_PSNR;

		const uint32_t fi = (uint32_t)tc.m_fmt;
		fmt_used[fi] = 1;
		codec_total_ms[fi] += elapsed_ms;
		if (elapsed_ms > codec_max_ms[fi]) codec_max_ms[fi] = elapsed_ms;
		codec_count[fi]++;

		// File size: relative ratio.
		if (tc.m_size)
		{
			float ratio = fabsf((float)size / (float)tc.m_size - 1.0f);
			if (ratio > highest_size_ratio[fi]) highest_size_ratio[fi] = ratio;
			// Small golden sizes swing widely in relative terms across builds for a tiny absolute delta, so relax
			// the threshold for them (see SMALL_FILESIZE_BYTES above).
			const float size_thresh = (tc.m_size < SMALL_FILESIZE_BYTES) ? SMALL_FILESIZE_THRESHOLD : FILESIZE_THRESHOLD;
			if (ratio > size_thresh)
			{
				error_printf("SIZE mismatch: %s %s q%d e%d: expected %u, got %u (%.2f%%)\n",
					codec_short_name(tc.m_fmt), tc.m_pFilename, tc.m_quality, tc.m_effort, tc.m_size, size, ratio * 100.0f);
				mismatches++;
			}
		}

		// PSNR comparisons. Sentinel (lossless) values are only required to be "high", not exact.
		struct { const char* m_pName; float m_expected; float m_measured; bool m_active; } checks[3] =
		{
			{ "RGB",  tc.m_rgb_psnr,  rgb,    true },
			{ "RGBA", tc.m_rgba_psnr, rgba,   (!tc.m_hdr) && (tc.m_rgba_psnr >= 0.0f) },
			{ "2nd",  tc.m_2nd_psnr,  second, tc.m_2nd_psnr > 1.0f },	// skip when the 2nd format wasn't computed
		};

		for (const auto& c : checks)
		{
			if (!c.m_active)
				continue;

			if (c.m_expected >= sentinel)
			{
				// Lossless/degenerate: just require the measured value is also very high.
				if (c.m_measured < (sentinel - 20.0f))
				{
					error_printf("%s PSNR mismatch (sentinel): %s %s q%d e%d: expected >=%.1f, got %.3f\n",
						c.m_pName, codec_short_name(tc.m_fmt), tc.m_pFilename, tc.m_quality, tc.m_effort, sentinel - 20.0f, c.m_measured);
					mismatches++;
				}
				continue;
			}

			float delta = fabsf(c.m_measured - c.m_expected);
			if (delta > highest_psnr_delta[fi]) highest_psnr_delta[fi] = delta;
			if ((c.m_measured < 55.0f) && (delta > psnr_thresh)) // ignore if PSNR is already very high
			{
				error_printf("%s PSNR mismatch: %s %s q%d e%d: expected %.3f, got %.3f (delta %.3f > %.3f)\n",
					c.m_pName, codec_short_name(tc.m_fmt), tc.m_pFilename, tc.m_quality, tc.m_effort, c.m_expected, c.m_measured, delta, psnr_thresh);
				mismatches++;
			}
		}
	}

	// Per-codec highest deltas, grouped LDR then HDR (g_codec_sweep order).
	printf("\n---- Highest deltas per codec (PSNR dB / file-size ratio) ----\n");
	for (uint32_t group = 0; group < 2; group++)
	{
		printf("%s:\n", group == 0 ? "LDR" : "HDR");
		for (const auto& d : g_codec_sweep)
		{
			if ((d.m_hdr ? 1u : 0u) != group)
				continue;
			const uint32_t fi = (uint32_t)d.m_fmt;
			if (!fmt_used[fi])
				continue;
			printf("  %-28s  max PSNR delta %.4f dB,  max size ratio %.2f%%\n",
				d.m_pEnum_name + 1, highest_psnr_delta[fi], highest_size_ratio[fi] * 100.0f);
		}
	}

	// Per-codec compression timing (gross-perf-regression signal), grouped LDR then HDR.
	printf("\n---- Per-codec compression time (total / avg / max) ----\n");
	double grand_total_ms = 0.0;
	for (uint32_t group = 0; group < 2; group++)
	{
		printf("%s:\n", group == 0 ? "LDR" : "HDR");
		for (const auto& d : g_codec_sweep)
		{
			if ((d.m_hdr ? 1u : 0u) != group)
				continue;
			const uint32_t fi = (uint32_t)d.m_fmt;
			if (!codec_count[fi])
				continue;
			grand_total_ms += codec_total_ms[fi];
			printf("  %-28s  total %.1f ms,  avg %.1f ms,  max %.1f ms  (%u runs)\n",
				d.m_pEnum_name + 1, codec_total_ms[fi], codec_total_ms[fi] / (double)codec_count[fi], codec_max_ms[fi], codec_count[fi]);
		}
	}
	printf("Grand total compression time: %.1f ms (%.2f s)\n", grand_total_ms, grand_total_ms / 1000.0);

	if (total_skipped != 0)
		fmt_printf("WARNING: {} encodes had to be skipped to avoid running out of memory in 32-bit builds\n", total_skipped);

	printf("\nCodec test: %u cases in table, %u tested, %u mismatches, %u compress failures\n", total, tested, mismatches, run_fails);

	if (mismatches || run_fails)
	{
		error_printf("Codec test FAILED\n");
		return false;
	}
	printf("Codec test succeeded\n");
	return true;
}

#ifdef FORCE_SAN_FAILURE
static void force_san_failure()
{
	// Purposely do things that should trigger the address sanitizer
	int arr[5] = { 0, 1, 2, 3, 4 };
	printf("Out of bounds element: %d\n", arr[10]);

	//uint8_t* p = (uint8_t *)malloc(10);
	//p[10] = 99;

	//uint8_t* p = (uint8_t *)malloc(10);
	//free(p);
	//p[0] = 99;
}
#endif // FORCE_SAN_FAILURE

static bool peek_astc_file(const char* pFilename)
{
	fmt_printf("\nExamining .astc file: \"{}\"\n", pFilename);

	vector2D<astc_helpers::astc_block> blocks;
	uint32_t block_width, block_height, image_width, image_height;
	if (!read_astc_file(pFilename, blocks, block_width, block_height, image_width, image_height))
	{
		fmt_error_printf("Failed reading .astc file!\n");
		return false;
	}

	return display_astc_statistics(blocks, block_width, block_height, image_width, image_height, true);
}

static bool xuastc_ldr_decoder_fuzz_test()
{
	basisu::rand rnd;
	rnd.seed(1);

	const uint32_t N = 16;

	interval_timer itm;
	double total_time_a = 0, total_time_b = 0;

	for (uint32_t blk_size_index = 0; blk_size_index < astc_helpers::NUM_ASTC_BLOCK_SIZES; blk_size_index++)
	{
		const uint32_t bw = astc_helpers::g_astc_block_sizes[blk_size_index][0];
		const uint32_t bh = astc_helpers::g_astc_block_sizes[blk_size_index][1];

		fmt_printf("Testing block size {}x{}\n", bw, bh);

		const auto& trial_modes = basist::astc_ldr_t::g_encoder_trial_modes[blk_size_index];

		if (!trial_modes.size())
		{
			assert(0);
			return false;
		}

		for (uint32_t j = 0; j < trial_modes.size(); j++)
		{
			const auto& tm = trial_modes[j];

			astc_helpers::log_astc_block log_blk;
			log_blk.clear();

			const bool test_solid = rnd.irand(0, 63) == 0;

			log_blk.m_grid_width = (uint8_t)tm.m_grid_width;
			log_blk.m_grid_height = (uint8_t)tm.m_grid_height;
			
			log_blk.m_weight_ise_range = (uint8_t)tm.m_weight_ise_range;
			log_blk.m_endpoint_ise_range = (uint8_t)tm.m_endpoint_ise_range;
			
			log_blk.m_dual_plane = tm.m_ccs_index != -1;
			if (tm.m_ccs_index != -1)
				log_blk.m_color_component_selector = (uint8_t)tm.m_ccs_index;

			log_blk.m_num_partitions = (uint8_t)tm.m_num_parts;
			for (uint32_t s = 0; s < tm.m_num_parts; s++)
				log_blk.m_color_endpoint_modes[s] = (uint8_t)tm.m_cem;

			for (uint32_t k = 0; k < N; k++)
			{
				if (log_blk.m_num_partitions > 1)
					log_blk.m_partition_id = (uint16_t)rnd.irand(0, 1023);

				const uint32_t num_cem_endpoint_vals = astc_helpers::get_num_cem_values(tm.m_cem);
				const uint32_t total_cem_endpoint_vals = num_cem_endpoint_vals * log_blk.m_num_partitions;

				for (uint32_t i = 0; i < total_cem_endpoint_vals; i++)
					log_blk.m_endpoints[i] = (uint8_t)rnd.irand(0, astc_helpers::get_ise_levels(log_blk.m_endpoint_ise_range) - 1);

				const uint32_t num_weight_vals = (log_blk.m_dual_plane ? 2 : 1) * log_blk.m_grid_width * log_blk.m_grid_height;
				for (uint32_t i = 0; i < num_weight_vals; i++)
					log_blk.m_weights[i] = (uint8_t)rnd.irand(0, astc_helpers::get_ise_levels(log_blk.m_weight_ise_range) - 1);

				if (test_solid)
				{
					log_blk.clear();
					log_blk.m_solid_color_flag_ldr = true;
					
					uint32_t r = rnd.byte();
					uint32_t g = rnd.byte();
					uint32_t b = rnd.byte();
					uint32_t a = rnd.byte();

					log_blk.m_solid_color[0] = (uint16_t)((r << 8) | r);
					log_blk.m_solid_color[1] = (uint16_t)((g << 8) | g);
					log_blk.m_solid_color[2] = (uint16_t)((b << 8) | b);
					log_blk.m_solid_color[3] = (uint16_t)((a << 8) | a);
				}

				const bool srgb = rnd.bit();

				basist::color32 blk_a[astc_helpers::MAX_BLOCK_PIXELS];
				clear_obj(blk_a);

				itm.start();

				bool status_a = astc_helpers::decode_block(log_blk, blk_a, bw, bh, srgb ? astc_helpers::cDecodeModeSRGB8 : astc_helpers::cDecodeModeLDR8);
				if (!status_a)
				{
					error_printf("astc_helpers::decode_block() failed\n");
					return false;
				}

				total_time_a += itm.get_elapsed_secs();

				basist::color32 blk_b[astc_helpers::MAX_BLOCK_PIXELS];
				clear_obj(blk_b);

				itm.start();

				bool status_b = astc_helpers::decode_block_xuastc_ldr(log_blk, blk_b, bw, bh, srgb ? astc_helpers::cDecodeModeSRGB8 : astc_helpers::cDecodeModeLDR8);
				if (!status_b)
				{
					error_printf("astc_helpers::decode_block() failed\n");
					return false;
				}

				total_time_b += itm.get_elapsed_secs();
				
				for (uint32_t i = 0; i < bw * bh; i++)
				{
					if ((blk_a[i].r != blk_b[i].r) || (blk_a[i].g != blk_b[i].g) || (blk_a[i].b != blk_b[i].b) || (blk_a[i].a != blk_b[i].a))
					{
						error_printf("decode block mismatch\n");
						return false;
					}
				}

			} // k

		} // j

	} // blk_size_index

	printf("ASTC block decoder vs. XUASTC LDR block decoding fuzz test succeeded\n");
	fmt_printf("Total time A: {}, B: {}\n", total_time_a, total_time_b);

	return true;
}

[[maybe_unused]] static inline uint8_t get_601_y(int r, int g, int b)
{
	return (uint8_t)std::round(16.0f + 65.481f * (float)r / 255.0f + 128.553f * (float)g / 255.0f + 24.966f * (float)b / 255.0f);
}

// Calculates a proper average PSNR by converting each PSNR value to MSE, averaging the MSE values, and then converting back to PSNR. 
// This is necessary because PSNR is a logarithmic metric, so you can't just average the PSNR values directly.
float calc_average_psnr(const float* psnr_values, uint32_t count, float lossless_db_thresh)
{
	if (!count)
		return 0.0f;

	float mse_sum = 0.0;
	for (uint32_t i = 0; i < count; i++)
	{
		if (psnr_values[i] >= lossless_db_thresh)
			continue;

		mse_sum += powf(10.0f, -psnr_values[i] / 10.0f);
	}
	
	float mean_mse = mse_sum / (float)count;
	return (mean_mse > 0.0f) ? clamp<float>(-10.0f * log10f(mean_mse), 0.0f, 100.0f) : 100.0f;
}

static float print_psnr_stats(const float_vec &orig_psnrs, float lossless_db_thresh)
{
	const float avg_psnr = calc_average_psnr(orig_psnrs.get_ptr(), orig_psnrs.size_u32(), lossless_db_thresh);
	fmt_printf("  Average (from all MSE's): {3.3} dB\n", avg_psnr);

	uint32_t total_lossless = 0;
	float_vec psnrs;
	for (uint32_t i = 0; i < orig_psnrs.size(); i++)
	{
		if (orig_psnrs[i] >= lossless_db_thresh)
			total_lossless++;
		else
			psnrs.push_back(orig_psnrs[i]);
	}

	fmt_printf("  Total > {3.2} dB (lossless): {}, lossy: {}\n", lossless_db_thresh, total_lossless, psnrs.size_u32());
	fmt_printf("  Lossy-only statistics:\n");

	stats<float> psnrs_stats;
	psnrs_stats.calc(psnrs.size_u32(), psnrs.get_ptr(), 1, true);

	fmt_printf("  Average (of only lossy PSNR's): {3.3} dB\n", psnrs_stats.m_avg);
	fmt_printf("  Std dev: {3.3} dB, Skewness: {3.3} dB\n", psnrs_stats.m_std_dev, psnrs_stats.m_skewness);
	fmt_printf("  Min: {3.3} dB\n", psnrs_stats.m_min);
	fmt_printf("  Median: {3.3} dB at file index: {}\n", psnrs_stats.m_median, psnrs_stats.m_median_index + 1);
	fmt_printf("  Max: {3.3} dB\n", psnrs_stats.m_max);
	fmt_printf("  Avg 5% low: {3.3} dB\n", psnrs_stats.m_five_percent_lo);
	fmt_printf("  Avg 5% high: {3.3} dB\n", psnrs_stats.m_five_percent_hi);

	return avg_psnr;
}

struct benchmark_results
{
	benchmark_results()
	{
		clear();
	}

	void clear()
	{
		clear_obj(*this);
	}

	basist::basis_tex_format m_tex_fmt;
	uint32_t m_effort, m_quality, m_flags;

	uint32_t m_total_images;
	double m_total_time;
	uint64_t m_total_input_texels;
	uint64_t m_total_compressed_size;

	// LDR averages - all calculated from MSE's then converted to PSNR.
	float m_avg_rgba_psnr; 
	float m_avg_luma_709_psnr;
	float m_avg_y_hvs_psnr;
	float m_avg_y_hvsm_psnr;

	// HDR averages: native ASTC HDR + transcoded BC6H, each in linear half-float and log2 space
	// All calculated from MSE's then converted to PSNR.
	float m_avg_astc_hdr_psnr;
	float m_avg_astc_hdr_log2_psnr;
	float m_avg_bc6h_psnr;
	float m_avg_bc6h_log2_psnr;
};

// Parses a -benchmark_single format token (e.g. "XUASTC_LDR_4x4", "XUBC7", "ETC1S", "ASTC_LDR_6x6", "UASTC_LDR_4x4")
// into a basis_tex_format. Matches case-insensitively against basis_get_tex_format_name() with spaces normalized to
// underscores, so every codec the encoder supports (XUASTC LDR 4x4-12x12, XUBC7, ETC1S, ASTC LDR, etc.) is accepted.
// Returns false if no format matches.
static bool parse_benchmark_tex_format(const std::string& s, basist::basis_tex_format& out_fmt)
{
	auto normalize = [](std::string v) -> std::string
	{
		for (char& c : v)
			c = (c == ' ') ? '_' : (char)toupper((uint8_t)c);
		return v;
	};

	const std::string want(normalize(s));

	for (uint32_t i = 0; i < (uint32_t)basist::basis_tex_format::cTotalFormats; i++)
	{
		const basist::basis_tex_format fmt = (basist::basis_tex_format)i;
		if (normalize(basist::basis_get_tex_format_name(fmt)) == want)
		{
			out_fmt = fmt;
			return true;
		}
	}

	return false;
}

[[maybe_unused]] static bool codec_benchmark(
	const std::string &base_filename, //("d:/dev/test_images/photo_png/kodim");
	const uint32_t first_test_file_index,// = 1;
	const uint32_t last_test_file_index,// = 166,
	basist::basis_tex_format tex_fmt, // = basist::basis_tex_format::cXUASTC_LDR_6x6;
	uint32_t effort_level, uint32_t quality_level, uint32_t flags,
	bool srgb_flag, // true = sRGB/perceptual metrics, false = linear
	benchmark_results &results)
{
	results.m_tex_fmt = tex_fmt;
	results.m_effort = effort_level;
	results.m_quality = quality_level;
	results.m_flags = flags;

	fmt_printf("Base filename: {}, first file index: {}, last file index: {}\n", base_filename, first_test_file_index, last_test_file_index);

	fmt_printf("Testing tex fmt: {}, Flags: 0x{X}, Effort: {}, Quality: {}\n", (uint32_t)tex_fmt, flags, effort_level, quality_level);

	const bool is_hdr = basist::basis_tex_format_is_hdr(tex_fmt);

	// sRGB vs. linear metrics only applies to LDR; HDR metrics are always linear half-float / log2, so don't set the
	// sRGB flag or print the metric mode for HDR.
	const bool srgb_metrics = srgb_flag && !is_hdr;
	if (!is_hdr)
		fmt_printf("Using {} metrics\n", srgb_metrics ? "sRGB (perceptual)" : "linear");

	interval_timer tm;
	tm.start();

	// LDR metrics
	float_vec rgba_psnrs, luma_709_psnrs, y_hvs_psnr, y_hvsm_psnr;
	// HDR metrics: native ASTC HDR and transcoded BC6H RGB PSNRs, in linear half-float and log2 space
	float_vec astc_hdr_psnrs, astc_hdr_log2_psnrs, bc6h_psnrs, bc6h_log2_psnrs;

	uint64_t total_compressed_size = 0;
	uint64_t total_input_texels = 0;

	uint32_t flags_and_quality = cFlagThreaded | (srgb_metrics ? cFlagSRGB : 0) | flags;

	const uint32_t total_test_images = (last_test_file_index - first_test_file_index) + 1;

	for (uint32_t file_index = first_test_file_index; file_index <= last_test_file_index; file_index++)
	{
		// HDR formats benchmark against .exr inputs (loaded as float images); LDR against .png. The LDR sets (e.g.
		// kodimNN.png) use 2-digit zero-padded indices; the HDR set (hdr_N.exr) is not padded.
		std::string filename(base_filename);
		const char* pExt = is_hdr ? ".exr" : ".png";
		if (!is_hdr && (file_index < 10))
			filename += fmt_string("{02}{}", file_index, pExt);
		else
			filename += fmt_string("{}{}", file_index, pExt);

		image orig_img;
		imagef orig_imgf;
		uint32_t width = 0, height = 0;
		bool has_alpha = false;

		if (is_hdr)
		{
			if (!load_image_hdr(filename.c_str(), orig_imgf))
			{
				fmt_error_printf("Failed to load HDR image file {}\n", filename);
				return false;
			}
			width = orig_imgf.get_width();
			height = orig_imgf.get_height();
		}
		else
		{
			if (!load_png(filename, orig_img))
			{
				fmt_error_printf("Failed to load image file {}\n", filename);
				return false;
			}
			width = orig_img.get_width();
			height = orig_img.get_height();
			has_alpha = orig_img.has_alpha();
		}

		fmt_printf("---- Loading image {}, {}x{}, has_alpha: {}\n", filename, width, height, has_alpha);

		size_t data_size = 0;
		basisu::image_stats stats;

		// HDR uses the imagef (float) basis_compress2 overload; LDR uses the 8-bit image overload.
		void* pData;
		if (is_hdr)
		{
			basisu::vector<imagef> source_images_hdr;
			source_images_hdr.push_back(orig_imgf);
			pData = basis_compress2(tex_fmt, source_images_hdr, flags_and_quality, quality_level, effort_level, &data_size, (flags & cFlagPrintStats) ? &stats : nullptr);
		}
		else
		{
			basisu::vector<image> source_images;
			source_images.push_back(orig_img);
			pData = basis_compress2(tex_fmt, source_images, flags_and_quality, quality_level, effort_level, &data_size, (flags & cFlagPrintStats) ? &stats : nullptr);
		}

		if (!pData)
		{
			error_printf("basis_compress() failed!\n");
			return false;
		}

		basis_free_data(pData);

		const double bpp = ((double)data_size * 8.0f) / (double)(width * height);

		if (is_hdr)
		{
			// HDR: native ASTC HDR + transcoded BC6H RGB PSNRs, each in linear half-float and log2 space (see image_stats).
			const float astc_hdr_psnr = stats.m_basis_rgb_avg_psnr;
			const float astc_hdr_log2_psnr = stats.m_basis_rgb_avg_astc_hdr_log2_psnr;
			const float bc6h_psnr = stats.m_basis_rgb_avg_bc6h_psnr;
			const float bc6h_log2_psnr = stats.m_basis_rgb_avg_bc6h_log2_psnr;

			fmt_printf("Size: {}, bpp: {}, ASTC HDR RGB PSNR: {3.3} dB (log2: {3.3}), BC6H RGB PSNR: {3.3} dB (log2: {3.3})\n",
				(uint64_t)data_size, bpp, astc_hdr_psnr, astc_hdr_log2_psnr, bc6h_psnr, bc6h_log2_psnr);

			astc_hdr_psnrs.push_back(astc_hdr_psnr);
			astc_hdr_log2_psnrs.push_back(astc_hdr_log2_psnr);
			bc6h_psnrs.push_back(bc6h_psnr);
			bc6h_log2_psnrs.push_back(bc6h_log2_psnr);
		}
		else
		{
			// XUBC7 is a native BC7 codec, so its native RGBA/Luma quality lives in the m_bc7_* stats; the m_basis_* stats
			// for XUBC7 reflect the ASTC LDR 4x4 transcode, not the native output. All other codecs use the m_basis_* stats.
			const bool is_xubc7 = (tex_fmt == basist::basis_tex_format::cXUBC7);
			const float rgba_psnr = is_xubc7 ? stats.m_bc7_rgba_avg_psnr : stats.m_basis_rgba_avg_psnr;
			const float luma_709_psnr = is_xubc7 ? stats.m_bc7_luma_709_psnr : stats.m_basis_luma_709_psnr;
			const psnr_hvs_metrics& hvs = is_xubc7 ? stats.m_hvs_metrics_bc7 : stats.m_hvs_metrics;

			fmt_printf("Size: {}, bpp: {}, RGBA PSNR: {3.3} dB, Luma 709 PSNR: {3.3} dB, Y PSNR-HVS: {3.3} dB, Y PSNR-HVS-M: {3.3} dB\n",
				(uint64_t)data_size,
				bpp,
				rgba_psnr,
				luma_709_psnr,
				hvs.m_y_601_float.m_psnr_hvs,
				hvs.m_y_601_float.m_psnr_hvsm);

			rgba_psnrs.push_back(rgba_psnr);
			luma_709_psnrs.push_back(luma_709_psnr);
			y_hvs_psnr.push_back((float)hvs.m_y_601_float.m_psnr_hvs);
			y_hvsm_psnr.push_back((float)hvs.m_y_601_float.m_psnr_hvsm);
		}

		total_compressed_size += data_size;
		total_input_texels += (uint64_t)width * (uint64_t)height;

	} // file_index

	const double total_time = tm.get_elapsed_secs();
	
	fmt_printf("\n-------------------------\n");
	
	fmt_printf("tex fmt: {}, Flags: 0x{X}, Effort: {}, Quality: {}\n", (uint32_t)tex_fmt, flags_and_quality, effort_level, quality_level);

	fmt_printf("Total time: {3.3} secs, average time per image: {3.3} secs\n", total_time, total_time / (double)total_test_images);

	fmt_printf("Total input texels: {} megapixels, total compressed size: {} mebibytes, average bpp: {3.3}\n", (double)total_input_texels / (1e+6), (double)total_compressed_size / (1024.0f * 1024.0f), ((double)total_compressed_size * 8.0f) / (double)total_input_texels);

	results.m_total_images = total_test_images;
	results.m_total_input_texels = total_input_texels;
	results.m_total_compressed_size = total_compressed_size;
	results.m_total_time = total_time;

	if (is_hdr)
	{
		fmt_printf("\nASTC HDR RGB PSNR:\n");
		results.m_avg_astc_hdr_psnr = print_psnr_stats(astc_hdr_psnrs, 100.0f);

		fmt_printf("\nASTC HDR RGB log2 PSNR:\n");
		results.m_avg_astc_hdr_log2_psnr = print_psnr_stats(astc_hdr_log2_psnrs, 100.0f);

		fmt_printf("\nBC6H RGB PSNR:\n");
		results.m_avg_bc6h_psnr = print_psnr_stats(bc6h_psnrs, 100.0f);

		fmt_printf("\nBC6H RGB log2 PSNR:\n");
		results.m_avg_bc6h_log2_psnr = print_psnr_stats(bc6h_log2_psnrs, 100.0f);
	}
	else
	{
		fmt_printf("\nRGBA PSNR:\n");
		results.m_avg_rgba_psnr = print_psnr_stats(rgba_psnrs, 100.0f);

		fmt_printf("\nLuma 709 PSNR:\n");
		results.m_avg_luma_709_psnr = print_psnr_stats(luma_709_psnrs, 100.0f);

		fmt_printf("\nY PSNR-HVS:\n");
		results.m_avg_y_hvs_psnr = print_psnr_stats(y_hvs_psnr, PSNR_HVS_LOSSLESS_DB);

		fmt_printf("\nY PSNR-HVSM:\n");
		results.m_avg_y_hvsm_psnr = print_psnr_stats(y_hvsm_psnr, PSNR_HVS_LOSSLESS_DB);
	}

	return true;
}

// -benchmark_single <FORMAT> <EFFORT> <QUALITY>: single codec_benchmark() run over a numbered image set.
// LDR loads <prefix>NN.png (zero-padded); HDR loads <prefix>N.exr (not padded). Defaults: LDR "../test_files/kodim" 1..24,
// HDR "../test_files/hdr_" 1..6 (used only when -benchmark_path / -benchmark_range aren't given). Override via
// -benchmark_path and -benchmark_range MIN MAX. LDR metrics are sRGB/perceptual by default (-benchmark_linear selects
// linear); HDR metrics are always linear half-float / log2.
// -benchmark_xubc7_encoder [0,7] selects the XUBC7 BC7 base encoder (0=bc7f, 1-7=bc7e_scalar level 0-6; XUBC7 only).
// -benchmark_xuastc_profile [0,2] selects the XUASTC LDR entropy syntax/profile (0=full arith, 1=hybrid, 2=full zstd; XUASTC only).
// FORMAT/EFFORT/QUALITY come from the command line. Not in the help text yet.
// Example: basisu -benchmark_single XUBC7 9 100 [-benchmark_path <prefix>] [-benchmark_range 1 24] [-benchmark_linear] [-benchmark_xubc7_encoder 4] [-benchmark_xuastc_profile 2]
// For HDR codecs, if the user didn't explicitly override the image path/range, switch from the LDR kodim default to the
// HDR default set ("../test_files/hdr_N.exr", indices 1..6). LDR keeps its existing defaults.
static void apply_hdr_benchmark_image_defaults(command_line_params& opts)
{
	if (!basist::basis_tex_format_is_hdr(opts.m_benchmark_fmt))
		return;
	if (!opts.m_benchmark_path_set)
		opts.m_benchmark_path = "../test_files/hdr_";
	if (!opts.m_benchmark_range_set)
	{
		opts.m_benchmark_first = 1;
		opts.m_benchmark_last = 6;
	}
}

// Packs the benchmark flag set (KTX2 + UASTC supercompression + print stats/status + the XUBC7 base encoder and XUASTC
// profile selections) and runs one codec_benchmark() over the configured image set. Shared by -benchmark_single and -benchmark_sweep.
static bool run_one_benchmark(const command_line_params& opts,
	basist::basis_tex_format fmt, uint32_t effort, uint32_t quality, benchmark_results& results)
{
	// XUBC7-only: pack the BC7 base encoder selection into the high flag bits (0=bc7f, 1-7=bc7e_scalar level 0-6); ignored for other formats.
	const uint32_t xubc7_encoder_flags = (opts.m_benchmark_xubc7_encoder & cFlagXUBC7BaseEncoderMask) << cFlagXUBC7BaseEncoderShift;
	// XUASTC-only: pack the LDR entropy syntax/profile (0=full arith, 1=hybrid, 2=full zstd); ignored for other formats.
	const uint32_t xuastc_profile_flags = (opts.m_benchmark_xuastc_profile & cFlagXUASTCLDRSyntaxMask) << cFlagXUASTCLDRSyntaxShift;
	return codec_benchmark(opts.m_benchmark_path, opts.m_benchmark_first, opts.m_benchmark_last,
		fmt, effort, quality,
		cFlagKTX2 | cFlagKTX2UASTCSuperCompression | cFlagPrintStats | cFlagPrintStatus | xubc7_encoder_flags | xuastc_profile_flags,
		!opts.m_benchmark_linear, // sRGB metrics by default; -benchmark_linear selects linear
		results);
}

static bool benchmark_single_mode(command_line_params& opts)
{
	apply_hdr_benchmark_image_defaults(opts);
	benchmark_results bres;
	return run_one_benchmark(opts, opts.m_benchmark_fmt, opts.m_benchmark_effort, opts.m_benchmark_quality, bres);
}

// Maps a square-block-size sweep index [0,5] (0=4x4,1=5x5,2=6x6,3=8x8,4=10x10,5=12x12) to the basis_tex_format in
// base_fmt's family. Only XUASTC LDR and ASTC LDR have selectable block sizes; returns false for any other family.
static bool benchmark_block_index_to_fmt(basist::basis_tex_format base_fmt, uint32_t square_index, basist::basis_tex_format& out_fmt)
{
	typedef basist::basis_tex_format tf;

	const bool is_xuastc = basist::basis_tex_format_is_xuastc_ldr(base_fmt);
	const bool is_astc = basist::basis_tex_format_is_astc_ldr(base_fmt);
	if (!is_xuastc && !is_astc)
		return false;

	switch (square_index)
	{
	case 0: out_fmt = is_xuastc ? tf::cXUASTC_LDR_4x4   : tf::cASTC_LDR_4x4;   return true;
	case 1: out_fmt = is_xuastc ? tf::cXUASTC_LDR_5x5   : tf::cASTC_LDR_5x5;   return true;
	case 2: out_fmt = is_xuastc ? tf::cXUASTC_LDR_6x6   : tf::cASTC_LDR_6x6;   return true;
	case 3: out_fmt = is_xuastc ? tf::cXUASTC_LDR_8x8   : tf::cASTC_LDR_8x8;   return true;
	case 4: out_fmt = is_xuastc ? tf::cXUASTC_LDR_10x10 : tf::cASTC_LDR_10x10; return true;
	case 5: out_fmt = is_xuastc ? tf::cXUASTC_LDR_12x12 : tf::cASTC_LDR_12x12; return true;
	default: return false;
	}
}

// -benchmark_sweep <FORMAT>: sweeps any combination of block size, effort, and quality for one codec, writing a CSV
// (one row per combination) for spreadsheet analysis. Axis ranges (inclusive low/high): -benchmark_sweep_block [0,5]
// (square sizes 4x4..12x12; XUASTC_LDR/ASTC_LDR only - error otherwise; if omitted, FORMAT's own block size is used and
// no block sweep happens), -benchmark_sweep_effort [0,10] (default 3 3), -benchmark_sweep_quality [0,10] (quality =
// clamp(q*10,1,100); default 10 10 => quality 100). Loop order is block (major), then effort, then quality (minor).
// Metrics: LDR = RGBA + Y PSNR-HVS-M; HDR = non-log2 ASTC HDR RGB PSNR. Output CSV via -benchmark_sweep_csv (default
// "benchmark_sweep.csv"). Other -benchmark_* options apply per run.
// Not in the help text yet. Example: basisu -benchmark_sweep XUASTC_LDR_6x6 -benchmark_sweep_block 0 5 -benchmark_sweep_quality 0 10
static bool benchmark_sweep_mode(command_line_params& opts)
{
	apply_hdr_benchmark_image_defaults(opts);

	const basist::basis_tex_format base_fmt = opts.m_benchmark_fmt;
	const bool is_hdr = basist::basis_tex_format_is_hdr(base_fmt);
	const bool block_family = basist::basis_tex_format_is_xuastc_ldr(base_fmt) || basist::basis_tex_format_is_astc_ldr(base_fmt);

	// Build the block-size axis. If -benchmark_sweep_block was given, sweep square block-size indices [lo,hi] within the
	// codec's family. If it was NOT given, default to exactly the codec/block size specified (e.g. XUASTC_LDR_6x6 stays 6x6,
	// ETC1S/XUBC7/HDR stay as-is) - no block sweep.
	basisu::vector<basist::basis_tex_format> block_fmts;
	if (opts.m_benchmark_sweep_block_set)
	{
		if (!block_family)
		{
			fmt_error_printf("-benchmark_sweep_block requires an XUASTC_LDR or ASTC_LDR codec family\n");
			return false;
		}
		uint32_t blo = opts.m_benchmark_sweep_block_lo, bhi = opts.m_benchmark_sweep_block_hi;
		if (blo > bhi) std::swap(blo, bhi);
		for (uint32_t b = blo; b <= bhi; b++)
		{
			basist::basis_tex_format f;
			if (!benchmark_block_index_to_fmt(base_fmt, b, f))
			{
				fmt_error_printf("-benchmark_sweep: invalid block size index {}\n", b);
				return false;
			}
			block_fmts.push_back(f);
		}
	}
	else
	{
		block_fmts.push_back(base_fmt); // default: the exact codec/block size specified
	}

	uint32_t elo = opts.m_benchmark_sweep_effort_lo, ehi = opts.m_benchmark_sweep_effort_hi;
	if (elo > ehi) std::swap(elo, ehi);
	uint32_t qlo = opts.m_benchmark_sweep_quality_lo, qhi = opts.m_benchmark_sweep_quality_hi;
	if (qlo > qhi) std::swap(qlo, qhi);

	const uint32_t num_blocks = (uint32_t)block_fmts.size();
	const uint32_t num_efforts = (ehi - elo) + 1;
	const uint32_t num_qualities = (qhi - qlo) + 1;

	// Announce the actual sweep up front. With -benchmark_sweep_block the block axis sweeps square sizes within the codec's
	// family (XUASTC/ASTC only; everything else is fixed 4x4); without it, the codec's own block size is used.
	fmt_printf("Benchmark sweep: codec {}, {} block size(s), effort {}..{}, quality(x10) {}..{}, {} runs total\n",
		basist::basis_get_tex_format_name(base_fmt), num_blocks, elo, ehi, qlo, qhi, num_blocks * num_efforts * num_qualities);
	for (uint32_t bi = 0; bi < num_blocks; bi++)
	{
		uint32_t bw = 0, bh = 0;
		basist::get_basis_tex_format_block_size(block_fmts[bi], bw, bh);
		fmt_printf("  block[{}]: {} ({}x{})\n", bi, basist::basis_get_tex_format_name(block_fmts[bi]), bw, bh);
	}

	// Open the CSV up front so a bad path fails before the (potentially long) sweep runs.
	FILE* pFile = fopen(opts.m_benchmark_sweep_csv.c_str(), "w");
	if (!pFile)
	{
		fmt_error_printf("Failed to open output CSV file \"{}\" for writing!\n", opts.m_benchmark_sweep_csv);
		return false;
	}

	if (is_hdr)
	{
		// HDR metrics are always linear half-float / log2 (sRGB vs linear doesn't apply), so no metrics field.
		fmt_fprintf(pFile, "// codec: {}, images: {}N.exr indices {}..{}\n",
			basist::basis_get_tex_format_name(base_fmt), opts.m_benchmark_path, opts.m_benchmark_first, opts.m_benchmark_last);
		fmt_fprintf(pFile, "// fmt, block, effort, quality, bitrate, astc_hdr_rgb_psnr\n");
	}
	else
	{
		fmt_fprintf(pFile, "// codec: {}, metrics: {}, images: {}NN.png indices {}..{}\n",
			basist::basis_get_tex_format_name(base_fmt), opts.m_benchmark_linear ? "linear" : "sRGB (perceptual)",
			opts.m_benchmark_path, opts.m_benchmark_first, opts.m_benchmark_last);
		fmt_fprintf(pFile, "// fmt, block, effort, quality, bitrate, rgba_psnr, y_hvsm_psnr\n");
	}

	// Run all combinations, storing results in a 3D [block][effort][quality] array, then write the CSV (one row per
	// combination; loop order block major, then effort, then quality).
	basisu::vector<basisu::vector<basisu::vector<benchmark_results>>> results;
	results.resize(num_blocks);

	for (uint32_t bi = 0; bi < num_blocks; bi++)
	{
		results[bi].resize(num_efforts);
		for (uint32_t ei = 0; ei < num_efforts; ei++)
		{
			results[bi][ei].resize(num_qualities);
			for (uint32_t qi = 0; qi < num_qualities; qi++)
			{
				const uint32_t effort = elo + ei;
				const uint32_t quality = (uint32_t)clamp<int>((int)(qlo + qi) * 10, 1, 100);

				if (!run_one_benchmark(opts, block_fmts[bi], effort, quality, results[bi][ei][qi]))
				{
					fclose(pFile);
					return false;
				}
			}
		}
	}

	for (uint32_t bi = 0; bi < num_blocks; bi++)
	{
		for (uint32_t ei = 0; ei < num_efforts; ei++)
		{
			for (uint32_t qi = 0; qi < num_qualities; qi++)
			{
				const benchmark_results& r = results[bi][ei][qi];

				uint32_t bw = 0, bh = 0;
				basist::get_basis_tex_format_block_size(r.m_tex_fmt, bw, bh);
				const double bitrate = (double)r.m_total_compressed_size * 8.0 / (double)r.m_total_input_texels;

				if (is_hdr)
					fmt_fprintf(pFile, "{}, {}x{}, {}, {}, {3.4}, {3.4}\n",
						basist::basis_get_tex_format_name(r.m_tex_fmt), bw, bh, r.m_effort, r.m_quality, bitrate, r.m_avg_astc_hdr_psnr);
				else
					fmt_fprintf(pFile, "{}, {}x{}, {}, {}, {3.4}, {3.4}, {3.4}\n",
						basist::basis_get_tex_format_name(r.m_tex_fmt), bw, bh, r.m_effort, r.m_quality, bitrate, r.m_avg_rgba_psnr, r.m_avg_y_hvsm_psnr);
			}
		}
	}

	fclose(pFile);

	fmt_printf("Wrote benchmark sweep CSV \"{}\"\n", opts.m_benchmark_sweep_csv);
	return true;
}

// -test_dds: standalone test harness for the basist::dds_transcoder DX9/DX10 DDS reader+transcoder.
// Usage: basisu -test_dds <file.dds> [output_prefix]
// Generate inputs with the existing exporter, e.g.:
//   basisu -ktx2 -uastc <img>.png ; basisu -file <img>.ktx2 -export_dds   (or BC7/array/cubemap variants)
static bool test_dds(int argc, const char* argv[])
{
	if (argc < 3)
	{
		fmt_error_printf("Usage: basisu -test_dds <file.dds> [output_prefix]\n");
		return false;
	}

	const char* pFilename = argv[2];
	const std::string out_prefix = (argc >= 4) ? std::string(argv[3]) : std::string("dds_test");

	uint8_vec file_data;
	if (!read_file_to_vec(pFilename, file_data))
	{
		fmt_error_printf("Failed reading file \"{}\"\n", pFilename);
		return false;
	}
	fmt_printf("Read {} bytes from \"{}\"\n", file_data.size_u32(), pFilename);

	basist::dds_transcoder dds;
	if (!dds.init(file_data.data(), file_data.size_u32()))
	{
		fmt_error_printf("dds_transcoder::init() failed (unsupported or malformed DDS)\n");
		return false;
	}
	if (!dds.start_transcoding())
	{
		fmt_error_printf("dds_transcoder::start_transcoding() failed\n");
		return false;
	}

	const uint32_t levels = dds.get_levels();
	const uint32_t eff_layers = dds.get_layers() ? dds.get_layers() : 1;
	const uint32_t faces = dds.get_faces();
	const basist::transcoder_texture_format contained = dds.get_format();

	fmt_printf("DDS: {}x{}, levels: {}, layers: {} ({}), faces: {} ({})\n",
		dds.get_width(), dds.get_height(), levels, dds.get_layers(), dds.get_layers() ? "array" : "non-array",
		faces, dds.get_is_cubemap() ? "cubemap" : "2D");
	fmt_printf("Contained format: {} (enum {}), has_alpha: {}, sRGB: {}\n",
		basist::basis_get_format_name(contained), (int)contained, (uint32_t)dds.get_has_alpha(), dds.is_srgb() ? 1 : 0);

	// Exercise is_transcode_format_supported() (PVRTC1 depends on pow2 dims; cTFBC6H/PVRTC2 are unsupported).
	{
		const bool pow2 = is_pow2(dds.get_width()) && is_pow2(dds.get_height());
		const basist::transcoder_texture_format probe[] = {
			basist::transcoder_texture_format::cTFBC7_RGBA, basist::transcoder_texture_format::cTFASTC_4x4_RGBA,
			basist::transcoder_texture_format::cTFRGBA32, basist::transcoder_texture_format::cTFPVRTC1_4_RGB,
			basist::transcoder_texture_format::cTFBC6H, basist::transcoder_texture_format::cTFPVRTC2_4_RGB
		};
		fmt_printf("is_transcode_format_supported (pow2 dims: {}):\n", pow2 ? 1 : 0);
		for (basist::transcoder_texture_format f : probe)
			fmt_printf("  {}: {}\n", basist::basis_get_format_name(f), dds.is_transcode_format_supported(f) ? "yes" : "no");
	}

	// Dump per-image info.
	for (uint32_t layer = 0; layer < eff_layers; layer++)
		for (uint32_t face = 0; face < faces; face++)
			for (uint32_t level = 0; level < levels; level++)
			{
				basist::ktx2_image_level_info li;
				if (!dds.get_image_level_info(li, level, layer, face))
				{
					fmt_error_printf("get_image_level_info failed at A{} F{} M{}\n", layer, face, level);
					return false;
				}
				fmt_printf("  A{} F{} M{}: {}x{} ({}x{} blocks, {} total)\n",
					layer, face, level, li.m_orig_width, li.m_orig_height, li.m_num_blocks_x, li.m_num_blocks_y, li.m_total_blocks);
			}

	// Decode every image to RGBA32 and save as PNG (visual verification).
	uint32_t png_count = 0;
	for (uint32_t layer = 0; layer < eff_layers; layer++)
	{
		for (uint32_t face = 0; face < faces; face++)
		{
			for (uint32_t level = 0; level < levels; level++)
			{
				basist::ktx2_image_level_info li;
				dds.get_image_level_info(li, level, layer, face);

				image img(li.m_orig_width, li.m_orig_height);
				if (!dds.transcode_image_level(level, layer, face, img.get_ptr(), img.get_total_pixels(),
					basist::transcoder_texture_format::cTFRGBA32, 0, img.get_width(), img.get_height()))
				{
					fmt_error_printf("transcode to RGBA32 failed at A{} F{} M{}\n", layer, face, level);
					return false;
				}

				char fn[512];
				snprintf(fn, sizeof(fn), "%s_A%u_F%u_M%u.png", out_prefix.c_str(), layer, face, level);
				if (!save_png(fn, img))
				{
					fmt_error_printf("save_png failed for \"{}\"\n", fn);
					return false;
				}
				png_count++;
			}
		}
	}
	fmt_printf("Wrote {} decoded RGBA32 PNG(s) (prefix \"{}\")\n", png_count, out_prefix.c_str());

	// Reference RGBA32 decode of the base image, for round-trip PSNR of re-encoded targets.
	basist::ktx2_image_level_info base_li;
	dds.get_image_level_info(base_li, 0, 0, 0);
	image ref_img(base_li.m_orig_width, base_li.m_orig_height);
	dds.transcode_image_level(0, 0, 0, ref_img.get_ptr(), ref_img.get_total_pixels(),
		basist::transcoder_texture_format::cTFRGBA32, 0, ref_img.get_width(), ref_img.get_height());

	// Exercise every supported re-encode target on the base image.
	struct target_row { basist::transcoder_texture_format fmt; basisu::texture_format unpack_fmt; bool can_unpack; };
	const target_row targets[] =
	{
		{ basist::transcoder_texture_format::cTFBC1_RGB,       basisu::texture_format::cBC1, true },
		{ basist::transcoder_texture_format::cTFBC3_RGBA,      basisu::texture_format::cBC3, true },
		{ basist::transcoder_texture_format::cTFBC4_R,         basisu::texture_format::cBC4, true },
		{ basist::transcoder_texture_format::cTFBC5_RG,        basisu::texture_format::cBC5, true },
		{ basist::transcoder_texture_format::cTFBC7_RGBA,      basisu::texture_format::cBC7, true },
		{ basist::transcoder_texture_format::cTFETC1_RGB,      basisu::texture_format::cInvalidTextureFormat, false },
		{ basist::transcoder_texture_format::cTFETC2_RGBA,     basisu::texture_format::cInvalidTextureFormat, false },
		{ basist::transcoder_texture_format::cTFASTC_4x4_RGBA, basisu::texture_format::cInvalidTextureFormat, false },
		{ basist::transcoder_texture_format::cTFPVRTC1_4_RGB,  basisu::texture_format::cInvalidTextureFormat, false },
		{ basist::transcoder_texture_format::cTFRGB565,        basisu::texture_format::cInvalidTextureFormat, false },
		{ basist::transcoder_texture_format::cTFRGBA4444,      basisu::texture_format::cInvalidTextureFormat, false },
	};

	// For the re-encode tests use a 4x4-grid sized image (covers compressed targets cleanly).
	const uint32_t grid_blocks_x = (base_li.m_orig_width + 3) / 4;
	const uint32_t grid_blocks_y = (base_li.m_orig_height + 3) / 4;

	for (const target_row& t : targets)
	{
		const bool uncompressed = (t.fmt == basist::transcoder_texture_format::cTFRGBA32) ||
			(t.fmt == basist::transcoder_texture_format::cTFRGB565) || (t.fmt == basist::transcoder_texture_format::cTFRGBA4444);
		const bool is_pvrtc1 = (t.fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (t.fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA);

		if (is_pvrtc1 && (!is_pow2(base_li.m_orig_width) || !is_pow2(base_li.m_orig_height)))
		{
			fmt_printf("  {}: skipped (PVRTC1 needs power-of-2 dims)\n", basist::basis_get_format_name(t.fmt));
			continue;
		}

		const uint32_t bytes_per = basist::basis_get_bytes_per_block_or_pixel(t.fmt);
		uint32_t buf_units, byte_size;
		if (uncompressed)
		{
			buf_units = base_li.m_orig_width * base_li.m_orig_height;
			byte_size = buf_units * bytes_per;
		}
		else
		{
			buf_units = grid_blocks_x * grid_blocks_y;
			byte_size = buf_units * bytes_per;
		}

		uint8_vec out_buf(byte_size);
		const uint32_t row_pitch = uncompressed ? base_li.m_orig_width : 0;
		const uint32_t rows = uncompressed ? base_li.m_orig_height : 0;

		if (!dds.transcode_image_level(0, 0, 0, out_buf.data(), buf_units, t.fmt, 0, row_pitch, rows))
		{
			fmt_error_printf("  {}: transcode FAILED\n", basist::basis_get_format_name(t.fmt));
			return false;
		}

		// Round-trip PSNR for the BC formats we can unpack directly.
		if (t.can_unpack)
		{
			image rt(grid_blocks_x * 4, grid_blocks_y * 4);
			for (uint32_t by = 0; by < grid_blocks_y; by++)
				for (uint32_t bx = 0; bx < grid_blocks_x; bx++)
				{
					color_rgba pixels[16];
					unpack_block(t.unpack_fmt, out_buf.data() + (by * grid_blocks_x + bx) * bytes_per, pixels, false);
					for (uint32_t y = 0; y < 4; y++)
						for (uint32_t x = 0; x < 4; x++)
							rt.set_clipped(bx * 4 + x, by * 4 + y, pixels[y * 4 + x]);
				}

			image_metrics m;
			m.calc(ref_img, rt, 0, 3);
			const double rgb_psnr = m.m_psnr;
			m.calc(ref_img, rt, 0, 4);
			fmt_printf("  {}: OK {} bytes, RGB PSNR {}, RGBA PSNR {}\n",
				basist::basis_get_format_name(t.fmt), byte_size, rgb_psnr, m.m_psnr);
		}
		else
		{
			fmt_printf("  {}: OK {} bytes\n", basist::basis_get_format_name(t.fmt), byte_size);
		}
	}

	fmt_printf("-test_dds: success\n");
	return true;
}

// ---- -test_dds_overwrite: transcoder output-buffer SANITY (overrun) test ----
// This is a SEPARATE test from -test_dds, and a different kind of test: it does NOT check "did we get the right
// pixels?" -- it checks "did dds_transcoder::transcode_image_level() ever write past the buffer I declared, and does
// it correctly REJECT bogus arguments?". For every .dds under the given root (default c:\dev\dds_files), for every
// (level,layer,face) and every supported output format (compressed AND uncompressed), we transcode into a
// basisu::vector<uint8_t> that is deliberately LARGER than required and pre-filled with the 0xDEADBEEF byte pattern,
// then verify the bytes at/after the declared buffer size are still pristine (nothing was overwritten). We exercise
// the optional output_row_pitch / output_rows overrides -- expand AND shrink for uncompressed targets (e.g. a 4x4 DDS
// unpacked into a clipped 3x3 region), expand-only for compressed -- plus a battery of must-reject argument errors
// (undersize buffer, shrunken compressed pitch, PVRTC1 non-tight pitch, out-of-range level/layer/face, null output).
// A rejected call must also leave the buffer entirely pristine. Intended to be run against a DEBUG build.
// Usage: basisu -test_dds_overwrite [root_dir_or_file]
static const uint8_t s_deadbeef[4] = { 0xEF, 0xBE, 0xAD, 0xDE }; // little-endian 0xDEADBEEF

static void fill_deadbeef(uint8_vec& buf)
{
	for (size_t i = 0; i < buf.size(); i++)
		buf[i] = s_deadbeef[i & 3];
}

struct dds_file_entry { std::string m_path; uint64_t m_size; };

// Returns the index of the first byte in [start,end) that is no longer the 0xDEADBEEF pattern, or SIZE_MAX if clean.
static size_t check_deadbeef(const uint8_vec& buf, size_t start, size_t end)
{
	for (size_t i = start; i < end; i++)
		if (buf[i] != s_deadbeef[i & 3])
			return i;
	return SIZE_MAX;
}

static bool test_dds_overwrite(int argc, const char* argv[])
{
	const std::string root = (argc >= 3) ? std::string(argv[2]) : std::string("c:\\dev\\dds_files");

	// Gather every .dds file under root (recursively) via C++17 std::filesystem; allow a single file too.
	std::vector<dds_file_entry> dds_files;
	{
		std::error_code ec;
		const std::filesystem::path root_path(root);
		const std::filesystem::file_status st = std::filesystem::status(root_path, ec);
		if (ec || !std::filesystem::exists(st))
		{
			fmt_error_printf("Root path \"{}\" does not exist\n", root.c_str());
			return false;
		}
		if (std::filesystem::is_directory(st))
		{
			for (std::filesystem::recursive_directory_iterator it(root_path, std::filesystem::directory_options::skip_permission_denied, ec), end; it != end; it.increment(ec))
			{
				if (ec) { ec.clear(); continue; }
				std::error_code fec;
				if (!it->is_regular_file(fec))
					continue;
				std::string ext = it->path().extension().string();
				for (char& c : ext) c = (char)tolower((unsigned char)c);
				if (ext == ".dds")
				{
					const uintmax_t sz = it->file_size(fec);
					dds_files.push_back({ it->path().string(), fec ? 0ull : (uint64_t)sz });
				}
			}
		}
		else
		{
			dds_files.push_back({ root, 0 }); // explicit single file: size 0 => never skipped by the cap below
		}
	}

	if (dds_files.empty())
	{
		fmt_error_printf("No .dds files found under \"{}\"\n", root.c_str());
		return false;
	}
	std::sort(dds_files.begin(), dds_files.end(), [](const dds_file_entry& a, const dds_file_entry& b) { return a.m_path < b.m_path; });
	fmt_printf("-test_dds_overwrite: found {} .dds file(s) under \"{}\"\n", (uint64_t)dds_files.size(), root.c_str());

	uint64_t total_calls = 0, total_overwrite_failures = 0, total_expectation_mismatches = 0;
	uint32_t files_skipped = 0;

	const size_t GUARD_BYTES = 1024; // sentinel margin past the declared buffer to catch overruns

	enum call_kind { KIND_PROBE, KIND_POSITIVE, KIND_MUST_REJECT };

	// A Debug re-encode of an enormous file (e.g. a multi-hundred-MB BC7 texture array) to every output format x
	// pitch/rows combo is impractical; skip files past this cap. Bounds behavior doesn't depend on image size.
	const uint64_t MAX_FILE_BYTES = 64ull * 1024 * 1024;

	for (const dds_file_entry& fe : dds_files)
	{
		const std::string& fn = fe.m_path;
		if (fe.m_size > MAX_FILE_BYTES)
		{
			fmt_printf("  SKIP (too large for Debug test, {} MB): \"{}\"\n", (uint64_t)(fe.m_size / (1024 * 1024)), fn.c_str());
			files_skipped++;
			continue;
		}

		uint8_vec file_data;
		if (!read_file_to_vec(fn.c_str(), file_data))
		{
			fmt_printf("  SKIP (read failed): \"{}\"\n", fn.c_str());
			files_skipped++;
			continue;
		}

		basist::dds_transcoder dds;
		if (!dds.init(file_data.data(), file_data.size_u32()) || !dds.start_transcoding())
		{
			// The corpus may legitimately contain DDS variants this transcoder doesn't accept -- not a test failure.
			fmt_printf("  SKIP (init failed): \"{}\"\n", fn.c_str());
			files_skipped++;
			continue;
		}

		const uint32_t levels = dds.get_levels();
		const uint32_t eff_layers = dds.get_layers() ? dds.get_layers() : 1;
		const uint32_t faces = dds.get_faces();

		uint64_t file_calls = 0, file_fail = 0;

		// One transcode into a guarded, sentinel-filled buffer. Verifies: (1) nothing written at/after the declared
		// size; (2) a rejected call wrote nothing anywhere; (3) the success/failure expectation. Returns the result.
		auto run_one = [&](uint32_t lvl, uint32_t lyr, uint32_t fc,
			basist::transcoder_texture_format f, uint32_t bytes_per,
			uint32_t buf_units, uint32_t P, uint32_t R,
			call_kind kind, bool path_active, const char* desc) -> bool
		{
			total_calls++; file_calls++;
			const size_t declared_bytes = (size_t)buf_units * bytes_per;
			uint8_vec buf(declared_bytes + GUARD_BYTES);
			fill_deadbeef(buf);

			const bool ok = dds.transcode_image_level(lvl, lyr, fc, buf.data(), buf_units, f, 0, P, R);

			// (1) CORE CHECK: the transcoder may never touch a byte at/after the declared buffer size.
			const size_t bad_guard = check_deadbeef(buf, declared_bytes, buf.size());
			if (bad_guard != SIZE_MAX)
			{
				fmt_error_printf("  *** OVERWRITE PAST BUFFER: {} | {} [{}] L{} A{} F{} P={} R={} units={} -> wrote +{} bytes past declared {} ***\n",
					fn.c_str(), basist::basis_get_format_name(f), desc, lvl, lyr, fc, P, R, buf_units,
					(uint64_t)(bad_guard - declared_bytes), (uint64_t)declared_bytes);
				total_overwrite_failures++; file_fail++;
			}

			// (2) A rejected transcode must not have written ANYTHING into the buffer.
			if (!ok)
			{
				const size_t bad_any = check_deadbeef(buf, 0, buf.size());
				if (bad_any != SIZE_MAX)
				{
					fmt_error_printf("  *** REJECTED CALL WROTE TO BUFFER: {} | {} [{}] L{} A{} F{} P={} R={} at byte {} ***\n",
						fn.c_str(), basist::basis_get_format_name(f), desc, lvl, lyr, fc, P, R, (uint64_t)bad_any);
					total_overwrite_failures++; file_fail++;
				}
			}

			// (3) Expectation. A must-reject call that succeeds, or a should-succeed call (when the path is active)
			// that fails, is a mismatch. The PROBE kind only establishes whether the path is active (no expectation).
			if ((kind == KIND_MUST_REJECT) && ok)
			{
				fmt_error_printf("  *** EXPECTED REJECTION BUT SUCCEEDED: {} | {} [{}] L{} A{} F{} P={} R={} units={} ***\n",
					fn.c_str(), basist::basis_get_format_name(f), desc, lvl, lyr, fc, P, R, buf_units);
				total_expectation_mismatches++; file_fail++;
			}
			else if ((kind == KIND_POSITIVE) && path_active && !ok)
			{
				fmt_error_printf("  *** EXPECTED SUCCESS BUT FAILED: {} | {} [{}] L{} A{} F{} P={} R={} units={} ***\n",
					fn.c_str(), basist::basis_get_format_name(f), desc, lvl, lyr, fc, P, R, buf_units);
				total_expectation_mismatches++; file_fail++;
			}
			return ok;
		};

		for (uint32_t lyr = 0; lyr < eff_layers; lyr++)
		for (uint32_t fc = 0; fc < faces; fc++)
		for (uint32_t lvl = 0; lvl < levels; lvl++)
		{
			basist::ktx2_image_level_info li;
			if (!dds.get_image_level_info(li, lvl, lyr, fc))
			{
				fmt_error_printf("  get_image_level_info failed L{} A{} F{} in \"{}\"\n", lvl, lyr, fc, fn.c_str());
				file_fail++;
				continue;
			}
			const uint32_t W = li.m_orig_width, H = li.m_orig_height;
			// DDS blocks are always 4x4; the output 4x4-block grid is ceil(dim/4) regardless of source kind.
			const uint32_t nbx = (W + 3) / 4, nby = (H + 3) / 4;

			for (int fi = 0; fi < (int)basist::transcoder_texture_format::cTFTotalTextureFormats; fi++)
			{
				const basist::transcoder_texture_format f = (basist::transcoder_texture_format)fi;
				if (!dds.is_transcode_format_supported(f))
					continue;

				const bool uncompressed = basist::basis_transcoder_format_is_uncompressed(f);
				const bool is_pvrtc = (f == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) ||
				                      (f == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA);
				const uint32_t bytes_per = basist::basis_get_bytes_per_block_or_pixel(f);

				// Declared output units for a given (pitch,rows) per the transcode contract:
				//   uncompressed: (pitch?:width) * (rows?:height) pixels;  compressed: (pitch?:num_blocks_x) * num_blocks_y blocks.
				auto declared_units = [&](uint32_t P, uint32_t R) -> uint32_t
				{
					if (uncompressed)
						return (P ? P : W) * (R ? R : H);
					return (P ? P : nbx) * nby;
				};

				// PROBE the default pitch/rows: is this format's transcode path active for this source+build?
				// (A decode->repack target returns false in a build without BASISD_SUPPORT_XUASTC; don't flag that.)
				const uint32_t du_default = declared_units(0, 0);
				const bool path_active = run_one(lvl, lyr, fc, f, bytes_per, du_default, 0, 0, KIND_PROBE, false, "default");

				// ---- Positive combos (should succeed whenever the path is active) ----
				struct PR { uint32_t P, R; const char* desc; };
				std::vector<PR> pos;
				if (uncompressed)
				{
					pos.push_back({ W + 5, 0,     "expand-pitch" });
					pos.push_back({ W + 5, H + 3, "expand-pitch+rows" });
					pos.push_back({ 0,     H + 3, "expand-rows" });
					if (W >= 2) { pos.push_back({ W - 1, 0, "shrink-pitch-1" }); pos.push_back({ (W + 1) / 2, 0, "shrink-pitch-half" }); }
					if (H >= 2) { pos.push_back({ 0, H - 1, "shrink-rows-1" }); pos.push_back({ 0, (H + 1) / 2, "shrink-rows-half" }); }
					if ((W >= 3) && (H >= 3)) pos.push_back({ 3, 3, "clip-to-3x3" });
				}
				else if (!is_pvrtc)
				{
					pos.push_back({ nbx + 2, 0, "expand-pitch" });
				}
				for (const PR& c : pos)
					run_one(lvl, lyr, fc, f, bytes_per, declared_units(c.P, c.R), c.P, c.R, KIND_POSITIVE, path_active, c.desc);

				// ---- Must-reject combos ----
				if (du_default >= 1) // buffer one unit too small for the default extent
					run_one(lvl, lyr, fc, f, bytes_per, du_default - 1, 0, 0, KIND_MUST_REJECT, false, "undersize-buffer");
				if (is_pvrtc) // PVRTC1 is whole-image: any non-tight pitch must be rejected
					run_one(lvl, lyr, fc, f, bytes_per, declared_units(0, 0), nbx + 2, 0, KIND_MUST_REJECT, false, "pvrtc-nontight-pitch");
				else if (!uncompressed && (nbx >= 2)) // compressed pitch < num_blocks_x would drop blocks (generous buffer, so only the pitch is bad)
					run_one(lvl, lyr, fc, f, bytes_per, nbx * nby, nbx - 1, 0, KIND_MUST_REJECT, false, "compressed-shrink-pitch");
			} // fmt

			// ---- Per-(level,layer,face) must-reject: out-of-range indices & null output (format-independent) ----
			{
				const basist::transcoder_texture_format f = basist::transcoder_texture_format::cTFRGBA32;
				const uint32_t bytes_per = basist::basis_get_bytes_per_block_or_pixel(f);
				const uint32_t du = W * H;
				run_one(levels,    lyr,        fc,    f, bytes_per, du, 0, 0, KIND_MUST_REJECT, false, "bad-level");
				run_one(lvl,       eff_layers, fc,    f, bytes_per, du, 0, 0, KIND_MUST_REJECT, false, "bad-layer");
				run_one(lvl,       lyr,        faces, f, bytes_per, du, 0, 0, KIND_MUST_REJECT, false, "bad-face");

				total_calls++; file_calls++;
				if (dds.transcode_image_level(lvl, lyr, fc, nullptr, du, f, 0, 0, 0))
				{
					fmt_error_printf("  *** EXPECTED REJECTION (null output) BUT SUCCEEDED: {} L{} A{} F{} ***\n", fn.c_str(), lvl, lyr, fc);
					total_expectation_mismatches++; file_fail++;
				}
			}
		} // level/layer/face

		if (file_fail)
			fmt_error_printf("  {} : {} call(s), {} FAILURE(s)\n", fn.c_str(), (uint64_t)file_calls, (uint64_t)file_fail);
		else
			fmt_printf("  {} : {} calls OK\n", fn.c_str(), (uint64_t)file_calls);
		fflush(stdout); // stream per-file progress (stdout is block-buffered when redirected)
	} // file

	fmt_printf("\n-test_dds_overwrite summary: {} call(s) across {} file(s) ({} skipped)\n",
		(uint64_t)total_calls, (uint64_t)dds_files.size(), files_skipped);
	fmt_printf("  buffer-overwrite failures: {}\n", (uint64_t)total_overwrite_failures);
	fmt_printf("  expectation mismatches:    {}\n", (uint64_t)total_expectation_mismatches);

	const bool success = (total_overwrite_failures == 0) && (total_expectation_mismatches == 0);
	fmt_printf("-test_dds_overwrite: {}\n", success ? "SUCCESS" : "*** FAILED ***");
	return success;
}

// Maps an -export_dds format string to a transcoder_texture_format. Accepts the
// DirectX BC formats DDS supports plus uncompressed 32-bit RGBA. Case-insensitive.
static bool parse_export_dds_format(const std::string& s, basist::transcoder_texture_format& fmt)
{
	typedef basist::transcoder_texture_format tf;

	if (strcasecmp(s.c_str(), "BC1") == 0)
		fmt = tf::cTFBC1_RGB;
	else if (strcasecmp(s.c_str(), "BC3") == 0)
		fmt = tf::cTFBC3_RGBA;
	else if (strcasecmp(s.c_str(), "BC4") == 0)
		fmt = tf::cTFBC4_R;
	else if (strcasecmp(s.c_str(), "BC5") == 0)
		fmt = tf::cTFBC5_RG;
	else if (strcasecmp(s.c_str(), "BC6H") == 0)
		fmt = tf::cTFBC6H;
	else if (strcasecmp(s.c_str(), "BC7") == 0)
		fmt = tf::cTFBC7_RGBA;
	else if (strcasecmp(s.c_str(), "RGBA32") == 0)
		fmt = tf::cTFRGBA32;
	else
		return false;

	return true;
}

// Writes a basic DX10 .dds file from source image(s). Uses basis_compressor in process_source_images()
// mode to load/mipmap/lay-out the slices, then packs them to the requested format (see basisu_dds_export.*).
static bool dds_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("-dds: no input image file(s) specified (use -file or list them on the command line)\n");
		return false;
	}

	dds_export_params dds_params;
	if (!opts.m_dds_format.size())
	{
		// No -dds_format given: default to bc7 (a reasonable general-purpose default), but warn.
		printf("Warning: -dds: no -dds_format specified; defaulting to BC7\n");
		dds_params.m_format = cDDSFmtBC7;
	}
	else if (!parse_dds_output_format(opts.m_dds_format.c_str(), dds_params.m_format))
	{
		error_printf("-dds: invalid -dds_format \"%s\". Valid: BC1 BC2 BC3 BC4 BC5 BC7 A8R8G8B8 A8B8G8R8 R8 R8G8 R5G6B5 A1R5G5B5 A4R4G4B4\n", opts.m_dds_format.c_str());
		return false;
	}

	// Apply optional BC7 packer overrides (only meaningful for -dds_format bc7).
	if (opts.m_dds_bc7_encoder != cDDSBC7Encoder_Default)
		dds_params.m_bc7_encoder = opts.m_dds_bc7_encoder;
	if (opts.m_dds_bc7f_level >= 0)
		dds_params.m_bc7f_level = opts.m_dds_bc7f_level;
	if (opts.m_dds_bc7e_scalar_level >= 0)
		dds_params.m_bc7e_scalar_level = opts.m_dds_bc7e_scalar_level;

	// Only 2D, 2D arrays, and cubemaps/cubemap arrays are supported. Reject volume/video (we always write a
	// 2D-dimension DX10 header), rather than silently producing a mislabeled 2D-array file.
	const basist::basis_texture_type tex_type = opts.m_comp_params.m_tex_type;
	if ((tex_type != basist::cBASISTexType2D) && (tex_type != basist::cBASISTexType2DArray) && (tex_type != basist::cBASISTexTypeCubemapArray))
	{
		error_printf("-dds: -tex_type %u is not supported; use 2d, 2darray, or cubemap.\n", (uint32_t)tex_type);
		return false;
	}

	// -dds is LDR only (we force the XUBC7/LDR prep path below); reject HDR up front rather than silently
	// down-converting an HDR request.
	if (opts.m_comp_params.m_hdr)
	{
		error_printf("-dds: HDR is not supported (LDR only).\n");
		return false;
	}

	// Thread pool size, same approach as compress_mode().
	uint32_t num_threads = 1;
	if (opts.m_comp_params.m_multithreading)
	{
		num_threads = get_num_hardware_threads();
		if (num_threads < 1)
			num_threads = 1;
		if (num_threads > opts.m_max_threads)
			num_threads = opts.m_max_threads;
	}
	job_pool jpool(num_threads);

	// Run the compressor in source-images-only mode: it loads the images, generates mipmaps, and lays out the
	// cubemap/array slices, but does NOT encode. We inherit the relevant CLI options (mip/cubemap/array,
	// sRGB/linear, swizzle, resample, y_flip, ...) from m_comp_params.
	basis_compressor_params params = opts.m_comp_params;
	params.m_pJob_pool = &jpool;
	params.m_read_source_images = true;
	params.m_source_filenames = opts.m_input_filenames;
	params.m_write_output_basis_or_ktx2_files = false;

	// Spoof the format to XUBC7 so the LDR prep path runs (keeps RGBA together, 4x4 block layout), and enable
	// the KTX2 constraint check (all images same resolution + same mip count == the DDS array/cubemap constraints).
	params.set_format_mode(basist::basis_tex_format::cXUBC7);
	params.m_create_ktx2_file = true;

	basis_compressor comp;
	if (!comp.init(params))
	{
		error_printf("-dds: basis_compressor::init() failed\n");
		return false;
	}

	basis_compressor::error_code ec = comp.process_source_images();
	if (ec != basis_compressor::cECSuccess)
	{
		error_printf("-dds: failed loading/preparing source images (error code %u)\n", (uint32_t)ec);
		return false;
	}

	// Output filename: -output_file if given, else <first_input_base>.dds (honoring -output_path).
	std::string output_filename;
	if (opts.m_output_filename.size())
	{
		output_filename = opts.m_output_filename;
	}
	else
	{
		std::string base;
		string_get_filename(opts.m_input_filenames[0].c_str(), base);
		string_remove_extension(base);
		output_filename = base + ".dds";

		if (opts.m_output_path.size())
			string_combine_path(output_filename, opts.m_output_path.c_str(), output_filename.c_str());
	}

	uint32_t width = 0, height = 0, levels = 0, layers = 0, faces = 0;
	uint8_vec dds_data;
	std::string err;
	if (!build_dds(dds_data, comp, dds_params, err, &width, &height, &levels, &layers, &faces))
	{
		error_printf("-dds: %s\n", err.c_str());
		return false;
	}

	if (!write_vec_to_file(output_filename.c_str(), dds_data))
	{
		error_printf("-dds: failed writing output file \"%s\"\n", output_filename.c_str());
		return false;
	}

	// Report the variant actually written: sRGB only when the format has an sRGB DXGI variant AND it was requested.
	// Gated on status output so -quiet / -no_status_output silences it.
	const bool wrote_srgb = comp.get_params().m_ktx2_and_basis_srgb_transfer_function && dds_output_format_has_srgb_variant(dds_params.m_format);
	if (opts.m_comp_params.m_status_output)
		printf("Wrote DDS file \"%s\": %u bytes, format %s %s, %ux%u, %u level(s), %u layer(s), %u face(s)\n",
			output_filename.c_str(), dds_data.size_u32(), get_dds_output_format_string(dds_params.m_format),
			wrote_srgb ? "(sRGB)" : "(UNORM)",
			width, height, levels, layers, faces);

	return true;
}

// -export_dds <FORMAT>: transcodes each input .ktx2 file to FORMAT and writes a
// .DDS file (all mip levels/array layers/cubemap faces). FORMAT is one of
// BC1 BC3 BC4 BC5 BC6H BC7 RGBA32.
static bool export_dds_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("-export_dds: no input .ktx2 file(s) specified (use -file)\n");
		return false;
	}

	basist::transcoder_texture_format fmt;
	if (!parse_export_dds_format(opts.m_export_dds_format, fmt))
	{
		error_printf("-export_dds: invalid format \"%s\". Valid formats: BC1 BC3 BC4 BC5 BC6H BC7 RGBA32\n", opts.m_export_dds_format.c_str());
		return false;
	}

	if ((opts.m_output_filename.size()) && (opts.m_input_filenames.size() > 1))
		printf("Warning: -output_file is ignored with multiple inputs; using <base>_<FORMAT>.dds names\n");

	uint32_t num_succeeded = 0;

	// Per-file errors skip-and-continue so one bad file doesn't abandon the batch.
	for (size_t file_index = 0; file_index < opts.m_input_filenames.size(); file_index++)
	{
		const std::string& input_filename = opts.m_input_filenames[file_index];

		std::string ext(string_get_extension(input_filename));
		if (strcasecmp(ext.c_str(), "ktx2") != 0)
		{
			error_printf("-export_dds: input file \"%s\" is not a .ktx2 file, skipping\n", input_filename.c_str());
			continue;
		}

		uint8_vec ktx2_file_data;
		if (!read_file_to_vec(input_filename.c_str(), ktx2_file_data))
		{
			error_printf("Failed reading input file \"%s\", skipping\n", input_filename.c_str());
			continue;
		}

		basist::ktx2_transcoder dec;
		if (!dec.init(ktx2_file_data.data(), ktx2_file_data.size_u32()))
		{
			error_printf("Failed parsing KTX2 file \"%s\", skipping\n", input_filename.c_str());
			continue;
		}

		uint8_vec dds_data;
		// -1 = auto sRGB; decode flags from the same options -unpack uses (deblocking, HQ, etc.).
		if (!transcode_ktx2_to_dds(dec, fmt, dds_data, -1, get_transcode_flags_from_options(opts)))
		{
			error_printf("Failed exporting \"%s\" to a %s DDS file, skipping\n", input_filename.c_str(), opts.m_export_dds_format.c_str());
			continue;
		}

		// Output name: -output_file (single input only), else <base>_<FORMAT>.dds.
		// -output_path sets the directory.
		std::string output_filename;
		if ((opts.m_output_filename.size()) && (opts.m_input_filenames.size() == 1))
		{
			output_filename = opts.m_output_filename;
		}
		else
		{
			std::string base;
			string_get_filename(input_filename.c_str(), base);
			string_remove_extension(base);
			output_filename = string_format("%s_%s.dds", base.c_str(), opts.m_export_dds_format.c_str());

			if (opts.m_output_path.size())
				string_combine_path(output_filename, opts.m_output_path.c_str(), output_filename.c_str());
		}

		if (!write_vec_to_file(output_filename.c_str(), dds_data))
		{
			error_printf("Failed writing output DDS file \"%s\", skipping\n", output_filename.c_str());
			continue;
		}

		printf("Wrote DDS file \"%s\": %u bytes, format %s, %ux%u, %u level(s), %u layer(s), %u face(s)\n",
			output_filename.c_str(), dds_data.size_u32(), opts.m_export_dds_format.c_str(),
			dec.get_width(), dec.get_height(), dec.get_levels(), maximum<uint32_t>(1, dec.get_layers()), dec.get_faces());

		num_succeeded++;
	}

	return num_succeeded != 0;
}

// Maps an -export_ktx format string to a transcoder_texture_format. Compressed
// formats only (the KTX1 writer doesn't do uncompressed yet). Case-insensitive.
static bool parse_export_ktx_format(const std::string& s, basist::transcoder_texture_format& fmt)
{
	typedef basist::transcoder_texture_format tf;

	static const struct { const char* pName; tf fmt; } s_map[] =
	{
		{ "BC1", tf::cTFBC1_RGB }, { "BC3", tf::cTFBC3_RGBA }, { "BC4", tf::cTFBC4_R }, { "BC5", tf::cTFBC5_RG },
		{ "BC6H", tf::cTFBC6H }, { "BC7", tf::cTFBC7_RGBA },
		{ "ETC1", tf::cTFETC1_RGB }, { "ETC2", tf::cTFETC2_RGBA },
		{ "EAC_R11", tf::cTFETC2_EAC_R11 }, { "EAC_RG11", tf::cTFETC2_EAC_RG11 },
		{ "PVRTC1", tf::cTFPVRTC1_4_RGBA }, { "PVRTC1_RGBA", tf::cTFPVRTC1_4_RGBA }, { "PVRTC1_RGB", tf::cTFPVRTC1_4_RGB },
		{ "PVRTC2", tf::cTFPVRTC2_4_RGBA }, { "PVRTC2_RGBA", tf::cTFPVRTC2_4_RGBA }, { "PVRTC2_RGB", tf::cTFPVRTC2_4_RGB },
		{ "ASTC", tf::cTFASTC_LDR_4x4_RGBA }, { "ASTC_4x4", tf::cTFASTC_LDR_4x4_RGBA },
		{ "ASTC_5x4", tf::cTFASTC_LDR_5x4_RGBA }, { "ASTC_5x5", tf::cTFASTC_LDR_5x5_RGBA },
		{ "ASTC_6x5", tf::cTFASTC_LDR_6x5_RGBA }, { "ASTC_6x6", tf::cTFASTC_LDR_6x6_RGBA },
		{ "ASTC_8x5", tf::cTFASTC_LDR_8x5_RGBA }, { "ASTC_8x6", tf::cTFASTC_LDR_8x6_RGBA },
		{ "ASTC_10x5", tf::cTFASTC_LDR_10x5_RGBA }, { "ASTC_10x6", tf::cTFASTC_LDR_10x6_RGBA },
		{ "ASTC_8x8", tf::cTFASTC_LDR_8x8_RGBA }, { "ASTC_10x8", tf::cTFASTC_LDR_10x8_RGBA },
		{ "ASTC_10x10", tf::cTFASTC_LDR_10x10_RGBA }, { "ASTC_12x10", tf::cTFASTC_LDR_12x10_RGBA },
		{ "ASTC_12x12", tf::cTFASTC_LDR_12x12_RGBA },
		{ "ASTC_HDR_4x4", tf::cTFASTC_HDR_4x4_RGBA }, { "ASTC_HDR_6x6", tf::cTFASTC_HDR_6x6_RGBA },
	};

	for (uint32_t i = 0; i < (uint32_t)std::size(s_map); i++)
	{
		if (strcasecmp(s.c_str(), s_map[i].pName) == 0)
		{
			fmt = s_map[i].fmt;
			return true;
		}
	}

	return false;
}

// -export_ktx <FORMAT>: transcodes each input .ktx2 file to a compressed KTX1 (.ktx)
// file (all mip levels/array layers/cubemap faces). Compressed formats only.
static bool export_ktx_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("-export_ktx: no input .ktx2 file(s) specified (use -file)\n");
		return false;
	}

	basist::transcoder_texture_format fmt;
	if (!parse_export_ktx_format(opts.m_export_ktx_format, fmt))
	{
		error_printf("-export_ktx: invalid/unsupported format \"%s\". Valid: BC1 BC3 BC4 BC5 BC6H BC7 ETC1 ETC2 EAC_R11 EAC_RG11 PVRTC1[_RGB] PVRTC2[_RGB] ASTC ASTC_<WxH> ASTC_HDR_4x4 ASTC_HDR_6x6\n", opts.m_export_ktx_format.c_str());
		return false;
	}

	if ((opts.m_output_filename.size()) && (opts.m_input_filenames.size() > 1))
		printf("Warning: -output_file is ignored with multiple inputs; using <base>_<FORMAT>.ktx names\n");

	uint32_t num_succeeded = 0;

	// Per-file errors skip-and-continue so one bad file doesn't abandon the batch.
	for (size_t file_index = 0; file_index < opts.m_input_filenames.size(); file_index++)
	{
		const std::string& input_filename = opts.m_input_filenames[file_index];

		std::string ext(string_get_extension(input_filename));
		if (strcasecmp(ext.c_str(), "ktx2") != 0)
		{
			error_printf("-export_ktx: input file \"%s\" is not a .ktx2 file, skipping\n", input_filename.c_str());
			continue;
		}

		uint8_vec ktx2_file_data;
		if (!read_file_to_vec(input_filename.c_str(), ktx2_file_data))
		{
			error_printf("Failed reading input file \"%s\", skipping\n", input_filename.c_str());
			continue;
		}

		basist::ktx2_transcoder dec;
		if (!dec.init(ktx2_file_data.data(), ktx2_file_data.size_u32()))
		{
			error_printf("Failed parsing KTX2 file \"%s\", skipping\n", input_filename.c_str());
			continue;
		}

		uint8_vec ktx_data;
		// -1 = auto sRGB; decode flags from the same options -unpack uses (deblocking, HQ, etc.).
		if (!transcode_ktx2_to_ktx(dec, fmt, ktx_data, -1, get_transcode_flags_from_options(opts)))
		{
			error_printf("Failed exporting \"%s\" to a %s KTX file, skipping\n", input_filename.c_str(), opts.m_export_ktx_format.c_str());
			continue;
		}

		// Output name: -output_file (single input only), else <base>_<FORMAT>.ktx.
		// -output_path sets the directory.
		std::string output_filename;
		if ((opts.m_output_filename.size()) && (opts.m_input_filenames.size() == 1))
		{
			output_filename = opts.m_output_filename;
		}
		else
		{
			std::string base;
			string_get_filename(input_filename.c_str(), base);
			string_remove_extension(base);
			output_filename = string_format("%s_%s.ktx", base.c_str(), opts.m_export_ktx_format.c_str());

			if (opts.m_output_path.size())
				string_combine_path(output_filename, opts.m_output_path.c_str(), output_filename.c_str());
		}

		if (!write_vec_to_file(output_filename.c_str(), ktx_data))
		{
			error_printf("Failed writing output KTX file \"%s\", skipping\n", output_filename.c_str());
			continue;
		}

		printf("Wrote KTX file \"%s\": %u bytes, format %s, %ux%u, %u level(s), %u layer(s), %u face(s)\n",
			output_filename.c_str(), ktx_data.size_u32(), opts.m_export_ktx_format.c_str(),
			dec.get_width(), dec.get_height(), dec.get_levels(), maximum<uint32_t>(1, dec.get_layers()), dec.get_faces());

		num_succeeded++;
	}

	return num_succeeded != 0;
}

// --tinydds_info <file(s)>: prints high-level header info for each input .DDS file (via tinydds)
// (header only, no pixel decode) -- a quick sanity check for exported DDS files.
static bool tinydds_info_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("--tinydds_info: no input .DDS file(s) specified (use -file)\n");
		return false;
	}

	uint32_t num_ok = 0;
	for (size_t i = 0; i < opts.m_input_filenames.size(); i++)
	{
		if (i)
			printf("\n");
		if (print_dds_info(opts.m_input_filenames[i].c_str()))
			num_ok++;
	}

	return num_ok != 0;
}

// --ktx_info <file(s)>: prints the KTX1 (.ktx) header fields for each input file
// (header only, no key/value or image data) -- a quick sanity check for exports.
static bool ktx_info_mode(command_line_params& opts)
{
	if (!opts.m_input_filenames.size())
	{
		error_printf("--ktx_info: no input .ktx file(s) specified (use -file)\n");
		return false;
	}

	uint32_t num_ok = 0;
	for (size_t i = 0; i < opts.m_input_filenames.size(); i++)
	{
		if (i)
			printf("\n");
		if (print_ktx_info(opts.m_input_filenames[i].c_str()))
			num_ok++;
	}

	return num_ok != 0;
}

static int main_internal(int argc, const char** argv)
{
	printf("Basis Universal LDR/HDR GPU Texture Supercompression System v" BASISU_TOOL_VERSION

#if defined(_ARM64EC_) || defined(_ARM64_)
		" (ARM64)"
#elif defined(_M_IX86)
		" (x86)"
#elif defined(_M_X64) || defined(_M_AMD64)
		" (x64)"
#elif defined(__wasi__)
		" (WASI"
#if BASISU_WASI_THREADS
		" Threaded"
#endif
		")"
#endif

		"\nCopyright (C) 2019-2026 Binomial LLC, All rights reserved\n");

#ifdef FORCE_SAN_FAILURE
	force_san_failure();
#endif

	//interval_timer tm;
	//tm.start();

	// See if OpenCL support has been disabled. We don't want to parse the command line until the lib is initialized
	bool use_opencl = false;
	bool opencl_force_serialization = false;
	bool astc_peek_flag = false;
	bool astc_fuzz_flag = false;

	for (int i = 1; i < argc; i++)
	{
		if (opt_match(argv[i], {"-opencl", "-clbench"}))
			use_opencl = true;

		if (opt_match(argv[i], "-opencl_serialize"))
			opencl_force_serialization = true;

		if (opt_match(argv[i], {"-peek_astc", "-peek"}))
			astc_peek_flag = true;

		if (opt_match(argv[i], "-dev_astc_fuzz"))
			astc_fuzz_flag = true;
	}

#if !BASISU_SUPPORT_OPENCL
	if (use_opencl)
	{
		fprintf(stderr, "WARNING: -opencl specified, but OpenCL support was not defined or enabled at compile time! With cmake, use -D BASISU_OPENCL=1. Falling back to CPU compression.\n");
	}
#endif
		
	basisu_encoder_init(use_opencl, opencl_force_serialization);

#if 0
	image a, b;
	if (!load_png("d:/dev/test_images/bik/bik23.png", a))
		return EXIT_FAILURE;
	if (!load_png("c:/dev/e23_4.png", b))
		return EXIT_FAILURE;

	fmt_printf("Resolution: {}x{}\n", a.get_width(), a.get_height());

	print_image_metrics(a, b);

	psnr_hvs_metrics hvs_metrics;
	if (!psnr_hvs_compute_metrics(a, b, hvs_metrics))
		return EXIT_FAILURE;
	psnr_hvs_print_metrics(hvs_metrics);
	
#if 0
	for (uint32_t y = 0; y < a.get_height(); y++)
	{
		for (uint32_t x = 0; x < a.get_width(); x++)
		{
			a(x, y).set(get_601_y(a(x, y).r, a(x, y).g, a(x, y).b));
			b(x, y).set(get_601_y(b(x, y).r, b(x, y).g, b(x, y).b));
		}
	}

	image_metrics im;
	image_metrics::hvs_metrics hvs[3];
			
	double sum_hvs_mseh = 0.0f;
	double sum_hvsm_mseh = 0.0f;

	for (uint32_t c = 0; c < 3; c++)
	{
		if (!im.compute_hvs_chan(a, b, c, hvs[c]))
			return EXIT_FAILURE;
		
		fmt_printf("{c}: PSNR-HVS: {}, PSNR-HVS-M: {}\n", (int)("RGB"[c]), hvs[c].psnr_hvs, hvs[c].psnr_hvsm);
		
		sum_hvs_mseh += hvs[c].mseh_hvs;
		sum_hvsm_mseh += hvs[c].mseh_hvsm;
	}

	sum_hvs_mseh /= 3.0f;
	sum_hvsm_mseh /= 3.0f;

	fmt_printf("RGB PSNR-HVS: {}\n", psnr_hvs_calc_psnr(sum_hvs_mseh, 1.0f));
	fmt_printf("RGB PSNR-HVS-M: {}\n", psnr_hvs_calc_psnr(sum_hvsm_mseh, 1.0f));
#endif
	
	exit(0);
#endif

	// Standalone DDS reader/transcoder test harness (see test_dds()).
	if ((argc >= 2) && (strcmp(argv[1], "-test_dds") == 0))
	{
		return test_dds(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE;
	}

	// DDS transcoder output-buffer overrun / argument-rejection sanity test (see test_dds_overwrite()).
	if ((argc >= 2) && (strcmp(argv[1], "-test_dds_overwrite") == 0))
	{
		return test_dds_overwrite(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE;
	}

	if (astc_fuzz_flag)
	{
		bool status = xuastc_ldr_decoder_fuzz_test();
		return status ? EXIT_SUCCESS : EXIT_FAILURE;
	}

	if (astc_peek_flag)
	{
		if (argc != 3)
		{
			fmt_error_printf("Requires filename argument of .astc file\n");
			return EXIT_FAILURE;
		}

		bool status = peek_astc_file(argv[2]);
		return status ? EXIT_SUCCESS : EXIT_FAILURE;
	}

	//printf("Encoder and transcoder libraries initialized in %3.3f ms\n", tm.get_elapsed_ms());
		
	if (argc == 1)
	{
		print_usage();
		return EXIT_FAILURE;
	}
		
	command_line_params opts;

#if defined(__wasi__) && !BASISU_WASI_THREADS
	opts.m_comp_params.m_multithreading = false;
#endif

	if (!opts.parse(argc, argv))
	{
		//print_usage();
		return EXIT_FAILURE;
	}

#if BASISU_SUPPORT_SSE
	printf("Using SSE 4.1: %u, Multithreading: %u, Zstandard support: %u, OpenCL: %u\n", g_cpu_supports_sse41, (uint32_t)opts.m_comp_params.m_multithreading, basist::basisu_transcoder_supports_ktx2_zstd(), opencl_is_available());
#else
	printf("No SSE, Multithreading: %u, Zstandard support: %u, OpenCL: %u\n", (uint32_t)opts.m_comp_params.m_multithreading, basist::basisu_transcoder_supports_ktx2_zstd(), opencl_is_available());
#endif
		
	if (!opts.process_listing_files())
		return EXIT_FAILURE;

	if (opts.m_mode == cDefault)
	{
		for (size_t i = 0; i < opts.m_input_filenames.size(); i++)
		{
			std::string ext(string_get_extension(opts.m_input_filenames[i]));
			if ((strcasecmp(ext.c_str(), "basis") == 0) || (strcasecmp(ext.c_str(), "ktx") == 0) || (strcasecmp(ext.c_str(), "ktx2") == 0))
			{
				// If they haven't specified any modes, and they give us a .basis/.ktx2 file, then assume they want to unpack it.
				// NOTE: a bare .dds is intentionally NOT auto-unpacked -- it is a valid compressor SOURCE image
				// (read_uncompressed_dds_file). To unpack a .dds use -unpack, or -info for header info.
				opts.m_mode = cUnpack;
				break;
			}
		}
	}

	// Note: -info/-validate/-unpack all flow through unpack_and_validate_mode(), which sniffs each input's
	// magic per-file (KTX2 / DDS / KTX1 / .basis) and routes it to the right handler -- so a mixed-type input
	// list (e.g. a .ktx2 and a .dds on one command line) works without any extension-based mode rerouting.

	bool status = false;

	switch (opts.m_mode)
	{
	case cDefault:
	case cCompress:
		status = compress_mode(opts);
		break;
	case cValidate:
	case cInfo:
	case cUnpack:
		status = unpack_and_validate_mode(opts);
		break;
	case cCompare:
		status = compare_mode(opts);
		break;
	case cCompareHVS:
		status = compare_hvs_mode(opts);
		break;
	case cHDRCompare:
		status = hdr_compare_mode(opts);
		break;
	case cImageDumpStats:
		status = image_stats_mode(opts);
		break;
	case cVersion:
		status = true; // We printed the version at the beginning of main_internal
		break;
	case cBench:
		status = bench_mode(opts);
		break;
	case cCompSize:
		status = compsize_mode(opts);
		break;
	case cTestLDR:
		status = test_mode_ldr(opts);
		break;
	case cTestXUASTCLDR:
		status = test_mode_xuastc_ldr(opts);
		break;
	case cTestCodecs:
		status = test_codecs_run(opts);
		break;
	case cTestCodecsGen:
		status = test_codecs_generate(opts);
		break;
	case cTestHDR_4x4:
		status = test_mode_hdr(opts, basist::basis_tex_format::cUASTC_HDR_4x4, std::size(g_hdr_4x4_test_files), g_hdr_4x4_test_files, 0.0f);
		break;
	case cTestHDR_6x6:
		status = test_mode_hdr(opts, basist::basis_tex_format::cASTC_HDR_6x6, std::size(g_hdr_6x6_test_files), g_hdr_6x6_test_files, 0.0f);
		break;
	case cTestHDR_6x6i:
		status = test_mode_hdr(opts, basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE, std::size(g_hdr_6x6i_test_files), g_hdr_6x6i_test_files, 0.0f);
		
		if (status)
		{
			status = test_mode_hdr(opts, basist::basis_tex_format::cUASTC_HDR_6x6_INTERMEDIATE, std::size(g_hdr_6x6i_l_test_files), g_hdr_6x6i_l_test_files, 500.0f);
		}

		break;
	case cCLBench:
		status = clbench_mode(opts);
		break;
	case cSplitImage:
		status = split_image_mode(opts);
		break;
	case cCombineImages:
		status = combine_images_mode(opts);
		break;
	case cExtractChannel:
		status = extract_channel_mode(opts);
		break;
	case cExtractSwizzle:
		status = extract_swizzle_mode(opts);
		break;
	case cExtractRegion:
		status = extract_region_mode(opts);
		break;
	case cTextToPng:
		status = text_to_png(opts.m_text_image_in.c_str(), opts.m_text_image_out.c_str());
		break;
	case cPngToText:
		status = png_to_text(opts.m_text_image_in.c_str(), opts.m_text_image_out.c_str());
		break;
	case cTonemapImage:
		status = tonemap_image_mode(opts);
		break;
	case cDDS:
		status = dds_mode(opts);
		break;
	case cExportDDS:
		status = export_dds_mode(opts);
		break;
	case cExportKTX:
		status = export_ktx_mode(opts);
		break;
	case cTinyDDSInfo:
		status = tinydds_info_mode(opts);
		break;
	case cKTXInfo:
		status = ktx_info_mode(opts);
		break;
	case cBenchmarkSingle:
		status = benchmark_single_mode(opts);
		break;
	case cBenchmarkSweep:
		status = benchmark_sweep_mode(opts);
		break;
	default:
		assert(0);
		break;
	}

	return status ? EXIT_SUCCESS : EXIT_FAILURE;
}

//-----------------------------------------------------------------------------------

#if CLEAR_WIN32_CONSOLE
void clear_console() 
{
	//if (!IsDebuggerPresent())
	//	return;

	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	DWORD consoleSize, charsWritten;
	COORD topLeft = { 0, 0 };

	// Get console screen buffer info
	GetConsoleScreenBufferInfo(hConsole, &csbi);
	consoleSize = csbi.dwSize.X * csbi.dwSize.Y;

	// Fill the entire screen with spaces
	FillConsoleOutputCharacter(hConsole, ' ', consoleSize, topLeft, &charsWritten);

	// Set the cursor at the top left corner
	SetConsoleCursorPosition(hConsole, topLeft);
}
#endif

//-----------------------------------------------------------------------------------

// Attempt to detect AddressSanitizer (ASan) across compilers - only used for debug 
// output purposes.
#ifndef DETECT_ASAN_H
#define DETECT_ASAN_H

// Start with ASAN disabled
#undef USING_ASAN

#if defined(__wasi__)
    #define USING_ASAN 0
#else
    // --- Clang / Apple Clang: use __has_feature ---
    #if defined(__has_feature)
    #  if __has_feature(address_sanitizer)
    #    define USING_ASAN 1
    #  endif
    #endif

    // --- GCC: __SANITIZE_ADDRESS__ ---
    #if defined(__SANITIZE_ADDRESS__)
    #  define USING_ASAN 1
    #endif
#endif // #if defined(__wasi__)

// If still undefined, ensure USING_ASAN is cleanly defined to 0
#ifndef USING_ASAN
#  define USING_ASAN 0
#endif

#endif // DETECT_ASAN_H

//-----------------------------------------------------------------------------------

int main(int argc, const char** argv)
{
#ifdef _WIN32
	SetConsoleOutputCP(CP_UTF8);
#endif

#if CLEAR_WIN32_CONSOLE
	clear_console();
	fmt_printf("{}\n", argv[0]);
#endif

#if defined(DEBUG) || defined(_DEBUG)
	printf("DEBUG or _DEBUG defined\n");
#endif
#if !defined(NDEBUG)
	printf("NDEBUG is NOT defined\n");
#endif
#if USING_ASAN
	printf("Address sanitizer enabled\n");
#endif
					
	int status = EXIT_FAILURE;

#if BASISU_CATCH_EXCEPTIONS
	try
	{
		 status = main_internal(argc, argv);
	}
	catch (const std::exception &exc)
	{
		 fprintf(stderr, "Fatal error: Caught exception \"%s\"\n", exc.what());
	}
	catch (...)
	{
		fprintf(stderr, "Fatal error: Uncaught exception!\n");
	}
#else
	status = main_internal(argc, argv);
#endif

	return status;
}
