Index: ui/aura/window.cc |
diff --git a/ui/aura/window.cc b/ui/aura/window.cc |
index 5160bf6c34fbd23f33c5f943d2a8fa9b325b5ba3..79fb08335af443bd9fad03fad266a7d883afbe86 100644 |
--- a/ui/aura/window.cc |
+++ b/ui/aura/window.cc |
@@ -34,6 +34,15 @@ |
namespace aura { |
+namespace { |
+ |
+void MailboxReleaseCallback(base::SharedMemory* shared_memory, |
+ unsigned sync_point, bool lost_resource) { |
+ delete shared_memory; |
+} |
+ |
+} // namespace |
+ |
Window::Window(WindowDelegate* delegate) |
: type_(client::WINDOW_TYPE_UNKNOWN), |
owned_by_parent_(true), |
@@ -145,6 +154,9 @@ ui::Layer* Window::RecreateLayer() { |
return NULL; |
old_layer->set_delegate(NULL); |
+ float mailbox_scale_factor; |
+ cc::TextureMailbox old_mailbox = |
+ old_layer->GetTextureMailbox(&mailbox_scale_factor); |
scoped_refptr<ui::Texture> old_texture = old_layer->external_texture(); |
if (delegate_ && old_texture) |
old_layer->SetExternalTexture(delegate_->CopyTexture()); |
@@ -160,6 +172,27 @@ ui::Layer* Window::RecreateLayer() { |
// crbug.com/175211. |
if (delegate_ && old_texture) |
layer_->SetExternalTexture(old_texture); |
+ else if (old_mailbox.IsValid()) { |
piman
2013/06/05 00:30:55
nit: both sides of the else should have brackets i
slavi
2013/06/06 23:02:47
Done.
|
+ DCHECK(old_mailbox.IsSharedMemory()); |
+ |
+ const size_t size = old_mailbox.shared_memory_size_in_bytes(); |
+ scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory); |
+ new_buffer->CreateAndMapAnonymous(size); |
+ |
+ const base::SharedMemoryHandle old_handle = |
+ base::SharedMemory::DuplicateHandle(old_mailbox.handle()); |
+ base::SharedMemory old_buffer(old_handle, false); |
piman
2013/06/05 00:30:55
What if, instead of just the handle, we also passe
slavi
2013/06/06 23:02:47
Done.
|
+ old_buffer.Map(size); |
+ if (old_buffer.memory() && new_buffer->memory()) { |
+ memcpy(new_buffer->memory(), old_buffer.memory(), size); |
+ cc::TextureMailbox::ReleaseCallback callback = |
+ base::Bind(MailboxReleaseCallback, new_buffer.release()); |
piman
2013/06/05 00:30:55
nit: you can use Passed(new_buffer), and make Mail
slavi
2013/06/06 23:02:47
Done.
|
+ cc::TextureMailbox new_mailbox(new_buffer->handle(), |
+ old_mailbox.shared_memory_size(), |
+ callback); |
+ layer_->SetTextureMailbox(new_mailbox, mailbox_scale_factor); |
+ } |
+ } |
UpdateLayerName(name_); |
layer_->SetFillsBoundsOpaquely(!transparent_); |
@@ -313,10 +346,6 @@ void Window::SchedulePaintInRect(const gfx::Rect& rect) { |
} |
} |
-void Window::SetExternalTexture(ui::Texture* texture) { |
- layer_->SetExternalTexture(texture); |
-} |
- |
void Window::SetDefaultParentByRootWindow(RootWindow* root_window, |
const gfx::Rect& bounds_in_screen) { |
DCHECK(root_window); |