1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/ozone/platform/test/test_surface_factory.h"
8 #include "base/files/file_util.h"
9 #include "base/location.h"
10 #include "base/stl_util.h"
11 #include "base/threading/worker_pool.h"
12 #include "third_party/skia/include/core/SkCanvas.h"
13 #include "third_party/skia/include/core/SkSurface.h"
14 #include "ui/gfx/codec/png_codec.h"
15 #include "ui/gfx/skia_util.h"
16 #include "ui/gfx/vsync_provider.h"
17 #include "ui/ozone/platform/test/test_window.h"
18 #include "ui/ozone/platform/test/test_window_manager.h"
19 #include "ui/ozone/public/surface_ozone_canvas.h"
25 void WriteDataToFile(const base::FilePath
& location
, const SkBitmap
& bitmap
) {
26 DCHECK(!location
.empty());
27 std::vector
<unsigned char> png_data
;
28 gfx::PNGCodec::FastEncodeBGRASkBitmap(bitmap
, true, &png_data
);
29 base::WriteFile(location
,
30 reinterpret_cast<const char*>(vector_as_array(&png_data
)),
34 class FileSurface
: public SurfaceOzoneCanvas
{
36 FileSurface(const base::FilePath
& location
) : location_(location
) {}
37 ~FileSurface() override
{}
39 // SurfaceOzoneCanvas overrides:
40 void ResizeCanvas(const gfx::Size
& viewport_size
) override
{
41 surface_
= skia::AdoptRef(SkSurface::NewRaster(SkImageInfo::MakeN32Premul(
42 viewport_size
.width(), viewport_size
.height())));
44 skia::RefPtr
<SkSurface
> GetSurface() override
{ return surface_
; }
45 void PresentCanvas(const gfx::Rect
& damage
) override
{
46 if (location_
.empty())
49 bitmap
.setInfo(surface_
->getCanvas()->imageInfo());
51 // TODO(dnicoara) Use SkImage instead to potentially avoid a copy.
52 // See crbug.com/361605 for details.
53 if (surface_
->getCanvas()->readPixels(&bitmap
, 0, 0)) {
54 base::WorkerPool::PostTask(
55 FROM_HERE
, base::Bind(&WriteDataToFile
, location_
, bitmap
), true);
58 scoped_ptr
<gfx::VSyncProvider
> CreateVSyncProvider() override
{
63 base::FilePath location_
;
64 skia::RefPtr
<SkSurface
> surface_
;
69 TestSurfaceFactory::TestSurfaceFactory() : TestSurfaceFactory(nullptr) {}
71 TestSurfaceFactory::TestSurfaceFactory(TestWindowManager
* window_manager
)
72 : window_manager_(window_manager
) {}
74 TestSurfaceFactory::~TestSurfaceFactory() {}
76 scoped_ptr
<SurfaceOzoneCanvas
> TestSurfaceFactory::CreateCanvasForWidget(
77 gfx::AcceleratedWidget widget
) {
78 TestWindow
* window
= window_manager_
->GetWindow(widget
);
79 return make_scoped_ptr
<SurfaceOzoneCanvas
>(new FileSurface(window
->path()));
82 bool TestSurfaceFactory::LoadEGLGLES2Bindings(
83 AddGLLibraryCallback add_gl_library
,
84 SetGLGetProcAddressProcCallback set_gl_get_proc_address
) {