diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index df64e34c..86f92b24 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -417,12 +417,16 @@ bool CGLDevice::GetLightEnabled(int index) Texture CGLDevice::CreateTexture(CImage *image, const TextureCreateParams ¶ms) { ImageData *data = image->GetData(); - if (data == NULL) + if (data == nullptr) { GetLogger()->Error("Invalid texture data\n"); return Texture(); // invalid texture } + Math::IntPoint size = image->GetSize(); + if (!Math::IsPowerOfTwo(size.x) || !Math::IsPowerOfTwo(size.y)) + GetLogger()->Warn("Creating non-power-of-2 texture (%dx%d)!\n", size.x, size.y); + return CreateTexture(data, params); } diff --git a/src/math/func.h b/src/math/func.h index 413b5d96..83e8ca4c 100644 --- a/src/math/func.h +++ b/src/math/func.h @@ -128,6 +128,12 @@ inline float Rand() return static_cast(rand()) / static_cast(RAND_MAX); } +//! Returns whether \a x is an even power of 2 +inline bool IsPowerOfTwo(unsigned int x) +{ + return x && !(x & (x - 1)); +} + //! Returns the next nearest power of two to \a x inline int NextPowerOfTwo(int x) { diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index df92b9c2..b7051fb7 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -177,6 +177,7 @@ set(UT_SOURCES main.cpp app/app_test.cpp graphics/engine/lightman_test.cpp +math/func_test.cpp math/geometry_test.cpp math/matrix_test.cpp math/vector_test.cpp diff --git a/test/unit/math/func_test.cpp b/test/unit/math/func_test.cpp new file mode 100644 index 00000000..00a564b1 --- /dev/null +++ b/test/unit/math/func_test.cpp @@ -0,0 +1,55 @@ +// * This file is part of the COLOBOT source code +// * Copyright (C) 2012, Polish Portal of Colobot (PPC) +// * +// * This program 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 3 of the License, or +// * (at your option) any later version. +// * +// * This program 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 this program. If not, see http://www.gnu.org/licenses/. + +/* + Unit tests for math functions. + */ + +#include "math/func.h" + +#include "gtest/gtest.h" + + +TEST(IsPowerOfTwo, TestDifferentValues) +{ + EXPECT_FALSE(Math::IsPowerOfTwo(0)); + EXPECT_TRUE(Math::IsPowerOfTwo(1)); + EXPECT_TRUE(Math::IsPowerOfTwo(2)); + EXPECT_FALSE(Math::IsPowerOfTwo(3)); + EXPECT_TRUE(Math::IsPowerOfTwo(4)); + + EXPECT_FALSE(Math::IsPowerOfTwo(31)); + EXPECT_TRUE(Math::IsPowerOfTwo(32)); + EXPECT_FALSE(Math::IsPowerOfTwo(33)); + + EXPECT_FALSE(Math::IsPowerOfTwo(1234)); +} + +TEST(NextPowerOfTwo, TestDifferentValues) +{ + EXPECT_EQ(2, Math::NextPowerOfTwo(2)); + EXPECT_EQ(4, Math::NextPowerOfTwo(3)); + EXPECT_EQ(4, Math::NextPowerOfTwo(4)); + EXPECT_EQ(8, Math::NextPowerOfTwo(5)); + + EXPECT_EQ(8, Math::NextPowerOfTwo(7)); + EXPECT_EQ(8, Math::NextPowerOfTwo(8)); + EXPECT_EQ(16, Math::NextPowerOfTwo(9)); + + EXPECT_EQ(32, Math::NextPowerOfTwo(31)); + EXPECT_EQ(32, Math::NextPowerOfTwo(32)); + EXPECT_EQ(64, Math::NextPowerOfTwo(33)); +}