This is SurfDecoder.m in view mode; [Download] [Up]
/* ** Copyright (c) 1995 Netsurfer Inc. All Rights Reserved. ** ** Author: <bbum@friday.com> */ /* This object is included in the MiscKit by permission from the author ** and its use is governed by the MiscKit license, found in the file ** "LICENSE.rtf" in the MiscKit distribution. Please refer to that file ** for a list of all applicable permissions and restrictions. */ #import <appkit/appkit.h> #import "surfimage.h" #ifdef VERBOSE #undef VERBOSE #undef METHOD #undef METHODnl #endif #define VERBOSE if(_SDFlags.verboseMode) #define METHOD fprintf(stderr, "[%s %s%s] ", \ object_getClassName(self), \ (self == [self class]) ? "+" : "-", \ SELNAME(_cmd)) #define METHODnl fprintf(stderr, "[%s %s%s]\n", \ object_getClassName(self), \ (self == [self class]) ? "+" : "-", \ SELNAME(_cmd)) @implementation SurfDecoder /*" * This class is an abstract superclass for all image decoders. An image * decoder need only implement those methods marked as the responsibility * of the subclass. "*/ + sharedInstance /*" * Returns an instance that can be shared throughout the application. %{It * is the responsibility of the subclass to implement this method!} "*/ { [self subclassResponsibility:_cmd]; return self; } + (const char *const *)imageUnfilteredFileTypes; /*" * Returns a NULL terminated array of types (file extensions) that an * instance of the decoder class can filter to TIFF. %{It is the * responsibility of the subclass to implement this method!} "*/ { [self subclassResponsibility:_cmd]; return NULL; } + (BOOL)canLoadFromStream:(NXStream *)stream; /*" * Returns YES if an instance of the decoder class can decode the iamge * contained in stream. An implementation of this method should read the * minnimum number of bytes necessary to determine if it can decode the * stream. The seek position in the stream must be preserved. %{It is the * responsibility of the subclass to implement this method!} "*/ { [self subclassResponsibility:_cmd]; return NO; } - init /*" * Designated initializer. Disables verbose mode. "*/ { _SDFlags.verboseMode = NO; _SDFlags.lastCorrupt = NO; return self; } - free { return [super free]; } - decodeFromFile:(const char *) filePath /*" * Decode image contained in filePath. Returns an instance of NXImage * containing the image data. It is the caller's responsibility to dispose * of the iamge object. Returns nil if unable to decode filePath. Note * that this method may return an image if filePath is corrupt. "*/ { return [self decodeFromFile:filePath intoImage:nil]; } - decodeFromFile:(const char *) filePath intoImage: image; /*" * Decode image contained in filePath into image. Image should be an * instance of NXImage. If iamge is undefined, an instance of NXImage will * be allocated. It is the caller's responsibility to dispose of the iamge * object. Returns nil if unable to decode filePath. Note that this * method may return an image if filePath is corrupt. "*/ { NXStream *stream = NXMapFile(filePath, NX_READONLY); if(!stream) return nil; VERBOSE { METHOD; fprintf(stderr, "%s\n", filePath); } image = [self decodeFromStream: stream intoImage:image]; NXCloseMemory(stream, NX_FREEBUFFER); return image; } - decodeFromStream:(NXStream *) stream; /*" * Decode image contained in stream. Same behaviour as #{-decodeFromFile:} "*/ { return [self decodeFromStream:stream intoImage:nil]; } - decodeFromStream:(NXStream *) stream intoImage:image; /*" * Decode image contained in stream. Same behaviour as * #{-decodeFromFile:intoImage:} "*/ { BOOL externalImage = image ? YES : NO; _SDFlags.lastCorrupt = NO; /* validate stream */ if(![[self class] canLoadFromStream:stream]) { VERBOSE { METHOD; fprintf(stderr, "+canLoadFromStream: returned NO\n"); } return nil; } else VERBOSE { METHOD; fprintf(stderr, "Stream validated\n"); } /* If no image passed in, then allocate one-- assign to returnImage for manipulation by decoder. */ if(!externalImage) returnImage = [[NXImage allocFromZone:[self zone]] init]; else returnImage = image; image = [self _decodeFromStream:stream]; VERBOSE { METHOD; fprintf(stderr, "Image was %scorrupted.\n", _SDFlags.lastCorrupt ? "" : "not "); } /* if decoder returned nil AND returnImage was allocated above, then free it. */ if(!image && !externalImage) { [returnImage free]; returnImage = nil; } /* regardless, reset it's state to nil. */ returnImage = nil; return image; } - _decodeFromStream:(NXStream *) theStream /*" * This is the method that actually performs the decoding. This method * should never be called directly. * * Upon entry, theStream has already been validated as a stream that * contains an image that the image decoder can [potentially] decode. The * decoder should decode the image into an instance of some subclass of * NXImageRep that is stored in the #returnImage by using the * #{-useRepresentation:} method. * * %{It is the responsibility of the subclass to implement this method!} "*/ { [self subclassResponsibility:_cmd]; return self; } - (void) setImageDepth:(NXWindowDepth) aDepth; /*" * Sets the decoding depth (%imageDepth) to aDepth. The decoder can use * %imageDepth to optimize the decoding process to the particular display * device. "*/ { imageDepth = aDepth; } - (NXWindowDepth) imageDepth /*" * Returns the target decoding depth. "*/ { return imageDepth; } - (void) setLastImageCorrupt:(BOOL) aFlag; /*" * This method should %only be called by the decoder. If is used to mark * the last decoded image as being corrupt. "*/ { _SDFlags.lastCorrupt = aFlag; } - (BOOL) lastImageCorrupt /*" * Returns YES if the last image decoded was corrupt. "*/ { return _SDFlags.lastCorrupt; } - (BOOL) verboseMode; /*" * Returns YES if verbose mode is enabled. If verbose mode is enabled, the * image decoder should dump notes about the decoding process. For example, * the GIF decoder dumps information about each step of the decoding * process. Useful for debugging purposes. "*/ { return _SDFlags.verboseMode; } - (void) setVerboseMode:(BOOL) aFlag /*" * Enables / disables verbose mode. "*/ { _SDFlags.verboseMode = aFlag; } - (void) setErrorDelegate:(id <SurfErrorDelegate>) aDelegate /*" * Sets the error delegate to aDelegate. aDelegate will receive * notification whenever the decoder generates an error message. "*/ { errorDelegate = aDelegate; } - errorDelegate /*" * returns the error delegate. "*/ { return errorDelegate; } - (void) spewMessage:(const char *) errMsg withSeverity:(SurfErrorSeverity) aSeverity /*" * This method should not be overridden. It should be invoked whenever the * decoder wishes to spew a message. The message will be passed to the * errorDelegate via the #{-decoder:spewMessage:withSeverity:} method in * the #SurfErrorDelegate protocol. "*/ { if(errorDelegate) [errorDelegate decoder:self spewMessage:errMsg withSeverity:aSeverity]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.