Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(806)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 297573003: Make delegated software renderer work on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix windows build Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 } 604 }
605 605
606 return true; 606 return true;
607 } 607 }
608 608
609 void RenderWidgetHostViewMac::EnsureSoftwareLayer() { 609 void RenderWidgetHostViewMac::EnsureSoftwareLayer() {
610 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); 610 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer");
611 if (software_layer_ || !use_core_animation_) 611 if (software_layer_ || !use_core_animation_)
612 return; 612 return;
613 613
614 software_layer_.reset([[SoftwareLayer alloc] 614 software_layer_.reset([[SoftwareLayer alloc] init]);
615 initWithRenderWidgetHostViewMac:this]);
616 DCHECK(software_layer_); 615 DCHECK(software_layer_);
617 616
618 // Disable the fade-in animation as the layer is added. 617 // Disable the fade-in animation as the layer is added.
619 ScopedCAActionDisabler disabler; 618 ScopedCAActionDisabler disabler;
620 [background_layer_ addSublayer:software_layer_]; 619 [background_layer_ addSublayer:software_layer_];
621 } 620 }
622 621
623 void RenderWidgetHostViewMac::DestroySoftwareLayer() { 622 void RenderWidgetHostViewMac::DestroySoftwareLayer() {
624 if (!software_layer_) 623 if (!software_layer_)
625 return; 624 return;
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 864
866 if (web_contents_switch_paint_time_.is_null()) 865 if (web_contents_switch_paint_time_.is_null())
867 web_contents_switch_paint_time_ = base::TimeTicks::Now(); 866 web_contents_switch_paint_time_ = base::TimeTicks::Now();
868 render_widget_host_->WasShown(); 867 render_widget_host_->WasShown();
869 software_frame_manager_->SetVisibility(true); 868 software_frame_manager_->SetVisibility(true);
870 if (delegated_frame_host_) 869 if (delegated_frame_host_)
871 delegated_frame_host_->WasShown(); 870 delegated_frame_host_->WasShown();
872 871
873 // Call setNeedsDisplay before pausing for new frames to come in -- if any 872 // Call setNeedsDisplay before pausing for new frames to come in -- if any
874 // do, and are drawn, then the needsDisplay bit will be cleared. 873 // do, and are drawn, then the needsDisplay bit will be cleared.
875 [software_layer_ setNeedsDisplay];
876 [compositing_iosurface_layer_ setNeedsDisplay]; 874 [compositing_iosurface_layer_ setNeedsDisplay];
877 PauseForPendingResizeOrRepaintsAndDraw(); 875 PauseForPendingResizeOrRepaintsAndDraw();
878 876
879 // We're messing with the window, so do this to ensure no flashes. 877 // We're messing with the window, so do this to ensure no flashes.
880 if (!use_core_animation_) 878 if (!use_core_animation_)
881 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; 879 [[cocoa_view_ window] disableScreenUpdatesUntilFlush];
882 } 880 }
883 881
884 void RenderWidgetHostViewMac::WasHidden() { 882 void RenderWidgetHostViewMac::WasHidden() {
885 if (render_widget_host_->is_hidden()) 883 if (render_widget_host_->is_hidden())
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 1565
1568 // Try to finish previous copy requests after draw to get better pipelining. 1566 // Try to finish previous copy requests after draw to get better pipelining.
1569 if (compositing_iosurface_) 1567 if (compositing_iosurface_)
1570 compositing_iosurface_->CheckIfAllCopiesAreFinished(false); 1568 compositing_iosurface_->CheckIfAllCopiesAreFinished(false);
1571 1569
1572 // The IOSurface's size may have changed, so re-layout the layers to take 1570 // The IOSurface's size may have changed, so re-layout the layers to take
1573 // this into account. This may force an immediate draw. 1571 // this into account. This may force an immediate draw.
1574 LayoutLayers(); 1572 LayoutLayers();
1575 } 1573 }
1576 1574
1575 void RenderWidgetHostViewMac::GotBrowserCompositorSoftwareFrame(
1576 cc::SoftwareFrameData* frame_data,
1577 float scale_factor,
1578 SkCanvas* canvas) {
1579 if (!frame_data || !canvas)
1580 return;
1581
1582 // Disable animating the contents change or the scale factor change.
1583 ScopedCAActionDisabler disabler;
1584 EnsureSoftwareLayer();
1585
1586 // Set the contents of the software CALayer to be a CGImage with the provided
1587 // pixel data.
1588 SkImageInfo info;
1589 size_t row_bytes;
1590 const void* pixels = canvas->peekPixels(&info, &row_bytes);
1591 base::ScopedCFTypeRef<CGDataProviderRef> data_provider(
1592 CGDataProviderCreateWithData(
1593 NULL, pixels, 4 * info.fWidth * info.fHeight, NULL));
piman 2014/05/20 07:04:17 Doesn't this assume that CoreAnimation won't look
ccameron 2014/05/20 19:15:50 The documentation is very unclear, but this does a
1594 base::ScopedCFTypeRef<CGImageRef> image(
1595 CGImageCreate(info.fWidth,
1596 info.fHeight,
1597 8,
1598 32,
1599 row_bytes,
1600 base::mac::GetSystemColorSpace(),
1601 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
1602 data_provider,
1603 NULL,
1604 false,
1605 kCGRenderingIntentDefault));
1606 [software_layer_ setContents:(id)image.get()];
1607
1608 // Set the contents scale of the software CALayer.
1609 if ([software_layer_ respondsToSelector:(@selector(contentsScale))] &&
1610 [software_layer_ respondsToSelector:(@selector(setContentsScale:))] &&
1611 [software_layer_ contentsScale] != scale_factor) {
1612 [software_layer_ setContentsScale:scale_factor];
1613 }
1614
1615 LayoutLayers();
1616 DestroyCompositedIOSurfaceAndLayer(kDestroyContext);
1617 }
1618
1577 void RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { 1619 void RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() {
1578 CHECK(!use_core_animation_); 1620 CHECK(!use_core_animation_);
1579 CHECK(compositing_iosurface_); 1621 CHECK(compositing_iosurface_);
1580 1622
1581 // If there is a pending frame, it should be acked by the end of this 1623 // If there is a pending frame, it should be acked by the end of this
1582 // function. Note that the ack should happen only after all drawing is 1624 // function. Note that the ack should happen only after all drawing is
1583 // complete, so that the ack happens after any blocking due to vsync. 1625 // complete, so that the ack happens after any blocking due to vsync.
1584 base::ScopedClosureRunner scoped_ack( 1626 base::ScopedClosureRunner scoped_ack(
1585 base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck, 1627 base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck,
1586 weak_factory_.GetWeakPtr())); 1628 weak_factory_.GetWeakPtr()));
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1890 return (software_frame_manager_->HasCurrentFrame() && 1932 return (software_frame_manager_->HasCurrentFrame() &&
1891 (desired_size.IsEmpty() || 1933 (desired_size.IsEmpty() ||
1892 software_frame_manager_->GetCurrentFrameSizeInDIP() == 1934 software_frame_manager_->GetCurrentFrameSizeInDIP() ==
1893 desired_size)); 1935 desired_size));
1894 } 1936 }
1895 return false; 1937 return false;
1896 } 1938 }
1897 1939
1898 void RenderWidgetHostViewMac::OnSwapCompositorFrame( 1940 void RenderWidgetHostViewMac::OnSwapCompositorFrame(
1899 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { 1941 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) {
1942 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame");
1943
1900 if (frame->delegated_frame_data) { 1944 if (frame->delegated_frame_data) {
1901 if (!compositor_) { 1945 if (!compositor_) {
1902 compositor_.reset(new ui::Compositor(cocoa_view_)); 1946 compositor_.reset(new ui::Compositor(cocoa_view_));
1903 root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED)); 1947 root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED));
1904 delegated_frame_host_.reset(new DelegatedFrameHost(this)); 1948 delegated_frame_host_.reset(new DelegatedFrameHost(this));
1905 } 1949 }
1906 1950
1907 // TODO(ccameron): Having the root layer set while swapping the frame will 1951 // TODO(ccameron): Having the root layer set while swapping the frame will
1908 // result in frames not appearing. Fix this. 1952 // result in frames not appearing. Fix this.
1909 compositor_->SetRootLayer(NULL); 1953 compositor_->SetRootLayer(NULL);
(...skipping 19 matching lines...) Expand all
1929 frame->metadata.device_scale_factor, 1973 frame->metadata.device_scale_factor,
1930 render_widget_host_->GetProcess()->GetHandle())) { 1974 render_widget_host_->GetProcess()->GetHandle())) {
1931 render_widget_host_->GetProcess()->ReceivedBadMessage(); 1975 render_widget_host_->GetProcess()->ReceivedBadMessage();
1932 return; 1976 return;
1933 } 1977 }
1934 1978
1935 // Add latency info to report when the frame finishes drawing. 1979 // Add latency info to report when the frame finishes drawing.
1936 AddPendingLatencyInfo(frame->metadata.latency_info); 1980 AddPendingLatencyInfo(frame->metadata.latency_info);
1937 GotSoftwareFrame(); 1981 GotSoftwareFrame();
1938 1982
1983 if (use_core_animation_) {
1984 // Disable animating the contents change or the scale factor change.
1985 ScopedCAActionDisabler disabler;
1986 EnsureSoftwareLayer();
1987
1988 // Set the contents of the software CALayer to be a CGImage with the
1989 // provided pixel data.
1990 gfx::Size size_in_pixels =
1991 software_frame_manager_->GetCurrentFrameSizeInPixels();
1992 base::ScopedCFTypeRef<CGDataProviderRef> data_provider(
1993 CGDataProviderCreateWithData(
1994 NULL,
1995 software_frame_manager_->GetCurrentFramePixels(),
1996 4 * size_in_pixels.width() * size_in_pixels.height(),
1997 NULL));
1998 base::ScopedCFTypeRef<CGImageRef> image(CGImageCreate(
1999 size_in_pixels.width(),
2000 size_in_pixels.height(),
2001 8,
2002 32,
2003 4 * size_in_pixels.width(),
2004 base::mac::GetSystemColorSpace(),
2005 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
2006 data_provider,
2007 NULL,
2008 false,
2009 kCGRenderingIntentDefault));
2010 [software_layer_ setContents:(id)image.get()];
2011
2012 // Set the contents scale of the software CALayer.
2013 if ([software_layer_ respondsToSelector:(@selector(contentsScale))] &&
2014 [software_layer_ respondsToSelector:(@selector(setContentsScale:))] &&
2015 [software_layer_ contentsScale] !=
2016 frame->metadata.device_scale_factor) {
2017 [software_layer_ setContentsScale:frame->metadata.device_scale_factor];
2018 }
2019
2020 // Send latency information to the host immediately, as there will be no
2021 // subsequent draw call in which to do so.
2022 SendPendingLatencyInfoToHost();
2023 }
2024
1939 cc::CompositorFrameAck ack; 2025 cc::CompositorFrameAck ack;
1940 RenderWidgetHostImpl::SendSwapCompositorFrameAck( 2026 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1941 render_widget_host_->GetRoutingID(), 2027 render_widget_host_->GetRoutingID(),
1942 software_frame_manager_->GetCurrentFrameOutputSurfaceId(), 2028 software_frame_manager_->GetCurrentFrameOutputSurfaceId(),
1943 render_widget_host_->GetProcess()->GetID(), 2029 render_widget_host_->GetProcess()->GetID(),
1944 ack); 2030 ack);
1945 software_frame_manager_->SwapToNewFrameComplete( 2031 software_frame_manager_->SwapToNewFrameComplete(
1946 !render_widget_host_->is_hidden()); 2032 !render_widget_host_->is_hidden());
1947 2033
1948 // Notify observers, tab capture observers in particular, that a new 2034 // Notify observers, tab capture observers in particular, that a new
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 [cocoa_view_ setNeedsDisplay:YES]; 2156 [cocoa_view_ setNeedsDisplay:YES];
2071 } 2157 }
2072 2158
2073 // Delete software backingstore and layer. 2159 // Delete software backingstore and layer.
2074 software_frame_manager_->DiscardCurrentFrame(); 2160 software_frame_manager_->DiscardCurrentFrame();
2075 DestroySoftwareLayer(); 2161 DestroySoftwareLayer();
2076 } 2162 }
2077 } 2163 }
2078 2164
2079 void RenderWidgetHostViewMac::GotSoftwareFrame() { 2165 void RenderWidgetHostViewMac::GotSoftwareFrame() {
2166 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::GotSoftwareFrame");
2167
2080 if (!render_widget_host_) 2168 if (!render_widget_host_)
2081 return; 2169 return;
2082 2170
2083 EnsureSoftwareLayer(); 2171 EnsureSoftwareLayer();
2084 LayoutLayers(); 2172 LayoutLayers();
2085 SendVSyncParametersToRenderer(); 2173 SendVSyncParametersToRenderer();
2086 2174
2087 // Draw the contents of the frame immediately. It is critical that this 2175 // Draw the contents of the frame immediately. It is critical that this
2088 // happen before the frame be acked, otherwise the new frame will likely be 2176 // happen before the frame be acked, otherwise the new frame will likely be
2089 // ready before the drawing is complete, thrashing the browser main thread. 2177 // ready before the drawing is complete, thrashing the browser main thread.
2090 if (use_core_animation_) { 2178 if (use_core_animation_) {
2091 [software_layer_ setNeedsDisplay];
2092 [software_layer_ displayIfNeeded]; 2179 [software_layer_ displayIfNeeded];
2093 } else { 2180 } else {
2094 [cocoa_view_ setNeedsDisplay:YES]; 2181 [cocoa_view_ setNeedsDisplay:YES];
2095 [cocoa_view_ displayIfNeeded]; 2182 [cocoa_view_ displayIfNeeded];
2096 } 2183 }
2097 2184
2098 if (last_frame_was_accelerated_) { 2185 if (last_frame_was_accelerated_) {
2099 last_frame_was_accelerated_ = false; 2186 last_frame_was_accelerated_ = false;
2100 2187
2101 // If overlapping views are allowed, then don't unbind the context 2188 // If overlapping views are allowed, then don't unbind the context
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 if (compositing_iosurface_layer_) { 2413 if (compositing_iosurface_layer_) {
2327 // Keep calling gotNewFrame in a loop until enough display calls come in. 2414 // Keep calling gotNewFrame in a loop until enough display calls come in.
2328 // Each call will be separated by about a vsync. 2415 // Each call will be separated by about a vsync.
2329 base::MessageLoop::current()->PostTask( 2416 base::MessageLoop::current()->PostTask(
2330 FROM_HERE, 2417 FROM_HERE,
2331 base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay, 2418 base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay,
2332 pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr())); 2419 pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()));
2333 [compositing_iosurface_layer_ gotNewFrame]; 2420 [compositing_iosurface_layer_ gotNewFrame];
2334 } 2421 }
2335 if (software_layer_) { 2422 if (software_layer_) {
2336 // In software mode, setNeedsDisplay will almost immediately result in the 2423 // In software mode there is not an explicit setNeedsDisplay/display loop,
2337 // layer's draw function being called, so manually insert a pretend-vsync 2424 // so just wait a pretend-vsync at 60 Hz.
2338 // at 60 Hz.
2339 base::MessageLoop::current()->PostDelayedTask( 2425 base::MessageLoop::current()->PostDelayedTask(
2340 FROM_HERE, 2426 FROM_HERE,
2341 base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay, 2427 base::Bind(&RenderWidgetHostViewMac::TickPendingLatencyInfoDelay,
2342 pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()), 2428 pending_latency_info_delay_weak_ptr_factory_.GetWeakPtr()),
2343 base::TimeDelta::FromMilliseconds(1000/60)); 2429 base::TimeDelta::FromMilliseconds(1000/60));
2344 [software_layer_ setNeedsDisplay]; 2430 SendPendingLatencyInfoToHost();
2345 } 2431 }
2346 } 2432 }
2347 2433
2348 void RenderWidgetHostViewMac::AddPendingSwapAck( 2434 void RenderWidgetHostViewMac::AddPendingSwapAck(
2349 int32 route_id, int gpu_host_id, int32 renderer_id) { 2435 int32 route_id, int gpu_host_id, int32 renderer_id) {
2350 // Note that multiple un-acked swaps can come in the event of a GPU process 2436 // Note that multiple un-acked swaps can come in the event of a GPU process
2351 // loss. Drop the old acks. 2437 // loss. Drop the old acks.
2352 pending_swap_ack_.reset(new PendingSwapAck( 2438 pending_swap_ack_.reset(new PendingSwapAck(
2353 route_id, gpu_host_id, renderer_id)); 2439 route_id, gpu_host_id, renderer_id));
2354 2440
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2440 // Also, sometimes, especially when infobars are being removed, the 2526 // Also, sometimes, especially when infobars are being removed, the
2441 // setNeedsDisplay calls are dropped on the floor, and stale content is 2527 // setNeedsDisplay calls are dropped on the floor, and stale content is
2442 // displayed. Calling displayIfNeeded will ensure that the right size 2528 // displayed. Calling displayIfNeeded will ensure that the right size
2443 // frame is drawn to the screen. 2529 // frame is drawn to the screen.
2444 // http://crbug.com/350817 2530 // http://crbug.com/350817
2445 [compositing_iosurface_layer_ setNeedsDisplay]; 2531 [compositing_iosurface_layer_ setNeedsDisplay];
2446 [compositing_iosurface_layer_ displayIfNeeded]; 2532 [compositing_iosurface_layer_ displayIfNeeded];
2447 } 2533 }
2448 } 2534 }
2449 2535
2450 // Dynamically update the software layer's contents scale to match the
2451 // software frame.
2452 if (software_frame_manager_->HasCurrentFrame() &&
2453 [software_layer_ respondsToSelector:(@selector(contentsScale))] &&
2454 [software_layer_ respondsToSelector:(@selector(setContentsScale:))]) {
2455 if (software_frame_manager_->GetCurrentFrameDeviceScaleFactor() !=
2456 [software_layer_ contentsScale]) {
2457 [software_layer_ setContentsScale:
2458 software_frame_manager_->GetCurrentFrameDeviceScaleFactor()];
2459 }
2460 }
2461 // Changing the software layer's bounds and position doesn't always result 2536 // Changing the software layer's bounds and position doesn't always result
2462 // in the layer being anchored to the top-left. Set the layer's frame 2537 // in the layer being anchored to the top-left. Set the layer's frame
2463 // explicitly, since this is more reliable in practice. 2538 // explicitly, since this is more reliable in practice.
2464 if (software_layer_) { 2539 if (software_layer_) {
2465 bool frame_changed = !CGRectEqualToRect( 2540 bool frame_changed = !CGRectEqualToRect(
2466 new_background_frame, [software_layer_ frame]); 2541 new_background_frame, [software_layer_ frame]);
2467 if (frame_changed) { 2542 if (frame_changed) {
2468 [software_layer_ setFrame:new_background_frame]; 2543 [software_layer_ setFrame:new_background_frame];
2469 [software_layer_ setNeedsDisplay];
2470 } 2544 }
2471 } 2545 }
2472 } 2546 }
2473 2547
2474 SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { 2548 SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() {
2475 return SkBitmap::kARGB_8888_Config; 2549 return SkBitmap::kARGB_8888_Config;
2476 } 2550 }
2477 2551
2478 } // namespace content 2552 } // namespace content
2479 2553
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
3312 - (void)onNativeSurfaceBuffersSwappedWithParams: 3386 - (void)onNativeSurfaceBuffersSwappedWithParams:
3313 (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params { 3387 (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params {
3314 3388
3315 renderWidgetHostView_->CompositorSwapBuffers( 3389 renderWidgetHostView_->CompositorSwapBuffers(
3316 params.surface_handle, 3390 params.surface_handle,
3317 params.size, 3391 params.size,
3318 params.scale_factor, 3392 params.scale_factor,
3319 params.latency_info); 3393 params.latency_info);
3320 } 3394 }
3321 3395
3396 - (void)gotSoftwareFrame:(cc::SoftwareFrameData*)frame_data
3397 withScaleFactor:(float)scale_factor
3398 withCanvas:(SkCanvas*)canvas {
3399 renderWidgetHostView_->GotBrowserCompositorSoftwareFrame(
3400 frame_data, scale_factor, canvas);
3401 }
3402
3322 - (void)drawRect:(NSRect)dirtyRect { 3403 - (void)drawRect:(NSRect)dirtyRect {
3323 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); 3404 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect");
3324 DCHECK(!renderWidgetHostView_->use_core_animation_); 3405 DCHECK(!renderWidgetHostView_->use_core_animation_);
3325 3406
3326 if (!renderWidgetHostView_->render_widget_host_) { 3407 if (!renderWidgetHostView_->render_widget_host_) {
3327 // When using CoreAnimation, this path is used to paint the contents area 3408 // When using CoreAnimation, this path is used to paint the contents area
3328 // white before any frames come in. When layers to draw frames exist, this 3409 // white before any frames come in. When layers to draw frames exist, this
3329 // is not hit. 3410 // is not hit.
3330 [[NSColor whiteColor] set]; 3411 [[NSColor whiteColor] set];
3331 NSRectFill(dirtyRect); 3412 NSRectFill(dirtyRect);
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after
4382 // native_app_window_cocoa.mm). This requires the render host view to be 4463 // native_app_window_cocoa.mm). This requires the render host view to be
4383 // draggable by default. 4464 // draggable by default.
4384 - (BOOL)mouseDownCanMoveWindow { 4465 - (BOOL)mouseDownCanMoveWindow {
4385 return YES; 4466 return YES;
4386 } 4467 }
4387 4468
4388 @end 4469 @end
4389 4470
4390 @implementation SoftwareLayer 4471 @implementation SoftwareLayer
4391 4472
4392 - (id)initWithRenderWidgetHostViewMac:(content::RenderWidgetHostViewMac*)r { 4473 - (id)init {
4393 if (self = [super init]) { 4474 if (self = [super init]) {
4394 renderWidgetHostView_ = r;
4395
4396 [self setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; 4475 [self setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)];
4397 [self setAnchorPoint:CGPointMake(0, 0)]; 4476 [self setAnchorPoint:CGPointMake(0, 0)];
4398 // Setting contents gravity is necessary to prevent the layer from being 4477 // Setting contents gravity is necessary to prevent the layer from being
4399 // scaled during dyanmic resizes (especially with devtools open). 4478 // scaled during dyanmic resizes (especially with devtools open).
4400 [self setContentsGravity:kCAGravityTopLeft]; 4479 [self setContentsGravity:kCAGravityTopLeft];
4401 if (renderWidgetHostView_->software_frame_manager_->HasCurrentFrame() &&
4402 [self respondsToSelector:(@selector(setContentsScale:))]) {
4403 [self setContentsScale:renderWidgetHostView_->software_frame_manager_->
4404 GetCurrentFrameDeviceScaleFactor()];
4405 }
4406
4407 // Ensure that the transition between frames not be animated.
4408 [self setActions:@{ @"contents" : [NSNull null] }];
4409 } 4480 }
4410 return self; 4481 return self;
4411 } 4482 }
4412 4483
4413 - (void)drawInContext:(CGContextRef)context {
4414 TRACE_EVENT0("browser", "SoftwareLayer::drawInContext");
4415
4416 CGRect clipRect = CGContextGetClipBoundingBox(context);
4417 if (renderWidgetHostView_) {
4418 [renderWidgetHostView_->cocoa_view() drawWithDirtyRect:clipRect
4419 inContext:context];
4420 } else {
4421 CGContextSetFillColorWithColor(context,
4422 CGColorGetConstantColor(kCGColorWhite));
4423 CGContextFillRect(context, clipRect);
4424 }
4425 }
4426
4427 - (void)disableRendering { 4484 - (void)disableRendering {
4428 // Disable the fade-out animation as the layer is removed. 4485 // Disable the fade-out animation as the layer is removed.
4429 ScopedCAActionDisabler disabler; 4486 ScopedCAActionDisabler disabler;
4430 [self removeFromSuperlayer]; 4487 [self removeFromSuperlayer];
4431 renderWidgetHostView_ = nil;
4432 } 4488 }
4433 4489
4434 @end // implementation SoftwareLayer 4490 @end // implementation SoftwareLayer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698