190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef CC_OUTPUT_COPY_OUTPUT_REQUEST_H_ 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define CC_OUTPUT_COPY_OUTPUT_REQUEST_H_ 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/callback.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/base/cc_export.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/resources/single_release_callback.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/resources/texture_mailbox.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/rect.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SkBitmap; 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace cc { 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CopyOutputResult; 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CC_EXPORT CopyOutputRequest { 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::Callback<void(scoped_ptr<CopyOutputResult> result)> 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputRequestCallback; 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static scoped_ptr<CopyOutputRequest> CreateEmptyRequest() { 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return make_scoped_ptr(new CopyOutputRequest); 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static scoped_ptr<CopyOutputRequest> CreateRequest( 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const CopyOutputRequestCallback& result_callback) { 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return make_scoped_ptr(new CopyOutputRequest(false, result_callback)); 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<CopyOutputRequest> CreateBitmapRequest( 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const CopyOutputRequestCallback& result_callback) { 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return make_scoped_ptr(new CopyOutputRequest(true, result_callback)); 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static scoped_ptr<CopyOutputRequest> CreateRelayRequest( 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const CopyOutputRequest& original_request, 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CopyOutputRequestCallback& result_callback); 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ~CopyOutputRequest(); 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool IsEmpty() const { return result_callback_.is_null(); } 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool force_bitmap_result() const { return force_bitmap_result_; } 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // By default copy requests copy the entire layer's subtree output. If an 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // area is given, then the intersection of this rect (in layer space) with 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the layer's subtree output will be returned. 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_area(const gfx::Rect& area) { 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch has_area_ = true; 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch area_ = area; 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool has_area() const { return has_area_; } 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect area() const { return area_; } 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // By default copy requests create a new TextureMailbox to return contents 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // in. This allows a client to provide a TextureMailbox, and the compositor 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // will place the result inside the TextureMailbox. 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetTextureMailbox(const TextureMailbox& texture_mailbox); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool has_texture_mailbox() const { return has_texture_mailbox_; } 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const TextureMailbox& texture_mailbox() const { return texture_mailbox_; } 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SendEmptyResult(); 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SendBitmapResult(scoped_ptr<SkBitmap> bitmap); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendTextureResult(const gfx::Size& size, 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const TextureMailbox& texture_mailbox, 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<SingleReleaseCallback> release_callback); 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SendResult(scoped_ptr<CopyOutputResult> result); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputRequest(); 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CopyOutputRequest(bool force_bitmap_result, 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CopyOutputRequestCallback& result_callback); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool force_bitmap_result_; 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool has_area_; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool has_texture_mailbox_; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect area_; 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TextureMailbox texture_mailbox_; 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputRequestCallback result_callback_; 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace cc 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // CC_OUTPUT_COPY_OUTPUT_REQUEST_H_ 87