Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(961)

Unified Diff: ui/gfx/compositor/layer_unittest.cc

Issue 8533019: Add two pixel-based compositor unittests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removing images from this CL Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/compositor/layer_animator_unittest.cc ('k') | ui/gfx/compositor/run_all_unittests.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/compositor/layer_unittest.cc
diff --git a/ui/gfx/compositor/layer_unittest.cc b/ui/gfx/compositor/layer_unittest.cc
index aa16ceb94be5cac90380c21c9715ca8924ca3def..99b63c51e334db7b1cbc25f4049f52a7340c52ef 100644
--- a/ui/gfx/compositor/layer_unittest.cc
+++ b/ui/gfx/compositor/layer_unittest.cc
@@ -15,13 +15,82 @@
#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())) {
+ char* data = reinterpret_cast<char*>(&png_data[0]);
+ int size = static_cast<int>(png_data.size());
+ return file_util::WriteFile(file_path, data, size) == size;
+ }
+ 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);
+}
+
+// Compares with a PNG file on disk, and returns true if it is the same as
+// the given image. |ref_img_path| is absolute.
+bool IsSameAsPNGFile(const SkBitmap& gen_bmp, FilePath ref_img_path) {
+ SkBitmap ref_bmp;
+ if (!ReadPNGFile(ref_img_path, &ref_bmp)) {
+ LOG(ERROR) << "Cannot read reference image: " << ref_img_path.value();
+ return false;
+ }
+
+ if (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() << ")";
+ return false;
+ }
+
+ // Compare pixels and create a simple diff image.
+ int diff_pixels_count = 0;
+ 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;
+ }
+ }
+ }
+
+ if (diff_pixels_count != 0) {
+ LOG(ERROR) << "Images differ by pixel count: " << diff_pixels_count;
+ return false;
+ }
+
+ return true;
+}
+
+
// 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 +122,13 @@ 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");
+ } else {
+ LOG(ERROR) << "Could not open test data directory.";
+ }
+ }
virtual ~LayerWithRealCompositorTest() {}
// Overridden from testing::Test:
@@ -105,9 +180,14 @@ class LayerWithRealCompositorTest : public testing::Test {
gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height()));
}
+ const FilePath& test_data_directory() const { return test_data_directory_; }
+
private:
scoped_ptr<TestCompositorHost> window_;
+ // The root directory for test files.
+ FilePath test_data_directory_;
+
DISALLOW_COPY_AND_ASSIGN(LayerWithRealCompositorTest);
};
@@ -178,20 +258,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;
-}
-
// Remembers if it has been notified.
class TestCompositorObserver : public CompositorObserver {
public:
@@ -224,6 +290,8 @@ class TestCompositorObserver : public CompositorObserver {
#define MAYBE_DrawPixels DISABLED_DrawPixels
#define MAYBE_SetRootLayer DISABLED_SetRootLayer
#define MAYBE_CompositorObservers DISABLED_CompositorObservers
+#define MAYBE_ModifyHierarchy DISABLED_ModifyHierarchy
+#define MAYBE_Opacity DISABLED_Opacity
#else
#define MAYBE_Delegate Delegate
#define MAYBE_Draw Draw
@@ -233,6 +301,8 @@ class TestCompositorObserver : public CompositorObserver {
#define MAYBE_DrawPixels DrawPixels
#define MAYBE_SetRootLayer SetRootLayer
#define MAYBE_CompositorObservers CompositorObservers
+#define MAYBE_ModifyHierarchy ModifyHierarchy
+#define MAYBE_Opacity Opacity
#endif
TEST_F(LayerWithRealCompositorTest, MAYBE_Draw) {
@@ -1117,4 +1187,87 @@ TEST_F(LayerWithRealCompositorTest, MAYBE_CompositorObservers) {
EXPECT_FALSE(observer.notified());
}
+// 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)));
+
+ FilePath ref_img1 = test_data_directory().AppendASCII("ModifyHierarchy1.png");
+ FilePath ref_img2 = test_data_directory().AppendASCII("ModifyHierarchy2.png");
+ SkBitmap bitmap;
+
+ l0->Add(l11.get());
+ l11->Add(l21.get());
+ l0->Add(l12.get());
+ DrawTree(l0.get());
+ ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap));
+ ASSERT_FALSE(bitmap.empty());
+ // WritePNGFile(bitmap, ref_img1);
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img1));
+
+ l0->MoveToFront(l11.get());
+ DrawTree(l0.get());
+ ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap));
+ ASSERT_FALSE(bitmap.empty());
+ // WritePNGFile(bitmap, ref_img2);
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img2));
+
+ // 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());
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img2));
+
+ // 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());
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img2));
+
+ // should restore to original configuration
+ l0->MoveAbove(l12.get(), l11.get());
+ DrawTree(l0.get());
+ ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap));
+ ASSERT_FALSE(bitmap.empty());
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img1));
+}
+
+// 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)));
+
+ FilePath ref_img = test_data_directory().AppendASCII("Opacity.png");
+
+ l11->SetOpacity(0.75);
+ l0->Add(l11.get());
+ DrawTree(l0.get());
+ SkBitmap bitmap;
+ ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap));
+ ASSERT_FALSE(bitmap.empty());
+ // WritePNGFile(bitmap, ref_img);
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, ref_img));
+}
+
} // namespace ui
« no previous file with comments | « ui/gfx/compositor/layer_animator_unittest.cc ('k') | ui/gfx/compositor/run_all_unittests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698