William Bowling is sharing code with you
Bitbucket is a code hosting site. Unlimited public and private repositories. Free for small teams.
Don't show this again1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | /*
* Adium is the legal property of its developers, whose names are listed in the copyright file included
* with this source distribution.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU
* General Public License as published by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not,
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "AIMenuBarIcons.h"
#import <Adium/AIXtraInfo.h>
#import <AIUtilities/AIImageAdditions.h>
#import <QuartzCore/CoreImage.h>
#define KEY_ICONS_DICT @"Icons"
@interface AIMenuBarIcons ()
- (NSImage *)imageForKey:(NSString *)keyName;
- (BOOL)keyOfTypeExists:(NSString *)keyName;
@end
@implementation AIMenuBarIcons
- (id)initWithURL:(NSURL *)url
{
if ((self = [super initWithURL:url])) {
imageStates = [[NSMutableDictionary alloc] init];
alternateImageStates = [[NSMutableDictionary alloc] init];
iconInfo = [xtraBundle objectForInfoDictionaryKey:KEY_ICONS_DICT];
}
return self;
}
- (NSImage *)imageOfType:(NSString *)imageType alternate:(BOOL)alternate
{
NSImage *image;
// Default to Online if key not found.
if (![self keyOfTypeExists:imageType]) {
imageType = @"Online";
}
image = [(alternate ? alternateImageStates : imageStates) objectForKey:imageType];
if (!image) { // Image not already stored.
if (alternate) {
NSImage *normalImage = [self imageOfType:imageType alternate:NO];
image = [self alternateImageForImage:normalImage];
[alternateImageStates setObject:image forKey:imageType];
} else {
image = [self imageForKey:imageType];
if (image) { // Make sure the image exists.
[imageStates setObject:image forKey:imageType];
}
}
}
[image setFlipped:YES];
return image;
}
- (NSImage *)imageForKey:(NSString *)keyName
{
NSString *imagePath;
// This set doesn't contain an Icons dictionary entry. It's invalid.
if (!iconInfo) {
return nil;
}
imagePath = [xtraBundle pathForImageResource:[iconInfo objectForKey:keyName]];
return [[[NSImage alloc] initWithContentsOfFile:imagePath] autorelease];
}
- (BOOL)keyOfTypeExists:(NSString *)keyName
{
if (!iconInfo || ![iconInfo objectForKey:keyName]) {
return NO;
}
return YES;
}
- (void)dealloc
{
[imageStates release];
[alternateImageStates release];
[super dealloc];
}
#define PREVIEW_MENU_IMAGE_SIZE 18
#define PREVIEW_MENU_IMAGE_MARGIN 2
+ (NSImage *)previewMenuImageForIconPackAtPath:(NSString *)inPath
{
NSImage *image;
NSBundle *menuIconsBundle = [[[NSBundle alloc] initWithPath:inPath] autorelease];
NSDictionary *imageInfo;
if (!menuIconsBundle) {
return nil;
}
imageInfo = [menuIconsBundle objectForInfoDictionaryKey:KEY_ICONS_DICT];
if (!imageInfo) {
return nil;
}
image = [[[NSImage alloc] initWithSize:NSMakeSize((PREVIEW_MENU_IMAGE_SIZE + PREVIEW_MENU_IMAGE_MARGIN) * 2,
PREVIEW_MENU_IMAGE_SIZE)] autorelease];
if ([[menuIconsBundle objectForInfoDictionaryKey:@"XtraBundleVersion"] integerValue] == 1) {
NSInteger xOrigin = 0;
[image lockFocus];
for (NSString *iconID in [NSArray arrayWithObjects:@"Online",@"Offline",nil]) {
NSString *anIconPath = [menuIconsBundle pathForImageResource:[imageInfo objectForKey:iconID]];
NSImage *anIcon;
if ((anIcon = [[[NSImage alloc] initWithContentsOfFile:anIconPath] autorelease])) {
NSSize anIconSize = [anIcon size];
NSRect targetRect = NSMakeRect(xOrigin, 0, PREVIEW_MENU_IMAGE_SIZE, PREVIEW_MENU_IMAGE_SIZE);
if (anIconSize.width < targetRect.size.width) {
CGFloat difference = (targetRect.size.width - anIconSize.width)/2;
targetRect.size.width -= difference;
targetRect.origin.x += difference;
}
if (anIconSize.height < targetRect.size.height) {
CGFloat difference = (targetRect.size.height - anIconSize.height)/2;
targetRect.size.height -= difference;
targetRect.origin.y += difference;
}
[anIcon drawInRect:targetRect
fromRect:NSMakeRect(0,0,anIconSize.width,anIconSize.height)
operation:NSCompositeCopy
fraction:1.0];
//Shift right in preparation for next image
xOrigin += PREVIEW_MENU_IMAGE_SIZE + PREVIEW_MENU_IMAGE_MARGIN;
}
}
[image unlockFocus];
}
return image;
}
// Returns an inverted image.
- (NSImage *)alternateImageForImage:(NSImage *)inImage
{
NSImage *altImage = [[NSImage alloc] initWithSize:[inImage size]];
NSBitmapImageRep *srcImageRep = [inImage largestBitmapImageRep];
[altImage setFlipped:[inImage isFlipped]];
id monochromeFilter, invertFilter, alphaFilter;
monochromeFilter = [CIFilter filterWithName:@"CIColorMonochrome"];
[monochromeFilter setValue:[[[CIImage alloc] initWithBitmapImageRep:srcImageRep] autorelease]
forKey:@"inputImage"];
[monochromeFilter setValue:[NSNumber numberWithDouble:1.0]
forKey:@"inputIntensity"];
[monochromeFilter setValue:[[[CIColor alloc] initWithColor:[NSColor whiteColor]] autorelease]
forKey:@"inputColor"];
//Now invert our greyscale image
invertFilter = [CIFilter filterWithName:@"CIColorInvert"];
[invertFilter setValue:[monochromeFilter valueForKey:@"outputImage"]
forKey:@"inputImage"];
//And turn the parts that were previously white (are now black) into transparent
alphaFilter = [CIFilter filterWithName:@"CIMaskToAlpha"];
[alphaFilter setValue:[invertFilter valueForKey:@"outputImage"]
forKey:@"inputImage"];
[altImage addRepresentation:[NSCIImageRep imageRepWithCIImage:[alphaFilter valueForKey:@"outputImage"]]];
return [altImage autorelease];
}
@end
|