mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-05-30 13:20:38 +00:00
Initial implementation of NSImage* classes based upon Adam Feodor's work.
Changes to utilize the TIFF library. Uncomment some code now that NSException and NSNotification* classes exist. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@1654 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
f862cf8a2b
commit
1e3870ceb7
21 changed files with 2235 additions and 668 deletions
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
NSBitmapImageRep.m
|
||||
|
||||
Bitmap image representations
|
||||
Bitmap image representation.
|
||||
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Author: Scott Christley <scottc@net-community.com>
|
||||
Date: 1996
|
||||
|
||||
Written by: Adam Fedor <fedor@colorado.edu>
|
||||
Date: Feb 1996
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
|
@ -19,188 +19,395 @@
|
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
|
||||
If you are interested in a warranty or support for this source code,
|
||||
contact Scott Christley <scottc@net-community.com> for more information.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
*/
|
||||
|
||||
#include <gnustep/gui/NSBitmapImageRep.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <Foundation/NSException.h>
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <AppKit/NSBitmapImageRep.h>
|
||||
#include <AppKit/nsimage-tiff.h>
|
||||
|
||||
@implementation NSBitmapImageRep
|
||||
/* Maximum number of planes */
|
||||
#define MAX_PLANES 5
|
||||
|
||||
//
|
||||
// Class methods
|
||||
//
|
||||
+ (void)initialize
|
||||
/* Backend protocol - methods that must be implemented by the backend to
|
||||
complete the class */
|
||||
@protocol NXBitmapImageRepBackend
|
||||
- (BOOL) draw;
|
||||
@end
|
||||
|
||||
@implementation NSBitmapImageRep
|
||||
|
||||
/* Given a TIFF image (from the libtiff library), load the image information
|
||||
into our data structure. Reads the specified image. */
|
||||
- _initFromImage: (TIFF *)image number: (int)imageNumber
|
||||
{
|
||||
if (self == [NSBitmapImageRep class])
|
||||
NSString* space;
|
||||
NSTiffInfo* info;
|
||||
|
||||
info = NSTiffGetInfo(imageNumber, image);
|
||||
if (!info)
|
||||
{
|
||||
// Initial version
|
||||
[self setVersion:1];
|
||||
[NSException raise:NSTIFFException format: @"Read invalid TIFF info"];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Allocating and Initializing a New NSBitmapImageRep Object
|
||||
//
|
||||
+ (id)imageRepWithData:(NSData *)tiffData
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
/* 8-bit RGB will be converted to 24-bit by the tiff routines, so account
|
||||
for this. */
|
||||
space = nil;
|
||||
#ifdef HAVE_LIBTIFF
|
||||
switch(info->photoInterp)
|
||||
{
|
||||
case PHOTOMETRIC_MINISBLACK: space = NSDeviceWhiteColorSpace; break;
|
||||
case PHOTOMETRIC_MINISWHITE: space = NSDeviceBlackColorSpace; break;
|
||||
case PHOTOMETRIC_RGB: space = NSDeviceRGBColorSpace; break;
|
||||
case PHOTOMETRIC_PALETTE:
|
||||
space = NSDeviceRGBColorSpace;
|
||||
info->samplesPerPixel = 3;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
+ (NSArray *)imageRepsWithData:(NSData *)tiffData
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
[self initWithBitmapDataPlanes: NULL
|
||||
pixelsWide: info->width
|
||||
pixelsHigh: info->height
|
||||
bitsPerSample: info->bitsPerSample
|
||||
samplesPerPixel: info->samplesPerPixel
|
||||
hasAlpha: (info->samplesPerPixel > 3)
|
||||
isPlanar: (info->planarConfig == PLANARCONFIG_SEPARATE)
|
||||
colorSpaceName: space
|
||||
bytesPerRow: 0
|
||||
bitsPerPixel: 0];
|
||||
compression = info->compression;
|
||||
|
||||
//
|
||||
// Producing a TIFF Representation of the Image
|
||||
//
|
||||
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray
|
||||
usingCompression:(NSTIFFCompression)compressionType
|
||||
factor:(float)factor
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// Setting and Checking Compression Types
|
||||
//
|
||||
+ (void)getTIFFCompressionTypes:(const NSTIFFCompression **)list
|
||||
count:(int *)numTypes
|
||||
{}
|
||||
|
||||
+ (NSString *)localizedNameForTIFFCompressionType:(NSTIFFCompression)compression
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// Instance methods
|
||||
//
|
||||
//
|
||||
// Allocating and Initializing a New NSBitmapImageRep Object
|
||||
//
|
||||
- (id)initWithData:(NSData *)tiffData
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id)initWithFocusedViewRect:(NSRect)rect
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id)initWithBitmapDataPlanes:(unsigned char **)planes
|
||||
pixelsWide:(int)width
|
||||
pixelsHigh:(int)height
|
||||
bitsPerSample:(int)bps
|
||||
samplesPerPixel:(int)spp
|
||||
hasAlpha:(BOOL)alpha
|
||||
isPlanar:(BOOL)config
|
||||
colorSpaceName:(NSString *)colorSpaceName
|
||||
bytesPerRow:(int)rowBytes
|
||||
bitsPerPixel:(int)pixelBits
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// Getting Information about the Image
|
||||
//
|
||||
- (int)bitsPerPixel
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (int)samplesPerPixel
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (BOOL)isPlanar
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (int)numberOfPlanes
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (int)bytesPerPlane
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (int)bytesPerRow
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Getting Image Data
|
||||
//
|
||||
- (unsigned char *)bitmapData
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- (void)getBitmapDataPlanes:(unsigned char **)data
|
||||
{}
|
||||
|
||||
//
|
||||
// Producing a TIFF Representation of the Image
|
||||
//
|
||||
- (NSData *)TIFFRepresentation
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)compressionType
|
||||
factor:(float)factor
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
// Setting and Checking Compression Types
|
||||
//
|
||||
- (BOOL)canBeCompressedUsing:(NSTIFFCompression)compression
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)getCompression:(NSTIFFCompression *)compression
|
||||
factor:(float *)factor
|
||||
{}
|
||||
|
||||
- (void)setCompression:(NSTIFFCompression)compression
|
||||
factor:(float)factor
|
||||
{}
|
||||
|
||||
//
|
||||
// NSCoding protocol
|
||||
//
|
||||
- (void)encodeWithCoder:aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
}
|
||||
|
||||
- initWithCoder:aDecoder
|
||||
{
|
||||
[super initWithCoder:aDecoder];
|
||||
if (NSTiffRead(imageNumber, image, NULL, [self bitmapData]))
|
||||
{
|
||||
[NSException raise:NSTIFFException format: @"Read invalid TIFF image"];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (id) imageRepWithData: (NSData *)tiffData
|
||||
{
|
||||
NSArray* array;
|
||||
|
||||
array = [self imageRepsWithData: tiffData];
|
||||
if ([array count])
|
||||
return [array objectAtIndex: 0];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (NSArray *) imageRepsWithData: (NSData *)tiffData
|
||||
{
|
||||
int images;
|
||||
TIFF* image;
|
||||
NSTiffInfo* info;
|
||||
NSMutableArray* array;
|
||||
|
||||
image = NSTiffOpenData((char *)[tiffData bytes], [tiffData length],
|
||||
"r", NULL);
|
||||
if (!image)
|
||||
{
|
||||
[NSException raise:NSTIFFException format: @"Read invalid TIFF data"];
|
||||
}
|
||||
|
||||
array = [NSMutableArray arrayWithCapacity:1];
|
||||
images = 0;
|
||||
while ((info = NSTiffGetInfo(images, image)))
|
||||
{
|
||||
NSBitmapImageRep* imageRep;
|
||||
|
||||
OBJC_FREE(info);
|
||||
imageRep = [[[[self class] alloc]
|
||||
_initFromImage: image number: images] autorelease];
|
||||
[array addObject: imageRep];
|
||||
images++;
|
||||
}
|
||||
NSTiffClose(image);
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
/* Loads only the default (first) image from the TIFF image contained in
|
||||
data. */
|
||||
- (id) initWithData: (NSData *)tiffData
|
||||
{
|
||||
TIFF *image;
|
||||
|
||||
image = NSTiffOpenData((char *)[tiffData bytes], [tiffData length],
|
||||
"r", NULL);
|
||||
if (!image)
|
||||
{
|
||||
[NSException raise:NSTIFFException format: @"Read invalid TIFF data"];
|
||||
}
|
||||
|
||||
[self _initFromImage:image number: -1];
|
||||
NSTiffClose(image);
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithFocusedViewRect: (NSRect)rect
|
||||
{
|
||||
return [self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
/* This is the designated initializer */
|
||||
/* Note: It's unclear whether or not we own the data that is passed
|
||||
to us here. Since the data is not of type "const", one could assume
|
||||
that we do own it and that it should not be copied. I'm also assuming
|
||||
we own the data that "planes" points to. This is all a very hazardous
|
||||
assumption. It's also harder to deal with. */
|
||||
- (id) initWithBitmapDataPlanes: (unsigned char **)planes
|
||||
pixelsWide: (int)width
|
||||
pixelsHigh: (int)height
|
||||
bitsPerSample: (int)bps
|
||||
samplesPerPixel: (int)spp
|
||||
hasAlpha: (BOOL)alpha
|
||||
isPlanar: (BOOL)config
|
||||
colorSpaceName: (NSString *)colorSpaceName
|
||||
bytesPerRow: (int)rowBytes
|
||||
bitsPerPixel: (int)pixelBits;
|
||||
{
|
||||
if (!bps || !spp || !width || !height)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"Required arguments not specified creating NSBitmapImageRep"];
|
||||
}
|
||||
|
||||
_pixelsWide = width;
|
||||
_pixelsHigh = height;
|
||||
size.width = width;
|
||||
size.height = height;
|
||||
bitsPerSample = bps;
|
||||
numColors = spp;
|
||||
hasAlpha = alpha;
|
||||
isPlanar = isPlanar;
|
||||
colorSpace = [colorSpaceName retain];
|
||||
if (!pixelBits)
|
||||
pixelBits = bps * ((isPlanar) ? 1 : spp);
|
||||
bitsPerPixel = pixelBits;
|
||||
if (!rowBytes)
|
||||
rowBytes = ceil((float)width * bitsPerPixel / 8);
|
||||
bytesPerRow = rowBytes;
|
||||
|
||||
if (planes)
|
||||
{
|
||||
freePlanes = YES;
|
||||
imagePlanes = planes;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
if (imagePlanes && freePlanes)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_PLANES; i++)
|
||||
if (imagePlanes[i])
|
||||
OBJC_FREE(imagePlanes[i]);
|
||||
}
|
||||
OBJC_FREE(imagePlanes);
|
||||
[imageData release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
+ (BOOL) canInitWithData: (NSData *)data
|
||||
{
|
||||
TIFF *image = NULL;
|
||||
image = NSTiffOpenData((char *)[data bytes], [data length], "r", NULL);
|
||||
NSTiffClose(image);
|
||||
|
||||
return (image) ? YES : NO;
|
||||
}
|
||||
|
||||
+ (BOOL) canInitWithPasteboard: (NSPasteboard *)pasteboard
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return NO;
|
||||
}
|
||||
|
||||
+ (NSArray *) imageFileTypes
|
||||
{
|
||||
return [self imageUnfilteredFileTypes];
|
||||
}
|
||||
|
||||
+ (NSArray *) imagePasteboardTypes
|
||||
{
|
||||
return [self imageUnfilteredPasteboardTypes];
|
||||
}
|
||||
|
||||
+ (NSArray *) imageUnfilteredFileTypes
|
||||
{
|
||||
return [NSArray arrayWithObjects: @"tiff", @"tif", nil];
|
||||
}
|
||||
|
||||
+ (NSArray *) imageUnfilteredPasteboardTypes
|
||||
{
|
||||
return [NSArray arrayWithObjects: NSTIFFPboardType, nil];
|
||||
}
|
||||
|
||||
// Getting Information about the Image
|
||||
- (int) bitsPerPixel
|
||||
{
|
||||
return bitsPerPixel;
|
||||
}
|
||||
|
||||
- (int) samplesPerPixel
|
||||
{
|
||||
return numColors;
|
||||
}
|
||||
|
||||
- (BOOL) isPlanar
|
||||
{
|
||||
return isPlanar;
|
||||
}
|
||||
|
||||
- (int) numberOfPlanes
|
||||
{
|
||||
return (isPlanar) ? numColors : 1;
|
||||
}
|
||||
|
||||
- (int) bytesPerPlane
|
||||
{
|
||||
return bytesPerRow*_pixelsHigh;
|
||||
}
|
||||
|
||||
- (int) bytesPerRow
|
||||
{
|
||||
return bytesPerRow;
|
||||
}
|
||||
|
||||
// Getting Image Data
|
||||
- (unsigned char *) bitmapData
|
||||
{
|
||||
unsigned char *planes[MAX_PLANES];
|
||||
[self getBitmapDataPlanes: planes];
|
||||
return (unsigned char *)[imageData mutableBytes];
|
||||
// return planes[0];
|
||||
}
|
||||
|
||||
- (void) getBitmapDataPlanes: (unsigned char **)data
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!imagePlanes)
|
||||
{
|
||||
long length;
|
||||
unsigned char* bits;
|
||||
|
||||
length = numColors * bytesPerRow * _pixelsHigh * sizeof(unsigned char);
|
||||
imageData = [NSMutableData dataWithCapacity: length];
|
||||
OBJC_MALLOC(imagePlanes, unsigned char*, MAX_PLANES);
|
||||
bits = [imageData mutableBytes];
|
||||
if (isPlanar)
|
||||
{
|
||||
for (i=1; i < numColors; i++)
|
||||
imagePlanes[i] = bits + i*bytesPerRow * _pixelsHigh;
|
||||
for (i= numColors; i < MAX_PLANES; i++)
|
||||
imagePlanes[i] = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
imagePlanes[1] = bits;
|
||||
for (i= 1; i < MAX_PLANES; i++)
|
||||
imagePlanes[i] = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
if (data)
|
||||
for (i=0; i < numColors; i++)
|
||||
data[i] = imagePlanes[i];
|
||||
}
|
||||
|
||||
- (BOOL) draw
|
||||
{
|
||||
[self bitmapData];
|
||||
return NO;
|
||||
}
|
||||
|
||||
// Producing a TIFF Representation of the Image
|
||||
+ (NSData *) TIFFRepresentationOfImageRepsInArray: (NSArray *)anArray
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (NSData *) TIFFRepresentationOfImageRepsInArray: (NSArray *)anArray
|
||||
usingCompression: (NSTIFFCompression)compressionType
|
||||
factor: (float)factor
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData *) TIFFRepresentation
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSData *) TIFFRepresentationUsingCompression: (NSTIFFCompression)compressionType
|
||||
factor: (float)factor
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
// Setting and Checking Compression Types
|
||||
+ (void) getTIFFCompressionTypes: (const NSTIFFCompression **)list
|
||||
count: (int *)numTypes
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
+ (NSString *) localizedNameForTIFFCompressionType: (NSTIFFCompression)compression
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL) canBeCompressedUsing: (NSTIFFCompression)compression
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void) getCompression: (NSTIFFCompression *)compression
|
||||
factor: (float *)factor
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (void) setCompression: (NSTIFFCompression)compression
|
||||
factor: (float)factor
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
|
||||
// NSCoding protocol
|
||||
- (void) encodeWithCoder: aCoder
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- initWithCoder: aDecoder
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue