xref: /haiku/src/add-ons/translators/tga/TGATranslator.h (revision 19e5578effc583f701a8a42acdbd1a8349b20d92)
1 /*****************************************************************************/
2 // TGATranslator
3 // Written by Michael Wilber, Haiku Translation Kit Team
4 //
5 // TGATranslator.h
6 //
7 // This BTranslator based object is for opening and writing TGA files.
8 //
9 //
10 // Copyright (c) 2002  Haiku, Inc.
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining a
13 // copy of this software and associated documentation files (the "Software"),
14 // to deal in the Software without restriction, including without limitation
15 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 // and/or sell copies of the Software, and to permit persons to whom the
17 // Software is furnished to do so, subject to the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be included
20 // in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 // DEALINGS IN THE SOFTWARE.
29 /*****************************************************************************/
30 
31 #ifndef TGA_TRANSLATOR_H
32 #define TGA_TRANSLATOR_H
33 
34 #include <Translator.h>
35 #include <TranslatorFormats.h>
36 #include <TranslationDefs.h>
37 #include <GraphicsDefs.h>
38 #include <InterfaceDefs.h>
39 #include <DataIO.h>
40 #include <ByteOrder.h>
41 #include "BaseTranslator.h"
42 
43 #define TGA_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(1,0,0)
44 #define TGA_IN_QUALITY 0.7
45 #define TGA_IN_CAPABILITY 0.8
46 #define TGA_OUT_QUALITY 0.7
47 #define TGA_OUT_CAPABILITY 0.6
48 
49 #define BBT_IN_QUALITY 0.7
50 #define BBT_IN_CAPABILITY 0.6
51 #define BBT_OUT_QUALITY 0.6
52 #define BBT_OUT_CAPABILITY 0.8
53 
54 // TGA Translator Settings
55 #define TGA_SETTING_RLE "tga /rle"
56 #define TGA_SETTING_IGNORE_ALPHA "tga /ignore_alpha"
57 
58 // TGA files are stored in the Intel byte order :)
59 struct TGAFileHeader {
60 	uint8 idlength;
61 		// Number of bytes in the Image ID field
62 	uint8 colormaptype;
63 		// 0	Has NO color-map (palette)
64 		// 1	Has color-map (palette)
65 	uint8 imagetype;
66 		// 0	No Image Data Included
67 		// 1	Uncompressed, Color-mapped image
68 		// 2	Uncompressed, True-color image
69 		// 3	Uncompressed, Black-and-white (Greyscale?) image
70 		// 9	Run-length encoded, Color-mapped image
71 		// 10	Run-length encoded, True-color image
72 		// 11	Run-length encoded, Black-and-white (Greyscale?) image
73 };
74 
75 #define TGA_NO_COLORMAP			0
76 #define TGA_COLORMAP			1
77 
78 #define TGA_NO_IMAGE_DATA		0
79 
80 #define TGA_NOCOMP_COLORMAP		1
81 #define TGA_NOCOMP_TRUECOLOR	2
82 #define TGA_NOCOMP_BW			3
83 #define TGA_RLE_COLORMAP		9
84 #define TGA_RLE_TRUECOLOR		10
85 #define TGA_RLE_BW				11
86 
87 // Information about the color map (palette). These bytes are
88 // always present, but are zero if no color map is present
89 struct TGAColorMapSpec {
90 	uint16 firstentry;		// first useful entry in the color map
91 	uint16 length;			// number of color map entries
92 	uint8 entrysize;		// number of bits per entry
93 };
94 
95 struct TGAImageSpec {
96 	uint16 xorigin;
97 	uint16 yorigin;
98 	uint16 width;
99 	uint16 height;
100 	uint8 depth;
101 		// pixel depth includes alpha bits!
102 	uint8 descriptor;
103 		// bits 3-0: number of attribute bits per pixel
104 		// bits 5&4: order pixels are drawn to the screen
105 			// Screen Dest of 		Image Origin
106 			// first pixel			bit 5	bit 4
107 			//////////////////////////////////////////
108 			// bottom left			0		0
109 			// bottom right			0		1
110 			// top left				1		0
111 			// top right			1		1
112 		// bits 7&6: must be zero
113 };
114 
115 #define TGA_ORIGIN_VERT_BIT	0x20
116 #define TGA_ORIGIN_BOTTOM	0
117 #define TGA_ORIGIN_TOP		1
118 
119 #define TGA_ORIGIN_HORZ_BIT	0x10
120 #define TGA_ORIGIN_LEFT		0
121 #define TGA_ORIGIN_RIGHT	1
122 
123 #define TGA_DESC_BITS76		0xc0
124 #define TGA_DESC_ALPHABITS	0x0f
125 
126 #define TGA_RLE_PACKET_TYPE_BIT 0x80
127 
128 #define TGA_HEADERS_SIZE 18
129 
130 #define TGA_STREAM_BUFFER_SIZE 1024
131 
132 class TGATranslator : public BaseTranslator {
133 public:
134 	TGATranslator();
135 
136 	virtual status_t DerivedIdentify(BPositionIO *inSource,
137 		const translation_format *inFormat, BMessage *ioExtension,
138 		translator_info *outInfo, uint32 outType);
139 
140 	virtual status_t DerivedTranslate(BPositionIO *inSource,
141 		const translator_info *inInfo, BMessage *ioExtension,
142 		uint32 outType, BPositionIO *outDestination, int32 baseType);
143 
144 	virtual BView *NewConfigView(TranslatorSettings *settings);
145 
146 protected:
147 	virtual ~TGATranslator();
148 		// this is protected because the object is deleted by the
149 		// Release() function instead of being deleted directly by
150 		// the user
151 
152 private:
153 	uint8 tga_alphabits(TGAFileHeader &filehead, TGAColorMapSpec &mapspec,
154 		TGAImageSpec &imagespec);
155 
156 	status_t translate_from_bits(BPositionIO *inSource, uint32 outType,
157 		BPositionIO *outDestination);
158 
159 	status_t translate_from_tganm_to_bits(BPositionIO *inSource,
160 		BPositionIO *outDestination, TGAFileHeader &filehead,
161 		TGAColorMapSpec &mapspec, TGAImageSpec &imagespec);
162 
163 	status_t translate_from_tganmrle_to_bits(BPositionIO *inSource,
164 		BPositionIO *outDestination, TGAFileHeader &filehead,
165 		TGAColorMapSpec &mapspec, TGAImageSpec &imagespec);
166 
167 	status_t translate_from_tgamrle_to_bits(BPositionIO *inSource,
168 		BPositionIO *outDestination, TGAFileHeader &filehead,
169 		TGAColorMapSpec &mapspec, TGAImageSpec &imagespec, uint8 *pmap);
170 
171 	status_t translate_from_tga(BPositionIO *inSource, uint32 outType,
172 		BPositionIO *outDestination);
173 
174 };
175 
176 #endif // #ifndef TGA_TRANSLATOR_H
177 
178