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

Unified Diff: chrome/browser/ui/cocoa/tabs/tab_view.mm

Issue 18486007: Fix the misalignment on CrOS of the tab background images (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/tabs/tab_view.mm
diff --git a/chrome/browser/ui/cocoa/tabs/tab_view.mm b/chrome/browser/ui/cocoa/tabs/tab_view.mm
index d7ff32fa9907a8f365998a6a2631efbf8178bce0..24a0a399f530204df8fbb4df2f97840a73d80720 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_view.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_view.mm
@@ -301,6 +301,27 @@ const CGFloat kRapidCloseDist = 2.5;
bitmapResources[active][selected], true);
}
+// Draws the active tab background.
+- (void) drawFillForActiveTab:(NSRect)dirtyRect {
Nico 2013/07/17 18:03:04 no space after (void)
+ gfx::ScopedNSGraphicsContextSaveGState scopedGState;
+ NSGraphicsContext* context = [NSGraphicsContext currentContext];
+ NSPoint phase = [[self window]
+ themePatternPhaseForAlignment: THEME_PATTERN_ALIGN_WITH_TAB_STRIP];
+ [context cr_setPatternPhase:phase forView:self];
+
+ NSColor* backgroundImageColor = [self backgroundColorForSelected:YES];
+ [backgroundImageColor set];
+
+ // Themes can have partially transparent images. NSRectFill() is measurably
+ // faster though, so call it for the known-safe default theme.
+ ThemeService* themeProvider =
+ static_cast<ThemeService*>([[self window] themeProvider]);
+ if (themeProvider && themeProvider->UsingDefaultTheme())
+ NSRectFill(dirtyRect);
+ else
+ NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
+}
+
// Draws the tab background.
- (void)drawFill:(NSRect)dirtyRect {
gfx::ScopedNSGraphicsContextSaveGState scopedGState;
@@ -309,65 +330,64 @@ const CGFloat kRapidCloseDist = 2.5;
ThemeService* themeProvider =
static_cast<ThemeService*>([[self window] themeProvider]);
- [context cr_setPatternPhase:[[self window] themePatternPhase] forView:self];
-
+ bool usingDefaultTheme = themeProvider && themeProvider->UsingDefaultTheme();
CGImageRef mask([self tabClippingMask]);
CGRect maskBounds = CGRectMake(0, 0, maskCacheWidth_, kMaskHeight);
CGContextClipToMask(cgContext, maskBounds, mask);
- bool selected = [self state];
+ if ([self state]) {
+ [self drawFillForActiveTab:dirtyRect];
+ return;
+ }
// Background tabs should not paint over the tab strip separator, which is
// two pixels high in both lodpi and hidpi.
- if (!selected && dirtyRect.origin.y < 1)
+ if (dirtyRect.origin.y < 1)
dirtyRect.origin.y = 2 * [self cr_lineWidth];
- bool usingDefaultTheme = themeProvider && themeProvider->UsingDefaultTheme();
- NSColor* backgroundImageColor = [self backgroundColorForSelected:selected];
-
- // Don't draw the window/tab bar background when selected, since the tab
- // background overlay drawn over it (see below) will be fully opaque.
- if (!selected) {
- [backgroundImageColor set];
- // Themes can have partially transparent images. NSRectFill() is measurably
- // faster though, so call it for the known-safe default theme.
- if (usingDefaultTheme)
- NSRectFill(dirtyRect);
- else
- NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
+ // Draw the tinted frame image.
+ NSColor* backgroundImageColor = [self backgroundColorForSelected:NO];
+ NSPoint phase = [[self window]
+ themePatternPhaseForAlignment: THEME_PATTERN_ALIGN_WITH_FRAME];
+ [context cr_setPatternPhase:phase forView:self];
+ [backgroundImageColor set];
+ // Themes can have partially transparent images. NSRectFill() is measurably
+ // faster though, so call it for the known-safe default theme.
+ if (usingDefaultTheme)
+ NSRectFill(dirtyRect);
+ else
+ NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
+
+ // If the theme is not the default theme, it may provide a custom overlay
+ // image. The overlay image is aligned with the top of the tab.
+ NSColor* overlayImageColor = nil;
+ if (themeProvider) {
+ overlayImageColor = themeProvider->GetNSImageColorNamed(
+ IDR_THEME_TAB_BACKGROUND_OVERLAY, false);
+ }
+ if (overlayImageColor) {
+ NSPoint phase = [[self window]
+ themePatternPhaseForAlignment: THEME_PATTERN_ALIGN_WITH_TAB_STRIP];
+ [context cr_setPatternPhase:phase forView:self];
+ [overlayImageColor set];
+ NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
}
- // Use the same overlay for the selected state and for hover and alert
- // glows; for the selected state, it's fully opaque.
+ // Draw the glow for hover and the overlay for alerts.
CGFloat hoverAlpha = [self hoverAlpha];
CGFloat alertAlpha = [self alertAlpha];
- if (selected || hoverAlpha > 0 || alertAlpha > 0) {
+ if (hoverAlpha > 0 || alertAlpha > 0) {
gfx::ScopedNSGraphicsContextSaveGState contextSave;
-
- // Draw the selected background / glow overlay.
CGContextBeginTransparencyLayer(cgContext, 0);
- if (!selected) {
- // The alert glow overlay is like the selected state but at most at most
- // 80% opaque. The hover glow brings up the overlay's opacity at most
- // 50%.
- CGFloat backgroundAlpha = 0.8 * alertAlpha;
- backgroundAlpha += (1 - backgroundAlpha) * 0.5 * hoverAlpha;
- CGContextSetAlpha(cgContext, backgroundAlpha);
- }
- // For background tabs, this branch is taken to draw a highlight. The
- // highlight is drawn using the foreground tab bitmap.
- if (!selected && themeProvider)
- backgroundImageColor = [self backgroundColorForSelected:YES];
+ // The alert glow overlay is like the selected state but at most at most 80%
+ // opaque. The hover glow brings up the overlay's opacity at most 50%.
+ CGFloat backgroundAlpha = 0.8 * alertAlpha;
+ backgroundAlpha += (1 - backgroundAlpha) * 0.5 * hoverAlpha;
+ CGContextSetAlpha(cgContext, backgroundAlpha);
- [backgroundImageColor set];
- // Themes can have partially transparent images. NSRectFill() is measurably
- // faster though, so call it for the known-safe default theme.
- if (usingDefaultTheme)
- NSRectFill(dirtyRect);
Nico 2013/07/17 18:03:04 This was called for non-selected tabs with alpha >
- else
- NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
+ [self drawFillForActiveTab:dirtyRect];
// ui::ThemeProvider::HasCustomImage is true only if the theme provides the
// image. However, even if the theme doesn't provide a tab background, the
@@ -377,7 +397,7 @@ const CGFloat kRapidCloseDist = 2.5;
(themeProvider->HasCustomImage(IDR_THEME_TAB_BACKGROUND) ||
themeProvider->HasCustomImage(IDR_THEME_FRAME));
// Draw a mouse hover gradient for the default themes.
- if (!selected && hoverAlpha > 0) {
+ if (hoverAlpha > 0) {
if (themeProvider && !hasCustomTheme) {
base::scoped_nsobject<NSGradient> glow([NSGradient alloc]);
[glow initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0

Powered by Google App Engine
This is Rietveld 408576698