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_RESULT_H_
6#define CC_OUTPUT_COPY_OUTPUT_RESULT_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "cc/base/cc_export.h"
10#include "cc/resources/single_release_callback.h"
11#include "cc/resources/texture_mailbox.h"
12#include "ui/gfx/size.h"
13
14class SkBitmap;
15
16namespace cc {
17class TextureMailbox;
18
19class CC_EXPORT CopyOutputResult {
20 public:
21  static scoped_ptr<CopyOutputResult> CreateEmptyResult() {
22    return make_scoped_ptr(new CopyOutputResult);
23  }
24  static scoped_ptr<CopyOutputResult> CreateBitmapResult(
25      scoped_ptr<SkBitmap> bitmap) {
26    return make_scoped_ptr(new CopyOutputResult(bitmap.Pass()));
27  }
28  static scoped_ptr<CopyOutputResult> CreateTextureResult(
29      const gfx::Size& size,
30      const TextureMailbox& texture_mailbox,
31      scoped_ptr<SingleReleaseCallback> release_callback) {
32    return make_scoped_ptr(
33        new CopyOutputResult(size, texture_mailbox, release_callback.Pass()));
34  }
35
36  ~CopyOutputResult();
37
38  bool IsEmpty() const { return !HasBitmap() && !HasTexture(); }
39  bool HasBitmap() const { return !!bitmap_; }
40  bool HasTexture() const { return texture_mailbox_.IsValid(); }
41
42  gfx::Size size() const { return size_; }
43  scoped_ptr<SkBitmap> TakeBitmap();
44  void TakeTexture(TextureMailbox* texture_mailbox,
45                   scoped_ptr<SingleReleaseCallback>* release_callback);
46
47 private:
48  CopyOutputResult();
49  explicit CopyOutputResult(scoped_ptr<SkBitmap> bitmap);
50  explicit CopyOutputResult(const gfx::Size& size,
51                            const TextureMailbox& texture_mailbox,
52                            scoped_ptr<SingleReleaseCallback> release_callback);
53
54  gfx::Size size_;
55  scoped_ptr<SkBitmap> bitmap_;
56  TextureMailbox texture_mailbox_;
57  scoped_ptr<SingleReleaseCallback> release_callback_;
58};
59
60}  // namespace cc
61
62#endif  // CC_OUTPUT_COPY_OUTPUT_RESULT_H_
63