Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| index 17bb5972cf422f12a2c9bf30218c5dfed81f62af..ecde5f5aa48459a979637148f6969f81abdd6ca3 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -129,7 +129,7 @@ static BOOL SupportsBackingPropertiesChangedNotification() { |
| return methodDescription.name != NULL || methodDescription.types != NULL; |
| } |
| -static float ScaleFactor(NSView* view) { |
| +static float ScaleFactorForView(NSView* view) { |
| return ui::GetImageScale(ui::GetScaleFactorForNativeView(view)); |
| } |
| @@ -149,7 +149,6 @@ static float ScaleFactor(NSView* view) { |
| - (void)drawBackingStore:(BackingStoreMac*)backingStore |
| dirtyRect:(CGRect)dirtyRect |
| inContext:(CGContextRef)context; |
| -- (void)updateSoftwareLayerScaleFactor; |
| - (void)checkForPluginImeCancellation; |
| - (void)updateTabBackingStoreScaleFactor; |
| - (void)setResponderDelegate: |
| @@ -415,6 +414,7 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
| use_core_animation_(false), |
| pending_latency_info_delay_(0), |
| pending_latency_info_delay_weak_ptr_factory_(this), |
| + backing_store_scale_factor_(1), |
| is_loading_(false), |
| weak_factory_(this), |
| fullscreen_parent_host_view_(NULL), |
| @@ -491,19 +491,12 @@ void RenderWidgetHostViewMac::EnableCoreAnimation() { |
| [software_layer_ setDelegate:cocoa_view_]; |
| [software_layer_ setContentsGravity:kCAGravityTopLeft]; |
| [software_layer_ setFrame:NSRectToCGRect([cocoa_view_ bounds])]; |
| + if ([software_layer_ respondsToSelector:@selector(setContentsScale:)]) |
| + [software_layer_ setContentsScale:backing_store_scale_factor_]; |
| [software_layer_ setNeedsDisplay]; |
| - [cocoa_view_ updateSoftwareLayerScaleFactor]; |
| [cocoa_view_ setLayer:software_layer_]; |
| [cocoa_view_ setWantsLayer:YES]; |
| - |
| - if (compositing_iosurface_) { |
|
ccameron
2014/02/19 00:52:05
This block was a remnant from when dynamically ena
|
| - if (!CreateCompositedIOSurfaceLayer()) { |
| - LOG(ERROR) << "Failed to create CALayer for existing IOSurface"; |
| - GotAcceleratedCompositingError(); |
| - return; |
| - } |
| - } |
| } |
| bool RenderWidgetHostViewMac::CreateCompositedIOSurface() { |
| @@ -551,7 +544,6 @@ bool RenderWidgetHostViewMac::CreateCompositedIOSurface() { |
| } |
| bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() { |
| - CHECK(compositing_iosurface_context_ && compositing_iosurface_); |
| if (compositing_iosurface_layer_ || !use_core_animation_) |
| return true; |
| @@ -571,9 +563,7 @@ bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() { |
| // Creating the CompositingIOSurfaceLayer may attempt to draw in setLayer, |
| // which, if it fails, will promptly tear down everything that was just |
| // created. If that happened, return failure. |
| - return compositing_iosurface_context_ && |
| - compositing_iosurface_ && |
| - (compositing_iosurface_layer_ || !use_core_animation_); |
| + return compositing_iosurface_layer_; |
| } |
| void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( |
| @@ -727,8 +717,40 @@ int RenderWidgetHostViewMac::window_number() const { |
| return [window windowNumber]; |
| } |
| -float RenderWidgetHostViewMac::scale_factor() const { |
| - return ScaleFactor(cocoa_view_); |
| +float RenderWidgetHostViewMac::ViewScaleFactor() const { |
| + return ScaleFactorForView(cocoa_view_); |
| +} |
| + |
| +void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
| + if (!render_widget_host_) |
| + return; |
| + |
| + float new_scale_factor = ScaleFactorForView(cocoa_view_); |
| + if (new_scale_factor == backing_store_scale_factor_) |
| + return; |
| + backing_store_scale_factor_ = new_scale_factor; |
| + |
| + BackingStoreMac* backing_store = static_cast<BackingStoreMac*>( |
| + render_widget_host_->GetBackingStore(false)); |
| + if (backing_store) |
| + backing_store->ScaleFactorChanged(backing_store_scale_factor_); |
| + |
| + ScopedCAActionDisabler disabler; |
| + |
| + if ([software_layer_ respondsToSelector:@selector(setContentsScale:)]) |
| + [software_layer_ setContentsScale:backing_store_scale_factor_]; |
| + |
| + // Dynamically calling setContentsScale on a CAOpenGLLayer for which |
| + // setAsynchronous is dynamically toggled can result in flashes of corrupt |
| + // content. Work around this by replacing the entire layer when the scale |
| + // factor changes. |
| + if (compositing_iosurface_layer_) { |
| + [compositing_iosurface_layer_ disableCompositing]; |
| + compositing_iosurface_layer_.reset(); |
| + CreateCompositedIOSurfaceLayer(); |
| + } |
| + |
| + render_widget_host_->NotifyScreenInfoChanged(); |
| } |
| RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { |
| @@ -1145,7 +1167,7 @@ bool RenderWidgetHostViewMac::IsPopup() const { |
| BackingStore* RenderWidgetHostViewMac::AllocBackingStore( |
| const gfx::Size& size) { |
| - float scale = ScaleFactor(cocoa_view_); |
| + float scale = ScaleFactorForView(cocoa_view_); |
| return new BackingStoreMac(render_widget_host_, size, scale); |
| } |
| @@ -1160,7 +1182,7 @@ void RenderWidgetHostViewMac::CopyFromCompositingSurface( |
| } |
| base::ScopedClosureRunner scoped_callback_runner( |
| base::Bind(callback, false, SkBitmap())); |
| - float scale = ScaleFactor(cocoa_view_); |
| + float scale = ScaleFactorForView(cocoa_view_); |
| gfx::Size dst_pixel_size = gfx::ToFlooredSize( |
| gfx::ScaleSize(dst_size, scale)); |
| if (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()) { |
| @@ -1468,7 +1490,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
| gfx::Rect view_rect(NSRectToCGRect([cocoa_view_ frame])); |
| if (!compositing_iosurface_->DrawIOSurface( |
| compositing_iosurface_context_, view_rect, |
| - scale_factor(), !has_overlay)) { |
| + ViewScaleFactor(), !has_overlay)) { |
| return false; |
| } |
| @@ -1482,7 +1504,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
| overlay_view_offset_.y()); |
| if (!overlay_view_->compositing_iosurface_->DrawIOSurface( |
| compositing_iosurface_context_, overlay_view_rect, |
| - overlay_view_->scale_factor(), true)) { |
| + overlay_view_->ViewScaleFactor(), true)) { |
| return false; |
| } |
| } |
| @@ -1868,10 +1890,6 @@ void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
| render_widget_host_->UpdateVSyncParameters(timebase, interval); |
| } |
| - // Update the scale factor of the layer to match the scale factor of the |
| - // IOSurface. |
| - [compositing_iosurface_layer_ updateScaleFactor]; |
| - |
| if (!last_frame_was_accelerated_) { |
| last_frame_was_accelerated_ = true; |
| @@ -2002,7 +2020,7 @@ gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( |
| src_gl_subrect.set_y(GetViewBounds().height() - rect.bottom()); |
| return gfx::ToEnclosingRect(gfx::ScaleRect(src_gl_subrect, |
| - scale_factor())); |
| + ViewScaleFactor())); |
| } |
| void RenderWidgetHostViewMac::AddPendingLatencyInfo( |
| @@ -2109,7 +2127,8 @@ void RenderWidgetHostViewMac::SendPendingSwapAck() { |
| renderWidgetHostView_.reset(r); |
| canBeKeyView_ = YES; |
| focusedPluginIdentifier_ = -1; |
| - deviceScaleFactor_ = ScaleFactor(self); |
| + renderWidgetHostView_->backing_store_scale_factor_ = |
| + ScaleFactorForView(self); |
| // OpenGL support: |
| if ([self respondsToSelector: |
| @@ -2771,21 +2790,7 @@ void RenderWidgetHostViewMac::SendPendingSwapAck() { |
| } |
| - (void)updateTabBackingStoreScaleFactor { |
| - if (!renderWidgetHostView_->render_widget_host_) |
| - return; |
| - |
| - float scaleFactor = ScaleFactor(self); |
| - if (scaleFactor == deviceScaleFactor_) |
| - return; |
| - deviceScaleFactor_ = scaleFactor; |
| - |
| - BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( |
| - renderWidgetHostView_->render_widget_host_->GetBackingStore(false)); |
| - if (backingStore) // NULL in hardware path. |
| - backingStore->ScaleFactorChanged(scaleFactor); |
| - |
| - [self updateSoftwareLayerScaleFactor]; |
| - renderWidgetHostView_->render_widget_host_->NotifyScreenInfoChanged(); |
| + renderWidgetHostView_->UpdateBackingStoreScaleFactor(); |
| } |
| // http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//apple_ref/doc/uid/TP40012302-CH10-SW4 |
| @@ -4053,15 +4058,6 @@ extern NSString *NSTextInputReplacementRangeAttributeName; |
| renderWidgetHostView_->KillSelf(); |
| } |
| -- (void)updateSoftwareLayerScaleFactor { |
| - if (![renderWidgetHostView_->software_layer_ |
| - respondsToSelector:@selector(setContentsScale:)]) |
| - return; |
| - |
| - ScopedCAActionDisabler disabler; |
| - [renderWidgetHostView_->software_layer_ setContentsScale:deviceScaleFactor_]; |
| -} |
| - |
| // Delegate methods for the software CALayer |
| - (void)drawLayer:(CALayer*)layer |
| inContext:(CGContextRef)context { |