1
0
mirror of https://github.com/microsoft/DirectXTex synced 2024-11-21 12:00:06 +00:00

texdiag: diff command updated with -c and -t highlighting switches

This commit is contained in:
Chuck Walbourn 2021-06-09 17:40:17 -07:00
parent 848e37625a
commit 2f6e506a8c

View File

@ -43,6 +43,8 @@
#include "DirectXTex.h"
#include <DirectXPackedVector.h>
//Uncomment to add support for OpenEXR (.exr)
//#define USE_OPENEXR
@ -81,6 +83,8 @@ enum OPTIONS : uint32_t
OPT_EXPAND_LUMINANCE,
OPT_TARGET_PIXELX,
OPT_TARGET_PIXELY,
OPT_DIFF_COLOR,
OPT_THRESHOLD,
OPT_FILELIST,
OPT_MAX
};
@ -130,6 +134,8 @@ const SValue g_pOptions[] =
{ L"xlum", OPT_EXPAND_LUMINANCE },
{ L"targetx", OPT_TARGET_PIXELX },
{ L"targety", OPT_TARGET_PIXELY },
{ L"c", OPT_DIFF_COLOR },
{ L"t", OPT_THRESHOLD },
{ L"flist", OPT_FILELIST },
{ nullptr, 0 }
};
@ -666,6 +672,8 @@ namespace
wprintf(L" -o <filename> output filename\n");
wprintf(L" -l force output filename to lower case\n");
wprintf(L" -y overwrite existing output file (if any)\n");
wprintf(L" -c <hex-RGB> highlight difference color (defaults to off)\n");
wprintf(L" -t <threshold> highlight threshold (defaults to 0.25)\n");
wprintf(L"\n (dumpbc only)\n");
wprintf(L" -targetx <num> dump pixels at location x (defaults to all)\n");
wprintf(L" -targety <num> dump pixels at location y (defaults to all)\n");
@ -1384,6 +1392,8 @@ namespace
const Image& image2,
TEX_FILTER_FLAGS dwFilter,
DXGI_FORMAT format,
uint32_t diffColor,
float threshold,
ScratchImage& result)
{
if (!image1.pixels || !image2.pixels)
@ -1429,9 +1439,14 @@ namespace
if (!imageA || !imageB)
return E_POINTER;
XMVECTOR colorValue = PackedVector::XMLoadColor(reinterpret_cast<const PackedVector::XMCOLOR*>(&diffColor));
colorValue = XMVectorSelect(g_XMIdentityR3, colorValue, g_XMSelect1110);
ScratchImage diffImage;
HRESULT hr = TransformImage(*imageA, [&](XMVECTOR* outPixels, const XMVECTOR * inPixels, size_t width, size_t y)
{
XMVECTOR tolerance = XMVectorReplicate(threshold);
auto *inPixelsB = reinterpret_cast<XMVECTOR*>(imageB->pixels + (y*imageB->rowPitch));
for (size_t x = 0; x < width; ++x)
@ -1441,17 +1456,26 @@ namespace
v1 = XMVectorSubtract(v1, v2);
v1 = XMVectorAbs(v1);
v1 = XMVectorSelect(g_XMIdentityR3, v1, g_XMSelect1110);
*outPixels++ = v1;
if (diffColor && XMVector3GreaterOrEqual(v1, tolerance))
{
*outPixels++ = colorValue;
}
else
{
*outPixels++ = v1;
}
}
}, (format == DXGI_FORMAT_R32G32B32A32_FLOAT) ? result : diffImage);
if (FAILED(hr))
return hr;
if (format == DXGI_FORMAT_R32G32B32A32_FLOAT)
if (format == diffImage.GetMetadata().format)
{
std::swap(diffImage, result);
return S_OK;
}
return Convert(diffImage.GetImages(), diffImage.GetImageCount(), diffImage.GetMetadata(), format, dwFilter, TEX_THRESHOLD_DEFAULT, result);
}
@ -3189,6 +3213,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT;
int pixelx = -1;
int pixely = -1;
uint32_t diffColor = 0;
float threshold = 0.25f;
DXGI_FORMAT diffFormat = DXGI_FORMAT_B8G8R8A8_UNORM;
uint32_t fileType = WIC_CODEC_BMP;
wchar_t szOutputFile[MAX_PATH] = {};
@ -3263,6 +3289,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
case OPT_OUTPUTFILE:
case OPT_TARGET_PIXELX:
case OPT_TARGET_PIXELY:
case OPT_DIFF_COLOR:
case OPT_THRESHOLD:
case OPT_FILELIST:
if (!*pValue)
{
@ -3375,6 +3403,27 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}
break;
case OPT_DIFF_COLOR:
if (swscanf_s(pValue, L"%x", &diffColor) != 1)
{
printf("Invalid value specified with -c (%ls)\n", pValue);
printf("\n");
PrintUsage();
return 1;
}
diffColor &= 0xFFFFFF;
break;
case OPT_THRESHOLD:
if (swscanf_s(pValue, L"%f", &threshold) != 1)
{
printf("Invalid value specified with -t (%ls)\n", pValue);
printf("\n");
PrintUsage();
return 1;
}
break;
case OPT_FILELIST:
{
std::wifstream inFile(pValue);
@ -3491,7 +3540,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
wprintf(L"WARNING: ignoring all images but first one in each file\n");
ScratchImage diffImage;
hr = Difference(*image1->GetImage(0, 0, 0), *image2->GetImage(0, 0, 0), dwFilter, diffFormat, diffImage);
hr = Difference(*image1->GetImage(0, 0, 0), *image2->GetImage(0, 0, 0), dwFilter, diffFormat, diffColor, threshold, diffImage);
if (FAILED(hr))
{
wprintf(L"Failed diffing images (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));