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

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

Issue 7572031: Always call the class methods to save/restore contexts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ensure saving before context access Created 9 years, 4 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 874f5dfe50ea314d52fbe391f4046f6a6fa95290..4832e64bc90f61d3f89e9e2e8cec9fdbd5be1eef 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_view.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_view.mm
@@ -251,8 +251,8 @@ const CGFloat kRapidCloseDist = 2.5;
- (void)drawRect:(NSRect)dirtyRect {
const CGFloat lineWidth = [self cr_lineWidth];
+ gfx::ScopedNSGraphicsContextSaveGState scopedGState;
NSGraphicsContext* context = [NSGraphicsContext currentContext];
- gfx::ScopedNSGraphicsContextSaveGState scopedGState(context);
ThemeService* themeProvider =
static_cast<ThemeService*>([[self window] themeProvider]);
@@ -288,7 +288,7 @@ const CGFloat kRapidCloseDist = 2.5;
[[[self window] backgroundColor] set];
[path fill];
- gfx::ScopedNSGraphicsContextSaveGState drawBackgroundState(context);
+ gfx::ScopedNSGraphicsContextSaveGState drawBackgroundState;
CGContextRef cgContext =
static_cast<CGContextRef>([context graphicsPort]);
Mark Mentovai 2011/08/04 23:20:17 This is probably fine because the port should have
Avi (use Gerrit) 2011/08/05 00:18:50 Done.
CGContextBeginTransparencyLayer(cgContext, 0);
@@ -299,55 +299,6 @@ const CGFloat kRapidCloseDist = 2.5;
}
}
- [context saveGraphicsState];
- [path addClip];
-
- // Use the same overlay for the selected state and for hover and alert glows;
- // for the selected state, it's fully opaque.
- CGFloat hoverAlpha = [self hoverAlpha];
- CGFloat alertAlpha = [self alertAlpha];
- if (selected || hoverAlpha > 0 || alertAlpha > 0) {
- // Draw the selected background / glow overlay.
- gfx::ScopedNSGraphicsContextSaveGState drawHoverState(context);
- CGContextRef cgContext = static_cast<CGContextRef>([context graphicsPort]);
- 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);
- }
- [path addClip];
- {
- gfx::ScopedNSGraphicsContextSaveGState drawBackgroundState(context);
- [super drawBackgroundWithOpaque:NO];
- }
-
- // Draw a mouse hover gradient for the default themes.
- if (!selected && hoverAlpha > 0) {
- if (themeProvider && !hasBackgroundImage) {
- scoped_nsobject<NSGradient> glow([NSGradient alloc]);
- [glow initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0
- alpha:1.0 * hoverAlpha]
- endingColor:[NSColor colorWithCalibratedWhite:1.0
- alpha:0.0]];
-
- NSPoint point = hoverPoint_;
- point.y = NSHeight(rect);
- [glow drawFromCenter:point
- radius:0.0
- toCenter:point
- radius:NSWidth(rect) / 3.0
- options:NSGradientDrawsBeforeStartingLocation];
-
- [glow drawInBezierPath:path relativeCenterPosition:hoverPoint_];
- }
- }
-
- CGContextEndTransparencyLayer(cgContext);
- }
-
BOOL active = [[self window] isKeyWindow] || [[self window] isMainWindow];
CGFloat borderAlpha = selected ? (active ? 0.3 : 0.2) : 0.2;
NSColor* borderColor = [NSColor colorWithDeviceWhite:0.0 alpha:borderAlpha];
@@ -356,35 +307,86 @@ const CGFloat kRapidCloseDist = 2.5;
ThemeService::COLOR_TOOLBAR_BEZEL :
ThemeService::COLOR_TOOLBAR, true) : nil;
- // Draw the top inner highlight within the tab if using the default theme.
- if (themeProvider && themeProvider->UsingDefaultTheme()) {
- NSAffineTransform* highlightTransform = [NSAffineTransform transform];
- [highlightTransform translateXBy:lineWidth yBy:-lineWidth];
- if (selected) {
- scoped_nsobject<NSBezierPath> highlightPath([path copy]);
- [highlightPath transformUsingAffineTransform:highlightTransform];
- [highlightColor setStroke];
- [highlightPath setLineWidth:lineWidth];
- [highlightPath stroke];
- highlightTransform = [NSAffineTransform transform];
- [highlightTransform translateXBy:-2 * lineWidth yBy:0.0];
- [highlightPath transformUsingAffineTransform:highlightTransform];
- [highlightPath stroke];
- } else {
- NSBezierPath* topHighlightPath =
- [self topHighlightBezierPathForRect:[self bounds]];
- [topHighlightPath transformUsingAffineTransform:highlightTransform];
- [highlightColor setStroke];
- [topHighlightPath setLineWidth:lineWidth];
- [topHighlightPath stroke];
+ {
+ gfx::ScopedNSGraphicsContextSaveGState contextSave;
Mark Mentovai 2011/08/04 23:20:17 I’m not going to do a line-by-line comparison here
+ [path addClip];
+
+ // Use the same overlay for the selected state and for hover and alert
+ // glows; for the selected state, it's fully opaque.
+ CGFloat hoverAlpha = [self hoverAlpha];
+ CGFloat alertAlpha = [self alertAlpha];
+ if (selected || hoverAlpha > 0 || alertAlpha > 0) {
+ // Draw the selected background / glow overlay.
+ gfx::ScopedNSGraphicsContextSaveGState drawHoverState;
+ CGContextRef cgContext =
+ static_cast<CGContextRef>([context graphicsPort]);
Mark Mentovai 2011/08/04 23:20:17 Ditto.
Avi (use Gerrit) 2011/08/05 00:18:50 Mr Paranoid!
+ 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);
+ }
+ [path addClip];
+ {
+ gfx::ScopedNSGraphicsContextSaveGState drawBackgroundState;
+ [super drawBackgroundWithOpaque:NO];
+ }
+
+ // Draw a mouse hover gradient for the default themes.
+ if (!selected && hoverAlpha > 0) {
+ if (themeProvider && !hasBackgroundImage) {
+ scoped_nsobject<NSGradient> glow([NSGradient alloc]);
+ [glow initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0
+ alpha:1.0 * hoverAlpha]
+ endingColor:[NSColor colorWithCalibratedWhite:1.0
+ alpha:0.0]];
+
+ NSPoint point = hoverPoint_;
+ point.y = NSHeight(rect);
+ [glow drawFromCenter:point
+ radius:0.0
+ toCenter:point
+ radius:NSWidth(rect) / 3.0
+ options:NSGradientDrawsBeforeStartingLocation];
+
+ [glow drawInBezierPath:path relativeCenterPosition:hoverPoint_];
+ }
+ }
+
+ CGContextEndTransparencyLayer(cgContext);
}
- }
- [context restoreGraphicsState];
+ // Draw the top inner highlight within the tab if using the default theme.
+ if (themeProvider && themeProvider->UsingDefaultTheme()) {
+ NSAffineTransform* highlightTransform = [NSAffineTransform transform];
+ [highlightTransform translateXBy:lineWidth yBy:-lineWidth];
+ if (selected) {
+ scoped_nsobject<NSBezierPath> highlightPath([path copy]);
+ [highlightPath transformUsingAffineTransform:highlightTransform];
+ [highlightColor setStroke];
+ [highlightPath setLineWidth:lineWidth];
+ [highlightPath stroke];
+ highlightTransform = [NSAffineTransform transform];
+ [highlightTransform translateXBy:-2 * lineWidth yBy:0.0];
+ [highlightPath transformUsingAffineTransform:highlightTransform];
+ [highlightPath stroke];
+ } else {
+ NSBezierPath* topHighlightPath =
+ [self topHighlightBezierPathForRect:[self bounds]];
+ [topHighlightPath transformUsingAffineTransform:highlightTransform];
+ [highlightColor setStroke];
+ [topHighlightPath setLineWidth:lineWidth];
+ [topHighlightPath stroke];
+ }
+ }
+ }
// Draw the top stroke.
{
- gfx::ScopedNSGraphicsContextSaveGState drawBorderState(context);
+ gfx::ScopedNSGraphicsContextSaveGState drawBorderState;
[borderColor set];
[path setLineWidth:lineWidth];
[path stroke];

Powered by Google App Engine
This is Rietveld 408576698