﻿// 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_xuastc_ldr_channel_weights[0] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 1]), 1.0f, 1024.0f);
			m_comp_params.m_xuastc_ldr_channel_weights[1] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 2]), 1.0f, 1024.0f);
			m_comp_params.m_xuastc_ldr_channel_weights[2] = (uint32_t)clamp<float>((float)atof(arg_v[arg_index + 3]), 1.0f, 1024.0f);
			m_comp_params.m_xuastc_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_xuastc_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_xuastc_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_xuastc_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_xuastc_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;
}
