blob: c29a76227ee44c172654af2f625b5a9261a294b3 [file] [log] [blame]
// 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.
#import "ui/base/cocoa/nsgraphics_context_additions.h"
#include "base/logging.h"
@implementation NSGraphicsContext (CrAdditions)
- (void)cr_setPatternPhase:(NSPoint)phase
forView:(NSView*)view {
// TODO(sdy): Remove once we no longer add the tab background view to
// [[window contentView] superview] *or* no longer make the content view
// smaller than the window while exiting fullscreen. These two things
// together can result in the tab background view being drawn while it's
// outside of contentView, with a pattern phase that assumes it's inside.
NSView* contentView = [[view window] contentView];
if (![view isDescendantOf:contentView]) {
NSView* frameView = [contentView superview];
DCHECK([view isDescendantOf:frameView]);
// Convert phase into an offset from the top left corner of contentView so
// that it will be aligned correctly at the end of the transition.
phase.x += NSMinX([frameView frame]) - NSMinX([contentView frame]);
phase.y += NSMaxY([frameView frame]) - NSMaxY([contentView frame]);
}
NSView* ancestorWithLayer = view;
while (ancestorWithLayer && ![ancestorWithLayer layer])
ancestorWithLayer = [ancestorWithLayer superview];
if (ancestorWithLayer) {
NSPoint bottomLeft = NSZeroPoint;
if ([ancestorWithLayer isFlipped])
bottomLeft.y = NSMaxY([ancestorWithLayer bounds]);
NSPoint offset = [ancestorWithLayer convertPoint:bottomLeft toView:nil];
phase.x -= offset.x;
phase.y -= offset.y;
}
[self setPatternPhase:phase];
}
@end