| OLD | NEW |
| 1 // IconFamily.m | 1 // IconFamily.m |
| 2 // IconFamily class implementation | 2 // IconFamily class implementation |
| 3 // by Troy Stephens, Thomas Schnitzer, David Remahl, Nathan Day, Ben Haller, Sve
n Janssen, Peter Hosey, Conor Dearden, Elliot Glaysher, and Dave MacLachlan | 3 // by Troy Stephens, Thomas Schnitzer, David Remahl, Nathan Day, Ben Haller, Sve
n Janssen, Peter Hosey, Conor Dearden, Elliot Glaysher, and Dave MacLachlan |
| 4 // version 0.9.4 | 4 // version 0.9.4 |
| 5 // | 5 // |
| 6 // Project Home Page: | 6 // Project Home Page: |
| 7 // http://iconfamily.sourceforge.net/ | 7 // http://iconfamily.sourceforge.net/ |
| 8 // | 8 // |
| 9 // Problems, shortcomings, and uncertainties that I'm aware of are flagged with
"NOTE:". Please address bug reports, bug fixes, suggestions, etc. to the projec
t Forums and bug tracker at https://sourceforge.net/projects/iconfamily/ | 9 // Problems, shortcomings, and uncertainties that I'm aware of are flagged with
"NOTE:". Please address bug reports, bug fixes, suggestions, etc. to the projec
t Forums and bug tracker at https://sourceforge.net/projects/iconfamily/ |
| 10 | 10 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 + (NSImage*) resampleImage:(NSImage*)image toIconWidth:(int)width usingImageInte
rpolation:(NSImageInterpolation)imageInterpolation; | 84 + (NSImage*) resampleImage:(NSImage*)image toIconWidth:(int)width usingImageInte
rpolation:(NSImageInterpolation)imageInterpolation; |
| 85 | 85 |
| 86 + (Handle) get32BitDataFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requ
iredPixelSize:(int)requiredPixelSize; | 86 + (Handle) get32BitDataFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requ
iredPixelSize:(int)requiredPixelSize; |
| 87 | 87 |
| 88 + (Handle) get8BitDataFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; | 88 + (Handle) get8BitDataFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; |
| 89 | 89 |
| 90 + (Handle) get8BitMaskFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; | 90 + (Handle) get8BitMaskFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; |
| 91 | 91 |
| 92 + (Handle) get1BitMaskFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; | 92 + (Handle) get1BitMaskFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requi
redPixelSize:(int)requiredPixelSize; |
| 93 | 93 |
| 94 #if !defined(DISABLE_CUSTOM_ICON) |
| 94 - (BOOL) addResourceType:(OSType)type asResID:(int)resID; | 95 - (BOOL) addResourceType:(OSType)type asResID:(int)resID; |
| 96 #endif |
| 95 | 97 |
| 96 @end | 98 @end |
| 97 | 99 |
| 98 @implementation IconFamily | 100 @implementation IconFamily |
| 99 | 101 |
| 100 + (IconFamily*) iconFamily | 102 + (IconFamily*) iconFamily |
| 101 { | 103 { |
| 102 return [[[IconFamily alloc] init] autorelease]; | 104 return [[[IconFamily alloc] init] autorelease]; |
| 103 } | 105 } |
| 104 | 106 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 128 } | 130 } |
| 129 | 131 |
| 130 + (IconFamily*) iconFamilyWithThumbnailsOfImage:(NSImage*)image usingImageInterp
olation:(NSImageInterpolation)imageInterpolation | 132 + (IconFamily*) iconFamilyWithThumbnailsOfImage:(NSImage*)image usingImageInterp
olation:(NSImageInterpolation)imageInterpolation |
| 131 { | 133 { |
| 132 return [[[IconFamily alloc] initWithThumbnailsOfImage:image usingImageInterp
olation:imageInterpolation] autorelease]; | 134 return [[[IconFamily alloc] initWithThumbnailsOfImage:image usingImageInterp
olation:imageInterpolation] autorelease]; |
| 133 } | 135 } |
| 134 | 136 |
| 135 // This is IconFamily's designated initializer. It creates a new IconFamily tha
t initially has no elements. | 137 // This is IconFamily's designated initializer. It creates a new IconFamily tha
t initially has no elements. |
| 136 // | 138 // |
| 137 // The proper way to do this is to simply allocate a zero-sized handle (not to b
e confused with an empty handle) and assign it to hIconFamily. This technique w
orks on Mac OS X 10.2 as well as on 10.0.x and 10.1.x. Our previous technique o
f allocating an IconFamily struct with a resourceSize of 0 no longer works as of
Mac OS X 10.2. | 139 // The proper way to do this is to simply allocate a zero-sized handle (not to b
e confused with an empty handle) and assign it to hIconFamily. This technique w
orks on Mac OS X 10.2 as well as on 10.0.x and 10.1.x. Our previous technique o
f allocating an IconFamily struct with a resourceSize of 0 no longer works as of
Mac OS X 10.2. |
| 138 - init | 140 - (id) init |
| 139 { | 141 { |
| 140 self = [super init]; | 142 self = [super init]; |
| 141 if (self) { | 143 if (self) { |
| 142 hIconFamily = (IconFamilyHandle) NewHandle( 0 ); | 144 hIconFamily = (IconFamilyHandle) NewHandle( 0 ); |
| 143 if (hIconFamily == NULL) { | 145 if (hIconFamily == NULL) { |
| 144 [self autorelease]; | 146 [self autorelease]; |
| 145 return nil; | 147 return nil; |
| 146 } | 148 } |
| 147 } | 149 } |
| 148 return self; | 150 return self; |
| 149 } | 151 } |
| 150 | 152 |
| 151 - initWithData:(NSData *)data | 153 - (id) initWithData:(NSData *)data |
| 152 { | 154 { |
| 153 self = [self init]; | 155 self = [self init]; |
| 154 if (self) { | 156 if (self) { |
| 155 Handle storageMem = NULL; | 157 Handle storageMem = NULL; |
| 156 | 158 |
| 157 OSStatus err = PtrToHand([data bytes], &storageMem, (long)[data length])
; | 159 OSStatus err = PtrToHand([data bytes], &storageMem, (long)[data length])
; |
| 158 if( err != noErr ) | 160 if( err != noErr ) |
| 159 { | 161 { |
| 160 [self release]; | 162 [self release]; |
| 161 return nil; | 163 return nil; |
| 162 } | 164 } |
| 163 | 165 |
| 164 hIconFamily = (IconFamilyHandle)storageMem; | 166 hIconFamily = (IconFamilyHandle)storageMem; |
| 165 } | 167 } |
| 166 return self; | 168 return self; |
| 167 } | 169 } |
| 168 | 170 |
| 169 - initWithContentsOfFile:(NSString*)path | 171 - (id) initWithContentsOfFile:(NSString*)path |
| 170 { | 172 { |
| 171 FSRef ref; | 173 FSRef ref; |
| 172 OSStatus result; | 174 OSStatus result; |
| 173 | 175 |
| 174 self = [self init]; | 176 self = [self init]; |
| 175 if (self) { | 177 if (self) { |
| 176 if (hIconFamily) { | 178 if (hIconFamily) { |
| 177 DisposeHandle( (Handle)hIconFamily ); | 179 DisposeHandle( (Handle)hIconFamily ); |
| 178 hIconFamily = NULL; | 180 hIconFamily = NULL; |
| 179 } | 181 } |
| 180 if (![path getFSRef:&ref createFileIfNecessary:NO]) { | 182 if (![path getFSRef:&ref createFileIfNecessary:NO]) { |
| 181 [self autorelease]; | 183 [self autorelease]; |
| 182 return nil; | 184 return nil; |
| 183 } | 185 } |
| 184 result = ReadIconFromFSRef( &ref, &hIconFamily ); | 186 result = ReadIconFromFSRef( &ref, &hIconFamily ); |
| 185 if (result != noErr) { | 187 if (result != noErr) { |
| 186 [self autorelease]; | 188 [self autorelease]; |
| 187 return nil; | 189 return nil; |
| 188 } | 190 } |
| 189 } | 191 } |
| 190 return self; | 192 return self; |
| 191 } | 193 } |
| 192 | 194 |
| 193 - initWithIconFamilyHandle:(IconFamilyHandle)hNewIconFamily | 195 - (id) initWithIconFamilyHandle:(IconFamilyHandle)hNewIconFamily |
| 194 { | 196 { |
| 195 self = [self init]; | 197 self = [self init]; |
| 196 if (self) { | 198 if (self) { |
| 197 if (hIconFamily) { | 199 if (hIconFamily) { |
| 198 DisposeHandle( (Handle)hIconFamily ); | 200 DisposeHandle( (Handle)hIconFamily ); |
| 199 hIconFamily = NULL; | 201 hIconFamily = NULL; |
| 200 } | 202 } |
| 201 hIconFamily = hNewIconFamily; | 203 hIconFamily = hNewIconFamily; |
| 202 } | 204 } |
| 203 return self; | 205 return self; |
| 204 } | 206 } |
| 205 | 207 |
| 206 - initWithIconOfFile:(NSString*)path | 208 - (id) initWithIconOfFile:(NSString*)path |
| 207 { | 209 { |
| 208 IconRef iconRef; | 210 IconRef iconRef; |
| 209 OSStatus result; | 211 OSStatus result; |
| 210 SInt16 label; | 212 SInt16 label; |
| 211 FSRef ref; | 213 FSRef ref; |
| 212 | 214 |
| 213 self = [self init]; | 215 self = [self init]; |
| 214 if (self) | 216 if (self) |
| 215 { | 217 { |
| 216 if (hIconFamily) | 218 if (hIconFamily) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 252 |
| 251 if (result != noErr || !hIconFamily) | 253 if (result != noErr || !hIconFamily) |
| 252 { | 254 { |
| 253 [self autorelease]; | 255 [self autorelease]; |
| 254 return nil; | 256 return nil; |
| 255 } | 257 } |
| 256 } | 258 } |
| 257 return self; | 259 return self; |
| 258 } | 260 } |
| 259 | 261 |
| 260 - initWithSystemIcon:(int)fourByteCode | 262 - (id) initWithSystemIcon:(int)fourByteCode |
| 261 { | 263 { |
| 262 IconRef iconRef; | 264 IconRef iconRef; |
| 263 OSErr result; | 265 OSErr result; |
| 264 | 266 |
| 265 self = [self init]; | 267 self = [self init]; |
| 266 if (self) | 268 if (self) |
| 267 { | 269 { |
| 268 if (hIconFamily) | 270 if (hIconFamily) |
| 269 { | 271 { |
| 270 DisposeHandle( (Handle)hIconFamily ); | 272 DisposeHandle( (Handle)hIconFamily ); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 288 { | 290 { |
| 289 [self autorelease]; | 291 [self autorelease]; |
| 290 return nil; | 292 return nil; |
| 291 } | 293 } |
| 292 | 294 |
| 293 ReleaseIconRef( iconRef ); | 295 ReleaseIconRef( iconRef ); |
| 294 } | 296 } |
| 295 return self; | 297 return self; |
| 296 } | 298 } |
| 297 | 299 |
| 298 - initWithThumbnailsOfImage:(NSImage*)image | 300 - (id) initWithThumbnailsOfImage:(NSImage*)image |
| 299 { | 301 { |
| 300 // The default is to use a high degree of antialiasing, producing a smooth i
mage. | 302 // The default is to use a high degree of antialiasing, producing a smooth i
mage. |
| 301 return [self initWithThumbnailsOfImage:image usingImageInterpolation:NSImage
InterpolationHigh]; | 303 return [self initWithThumbnailsOfImage:image usingImageInterpolation:NSImage
InterpolationHigh]; |
| 302 } | 304 } |
| 303 | 305 |
| 304 - initWithThumbnailsOfImage:(NSImage*)image usingImageInterpolation:(NSImageInte
rpolation)imageInterpolation | 306 - (id) initWithThumbnailsOfImage:(NSImage*)image usingImageInterpolation:(NSImag
eInterpolation)imageInterpolation |
| 305 { | 307 { |
| 306 NSImage* iconImage512x512; | 308 NSImage* iconImage512x512; |
| 307 NSImage* iconImage256x256; | 309 NSImage* iconImage256x256; |
| 308 NSImage* iconImage128x128; | 310 NSImage* iconImage128x128; |
| 309 NSImage* iconImage32x32; | 311 NSImage* iconImage32x32; |
| 310 NSImage* iconImage16x16; | 312 NSImage* iconImage16x16; |
| 311 NSImage* bitmappedIconImage512x512; | 313 NSImage* bitmappedIconImage512x512; |
| 312 NSBitmapImageRep* iconBitmap512x512; | 314 NSBitmapImageRep* iconBitmap512x512; |
| 313 NSBitmapImageRep* iconBitmap256x256; | 315 NSBitmapImageRep* iconBitmap256x256; |
| 314 NSBitmapImageRep* iconBitmap128x128; | 316 NSBitmapImageRep* iconBitmap128x128; |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 | 719 |
| 718 if (result != noErr) | 720 if (result != noErr) |
| 719 { | 721 { |
| 720 NSLog(@"SetIconFamilyData() returned error %d", result); | 722 NSLog(@"SetIconFamilyData() returned error %d", result); |
| 721 return NO; | 723 return NO; |
| 722 } | 724 } |
| 723 | 725 |
| 724 return YES; | 726 return YES; |
| 725 } | 727 } |
| 726 | 728 |
| 729 #if !defined(DISABLE_CUSTOM_ICON) |
| 730 |
| 727 - (BOOL) setAsCustomIconForFile:(NSString*)path | 731 - (BOOL) setAsCustomIconForFile:(NSString*)path |
| 728 { | 732 { |
| 729 return( [self setAsCustomIconForFile:path withCompatibility:NO] ); | 733 return( [self setAsCustomIconForFile:path withCompatibility:NO] ); |
| 730 } | 734 } |
| 731 | 735 |
| 732 - (BOOL) setAsCustomIconForFile:(NSString*)path withCompatibility:(BOOL)compat | 736 - (BOOL) setAsCustomIconForFile:(NSString*)path withCompatibility:(BOOL)compat |
| 733 { | 737 { |
| 734 FSRef targetFileFSRef; | 738 FSRef targetFileFSRef; |
| 735 FSRef parentDirectoryFSRef; | 739 FSRef parentDirectoryFSRef; |
| 736 SInt16 file; | 740 SInt16 file; |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1132 if (result != noErr) | 1136 if (result != noErr) |
| 1133 return NO; | 1137 return NO; |
| 1134 } | 1138 } |
| 1135 | 1139 |
| 1136 if( ! [[NSFileManager defaultManager] iconfamily_removeItemAtPath:[path stri
ngByAppendingPathComponent:@"Icon\r"]] ) | 1140 if( ! [[NSFileManager defaultManager] iconfamily_removeItemAtPath:[path stri
ngByAppendingPathComponent:@"Icon\r"]] ) |
| 1137 return NO; | 1141 return NO; |
| 1138 | 1142 |
| 1139 return YES; | 1143 return YES; |
| 1140 } | 1144 } |
| 1141 | 1145 |
| 1146 #endif // !defined(DISABLE_CUSTOM_ICON) |
| 1147 |
| 1142 - (NSData *) data | 1148 - (NSData *) data |
| 1143 { | 1149 { |
| 1144 return [NSData dataWithBytes:*hIconFamily length:GetHandleSize((Handle)hIcon
Family)]; | 1150 return [NSData dataWithBytes:*hIconFamily length:GetHandleSize((Handle)hIcon
Family)]; |
| 1145 } | 1151 } |
| 1146 | 1152 |
| 1147 - (BOOL) writeToFile:(NSString*)path | 1153 - (BOOL) writeToFile:(NSString*)path |
| 1148 { | 1154 { |
| 1149 return [[self data] writeToFile:path atomically:NO]; | 1155 return [[self data] writeToFile:path atomically:NO]; |
| 1150 } | 1156 } |
| 1151 | 1157 |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1582 } | 1588 } |
| 1583 else | 1589 else |
| 1584 { | 1590 { |
| 1585 NSLog(@"get1BitMaskFromBitmapImageRep:requiredPixelSize: returni
ng NULL due to bitsPerPixel == %ld, samplesPerPixel== %ld, bitsPerSample == %ld"
, bitsPerPixel, samplesPerPixel, bitsPerSample); | 1591 NSLog(@"get1BitMaskFromBitmapImageRep:requiredPixelSize: returni
ng NULL due to bitsPerPixel == %ld, samplesPerPixel== %ld, bitsPerSample == %ld"
, bitsPerPixel, samplesPerPixel, bitsPerSample); |
| 1586 return NULL; | 1592 return NULL; |
| 1587 } | 1593 } |
| 1588 | 1594 |
| 1589 return hRawData; | 1595 return hRawData; |
| 1590 } | 1596 } |
| 1591 | 1597 |
| 1598 #if !defined(DISABLE_CUSTOM_ICON) |
| 1599 |
| 1592 - (BOOL) addResourceType:(OSType)type asResID:(int)resID | 1600 - (BOOL) addResourceType:(OSType)type asResID:(int)resID |
| 1593 { | 1601 { |
| 1594 Handle hIconRes = NewHandle(0); | 1602 Handle hIconRes = NewHandle(0); |
| 1595 OSErr err; | 1603 OSErr err; |
| 1596 | 1604 |
| 1597 err = GetIconFamilyData( hIconFamily, type, hIconRes ); | 1605 err = GetIconFamilyData( hIconFamily, type, hIconRes ); |
| 1598 | 1606 |
| 1599 if( !GetHandleSize(hIconRes) || err != noErr ) | 1607 if( !GetHandleSize(hIconRes) || err != noErr ) |
| 1600 return NO; | 1608 return NO; |
| 1601 | 1609 |
| 1602 AddResource( hIconRes, type, resID, "\p" ); | 1610 AddResource( hIconRes, type, resID, "\p" ); |
| 1603 | 1611 |
| 1604 return YES; | 1612 return YES; |
| 1605 } | 1613 } |
| 1606 | 1614 |
| 1615 #endif // !defined(DISABLE_CUSTOM_ICON) |
| 1616 |
| 1607 @end | 1617 @end |
| 1608 | 1618 |
| 1609 // Methods for interfacing with the Cocoa Pasteboard. | 1619 // Methods for interfacing with the Cocoa Pasteboard. |
| 1610 | 1620 |
| 1611 @implementation IconFamily (ScrapAdditions) | 1621 @implementation IconFamily (ScrapAdditions) |
| 1612 | 1622 |
| 1613 + (BOOL) canInitWithScrap | 1623 + (BOOL) canInitWithScrap |
| 1614 { | 1624 { |
| 1615 NSArray *types = [[NSPasteboard generalPasteboard] types]; | 1625 NSArray *types = [[NSPasteboard generalPasteboard] types]; |
| 1616 return [types containsObject:ICONFAMILY_UTI] || [types containsObject:ICONFA
MILY_PBOARD_TYPE]; | 1626 return [types containsObject:ICONFAMILY_UTI] || [types containsObject:ICONFA
MILY_PBOARD_TYPE]; |
| 1617 } | 1627 } |
| 1618 | 1628 |
| 1619 + (IconFamily*) iconFamilyWithScrap | 1629 + (IconFamily*) iconFamilyWithScrap |
| 1620 { | 1630 { |
| 1621 return [[[IconFamily alloc] initWithScrap] autorelease]; | 1631 return [[[IconFamily alloc] initWithScrap] autorelease]; |
| 1622 } | 1632 } |
| 1623 | 1633 |
| 1624 - initWithScrap | 1634 - (id) initWithScrap |
| 1625 { | 1635 { |
| 1626 NSPasteboard *pboard = [NSPasteboard generalPasteboard]; | 1636 NSPasteboard *pboard = [NSPasteboard generalPasteboard]; |
| 1627 | 1637 |
| 1628 NSData *data = [pboard dataForType:ICONFAMILY_UTI]; | 1638 NSData *data = [pboard dataForType:ICONFAMILY_UTI]; |
| 1629 if( !data ) | 1639 if( !data ) |
| 1630 data = [pboard dataForType:ICONFAMILY_PBOARD_TYPE]; | 1640 data = [pboard dataForType:ICONFAMILY_PBOARD_TYPE]; |
| 1631 if( !data ) | 1641 if( !data ) |
| 1632 { | 1642 { |
| 1633 [self release]; | 1643 [self release]; |
| 1634 return nil; | 1644 return nil; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1695 } | 1705 } |
| 1696 | 1706 |
| 1697 @end | 1707 @end |
| 1698 | 1708 |
| 1699 | 1709 |
| 1700 @implementation NSImage (IconFamilyCompatibility) | 1710 @implementation NSImage (IconFamilyCompatibility) |
| 1701 | 1711 |
| 1702 - (NSImageRep *) iconfamily_bestRepresentation | 1712 - (NSImageRep *) iconfamily_bestRepresentation |
| 1703 { | 1713 { |
| 1704 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 | 1714 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 |
| 1705 » if ([!self respondsToSelector:@selector(bestRepresentationForRect:contex
t:hints:)]) | 1715 » if (![self respondsToSelector:@selector(bestRepresentationForRect:contex
t:hints:)]) |
| 1706 { | 1716 { |
| 1707 return [self bestRepresentationForDevice:nil]; | 1717 return [self bestRepresentationForDevice:nil]; |
| 1708 } | 1718 } |
| 1709 #endif | 1719 #endif |
| 1710 | 1720 |
| 1711 return [self bestRepresentationForRect:(NSRect){NSZeroPoint, [self size]
} context:nil hints:nil]; | 1721 return [self bestRepresentationForRect:(NSRect){NSZeroPoint, [self size]
} context:nil hints:nil]; |
| 1712 } | 1722 } |
| 1713 | 1723 |
| 1714 @end | 1724 @end |
| OLD | NEW |