Cache the file type results for the image reps and clear the cache when these change.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@34469 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2012-01-09 14:39:50 +00:00
parent c1a3a4549b
commit 93403780f3
2 changed files with 55 additions and 9 deletions

View file

@ -1,3 +1,10 @@
2012-01-09 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSImage.m (+imageUnfilteredFileTypes, +imageFileTypes,
+imageUnfilteredPasteboardTypes, +imagePasteboardTypes,
+initialize, +_clearFileTypeCaches): Cache the file type results
for the image reps and clear the cache when these change.
2012-01-03 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSPrinter.m (-loadPPDAtPath:...inclusionSet:): Raise an

View file

@ -34,8 +34,9 @@
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSLock.h>
#import <Foundation/NSKeyedArchiver.h>
#import <Foundation/NSLock.h>
#import <Foundation/NSNotification.h>
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
@ -122,6 +123,11 @@ static NSDictionary *nsmapping = nil;
static NSColor *clearColor = nil;
static Class cachedClass = 0;
static Class bitmapClass = 0;
// Cache for the supported file types
static NSArray *imageUnfilteredFileTypes = nil;
static NSArray *imageFileTypes = nil;
static NSArray *imageUnfilteredPasteboardTypes = nil;
static NSArray *imagePasteboardTypes = nil;
static NSArray *iterate_reps_for_types(NSArray *imageReps, SEL method);
@ -179,6 +185,11 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep)
clearColor = RETAIN([NSColor clearColor]);
cachedClass = [NSCachedImageRep class];
bitmapClass = [NSBitmapImageRep class];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(_clearFileTypeCaches)
name: NSImageRepRegistryChangedNotification
object: [NSImageRep class]];
[imageLock unlock];
}
}
@ -1806,26 +1817,46 @@ static NSSize GSResolutionOfImageRep(NSImageRep *rep)
+ (NSArray *) imageUnfilteredFileTypes
{
return iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageUnfilteredFileTypes));
if (nil == imageUnfilteredFileTypes)
{
ASSIGN(imageUnfilteredFileTypes,
iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageUnfilteredFileTypes)));
}
return imageUnfilteredFileTypes;
}
+ (NSArray *) imageFileTypes
{
return iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageFileTypes));
if (nil == imageFileTypes)
{
ASSIGN(imageFileTypes,
iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageFileTypes)));
}
return imageFileTypes;
}
+ (NSArray *) imageUnfilteredPasteboardTypes
{
return iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageUnfilteredPasteboardTypes));
if (nil == imageUnfilteredPasteboardTypes)
{
ASSIGN(imageUnfilteredPasteboardTypes,
iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imageUnfilteredPasteboardTypes)));
}
return imageUnfilteredPasteboardTypes;
}
+ (NSArray *) imagePasteboardTypes
{
return iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imagePasteboardTypes));
if (nil == imagePasteboardTypes)
{
ASSIGN(imagePasteboardTypes,
iterate_reps_for_types([NSImageRep registeredImageRepClasses],
@selector(imagePasteboardTypes)));
}
return imagePasteboardTypes;
}
@end
@ -1874,6 +1905,14 @@ iterate_reps_for_types(NSArray* imageReps, SEL method)
@implementation NSImage (Private)
+ (void) _clearFileTypeCaches
{
RELEASE(imageUnfilteredFileTypes);
RELEASE(imageFileTypes);
RELEASE(imageUnfilteredPasteboardTypes);
RELEASE(imagePasteboardTypes);
}
- (BOOL)_loadFromData: (NSData *)data
{
BOOL ok;