1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/gfx/platform_font_win.h" 6 7 #include "base/logging.h" 8 #include "base/memory/ref_counted.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "ui/gfx/font.h" 11 12 namespace gfx { 13 14 namespace { 15 16 // Returns a font based on |base_font| with height at most |target_height| and 17 // font size maximized. Returns |base_font| if height is already equal. 18 gfx::Font AdjustFontSizeForHeight(const gfx::Font& base_font, 19 int target_height) { 20 Font expected_font = base_font; 21 if (base_font.GetHeight() < target_height) { 22 // Increase size while height is <= |target_height|. 23 Font larger_font = base_font.Derive(1, 0); 24 while (larger_font.GetHeight() <= target_height) { 25 expected_font = larger_font; 26 larger_font = larger_font.Derive(1, 0); 27 } 28 } else if (expected_font.GetHeight() > target_height) { 29 // Decrease size until height is <= |target_height|. 30 do { 31 expected_font = expected_font.Derive(-1, 0); 32 } while (expected_font.GetHeight() > target_height); 33 } 34 return expected_font; 35 } 36 37 } // namespace 38 39 TEST(PlatformFontWinTest, DeriveFontWithHeight) { 40 const Font base_font; 41 PlatformFontWin* platform_font = 42 static_cast<PlatformFontWin*>(base_font.platform_font()); 43 44 for (int i = -10; i < 10; i++) { 45 const int target_height = base_font.GetHeight() + i; 46 Font expected_font = AdjustFontSizeForHeight(base_font, target_height); 47 ASSERT_LE(expected_font.GetHeight(), target_height); 48 49 Font derived_font = platform_font->DeriveFontWithHeight(target_height, 0); 50 EXPECT_EQ(expected_font.GetFontName(), derived_font.GetFontName()); 51 EXPECT_EQ(expected_font.GetFontSize(), derived_font.GetFontSize()); 52 EXPECT_LE(expected_font.GetHeight(), target_height); 53 EXPECT_EQ(0, derived_font.GetStyle()); 54 55 derived_font = platform_font->DeriveFontWithHeight(target_height, 56 Font::BOLD); 57 EXPECT_EQ(expected_font.GetFontName(), derived_font.GetFontName()); 58 EXPECT_EQ(expected_font.GetFontSize(), derived_font.GetFontSize()); 59 EXPECT_LE(expected_font.GetHeight(), target_height); 60 EXPECT_EQ(Font::BOLD, derived_font.GetStyle()); 61 62 // Test that deriving from the new font has the expected result. 63 Font rederived_font = derived_font.Derive(1, 0); 64 expected_font = Font(derived_font.GetFontName(), 65 derived_font.GetFontSize() + 1); 66 EXPECT_EQ(expected_font.GetFontName(), rederived_font.GetFontName()); 67 EXPECT_EQ(expected_font.GetFontSize(), rederived_font.GetFontSize()); 68 EXPECT_EQ(expected_font.GetHeight(), rederived_font.GetHeight()); 69 } 70 } 71 72 TEST(PlatformFontWinTest, DeriveFontWithHeight_Consistency) { 73 gfx::Font arial_12("Arial", 12); 74 ASSERT_GT(16, arial_12.GetHeight()); 75 gfx::Font derived_1 = static_cast<PlatformFontWin*>( 76 arial_12.platform_font())->DeriveFontWithHeight(16, 0); 77 78 gfx::Font arial_15("Arial", 15); 79 ASSERT_LT(16, arial_15.GetHeight()); 80 gfx::Font derived_2 = static_cast<PlatformFontWin*>( 81 arial_15.platform_font())->DeriveFontWithHeight(16, 0); 82 83 EXPECT_EQ(derived_1.GetFontSize(), derived_2.GetFontSize()); 84 EXPECT_EQ(16, derived_1.GetHeight()); 85 EXPECT_EQ(16, derived_2.GetHeight()); 86 } 87 88 // Callback function used by DeriveFontWithHeight_MinSize() below. 89 static int GetMinFontSize() { 90 return 10; 91 } 92 93 TEST(PlatformFontWinTest, DeriveFontWithHeight_MinSize) { 94 PlatformFontWin::GetMinimumFontSizeCallback old_callback = 95 PlatformFontWin::get_minimum_font_size_callback; 96 PlatformFontWin::get_minimum_font_size_callback = &GetMinFontSize; 97 98 const Font base_font; 99 const Font min_font(base_font.GetFontName(), GetMinFontSize()); 100 PlatformFontWin* platform_font = 101 static_cast<PlatformFontWin*>(base_font.platform_font()); 102 103 const Font derived_font = 104 platform_font->DeriveFontWithHeight(min_font.GetHeight() - 1, 0); 105 EXPECT_EQ(min_font.GetFontSize(), derived_font.GetFontSize()); 106 EXPECT_EQ(min_font.GetHeight(), derived_font.GetHeight()); 107 108 PlatformFontWin::get_minimum_font_size_callback = old_callback; 109 } 110 111 TEST(PlatformFontWinTest, DeriveFontWithHeight_TooSmall) { 112 const Font base_font; 113 PlatformFontWin* platform_font = 114 static_cast<PlatformFontWin*>(base_font.platform_font()); 115 116 const Font derived_font = platform_font->DeriveFontWithHeight(1, 0); 117 EXPECT_GT(derived_font.GetHeight(), 1); 118 } 119 120 } // namespace gfx 121