texconv: add --ignore-srgb, --wic-uncompressed and revisit --wic-lossless (#555)

This commit is contained in:
Chuck Walbourn 2024-11-12 20:30:49 -08:00 коммит произвёл GitHub
Родитель 37a18e9021
Коммит 2b6f585157
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
1 изменённых файлов: 51 добавлений и 8 удалений

Просмотреть файл

@ -117,6 +117,7 @@ namespace
OPT_TGAZEROALPHA,
OPT_WIC_LOSSLESS,
OPT_WIC_MULTIFRAME,
OPT_WIC_UNCOMPRESSED,
OPT_NOLOGO,
OPT_TIMING,
OPT_SEPALPHA,
@ -140,6 +141,7 @@ namespace
OPT_INVERT_Y,
OPT_RECONSTRUCT_Z,
OPT_BCNONMULT4FIX,
OPT_IGNORE_SRGB_METADATA,
#ifdef USE_XBOX_EXTS
OPT_USE_XBOX,
OPT_XGMODE,
@ -282,6 +284,7 @@ namespace
{ L"help", OPT_HELP },
{ L"horizontal-flip", OPT_HFLIP },
{ L"ignore-mips", OPT_DDS_IGNORE_MIPS },
{ L"ignore-srgb", OPT_IGNORE_SRGB_METADATA },
{ L"image-filter", OPT_FILTER },
{ L"invert-y", OPT_INVERT_Y },
{ L"keep-coverage", OPT_PRESERVE_ALPHA_COVERAGE },
@ -311,6 +314,7 @@ namespace
{ L"vertical-flip", OPT_VFLIP },
{ L"wic-lossless", OPT_WIC_LOSSLESS },
{ L"wic-multiframe", OPT_WIC_MULTIFRAME },
{ L"wic-uncompressed", OPT_WIC_UNCOMPRESSED },
{ L"wic-quality", OPT_WIC_QUALITY },
{ L"width", OPT_WIDTH },
{ L"x2-bias", OPT_X2_BIAS },
@ -591,7 +595,6 @@ namespace
#ifdef USE_OPENEXR
{ L"exr", CODEC_EXR },
#endif
{ L"heic", WIC_CODEC_HEIF },
{ L"heif", WIC_CODEC_HEIF },
{ nullptr, CODEC_DDS }
};
@ -817,6 +820,9 @@ namespace
L" -xgmode <mode>, --xbox-mode <mode>\n"\
L" Tile/swizzle using provided memory layout mode\n"
#endif
L"\n"
L" (PNG, JPG, TIF, TGA input only)\n"
L" --ignore-srgb Ignores any gamma setting in the metadata\n"
L"\n"
L" (TGA input only)\n"
L" --tga-zero-alpha Allow all zero alpha channel files to be loaded 'as is'\n"
@ -824,10 +830,11 @@ namespace
L" (TGA output only)\n"
L" -tga20 Write file including TGA 2.0 extension area\n"
L"\n"
L" (BMP, PNG, JPG, TIF, WDP output only)\n"
L" (BMP, PNG, JPG, TIF, WDP, and HIEF output only)\n"
L" -wicq <quality>, --wic-quality <quality>\n"
L" When writing images with WIC use quality (0.0 to 1.0)\n"
L" --wic-lossless When writing images with WIC use lossless mode\n"
L" --wic-uncompressed When writing images with WIC use uncompressed mode\n"
L" --wic-multiframe When writing images with WIC encode multiframe images\n"
L"\n"
L" -nologo suppress copyright message\n"
@ -2088,6 +2095,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
else if (_wcsicmp(ext.c_str(), L".tga") == 0)
{
TGA_FLAGS tgaFlags = (IsBGR(format)) ? TGA_FLAGS_BGR : TGA_FLAGS_NONE;
if (dwOptions & (UINT64_C(1) << OPT_IGNORE_SRGB_METADATA))
{
tgaFlags |= TGA_FLAGS_IGNORE_SRGB;
}
if (dwOptions & (UINT64_C(1) << OPT_TGAZEROALPHA))
{
tgaFlags |= TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA;
@ -2179,7 +2190,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
WIC_FLAGS wicFlags = WIC_FLAGS_NONE | dwFilter;
if (FileType == CODEC_DDS)
{
wicFlags |= WIC_FLAGS_ALL_FRAMES;
}
if (dwOptions & (UINT64_C(1) << OPT_IGNORE_SRGB_METADATA))
{
wicFlags |= WIC_FLAGS_IGNORE_SRGB;
}
hr = LoadFromWICFile(curpath.c_str(), wicFlags, &info, *image);
if (FAILED(hr))
@ -2194,7 +2211,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}
else if (_wcsicmp(ext.c_str(), L".webp") == 0)
{
wprintf(L"INFO: This format requires installing the WEBP Image Extensions - https://www.microsoft.com/p/webp-image-extensions/9pg2dk419drg\n");
wprintf(L"INFO: This format requires installing the WEBP Image Extensions - https://apps.microsoft.com/detail/9PG2DK419DRG\n");
}
}
continue;
@ -3793,18 +3810,20 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
hr = SaveToWICFile(img, nimages, WIC_FLAGS_NONE, GetWICCodec(codec), destName.c_str(), nullptr,
[&](IPropertyBag2* props)
{
const bool wicLossless = (dwOptions & (UINT64_C(1) << OPT_WIC_LOSSLESS)) != 0;
const bool lossless = (dwOptions & (UINT64_C(1) << OPT_WIC_LOSSLESS)) != 0;
const bool uncompressed = (dwOptions & (UINT64_C(1) << OPT_WIC_UNCOMPRESSED)) != 0;
switch (FileType)
{
default:
case WIC_CODEC_JPEG:
if (wicLossless || wicQuality >= 0.f)
if (wicQuality >= 0.f)
{
PROPBAG2 options = {};
VARIANT varValues = {};
options.pstrName = const_cast<wchar_t*>(L"ImageQuality");
varValues.vt = VT_R4;
varValues.fltVal = (wicLossless) ? 1.f : wicQuality;
varValues.fltVal = wicQuality;
std::ignore = props->Write(1, &options, &varValues);
}
break;
@ -3813,7 +3832,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
{
PROPBAG2 options = {};
VARIANT varValues = {};
if (wicLossless)
if (uncompressed)
{
options.pstrName = const_cast<wchar_t*>(L"TiffCompressionMethod");
varValues.vt = VT_UI1;
@ -3829,13 +3848,37 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}
break;
case WIC_CODEC_HEIF:
{
PROPBAG2 options = {};
VARIANT varValues = {};
if (uncompressed)
{
options.pstrName = const_cast<wchar_t*>(L"HeifCompressionMethod");
varValues.vt = VT_UI1;
#if defined(NTDDI_WIN10_CU)
varValues.bVal = WICHeifCompressionNone;
#else
varValues.bVal = 0x1 /* WICHeifCompressionNone */;
#endif
}
else if (wicQuality >= 0.f)
{
options.pstrName = const_cast<wchar_t*>(L"ImageQuality");
varValues.vt = VT_R4;
varValues.fltVal = wicQuality;
}
std::ignore = props->Write(1, &options, &varValues);
}
break;
case WIC_CODEC_WMP:
case CODEC_HDP:
case CODEC_JXR:
{
PROPBAG2 options = {};
VARIANT varValues = {};
if (wicLossless)
if (lossless)
{
options.pstrName = const_cast<wchar_t*>(L"Lossless");
varValues.vt = VT_BOOL;