xref: /haiku/src/add-ons/translators/sgi/SGIImage.h (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
1 /*****************************************************************************/
2 // SGITranslator
3 // Written by Stephan Aßmus <stippi@yellowbites.com>
4 // derived from GIMP SGI plugin by Michael Sweet
5 //
6 // SGIImage.h
7 //
8 // SGI image file format library routines.
9 //
10 // Formed into a class SGIImage, adopted to Be API and modified to use
11 // BPositionIO, optimizations for buffered reading.
12 //
13 //
14 // Copyright (c) 2003 Haiku Project
15 // Portions Copyright 1997-1998 Michael Sweet (mike@easysw.com)
16 //
17 // Permission is hereby granted, free of charge, to any person obtaining a
18 // copy of this software and associated documentation files (the "Software"),
19 // to deal in the Software without restriction, including without limitation
20 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
21 // and/or sell copies of the Software, and to permit persons to whom the
22 // Software is furnished to do so, subject to the following conditions:
23 //
24 // The above copyright notice and this permission notice shall be included
25 // in all copies or substantial portions of the Software.
26 //
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
28 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
30 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
33 // DEALINGS IN THE SOFTWARE.
34 /*****************************************************************************/
35 
36 /*
37  * "$Id: SGIImage.h 14449 2005-10-20 12:15:56Z stippi $"
38  *
39  * Revision History:
40  *
41  *	 $Log: SGIImage.h,v $
42  *	 Revision 1.2  2004/02/03 00:52:18  mwilber
43  *	 Removed GPL text as permission was obtained from Michael Sweet to allow this derivative work to be distributed under the MIT License.
44  *
45  *	 Revision 1.1  2004/02/02 23:55:38  mwilber
46  *	 Initial check in for Stephan Assmus' SGITranslator
47  *
48  *	 Revision 1.5	1998/05/17 16:01:33	mike
49  *	 Added <unistd.h> header file.
50  *
51  *	 Revision 1.4	1998/04/23	17:40:49	mike
52  *	 Updated to support 16-bit <unsigned> image data.
53  *
54  *	 Revision 1.3	1998/02/05	17:10:58	mike
55  *	 Added sgiOpenFile() function for opening an existing file pointer.
56  *
57  *	 Revision 1.2	1997/06/18	00:55:28	mike
58  *	 Updated to hold length table when writing.
59  *	 Updated to hold current length when doing ARLE.
60  *
61  *	 Revision 1.1	1997/06/15	03:37:19	mike
62  *	 Initial revision
63  */
64 
65 #ifndef SGI_IMAGE_H
66 #define SGI_IMAGE_H
67 
68 #include <DataIO.h>
69 #include <InterfaceDefs.h>
70 
71 #define SGI_MAGIC		474	// magic number in image file
72 
73 #define SGI_READ		0	// read from an SGI image file
74 #define SGI_WRITE		1	// write to an SGI image file
75 
76 #define SGI_COMP_NONE	0	// no compression
77 #define SGI_COMP_RLE	1	// run-length encoding
78 #define SGI_COMP_ARLE	2	// agressive run-length encoding
79 
80 extern const char kSGICopyright[];
81 
82 class SGIImage {
83  public:
84 								SGIImage();
85 	virtual						~SGIImage();
86 
87 			// not really necessary, SetTo() will return an error anyways
88 			status_t			InitCheck() const;
89 
90 			// first version -> read from an existing sgi image in stream
91 			status_t			SetTo(BPositionIO* stream);
92 			// second version -> set up a stream for writing an sgi image;
93 			// when SetTo() returns, the image header will have been written
94 			// already
95 			status_t			SetTo(BPositionIO* stream,
96 									  uint16 width, uint16 height,
97 									  uint16 channels, uint32 bytesPerChannel,
98 									  uint32 compression);
99 			// has to be called if writing, writes final information to the stream
100 			status_t			Unset();
101 
102 			// access to each row of image data
103 			status_t			ReadRow(void* row, int32 lineNum, int32 channel);
104 			// write one row of image data
105 			// right now, could be used to modify an image in place, but only
106 			// if dealing with uncompressed data, compressed data is currently
107 			// not supported
108 			status_t			WriteRow(void* row, int32 lineNum, int32 channel);
109 
110 			// access to the attributes of the sgi image
Width()111 			uint16				Width() const
112 									{ return fWidth; }
Height()113 			uint16				Height() const
114 									{ return fHeight; }
BytesPerChannel()115 			uint32				BytesPerChannel() const
116 									{ return fBytesPerChannel; }
CountChannels()117 			uint32				CountChannels() const
118 									{ return fChannelCount; }
119 
120  private:
121 			int32				_ReadLong() const;
122 			int16				_ReadShort() const;
123 			int8				_ReadChar() const;
124 			status_t			_WriteLong(int32 n) const;
125 			status_t			_WriteShort(uint16 n) const;
126 			status_t			_WriteChar(int8 n) const;
127 
128 			ssize_t				_ReadRLE8(uint8* row, int32 numPixels) const;
129 			ssize_t				_ReadRLE8(uint8* row, uint8* rleBuffer, int32 numPixels) const;
130 			ssize_t				_ReadRLE16(uint16* row, int32 numPixels) const;
131 			ssize_t				_ReadRLE16(uint16* row, uint16* rleBuffer, int32 numPixels) const;
132 			ssize_t				_WriteRLE8(uint8* row, int32 numPixels) const;
133 			ssize_t				_WriteRLE16(uint16* row, int32 numPixels) const;
134 
135 
136 	BPositionIO*				fStream;
137 
138 	uint32						fMode;				// reading or writing
139 	uint32						fBytesPerChannel;
140 	uint32						fCompression;
141 
142 	uint16						fWidth;				// in number of pixels
143 	uint16						fHeight;			// in number of pixels
144 	uint16						fChannelCount;
145 
146 	off_t						fFirstRowOffset;	// offset into stream
147 	off_t						fNextRowOffset;		// offset into stream
148 
149 	int32**						fOffsetTable;		// offset table for compression
150 	int32**						fLengthTable;		// length table for compression
151 
152 	uint16*						fARLERow;			// advanced RLE compression buffer
153 	int32						fARLEOffset;		// advanced RLE buffer offset
154 	int32						fARLELength;		// advanced RLE buffer length
155 };
156 
157 #endif // SGI_IMAGE_H
158 
159