mirror of
https://github.com/microsoft/DirectXTex.git
synced 2026-02-04 04:16:12 +01:00
tex tools updated with support for long file paths with Windows 10 (#364)
This commit is contained in:
@@ -291,6 +291,9 @@
|
||||
<Project>{371b9fa9-4c90-4ac6-a123-aced756d6c77}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
||||
@@ -15,4 +15,9 @@
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Manifest>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -421,6 +421,9 @@
|
||||
<Project>{371b9fa9-4c90-4ac6-a123-aced756d6c77}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
||||
@@ -15,4 +15,9 @@
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Manifest>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -297,6 +297,9 @@
|
||||
<Project>{371b9fa9-4c90-4ac6-a123-aced756d6c77}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
||||
@@ -15,4 +15,9 @@
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Manifest>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -427,6 +427,9 @@
|
||||
<Project>{371b9fa9-4c90-4ac6-a123-aced756d6c77}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
||||
@@ -15,4 +15,9 @@
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Manifest Include="settings.manifest">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Manifest>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
21
Texassemble/settings.manifest
Normal file
21
Texassemble/settings.manifest
Normal file
@@ -0,0 +1,21 @@
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows Vista -->
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||
<!-- Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<!-- Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows 10 / Windows 11 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
<asmv3:application>
|
||||
<asmv3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
|
||||
<ws2:longPathAware>true</ws2:longPathAware>
|
||||
</asmv3:windowsSettings>
|
||||
</asmv3:application>
|
||||
</assembly>
|
||||
@@ -126,7 +126,7 @@ namespace
|
||||
|
||||
struct SConversion
|
||||
{
|
||||
wchar_t szSrc[MAX_PATH];
|
||||
std::wstring szSrc;
|
||||
};
|
||||
|
||||
struct SValue
|
||||
@@ -432,11 +432,11 @@ namespace
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SearchForFiles(const wchar_t* path, std::list<SConversion>& files, bool recursive)
|
||||
void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive)
|
||||
{
|
||||
// Process files
|
||||
WIN32_FIND_DATAW findData = {};
|
||||
ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path,
|
||||
ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(),
|
||||
FindExInfoBasic, &findData,
|
||||
FindExSearchNameMatch, nullptr,
|
||||
FIND_FIRST_EX_LARGE_FETCH)));
|
||||
@@ -446,12 +446,8 @@ namespace
|
||||
{
|
||||
if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)))
|
||||
{
|
||||
wchar_t drive[_MAX_DRIVE] = {};
|
||||
wchar_t dir[_MAX_DIR] = {};
|
||||
_wsplitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0);
|
||||
|
||||
SConversion conv = {};
|
||||
_wmakepath_s(conv.szSrc, drive, dir, findData.cFileName, nullptr);
|
||||
conv.szSrc = path.parent_path().append(findData.cFileName).native();
|
||||
files.push_back(conv);
|
||||
}
|
||||
|
||||
@@ -463,15 +459,9 @@ namespace
|
||||
// Process directories
|
||||
if (recursive)
|
||||
{
|
||||
wchar_t searchDir[MAX_PATH] = {};
|
||||
{
|
||||
wchar_t drive[_MAX_DRIVE] = {};
|
||||
wchar_t dir[_MAX_DIR] = {};
|
||||
_wsplitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0);
|
||||
_wmakepath_s(searchDir, drive, dir, L"*", nullptr);
|
||||
}
|
||||
auto searchDir = path.parent_path().append(L"*");
|
||||
|
||||
hFile.reset(safe_handle(FindFirstFileExW(searchDir,
|
||||
hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(),
|
||||
FindExInfoBasic, &findData,
|
||||
FindExSearchLimitToDirectories, nullptr,
|
||||
FIND_FIRST_EX_LARGE_FETCH)));
|
||||
@@ -484,17 +474,7 @@ namespace
|
||||
{
|
||||
if (findData.cFileName[0] != L'.')
|
||||
{
|
||||
wchar_t subdir[MAX_PATH] = {};
|
||||
|
||||
{
|
||||
wchar_t drive[_MAX_DRIVE] = {};
|
||||
wchar_t dir[_MAX_DIR] = {};
|
||||
wchar_t fname[_MAX_FNAME] = {};
|
||||
wchar_t ext[_MAX_FNAME] = {};
|
||||
_wsplitpath_s(path, drive, dir, fname, ext);
|
||||
wcscat_s(dir, findData.cFileName);
|
||||
_wmakepath_s(subdir, drive, dir, fname, ext);
|
||||
}
|
||||
auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str());
|
||||
|
||||
SearchForFiles(subdir, files, recursive);
|
||||
}
|
||||
@@ -510,36 +490,38 @@ namespace
|
||||
{
|
||||
std::list<SConversion> flist;
|
||||
std::set<std::wstring> excludes;
|
||||
wchar_t fname[1024] = {};
|
||||
|
||||
auto fname = std::make_unique<wchar_t[]>(32768);
|
||||
for (;;)
|
||||
{
|
||||
inFile >> fname;
|
||||
inFile >> fname.get();
|
||||
if (!inFile)
|
||||
break;
|
||||
|
||||
if (*fname == L'#')
|
||||
if (fname[0] == L'#')
|
||||
{
|
||||
// Comment
|
||||
}
|
||||
else if (*fname == L'-')
|
||||
else if (fname[0] == L'-')
|
||||
{
|
||||
if (flist.empty())
|
||||
{
|
||||
wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname);
|
||||
wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname.get());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::filesystem::path path(fname + 1);
|
||||
std::filesystem::path path(fname.get() + 1);
|
||||
auto& npath = path.make_preferred();
|
||||
if (wcspbrk(fname, L"?*") != nullptr)
|
||||
if (wcspbrk(fname.get(), L"?*") != nullptr)
|
||||
{
|
||||
std::list<SConversion> removeFiles;
|
||||
SearchForFiles(npath.c_str(), removeFiles, false);
|
||||
SearchForFiles(npath, removeFiles, false);
|
||||
|
||||
for (auto& it : removeFiles)
|
||||
{
|
||||
_wcslwr_s(it.szSrc);
|
||||
excludes.insert(it.szSrc);
|
||||
std::wstring name = it.szSrc;
|
||||
std::transform(name.begin(), name.end(), name.begin(), towlower);
|
||||
excludes.insert(name);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -550,16 +532,16 @@ namespace
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (wcspbrk(fname, L"?*") != nullptr)
|
||||
else if (wcspbrk(fname.get(), L"?*") != nullptr)
|
||||
{
|
||||
std::filesystem::path path(fname);
|
||||
SearchForFiles(path.make_preferred().c_str(), flist, false);
|
||||
std::filesystem::path path(fname.get());
|
||||
SearchForFiles(path.make_preferred(), flist, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SConversion conv = {};
|
||||
std::filesystem::path path(fname);
|
||||
wcscpy_s(conv.szSrc, path.make_preferred().c_str());
|
||||
std::filesystem::path path(fname.get());
|
||||
conv.szSrc = path.make_preferred().native();
|
||||
flist.push_back(conv);
|
||||
}
|
||||
|
||||
@@ -690,7 +672,7 @@ namespace
|
||||
wchar_t version[32] = {};
|
||||
|
||||
wchar_t appName[_MAX_PATH] = {};
|
||||
if (GetModuleFileNameW(nullptr, appName, static_cast<DWORD>(std::size(appName))))
|
||||
if (GetModuleFileNameW(nullptr, appName, _MAX_PATH))
|
||||
{
|
||||
const DWORD size = GetFileVersionInfoSizeW(appName, nullptr);
|
||||
if (size > 0)
|
||||
@@ -1018,7 +1000,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
uint32_t zeroElements[4] = {};
|
||||
uint32_t oneElements[4] = {};
|
||||
|
||||
wchar_t szOutputFile[MAX_PATH] = {};
|
||||
std::wstring outputFile;
|
||||
|
||||
// Set locale for output since GetErrorDesc can get localized strings.
|
||||
std::locale::global(std::locale(""));
|
||||
@@ -1226,12 +1208,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
case OPT_OUTPUTFILE:
|
||||
{
|
||||
std::filesystem::path path(pValue);
|
||||
wcscpy_s(szOutputFile, path.make_preferred().c_str());
|
||||
outputFile = path.make_preferred().native();
|
||||
|
||||
wchar_t ext[_MAX_EXT] = {};
|
||||
_wsplitpath_s(szOutputFile, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT);
|
||||
|
||||
fileType = LookupByName(ext, g_pExtFileTypes);
|
||||
fileType = LookupByName(path.extension().c_str(), g_pExtFileTypes);
|
||||
|
||||
switch (dwCommand)
|
||||
{
|
||||
@@ -1356,7 +1335,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
{
|
||||
const size_t count = conversion.size();
|
||||
std::filesystem::path path(pArg);
|
||||
SearchForFiles(path.make_preferred().c_str(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0);
|
||||
SearchForFiles(path.make_preferred(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0);
|
||||
if (conversion.size() <= count)
|
||||
{
|
||||
wprintf(L"No matching files found for %ls\n", pArg);
|
||||
@@ -1367,7 +1346,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
{
|
||||
SConversion conv = {};
|
||||
std::filesystem::path path(pArg);
|
||||
wcscpy_s(conv.szSrc, path.make_preferred().c_str());
|
||||
conv.szSrc = path.make_preferred().native();
|
||||
conversion.push_back(conv);
|
||||
}
|
||||
}
|
||||
@@ -1423,19 +1402,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
|
||||
if (dwCommand == CMD_GIF)
|
||||
{
|
||||
wchar_t ext[_MAX_EXT] = {};
|
||||
wchar_t fname[_MAX_FNAME] = {};
|
||||
_wsplitpath_s(conversion.front().szSrc, nullptr, 0, nullptr, 0, fname, _MAX_FNAME, ext, _MAX_EXT);
|
||||
std::filesystem::path curpath(conversion.front().szSrc);
|
||||
|
||||
wprintf(L"reading %ls", conversion.front().szSrc);
|
||||
wprintf(L"reading %ls", curpath.c_str());
|
||||
fflush(stdout);
|
||||
|
||||
if (!*szOutputFile)
|
||||
if (outputFile.empty())
|
||||
{
|
||||
_wmakepath_s(szOutputFile, nullptr, nullptr, fname, L".dds");
|
||||
outputFile = curpath.stem().concat(L".dds").native();
|
||||
}
|
||||
|
||||
hr = LoadAnimatedGif(conversion.front().szSrc, loadedImages, (dwOptions & (1 << OPT_GIF_BGCOLOR)) != 0);
|
||||
hr = LoadAnimatedGif(curpath.c_str(), loadedImages, (dwOptions & (1 << OPT_GIF_BGCOLOR)) != 0);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1446,14 +1423,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
{
|
||||
for (auto pConv = conversion.begin(); pConv != conversion.end(); ++pConv)
|
||||
{
|
||||
wchar_t ext[_MAX_EXT] = {};
|
||||
wchar_t fname[_MAX_FNAME] = {};
|
||||
_wsplitpath_s(pConv->szSrc, nullptr, 0, nullptr, 0, fname, _MAX_FNAME, ext, _MAX_EXT);
|
||||
std::filesystem::path curpath(pConv->szSrc);
|
||||
auto const ext = curpath.extension();
|
||||
|
||||
// Load source image
|
||||
if (pConv != conversion.begin())
|
||||
wprintf(L"\n");
|
||||
else if (!*szOutputFile)
|
||||
else if (outputFile.empty())
|
||||
{
|
||||
switch (dwCommand)
|
||||
{
|
||||
@@ -1464,22 +1440,22 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
case CMD_H_STRIP:
|
||||
case CMD_V_STRIP:
|
||||
case CMD_ARRAY_STRIP:
|
||||
_wmakepath_s(szOutputFile, nullptr, nullptr, fname, L".bmp");
|
||||
outputFile = curpath.stem().concat(L".bmp").native();
|
||||
break;
|
||||
|
||||
default:
|
||||
if (_wcsicmp(ext, L".dds") == 0)
|
||||
if (_wcsicmp(curpath.extension().c_str(), L".dds") == 0)
|
||||
{
|
||||
wprintf(L"ERROR: Need to specify output file via -o\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
_wmakepath_s(szOutputFile, nullptr, nullptr, fname, L".dds");
|
||||
outputFile = curpath.stem().concat(L".dds").native();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wprintf(L"reading %ls", pConv->szSrc);
|
||||
wprintf(L"reading %ls", curpath.c_str());
|
||||
fflush(stdout);
|
||||
|
||||
TexMetadata info;
|
||||
@@ -1498,9 +1474,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
case CMD_H_TEE:
|
||||
case CMD_H_STRIP:
|
||||
case CMD_V_STRIP:
|
||||
if (_wcsicmp(ext, L".dds") == 0)
|
||||
if (_wcsicmp(ext.c_str(), L".dds") == 0)
|
||||
{
|
||||
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
hr = LoadFromDDSFile(curpath.c_str(), DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1525,9 +1501,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
break;
|
||||
|
||||
case CMD_ARRAY_STRIP:
|
||||
if (_wcsicmp(ext, L".dds") == 0)
|
||||
if (_wcsicmp(ext.c_str(), L".dds") == 0)
|
||||
{
|
||||
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
hr = LoadFromDDSFile(curpath.c_str(), DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1548,9 +1524,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
break;
|
||||
|
||||
default:
|
||||
if (_wcsicmp(ext, L".dds") == 0)
|
||||
if (_wcsicmp(ext.c_str(), L".dds") == 0)
|
||||
{
|
||||
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
hr = LoadFromDDSFile(curpath.c_str(), DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1579,20 +1555,20 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (_wcsicmp(ext, L".tga") == 0)
|
||||
else if (_wcsicmp(ext.c_str(), L".tga") == 0)
|
||||
{
|
||||
TGA_FLAGS tgaFlags = (IsBGR(format)) ? TGA_FLAGS_BGR : TGA_FLAGS_NONE;
|
||||
|
||||
hr = LoadFromTGAFile(pConv->szSrc, tgaFlags, &info, *image);
|
||||
hr = LoadFromTGAFile(curpath.c_str(), tgaFlags, &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (_wcsicmp(ext, L".hdr") == 0)
|
||||
else if (_wcsicmp(ext.c_str(), L".hdr") == 0)
|
||||
{
|
||||
hr = LoadFromHDRFile(pConv->szSrc, &info, *image);
|
||||
hr = LoadFromHDRFile(curpath.c_str(), &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1600,9 +1576,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
}
|
||||
#ifdef USE_OPENEXR
|
||||
else if (_wcsicmp(ext, L".exr") == 0)
|
||||
else if (_wcsicmp(ext.c_str(), L".exr") == 0)
|
||||
{
|
||||
hr = LoadFromEXRFile(pConv->szSrc, &info, *image);
|
||||
hr = LoadFromEXRFile(curpath.c_str(), &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -1620,17 +1596,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
static_assert(static_cast<int>(WIC_FLAGS_FILTER_CUBIC) == static_cast<int>(TEX_FILTER_CUBIC), "WIC_FLAGS_* & TEX_FILTER_* should match");
|
||||
static_assert(static_cast<int>(WIC_FLAGS_FILTER_FANT) == static_cast<int>(TEX_FILTER_FANT), "WIC_FLAGS_* & TEX_FILTER_* should match");
|
||||
|
||||
hr = LoadFromWICFile(pConv->szSrc, WIC_FLAGS_ALL_FRAMES | dwFilter, &info, *image);
|
||||
hr = LoadFromWICFile(curpath.c_str(), WIC_FLAGS_ALL_FRAMES | dwFilter, &info, *image);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
if (hr == static_cast<HRESULT>(0xc00d5212) /* MF_E_TOPO_CODEC_NOT_FOUND */)
|
||||
{
|
||||
if (_wcsicmp(ext, L".heic") == 0 || _wcsicmp(ext, L".heif") == 0)
|
||||
if (_wcsicmp(ext.c_str(), L".heic") == 0 || _wcsicmp(ext.c_str(), L".heif") == 0)
|
||||
{
|
||||
wprintf(L"INFO: This format requires installing the HEIF Image Extensions - https://aka.ms/heif\n");
|
||||
}
|
||||
else if (_wcsicmp(ext, L".webp") == 0)
|
||||
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");
|
||||
}
|
||||
@@ -2192,26 +2168,26 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
|
||||
// Write cross/strip
|
||||
wprintf(L"\nWriting %ls ", szOutputFile);
|
||||
wprintf(L"\nWriting %ls ", outputFile.c_str());
|
||||
PrintInfo(result.GetMetadata());
|
||||
wprintf(L"\n");
|
||||
fflush(stdout);
|
||||
|
||||
if (dwOptions & (1 << OPT_TOLOWER))
|
||||
{
|
||||
std::ignore = _wcslwr_s(szOutputFile);
|
||||
std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower);
|
||||
}
|
||||
|
||||
if (~dwOptions & (1 << OPT_OVERWRITE))
|
||||
{
|
||||
if (GetFileAttributesW(szOutputFile) != INVALID_FILE_ATTRIBUTES)
|
||||
if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
hr = SaveImageFile(*dest, fileType, szOutputFile);
|
||||
hr = SaveImageFile(*dest, fileType, outputFile.c_str());
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -2260,26 +2236,26 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
|
||||
// Write merged texture
|
||||
wprintf(L"\nWriting %ls ", szOutputFile);
|
||||
wprintf(L"\nWriting %ls ", outputFile.c_str());
|
||||
PrintInfo(result.GetMetadata());
|
||||
wprintf(L"\n");
|
||||
fflush(stdout);
|
||||
|
||||
if (dwOptions & (1 << OPT_TOLOWER))
|
||||
{
|
||||
std::ignore = _wcslwr_s(szOutputFile);
|
||||
std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower);
|
||||
}
|
||||
|
||||
if (~dwOptions & (1 << OPT_OVERWRITE))
|
||||
{
|
||||
if (GetFileAttributesW(szOutputFile) != INVALID_FILE_ATTRIBUTES)
|
||||
if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
hr = SaveImageFile(*result.GetImage(0, 0, 0), fileType, szOutputFile);
|
||||
hr = SaveImageFile(*result.GetImage(0, 0, 0), fileType, outputFile.c_str());
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -2329,26 +2305,26 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
|
||||
// Write array strip
|
||||
wprintf(L"\nWriting %ls ", szOutputFile);
|
||||
wprintf(L"\nWriting %ls ", outputFile.c_str());
|
||||
PrintInfo(result.GetMetadata());
|
||||
wprintf(L"\n");
|
||||
fflush(stdout);
|
||||
|
||||
if (dwOptions & (1 << OPT_TOLOWER))
|
||||
{
|
||||
std::ignore = _wcslwr_s(szOutputFile);
|
||||
std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower);
|
||||
}
|
||||
|
||||
if (~dwOptions & (1 << OPT_OVERWRITE))
|
||||
{
|
||||
if (GetFileAttributesW(szOutputFile) != INVALID_FILE_ATTRIBUTES)
|
||||
if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
hr = SaveImageFile(*dest, fileType, szOutputFile);
|
||||
hr = SaveImageFile(*dest, fileType, outputFile.c_str());
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L" FAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -2528,19 +2504,19 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
|
||||
// Write texture
|
||||
wprintf(L"\nWriting %ls ", szOutputFile);
|
||||
wprintf(L"\nWriting %ls ", outputFile.c_str());
|
||||
PrintInfo(result.GetMetadata());
|
||||
wprintf(L"\n");
|
||||
fflush(stdout);
|
||||
|
||||
if (dwOptions & (1 << OPT_TOLOWER))
|
||||
{
|
||||
std::ignore = _wcslwr_s(szOutputFile);
|
||||
std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower);
|
||||
}
|
||||
|
||||
if (~dwOptions & (1 << OPT_OVERWRITE))
|
||||
{
|
||||
if (GetFileAttributesW(szOutputFile) != INVALID_FILE_ATTRIBUTES)
|
||||
if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n");
|
||||
return 1;
|
||||
@@ -2549,7 +2525,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
|
||||
hr = SaveToDDSFile(result.GetImages(), result.GetImageCount(), result.GetMetadata(),
|
||||
(dwOptions & (1 << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE,
|
||||
szOutputFile);
|
||||
outputFile.c_str());
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L"\nFAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
@@ -2641,19 +2617,19 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
}
|
||||
|
||||
// Write texture
|
||||
wprintf(L"\nWriting %ls ", szOutputFile);
|
||||
wprintf(L"\nWriting %ls ", outputFile.c_str());
|
||||
PrintInfo(result.GetMetadata());
|
||||
wprintf(L"\n");
|
||||
fflush(stdout);
|
||||
|
||||
if (dwOptions & (1 << OPT_TOLOWER))
|
||||
{
|
||||
std::ignore = _wcslwr_s(szOutputFile);
|
||||
std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower);
|
||||
}
|
||||
|
||||
if (~dwOptions & (1 << OPT_OVERWRITE))
|
||||
{
|
||||
if (GetFileAttributesW(szOutputFile) != INVALID_FILE_ATTRIBUTES)
|
||||
if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n");
|
||||
return 1;
|
||||
@@ -2662,7 +2638,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
|
||||
|
||||
hr = SaveToDDSFile(result.GetImages(), result.GetImageCount(), result.GetMetadata(),
|
||||
(dwOptions & (1 << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE,
|
||||
szOutputFile);
|
||||
outputFile.c_str());
|
||||
if (FAILED(hr))
|
||||
{
|
||||
wprintf(L"\nFAILED (%08X%ls)\n", static_cast<unsigned int>(hr), GetErrorDesc(hr));
|
||||
|
||||
Reference in New Issue
Block a user