Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / cc / surfaces / surface_factory.cc
1 // Copyright 2014 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.
4
5 #include "cc/surfaces/surface_factory.h"
6
7 #include "cc/output/compositor_frame.h"
8 #include "cc/output/copy_output_request.h"
9 #include "cc/surfaces/surface.h"
10 #include "cc/surfaces/surface_manager.h"
11 #include "ui/gfx/geometry/size.h"
12
13 namespace cc {
14 SurfaceFactory::SurfaceFactory(SurfaceManager* manager,
15                                SurfaceFactoryClient* client)
16     : manager_(manager), client_(client), holder_(client) {
17 }
18
19 SurfaceFactory::~SurfaceFactory() {
20   if (!surface_map_.empty()) {
21     LOG(ERROR) << "SurfaceFactory has " << surface_map_.size()
22                << " entries in map on destruction.";
23   }
24   DestroyAll();
25 }
26
27 void SurfaceFactory::DestroyAll() {
28   for (auto it = surface_map_.begin(); it != surface_map_.end(); ++it)
29     manager_->Destroy(surface_map_.take(it));
30   surface_map_.clear();
31 }
32
33 void SurfaceFactory::Create(SurfaceId surface_id, const gfx::Size& size) {
34   scoped_ptr<Surface> surface(new Surface(surface_id, size, this));
35   manager_->RegisterSurface(surface.get());
36   DCHECK(!surface_map_.count(surface_id));
37   surface_map_.add(surface_id, surface.Pass());
38 }
39
40 void SurfaceFactory::Destroy(SurfaceId surface_id) {
41   OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
42   DCHECK(it != surface_map_.end());
43   DCHECK(it->second->factory().get() == this);
44   manager_->Destroy(surface_map_.take_and_erase(it));
45 }
46
47 void SurfaceFactory::SubmitFrame(SurfaceId surface_id,
48                                  scoped_ptr<CompositorFrame> frame,
49                                  const base::Closure& callback) {
50   OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
51   DCHECK(it != surface_map_.end());
52   DCHECK(it->second->factory().get() == this);
53   it->second->QueueFrame(frame.Pass(), callback);
54   manager_->SurfaceModified(surface_id);
55 }
56
57 void SurfaceFactory::RequestCopyOfSurface(
58     SurfaceId surface_id,
59     scoped_ptr<CopyOutputRequest> copy_request) {
60   OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
61   if (it == surface_map_.end()) {
62     copy_request->SendEmptyResult();
63     return;
64   }
65   DCHECK(it->second->factory().get() == this);
66   it->second->RequestCopyOfOutput(copy_request.Pass());
67   manager_->SurfaceModified(surface_id);
68 }
69
70 void SurfaceFactory::ReceiveFromChild(
71     const TransferableResourceArray& resources) {
72   holder_.ReceiveFromChild(resources);
73 }
74
75 void SurfaceFactory::RefResources(const TransferableResourceArray& resources) {
76   holder_.RefResources(resources);
77 }
78
79 void SurfaceFactory::UnrefResources(const ReturnedResourceArray& resources) {
80   holder_.UnrefResources(resources);
81 }
82
83 }  // namespace cc