diff --git a/binaries/data/mods/_test.tex/art/textures/b/test.png b/binaries/data/mods/_test.tex/art/textures/b/test.png new file mode 100644 index 0000000000..bfb48efb1c --- /dev/null +++ b/binaries/data/mods/_test.tex/art/textures/b/test.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:544b9abe80735232efdc333a8a6a1b47e0f17688004aaaeddbf46f901e0d6137 +size 101 diff --git a/source/graphics/tests/test_TextureConverter.h b/source/graphics/tests/test_TextureConverter.h new file mode 100644 index 0000000000..4415a2f2ea --- /dev/null +++ b/source/graphics/tests/test_TextureConverter.h @@ -0,0 +1,102 @@ +/* Copyright (C) 2010 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#include "lib/self_test.h" + +#include "graphics/TextureConverter.h" + +#include "lib/file/vfs/vfs.h" +#include "lib/res/h_mgr.h" +#include "lib/tex/tex.h" +#include "ps/XML/Xeromyces.h" + +class TestTextureConverter : public CxxTest::TestSuite +{ + PIVFS m_VFS; + +public: + + void setUp() + { + DeleteDirectory(DataDir()/L"_testcache"); // clean up in case the last test run failed + + m_VFS = CreateVfs(20*MiB); + TS_ASSERT_OK(m_VFS->Mount(L"", DataDir()/L"mods/_test.tex", VFS_MOUNT_MUST_EXIST)); + TS_ASSERT_OK(m_VFS->Mount(L"cache/", DataDir()/L"_testcache")); + + tex_codec_register_all(); + } + + void tearDown() + { + tex_codec_unregister_all(); + + m_VFS.reset(); + DeleteDirectory(DataDir()/L"_testcache"); + } + + void test_convert_quality() + { + // Test for the bug in http://code.google.com/p/nvidia-texture-tools/issues/detail?id=139 + + VfsPath src = L"art/textures/b/test.png"; + + CTextureConverter converter(m_VFS, false); + CTextureConverter::Settings settings = converter.ComputeSettings(L"", std::vector()); + TS_ASSERT(converter.ConvertTexture(CTexturePtr(), src, L"cache/test.png", settings)); + + VfsPath dest; + for (size_t i = 0; i < 100; ++i) + { + CTexturePtr texture; + bool ok; + if (converter.Poll(texture, dest, ok)) + { + TS_ASSERT(ok); + break; + } + SDL_Delay(10); + } + + shared_ptr file; + size_t fileSize; + TS_ASSERT_OK(m_VFS->LoadFile(dest, file, fileSize)); + + Tex tex; + TS_ASSERT_OK(tex_decode(file, fileSize, &tex)); + + TS_ASSERT_OK(tex_transform_to(&tex, (tex.flags | TEX_BGR | TEX_ALPHA) & ~(TEX_DXT | TEX_MIPMAPS))); + + u8* texdata = tex_get_data(&tex); + + // The source texture is repeated after 4 pixels, so the compressed texture + // should be identical after 4 pixels + TS_ASSERT_EQUALS(texdata[0*4], texdata[4*4]); + // 1st, 2nd and 4th rows should be unequal + TS_ASSERT_DIFFERS(texdata[0*4], texdata[8*4]); + TS_ASSERT_EQUALS(texdata[8*4], texdata[16*4]); + TS_ASSERT_DIFFERS(texdata[16*4], texdata[24*4]); + +// for (size_t i = 0; i < tex.dataSize; ++i) +// { +// if (i % 4 == 0) printf("\n"); +// printf("%02x ", texdata[i]); +// } + + tex_free(&tex); + } +};