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 15 class SkBitmap; 16 17 namespace cc { 18 class CopyOutputResult; 19 20 class 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