This is SurfJPEGDecoder.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 "SurfJPEGSupport.h"
#import "SurfJPEGDecoder.Internal.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))
@interface SurfJPEGDecoder (PrivateAPI)
- _decodeFromStream:(NXStream *) theStream;
@end
@implementation SurfJPEGDecoder
/*"
* Implements a JPEG/JFIF image decoder.
"*/
+ sharedInstance
/*"
* Shared instance management. Just for convenience; not a requirement.
"*/
{
static id sharedInstance = nil;
if (!sharedInstance) {
sharedInstance = [self alloc];
[sharedInstance init];
}
return sharedInstance;
}
+ (const char *const *)imageUnfilteredFileTypes;
/*"
* Returns a NULL terminated array of file extensions instances of this
* decoder class can decode.
"*/
{
static const char *const jpegTypes[] = {
"jpeg",
"JPEG",
"jpg",
"JPG",
"jfif",
"JFIF",
NULL};
return jpegTypes;
}
+ (BOOL)canLoadFromStream:(NXStream *)stream
/*"
* Returns YES if an instance of this decoder class can decode the image
* contained in stream. This is by no means a definitive answer. Restores
* the seek state of stream before returning.
"*/
{
long startingPosition = NXTell(stream);
BOOL canRead = NO;
unsigned index;
unsigned char header[11];
unsigned short matchbuf[] = {0xff, // marker
0xd8, // start-of-input mark
0xff, // marker
0xe0, // app0 block follows
0xfff,// block length (ignored)
0xfff,// block length (ignored)
0x4a, // 'J'
0x46, // 'F'
0x49, // 'I'
0x46, // 'F'
0x00};// NULL 'JFIF' terminator
if(!NXRead(stream, header, 11))
goto resetAndReturn;
for(index = 0;index<11;index++)
if( (matchbuf[index] != 0xfff) && (header[index] != matchbuf[index]) )
goto resetAndReturn;
canRead = YES;
resetAndReturn:
/* Reset stream back to the starting postiion.
*/
NX_DURING
NXSeek(stream, startingPosition, NX_FROMSTART);
NX_HANDLER
NXLogError("Attempted to NXSeek() a stream that cannot be NXSeek()ed.");
canRead = NO;
NX_ENDHANDLER
return canRead;
}
- init
{
[super init];
[self setReadCount: 5];
return self;
}
- free
{
NX_FREE(rowPtrBuf);
return [super free];
}
- (void) setReadCount: (unsigned) aNum
/*"
* Sets the readCount to aNum and reallocates %rowPtrBuf, as necessary.
"*/
{
if(aNum)
readCount = aNum;
else
readCount = 5;
if(rowPtrBuf)
rowPtrBuf = (unsigned char **) NXZoneRealloc([self zone], rowPtrBuf,
sizeof(unsigned char *) *
readCount);
else
rowPtrBuf = (unsigned char **) NXZoneMalloc([self zone],
sizeof(unsigned char *) *
readCount);
}
- (unsigned) readCount
/*"
* Returns the number of rows that will be read during each decoding pass.
"*/
{
return readCount;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.