Chromium Code Reviews| Index: ui/gfx/compositor/layer_unittest.cc |
| diff --git a/ui/gfx/compositor/layer_unittest.cc b/ui/gfx/compositor/layer_unittest.cc |
| index 97bc387bddd1a49d63f701a4025db540184da11a..2ec0e5f8845e3db75746e9bf1ba97380eef45b91 100644 |
| --- a/ui/gfx/compositor/layer_unittest.cc |
| +++ b/ui/gfx/compositor/layer_unittest.cc |
| @@ -15,13 +15,39 @@ |
| #include "ui/gfx/compositor/compositor_observer.h" |
| #include "ui/gfx/compositor/layer.h" |
| #include "ui/gfx/compositor/layer_animation_sequence.h" |
| -#include "ui/gfx/compositor/test_compositor.h" |
| -#include "ui/gfx/compositor/test_compositor_host.h" |
| +#include "ui/gfx/compositor/test/test_compositor.h" |
| +#include "ui/gfx/compositor/test/test_compositor_host.h" |
| +#include "ui/gfx/gfx_paths.h" |
| namespace ui { |
| namespace { |
| +// Encodes a bitmap into a PNG and write to disk. Returns true on success. The |
| +// parent directory does not have to exist. |
| +bool WritePNGFile(const SkBitmap& bitmap, const FilePath& file_path) { |
| + std::vector<unsigned char> png_data; |
| + if (gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &png_data) && |
| + file_util::CreateDirectory(file_path.DirName())) { |
| + int bytes_written = file_util::WriteFile( |
|
sky
2011/11/14 21:44:26
nit: make this one statement,
return file_util::Wr
|
| + file_path, reinterpret_cast<char*>(&png_data[0]), png_data.size()); |
| + if (bytes_written == static_cast<int>(png_data.size())) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +// Reads and decodes a PNG image to a bitmap. Returns true on success. The PNG |
| +// should have been encoded using |gfx::PNGCodec::Encode|. |
| +bool ReadPNGFile(const FilePath& file_path, SkBitmap* bitmap) { |
| + DCHECK(bitmap); |
| + std::string png_data; |
| + return file_util::ReadFileToString(file_path, &png_data) && |
| + gfx::PNGCodec::Decode(reinterpret_cast<unsigned char*>(&png_data[0]), |
| + png_data.length(), |
| + bitmap); |
| +} |
| + |
| // There are three test classes in here that configure the Compositor and |
| // Layer's slightly differently: |
| // - LayerWithNullDelegateTest uses TestCompositor and NullLayerDelegate as the |
| @@ -53,7 +79,11 @@ class ColoredLayer : public Layer, public LayerDelegate { |
| class LayerWithRealCompositorTest : public testing::Test { |
| public: |
| - LayerWithRealCompositorTest() {} |
| + LayerWithRealCompositorTest() { |
| + if (PathService::Get(gfx::DIR_TEST_DATA, &test_data_directory_)) { |
| + test_data_directory_ = test_data_directory_.AppendASCII("compositor"); |
| + } |
| + } |
| virtual ~LayerWithRealCompositorTest() {} |
| // Overridden from testing::Test: |
| @@ -105,9 +135,61 @@ class LayerWithRealCompositorTest : public testing::Test { |
| gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| } |
| + // Compares with a ping file on disk, and returns true if it is the same as |
|
jonathan.backer
2011/11/14 20:22:40
s/ping/PNG
|
| + // the given image. |
|
jonathan.backer
2011/11/14 20:22:40
Your call. Seems like something that belongs in th
|
| + bool IsSameAsPNGFile(const SkBitmap& gen_bmp, const char* file) { |
|
sky
2011/11/14 21:44:26
Document what file is relative to.
|
| + SkBitmap ref_bmp; |
| + bool should_compare = true; |
| + FilePath ref_img_path = test_data_directory_.AppendASCII(file); |
| + if (!ReadPNGFile(ref_img_path, &ref_bmp)) { |
| + LOG(ERROR) << "Cannot read reference image: " << ref_img_path.value(); |
| + should_compare = false; |
|
sky
2011/11/14 21:44:26
Is there any point on continuing on if you can't r
|
| + } |
| + |
| + if (should_compare && |
| + (ref_bmp.width() != gen_bmp.width() || |
| + ref_bmp.height() != gen_bmp.height())) { |
| + LOG(ERROR) |
| + << "Dimensions do not match (Expected) vs (Actual):" |
| + << "(" << ref_bmp.width() << "x" << ref_bmp.height() |
| + << ") vs. " |
| + << "(" << gen_bmp.width() << "x" << gen_bmp.height() << ")"; |
| + should_compare = false; |
|
sky
2011/11/14 21:44:26
Return here too?
|
| + } |
| + |
| + // Compare pixels and create a simple diff image. |
| + int diff_pixels_count = 0; |
| + if (should_compare) { |
| + SkAutoLockPixels lock_bmp(gen_bmp); |
| + SkAutoLockPixels lock_ref_bmp(ref_bmp); |
| + // The reference images were saved with no alpha channel. Use the mask to |
| + // set alpha to 0. |
| + uint32_t kAlphaMask = 0x00FFFFFF; |
| + for (int x = 0; x < gen_bmp.width(); ++x) { |
| + for (int y = 0; y < gen_bmp.height(); ++y) { |
| + if ((*gen_bmp.getAddr32(x, y) & kAlphaMask) != |
| + (*ref_bmp.getAddr32(x, y) & kAlphaMask)) { |
| + ++diff_pixels_count; |
| + } |
| + } |
| + } |
| + } |
| + |
| + // Write the generated and diff images if the comparison failed. |
|
jonathan.backer
2011/11/14 20:22:40
Stale comment?
|
| + if (diff_pixels_count != 0) { |
| + LOG(ERROR) << "Images differ by pixel count: " << diff_pixels_count; |
| + return false; |
| + } |
| + |
| + return true; |
| + } |
| + |
| private: |
| scoped_ptr<TestCompositorHost> window_; |
| + // The root directory for test files. |
| + FilePath test_data_directory_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(LayerWithRealCompositorTest); |
| }; |
| @@ -178,20 +260,6 @@ class NullLayerDelegate : public LayerDelegate { |
| DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); |
| }; |
| -// Encodes a bitmap into a PNG and write to disk. Returns true on success. The |
| -// parent directory does not have to exist. |
| -bool WritePNGFile(const SkBitmap& bitmap, const FilePath& file_path) { |
| - std::vector<unsigned char> png_data; |
| - if (gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &png_data) && |
| - file_util::CreateDirectory(file_path.DirName())) { |
| - int bytes_written = file_util::WriteFile( |
| - file_path, reinterpret_cast<char*>(&png_data[0]), png_data.size()); |
| - if (bytes_written == static_cast<int>(png_data.size())) |
| - return true; |
| - } |
| - return false; |
| -} |
| - |
| } |
| #if defined(OS_WIN) |
| @@ -203,6 +271,8 @@ bool WritePNGFile(const SkBitmap& bitmap, const FilePath& file_path) { |
| #define MAYBE_Hierarchy DISABLED_Hierarchy |
| #define MAYBE_HierarchyNoTexture DISABLED_HierarchyNoTexture |
| #define MAYBE_DrawPixels DISABLED_DrawPixels |
| +#define MAYBE_ModifyHierarchy DISABLED_ModifyHierarchy |
| +#define MAYBE_Opacity DISABLED_Opacity |
| #else |
| #define MAYBE_Delegate Delegate |
| #define MAYBE_Draw Draw |
| @@ -210,6 +280,8 @@ bool WritePNGFile(const SkBitmap& bitmap, const FilePath& file_path) { |
| #define MAYBE_Hierarchy Hierarchy |
| #define MAYBE_HierarchyNoTexture HierarchyNoTexture |
| #define MAYBE_DrawPixels DrawPixels |
| +#define MAYBE_ModifyHierarchy ModifyHierarchy |
| +#define MAYBE_Opacity Opacity |
| #endif |
| TEST_F(LayerWithRealCompositorTest, MAYBE_Draw) { |
| @@ -823,4 +895,102 @@ TEST_F(LayerWithRealCompositorTest, MAYBE_DrawPixels) { |
| EXPECT_TRUE(is_all_red); |
| } |
| +// Checks that modifying the hierarchy correctly affects final composite. |
| +TEST_F(LayerWithRealCompositorTest, MAYBE_ModifyHierarchy) { |
| + GetCompositor()->WidgetSizeChanged(gfx::Size(50, 50)); |
| + |
| + // l0 |
| + // +-l11 |
| + // | +-l21 |
| + // +-l12 |
| + scoped_ptr<Layer> l0(CreateColorLayer(SK_ColorRED, |
| + gfx::Rect(0, 0, 50, 50))); |
| + scoped_ptr<Layer> l11(CreateColorLayer(SK_ColorGREEN, |
| + gfx::Rect(0, 0, 25, 25))); |
| + scoped_ptr<Layer> l21(CreateColorLayer(SK_ColorMAGENTA, |
| + gfx::Rect(0, 0, 15, 15))); |
| + scoped_ptr<Layer> l12(CreateColorLayer(SK_ColorBLUE, |
| + gfx::Rect(10, 10, 25, 25))); |
| + |
| + l0->Add(l11.get()); |
| + l11->Add(l21.get()); |
| + l0->Add(l12.get()); |
| + |
| + DrawTree(l0.get()); |
| + |
| + SkBitmap bitmap; |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + //WritePNGFile(bitmap, |
| + // FilePath("ui/gfx/test/data/compositor/ModifyHierarchy1.png")); |
|
jonathan.backer
2011/11/14 20:22:40
This is probably OK. But I'm guessing that you nee
|
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "ModifyHierarchy1.png")); |
| + |
| + l0->MoveToFront(l11.get()); |
| + |
| + DrawTree(l0.get()); |
| + |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + //WritePNGFile(bitmap, |
| + // FilePath("ui/gfx/test/data/compositor/ModifyHierarchy2.png")); |
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "ModifyHierarchy2.png")); |
| + |
| + // l11 is already at the front, should have no effect. |
| + l0->MoveToFront(l11.get()); |
| + |
| + DrawTree(l0.get()); |
| + |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "ModifyHierarchy2.png")); |
| + |
| + // l11 is already at the front, should have no effect. |
| + l0->MoveAbove(l11.get(), l12.get()); |
| + |
| + DrawTree(l0.get()); |
| + |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "ModifyHierarchy2.png")); |
| + |
| + // should restore to original configuration |
| + l0->MoveAbove(l12.get(), l11.get()); |
| + |
| + DrawTree(l0.get()); |
| + |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "ModifyHierarchy1.png")); |
| +} |
| + |
| +// Opacity is rendered correctly. |
| +// Checks that modifying the hierarchy correctly affects final composite. |
| +TEST_F(LayerWithRealCompositorTest, MAYBE_Opacity) { |
| + GetCompositor()->WidgetSizeChanged(gfx::Size(50, 50)); |
| + |
| + // l0 |
| + // +-l11 |
| + scoped_ptr<Layer> l0(CreateColorLayer(SK_ColorRED, |
| + gfx::Rect(0, 0, 50, 50))); |
| + scoped_ptr<Layer> l11(CreateColorLayer(SK_ColorGREEN, |
| + gfx::Rect(0, 0, 25, 25))); |
| + |
| + l11->SetOpacity(0.75); |
| + |
| + l0->Add(l11.get()); |
| + DrawTree(l0.get()); |
| + |
| + SkBitmap bitmap; |
| + ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap)); |
| + ASSERT_FALSE(bitmap.empty()); |
| + |
| + //WritePNGFile(bitmap, FilePath("ui/gfx/test/data/compositor/Opacity.png")); |
| + ASSERT_TRUE(IsSameAsPNGFile(bitmap, "Opacity.png")); |
| +} |
| + |
| } // namespace ui |