copy_output_request.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright 2013 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#ifndef CC_OUTPUT_COPY_OUTPUT_REQUEST_H_
6#define CC_OUTPUT_COPY_OUTPUT_REQUEST_H_
7
8#include "base/callback.h"
9#include "base/memory/scoped_ptr.h"
10#include "cc/base/cc_export.h"
11#include "cc/resources/single_release_callback.h"
12#include "cc/resources/texture_mailbox.h"
13#include "ui/gfx/rect.h"
14
15class SkBitmap;
16
17namespace cc {
18class CopyOutputResult;
19
20class CC_EXPORT CopyOutputRequest {
21 public:
22  typedef base::Callback<void(scoped_ptr<CopyOutputResult> result)>
23      CopyOutputRequestCallback;
24
25  static scoped_ptr<CopyOutputRequest> CreateEmptyRequest() {
26    return make_scoped_ptr(new CopyOutputRequest);
27  }
28  static scoped_ptr<CopyOutputRequest> CreateRequest(
29      const CopyOutputRequestCallback& result_callback) {
30    return make_scoped_ptr(new CopyOutputRequest(false, result_callback));
31  }
32  static scoped_ptr<CopyOutputRequest> CreateBitmapRequest(
33      const CopyOutputRequestCallback& result_callback) {
34    return make_scoped_ptr(new CopyOutputRequest(true, result_callback));
35  }
36  static scoped_ptr<CopyOutputRequest> CreateRelayRequest(
37      const CopyOutputRequest& original_request,
38      const CopyOutputRequestCallback& result_callback);
39
40  ~CopyOutputRequest();
41
42  bool IsEmpty() const { return result_callback_.is_null(); }
43
44  bool force_bitmap_result() const { return force_bitmap_result_; }
45
46  // By default copy requests copy the entire layer's subtree output. If an
47  // area is given, then the intersection of this rect (in layer space) with
48  // the layer's subtree output will be returned.
49  void set_area(const gfx::Rect& area) {
50    has_area_ = true;
51    area_ = area;
52  }
53  bool has_area() const { return has_area_; }
54  gfx::Rect area() const { return area_; }
55
56  // By default copy requests create a new TextureMailbox to return contents
57  // in. This allows a client to provide a TextureMailbox, and the compositor
58  // will place the result inside the TextureMailbox.
59  void SetTextureMailbox(const TextureMailbox& texture_mailbox);
60  bool has_texture_mailbox() const { return has_texture_mailbox_; }
61  const TextureMailbox& texture_mailbox() const { return texture_mailbox_; }
62
63  void SendEmptyResult();
64  void SendBitmapResult(scoped_ptr<SkBitmap> bitmap);
65  void SendTextureResult(const gfx::Size& size,
66                         const TextureMailbox& texture_mailbox,
67                         scoped_ptr<SingleReleaseCallback> release_callback);
68
69  void SendResult(scoped_ptr<CopyOutputResult> result);
70
71 private:
72  CopyOutputRequest();
73  CopyOutputRequest(bool force_bitmap_result,
74                    const CopyOutputRequestCallback& result_callback);
75
76  bool force_bitmap_result_;
77  bool has_area_;
78  bool has_texture_mailbox_;
79  gfx::Rect area_;
80  TextureMailbox texture_mailbox_;
81  CopyOutputRequestCallback result_callback_;
82};
83
84}  // namespace cc
85
86#endif  // CC_OUTPUT_COPY_OUTPUT_REQUEST_H_
87