OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" |
6 | 6 |
7 #include "app/surface/transport_dib.h" | 7 #include "app/surface/transport_dib.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 return; | 573 return; |
574 | 574 |
575 // OK, save the pending update to a local since painting may cause more | 575 // OK, save the pending update to a local since painting may cause more |
576 // invalidation. Some WebCore rendering objects only layout when painted. | 576 // invalidation. Some WebCore rendering objects only layout when painted. |
577 PaintAggregator::PendingUpdate update; | 577 PaintAggregator::PendingUpdate update; |
578 paint_aggregator_.PopPendingUpdate(&update); | 578 paint_aggregator_.PopPendingUpdate(&update); |
579 | 579 |
580 gfx::Rect scroll_damage = update.GetScrollDamage(); | 580 gfx::Rect scroll_damage = update.GetScrollDamage(); |
581 gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage); | 581 gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage); |
582 | 582 |
| 583 // Compositing the page may disable accelerated compositing. |
| 584 bool accelerated_compositing_was_active = is_accelerated_compositing_active_; |
| 585 |
583 // A plugin may be able to do an optimized paint. First check this, in which | 586 // A plugin may be able to do an optimized paint. First check this, in which |
584 // case we can skip all of the bitmap generation and regular paint code. | 587 // case we can skip all of the bitmap generation and regular paint code. |
585 // This optimization allows PPAPI plugins that declare themselves on top of | 588 // This optimization allows PPAPI plugins that declare themselves on top of |
586 // the page (like a traditional windowed plugin) to be able to animate (think | 589 // the page (like a traditional windowed plugin) to be able to animate (think |
587 // movie playing) without repeatedly re-painting the page underneath, or | 590 // movie playing) without repeatedly re-painting the page underneath, or |
588 // copying the plugin backing store (since we can send the plugin's backing | 591 // copying the plugin backing store (since we can send the plugin's backing |
589 // store directly to the browser). | 592 // store directly to the browser). |
590 // | 593 // |
591 // This optimization only works when the entire invalid region is contained | 594 // This optimization only works when the entire invalid region is contained |
592 // within the plugin. There is a related optimization in PaintRect for the | 595 // within the plugin. There is a related optimization in PaintRect for the |
593 // case where there may be multiple invalid regions. | 596 // case where there may be multiple invalid regions. |
594 TransportDIB::Id dib_id = TransportDIB::Id(); | 597 TransportDIB::Id dib_id; |
595 TransportDIB* dib = NULL; | 598 TransportDIB* dib = NULL; |
596 std::vector<gfx::Rect> copy_rects; | 599 std::vector<gfx::Rect> copy_rects; |
597 gfx::Rect optimized_copy_rect, optimized_copy_location; | 600 gfx::Rect optimized_copy_rect, optimized_copy_location; |
598 if (update.scroll_rect.IsEmpty() && | 601 if (update.scroll_rect.IsEmpty() && |
599 !is_accelerated_compositing_active_ && | 602 !is_accelerated_compositing_active_ && |
600 GetBitmapForOptimizedPluginPaint(bounds, &dib, &optimized_copy_location, | 603 GetBitmapForOptimizedPluginPaint(bounds, &dib, &optimized_copy_location, |
601 &optimized_copy_rect)) { | 604 &optimized_copy_rect)) { |
602 // Only update the part of the plugin that actually changed. | 605 // Only update the part of the plugin that actually changed. |
603 optimized_copy_rect = optimized_copy_rect.Intersect(bounds); | 606 optimized_copy_rect = optimized_copy_rect.Intersect(bounds); |
604 bounds = optimized_copy_location; | 607 bounds = optimized_copy_location; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 // Begin painting. | 639 // Begin painting. |
637 webwidget_->composite(false); | 640 webwidget_->composite(false); |
638 } | 641 } |
639 | 642 |
640 // sending an ack to browser process that the paint is complete... | 643 // sending an ack to browser process that the paint is complete... |
641 ViewHostMsg_UpdateRect_Params params; | 644 ViewHostMsg_UpdateRect_Params params; |
642 params.bitmap = dib_id; | 645 params.bitmap = dib_id; |
643 params.bitmap_rect = bounds; | 646 params.bitmap_rect = bounds; |
644 params.dx = update.scroll_delta.x(); | 647 params.dx = update.scroll_delta.x(); |
645 params.dy = update.scroll_delta.y(); | 648 params.dy = update.scroll_delta.y(); |
646 if (is_accelerated_compositing_active_) { | 649 if (accelerated_compositing_was_active) { |
647 // If painting is done via the gpu process then we clear out all damage | 650 // If painting is done via the gpu process then we clear out all damage |
648 // rects to save the browser process from doing unecessary work. | 651 // rects to save the browser process from doing unecessary work. |
649 params.scroll_rect = gfx::Rect(); | 652 params.scroll_rect = gfx::Rect(); |
650 params.copy_rects.clear(); | 653 params.copy_rects.clear(); |
651 } else { | 654 } else { |
652 params.scroll_rect = update.scroll_rect; | 655 params.scroll_rect = update.scroll_rect; |
653 params.copy_rects.swap(copy_rects); // TODO(darin): clip to bounds? | 656 params.copy_rects.swap(copy_rects); // TODO(darin): clip to bounds? |
654 } | 657 } |
655 params.view_size = size_; | 658 params.view_size = size_; |
656 params.resizer_rect = resizer_rect_; | 659 params.resizer_rect = resizer_rect_; |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 if (webwidget_) | 897 if (webwidget_) |
895 webwidget_->confirmComposition(text); | 898 webwidget_->confirmComposition(text); |
896 } | 899 } |
897 | 900 |
898 // This message causes the renderer to render an image of the | 901 // This message causes the renderer to render an image of the |
899 // desired_size, regardless of whether the tab is hidden or not. | 902 // desired_size, regardless of whether the tab is hidden or not. |
900 void RenderWidget::OnMsgPaintAtSize(const TransportDIB::Handle& dib_handle, | 903 void RenderWidget::OnMsgPaintAtSize(const TransportDIB::Handle& dib_handle, |
901 int tag, | 904 int tag, |
902 const gfx::Size& page_size, | 905 const gfx::Size& page_size, |
903 const gfx::Size& desired_size) { | 906 const gfx::Size& desired_size) { |
904 if (!webwidget_ || !TransportDIB::is_valid(dib_handle)) { | 907 if (!webwidget_ || !TransportDIB::is_valid_handle(dib_handle)) { |
905 if (TransportDIB::is_valid(dib_handle)) { | 908 if (TransportDIB::is_valid_handle(dib_handle)) { |
906 // Close our unused handle. | 909 // Close our unused handle. |
907 #if defined(OS_WIN) | 910 #if defined(OS_WIN) |
908 ::CloseHandle(dib_handle); | 911 ::CloseHandle(dib_handle); |
909 #elif defined(OS_MACOSX) | 912 #elif defined(OS_MACOSX) |
910 base::SharedMemory::CloseHandle(dib_handle); | 913 base::SharedMemory::CloseHandle(dib_handle); |
911 #endif | 914 #endif |
912 } | 915 } |
913 return; | 916 return; |
914 } | 917 } |
915 | 918 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 | 1109 |
1107 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { | 1110 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { |
1108 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); | 1111 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); |
1109 i != plugin_window_moves_.end(); ++i) { | 1112 i != plugin_window_moves_.end(); ++i) { |
1110 if (i->window == window) { | 1113 if (i->window == window) { |
1111 plugin_window_moves_.erase(i); | 1114 plugin_window_moves_.erase(i); |
1112 break; | 1115 break; |
1113 } | 1116 } |
1114 } | 1117 } |
1115 } | 1118 } |
OLD | NEW |