| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 #include <QuartzCore/QuartzCore.h> | 8 #include <QuartzCore/QuartzCore.h> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 #include "content/common/accessibility_messages.h" | 39 #include "content/common/accessibility_messages.h" |
| 40 #include "content/common/edit_command.h" | 40 #include "content/common/edit_command.h" |
| 41 #include "content/common/gpu/gpu_messages.h" | 41 #include "content/common/gpu/gpu_messages.h" |
| 42 #include "content/common/input_messages.h" | 42 #include "content/common/input_messages.h" |
| 43 #include "content/common/view_messages.h" | 43 #include "content/common/view_messages.h" |
| 44 #include "content/common/webplugin_geometry.h" | 44 #include "content/common/webplugin_geometry.h" |
| 45 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" | 45 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" |
| 46 #include "content/public/browser/browser_thread.h" | 46 #include "content/public/browser/browser_thread.h" |
| 47 #include "content/public/browser/native_web_keyboard_event.h" | 47 #include "content/public/browser/native_web_keyboard_event.h" |
| 48 #import "content/public/browser/render_widget_host_view_mac_delegate.h" | 48 #import "content/public/browser/render_widget_host_view_mac_delegate.h" |
| 49 #include "content/public/browser/user_metrics.h" |
| 49 #include "content/public/common/content_switches.h" | 50 #include "content/public/common/content_switches.h" |
| 50 #include "skia/ext/platform_canvas.h" | 51 #include "skia/ext/platform_canvas.h" |
| 51 #include "third_party/WebKit/public/web/WebInputEvent.h" | 52 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 52 #include "third_party/WebKit/public/web/WebScreenInfo.h" | 53 #include "third_party/WebKit/public/web/WebScreenInfo.h" |
| 53 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h" | 54 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h" |
| 54 #import "third_party/mozilla/ComplexTextInputPanel.h" | 55 #import "third_party/mozilla/ComplexTextInputPanel.h" |
| 55 #include "ui/base/cocoa/animation_utils.h" | 56 #include "ui/base/cocoa/animation_utils.h" |
| 56 #import "ui/base/cocoa/fullscreen_window_manager.h" | 57 #import "ui/base/cocoa/fullscreen_window_manager.h" |
| 57 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" | 58 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" |
| 58 #include "ui/events/keycodes/keyboard_codes.h" | 59 #include "ui/events/keycodes/keyboard_codes.h" |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 call_set_needs_display_in_rect_pending_(false), | 420 call_set_needs_display_in_rect_pending_(false), |
| 420 last_frame_was_accelerated_(false), | 421 last_frame_was_accelerated_(false), |
| 421 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 422 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 422 can_compose_inline_(true), | 423 can_compose_inline_(true), |
| 423 allow_overlapping_views_(false), | 424 allow_overlapping_views_(false), |
| 424 use_core_animation_(false), | 425 use_core_animation_(false), |
| 425 is_loading_(false), | 426 is_loading_(false), |
| 426 weak_factory_(this), | 427 weak_factory_(this), |
| 427 fullscreen_parent_host_view_(NULL), | 428 fullscreen_parent_host_view_(NULL), |
| 428 pending_swap_buffers_acks_weak_factory_(this), | 429 pending_swap_buffers_acks_weak_factory_(this), |
| 429 next_swap_ack_time_(base::Time::Now()) { | 430 next_swap_ack_time_(base::Time::Now()), |
| 431 software_frame_weak_ptr_factory_(this) { |
| 432 software_frame_manager_.reset(new SoftwareFrameManager( |
| 433 software_frame_weak_ptr_factory_.GetWeakPtr())); |
| 430 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 434 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
| 431 // goes away. Since we autorelease it, our caller must put | 435 // goes away. Since we autorelease it, our caller must put |
| 432 // |GetNativeView()| into the view hierarchy right after calling us. | 436 // |GetNativeView()| into the view hierarchy right after calling us. |
| 433 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] | 437 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
| 434 initWithRenderWidgetHostViewMac:this] autorelease]; | 438 initWithRenderWidgetHostViewMac:this] autorelease]; |
| 435 | 439 |
| 436 if (GetCoreAnimationStatus() == CORE_ANIMATION_ENABLED_ALWAYS) { | 440 if (GetCoreAnimationStatus() == CORE_ANIMATION_ENABLED_ALWAYS) { |
| 437 EnableCoreAnimation(); | 441 EnableCoreAnimation(); |
| 438 } | 442 } |
| 439 | 443 |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 return render_widget_host_; | 729 return render_widget_host_; |
| 726 } | 730 } |
| 727 | 731 |
| 728 void RenderWidgetHostViewMac::WasShown() { | 732 void RenderWidgetHostViewMac::WasShown() { |
| 729 if (!render_widget_host_->is_hidden()) | 733 if (!render_widget_host_->is_hidden()) |
| 730 return; | 734 return; |
| 731 | 735 |
| 732 if (web_contents_switch_paint_time_.is_null()) | 736 if (web_contents_switch_paint_time_.is_null()) |
| 733 web_contents_switch_paint_time_ = base::TimeTicks::Now(); | 737 web_contents_switch_paint_time_ = base::TimeTicks::Now(); |
| 734 render_widget_host_->WasShown(); | 738 render_widget_host_->WasShown(); |
| 739 software_frame_manager_->SetVisibility(true); |
| 735 | 740 |
| 736 // We're messing with the window, so do this to ensure no flashes. | 741 // We're messing with the window, so do this to ensure no flashes. |
| 737 if (!use_core_animation_) | 742 if (!use_core_animation_) |
| 738 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 743 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 739 | 744 |
| 740 [compositing_iosurface_layer_ setNeedsDisplay]; | 745 [compositing_iosurface_layer_ setNeedsDisplay]; |
| 741 } | 746 } |
| 742 | 747 |
| 743 void RenderWidgetHostViewMac::WasHidden() { | 748 void RenderWidgetHostViewMac::WasHidden() { |
| 744 if (render_widget_host_->is_hidden()) | 749 if (render_widget_host_->is_hidden()) |
| 745 return; | 750 return; |
| 746 | 751 |
| 747 // Send ACKs for any pending SwapBuffers (if any) since we won't be displaying | 752 // Send ACKs for any pending SwapBuffers (if any) since we won't be displaying |
| 748 // them and the GPU process is waiting. | 753 // them and the GPU process is waiting. |
| 749 AckPendingSwapBuffers(); | 754 AckPendingSwapBuffers(); |
| 750 | 755 |
| 751 // If we have a renderer, then inform it that we are being hidden so it can | 756 // If we have a renderer, then inform it that we are being hidden so it can |
| 752 // reduce its resource utilization. | 757 // reduce its resource utilization. |
| 753 render_widget_host_->WasHidden(); | 758 render_widget_host_->WasHidden(); |
| 759 software_frame_manager_->SetVisibility(false); |
| 754 | 760 |
| 755 // There can be a transparent flash as this view is removed and the next is | 761 // There can be a transparent flash as this view is removed and the next is |
| 756 // added, because of OSX windowing races between displaying the contents of | 762 // added, because of OSX windowing races between displaying the contents of |
| 757 // the NSView and its corresponding OpenGL context. | 763 // the NSView and its corresponding OpenGL context. |
| 758 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding | 764 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding |
| 759 // screen updates until the next tab draws. | 765 // screen updates until the next tab draws. |
| 760 if (!use_core_animation_) | 766 if (!use_core_animation_) |
| 761 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 767 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 762 | 768 |
| 763 web_contents_switch_paint_time_ = base::TimeTicks(); | 769 web_contents_switch_paint_time_ = base::TimeTicks(); |
| (...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 if (compositing_iosurface_) | 1649 if (compositing_iosurface_) |
| 1644 compositing_iosurface_->UnrefIOSurface(); | 1650 compositing_iosurface_->UnrefIOSurface(); |
| 1645 } | 1651 } |
| 1646 | 1652 |
| 1647 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { | 1653 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { |
| 1648 DestroyCompositedIOSurfaceAndLayer(kDestroyContext); | 1654 DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
| 1649 } | 1655 } |
| 1650 | 1656 |
| 1651 bool RenderWidgetHostViewMac::HasAcceleratedSurface( | 1657 bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
| 1652 const gfx::Size& desired_size) { | 1658 const gfx::Size& desired_size) { |
| 1653 return last_frame_was_accelerated_ && | 1659 if (last_frame_was_accelerated_) { |
| 1654 compositing_iosurface_ && | 1660 return compositing_iosurface_ && |
| 1655 compositing_iosurface_->HasIOSurface() && | 1661 compositing_iosurface_->HasIOSurface() && |
| 1656 (desired_size.IsEmpty() || | 1662 (desired_size.IsEmpty() || |
| 1657 compositing_iosurface_->dip_io_surface_size() == desired_size); | 1663 compositing_iosurface_->dip_io_surface_size() == desired_size); |
| 1664 } else { |
| 1665 return (software_frame_manager_->HasCurrentFrame() && |
| 1666 (desired_size.IsEmpty() || |
| 1667 software_frame_manager_->GetCurrentFrameSizeInDIP() == |
| 1668 desired_size)); |
| 1669 } |
| 1670 return false; |
| 1658 } | 1671 } |
| 1659 | 1672 |
| 1660 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() { | 1673 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() { |
| 1661 AckPendingSwapBuffers(); | 1674 AckPendingSwapBuffers(); |
| 1662 } | 1675 } |
| 1663 | 1676 |
| 1677 void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
| 1678 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { |
| 1679 // Only software compositor frames are accepted. |
| 1680 if (!frame->software_frame_data) { |
| 1681 DLOG(ERROR) << "Received unexpected frame type."; |
| 1682 RecordAction(UserMetricsAction( |
| 1683 "BadMessageTerminate_UnexpectedFrameType")); |
| 1684 render_widget_host_->GetProcess()->ReceivedBadMessage(); |
| 1685 return; |
| 1686 } |
| 1687 |
| 1688 GotSoftwareFrame(); |
| 1689 if (!software_frame_manager_->SwapToNewFrame( |
| 1690 output_surface_id, |
| 1691 frame->software_frame_data.get(), |
| 1692 frame->metadata.device_scale_factor, |
| 1693 render_widget_host_->GetProcess()->GetHandle())) { |
| 1694 render_widget_host_->GetProcess()->ReceivedBadMessage(); |
| 1695 return; |
| 1696 } |
| 1697 software_frame_manager_->SwapToNewFrameComplete( |
| 1698 !render_widget_host_->is_hidden()); |
| 1699 |
| 1700 [cocoa_view_ setNeedsDisplay:YES]; |
| 1701 } |
| 1702 |
| 1664 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { | 1703 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { |
| 1665 } | 1704 } |
| 1666 | 1705 |
| 1667 void RenderWidgetHostViewMac::GetScreenInfo(WebKit::WebScreenInfo* results) { | 1706 void RenderWidgetHostViewMac::GetScreenInfo(WebKit::WebScreenInfo* results) { |
| 1668 *results = GetWebScreenInfo(GetNativeView()); | 1707 *results = GetWebScreenInfo(GetNativeView()); |
| 1669 } | 1708 } |
| 1670 | 1709 |
| 1671 gfx::Rect RenderWidgetHostViewMac::GetBoundsInRootWindow() { | 1710 gfx::Rect RenderWidgetHostViewMac::GetBoundsInRootWindow() { |
| 1672 // TODO(shess): In case of !window, the view has been removed from | 1711 // TODO(shess): In case of !window, the view has been removed from |
| 1673 // the view hierarchy because the tab isn't main. Could retrieve | 1712 // the view hierarchy because the tab isn't main. Could retrieve |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1734 [cocoa_view_ gotUnhandledWheelEvent]; | 1773 [cocoa_view_ gotUnhandledWheelEvent]; |
| 1735 } | 1774 } |
| 1736 | 1775 |
| 1737 bool RenderWidgetHostViewMac::Send(IPC::Message* message) { | 1776 bool RenderWidgetHostViewMac::Send(IPC::Message* message) { |
| 1738 if (render_widget_host_) | 1777 if (render_widget_host_) |
| 1739 return render_widget_host_->Send(message); | 1778 return render_widget_host_->Send(message); |
| 1740 delete message; | 1779 delete message; |
| 1741 return false; | 1780 return false; |
| 1742 } | 1781 } |
| 1743 | 1782 |
| 1783 void RenderWidgetHostViewMac::SoftwareFrameWasFreed( |
| 1784 uint32 output_surface_id, unsigned frame_id) { |
| 1785 cc::CompositorFrameAck ack; |
| 1786 ack.last_software_frame_id = frame_id; |
| 1787 RenderWidgetHostImpl::SendReclaimCompositorResources( |
| 1788 render_widget_host_->GetRoutingID(), |
| 1789 output_surface_id, |
| 1790 render_widget_host_->GetProcess()->GetID(), |
| 1791 ack); |
| 1792 } |
| 1793 |
| 1794 void RenderWidgetHostViewMac::ReleaseReferencesToSoftwareFrame() { |
| 1795 } |
| 1744 | 1796 |
| 1745 void RenderWidgetHostViewMac::ShutdownHost() { | 1797 void RenderWidgetHostViewMac::ShutdownHost() { |
| 1746 weak_factory_.InvalidateWeakPtrs(); | 1798 weak_factory_.InvalidateWeakPtrs(); |
| 1747 render_widget_host_->Shutdown(); | 1799 render_widget_host_->Shutdown(); |
| 1748 // Do not touch any members at this point, |this| has been deleted. | 1800 // Do not touch any members at this point, |this| has been deleted. |
| 1749 } | 1801 } |
| 1750 | 1802 |
| 1751 void RenderWidgetHostViewMac::GotAcceleratedFrame() { | 1803 void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
| 1752 // Update the scale factor of the layer to match the scale factor of the | 1804 // Update the scale factor of the layer to match the scale factor of the |
| 1753 // IOSurface. | 1805 // IOSurface. |
| 1754 [compositing_iosurface_layer_ updateScaleFactor]; | 1806 [compositing_iosurface_layer_ updateScaleFactor]; |
| 1755 | 1807 |
| 1756 if (!last_frame_was_accelerated_) { | 1808 if (!last_frame_was_accelerated_) { |
| 1757 last_frame_was_accelerated_ = true; | 1809 last_frame_was_accelerated_ = true; |
| 1758 | 1810 |
| 1759 if (!use_core_animation_) { | 1811 if (!use_core_animation_) { |
| 1760 // Need to wipe the software view with transparency to expose the GL | 1812 // Need to wipe the software view with transparency to expose the GL |
| 1761 // underlay. Invalidate the whole window to do that. | 1813 // underlay. Invalidate the whole window to do that. |
| 1762 [cocoa_view_ setNeedsDisplay:YES]; | 1814 [cocoa_view_ setNeedsDisplay:YES]; |
| 1763 } | 1815 } |
| 1764 | 1816 |
| 1765 // Delete software backingstore. | 1817 // Delete software backingstore. |
| 1766 BackingStoreManager::RemoveBackingStore(render_widget_host_); | 1818 BackingStoreManager::RemoveBackingStore(render_widget_host_); |
| 1819 software_frame_manager_->DiscardCurrentFrame(); |
| 1767 } | 1820 } |
| 1768 } | 1821 } |
| 1769 | 1822 |
| 1770 void RenderWidgetHostViewMac::GotSoftwareFrame() { | 1823 void RenderWidgetHostViewMac::GotSoftwareFrame() { |
| 1771 if (last_frame_was_accelerated_) { | 1824 if (last_frame_was_accelerated_) { |
| 1772 last_frame_was_accelerated_ = false; | 1825 last_frame_was_accelerated_ = false; |
| 1773 | 1826 |
| 1774 AckPendingSwapBuffers(); | 1827 AckPendingSwapBuffers(); |
| 1775 | 1828 |
| 1776 // If overlapping views are allowed, then don't unbind the context | 1829 // If overlapping views are allowed, then don't unbind the context |
| (...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2711 CGContextRef context = static_cast<CGContextRef>( | 2764 CGContextRef context = static_cast<CGContextRef>( |
| 2712 [[NSGraphicsContext currentContext] graphicsPort]); | 2765 [[NSGraphicsContext currentContext] graphicsPort]); |
| 2713 [self drawBackingStore:backingStore | 2766 [self drawBackingStore:backingStore |
| 2714 dirtyRect:NSRectToCGRect(dirtyRect) | 2767 dirtyRect:NSRectToCGRect(dirtyRect) |
| 2715 inContext:context]; | 2768 inContext:context]; |
| 2716 } | 2769 } |
| 2717 | 2770 |
| 2718 - (void)drawBackingStore:(BackingStoreMac*)backingStore | 2771 - (void)drawBackingStore:(BackingStoreMac*)backingStore |
| 2719 dirtyRect:(CGRect)dirtyRect | 2772 dirtyRect:(CGRect)dirtyRect |
| 2720 inContext:(CGContextRef)context { | 2773 inContext:(CGContextRef)context { |
| 2721 if (backingStore) { | 2774 content::SoftwareFrameManager* software_frame_manager = |
| 2775 renderWidgetHostView_->software_frame_manager_.get(); |
| 2776 // There should never be both a legacy software and software composited |
| 2777 // frame. |
| 2778 DCHECK(!backingStore || !software_frame_manager->HasCurrentFrame()); |
| 2779 |
| 2780 if (backingStore || software_frame_manager->HasCurrentFrame()) { |
| 2722 // Note: All coordinates are in view units, not pixels. | 2781 // Note: All coordinates are in view units, not pixels. |
| 2723 gfx::Rect bitmapRect(0, 0, | 2782 gfx::Rect bitmapRect( |
| 2724 backingStore->size().width(), | 2783 software_frame_manager->HasCurrentFrame() ? |
| 2725 backingStore->size().height()); | 2784 software_frame_manager->GetCurrentFrameSizeInDIP() : |
| 2785 backingStore->size()); |
| 2726 | 2786 |
| 2727 // Specify the proper y offset to ensure that the view is rooted to the | 2787 // Specify the proper y offset to ensure that the view is rooted to the |
| 2728 // upper left corner. This can be negative, if the window was resized | 2788 // upper left corner. This can be negative, if the window was resized |
| 2729 // smaller and the renderer hasn't yet repainted. | 2789 // smaller and the renderer hasn't yet repainted. |
| 2730 int yOffset = NSHeight([self bounds]) - backingStore->size().height(); | 2790 int yOffset = NSHeight([self bounds]) - bitmapRect.height(); |
| 2731 | 2791 |
| 2732 NSRect nsDirtyRect = NSRectFromCGRect(dirtyRect); | 2792 NSRect nsDirtyRect = NSRectFromCGRect(dirtyRect); |
| 2733 const gfx::Rect damagedRect([self flipNSRectToRect:nsDirtyRect]); | 2793 const gfx::Rect damagedRect([self flipNSRectToRect:nsDirtyRect]); |
| 2734 | 2794 |
| 2735 gfx::Rect paintRect = gfx::IntersectRects(bitmapRect, damagedRect); | 2795 gfx::Rect paintRect = gfx::IntersectRects(bitmapRect, damagedRect); |
| 2736 if (!paintRect.IsEmpty()) { | 2796 if (!paintRect.IsEmpty()) { |
| 2737 // if we have a CGLayer, draw that into the window | 2797 if (software_frame_manager->HasCurrentFrame()) { |
| 2738 if (backingStore->cg_layer()) { | 2798 // If a software compositor framebuffer is present, draw using that. |
| 2799 gfx::Size sizeInPixels = |
| 2800 software_frame_manager->GetCurrentFrameSizeInPixels(); |
| 2801 base::ScopedCFTypeRef<CGDataProviderRef> dataProvider( |
| 2802 CGDataProviderCreateWithData( |
| 2803 NULL, |
| 2804 software_frame_manager->GetCurrentFramePixels(), |
| 2805 4 * sizeInPixels.width() * sizeInPixels.height(), |
| 2806 NULL)); |
| 2807 base::ScopedCFTypeRef<CGImageRef> image( |
| 2808 CGImageCreate( |
| 2809 sizeInPixels.width(), |
| 2810 sizeInPixels.height(), |
| 2811 8, |
| 2812 32, |
| 2813 4 * sizeInPixels.width(), |
| 2814 base::mac::GetSystemColorSpace(), |
| 2815 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, |
| 2816 dataProvider, |
| 2817 NULL, |
| 2818 false, |
| 2819 kCGRenderingIntentDefault)); |
| 2820 CGRect imageRect = bitmapRect.ToCGRect(); |
| 2821 imageRect.origin.y = yOffset; |
| 2822 CGContextDrawImage(context, imageRect, image); |
| 2823 } else if (backingStore->cg_layer()) { |
| 2824 // If we have a CGLayer, draw that into the window |
| 2739 // TODO: add clipping to dirtyRect if it improves drawing performance. | 2825 // TODO: add clipping to dirtyRect if it improves drawing performance. |
| 2740 CGContextDrawLayerAtPoint(context, CGPointMake(0.0, yOffset), | 2826 CGContextDrawLayerAtPoint(context, CGPointMake(0.0, yOffset), |
| 2741 backingStore->cg_layer()); | 2827 backingStore->cg_layer()); |
| 2742 } else { | 2828 } else { |
| 2743 // if we haven't created a layer yet, draw the cached bitmap into | 2829 // If we haven't created a layer yet, draw the cached bitmap into |
| 2744 // the window. The CGLayer will be created the next time the renderer | 2830 // the window. The CGLayer will be created the next time the renderer |
| 2745 // paints. | 2831 // paints. |
| 2746 base::ScopedCFTypeRef<CGImageRef> image( | 2832 base::ScopedCFTypeRef<CGImageRef> image( |
| 2747 CGBitmapContextCreateImage(backingStore->cg_bitmap())); | 2833 CGBitmapContextCreateImage(backingStore->cg_bitmap())); |
| 2748 CGRect imageRect = bitmapRect.ToCGRect(); | 2834 CGRect imageRect = bitmapRect.ToCGRect(); |
| 2749 imageRect.origin.y = yOffset; | 2835 imageRect.origin.y = yOffset; |
| 2750 CGContextDrawImage(context, imageRect, image); | 2836 CGContextDrawImage(context, imageRect, image); |
| 2751 } | 2837 } |
| 2752 } | 2838 } |
| 2753 | 2839 |
| (...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3843 return YES; | 3929 return YES; |
| 3844 } | 3930 } |
| 3845 | 3931 |
| 3846 - (BOOL)isOpaque { | 3932 - (BOOL)isOpaque { |
| 3847 if (renderWidgetHostView_->use_core_animation_) | 3933 if (renderWidgetHostView_->use_core_animation_) |
| 3848 return YES; | 3934 return YES; |
| 3849 return [super isOpaque]; | 3935 return [super isOpaque]; |
| 3850 } | 3936 } |
| 3851 | 3937 |
| 3852 @end | 3938 @end |
| OLD | NEW |