Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/cocoa/throbber_view.h" | 5 #import "chrome/browser/cocoa/throbber_view.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 | 8 |
| 9 const float kAnimationIntervalSeconds = 0.03; // 30ms, same as windows | 9 const float kAnimationIntervalSeconds = 0.03; // 30ms, same as windows |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 32 | 32 |
| 33 - (void)animate:(NSTimer*)timer { | 33 - (void)animate:(NSTimer*)timer { |
| 34 [throbber_ animate]; | 34 [throbber_ animate]; |
| 35 } | 35 } |
| 36 @end | 36 @end |
| 37 | 37 |
| 38 @implementation ThrobberView | 38 @implementation ThrobberView |
| 39 | 39 |
| 40 - (id)initWithFrame:(NSRect)frame image:(NSImage*)image { | 40 - (id)initWithFrame:(NSRect)frame image:(NSImage*)image { |
| 41 if ((self = [super initWithFrame:frame])) { | 41 if ((self = [super initWithFrame:frame])) { |
| 42 // Ensure that the height divides evenly into the width. Cache the | 42 [self setImage:image]; |
| 43 // number of frames in the animation for later. | |
| 44 NSSize imageSize = [image size]; | |
| 45 DCHECK(imageSize.height && imageSize.width); | |
| 46 if (!imageSize.height) | |
| 47 return nil; | |
| 48 DCHECK((int)imageSize.width % (int)imageSize.height == 0); | |
| 49 numFrames_ = (int)imageSize.width / (int)imageSize.height; | |
| 50 DCHECK(numFrames_); | |
| 51 | |
| 52 // First check if we have a bitmap image rep and use it, otherwise fall | |
| 53 // back to creating one. | |
| 54 NSBitmapImageRep* rep = [[image representations] objectAtIndex:0]; | |
| 55 if (![rep isKindOfClass:[NSBitmapImageRep class]]) { | |
| 56 [image lockFocus]; | |
| 57 NSRect imageRect = NSMakeRect(0, 0, imageSize.width, imageSize.height); | |
| 58 rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect] | |
| 59 autorelease]; | |
| 60 [image unlockFocus]; | |
| 61 } | |
| 62 image_.reset([[CIImage alloc] initWithBitmapImageRep:rep]); | |
| 63 | 43 |
| 64 #if 0 | 44 #if 0 |
| 65 // TODO(pinkerton): The invalidation of the view to trigger re-draw causes | 45 // TODO(pinkerton): The invalidation of the view to trigger re-draw causes |
|
TVL
2009/05/29 13:05:19
this should also move into the setImage call with
pink (ping after 24hrs)
2009/05/29 13:19:11
Done.
| |
| 66 // the entire title-bar to redraw (you can see it with QuartzDebug). For some | 46 // the entire title-bar to redraw (you can see it with QuartzDebug). For some |
| 67 // reason, setting isOpaque on this view, or any of its parent views, doesn't | 47 // reason, setting isOpaque on this view, or any of its parent views, doesn't |
| 68 // help. As a result, enabling this timer causes new tab to take a very long | 48 // help. As a result, enabling this timer causes new tab to take a very long |
| 69 // time on a loaded machine, crushing our perf bot when it's under load. For | 49 // time on a loaded machine, crushing our perf bot when it's under load. For |
| 70 // now, I'm disabling the timer so we draw the first frame of the animation, | 50 // now, I'm disabling the timer so we draw the first frame of the animation, |
| 71 // but nothing more. There are a couple of ways we can fix this: | 51 // but nothing more. There are a couple of ways we can fix this: |
| 72 // 1) Try to figure out why the invalidate is invalidating the entire title bar | 52 // 1) Try to figure out why the invalidate is invalidating the entire title bar |
| 73 // 2) Find some way to draw only the pixels we want and nothing else, but I | 53 // 2) Find some way to draw only the pixels we want and nothing else, but I |
| 74 // don't know how we'd do that. | 54 // don't know how we'd do that. |
| 75 // Start a timer for the animation frames. | 55 // Start a timer for the animation frames. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 float imageDimension = [image_ extent].size.height; | 89 float imageDimension = [image_ extent].size.height; |
| 110 float xOffset = animationFrame_ * imageDimension; | 90 float xOffset = animationFrame_ * imageDimension; |
| 111 NSRect sourceImageRect = | 91 NSRect sourceImageRect = |
| 112 NSMakeRect(xOffset, 0, imageDimension, imageDimension); | 92 NSMakeRect(xOffset, 0, imageDimension, imageDimension); |
| 113 [image_ drawInRect:[self bounds] | 93 [image_ drawInRect:[self bounds] |
| 114 fromRect:sourceImageRect | 94 fromRect:sourceImageRect |
| 115 operation:NSCompositeSourceOver | 95 operation:NSCompositeSourceOver |
| 116 fraction:1.0]; | 96 fraction:1.0]; |
| 117 } | 97 } |
| 118 | 98 |
| 99 // Stores the internal representation of the image from |image|. We use | |
| 100 // CoreImage for speed (though this doesn't seem to help perf issues). We | |
| 101 // validate that the image is of the appropriate ratio. | |
| 102 - (void)setImage:(NSImage*)image { | |
| 103 // Reset the animation counter so there's no chance we are off the end. | |
| 104 animationFrame_ = 0; | |
| 105 | |
| 106 // Ensure that the height divides evenly into the width. Cache the | |
| 107 // number of frames in the animation for later. | |
| 108 NSSize imageSize = [image size]; | |
| 109 DCHECK(imageSize.height && imageSize.width); | |
| 110 if (!imageSize.height) | |
| 111 return; | |
| 112 DCHECK((int)imageSize.width % (int)imageSize.height == 0); | |
| 113 numFrames_ = (int)imageSize.width / (int)imageSize.height; | |
| 114 DCHECK(numFrames_); | |
| 115 | |
| 116 // First check if we have a bitmap image rep and use it, otherwise fall | |
| 117 // back to creating one. | |
| 118 NSBitmapImageRep* rep = [[image representations] objectAtIndex:0]; | |
| 119 if (![rep isKindOfClass:[NSBitmapImageRep class]]) { | |
| 120 [image lockFocus]; | |
| 121 NSRect imageRect = NSMakeRect(0, 0, imageSize.width, imageSize.height); | |
| 122 rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect] | |
| 123 autorelease]; | |
| 124 [image unlockFocus]; | |
| 125 } | |
| 126 image_.reset([[CIImage alloc] initWithBitmapImageRep:rep]); | |
| 127 } | |
| 128 | |
| 119 @end | 129 @end |
| OLD | NEW |