Index: ui/ozone/platform/test/test_window_manager.cc |
diff --git a/ui/ozone/platform/test/test_window_manager.cc b/ui/ozone/platform/test/test_window_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd48bf33eefdacdd347c4280c64bf5e31fc14aa3 |
--- /dev/null |
+++ b/ui/ozone/platform/test/test_window_manager.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/ozone/platform/test/test_window_manager.h" |
+ |
+#include "base/bind.h" |
+#include "base/files/file_util.h" |
+#include "base/location.h" |
+#include "base/stl_util.h" |
+#include "base/threading/worker_pool.h" |
+#include "third_party/skia/include/core/SkCanvas.h" |
+#include "third_party/skia/include/core/SkSurface.h" |
+#include "ui/gfx/codec/png_codec.h" |
+#include "ui/gfx/skia_util.h" |
+#include "ui/gfx/vsync_provider.h" |
+#include "ui/ozone/public/surface_ozone_canvas.h" |
+ |
+namespace ui { |
+ |
+namespace { |
+ |
+void WriteDataToFile(const base::FilePath& location, const SkBitmap& bitmap) { |
+ DCHECK(!location.empty()); |
+ std::vector<unsigned char> png_data; |
+ gfx::PNGCodec::FastEncodeBGRASkBitmap(bitmap, true, &png_data); |
+ base::WriteFile(location, |
+ reinterpret_cast<const char*>(vector_as_array(&png_data)), |
+ png_data.size()); |
+} |
+ |
+class FileSurface : public SurfaceOzoneCanvas { |
+ public: |
+ FileSurface(const base::FilePath& location) : location_(location) {} |
+ ~FileSurface() override {} |
+ |
+ // SurfaceOzoneCanvas overrides: |
+ void ResizeCanvas(const gfx::Size& viewport_size) override { |
+ surface_ = skia::AdoptRef(SkSurface::NewRaster(SkImageInfo::MakeN32Premul( |
+ viewport_size.width(), viewport_size.height()))); |
+ } |
+ skia::RefPtr<SkSurface> GetSurface() override { return surface_; } |
+ void PresentCanvas(const gfx::Rect& damage) override { |
+ if (location_.empty()) |
+ return; |
+ SkBitmap bitmap; |
+ bitmap.setInfo(surface_->getCanvas()->imageInfo()); |
+ |
+ // TODO(dnicoara) Use SkImage instead to potentially avoid a copy. |
+ // See crbug.com/361605 for details. |
+ if (surface_->getCanvas()->readPixels(&bitmap, 0, 0)) { |
+ base::WorkerPool::PostTask( |
+ FROM_HERE, base::Bind(&WriteDataToFile, location_, bitmap), true); |
+ } |
+ } |
+ scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() override { |
+ return nullptr; |
+ } |
+ |
+ private: |
+ base::FilePath location_; |
+ skia::RefPtr<SkSurface> surface_; |
+}; |
+ |
+} // namespace |
+ |
+TestWindowManager::TestWindowManager(const base::FilePath& dump_location) |
+ : location_(dump_location) { |
+} |
+ |
+TestWindowManager::~TestWindowManager() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+} |
+ |
+void TestWindowManager::Initialize() { |
+ if (location_.empty()) |
+ return; |
+ if (!DirectoryExists(location_) && !base::CreateDirectory(location_) && |
+ location_ != base::FilePath("/dev/null")) |
+ PLOG(FATAL) << "unable to create output directory"; |
+ if (!base::PathIsWritable(location_)) |
+ PLOG(FATAL) << "unable to write to output location"; |
+} |
+ |
+int32_t TestWindowManager::AddWindow(TestWindow* window) { |
+ return windows_.Add(window); |
+} |
+ |
+void TestWindowManager::RemoveWindow(int32_t window_id, TestWindow* window) { |
+ DCHECK_EQ(window, windows_.Lookup(window_id)); |
+ windows_.Remove(window_id); |
+} |
+ |
+base::FilePath TestWindowManager::base_path() const { |
+ return location_; |
+} |
+ |
+scoped_ptr<SurfaceOzoneCanvas> TestWindowManager::CreateCanvasForWidget( |
+ gfx::AcceleratedWidget widget) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ TestWindow* window = windows_.Lookup(widget); |
+ DCHECK(window); |
+ return make_scoped_ptr<SurfaceOzoneCanvas>(new FileSurface(window->path())); |
+} |
+ |
+bool TestWindowManager::LoadEGLGLES2Bindings( |
+ AddGLLibraryCallback add_gl_library, |
+ SetGLGetProcAddressProcCallback set_gl_get_proc_address) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ return false; |
+} |
+ |
+} // namespace ui |