icon_util_unittest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/icon_util.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gfx_paths.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/icon_util_unittests_resource.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/image/image_family.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSmallIconName[] = "icon_util/16_X_16_icon.ico"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kLargeIconName[] = "icon_util/128_X_128_icon.ico"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kTempIconFilename[] = "temp_test_icon.ico"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IconUtilTest : public testing::Test { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(gfx::DIR_TEST_DATA, &test_data_directory_); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_directory_.CreateUniqueTempDir(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSmallIconWidth = 16; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSmallIconHeight = 16; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kLargeIconWidth = 128; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kLargeIconHeight = 128; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Given a file name for an .ico file and an image dimensions, this 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function loads the icon and returns an HICON handle. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HICON LoadIconFromFile(const base::FilePath& filename, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width, int height) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON icon = static_cast<HICON>(LoadImage(NULL, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename.value().c_str(), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IMAGE_ICON, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LR_LOADTRANSPARENT | LR_LOADFROMFILE)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return icon; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap CreateBlackSkBitmap(int width, int height) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bitmap.allocN32Pixels(width, height); 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Setting the pixels to transparent-black. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(bitmap.getPixels(), 0, width * height * 4); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bitmap; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Loads an .ico file from |icon_filename| and asserts that it contains all of 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the expected icon sizes up to and including |max_icon_size|, and no other 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // icons. If |max_icon_size| >= 256, this tests for a 256x256 PNG icon entry. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CheckAllIconSizes(const base::FilePath& icon_filename, 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_icon_size); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The root directory for test files. This should be treated as read-only. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_directory_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Directory for creating files by this test. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_directory_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void IconUtilTest::CheckAllIconSizes(const base::FilePath& icon_filename, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_icon_size) { 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(icon_filename)); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Determine how many icons to expect, based on |max_icon_size|. 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int expected_num_icons = 0; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < IconUtil::kNumIconDimensions; ++i) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IconUtil::kIconDimensions[i] > max_icon_size) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++expected_num_icons; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First, use the Windows API to load the icon, a basic validity test. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HICON icon = LoadIconFromFile(icon_filename, kSmallIconWidth, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSmallIconHeight); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(static_cast<HICON>(NULL), icon); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (icon != NULL) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::DestroyIcon(icon); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Read the file completely into memory. 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string icon_data; 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(icon_filename, &icon_data)); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_GE(icon_data.length(), sizeof(IconUtil::ICONDIR)); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Ensure that it has exactly the expected number and sizes of icons, in the 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // expected order. This matches each entry of the loaded file's icon directory 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with the corresponding element of kIconDimensions. 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Also extracts the 256x256 entry as png_entry. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IconUtil::ICONDIR* icon_dir = 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinterpret_cast<const IconUtil::ICONDIR*>(icon_data.data()); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_num_icons, icon_dir->idCount); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_GE(IconUtil::kNumIconDimensions, icon_dir->idCount); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_GE(icon_data.length(), 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sizeof(IconUtil::ICONDIR) + 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_dir->idCount * sizeof(IconUtil::ICONDIRENTRY)); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IconUtil::ICONDIRENTRY* png_entry = NULL; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < icon_dir->idCount; ++i) { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IconUtil::ICONDIRENTRY* entry = &icon_dir->idEntries[i]; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Mod 256 because as a special case in ICONDIRENTRY, the value 0 represents 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a width or height of 256. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int expected_size = IconUtil::kIconDimensions[i] % 256; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_size, static_cast<int>(entry->bWidth)); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_size, static_cast<int>(entry->bHeight)); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry->bWidth == 0 && entry->bHeight == 0) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, png_entry); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) png_entry = entry; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (max_icon_size >= 256) { 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(png_entry); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Convert the PNG entry data back to a SkBitmap to ensure it's valid. 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_GE(icon_data.length(), 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) png_entry->dwImageOffset + png_entry->dwBytesInRes); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const unsigned char* png_bytes = reinterpret_cast<const unsigned char*>( 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_data.data() + png_entry->dwImageOffset); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image = gfx::Image::CreateFrom1xPNGBytes( 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) png_bytes, png_entry->dwBytesInRes); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmap bitmap = image.AsBitmap(); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(256, bitmap.width()); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(256, bitmap.height()); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following test case makes sure IconUtil::SkBitmapFromHICON fails 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gracefully when called with invalid input parameters. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconUtilTest, TestIconToBitmapInvalidParameters) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath icon_filename = 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_data_directory_.AppendASCII(kSmallIconName); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size icon_size(kSmallIconWidth, kSmallIconHeight); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON icon = LoadIconFromFile(icon_filename, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_size.width(), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_size.height()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(icon != NULL); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid size parameter. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size invalid_icon_size(kSmallIconHeight, 0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IconUtil::CreateSkBitmapFromHICON(icon, invalid_icon_size), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SkBitmap*>(NULL)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid icon. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(IconUtil::CreateSkBitmapFromHICON(NULL, icon_size), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SkBitmap*>(NULL)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following code should succeed. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> bitmap; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(IconUtil::CreateSkBitmapFromHICON(icon, icon_size)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::DestroyIcon(icon); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following test case makes sure IconUtil::CreateHICONFromSkBitmap fails 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gracefully when called with invalid input parameters. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconUtilTest, TestBitmapToIconInvalidParameters) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON icon = NULL; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> bitmap; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrong bitmap format. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->setInfo(SkImageInfo::MakeA8(kSmallIconWidth, kSmallIconHeight)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon = IconUtil::CreateHICONFromSkBitmap(*bitmap); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon, static_cast<HICON>(NULL)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid bitmap size. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->setInfo(SkImageInfo::MakeN32Premul(0, 0)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon = IconUtil::CreateHICONFromSkBitmap(*bitmap); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon, static_cast<HICON>(NULL)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid bitmap configuration but no pixels allocated. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->setInfo(SkImageInfo::MakeN32Premul(kSmallIconWidth, 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kSmallIconHeight)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon = IconUtil::CreateHICONFromSkBitmap(*bitmap); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(icon == NULL); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The following test case makes sure IconUtil::CreateIconFileFromImageFamily 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fails gracefully when called with invalid input parameters. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconUtilTest, TestCreateIconFileInvalidParameters) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> bitmap; 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageFamily image_family; 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath valid_icon_filename = temp_directory_.path().AppendASCII( 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kTempIconFilename); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath invalid_icon_filename = temp_directory_.path().AppendASCII( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "<>?.ico"); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrong bitmap format. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Must allocate pixels or else ImageSkia will ignore the bitmap and just 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // return an empty image. 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->allocPixels(SkImageInfo::MakeA8(kSmallIconWidth, kSmallIconHeight)); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memset(bitmap->getPixels(), 0, bitmap->width() * bitmap->height()); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap)); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family, 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) valid_icon_filename)); 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(valid_icon_filename)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid bitmap size. 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->allocPixels(SkImageInfo::MakeN32Premul(0, 0)); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap)); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family, 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) valid_icon_filename)); 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(valid_icon_filename)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bitmap with no allocated pixels. 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(new SkBitmap); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap->setInfo(SkImageInfo::MakeN32Premul(kSmallIconWidth, 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kSmallIconHeight)); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap)); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) valid_icon_filename)); 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(valid_icon_filename)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid file name. 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap->allocPixels(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting the pixels to black. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(bitmap->getPixels(), 0, bitmap->width() * bitmap->height() * 4); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap)); 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family, 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalid_icon_filename)); 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(invalid_icon_filename)); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test case makes sure IconUtil::CreateIconFileFromImageFamily fails if 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the image family is empty or invalid. 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(IconUtilTest, TestCreateIconFileEmptyImageFamily) { 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath icon_filename = temp_directory_.path().AppendASCII( 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kTempIconFilename); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Empty image family. 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(gfx::ImageFamily(), 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(icon_filename)); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Image family with only an empty image. 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageFamily image_family; 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image()); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family, 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(icon_filename)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test case makes sure that when we load an icon from disk and convert 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the HICON into a bitmap, the bitmap has the expected format and dimensions. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconUtilTest, TestCreateSkBitmapFromHICON) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> bitmap; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath small_icon_filename = test_data_directory_.AppendASCII( 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSmallIconName); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size small_icon_size(kSmallIconWidth, kSmallIconHeight); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON small_icon = LoadIconFromFile(small_icon_filename, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) small_icon_size.width(), 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) small_icon_size.height()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(small_icon, static_cast<HICON>(NULL)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(IconUtil::CreateSkBitmapFromHICON(small_icon, small_icon_size)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap->width(), small_icon_size.width()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap->height(), small_icon_size.height()); 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(bitmap->colorType(), kPMColor_SkColorType); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::DestroyIcon(small_icon); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath large_icon_filename = test_data_directory_.AppendASCII( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLargeIconName); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size large_icon_size(kLargeIconWidth, kLargeIconHeight); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON large_icon = LoadIconFromFile(large_icon_filename, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_icon_size.width(), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) large_icon_size.height()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(large_icon, static_cast<HICON>(NULL)); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.reset(IconUtil::CreateSkBitmapFromHICON(large_icon, large_icon_size)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap->width(), large_icon_size.width()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap->height(), large_icon_size.height()); 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(bitmap->colorType(), kPMColor_SkColorType); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::DestroyIcon(large_icon); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test case makes sure that when an HICON is created from an SkBitmap, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the returned handle is valid and refers to an icon with the expected 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// dimensions color depth etc. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconUtilTest, TestBasicCreateHICONFromSkBitmap) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap = CreateBlackSkBitmap(kSmallIconWidth, kSmallIconHeight); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HICON icon = IconUtil::CreateHICONFromSkBitmap(bitmap); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(icon, static_cast<HICON>(NULL)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ICONINFO icon_info; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(::GetIconInfo(icon, &icon_info)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(icon_info.fIcon); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that have the icon information, we should obtain the specification of 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the icon's bitmap and make sure it matches the specification of the 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SkBitmap we started with. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bitmap handle contained in the icon information is a handle to a 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compatible bitmap so we need to call ::GetDIBits() in order to retrieve 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the bitmap's header information. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BITMAPINFO bitmap_info; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ZeroMemory(&bitmap_info, sizeof(BITMAPINFO)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFO); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc = ::GetDC(NULL); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = ::GetDIBits(hdc, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_info.hbmColor, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSmallIconWidth, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bitmap_info, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIB_RGB_COLORS); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(result, 0); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap_info.bmiHeader.biWidth, kSmallIconWidth); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap_info.bmiHeader.biHeight, kSmallIconHeight); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap_info.bmiHeader.biPlanes, 1); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap_info.bmiHeader.biBitCount, 32); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ReleaseDC(NULL, hdc); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::DestroyIcon(icon); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test case makes sure that CreateIconFileFromImageFamily creates a 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// valid .ico file given an ImageFamily, and appropriately creates all icon 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// sizes from the given input. 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(IconUtilTest, TestCreateIconFileFromImageFamily) { 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageFamily image_family; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath icon_filename = 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_directory_.path().AppendASCII(kTempIconFilename); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with only a 16x16 icon. Should only scale up to 48x48. 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap( 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateBlackSkBitmap(kSmallIconWidth, kSmallIconHeight))); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 48); 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a 48x48 icon. Should only scale down. 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(48, 48))); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 48); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a 64x64 icon. Should scale up to 256x256. 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(64, 64))); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 256); 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a 256x256 icon. Should include the 256x256 in the output. 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap( 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateBlackSkBitmap(256, 256))); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 256); 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a 49x49 icon. Should scale up to 256x256, but exclude the 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // original 49x49 representation from the output. 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(49, 49))); 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 256); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a non-square 16x32 icon. Should scale up to 48, but exclude the 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // original 16x32 representation from the output. 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(16, 32))); 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 48); 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with a non-square 32x49 icon. Should scale up to 256, but exclude the 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // original 32x49 representation from the output. 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(32, 49))); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 256); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test with an empty and non-empty image. 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The empty image should be ignored. 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.clear(); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image()); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_family.Add(gfx::Image::CreateFrom1xBitmap(CreateBlackSkBitmap(16, 16))); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(IconUtil::CreateIconFileFromImageFamily(image_family, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_filename)); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckAllIconSizes(icon_filename, 48); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(IconUtilTest, TestCreateSkBitmapFromIconResource48x48) { 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HMODULE module = GetModuleHandle(NULL); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SkBitmap> bitmap( 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconUtil::CreateSkBitmapFromIconResource(module, IDR_MAINFRAME, 48)); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(bitmap.get()); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(48, bitmap->width()); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(48, bitmap->height()); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(IconUtilTest, TestCreateSkBitmapFromIconResource256x256) { 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HMODULE module = GetModuleHandle(NULL); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SkBitmap> bitmap( 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconUtil::CreateSkBitmapFromIconResource(module, IDR_MAINFRAME, 256)); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(bitmap.get()); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(256, bitmap->width()); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(256, bitmap->height()); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This tests that kNumIconDimensionsUpToMediumSize has the correct value. 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(IconUtilTest, TestNumIconDimensionsUpToMediumSize) { 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LE(IconUtil::kNumIconDimensionsUpToMediumSize, 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconUtil::kNumIconDimensions); 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(IconUtil::kMediumIconSize, 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconUtil::kIconDimensions[ 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IconUtil::kNumIconDimensionsUpToMediumSize - 1]); 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 432