Merge remote-tracking branch 'upstream/master' into single-file-transcoder

This commit is contained in:
Carl Woffenden
2020-01-02 20:40:01 +01:00
13 changed files with 17678 additions and 169 deletions

View File

@@ -21,11 +21,25 @@ The encoder uses [lodepng](https://lodev.org/lodepng/) for loading and saving PN
The encoder uses [tcuAstcUtil.cpp](https://chromium.googlesource.com/external/deqp/+/refs/heads/master/framework/common/tcuAstcUtil.cpp), from the [Android drawElements Quality Program (deqp) Testing Suite](https://source.android.com/devices/graphics/deqp-testing), for unpacking the transcoder's ASTC output for testing/validation purposes. This code is Copyright 2016 The Android Open Source Project, and uses the Apache 2.0 license. We have modified the code so it has no external dependencies, and disabled HDR support.
### Legal stuff
### Legal/IP/license stuff
ASTC usage follows ARM's [END USER LICENCE AGREEMENT FOR THE MALI ASTC SPECIFICATION AND SOFTWARE CODEC license agreement](https://github.com/ARM-software/astc-encoder/blob/master/LICENSE.md).
Basis Universal uses texture compression formats or technologies created by several companies: ARM Holdings, AMD, Ericsson, Microsoft, and Imagination Technologies Limited. All are supported by various open standards or API's from [The Khronos Group](https://www.khronos.org/), such as OpenGL 4.5, OpenGL ES, or Vulkan.
Specifically, the Basis Universal ASTC use case is covered by the license. Under DEFINITIONS: ""Authorised Purpose" means the use of the Software solely to develop products and tools which implement the Khronos ASTC specification to ... (i) compress texture images into ASTC format ("Compression Results") and (ii) distribute such Compression Results to third parties;". Under this agreement, ""Software" means the source code and Software binaries accompanying this Licence, and any printed, electronic or online documentation supplied with it, in all cases relating to the MALI ASTC SPECIFICATION AND SOFTWARE CODEC." Finally, under LICENCE GRANT: "ARM hereby grants to you, subject to the terms and conditions of this Licence, a nonexclusive, nontransferable, free of charge, royalty free, worldwide licence to use, copy, modify and (subject to Clause 3 below) distribute the Software solely for the Authorised Purpose."
A few texture formats (such as AMD/ATI's ATC texture format, or PVRTC2) were not documented sufficiently by the originator of the format. In these cases, we relied on open source code references from other authors, or information in published articles/papers to implement support for those texture formats in our transcoder. These references are included here.
ASTC usage falls under ARM's [END USER LICENCE AGREEMENT FOR THE MALI ASTC SPECIFICATION AND SOFTWARE CODEC license agreement](https://github.com/ARM-software/astc-encoder/blob/master/LICENSE.md).
PVRTC1/2: See the [PVRTC Specification and User Guide](https://www.imgtec.com/downloads/download-info/pvrtc-texture-compression-user-guide-2/). Imagination Technologies Limited, 23 Nov 2018. Also see the [Khronos Data Format Specification](https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html). See [PVR Texture Compression Exploration](https://roartindon.blogspot.com/2014/08/pvr-texture-compression-exploration.html) and [PvrTcCompressor](https://bitbucket.org/jthlim/pvrtccompressor/src). Also see [Texture Compression Techniques](http://sv-journal.org/2014-1/06/en/index.php?lang=en#7-3).
ETC1 and ETC2 EAC: See the [Khronos Data Format Specification](https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html) and the [OpenGL 4.5 Core Profile](https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf) Appendix C.
BC1-5,7: Part of Microsoft's Direct3D API technology. See [Texture Block Compression in Direct3D 11](https://docs.microsoft.com/en-us/windows/win32/direct3d11/texture-block-compression-in-direct3d-11). Also see the [squish library](https://github.com/Ethatron/squish-ccr).
ATC: See the OpenGL extension [GL_AMD_compressed_ATC_texture](https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_compressed_ATC_texture.txt). For low-level ATC texture format information, see [S3TConv](https://github.com/Triang3l/S3TConv) and the paper [A Method for Load-Time Conversion of DXTC Assets to ATC](http://www.guildsoftware.com/papers/2012.Converting.DXTC.to.ATC.pdf).
FXT1: See the OpenGL extension [GL_3DFX_texture_compression_FXT1](https://www.khronos.org/registry/OpenGL/extensions/3DFX/3DFX_texture_compression_FXT1.txt).
Also see [Intel® Open Source HD Graphics Programmers' Reference Manual (PRM)](https://01.org/sites/default/files/documentation/intel-gfx-bspec-osrc-chv-bsw-vol05-memory-views.pdf). This reference manual details how to encode FXT1, ETC1, ETC2, EAC, DXT/BC1-3, BC4/5/7, and ASTC.
### Release notes

View File

@@ -1066,9 +1066,7 @@ namespace basisu
{
const uint8_vec &comp_data = m_basis_file.get_compressed_data();
std::string basis_filename(m_params.m_out_filename);
string_remove_extension(basis_filename);
basis_filename += ".basis";
const std::string& basis_filename = m_params.m_out_filename;
if (!write_vec_to_file(basis_filename.c_str(), comp_data))
{

View File

@@ -23,7 +23,7 @@
#include <thread>
#include <unordered_map>
#ifndef _WIN32
#if !defined(_WIN32) || defined(__MINGW32__)
#include <libgen.h>
#endif

View File

@@ -35,7 +35,8 @@ enum tool_mode
cCompress,
cValidate,
cUnpack,
cCompare
cCompare,
cVersion,
};
static void print_usage()
@@ -47,6 +48,7 @@ static void print_usage()
" -unpack: Use transcoder to unpack .basis file to one or more .ktx/.png files\n"
" -validate: Validate and display information about a .basis file\n"
" -compare: Compare two PNG images specified with -file, output PSNR and SSIM statistics and RGB/A delta images\n"
" -version: Print basisu version and exit\n"
"Unless an explicit mode is specified, if one or more files have the .basis extension this tool defaults to unpack mode.\n"
"\n"
"Important: By default, the compressor assumes the input is in the sRGB colorspace (like photos/albedo textures).\n"
@@ -250,6 +252,8 @@ public:
m_mode = cUnpack;
else if (strcasecmp(pArg, "-validate") == 0)
m_mode = cValidate;
else if (strcasecmp(pArg, "-version") == 0)
m_mode = cVersion;
else if (strcasecmp(pArg, "-compare_ssim") == 0)
m_compare_ssim = true;
else if (strcasecmp(pArg, "-file") == 0)
@@ -1507,6 +1511,9 @@ static int main_internal(int argc, const char **argv)
case cCompare:
status = compare_mode(opts);
break;
case cVersion:
status = true; // We printed the version at the beginning of main_internal
break;
default:
assert(0);
break;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -10,3 +10,4 @@ bin/x64/
*.sdf
*.suo
*.opensdf
*.aps

View File

@@ -1,6 +1,6 @@
# Windows Previewers for Basis Universal
Build using Visual Studio from 2012 onwards. Enable from an Adminstrator console using `regsvr32 previewers.dll` (and remove using `regsvr32 /u previewers.dll`).
Build using Visual Studio from 2012 onwards. Enable from an Administrator console using `regsvr32 previewers.dll` (and remove using `regsvr32 /u previewers.dll`).
![Icon and preview pane](preview.png)

View File

@@ -85,12 +85,13 @@ IFACEMETHODIMP BasisThumbProvider::GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALP
basisu_file_info fileInfo;
transcoder.get_file_info(data, size, fileInfo);
if (transcoder.start_transcoding(data, size)) {
if (void* dxtBuf = malloc(basis_get_bytes_per_block(cTFBC1) * blocks)) {
if (transcoder.transcode_image_level(data, size, 0, level, dxtBuf, blocks, cTFBC1)) {
if (void* rgbBuf = malloc(basis_get_bytes_per_block(transcoder_texture_format::cTFRGBA32) * blocks)) {
// Note: the API expects total pixels here instead of blocks
if (transcoder.transcode_image_level(data, size, 0, level, rgbBuf, descW * descH, transcoder_texture_format::cTFRGBA32)) {
dprintf("Decoded!!!!");
*phbmp = dxtToBitmap(static_cast<uint8_t*>(dxtBuf), descW, descH, fileInfo.m_y_flipped);
*phbmp = rgbToBitmap(static_cast<uint32_t*>(rgbBuf), descW, descH, fileInfo.m_y_flipped);
}
delete dxtBuf;
delete rgbBuf;
}
}
}

View File

@@ -3,122 +3,6 @@
#include <cassert>
#include <cstdio>
//************************* See cubic/texture-dxt.cpp ************************/
/**
* Expands an RGB565 format colour into BGR888.
*
* \note Unlike the original code, which was RGB888, for a Windows bitmap we
* need this is as \e BGR.
*
* \param[in] color RGB565 format colour
* \return a \e bit \e expansion of the supplied colour as 8-bit per channel (with zero alpha)
*/
static uint32_t rgbFrom565(unsigned const color) {
unsigned r = (color >> 11) & 0x1F;
unsigned g = (color >> 5) & 0x3F;
unsigned b = (color >> 0) & 0x1F;
return (((r << 3) | (r >> 2)) << 16)
| (((g << 2) | (g >> 4)) << 8)
| (((b << 3) | (b >> 2)) << 0);
}
/**
* Calculates the DXT decompressor's \e midpoint colour, where the weighting
* is \c 2:1 (the parameters can be exchanged to calculate both midpoints).
* Used by the DXT block decode.
*
* \param[in] color0 \c endpoint colour receiving a double weighting
* \param[in] color1 \c endpoint colour receiving a single weighting
* \return blended colour (excluding alpha)
*/
static uint32_t midpoint21(uint32_t const color0, uint32_t const color1) {
return (((2 * (color0 & 0x0000FF) + (color1 & 0x0000FF)) / 3) & 0x0000FF)
| (((2 * (color0 & 0x00FF00) + (color1 & 0x00FF00)) / 3) & 0x00FF00)
| (((2 * (color0 & 0xFF0000) + (color1 & 0xFF0000)) / 3) & 0xFF0000);
}
/**
* Calculates the DXT decompressor's \e midpoint colour, where the weighting
* is \c 1:1. Used by the DXT block decode.
*
* \param[in] color0 \c endpoint colour (any of the endpoints)
* \param[in] color1 \c endpoint colour (any of the endpoints)
* \return blended colour (excluding alpha)
*/
static uint32_t midpoint11(uint32_t const color0, uint32_t const color1) {
return ((((color0 & 0x0000FF) + (color1 & 0x0000FF)) / 2) & 0x0000FF)
| ((((color0 & 0x00FF00) + (color1 & 0x00FF00)) / 2) & 0x00FF00)
| ((((color0 & 0xFF0000) + (color1 & 0xFF0000)) / 2) & 0xFF0000);
}
/**
* Decodes a DXT1 block.
*
* \note Unlike the original code, which was RGB888, for a Windows bitmap we
* need this is as \e BGR.
*
* \param[in] src start of the encoded data (eight contiguous bytes)
* \param[in] dst destination of the block's top-left pixel
* \param[in] span number of pixels to advance to the next line (usually the texture width)
*/
static void decodeDxt1(const uint8_t* const src, uint32_t* dst, unsigned const span) {
assert(src && dst && span);
/*
* Extract the two 16-bit 'endpoints'. These are little Endian, regardless
* of the platform. Note that the midpoint choices are made against these
* (not the platform Endian RGB/BGR versions) and that (specifically in
* this implementation) DXT1 will always have solid alpha (which we bake
* into the colour table). The color 'codes' are collated here into a
* 32-bit value (which simplifies addressing the bits directly later).
*/
#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN)
unsigned const color0((src[0] << 0) | (src[1] << 8));
unsigned const color1((src[2] << 0) | (src[3] << 8));
unsigned const ccodes((src[4] << 0) | (src[5] << 8)
| (src[6] << 16) | (src[7] << 24));
#else
unsigned const color0(*reinterpret_cast<const uint16_t*>(src + 0));
unsigned const color1(*reinterpret_cast<const uint16_t*>(src + 2));
unsigned const ccodes(*reinterpret_cast<const uint32_t*>(src + 4));
#endif
uint32_t color[4];
color[0] = 0xFF000000 | rgbFrom565(color0);
color[1] = 0xFF000000 | rgbFrom565(color1);
color[2] = 0xFF000000 | ((color0 > color1)
? midpoint21(color[0], color[1])
: midpoint11(color[0], color[1]));
color[3] = 0xFF000000 | ((color0 > color1)
? midpoint21(color[1], color[0])
: 0);
/*
* The 4x4 block is unrolled. For destinations smaller than 4x4 the pixel
* overwrites here are inefficient, but the overhead isn't enough to worry
* about (when compared with the GL texture upload).
*/
dst[0] = color[(ccodes >> 0) & 0x03];
dst[1] = color[(ccodes >> 2) & 0x03];
dst[2] = color[(ccodes >> 4) & 0x03];
dst[3] = color[(ccodes >> 6) & 0x03];
dst += span;
dst[0] = color[(ccodes >> 8) & 0x03];
dst[1] = color[(ccodes >> 10) & 0x03];
dst[2] = color[(ccodes >> 12) & 0x03];
dst[3] = color[(ccodes >> 14) & 0x03];
dst += span;
dst[0] = color[(ccodes >> 16) & 0x03];
dst[1] = color[(ccodes >> 18) & 0x03];
dst[2] = color[(ccodes >> 20) & 0x03];
dst[3] = color[(ccodes >> 22) & 0x03];
dst += span;
dst[0] = color[(ccodes >> 24) & 0x03];
dst[1] = color[(ccodes >> 26) & 0x03];
dst[2] = color[(ccodes >> 28) & 0x03];
dst[3] = color[(ccodes >> 30) & 0x03];
}
//******************************** Public API ********************************/
void dprintf(char* const fmt, ...) {
va_list args;
char buf[256];
@@ -131,41 +15,37 @@ void dprintf(char* const fmt, ...) {
}
}
HBITMAP dxtToBitmap(const uint8_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip) {
assert(src && imgW && imgH);
HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip) {
/*
* Creates a bitmap (a DIB) for the passed-in pixel size. Note that
* negation of the height means top-down, origin upper-left, which is the
* regular case.
*
* TODO: 16-bit variant instead?
* TODO: we're growing the nearest 4x4 but not cropping afterwards (what about shrinking and skipping the last blocks?)
*/
uint32_t nearW = (imgW + 3) & ~3;
uint32_t nearH = (imgH + 3) & ~3;
assert(src && imgW && imgH);
BITMAPINFO bmi = {
sizeof(bmi.bmiHeader)
};
bmi.bmiHeader.biWidth = nearW;
bmi.bmiHeader.biHeight = (flip) ? nearH : -static_cast<int32_t>(nearH);
bmi.bmiHeader.biWidth = imgW;
bmi.bmiHeader.biHeight = (flip) ? imgH : -static_cast<int32_t>(imgH);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
void* pixels = NULL;
HBITMAP hbmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pixels, NULL, 0);
/*
* Decode the BC1 blocks.
* RGBA to BGRA conversion.
*
* Note: we keep the alpha.
*/
if (hbmp && pixels) {
uint32_t* dst = static_cast<uint32_t*>(pixels);
for (unsigned y = 0; y < nearH; y += 4) {
uint32_t* row = dst;
for (unsigned x = 0; x < nearW; x += 4) {
decodeDxt1(src, row, nearW);
src += 8;
row += 4;
}
dst += 4 * nearW;
for (unsigned xy = imgW * imgH; xy > 0; xy--) {
uint32_t rgba = *src++;
*dst++ = ((rgba & 0x000000FF) << 16)
| ((rgba & 0xFF00FF00) )
| ((rgba & 0x00FF0000) >> 16);
}
GdiFlush();
}

View File

@@ -12,11 +12,11 @@
void dprintf(char* const fmt, ...);
/**
* Software decodes BC1 format data.
* Converts raw RGBA data to a Windows BGRA bitmap.
*
* \param[in] src BC1 source blocks (the number of blocks being determined by the image dimensions)
* \param[in] src raw RGBA data
* \param[in] imgW width of the decoded image
* \param[in] imgH height of the decoded image
* \return handle to a bitmap (ownership passed to the caller)
*/
HBITMAP dxtToBitmap(const uint8_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip = false);
HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip = false);

View File

@@ -90,12 +90,12 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;BASISD_SUPPORT_DXT5A=0;BASISD_SUPPORT_PVRTC1=0;BASISD_SUPPORT_BC7=0;BASISD_SUPPORT_ETC2_EAC_A8=0;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<ExceptionHandling>false</ExceptionHandling>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\transcoder\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -107,12 +107,12 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;BASISD_SUPPORT_DXT5A=0;BASISD_SUPPORT_PVRTC1=0;BASISD_SUPPORT_BC7=0;BASISD_SUPPORT_ETC2_EAC_A8=0;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<ExceptionHandling>false</ExceptionHandling>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\transcoder\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -126,10 +126,10 @@
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;BASISD_SUPPORT_DXT5A=0;BASISD_SUPPORT_PVRTC1=0;BASISD_SUPPORT_BC7=0;BASISD_SUPPORT_ETC2_EAC_A8=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ExceptionHandling>false</ExceptionHandling>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\transcoder\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -145,10 +145,10 @@
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;BASISD_SUPPORT_DXT5A=0;BASISD_SUPPORT_PVRTC1=0;BASISD_SUPPORT_BC7=0;BASISD_SUPPORT_ETC2_EAC_A8=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ExceptionHandling>false</ExceptionHandling>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\transcoder\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -159,13 +159,13 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\..\transcoder\basisu_transcoder.h" />
<ClInclude Include="basisthumbprovider.h" />
<ClInclude Include="..\lib\basisu_transcoder.h" />
<ClInclude Include="helpers.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\transcoder\basisu_transcoder.cpp" />
<ClCompile Include="basisthumbprovider.cpp" />
<ClCompile Include="..\lib\basisu_transcoder.cpp" />
<ClCompile Include="helpers.cpp" />
<ClCompile Include="previewers.cpp">
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>

View File

@@ -9,23 +9,20 @@
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="src\transcoder">
<UniqueIdentifier>{2d6d195a-ebe1-467a-a713-8abb5d133ce6}</UniqueIdentifier>
</Filter>
<Filter Include="inc\transcoder">
<UniqueIdentifier>{724b1ae2-a9f5-4706-b406-26d4660d72e0}</UniqueIdentifier>
<Filter Include="res">
<UniqueIdentifier>{f4f72237-4818-48a4-9192-33d12efece22}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="basisthumbprovider.h">
<Filter>inc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\transcoder\basisu_transcoder.h">
<Filter>inc\transcoder</Filter>
</ClInclude>
<ClInclude Include="helpers.h">
<Filter>inc</Filter>
</ClInclude>
<ClInclude Include="..\lib\basisu_transcoder.h">
<Filter>inc</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="basisthumbprovider.cpp">
@@ -34,11 +31,11 @@
<ClCompile Include="previewers.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\transcoder\basisu_transcoder.cpp">
<Filter>src\transcoder</Filter>
</ClCompile>
<ClCompile Include="helpers.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\lib\basisu_transcoder.cpp">
<Filter>src</Filter>
</ClCompile>
</ItemGroup>
</Project>