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
13namespace cc {
14SurfaceFactory::SurfaceFactory(SurfaceManager* manager,
15                               SurfaceFactoryClient* client)
16    : manager_(manager), client_(client), holder_(client) {
17}
18
19SurfaceFactory::~SurfaceFactory() {
20}
21
22void SurfaceFactory::Create(SurfaceId surface_id, const gfx::Size& size) {
23  scoped_ptr<Surface> surface(new Surface(surface_id, size, this));
24  manager_->RegisterSurface(surface.get());
25  DCHECK(!surface_map_.count(surface_id));
26  surface_map_.add(surface_id, surface.Pass());
27}
28
29void SurfaceFactory::Destroy(SurfaceId surface_id) {
30  OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
31  DCHECK(it != surface_map_.end());
32  DCHECK(it->second->factory() == this);
33  manager_->DeregisterSurface(surface_id);
34  surface_map_.erase(it);
35}
36
37void SurfaceFactory::SubmitFrame(SurfaceId surface_id,
38                                 scoped_ptr<CompositorFrame> frame,
39                                 const base::Closure& callback) {
40  OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
41  DCHECK(it != surface_map_.end());
42  DCHECK(it->second->factory() == this);
43  it->second->QueueFrame(frame.Pass(), callback);
44  manager_->SurfaceModified(surface_id);
45}
46
47void SurfaceFactory::RequestCopyOfSurface(
48    SurfaceId surface_id,
49    scoped_ptr<CopyOutputRequest> copy_request) {
50  OwningSurfaceMap::iterator it = surface_map_.find(surface_id);
51  if (it == surface_map_.end()) {
52    copy_request->SendEmptyResult();
53    return;
54  }
55  DCHECK(it->second->factory() == this);
56  it->second->RequestCopyOfOutput(copy_request.Pass());
57  manager_->SurfaceModified(surface_id);
58}
59
60void SurfaceFactory::ReceiveFromChild(
61    const TransferableResourceArray& resources) {
62  holder_.ReceiveFromChild(resources);
63}
64
65void SurfaceFactory::RefResources(const TransferableResourceArray& resources) {
66  holder_.RefResources(resources);
67}
68
69void SurfaceFactory::UnrefResources(const ReturnedResourceArray& resources) {
70  holder_.UnrefResources(resources);
71}
72
73}  // namespace cc
74