mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-06-02 15:30:59 +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
30
ChangeLog
30
ChangeLog
|
@ -1,3 +1,33 @@
|
||||||
|
Mon Aug 12 14:16:12 1996 GNUstep Development <gnustep@duncan.ocbi.com>
|
||||||
|
|
||||||
|
* Headers/gnustep/gui/NSBitmapImageRep.h: Initial implementation
|
||||||
|
based upon Adam's Feodor work.
|
||||||
|
* Headers/gnustep/gui/NSCachedImageRep.h: Likewise.
|
||||||
|
* Headers/gnustep/gui/NSCustomImageRep.h: Likewise.
|
||||||
|
* Headers/gnustep/gui/NSEPSImageRep.h: Likewise.
|
||||||
|
* Headers/gnustep/gui/NSImage.h: Likewise.
|
||||||
|
* Headers/gnustep/gui/NSImageRep.h: Likewise.
|
||||||
|
* Source/NSBitmapImageRep.m: Likewise.
|
||||||
|
* Source/NSCachedImageRep.m: Likewise.
|
||||||
|
* Source/NSCustomImageRep.m: Likewise.
|
||||||
|
* Source/NSEPSImageRep.m: Likewise.
|
||||||
|
* Source/NSImage.m: Likewise.
|
||||||
|
* Source/NSImageRep.m: Likewise.
|
||||||
|
|
||||||
|
* Headers/gnustep/gui/NSApplication.h (-reportException:): Uncomment
|
||||||
|
method now that NSExceptions are implemented.
|
||||||
|
* Source/NSApplication.m (-reportException:): Likewise.
|
||||||
|
* Headers/gnustep/gui/NSText.h: Include NSNotification header file
|
||||||
|
now that class is implemented.
|
||||||
|
* Headers/gnustep/gui/config.h.in: Don't define NSNotification and
|
||||||
|
NSNotificationCenter to void as classes are now implemented.
|
||||||
|
* Headers/gnustep/gui/NSWindow.h: Uncomment methods now that NSScreen
|
||||||
|
class has been implemented.
|
||||||
|
* Source/NSWindow.m: Likewise.
|
||||||
|
* Source/Makefile.in: Changes to use TIFF library.
|
||||||
|
* Source/tiff.c: New file.
|
||||||
|
* Headers/gnustep/gui/nsimage-tiff.h: New file.
|
||||||
|
|
||||||
Wed Jul 10 17:11:53 1996 Scott Christley <scottc@net-community.com>
|
Wed Jul 10 17:11:53 1996 Scott Christley <scottc@net-community.com>
|
||||||
|
|
||||||
* Source/NSView.m: Use NSDebugLog instead of NSLog.
|
* Source/NSView.m: Use NSDebugLog instead of NSLog.
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include <AppKit/stdappkit.h>
|
#include <AppKit/stdappkit.h>
|
||||||
#include <Foundation/NSArray.h>
|
#include <Foundation/NSArray.h>
|
||||||
|
#include <Foundation/NSException.h>
|
||||||
#include <AppKit/NSEvent.h>
|
#include <AppKit/NSEvent.h>
|
||||||
#include <AppKit/NSResponder.h>
|
#include <AppKit/NSResponder.h>
|
||||||
#include <AppKit/NSWindow.h>
|
#include <AppKit/NSWindow.h>
|
||||||
|
@ -202,7 +203,7 @@
|
||||||
//
|
//
|
||||||
// Reporting an exception
|
// Reporting an exception
|
||||||
//
|
//
|
||||||
//- (void)reportException:(NSException *)anException
|
- (void)reportException:(NSException *)anException;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Terminating the application
|
// Terminating the application
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -39,6 +39,14 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
|
unsigned int bytesPerRow;
|
||||||
|
unsigned int numColors;
|
||||||
|
unsigned int bitsPerPixel;
|
||||||
|
unsigned short compression;
|
||||||
|
BOOL isPlanar;
|
||||||
|
BOOL freePlanes;
|
||||||
|
unsigned char** imagePlanes;
|
||||||
|
NSMutableData* imageData;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -50,14 +58,14 @@
|
||||||
- (id)initWithFocusedViewRect:(NSRect)rect;
|
- (id)initWithFocusedViewRect:(NSRect)rect;
|
||||||
- (id)initWithBitmapDataPlanes:(unsigned char **)planes
|
- (id)initWithBitmapDataPlanes:(unsigned char **)planes
|
||||||
pixelsWide:(int)width
|
pixelsWide:(int)width
|
||||||
pixelsHigh:(int)height
|
pixelsHigh:(int)height
|
||||||
bitsPerSample:(int)bps
|
bitsPerSample:(int)bps
|
||||||
samplesPerPixel:(int)spp
|
samplesPerPixel:(int)spp
|
||||||
hasAlpha:(BOOL)alpha
|
hasAlpha:(BOOL)alpha
|
||||||
isPlanar:(BOOL)config
|
isPlanar:(BOOL)config
|
||||||
colorSpaceName:(NSString *)colorSpaceName
|
colorSpaceName:(NSString *)colorSpaceName
|
||||||
bytesPerRow:(int)rowBytes
|
bytesPerRow:(int)rowBytes
|
||||||
bitsPerPixel:(int)pixelBits;
|
bitsPerPixel:(int)pixelBits;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Getting Information about the Image
|
// Getting Information about the Image
|
||||||
|
@ -81,7 +89,7 @@ bytesPerRow:(int)rowBytes
|
||||||
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray;
|
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray;
|
||||||
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray
|
+ (NSData *)TIFFRepresentationOfImageRepsInArray:(NSArray *)anArray
|
||||||
usingCompression:(NSTIFFCompression)compressionType
|
usingCompression:(NSTIFFCompression)compressionType
|
||||||
factor:(float)factor;
|
factor:(float)factor;
|
||||||
- (NSData *)TIFFRepresentation;
|
- (NSData *)TIFFRepresentation;
|
||||||
- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)compressionType
|
- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)compressionType
|
||||||
factor:(float)factor;
|
factor:(float)factor;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSCachedImageRep.h
|
NSCachedImageRep.h
|
||||||
|
|
||||||
Description...
|
Cached image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -40,6 +40,9 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
|
NSRect _rect;
|
||||||
|
NSWindow* _window;
|
||||||
|
void* _cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -47,7 +50,7 @@
|
||||||
//
|
//
|
||||||
- (id)initWithSize:(NSSize)aSize
|
- (id)initWithSize:(NSSize)aSize
|
||||||
depth:(NSWindowDepth)aDepth
|
depth:(NSWindowDepth)aDepth
|
||||||
separate:(BOOL)separate
|
separate:(BOOL)separate
|
||||||
alpha:(BOOL)alpha;
|
alpha:(BOOL)alpha;
|
||||||
- (id)initWithWindow:(NSWindow *)aWindow
|
- (id)initWithWindow:(NSWindow *)aWindow
|
||||||
rect:(NSRect)aRect;
|
rect:(NSRect)aRect;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSCustomImageRep.h
|
NSCustomImageRep.h
|
||||||
|
|
||||||
Description...
|
Custom image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
|
id delegate;
|
||||||
|
SEL selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithDrawSelector:(SEL)aSelector
|
- (id)initWithDrawSelector:(SEL)aSelector
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSEPSImageRep.h
|
NSEPSImageRep.h
|
||||||
|
|
||||||
Description...
|
EPS image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSImage.h
|
NSImage.h
|
||||||
|
|
||||||
Description...
|
Load, manipulate and display images
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -33,15 +33,43 @@
|
||||||
|
|
||||||
#include <AppKit/stdappkit.h>
|
#include <AppKit/stdappkit.h>
|
||||||
#include <DPSClient/TypesandConstants.h>
|
#include <DPSClient/TypesandConstants.h>
|
||||||
#include <AppKit/NSColor.h>
|
|
||||||
#include <AppKit/NSImageRep.h>
|
@class NSPasteboard;
|
||||||
#include <Foundation/NSCoder.h>
|
@class NSMutableArray;
|
||||||
|
@class NSImageRep;
|
||||||
|
@class NSColor;
|
||||||
|
@class NSView;
|
||||||
|
|
||||||
@interface NSImage : NSObject <NSCoding>
|
@interface NSImage : NSObject <NSCoding>
|
||||||
|
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
NSSize image_size;
|
NSString* name;
|
||||||
|
NSSize _size;
|
||||||
|
struct __imageFlags {
|
||||||
|
unsigned int scalable:1;
|
||||||
|
unsigned int dataRetained:1;
|
||||||
|
unsigned int flipDraw:1;
|
||||||
|
unsigned int uniqueWindow:1;
|
||||||
|
unsigned int uniqueWasExplicitlySet:1;
|
||||||
|
unsigned int sizeWasExplicitlySet:1;
|
||||||
|
unsigned int builtIn:1;
|
||||||
|
unsigned int needsToExpand:1;
|
||||||
|
unsigned int useEPSOnResolutionMismatch:1;
|
||||||
|
unsigned int colorMatchPreferred:1;
|
||||||
|
unsigned int multipleResolutionMatching:1;
|
||||||
|
unsigned int subImage:1;
|
||||||
|
unsigned int aSynch:1;
|
||||||
|
unsigned int archiveByName:1;
|
||||||
|
unsigned int cacheSeparately:1;
|
||||||
|
unsigned int unboundedCacheDepth:1;
|
||||||
|
} _flags;
|
||||||
|
NSMutableArray* _reps;
|
||||||
|
NSMutableArray* _repList;
|
||||||
|
NSColor* _color;
|
||||||
|
BOOL _syncLoad;
|
||||||
|
NSView* _lockedView;
|
||||||
|
id delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -82,12 +110,12 @@
|
||||||
operation:(NSCompositingOperation)op;
|
operation:(NSCompositingOperation)op;
|
||||||
- (void)compositeToPoint:(NSPoint)aPoint
|
- (void)compositeToPoint:(NSPoint)aPoint
|
||||||
fromRect:(NSRect)aRect
|
fromRect:(NSRect)aRect
|
||||||
operation:(NSCompositingOperation)op;
|
operation:(NSCompositingOperation)op;
|
||||||
- (void)dissolveToPoint:(NSPoint)aPoint
|
- (void)dissolveToPoint:(NSPoint)aPoint
|
||||||
fraction:(float)aFloat;
|
fraction:(float)aFloat;
|
||||||
- (void)dissolveToPoint:(NSPoint)aPoint
|
- (void)dissolveToPoint:(NSPoint)aPoint
|
||||||
fromRect:(NSRect)aRect
|
fromRect:(NSRect)aRect
|
||||||
fraction:(float)aFloat;
|
fraction:(float)aFloat;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Choosing Which Image Representation to Use
|
// Choosing Which Image Representation to Use
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSImageRep.h
|
NSImageRep.h
|
||||||
|
|
||||||
Description...
|
Abstract representation of an image.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -39,6 +39,13 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
|
NSString* colorSpace;
|
||||||
|
NSSize size;
|
||||||
|
BOOL hasAlpha;
|
||||||
|
BOOL isOpaque;
|
||||||
|
int bitsPerSample;
|
||||||
|
int _pixelsWide;
|
||||||
|
int _pixelsHigh;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <AppKit/NSView.h>
|
#include <AppKit/NSView.h>
|
||||||
#include <AppKit/NSFont.h>
|
#include <AppKit/NSFont.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
|
#include <Foundation/NSNotification.h>
|
||||||
|
|
||||||
@interface NSText : NSView <NSCoding>
|
@interface NSText : NSView <NSCoding>
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <AppKit/NSColor.h>
|
#include <AppKit/NSColor.h>
|
||||||
#include <AppKit/NSText.h>
|
#include <AppKit/NSText.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
|
#include <AppKit/NSScreen.h>
|
||||||
|
|
||||||
@interface NSWindow : NSResponder <NSCoding>
|
@interface NSWindow : NSResponder <NSCoding>
|
||||||
|
|
||||||
|
@ -223,14 +224,14 @@ screen:aScreen;
|
||||||
//
|
//
|
||||||
// Screens and window depths
|
// Screens and window depths
|
||||||
//
|
//
|
||||||
//+ (NSWindowDepth)defaultDepthLimit
|
+ (NSWindowDepth)defaultDepthLimit;
|
||||||
//- (BOOL)canStoreColor;
|
- (BOOL)canStoreColor;
|
||||||
//- (NSScreen *)deepestScreen;
|
- (NSScreen *)deepestScreen;
|
||||||
//- (NSWindowDepth)depthLimit;
|
- (NSWindowDepth)depthLimit;
|
||||||
//- (BOOL)hasDynamicDepthLimit;
|
- (BOOL)hasDynamicDepthLimit;
|
||||||
//- (NSScreen *)screen;
|
- (NSScreen *)screen;
|
||||||
//- (void)setDepthLimit:(NSWindowDepth)limit;
|
- (void)setDepthLimit:(NSWindowDepth)limit;
|
||||||
//- (void)setDynamicDepthLimit:(BOOL)flag;
|
- (void)setDynamicDepthLimit:(BOOL)flag;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cursor management
|
// Cursor management
|
||||||
|
|
|
@ -36,8 +36,8 @@
|
||||||
#include <Foundation/NSGeometry.h>
|
#include <Foundation/NSGeometry.h>
|
||||||
|
|
||||||
// Until they have been added to libobjects
|
// Until they have been added to libobjects
|
||||||
#define NSNotification void
|
//#define NSNotification void
|
||||||
#define NSNotificationCenter void
|
//#define NSNotificationCenter void
|
||||||
|
|
||||||
@config_include@
|
@config_include@
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ includedir = $(prefix)/include
|
||||||
|
|
||||||
MAKEDEFINES =
|
MAKEDEFINES =
|
||||||
|
|
||||||
CC = @CC@ -g
|
CC = @CC@ -g -DHAVE_LIBTIFF
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CFLAGS = -c $(GCCFLAGS) -I../Headers $(CPPFLAGS)
|
CFLAGS = -c $(GCCFLAGS) -I../Headers $(CPPFLAGS)
|
||||||
|
|
||||||
|
@ -150,7 +150,8 @@ gui/NSWorkspace.h \
|
||||||
gui/TrackingRectangle.h \
|
gui/TrackingRectangle.h \
|
||||||
gui/TypesandConstants.h \
|
gui/TypesandConstants.h \
|
||||||
gui/config.h \
|
gui/config.h \
|
||||||
gui/stdappkit.h
|
gui/stdappkit.h \
|
||||||
|
gui/nsimage-tiff.h
|
||||||
|
|
||||||
GNUSTEP_DPS_HEADERS = dps/NSDPSContext.h \
|
GNUSTEP_DPS_HEADERS = dps/NSDPSContext.h \
|
||||||
dps/DPSOperators.h \
|
dps/DPSOperators.h \
|
||||||
|
@ -221,13 +222,16 @@ NSWindow$(oext) \
|
||||||
NSWorkspace$(oext) \
|
NSWorkspace$(oext) \
|
||||||
Functions$(oext) \
|
Functions$(oext) \
|
||||||
TrackingRectangle$(oext) \
|
TrackingRectangle$(oext) \
|
||||||
LogFile$(oext)
|
LogFile$(oext) \
|
||||||
|
tiff$(oext)
|
||||||
|
|
||||||
OBJS = $(OBJS_WITHOUT_INIT)
|
OBJS = $(OBJS_WITHOUT_INIT)
|
||||||
|
|
||||||
.SUFFIXES: .m
|
.SUFFIXES: .m
|
||||||
.m$(oext):
|
.m$(oext):
|
||||||
$(CC) $(CFLAGS) $<
|
$(CC) $(CFLAGS) $<
|
||||||
|
.c$(oext):
|
||||||
|
$(CC) $(CFLAGS) $<
|
||||||
|
|
||||||
#
|
#
|
||||||
# libraries
|
# libraries
|
||||||
|
|
|
@ -813,7 +813,8 @@ NSString *NSApplicationWillUpdateNotification;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reporting an exception
|
// Reporting an exception
|
||||||
//- (void)reportException:(NSException *)anException
|
- (void)reportException:(NSException *)anException
|
||||||
|
{}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Terminating the application
|
// Terminating the application
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSBitmapImageRep.m
|
NSBitmapImageRep.m
|
||||||
|
|
||||||
Bitmap image representations
|
Bitmap image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -19,188 +19,395 @@
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
If you are interested in a warranty or support for this source code,
|
If you are interested in a warranty or support for this source code,
|
||||||
contact Scott Christley <scottc@net-community.com> for more information.
|
contact Scott Christley <scottc@net-community.com> for more information.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with this library; if not, write to the Free
|
License along with this library; if not, write to the Free
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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
|
||||||
|
|
||||||
//
|
/* Backend protocol - methods that must be implemented by the backend to
|
||||||
// Class methods
|
complete the class */
|
||||||
//
|
@protocol NXBitmapImageRepBackend
|
||||||
+ (void)initialize
|
- (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
|
[NSException raise:NSTIFFException format: @"Read invalid TIFF info"];
|
||||||
[self setVersion:1];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//
|
/* 8-bit RGB will be converted to 24-bit by the tiff routines, so account
|
||||||
// Allocating and Initializing a New NSBitmapImageRep Object
|
for this. */
|
||||||
//
|
space = nil;
|
||||||
+ (id)imageRepWithData:(NSData *)tiffData
|
#ifdef HAVE_LIBTIFF
|
||||||
{
|
switch(info->photoInterp)
|
||||||
return nil;
|
{
|
||||||
}
|
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
|
[self initWithBitmapDataPlanes: NULL
|
||||||
{
|
pixelsWide: info->width
|
||||||
return nil;
|
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;
|
||||||
|
|
||||||
//
|
if (NSTiffRead(imageNumber, image, NULL, [self bitmapData]))
|
||||||
// Producing a TIFF Representation of the Image
|
{
|
||||||
//
|
[NSException raise:NSTIFFException format: @"Read invalid TIFF 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];
|
|
||||||
|
|
||||||
return self;
|
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
|
@end
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
NSCachedImageRep.m
|
NSCachedImageRep.m
|
||||||
|
|
||||||
Description...
|
Cached image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
Date: 1996
|
Date: Feb 1996
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -19,74 +19,101 @@
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
If you are interested in a warranty or support for this source code,
|
If you are interested in a warranty or support for this source code,
|
||||||
contact Scott Christley <scottc@net-community.com> for more information.
|
contact Scott Christley <scottc@net-community.com> for more information.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with this library; if not, write to the Free
|
License along with this library; if not, write to the Free
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
|
Keeps a representation of an image in an off-screen window. If the
|
||||||
|
message initFromWindow:rect: is sent with a nil window, one is created
|
||||||
|
using the rect information.
|
||||||
|
*/
|
||||||
|
#include <Foundation/NSException.h>
|
||||||
|
#include <AppKit/NSCachedImageRep.h>
|
||||||
|
#include <AppKit/NSWindow.h>
|
||||||
|
|
||||||
#include <gnustep/gui/NSCachedImageRep.h>
|
/* Backend protocol - methods that must be implemented by the backend to
|
||||||
|
complete the class */
|
||||||
|
@protocol NXCachedImageRepBackend
|
||||||
|
- (BOOL) draw;
|
||||||
|
@end
|
||||||
|
|
||||||
@implementation NSCachedImageRep
|
@implementation NSCachedImageRep
|
||||||
|
|
||||||
//
|
|
||||||
// Class methods
|
|
||||||
//
|
|
||||||
+ (void)initialize
|
|
||||||
{
|
|
||||||
if (self == [NSCachedImageRep class])
|
|
||||||
{
|
|
||||||
// Initial version
|
|
||||||
[self setVersion:1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initializing an NSCachedImageRep
|
// Initializing an NSCachedImageRep
|
||||||
//
|
- (id) initWithSize: (NSSize)aSize
|
||||||
- (id)initWithSize:(NSSize)aSize
|
depth: (NSWindowDepth)aDepth
|
||||||
depth:(NSWindowDepth)aDepth
|
separate: (BOOL)separate
|
||||||
separate:(BOOL)separate
|
alpha: (BOOL)alpha
|
||||||
alpha:(BOOL)alpha
|
|
||||||
{
|
{
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithWindow:(NSWindow *)aWindow
|
- initWithWindow: (NSWindow *)win rect: (NSRect)rect
|
||||||
rect:(NSRect)aRect
|
|
||||||
{
|
{
|
||||||
return nil;
|
int style = NSClosableWindowMask;
|
||||||
|
|
||||||
|
[super init];
|
||||||
|
|
||||||
|
_window = win;
|
||||||
|
_rect = rect;
|
||||||
|
|
||||||
|
/* Either win or rect must be non-NULL. If rect is empty, we get the
|
||||||
|
frame info from the window. If win is nil we create it from the
|
||||||
|
rect information. */
|
||||||
|
if (NSIsEmptyRect(_rect))
|
||||||
|
{
|
||||||
|
if (!_window)
|
||||||
|
{
|
||||||
|
[NSException raise: NSInvalidArgumentException
|
||||||
|
format: @"Must specify either window or rect when creating NSCachedImageRep"];
|
||||||
|
}
|
||||||
|
|
||||||
|
_rect = [_window frame];
|
||||||
|
}
|
||||||
|
if (!_window)
|
||||||
|
_window = [[NSWindow alloc] initWithContentRect: _rect
|
||||||
|
styleMask: style
|
||||||
|
backing: NSBackingStoreRetained
|
||||||
|
defer: NO];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[_window release];
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Getting the Representation
|
// Getting the Representation
|
||||||
//
|
- (NSRect) rect
|
||||||
- (NSRect)rect
|
|
||||||
{
|
{
|
||||||
return NSZeroRect;
|
return _rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSWindow *)window
|
- (NSWindow *) window
|
||||||
{
|
{
|
||||||
return nil;
|
return _window;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)draw
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// NSCoding protocol
|
// NSCoding protocol
|
||||||
//
|
- (void) encodeWithCoder: aCoder
|
||||||
- (void)encodeWithCoder:aCoder
|
|
||||||
{
|
{
|
||||||
[super encodeWithCoder:aCoder];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- initWithCoder:aDecoder
|
- initWithCoder: aDecoder
|
||||||
{
|
{
|
||||||
[super initWithCoder:aDecoder];
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
/*
|
/*
|
||||||
NSCustomImageRep.m
|
NSCustomImageRep.m
|
||||||
|
|
||||||
Description...
|
Custom image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
|
||||||
Date: 1996
|
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
|
Date: Mar 1996
|
||||||
|
|
||||||
|
This file is part of the GNUstep Application Kit Library.
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public
|
modify it under the terms of the GNU Library General Public
|
||||||
|
@ -19,66 +19,68 @@
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
If you are interested in a warranty or support for this source code,
|
If you are interested in a warranty or support for this source code,
|
||||||
contact Scott Christley <scottc@net-community.com> for more information.
|
contact Scott Christley <scottc@net-community.com> for more information.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with this library; if not, write to the Free
|
License along with this library; if not, write to the Free
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gnustep/gui/NSCustomImageRep.h>
|
#include <AppKit/NSCustomImageRep.h>
|
||||||
|
|
||||||
@implementation NSCustomImageRep
|
@implementation NSCustomImageRep
|
||||||
|
|
||||||
//
|
- (id) initWithDrawSelector: (SEL)aSelector
|
||||||
// Class methods
|
delegate: (id)anObject
|
||||||
//
|
|
||||||
+ (void)initialize
|
|
||||||
{
|
{
|
||||||
if (self == [NSCustomImageRep class])
|
[super init];
|
||||||
{
|
|
||||||
// Initial version
|
/* WARNING: Retaining the delegate may or may not create a cyclic graph */
|
||||||
[self setVersion:1];
|
delegate = [anObject retain];
|
||||||
}
|
selector = aSelector;
|
||||||
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
- (void) dealloc
|
||||||
// Instance methods
|
|
||||||
//
|
|
||||||
|
|
||||||
- (id)initWithDrawSelector:(SEL)aSelector
|
|
||||||
delegate:(id)anObject
|
|
||||||
{
|
{
|
||||||
return nil;
|
[delegate release];
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Identifying the Object
|
// Identifying the Object
|
||||||
//
|
- (id) delegate
|
||||||
- (id)delegate
|
|
||||||
{
|
{
|
||||||
return nil;
|
return delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (SEL)drawSelector
|
- (SEL) drawSelector
|
||||||
{
|
{
|
||||||
return NULL;
|
return selector;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) draw
|
||||||
|
{
|
||||||
|
[delegate perform: selector];
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// NSCoding protocol
|
// NSCoding protocol
|
||||||
//
|
- (void) encodeWithCoder: aCoder
|
||||||
- (void)encodeWithCoder:aCoder
|
|
||||||
{
|
{
|
||||||
[super encodeWithCoder:aCoder];
|
[super encodeWithCoder: aCoder];
|
||||||
|
|
||||||
|
[aCoder encodeObject: delegate];
|
||||||
|
// FIXME: [aCoder encodeSelector: selector];
|
||||||
}
|
}
|
||||||
|
|
||||||
- initWithCoder:aDecoder
|
- initWithCoder: aDecoder
|
||||||
{
|
{
|
||||||
[super initWithCoder:aDecoder];
|
self = [super initWithCoder: aDecoder];
|
||||||
|
|
||||||
|
delegate = [[aDecoder decodeObject] retain];
|
||||||
|
// FIXME: selector = [aDecoder decodeSelector];
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
/*
|
/*
|
||||||
NSEPSImageRep.m
|
NSEPSImageRep.m
|
||||||
|
|
||||||
Description...
|
EPS image representation.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
|
||||||
Date: 1996
|
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
|
Date: Feb 1996
|
||||||
|
|
||||||
|
This file is part of the GNUstep Application Kit Library.
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public
|
modify it under the terms of the GNU Library General Public
|
||||||
|
@ -19,82 +19,63 @@
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
If you are interested in a warranty or support for this source code,
|
If you are interested in a warranty or support for this source code,
|
||||||
contact Scott Christley <scottc@net-community.com> for more information.
|
contact Scott Christley <scottc@net-community.com> for more information.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with this library; if not, write to the Free
|
License along with this library; if not, write to the Free
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gnustep/gui/NSEPSImageRep.h>
|
#include <AppKit/NSEPSImageRep.h>
|
||||||
|
|
||||||
@implementation NSEPSImageRep
|
@implementation NSEPSImageRep
|
||||||
|
|
||||||
//
|
|
||||||
// Class methods
|
|
||||||
//
|
|
||||||
+ (void)initialize
|
|
||||||
{
|
|
||||||
if (self == [NSEPSImageRep class])
|
|
||||||
{
|
|
||||||
// Initial version
|
|
||||||
[self setVersion:1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initializing a New Instance
|
// Initializing a New Instance
|
||||||
//
|
+ (id) imageRepWithData: (NSData *)epsData
|
||||||
+ (id)imageRepWithData:(NSData *)epsData
|
|
||||||
{
|
{
|
||||||
return nil;
|
[self notImplemented: _cmd];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
- (id) initWithData: (NSData *)epsData
|
||||||
|
{
|
||||||
|
[self notImplemented: _cmd];
|
||||||
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Instance methods
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Initializing a New Instance
|
|
||||||
//
|
|
||||||
- (id)initWithData:(NSData *)epsData
|
|
||||||
{
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Getting Image Data
|
// Getting Image Data
|
||||||
//
|
- (NSRect) boundingBox
|
||||||
- (NSRect)boundingBox
|
|
||||||
{
|
{
|
||||||
return NSZeroRect;
|
NSRect rect;
|
||||||
|
[self notImplemented: _cmd];
|
||||||
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSData *)EPSRepresentation
|
- (NSData *) EPSRepresentation
|
||||||
{
|
{
|
||||||
|
[self notImplemented: _cmd];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Drawing the Image
|
// Drawing the Image
|
||||||
//
|
- (void) prepareGState
|
||||||
- (void)prepareGState
|
|
||||||
{}
|
|
||||||
|
|
||||||
//
|
|
||||||
// NSCoding protocol
|
|
||||||
//
|
|
||||||
- (void)encodeWithCoder:aCoder
|
|
||||||
{
|
{
|
||||||
[super encodeWithCoder:aCoder];
|
[self notImplemented: _cmd];
|
||||||
}
|
}
|
||||||
|
|
||||||
- initWithCoder:aDecoder
|
// NSCoding protocol
|
||||||
|
- (void) encodeWithCoder: aCoder
|
||||||
{
|
{
|
||||||
[super initWithCoder:aDecoder];
|
[self notImplemented: _cmd];
|
||||||
|
}
|
||||||
|
|
||||||
|
- initWithCoder: aDecoder
|
||||||
|
{
|
||||||
|
[self notImplemented: _cmd];
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
1003
Source/NSImage.m
1003
Source/NSImage.m
File diff suppressed because it is too large
Load diff
|
@ -1,14 +1,14 @@
|
||||||
/*
|
/*
|
||||||
NSImageRep.m
|
NSImageRep.m
|
||||||
|
|
||||||
Description...
|
Abstract representation of an image.
|
||||||
|
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Author: Scott Christley <scottc@net-community.com>
|
|
||||||
Date: 1996
|
|
||||||
|
|
||||||
This file is part of the GNUstep GUI Library.
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
|
Date: Feb 1996
|
||||||
|
|
||||||
|
This file is part of the GNUstep Application Kit Library.
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public
|
modify it under the terms of the GNU Library General Public
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
If you are interested in a warranty or support for this source code,
|
If you are interested in a warranty or support for this source code,
|
||||||
contact Scott Christley <scottc@net-community.com> for more information.
|
contact Scott Christley <scottc@net-community.com> for more information.
|
||||||
|
|
||||||
|
@ -28,206 +28,369 @@
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gnustep/gui/NSImageRep.h>
|
#include <string.h>
|
||||||
|
#include <Foundation/NSArray.h>
|
||||||
|
#include <Foundation/NSData.h>
|
||||||
|
#include <Foundation/NSNotification.h>
|
||||||
|
#include <AppKit/NSImageRep.h>
|
||||||
|
#include <AppKit/NSBitmapImageRep.h>
|
||||||
|
#include <AppKit/NSEPSImageRep.h>
|
||||||
|
|
||||||
// NSImageRep notifications
|
// NSImageRep notifications
|
||||||
NSString *NSImageRepRegistryChangedNotification;
|
NSString *NSImageRepRegistryChangedNotification;
|
||||||
|
|
||||||
|
/* Backend protocol - methods that must be implemented by the backend to
|
||||||
|
complete the class */
|
||||||
|
@protocol NXImageRepBackend
|
||||||
|
- (BOOL) drawAtPoint: (NSPoint)aPoint;
|
||||||
|
- (BOOL) drawInRect: (NSRect)aRect;
|
||||||
|
@end
|
||||||
|
|
||||||
|
static NSMutableArray* imageReps = NULL;
|
||||||
|
|
||||||
|
/* Get the extension from a name */
|
||||||
|
static NSString *
|
||||||
|
extension(NSString *name)
|
||||||
|
{
|
||||||
|
/* Waiting for NSString to be complete */
|
||||||
|
#if 0
|
||||||
|
return [name pathExtension];
|
||||||
|
#else
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = strrchr([name cString], '.');
|
||||||
|
if (s > strrchr([name cString], '/'))
|
||||||
|
return [NSString stringWithCString:s+1];
|
||||||
|
else
|
||||||
|
return nil;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
@implementation NSImageRep
|
@implementation NSImageRep
|
||||||
|
|
||||||
//
|
+ (void) initialize
|
||||||
// Class methods
|
|
||||||
//
|
|
||||||
+ (void)initialize
|
|
||||||
{
|
{
|
||||||
if (self == [NSImageRep class])
|
/* While there are four imageRep subclasses, in practice, only two of
|
||||||
{
|
them can load in data from an external source. */
|
||||||
// Initial version
|
imageReps = [[NSMutableArray alloc] initWithCapacity: 2];
|
||||||
[self setVersion:1];
|
[imageReps addObject: [NSBitmapImageRep class]];
|
||||||
}
|
[imageReps addObject: [NSEPSImageRep class]];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Creating an NSImageRep
|
// Creating an NSImageRep
|
||||||
//
|
+ (id) imageRepWithContentsOfFile: (NSString *)filename
|
||||||
+ (id)imageRepWithContentsOfFile:(NSString *)filename
|
|
||||||
{
|
{
|
||||||
|
NSArray* array;
|
||||||
|
|
||||||
|
array = [self imageRepsWithContentsOfFile: filename];
|
||||||
|
if ([array count])
|
||||||
|
return [array objectAtIndex: 0];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imageRepsWithContentsOfFile:(NSString *)filename
|
+ (NSArray *) imageRepsWithContentsOfFile: (NSString *)filename
|
||||||
{
|
{
|
||||||
|
int i, count;
|
||||||
|
NSString* ext;
|
||||||
|
NSMutableArray* array;
|
||||||
|
|
||||||
|
ext = extension(filename);
|
||||||
|
// FIXME: Should this be an exception? Should we even check this?
|
||||||
|
if (!ext)
|
||||||
|
return nil;
|
||||||
|
array = [NSMutableArray arrayWithCapacity:1];
|
||||||
|
|
||||||
|
count = [imageReps count];
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
Class rep = [imageReps objectAtIndex: i];
|
||||||
|
if ([[rep imageFileTypes] indexOfObject: ext] != NSNotFound)
|
||||||
|
{
|
||||||
|
NSData* data = [NSData dataWithContentsOfFile: filename];
|
||||||
|
if ([rep class] == [NSBitmapImageRep class])
|
||||||
|
[array addObject: [rep imageRepWithData: data]];
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
if ([rep respondsToSelector: @selector(imageFileTypes)]
|
||||||
|
&& [[rep imageFileTypes] indexOfObject: ext] != NSNotFound)
|
||||||
|
{
|
||||||
|
NSData* data = [NSData dataWithContentsOfFile: filename];
|
||||||
|
if ([rep respondsToSelector: @selector(imageRepsWithData:)])
|
||||||
|
[array addObjectsFromArray: [rep imageRepsWithData: data]];
|
||||||
|
else if ([rep respondsToSelector: @selector(imageRepWithData:)])
|
||||||
|
[array addObject: [rep imageRepWithData: data]];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return (NSArray *)array;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (id) imageRepWithPasteboard: (NSPasteboard *)pasteboard
|
||||||
|
{
|
||||||
|
NSArray* array;
|
||||||
|
|
||||||
|
array = [self imageRepsWithPasteboard: pasteboard];
|
||||||
|
if ([array count])
|
||||||
|
return [array objectAtIndex: 0];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (id)imageRepWithPasteboard:(NSPasteboard *)pasteboard
|
+ (NSArray *) imageRepsWithPasteboard: (NSPasteboard *)pasteboard
|
||||||
{
|
{
|
||||||
return nil;
|
int i, count;
|
||||||
|
NSMutableArray* array;
|
||||||
|
|
||||||
|
array = [NSMutableArray arrayWithCapacity:1];
|
||||||
|
|
||||||
|
count = [imageReps count];
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
NSString* ptype;
|
||||||
|
Class rep = [imageReps objectAtIndex: i];
|
||||||
|
if ([rep respondsToSelector: @selector(imagePasteboardTypes)]
|
||||||
|
&& (ptype =
|
||||||
|
[pasteboard availableTypeFromArray:[rep imagePasteboardTypes]]))
|
||||||
|
{
|
||||||
|
NSData* data = [pasteboard dataForType: ptype];
|
||||||
|
if ([rep respondsToSelector: @selector(imageRepsWithData:)])
|
||||||
|
[array addObjectsFromArray: [rep imageRepsWithData: data]];
|
||||||
|
else if ([rep respondsToSelector: @selector(imageRepWithData:)])
|
||||||
|
[array addObject: [rep imageRepWithData: data]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (NSArray *)array;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imageRepsWithPasteboard:(NSPasteboard *)pasteboard
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
return nil;
|
[colorSpace release];
|
||||||
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Checking Data Types
|
// Checking Data Types
|
||||||
//
|
+ (BOOL) canInitWithData: (NSData *)data
|
||||||
+ (BOOL)canInitWithData:(NSData *)data
|
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)canInitWithPasteboard:(NSPasteboard *)pasteboard
|
+ (BOOL) canInitWithPasteboard: (NSPasteboard *)pasteboard
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imageFileTypes
|
+ (NSArray *) imageFileTypes
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imagePasteboardTypes
|
+ (NSArray *) imagePasteboardTypes
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imageUnfilteredFileTypes
|
+ (NSArray *) imageUnfilteredFileTypes
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)imageUnfilteredPasteboardTypes
|
+ (NSArray *) imageUnfilteredPasteboardTypes
|
||||||
{
|
{
|
||||||
|
/* Subclass responsibility */
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Managing NSImageRep Subclasses
|
|
||||||
//
|
|
||||||
+ (Class)imageRepClassForData:(NSData *)data
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (Class)imageRepClassForFileType:(NSString *)type
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (Class)imageRepClassForPasteboardType:(NSString *)type
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)registerImageRepClass:(Class)imageRepClass
|
|
||||||
{}
|
|
||||||
|
|
||||||
+ (NSArray *)registeredImageRepClasses
|
|
||||||
{
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)unregisterImageRepClass:(Class)imageRepClass
|
|
||||||
{}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Instance methods
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Setting the Size of the Image
|
// Setting the Size of the Image
|
||||||
//
|
- (void) setSize: (NSSize)aSize
|
||||||
- (void)setSize:(NSSize)aSize
|
|
||||||
{}
|
|
||||||
|
|
||||||
- (NSSize)size
|
|
||||||
{
|
{
|
||||||
return NSZeroSize;
|
size = aSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSSize) size
|
||||||
|
{
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Specifying Information about the Representation
|
// Specifying Information about the Representation
|
||||||
//
|
- (int) bitsPerSample
|
||||||
- (int)bitsPerSample
|
|
||||||
{
|
{
|
||||||
return 0;
|
return bitsPerSample;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)colorSpaceName
|
- (NSString *) colorSpaceName
|
||||||
{
|
{
|
||||||
return nil;
|
return colorSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)hasAlpha
|
- (BOOL) hasAlpha
|
||||||
{
|
{
|
||||||
return NO;
|
return hasAlpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)isOpaque
|
- (BOOL) isOpaque
|
||||||
{
|
{
|
||||||
return NO;
|
return isOpaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int)pixelsHigh
|
- (int) pixelsWide
|
||||||
{
|
{
|
||||||
return 0;
|
return _pixelsWide;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int)pixelsWide
|
- (int) pixelsHigh
|
||||||
{
|
{
|
||||||
return 0;
|
return _pixelsHigh;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setAlpha:(BOOL)flag
|
- (void) setAlpha: (BOOL)flag
|
||||||
{}
|
{
|
||||||
|
hasAlpha = flag;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setBitsPerSample:(int)anInt
|
- (void) setBitsPerSample: (int)anInt
|
||||||
{}
|
{
|
||||||
|
bitsPerSample = anInt;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setColorSpaceName:(NSString *)aString
|
- (void) setColorSpaceName: (NSString *)aString
|
||||||
{}
|
{
|
||||||
|
[colorSpace autorelease];
|
||||||
|
colorSpace = [aString retain];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setOpaque:(BOOL)flag
|
- (void) setOpaque: (BOOL)flag
|
||||||
{}
|
{
|
||||||
|
isOpaque = flag;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setPixelsHigh:(int)anInt
|
- (void) setPixelsWide: (int)anInt
|
||||||
{}
|
{
|
||||||
|
_pixelsWide = anInt;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setPixelsWide:(int)anInt
|
- (void) setPixelsHigh: (int)anInt
|
||||||
{}
|
{
|
||||||
|
_pixelsHigh = anInt;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Drawing the Image
|
// Drawing the Image
|
||||||
//
|
- (BOOL) draw
|
||||||
- (BOOL)draw
|
{
|
||||||
|
[self subclassResponsibility: _cmd];
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) drawAtPoint: (NSPoint)aPoint
|
||||||
{
|
{
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)drawAtPoint:(NSPoint)aPoint
|
- (BOOL) drawInRect: (NSRect)aRect
|
||||||
{
|
{
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)drawInRect:(NSRect)aRect
|
// Managing NSImageRep Subclasses
|
||||||
|
+ (Class) imageRepClassForData: (NSData *)data
|
||||||
{
|
{
|
||||||
return NO;
|
int i, count;
|
||||||
|
|
||||||
|
count = [imageReps count];
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
Class rep = [imageReps objectAtIndex: i];
|
||||||
|
if ([rep canInitWithData: data])
|
||||||
|
return rep;
|
||||||
|
}
|
||||||
|
return Nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (Class) imageRepClassForFileType: (NSString *)type
|
||||||
|
{
|
||||||
|
int i, count;
|
||||||
|
|
||||||
|
count = [imageReps count];
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
Class rep = [imageReps objectAtIndex: i];
|
||||||
|
if ([rep respondsToSelector: @selector(imageFileTypes)]
|
||||||
|
&& [[rep imageFileTypes] indexOfObject: type] != NSNotFound)
|
||||||
|
{
|
||||||
|
return rep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (Class) imageRepClassForPasteboardType: (NSString *)type
|
||||||
|
{
|
||||||
|
int i, count;
|
||||||
|
|
||||||
|
count = [imageReps count];
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
Class rep = [imageReps objectAtIndex: i];
|
||||||
|
if ([rep respondsToSelector: @selector(imagePasteboardTypes)]
|
||||||
|
&& ([[rep imagePasteboardTypes] indexOfObject: type] != NSNotFound))
|
||||||
|
{
|
||||||
|
return rep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void) registerImageRepClass: (Class)imageRepClass
|
||||||
|
{
|
||||||
|
[imageReps addObject: imageRepClass];
|
||||||
|
[[NSNotificationCenter defaultCenter]
|
||||||
|
postNotificationName: NSImageRepRegistryChangedNotification
|
||||||
|
object: self];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSArray *) registeredImageRepClasses
|
||||||
|
{
|
||||||
|
return (NSArray *)imageReps;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void) unregisterImageRepClass: (Class)imageRepClass
|
||||||
|
{
|
||||||
|
[imageReps removeObject: imageRepClass];
|
||||||
|
[[NSNotificationCenter defaultCenter]
|
||||||
|
postNotificationName: NSImageRepRegistryChangedNotification
|
||||||
|
object: self];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// NSCoding protocol
|
// NSCoding protocol
|
||||||
//
|
- (void) encodeWithCoder: aCoder
|
||||||
- (void)encodeWithCoder:aCoder
|
|
||||||
{
|
{
|
||||||
[super encodeWithCoder:aCoder];
|
[super encodeWithCoder: aCoder];
|
||||||
|
|
||||||
|
[aCoder encodeObject: colorSpace];
|
||||||
|
[aCoder encodeSize: size];
|
||||||
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &hasAlpha];
|
||||||
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &isOpaque];
|
||||||
|
[aCoder encodeValueOfObjCType: @encode(int) at: &bitsPerSample];
|
||||||
|
[aCoder encodeValueOfObjCType: @encode(int) at: &_pixelsWide];
|
||||||
|
[aCoder encodeValueOfObjCType: @encode(int) at: &_pixelsHigh];
|
||||||
}
|
}
|
||||||
|
|
||||||
- initWithCoder:aDecoder
|
- initWithCoder: aDecoder
|
||||||
{
|
{
|
||||||
[super initWithCoder:aDecoder];
|
self = [super initWithCoder: aDecoder];
|
||||||
|
|
||||||
|
colorSpace = [[aDecoder decodeObject] retain];
|
||||||
|
size = [aDecoder decodeSize];
|
||||||
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &hasAlpha];
|
||||||
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &isOpaque];
|
||||||
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &bitsPerSample];
|
||||||
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &_pixelsWide];
|
||||||
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &_pixelsHigh];
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,10 @@ NSString *NSWindowWillMoveNotification;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Screens and window depths
|
// Screens and window depths
|
||||||
//+ (NSWindowDepth)defaultDepthLimit
|
+ (NSWindowDepth)defaultDepthLimit
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Instance methods
|
// Instance methods
|
||||||
|
@ -630,13 +633,36 @@ NSString *NSWindowWillMoveNotification;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Screens and window depths
|
// Screens and window depths
|
||||||
//- (BOOL)canStoreColor;
|
- (BOOL)canStoreColor
|
||||||
//- (NSScreen *)deepestScreen;
|
{
|
||||||
//- (NSWindowDepth)depthLimit;
|
return YES;
|
||||||
//- (BOOL)hasDynamicDepthLimit;
|
}
|
||||||
//- (NSScreen *)screen;
|
|
||||||
//- (void)setDepthLimit:(NSWindowDepth)limit;
|
- (NSScreen *)deepestScreen
|
||||||
//- (void)setDynamicDepthLimit:(BOOL)flag;
|
{
|
||||||
|
return [NSScreen deepestScreen];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSWindowDepth)depthLimit
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)hasDynamicDepthLimit
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSScreen *)screen
|
||||||
|
{
|
||||||
|
return [NSScreen mainScreen];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setDepthLimit:(NSWindowDepth)limit
|
||||||
|
{}
|
||||||
|
|
||||||
|
- (void)setDynamicDepthLimit:(BOOL)flag
|
||||||
|
{}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cursor management
|
// Cursor management
|
||||||
|
|
474
Source/tiff.c
Normal file
474
Source/tiff.c
Normal file
|
@ -0,0 +1,474 @@
|
||||||
|
/* tiff - Functions for dealing with tiff images
|
||||||
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Adam Fedor <fedor@colorado.edu>
|
||||||
|
Date: Feb 1996
|
||||||
|
|
||||||
|
This file is part of the GNUstep Application Kit Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Code in NSTiffRead, NSTiffGetInfo, and NSTiffGetColormap
|
||||||
|
is derived from tif_getimage, by Sam Leffler. See the copyright below.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1991, 1992, 1993, 1994 Sam Leffler
|
||||||
|
* Copyright (c) 1991, 1992, 1993, 1994 Silicon Graphics, Inc.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this software and
|
||||||
|
* its documentation for any purpose is hereby granted without fee, provided
|
||||||
|
* that (i) the above copyright notices and this permission notice appear in
|
||||||
|
* all copies of the software and related documentation, and (ii) the names of
|
||||||
|
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||||
|
* publicity relating to the software without the specific, prior written
|
||||||
|
* permission of Sam Leffler and Silicon Graphics.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||||
|
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||||
|
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||||
|
* OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h> /* for L_SET, etc definitions */
|
||||||
|
#include <gnustep/base/objc-malloc.h>
|
||||||
|
#include <AppKit/nsimage-tiff.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* data;
|
||||||
|
long size;
|
||||||
|
long position;
|
||||||
|
const char* mode;
|
||||||
|
realloc_data_callback* realloc_data;
|
||||||
|
} chandle_t;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBTIFF
|
||||||
|
|
||||||
|
/* Client functions that provide reading/writing of data for libtiff */
|
||||||
|
static tsize_t
|
||||||
|
TiffHandleRead(thandle_t handle, tdata_t buf, toff_t count)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
printf("TiffHandleRead\n");
|
||||||
|
if (chand->position >= chand->size)
|
||||||
|
return 0;
|
||||||
|
if (chand->position + count > chand->size)
|
||||||
|
count = chand->size - chand->position;
|
||||||
|
memcpy(buf, chand->data + chand->position, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static tsize_t
|
||||||
|
TiffHandleWrite(thandle_t handle, tdata_t buf, toff_t count)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
printf("TiffHandleWrite\n");
|
||||||
|
if (chand->mode == "r")
|
||||||
|
return 0;
|
||||||
|
if (chand->position + count > chand->size)
|
||||||
|
{
|
||||||
|
if (chand->realloc_data == NULL)
|
||||||
|
return 0;
|
||||||
|
chand->size = chand->position + count + 1;
|
||||||
|
chand->data = chand->realloc_data(chand->data, chand->size);
|
||||||
|
if (chand->data == NULL)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memcpy(chand->data + chand->position, buf, count);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static toff_t
|
||||||
|
TiffHandleSeek(thandle_t handle, toff_t offset, int mode)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
printf("TiffHandleSeek\n");
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case SEEK_SET: chand->position = offset; break;
|
||||||
|
case SEEK_CUR: chand->position += offset; break;
|
||||||
|
case SEEK_END:
|
||||||
|
if (offset > 0 && chand->mode == "r")
|
||||||
|
return 0;
|
||||||
|
chand->position += offset; break;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return chand->position;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
TiffHandleClose(thandle_t handle)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
|
||||||
|
printf("TiffHandleClose\n");
|
||||||
|
/* Presumably, we don't need the handle anymore */
|
||||||
|
OBJC_FREE(chand);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static toff_t
|
||||||
|
TiffHandleSize(thandle_t handle)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
printf("TiffHandleSize\n");
|
||||||
|
return chand->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
TiffHandleMap(thandle_t handle, tdata_t* data, toff_t* size)
|
||||||
|
{
|
||||||
|
chandle_t* chand = (chandle_t *)handle;
|
||||||
|
|
||||||
|
printf("TiffHandleMap\n");
|
||||||
|
*data = chand->data;
|
||||||
|
*size = chand->size;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
TiffHandleUnmap(thandle_t handle, tdata_t data, toff_t size)
|
||||||
|
{
|
||||||
|
printf("TiffHandleUnmap\n");
|
||||||
|
/* Nothing to unmap. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open a tiff from a stream. Returns NULL if can't read tiff information. */
|
||||||
|
TIFF*
|
||||||
|
NSTiffOpenData(char* data, long size, const char* mode,
|
||||||
|
realloc_data_callback* realloc_data)
|
||||||
|
{
|
||||||
|
chandle_t* handle;
|
||||||
|
printf("NSTiffOpenData\n");
|
||||||
|
OBJC_MALLOC(handle, chandle_t, 1);
|
||||||
|
handle->data = data;
|
||||||
|
handle->position = 0;
|
||||||
|
handle->size = size;
|
||||||
|
handle->mode = mode;
|
||||||
|
handle->realloc_data = realloc_data;
|
||||||
|
return TIFFClientOpen("NSData", mode,
|
||||||
|
(thandle_t)handle,
|
||||||
|
TiffHandleRead, TiffHandleWrite,
|
||||||
|
TiffHandleSeek, TiffHandleClose,
|
||||||
|
TiffHandleSize,
|
||||||
|
TiffHandleMap, TiffHandleUnmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
NSTiffClose(TIFF* image)
|
||||||
|
{
|
||||||
|
TIFFClose(image);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read some information about the image. Note that currently we don't
|
||||||
|
determine numImages. */
|
||||||
|
NSTiffInfo *
|
||||||
|
NSTiffGetInfo(int imageNumber, TIFF* image)
|
||||||
|
{
|
||||||
|
NSTiffInfo* info;
|
||||||
|
|
||||||
|
if (imageNumber >= 0 && !TIFFSetDirectory(image, imageNumber))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBJC_MALLOC(info, NSTiffInfo, 1);
|
||||||
|
memset(info, 0, sizeof(NSTiffInfo));
|
||||||
|
if (imageNumber >= 0)
|
||||||
|
info->imageNumber = imageNumber;
|
||||||
|
|
||||||
|
TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &info->width);
|
||||||
|
TIFFGetField(image, TIFFTAG_IMAGELENGTH, &info->height);
|
||||||
|
TIFFGetField(image, TIFFTAG_COMPRESSION, &info->compression);
|
||||||
|
TIFFGetField(image, TIFFTAG_SUBFILETYPE, &info->subfileType);
|
||||||
|
|
||||||
|
/* If the following tags aren't present then use the TIFF defaults. */
|
||||||
|
TIFFGetFieldDefaulted(image, TIFFTAG_BITSPERSAMPLE, &info->bitsPerSample);
|
||||||
|
TIFFGetFieldDefaulted(image, TIFFTAG_SAMPLESPERPIXEL,
|
||||||
|
&info->samplesPerPixel);
|
||||||
|
TIFFGetFieldDefaulted(image, TIFFTAG_PLANARCONFIG,
|
||||||
|
&info->planarConfig);
|
||||||
|
|
||||||
|
/* If TIFFTAG_PHOTOMETRIC is not present then assign a reasonable default.
|
||||||
|
The TIFF 5.0 specification doesn't give a default. */
|
||||||
|
if (!TIFFGetField(image, TIFFTAG_PHOTOMETRIC, &info->photoInterp))
|
||||||
|
{
|
||||||
|
switch (info->samplesPerPixel)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
info->photoInterp = PHOTOMETRIC_MINISBLACK;
|
||||||
|
break;
|
||||||
|
case 3: case 4:
|
||||||
|
info->photoInterp = PHOTOMETRIC_RGB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
TIFFError(TIFFFileName(image),
|
||||||
|
"Missing needed \"PhotometricInterpretation\" tag");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
TIFFError(TIFFFileName(image),
|
||||||
|
"No \"PhotometricInterpretation\" tag, assuming %s\n",
|
||||||
|
info->photoInterp == PHOTOMETRIC_RGB ? "RGB" : "min-is-black");
|
||||||
|
}
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define READ_SCANLINE(sample) \
|
||||||
|
if ( TIFFReadScanline( image, buf, row, sample ) < 0 ) { \
|
||||||
|
fprintf(stderr, "tiff: bad data read on line %d\n", row ); \
|
||||||
|
error = 1; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
inP = buf;
|
||||||
|
|
||||||
|
/* Read an image into a data array. The data array is assumed to have been
|
||||||
|
already allocated to the correct size.
|
||||||
|
|
||||||
|
Note that palette images are implicitly coverted to 24-bit contig
|
||||||
|
direct color images. Thus the data array should be large
|
||||||
|
enough to hold this information. */
|
||||||
|
int
|
||||||
|
NSTiffRead(int imageNumber, TIFF* image, NSTiffInfo* info, char* data)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int row, col;
|
||||||
|
int maxval;
|
||||||
|
int size;
|
||||||
|
int line;
|
||||||
|
int error = 0;
|
||||||
|
u_char* inP;
|
||||||
|
u_char* outP;
|
||||||
|
u_char* buf;
|
||||||
|
u_char* raster;
|
||||||
|
NSTiffInfo* newinfo;
|
||||||
|
NSTiffColormap* map;
|
||||||
|
int scan_line_size;
|
||||||
|
|
||||||
|
if (data == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Make sure we're at the right image */
|
||||||
|
if ((newinfo = NSTiffGetInfo(imageNumber, image)) == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (info)
|
||||||
|
memcpy(info, newinfo, sizeof(NSTiffInfo));
|
||||||
|
|
||||||
|
map = NULL;
|
||||||
|
if ( newinfo->photoInterp == PHOTOMETRIC_PALETTE)
|
||||||
|
{
|
||||||
|
map = NSTiffGetColormap(image);
|
||||||
|
if (!map)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxval = ( 1 << newinfo->bitsPerSample ) - 1;
|
||||||
|
line = ceil((float)newinfo->width * newinfo->bitsPerSample / 8.0);
|
||||||
|
size = ceil((float)line * newinfo->height * newinfo->samplesPerPixel );
|
||||||
|
scan_line_size = TIFFScanlineSize(image);
|
||||||
|
OBJC_MALLOC(buf, u_char, TIFFScanlineSize(image));
|
||||||
|
|
||||||
|
raster = (u_char *)data;
|
||||||
|
outP = raster;
|
||||||
|
switch ( newinfo->photoInterp )
|
||||||
|
{
|
||||||
|
case PHOTOMETRIC_MINISBLACK:
|
||||||
|
case PHOTOMETRIC_MINISWHITE:
|
||||||
|
if (newinfo->planarConfig == PLANARCONFIG_CONTIG)
|
||||||
|
{
|
||||||
|
for ( row = 0; row < newinfo->height; ++row )
|
||||||
|
{
|
||||||
|
READ_SCANLINE(0)
|
||||||
|
for ( col = 0; col < line*newinfo->samplesPerPixel; col++)
|
||||||
|
*outP++ = *inP++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < newinfo->samplesPerPixel; i++)
|
||||||
|
for ( row = 0; row < newinfo->height; ++row )
|
||||||
|
{
|
||||||
|
READ_SCANLINE(i)
|
||||||
|
for ( col = 0; col < line; col++)
|
||||||
|
*outP++ = *inP++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PHOTOMETRIC_PALETTE:
|
||||||
|
{
|
||||||
|
for ( row = 0; row < newinfo->height; ++row )
|
||||||
|
{
|
||||||
|
READ_SCANLINE(0)
|
||||||
|
for ( col = 0; col < newinfo->width; col++)
|
||||||
|
{
|
||||||
|
*outP++ = map->red[*inP] / 256;
|
||||||
|
*outP++ = map->green[*inP] / 256;
|
||||||
|
*outP++ = map->blue[*inP] / 256;
|
||||||
|
inP++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(map->red);
|
||||||
|
free(map->green);
|
||||||
|
free(map->blue);
|
||||||
|
free(map);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PHOTOMETRIC_RGB:
|
||||||
|
if (newinfo->planarConfig == PLANARCONFIG_CONTIG)
|
||||||
|
{
|
||||||
|
for ( row = 0; row < newinfo->height; ++row )
|
||||||
|
{
|
||||||
|
READ_SCANLINE(0)
|
||||||
|
for ( col = 0; col < newinfo->width; col++)
|
||||||
|
for (i = 0; i < newinfo->samplesPerPixel; i++)
|
||||||
|
*outP++ = *inP++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < newinfo->samplesPerPixel; i++)
|
||||||
|
for ( row = 0; row < newinfo->height; ++row )
|
||||||
|
{
|
||||||
|
READ_SCANLINE(i)
|
||||||
|
for ( col = 0; col < newinfo->width; col++)
|
||||||
|
*outP++ = *inP++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
TIFFError(TIFFFileName(image),
|
||||||
|
"Can't read photometric %d", newinfo->photoInterp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBJC_FREE(newinfo);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
NSWriteTiff(TIFF* image, NSTiffInfo* info, char* data)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Many programs get TIFF colormaps wrong. They use 8-bit colormaps
|
||||||
|
instead of 16-bit colormaps. This function is a heuristic to
|
||||||
|
detect and correct this. */
|
||||||
|
static int
|
||||||
|
CheckAndCorrectColormap(NSTiffColormap* map)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for (i = 0; i < map->size; i++)
|
||||||
|
if ((map->red[i] > 255)||(map->green[i] > 255)||(map->blue[i] > 255))
|
||||||
|
return 16;
|
||||||
|
|
||||||
|
#define CVT(x) (((x) * 255) / ((1L<<16)-1))
|
||||||
|
for (i = 0; i < map->size; i++)
|
||||||
|
{
|
||||||
|
map->red[i] = CVT(map->red[i]);
|
||||||
|
map->green[i] = CVT(map->green[i]);
|
||||||
|
map->blue[i] = CVT(map->blue[i]);
|
||||||
|
}
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gets the colormap for the image if there is one. Returns a
|
||||||
|
NSTiffColormap if one was found.
|
||||||
|
*/
|
||||||
|
NSTiffColormap *
|
||||||
|
NSTiffGetColormap(TIFF* image)
|
||||||
|
{
|
||||||
|
NSTiffInfo* info;
|
||||||
|
NSTiffColormap* map;
|
||||||
|
|
||||||
|
/* Re-read the tiff information. We pass -1 as the image number which
|
||||||
|
means just read the current image. */
|
||||||
|
info = NSTiffGetInfo(-1, image);
|
||||||
|
if (info->photoInterp != PHOTOMETRIC_PALETTE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
OBJC_MALLOC(map, NSTiffColormap, 1);
|
||||||
|
map->size = 1 << info->bitsPerSample;
|
||||||
|
|
||||||
|
if (!TIFFGetField(image, TIFFTAG_COLORMAP,
|
||||||
|
&map->red, &map->green, &map->blue))
|
||||||
|
{
|
||||||
|
TIFFError(TIFFFileName(image), "Missing required \"Colormap\" tag");
|
||||||
|
OBJC_FREE(map);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (CheckAndCorrectColormap(map) == 8)
|
||||||
|
TIFFWarning(TIFFFileName(image), "Assuming 8-bit colormap");
|
||||||
|
|
||||||
|
free(info);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* HAVE_LIBTIFF */
|
||||||
|
|
||||||
|
TIFF*
|
||||||
|
NSTiffOpenData(char* data, long size, const char* mode,
|
||||||
|
realloc_data_callback* realloc_data)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
NSTiffClose(TIFF* image)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSTiffInfo *
|
||||||
|
NSTiffGetInfo(int imageNumber, TIFF* image)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
NSTiffRead(int imageNumber, TIFF* image, NSTiffInfo* info, char* data)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
NSTiffWrite(TIFF* image, NSTiffInfo* info, char* data)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSTiffColormap *
|
||||||
|
NSTiffGetColormap(TIFF* image)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* not HAVE_LIBTIFF */
|
Loading…
Add table
Add a link
Reference in a new issue