diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-19 23:18:22 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-19 23:18:22 +0000 |
commit | abe92999c62ebc866b8a0451b3a1eb1d71e37391 (patch) | |
tree | 3ead886a3c26bda2a80373ffde83b980941158ef /skia/ext/skia_utils_mac_unittest.mm | |
parent | a1d19d7439593f3bca7a0b4b8cc3be442a3c1272 (diff) | |
download | chromium_src-abe92999c62ebc866b8a0451b3a1eb1d71e37391.zip chromium_src-abe92999c62ebc866b8a0451b3a1eb1d71e37391.tar.gz chromium_src-abe92999c62ebc866b8a0451b3a1eb1d71e37391.tar.bz2 |
Add support for multi resolution icons
To support HiDPI we need a way to load two copies of icons, a low resolution version and a high resolution version.
To support this, this change does the following:
- split theme_resource.grd into three files:
- theme_resources.grd: icons that only have one resolution
- theme_resources_standard.grd: low resolution icons
- theme_resources_large.grd: high resolution icons
- theme_resource.grd and theme_resources_standard.grd and compiled into chrome.pak/chrome.rc for all platforms.
- theme_resources_large.grd is compiled into theme_resources_large.pak for platforms that want high resolution icons (currently only Mac)
- gfx::Image now support icons with multiple resolution
Currently not all ThemeService APIs return multi-resolution images. Once this is checked in I'll work on converting them as I go.
Note, this change will have to be coordinated with the change to reorganize theme resources. I'll work with saintlou on that.
BUG=75812
TEST=Added a TIFF to theme_resources.grd. Verified that the toolbar icon had a mutliresolution image. Verified that unit tests passed.
Review URL: http://codereview.chromium.org/6849030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82185 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/ext/skia_utils_mac_unittest.mm')
-rw-r--r-- | skia/ext/skia_utils_mac_unittest.mm | 145 |
1 files changed, 122 insertions, 23 deletions
diff --git a/skia/ext/skia_utils_mac_unittest.mm b/skia/ext/skia_utils_mac_unittest.mm index 1726c4a..c86be98 100644 --- a/skia/ext/skia_utils_mac_unittest.mm +++ b/skia/ext/skia_utils_mac_unittest.mm @@ -9,39 +9,60 @@ namespace { class SkiaUtilsMacTest : public testing::Test { public: + // Creates a red or blue bitmap. + SkBitmap CreateSkBitmap(int width, int height, bool isred, bool tfbit); + + // Creates a red or blue image. + NSImage* CreateNSImage(int width, int height, bool isred); + + // Checks that the given bitmap rep is actually red or blue. + void TestImageRep(NSBitmapImageRep* imageRep, bool isred); + + // Checks that the given bitmap is actually red or blue. + void TestSkBitmap(const SkBitmap& bitmap, bool isred); + // If not red, is blue. // If not tfbit (twenty-four-bit), is 444. void ShapeHelper(int width, int height, bool isred, bool tfbit); }; -void SkiaUtilsMacTest::ShapeHelper(int width, int height, - bool isred, bool tfbit) { - SkBitmap thing; +SkBitmap SkiaUtilsMacTest::CreateSkBitmap(int width, int height, + bool isred, bool tfbit) { + SkBitmap bitmap; if (tfbit) - thing.setConfig(SkBitmap::kARGB_8888_Config, width, height); + bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); else - thing.setConfig(SkBitmap::kARGB_4444_Config, width, height); - thing.allocPixels(); + bitmap.setConfig(SkBitmap::kARGB_4444_Config, width, height); + bitmap.allocPixels(); if (isred) - thing.eraseRGB(0xff, 0, 0); + bitmap.eraseRGB(0xff, 0, 0); else - thing.eraseRGB(0, 0, 0xff); + bitmap.eraseRGB(0, 0, 0xff); - // Confirm size - NSImage* image = gfx::SkBitmapToNSImage(thing); - EXPECT_DOUBLE_EQ([image size].width, (double)width); - EXPECT_DOUBLE_EQ([image size].height, (double)height); + return bitmap; +} - // Get the color of a pixel and make sure it looks fine +NSImage* SkiaUtilsMacTest::CreateNSImage(int width, int height, bool isred) { + NSImage* image = [[[NSImage alloc] initWithSize:NSMakeSize(width, height)] + autorelease]; [image lockFocus]; + if (isred) + [[NSColor colorWithDeviceRed:1.0 green:0.0 blue:0.0 alpha:1.0] set]; + else + [[NSColor colorWithDeviceRed:0.0 green:0.0 blue:1.0 alpha:1.0] set]; + NSRectFill(NSMakeRect(0, 0, width, height)); + [image unlockFocus]; + return image; +} - int x = width > 17 ? 17 : 0; - int y = height > 17 ? 17 : 0; - NSColor* color = NSReadPixel(NSMakePoint(x, y)); +void SkiaUtilsMacTest::TestImageRep(NSBitmapImageRep* imageRep, bool isred) { + // Get the color of a pixel and make sure it looks fine + int x = [imageRep size].width > 17 ? 17 : 0; + int y = [imageRep size].height > 17 ? 17 : 0; + NSColor* color = [imageRep colorAtX:x y:y]; CGFloat red = 0, green = 0, blue = 0, alpha = 0; - [image unlockFocus]; // SkBitmapToNSImage returns a bitmap in the calibrated color space (sRGB), // while NSReadPixel returns a color in the device color space. Convert back @@ -52,14 +73,47 @@ void SkiaUtilsMacTest::ShapeHelper(int width, int height, // Be tolerant of floating point rounding and lossy color space conversions. if (isred) { - EXPECT_GT(red, 0.95); - EXPECT_LT(blue, 0.05); + EXPECT_NEAR(red, 1.0, 0.025); + EXPECT_NEAR(blue, 0.0, 0.025); + } else { + EXPECT_NEAR(red, 0.0, 0.025); + EXPECT_NEAR(blue, 1.0, 0.025); + } + EXPECT_NEAR(green, 0.0, 0.025); + EXPECT_NEAR(alpha, 1.0, 0.025); +} + +void SkiaUtilsMacTest::TestSkBitmap(const SkBitmap& bitmap, bool isred) { + int x = bitmap.width() > 17 ? 17 : 0; + int y = bitmap.height() > 17 ? 17 : 0; + SkColor color = bitmap.getColor(x, y); + + // Due to colorspace issues the colors may not match exactly. + // TODO(sail): Need to fix this, http://crbug.com/79946 + if (isred) { + EXPECT_NEAR(255u, SkColorGetR(color), 20); + EXPECT_NEAR(0u, SkColorGetB(color), 20); } else { - EXPECT_LT(red, 0.05); - EXPECT_GT(blue, 0.95); + EXPECT_NEAR(0u, SkColorGetR(color), 20); + EXPECT_NEAR(255u, SkColorGetB(color), 20); } - EXPECT_LT(green, 0.05); - EXPECT_GT(alpha, 0.95); + EXPECT_NEAR(0u, SkColorGetG(color), 20); + EXPECT_NEAR(255u, SkColorGetA(color), 20); +} + +void SkiaUtilsMacTest::ShapeHelper(int width, int height, + bool isred, bool tfbit) { + SkBitmap thing(CreateSkBitmap(width, height, isred, tfbit)); + + // Confirm size + NSImage* image = gfx::SkBitmapToNSImage(thing); + EXPECT_DOUBLE_EQ([image size].width, (double)width); + EXPECT_DOUBLE_EQ([image size].height, (double)height); + + EXPECT_TRUE([[image representations] count] == 1); + EXPECT_TRUE([[[image representations] lastObject] + isKindOfClass:[NSBitmapImageRep class]]); + TestImageRep([[image representations] lastObject], isred); } TEST_F(SkiaUtilsMacTest, BitmapToNSImage_RedSquare64x64) { @@ -74,4 +128,49 @@ TEST_F(SkiaUtilsMacTest, BitmapToNSImage_BlueRectangle444) { ShapeHelper(200, 200, false, false); } +TEST_F(SkiaUtilsMacTest, MultipleBitmapsToNSImage) { + int redWidth = 10; + int redHeight = 15; + int blueWidth = 20; + int blueHeight = 30; + + SkBitmap redBitmap(CreateSkBitmap(redWidth, redHeight, true, true)); + SkBitmap blueBitmap(CreateSkBitmap(blueWidth, blueHeight, false, true)); + std::vector<const SkBitmap*> bitmaps; + bitmaps.push_back(&redBitmap); + bitmaps.push_back(&blueBitmap); + + NSImage* image = gfx::SkBitmapsToNSImage(bitmaps); + + // Image size should be the same as the smallest bitmap. + EXPECT_DOUBLE_EQ(redWidth, [image size].width); + EXPECT_DOUBLE_EQ(redHeight, [image size].height); + + EXPECT_EQ(2u, [[image representations] count]); + + for (NSBitmapImageRep* imageRep in [image representations]) { + NSBitmapImageRep* imageRep = [[image representations] objectAtIndex:0]; + bool isred = [imageRep size].width == redWidth; + if (isred) { + EXPECT_DOUBLE_EQ(redHeight, [imageRep size].height); + } else { + EXPECT_DOUBLE_EQ(blueWidth, [imageRep size].width); + EXPECT_DOUBLE_EQ(blueHeight, [imageRep size].height); + } + TestImageRep(imageRep, isred); + } +} + +TEST_F(SkiaUtilsMacTest, NSImageRepToSkBitmap) { + int width = 10; + int height = 15; + bool isred = true; + + NSImage* image = CreateNSImage(width, height, isred); + EXPECT_EQ(1u, [[image representations] count]); + NSBitmapImageRep* imageRep = [[image representations] lastObject]; + SkBitmap bitmap(gfx::NSImageRepToSkBitmap(imageRep, [image size], false)); + TestSkBitmap(bitmap, isred); +} + } // namespace |