Index: chrome/browser/ui/cocoa/framed_browser_window.mm |
diff --git a/chrome/browser/ui/cocoa/framed_browser_window.mm b/chrome/browser/ui/cocoa/framed_browser_window.mm |
index acf4ca443a702ae0f2a2011ef5f9661bc7f8e2bd..6c143c507d7a275abefa907277272372f5b49ab6 100644 |
--- a/chrome/browser/ui/cocoa/framed_browser_window.mm |
+++ b/chrome/browser/ui/cocoa/framed_browser_window.mm |
@@ -8,6 +8,7 @@ |
#include "chrome/browser/global_keyboard_shortcuts_mac.h" |
#include "chrome/browser/profiles/profile_info_util.h" |
#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
+#import "chrome/browser/ui/cocoa/browser_window_utils.h" |
#import "chrome/browser/ui/cocoa/custom_frame_view.h" |
#import "chrome/browser/ui/cocoa/nsview_additions.h" |
#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
@@ -15,6 +16,7 @@ |
#include "chrome/browser/themes/theme_properties.h" |
#include "chrome/browser/themes/theme_service.h" |
#include "grit/theme_resources.h" |
+#include "ui/base/cocoa/nsgraphics_context_additions.h" |
// Replicate specific 10.7 SDK declarations for building with prior SDKs. |
#if !defined(MAC_OS_X_VERSION_10_7) || \ |
@@ -42,7 +44,6 @@ enum { |
namespace { |
const CGFloat kBrowserFrameViewPaintHeight = 60.0; |
-const NSPoint kBrowserFrameViewPatternPhaseOffset = { -5, 3 }; |
// Size of the gradient. Empirically determined so that the gradient looks |
// like what the heuristic does when there are just a few tabs. |
@@ -361,7 +362,6 @@ const CGFloat kWindowGradientHeight = 24.0; |
drawWindowThemeInDirtyRect:rect |
forView:view |
bounds:windowRect |
- offset:NSZeroPoint |
forceBlackBackground:NO]; |
// If the window needs a title and we painted over the title as drawn by the |
@@ -394,7 +394,6 @@ const CGFloat kWindowGradientHeight = 24.0; |
+ (BOOL)drawWindowThemeInDirtyRect:(NSRect)dirtyRect |
forView:(NSView*)view |
bounds:(NSRect)bounds |
- offset:(NSPoint)offset |
forceBlackBackground:(BOOL)forceBlackBackground { |
ui::ThemeProvider* themeProvider = [[view window] themeProvider]; |
if (!themeProvider) |
@@ -435,31 +434,6 @@ const CGFloat kWindowGradientHeight = 24.0; |
BOOL themed = NO; |
if (themeImageColor) { |
- // The titlebar/tabstrip header on the mac is slightly smaller than on |
- // Windows. To keep the window background lined up with the tab and toolbar |
- // patterns, we have to shift the pattern slightly, rather than simply |
- // drawing it from the top left corner. The offset below was empirically |
- // determined in order to line these patterns up. |
- // |
- // This will make the themes look slightly different than in Windows/Linux |
- // because of the differing heights between window top and tab top, but this |
- // has been approved by UI. |
- NSView* frameView = [[[view window] contentView] superview]; |
- NSPoint topLeft = NSMakePoint(NSMinX(bounds), NSMaxY(bounds)); |
- NSPoint topLeftInFrameCoordinates = |
- [view convertPoint:topLeft toView:frameView]; |
- |
- NSPoint phase = kBrowserFrameViewPatternPhaseOffset; |
- phase.x += (offset.x + topLeftInFrameCoordinates.x); |
- phase.y += (offset.y + topLeftInFrameCoordinates.y); |
- |
- // Align the phase to physical pixels so resizing the window under HiDPI |
- // doesn't cause wiggling of the theme. |
- phase = [frameView convertPointToBase:phase]; |
- phase.x = floor(phase.x); |
- phase.y = floor(phase.y); |
- phase = [frameView convertPointFromBase:phase]; |
- |
// Default to replacing any existing pixels with the theme image, but if |
// asked paint black first and blend the theme with black. |
NSCompositingOperation operation = NSCompositeCopy; |
@@ -469,7 +443,19 @@ const CGFloat kWindowGradientHeight = 24.0; |
operation = NSCompositeSourceOver; |
} |
- [[NSGraphicsContext currentContext] setPatternPhase:phase]; |
+ NSPoint position = [[view window] themeImagePositionForAlignment: |
+ THEME_IMAGE_ALIGN_WITH_FRAME]; |
+ |
+ // Align the phase to physical pixels so resizing the window under HiDPI |
+ // doesn't cause wiggling of the theme. |
+ NSView* frameView = [[[view window] contentView] superview]; |
+ position = [frameView convertPointToBase:position]; |
+ position.x = floor(position.x); |
+ position.y = floor(position.y); |
+ position = [frameView convertPointFromBase:position]; |
+ [[NSGraphicsContext currentContext] cr_setPatternPhase:position |
+ forView:view]; |
+ |
[themeImageColor set]; |
NSRectFillUsingOperation(dirtyRect, operation); |
themed = YES; |
@@ -492,11 +478,14 @@ const CGFloat kWindowGradientHeight = 24.0; |
if (overlayImage) { |
// Anchor to top-left and don't scale. |
+ NSView* frameView = [[[view window] contentView] superview]; |
+ NSPoint position = [[view window] themeImagePositionForAlignment: |
+ THEME_IMAGE_ALIGN_WITH_FRAME]; |
+ position = [view convertPoint:position fromView:frameView]; |
NSSize overlaySize = [overlayImage size]; |
NSRect imageFrame = NSMakeRect(0, 0, overlaySize.width, overlaySize.height); |
- [overlayImage drawAtPoint:NSMakePoint(offset.x, |
- NSHeight(bounds) + offset.y - |
- overlaySize.height) |
+ [overlayImage drawAtPoint:NSMakePoint(position.x, |
+ position.y - overlaySize.height) |
fromRect:imageFrame |
operation:NSCompositeSourceOver |
fraction:1.0]; |