// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/tiles/mipmap_util.h" #include "cc/test/geometry_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { namespace { // Ensures that a basic scale works. TEST(MipMapUtilTest, Basic) { const gfx::Size src_size(64, 64); const gfx::Size target_size(16, 16); const int target_level = 2; const SkSize expected_scale = SkSize::Make(0.25f, 0.25f); EXPECT_EQ(target_level, MipMapUtil::GetLevelForSize(src_size, target_size)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForLevel( src_size, target_level)); EXPECT_SIZE_EQ(target_size, MipMapUtil::GetSizeForLevel(src_size, target_level)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForSize( src_size, target_size)); } // Ensures that a no-op scale works. TEST(MipMapUtilTest, NoScale) { const gfx::Size src_size(64, 64); const gfx::Size target_size(64, 64); const int target_level = 0; const SkSize expected_scale = SkSize::Make(1, 1); EXPECT_EQ(target_level, MipMapUtil::GetLevelForSize(src_size, target_size)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForLevel( src_size, target_level)); EXPECT_SIZE_EQ(target_size, MipMapUtil::GetSizeForLevel(src_size, target_level)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForSize( src_size, target_size)); } // Ensures that we return the base mip level if the caller requests an upscale. TEST(MipMapUtilTest, Upscale) { const gfx::Size src_size(64, 64); const gfx::Size target_size(128, 128); const SkSize result_size = SkSize::Make(1, 1); const int result_level = 0; EXPECT_EQ(result_level, MipMapUtil::GetLevelForSize(src_size, target_size)); EXPECT_FLOAT_SIZE_EQ(result_size, MipMapUtil::GetScaleAdjustmentForSize( src_size, target_size)); EXPECT_SIZE_EQ(src_size, MipMapUtil::GetSizeForLevel(src_size, result_level)); } // Ensures that the maximum mip level GetLevelForSize will ever return is 30. TEST(MipMapUtilTest, MaxMipLevel) { int max_mip_level = MipMapUtil::GetLevelForSize(gfx::Size(std::numeric_limits::max(), std::numeric_limits::max()), gfx::Size(1, 1)); EXPECT_EQ(max_mip_level, 30); } // Ensures that we handle mips of a non-square image correctly (the smaller side // should never be smaller than 1). TEST(MipMapUtilTest, NonSquare) { const gfx::Size src_size(1024, 1); const gfx::Size target_size(64, 1); const int target_level = 4; const SkSize expected_scale = SkSize::Make( static_cast(target_size.width()) / src_size.width(), 1); EXPECT_EQ(target_level, MipMapUtil::GetLevelForSize(src_size, target_size)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForLevel( src_size, target_level)); EXPECT_SIZE_EQ(target_size, MipMapUtil::GetSizeForLevel(src_size, target_level)); EXPECT_FLOAT_SIZE_EQ(expected_scale, MipMapUtil::GetScaleAdjustmentForSize( src_size, target_size)); } // Ensures that we handle rounding images correctly. TEST(MipMapUtilTest, Rounding) { const gfx::Size src_size(49, 49); const gfx::Size target_size_larger(25, 25); const gfx::Size target_size_smaller(24, 24); const int target_level_larger = 0; const int target_level_smaller = 1; const SkSize expected_scale_larger = SkSize::Make(1, 1); const SkSize expected_scale_smaller = SkSize::Make( static_cast(target_size_smaller.width()) / src_size.width(), static_cast(target_size_smaller.height()) / src_size.height()); EXPECT_EQ(target_level_larger, MipMapUtil::GetLevelForSize(src_size, target_size_larger)); EXPECT_EQ(target_level_smaller, MipMapUtil::GetLevelForSize(src_size, target_size_smaller)); EXPECT_FLOAT_SIZE_EQ( expected_scale_larger, MipMapUtil::GetScaleAdjustmentForLevel(src_size, target_level_larger)); EXPECT_FLOAT_SIZE_EQ( expected_scale_smaller, MipMapUtil::GetScaleAdjustmentForLevel(src_size, target_level_smaller)); EXPECT_SIZE_EQ(src_size, MipMapUtil::GetSizeForLevel(src_size, target_level_larger)); EXPECT_SIZE_EQ(target_size_smaller, MipMapUtil::GetSizeForLevel(src_size, target_level_smaller)); EXPECT_FLOAT_SIZE_EQ( expected_scale_larger, MipMapUtil::GetScaleAdjustmentForSize(src_size, target_size_larger)); EXPECT_FLOAT_SIZE_EQ( expected_scale_smaller, MipMapUtil::GetScaleAdjustmentForSize(src_size, target_size_smaller)); } } // namespace } // namespace cc