| Index: content/browser/renderer_host/compositing_iosurface_layer_mac.mm
 | 
| diff --git a/content/browser/renderer_host/compositing_iosurface_layer_mac.mm b/content/browser/renderer_host/compositing_iosurface_layer_mac.mm
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..46177ee6e0405ed64ef2c6b53721accfc6c162d0
 | 
| --- /dev/null
 | 
| +++ b/content/browser/renderer_host/compositing_iosurface_layer_mac.mm
 | 
| @@ -0,0 +1,123 @@
 | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "content/browser/renderer_host/compositing_iosurface_layer_mac.h"
 | 
| +
 | 
| +#include <CoreFoundation/CoreFoundation.h>
 | 
| +
 | 
| +#include "base/mac/sdk_forward_declarations.h"
 | 
| +#include "content/browser/renderer_host/render_widget_host_view_mac.h"
 | 
| +#include "content/browser/renderer_host/compositing_iosurface_context_mac.h"
 | 
| +#include "content/browser/renderer_host/compositing_iosurface_mac.h"
 | 
| +#include "ui/base/cocoa/animation_utils.h"
 | 
| +#include "ui/gfx/size_conversions.h"
 | 
| +
 | 
| +@implementation CompositingIOSurfaceLayer
 | 
| +
 | 
| +@synthesize context = context_;
 | 
| +
 | 
| +- (id)initWithRenderWidgetHostViewMac:(content::RenderWidgetHostViewMac*)r {
 | 
| +  if (self = [super init]) {
 | 
| +    renderWidgetHostView_ = r;
 | 
| +
 | 
| +    ScopedCAActionDisabler disabler;
 | 
| +    [self setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
 | 
| +    [self setContentsGravity:kCAGravityTopLeft];
 | 
| +    [self setFrame:NSRectToCGRect(
 | 
| +        [renderWidgetHostView_->cocoa_view() bounds])];
 | 
| +    [self setNeedsDisplay];
 | 
| +    [self updateScaleFactor];
 | 
| +    [[renderWidgetHostView_->cocoa_view() layer] addSublayer:self];
 | 
| +  }
 | 
| +  return self;
 | 
| +}
 | 
| +
 | 
| +- (BOOL)ensureContext {
 | 
| +  if (context_)
 | 
| +    return YES;
 | 
| +
 | 
| +  if (!renderWidgetHostView_)
 | 
| +    return NO;
 | 
| +
 | 
| +  if (renderWidgetHostView_->compositing_iosurface_)
 | 
| +    context_ = renderWidgetHostView_->compositing_iosurface_->context();
 | 
| +
 | 
| +  if (!context_) {
 | 
| +    context_ = content::CompositingIOSurfaceContext::Get(
 | 
| +        renderWidgetHostView_->window_number());
 | 
| +  }
 | 
| +
 | 
| +  return context_ ? YES : NO;
 | 
| +}
 | 
| +
 | 
| +- (void)updateScaleFactor {
 | 
| +  if (!renderWidgetHostView_ ||
 | 
| +      ![self respondsToSelector:(@selector(contentsScale))] ||
 | 
| +      ![self respondsToSelector:(@selector(setContentsScale:))])
 | 
| +    return;
 | 
| +
 | 
| +  float current_scale_factor = [self contentsScale];
 | 
| +  float new_scale_factor = current_scale_factor;
 | 
| +  if (renderWidgetHostView_->compositing_iosurface_) {
 | 
| +    new_scale_factor =
 | 
| +        renderWidgetHostView_->compositing_iosurface_->scale_factor();
 | 
| +  }
 | 
| +
 | 
| +  if (new_scale_factor == current_scale_factor)
 | 
| +    return;
 | 
| +
 | 
| +  ScopedCAActionDisabler disabler;
 | 
| +  [self setContentsScale:new_scale_factor];
 | 
| +}
 | 
| +
 | 
| +- (void)disableCompositing{
 | 
| +  ScopedCAActionDisabler disabler;
 | 
| +  [self removeFromSuperlayer];
 | 
| +  renderWidgetHostView_ = nil;
 | 
| +}
 | 
| +
 | 
| +// The remaining methods implement the CAOpenGLLayer interface.
 | 
| +
 | 
| +- (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat {
 | 
| +  if ([self ensureContext])
 | 
| +    return context_->cgl_context();
 | 
| +  return nil;
 | 
| +}
 | 
| +
 | 
| +- (void)releaseCGLContext:(CGLContextObj)glContext {
 | 
| +  if (!context_)
 | 
| +    return;
 | 
| +
 | 
| +  DCHECK(glContext == context_->cgl_context());
 | 
| +  context_ = nil;
 | 
| +}
 | 
| +
 | 
| +- (void)drawInCGLContext:(CGLContextObj)glContext
 | 
| +             pixelFormat:(CGLPixelFormatObj)pixelFormat
 | 
| +            forLayerTime:(CFTimeInterval)timeInterval
 | 
| +             displayTime:(const CVTimeStamp*)timeStamp {
 | 
| +  if (!context_ || !renderWidgetHostView_ ||
 | 
| +      !renderWidgetHostView_->compositing_iosurface_) {
 | 
| +    glClearColor(1, 1, 1, 1);
 | 
| +    glClear(GL_COLOR_BUFFER_BIT);
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  DCHECK(glContext == context_->cgl_context());
 | 
| +
 | 
| +  gfx::Size window_size([self frame].size);
 | 
| +  float window_scale_factor = 1.f;
 | 
| +  if ([self respondsToSelector:(@selector(contentsScale))])
 | 
| +    window_scale_factor = [self contentsScale];
 | 
| +
 | 
| +  renderWidgetHostView_->compositing_iosurface_->DrawIOSurface(
 | 
| +    window_size,
 | 
| +    window_scale_factor,
 | 
| +    renderWidgetHostView_->frame_subscriber(),
 | 
| +    true);
 | 
| +
 | 
| +  renderWidgetHostView_->AckPendingSwapBuffers();
 | 
| +}
 | 
| +
 | 
| +@end
 | 
| 
 |