xref: /haiku/src/tools/translation/tgainfo/tgainfo.cpp (revision 9d79ce816bf1f11f1217ad93c0f126b39d46457a)
1d61900aaSMatthew Wilber /*****************************************************************************/
2d61900aaSMatthew Wilber // tgainfo
3d61900aaSMatthew Wilber // Written by Michael Wilber, OBOS Translation Kit Team
4d61900aaSMatthew Wilber //
5d61900aaSMatthew Wilber // Version:
6d61900aaSMatthew Wilber //
7d61900aaSMatthew Wilber // tgainfo is a command line program for displaying information about
8d61900aaSMatthew Wilber // TGA images.
9d61900aaSMatthew Wilber //
10d61900aaSMatthew Wilber //
11d61900aaSMatthew Wilber // This application and all source files used in its construction, except
12d61900aaSMatthew Wilber // where noted, are licensed under the MIT License, and have been written
13d61900aaSMatthew Wilber // and are:
14d61900aaSMatthew Wilber //
15d61900aaSMatthew Wilber // Copyright (c) 2003 OpenBeOS Project
16d61900aaSMatthew Wilber //
17d61900aaSMatthew Wilber // Permission is hereby granted, free of charge, to any person obtaining a
18d61900aaSMatthew Wilber // copy of this software and associated documentation files (the "Software"),
19d61900aaSMatthew Wilber // to deal in the Software without restriction, including without limitation
20d61900aaSMatthew Wilber // the rights to use, copy, modify, merge, publish, distribute, sublicense,
21d61900aaSMatthew Wilber // and/or sell copies of the Software, and to permit persons to whom the
22d61900aaSMatthew Wilber // Software is furnished to do so, subject to the following conditions:
23d61900aaSMatthew Wilber //
24d61900aaSMatthew Wilber // The above copyright notice and this permission notice shall be included
25d61900aaSMatthew Wilber // in all copies or substantial portions of the Software.
26d61900aaSMatthew Wilber //
27d61900aaSMatthew Wilber // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
28d61900aaSMatthew Wilber // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29d61900aaSMatthew Wilber // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
30d61900aaSMatthew Wilber // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31d61900aaSMatthew Wilber // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32d61900aaSMatthew Wilber // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
33d61900aaSMatthew Wilber // DEALINGS IN THE SOFTWARE.
34d61900aaSMatthew Wilber /*****************************************************************************/
35d61900aaSMatthew Wilber #include <stdio.h>
36d61900aaSMatthew Wilber #include <stdlib.h>
37d61900aaSMatthew Wilber #include <string.h>
38d61900aaSMatthew Wilber #include <ByteOrder.h>
39*9d79ce81SJorma Karvonen #include <Catalog.h>
40d61900aaSMatthew Wilber #include <File.h>
41d61900aaSMatthew Wilber #include <TranslatorFormats.h>
425d71fdcbSshatty #include <StorageDefs.h>
43d61900aaSMatthew Wilber 
44*9d79ce81SJorma Karvonen #undef B_TRANSLATE_CONTEXT
45*9d79ce81SJorma Karvonen #define B_TRANSLATE_CONTEXT "tgainfo"
46*9d79ce81SJorma Karvonen 
47d61900aaSMatthew Wilber #define max(x,y) ((x > y) ? x : y)
48d61900aaSMatthew Wilber #define DATA_BUFFER_SIZE 64
49d61900aaSMatthew Wilber 
50d61900aaSMatthew Wilber struct TGAFileHeader {
51d61900aaSMatthew Wilber 	uint8 idlength;
52d61900aaSMatthew Wilber 		// Number of bytes in the Image ID field
53d61900aaSMatthew Wilber 	uint8 colormaptype;
54d61900aaSMatthew Wilber 	uint8 imagetype;
55d61900aaSMatthew Wilber };
56d61900aaSMatthew Wilber 
57d61900aaSMatthew Wilber #define TGA_NO_COLORMAP			0
58d61900aaSMatthew Wilber #define TGA_COLORMAP			1
59d61900aaSMatthew Wilber 
60d61900aaSMatthew Wilber #define TGA_NO_IMAGE_DATA		0
61d61900aaSMatthew Wilber 
62d61900aaSMatthew Wilber #define TGA_NOCOMP_COLORMAP		1
63d61900aaSMatthew Wilber #define TGA_NOCOMP_TRUECOLOR	2
64d61900aaSMatthew Wilber #define TGA_NOCOMP_BW			3
65d61900aaSMatthew Wilber #define TGA_RLE_COLORMAP		9
66d61900aaSMatthew Wilber #define TGA_RLE_TRUECOLOR		10
67d61900aaSMatthew Wilber #define TGA_RLE_BW				11
68d61900aaSMatthew Wilber 
69d61900aaSMatthew Wilber // Information about the color map (palette). These bytes are
70d61900aaSMatthew Wilber // always present, but are zero if no color map is present
71d61900aaSMatthew Wilber struct TGAColorMapSpec {
72d61900aaSMatthew Wilber 	uint16 firstentry;		// first useful entry in the color map
73d61900aaSMatthew Wilber 	uint16 length;			// number of color map entries
74d61900aaSMatthew Wilber 	uint8 entrysize;		// number of bits per entry
75d61900aaSMatthew Wilber };
76d61900aaSMatthew Wilber 
77d61900aaSMatthew Wilber struct TGAImageSpec {
78d61900aaSMatthew Wilber 	uint16 xorigin;
79d61900aaSMatthew Wilber 	uint16 yorigin;
80d61900aaSMatthew Wilber 	uint16 width;
81d61900aaSMatthew Wilber 	uint16 height;
82d61900aaSMatthew Wilber 	uint8 depth;
83d61900aaSMatthew Wilber 	uint8 descriptor;
84d61900aaSMatthew Wilber };
85d61900aaSMatthew Wilber 
86d61900aaSMatthew Wilber #define TGA_ORIGIN_VERT_BIT	0x20
87d61900aaSMatthew Wilber #define TGA_ORIGIN_BOTTOM	0
88d61900aaSMatthew Wilber #define TGA_ORIGIN_TOP		1
89d61900aaSMatthew Wilber 
90d61900aaSMatthew Wilber #define TGA_ORIGIN_HORZ_BIT	0x10
91d61900aaSMatthew Wilber #define TGA_ORIGIN_LEFT		0
92d61900aaSMatthew Wilber #define TGA_ORIGIN_RIGHT	1
93d61900aaSMatthew Wilber 
94d61900aaSMatthew Wilber #define TGA_DESC_BITS76		0xc0
95d61900aaSMatthew Wilber #define TGA_DESC_ALPHABITS	0x0f
96d61900aaSMatthew Wilber 
97d61900aaSMatthew Wilber #define TGA_HEADERS_SIZE 18
98d61900aaSMatthew Wilber #define TGA_FTR_LEN 26
99735e7442SMatthew Wilber #define TGA_EXT_LEN 495
100735e7442SMatthew Wilber #define LINE_LEN 82
101d61900aaSMatthew Wilber 
102d61900aaSMatthew Wilber const char *
103d61900aaSMatthew Wilber colormaptype(uint8 n)
104d61900aaSMatthew Wilber {
105d61900aaSMatthew Wilber 	switch (n) {
106*9d79ce81SJorma Karvonen 		case 0: return B_TRANSLATE("No colormap");
107*9d79ce81SJorma Karvonen 		case 1: return B_TRANSLATE("colormap");
108d61900aaSMatthew Wilber 	}
109d61900aaSMatthew Wilber 	return "unknown";
110d61900aaSMatthew Wilber }
111d61900aaSMatthew Wilber 
112d61900aaSMatthew Wilber const char *
113d61900aaSMatthew Wilber imagetype(uint8 n)
114d61900aaSMatthew Wilber {
115d61900aaSMatthew Wilber 	switch (n) {
116*9d79ce81SJorma Karvonen 		case 0:  return B_TRANSLATE("No Image Data");
117*9d79ce81SJorma Karvonen 		case 1:  return B_TRANSLATE("colormap");
118*9d79ce81SJorma Karvonen 		case 2:  return B_TRANSLATE("true color");
119*9d79ce81SJorma Karvonen 		case 3:  return B_TRANSLATE("grayscale");
120*9d79ce81SJorma Karvonen 		case 9:  return B_TRANSLATE("RLE colormap");
121*9d79ce81SJorma Karvonen 		case 10: return B_TRANSLATE("RLE true color");
122*9d79ce81SJorma Karvonen 		case 11: return B_TRANSLATE("RLE grayscale");
123*9d79ce81SJorma Karvonen 		default: break;
124d61900aaSMatthew Wilber 	}
125*9d79ce81SJorma Karvonen 	return B_TRANSLATE("unknown");
126d61900aaSMatthew Wilber }
127d61900aaSMatthew Wilber 
128735e7442SMatthew Wilber uint16
129735e7442SMatthew Wilber tga_uint16(char *buffer, int32 offset)
130735e7442SMatthew Wilber {
131735e7442SMatthew Wilber 	return B_LENDIAN_TO_HOST_INT16(*(reinterpret_cast<uint16 *>(buffer + offset)));
132735e7442SMatthew Wilber }
133735e7442SMatthew Wilber 
134735e7442SMatthew Wilber uint32
135735e7442SMatthew Wilber tga_uint32(char *buffer, int32 offset)
136735e7442SMatthew Wilber {
137735e7442SMatthew Wilber 	return B_LENDIAN_TO_HOST_INT32(*(reinterpret_cast<uint32 *>(buffer + offset)));
138735e7442SMatthew Wilber }
139735e7442SMatthew Wilber 
140d61900aaSMatthew Wilber void
141d61900aaSMatthew Wilber print_tga_info(BFile &file)
142d61900aaSMatthew Wilber {
143d61900aaSMatthew Wilber 	uint8 buf[TGA_HEADERS_SIZE];
144d61900aaSMatthew Wilber 
145d61900aaSMatthew Wilber 	// read in TGA headers
146d61900aaSMatthew Wilber 	ssize_t size = TGA_HEADERS_SIZE;
147d61900aaSMatthew Wilber 	if (size > 0 && file.Read(buf, size) != size) {
148*9d79ce81SJorma Karvonen 		printf(B_TRANSLATE("Error: unable to read all TGA headers\n"));
149d61900aaSMatthew Wilber 		return;
150d61900aaSMatthew Wilber 	}
151d61900aaSMatthew Wilber 
152d61900aaSMatthew Wilber 	// TGA file header
153d61900aaSMatthew Wilber 	TGAFileHeader fh;
154d61900aaSMatthew Wilber 	fh.idlength = buf[0];
155d61900aaSMatthew Wilber 	fh.colormaptype = buf[1];
156d61900aaSMatthew Wilber 	fh.imagetype = buf[2];
157d61900aaSMatthew Wilber 
158*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("\nFile Header:\n"));
159*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("    id length: %d\n"), static_cast<int>(fh.idlength));
160d61900aaSMatthew Wilber 
161*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("colormap type: %d (%s)\n"),
162*9d79ce81SJorma Karvonen 		static_cast<int>(fh.colormaptype),
163*9d79ce81SJorma Karvonen 		static_cast<const char *>(colormaptype(fh.colormaptype)));
164*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("   image type: %d (%s)\n"),
165*9d79ce81SJorma Karvonen 		static_cast<int>(fh.imagetype),
166*9d79ce81SJorma Karvonen 		static_cast<const char *>(imagetype(fh.imagetype)));
167d61900aaSMatthew Wilber 
168d61900aaSMatthew Wilber 
169d61900aaSMatthew Wilber 	// TGA color map spec
170d61900aaSMatthew Wilber 	TGAColorMapSpec mapspec;
171735e7442SMatthew Wilber 	mapspec.firstentry = tga_uint16(reinterpret_cast<char *>(buf), 3);
172735e7442SMatthew Wilber 	mapspec.length = tga_uint16(reinterpret_cast<char *>(buf), 5);
173d61900aaSMatthew Wilber 	mapspec.entrysize = buf[7];
174d61900aaSMatthew Wilber 
175*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("\nColormap Spec:\n"));
176*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("first entry: %d\n"),
177*9d79ce81SJorma Karvonen 		static_cast<int>(mapspec.firstentry));
178*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("     length: %d\n"),
179*9d79ce81SJorma Karvonen 		static_cast<int>(mapspec.length));
180*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE(" entry size: %d\n"),
181*9d79ce81SJorma Karvonen 		static_cast<int>(mapspec.entrysize));
182d61900aaSMatthew Wilber 
183d61900aaSMatthew Wilber 
184d61900aaSMatthew Wilber 	// TGA image spec
185d61900aaSMatthew Wilber 	TGAImageSpec imagespec;
186735e7442SMatthew Wilber 	imagespec.xorigin = tga_uint16(reinterpret_cast<char *>(buf), 8);
187735e7442SMatthew Wilber 	imagespec.yorigin = tga_uint16(reinterpret_cast<char *>(buf), 10);
188735e7442SMatthew Wilber 	imagespec.width = tga_uint16(reinterpret_cast<char *>(buf), 12);
189735e7442SMatthew Wilber 	imagespec.height = tga_uint16(reinterpret_cast<char *>(buf), 14);
190d61900aaSMatthew Wilber 	imagespec.depth = buf[16];
191d61900aaSMatthew Wilber 	imagespec.descriptor = buf[17];
192d61900aaSMatthew Wilber 
193*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("\nImage Spec:\n"));
194*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("  x origin: %d\n"),
195*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.xorigin));
196*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("  y origin: %d\n"),
197*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.yorigin));
198*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("     width: %d\n"),
199*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.width));
200*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("    height: %d\n"),
201*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.height));
202*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("     depth: %d\n"),
203*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.depth));
204*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("descriptor: 0x%.2x\n"),
205*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.descriptor));
206*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("\talpha (attr): %d\n"),
207*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.descriptor & TGA_DESC_ALPHABITS));
208*9d79ce81SJorma Karvonen 	if (imagespec.descriptor & TGA_ORIGIN_VERT_BIT)
209*9d79ce81SJorma Karvonen 		if (imagespec.descriptor & TGA_ORIGIN_HORZ_BIT)
210*9d79ce81SJorma Karvonen 			printf(B_TRANSLATE("\t      origin: %d (%s %s)\n"),
211*9d79ce81SJorma Karvonen 				static_cast<int>(imagespec.descriptor & (TGA_ORIGIN_VERT_BIT
212*9d79ce81SJorma Karvonen 				| TGA_ORIGIN_HORZ_BIT)), static_cast<const char *>("top"),
213*9d79ce81SJorma Karvonen 				static_cast<const char *>("right"));
214*9d79ce81SJorma Karvonen 		else
215*9d79ce81SJorma Karvonen 			printf(B_TRANSLATE("\t      origin: %d (%s %s)\n"),
216*9d79ce81SJorma Karvonen 			static_cast<int>(imagespec.descriptor & (TGA_ORIGIN_VERT_BIT
217*9d79ce81SJorma Karvonen 				| TGA_ORIGIN_HORZ_BIT)), static_cast<const char *>("top"),
218*9d79ce81SJorma Karvonen 				static_cast<const char *>("left"));
219*9d79ce81SJorma Karvonen 	else
220*9d79ce81SJorma Karvonen 		if (imagespec.descriptor & TGA_ORIGIN_HORZ_BIT)
221*9d79ce81SJorma Karvonen 			printf(B_TRANSLATE("\t      origin: %d (%s %s)\n"),
222*9d79ce81SJorma Karvonen 				static_cast<int>(imagespec.descriptor & (TGA_ORIGIN_VERT_BIT
223*9d79ce81SJorma Karvonen 				| TGA_ORIGIN_HORZ_BIT)), static_cast<const char *>("bottom"),
224*9d79ce81SJorma Karvonen 				static_cast<const char *>("right"));
225*9d79ce81SJorma Karvonen 		else
226*9d79ce81SJorma Karvonen 			printf(B_TRANSLATE("\t      origin: %d (%s %s)\n"),
227*9d79ce81SJorma Karvonen 			static_cast<int>(imagespec.descriptor & (TGA_ORIGIN_VERT_BIT
228*9d79ce81SJorma Karvonen 				| TGA_ORIGIN_HORZ_BIT)), static_cast<const char *>("bottom"),
229*9d79ce81SJorma Karvonen 				static_cast<const char *>("left"));
230*9d79ce81SJorma Karvonen 
231*9d79ce81SJorma Karvonen 
232*9d79ce81SJorma Karvonen 	printf(B_TRANSLATE("\t  bits 7 & 6: %d\n"),
233*9d79ce81SJorma Karvonen 		static_cast<int>(imagespec.descriptor & TGA_DESC_BITS76));
234d61900aaSMatthew Wilber 
235d61900aaSMatthew Wilber 
236d61900aaSMatthew Wilber 	// Optional TGA Footer
237d61900aaSMatthew Wilber 	off_t filesize = 0;
238d61900aaSMatthew Wilber 	if (file.GetSize(&filesize) == B_OK) {
239d61900aaSMatthew Wilber 
240d61900aaSMatthew Wilber 		char tgafooter[TGA_FTR_LEN + 1] = { 0 };
241d61900aaSMatthew Wilber 		if (file.ReadAt(filesize - TGA_FTR_LEN, tgafooter, TGA_FTR_LEN) == TGA_FTR_LEN) {
242d61900aaSMatthew Wilber 
243d61900aaSMatthew Wilber 			if (strcmp(tgafooter + 8, "TRUEVISION-XFILE.") == 0) {
244d61900aaSMatthew Wilber 
245d61900aaSMatthew Wilber 				uint32 extoffset = 0, devoffset = 0;
246735e7442SMatthew Wilber 				extoffset = tga_uint32(tgafooter, 0);
247735e7442SMatthew Wilber 				devoffset = tga_uint32(tgafooter, 4);
248d61900aaSMatthew Wilber 
249*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("\nTGA Footer:\n"));
250*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("extension offset: 0x%.8lx (%ld)\n"),
251*9d79ce81SJorma Karvonen 					static_cast<long int>(extoffset),
252*9d79ce81SJorma Karvonen 					static_cast<long int>(extoffset));
253*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("developer offset: 0x%.8lx (%ld)\n"),
254*9d79ce81SJorma Karvonen 					static_cast<long int>(devoffset),
255*9d79ce81SJorma Karvonen 					static_cast<long int>(devoffset));
256*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("signature: %s\n"), tgafooter + 8);
257d61900aaSMatthew Wilber 
258735e7442SMatthew Wilber 				if (extoffset) {
259735e7442SMatthew Wilber 					char extbuf[TGA_EXT_LEN];
260735e7442SMatthew Wilber 					if (file.ReadAt(extoffset, extbuf, TGA_EXT_LEN) == TGA_EXT_LEN) {
261735e7442SMatthew Wilber 
262*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("\nExtension Area:\n"));
263735e7442SMatthew Wilber 
264735e7442SMatthew Wilber 						char strbuffer[LINE_LEN];
265735e7442SMatthew Wilber 
266735e7442SMatthew Wilber 						uint16 extsize = tga_uint16(extbuf, 0);
267735e7442SMatthew Wilber 						if (extsize < TGA_EXT_LEN) {
268*9d79ce81SJorma Karvonen 							printf(B_TRANSLATE("\nError: extension "
269*9d79ce81SJorma Karvonen 								"area is too small (%d)\n"), extsize);
270735e7442SMatthew Wilber 							return;
271735e7442SMatthew Wilber 						}
272*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("size: %d\n"), extsize);
273735e7442SMatthew Wilber 
274735e7442SMatthew Wilber 						memset(strbuffer, 0, LINE_LEN);
275735e7442SMatthew Wilber 						strncpy(strbuffer, extbuf + 2, 41);
276735e7442SMatthew Wilber 						printf("author: \"%s\"\n", strbuffer);
277735e7442SMatthew Wilber 
278*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("comments:\n"));
279735e7442SMatthew Wilber 						for (int32 i = 0; i < 4; i++) {
280735e7442SMatthew Wilber 							memset(strbuffer, 0, LINE_LEN);
281735e7442SMatthew Wilber 							strcpy(strbuffer, extbuf + 43 + (i * 81));
282*9d79ce81SJorma Karvonen 							printf(B_TRANSLATE("\tline %ld: \"%s\"\n"),
283*9d79ce81SJorma Karvonen 								static_cast<long int>(i + 1),
284*9d79ce81SJorma Karvonen 								static_cast<const char *>(strbuffer));
285735e7442SMatthew Wilber 						}
286735e7442SMatthew Wilber 
287*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("date/time (yyyy-mm-dd hh:mm:ss): "
288*9d79ce81SJorma Karvonen 							"%.4d-%.2d-%.2d %.2d:%.2d:%.2d\n"),
289735e7442SMatthew Wilber 							tga_uint16(extbuf, 367), tga_uint16(extbuf, 369),
290735e7442SMatthew Wilber 							tga_uint16(extbuf, 371), tga_uint16(extbuf, 373),
291735e7442SMatthew Wilber 							tga_uint16(extbuf, 375), tga_uint16(extbuf, 377));
292735e7442SMatthew Wilber 
293735e7442SMatthew Wilber 						memset(strbuffer, 0, LINE_LEN);
294735e7442SMatthew Wilber 						strncpy(strbuffer, extbuf + 379, 41);
295*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("job name: \"%s\"\n"), strbuffer);
296735e7442SMatthew Wilber 
297*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("job time (hh:mm:ss): "
298*9d79ce81SJorma Karvonen 							"%.2d:%.2d:%.2d\n"), tga_uint16(extbuf, 420),
299*9d79ce81SJorma Karvonen 							tga_uint16(extbuf, 422), tga_uint16(extbuf, 424));
300735e7442SMatthew Wilber 
301735e7442SMatthew Wilber 						memset(strbuffer, 0, LINE_LEN);
302735e7442SMatthew Wilber 						strncpy(strbuffer, extbuf + 426, 41);
303*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("software id: \"%s\"\n"),
304*9d79ce81SJorma Karvonen 							strbuffer);
305735e7442SMatthew Wilber 
306735e7442SMatthew Wilber 						char strver[] = "[null]";
307735e7442SMatthew Wilber 						if (extbuf[469] != '\0') {
308735e7442SMatthew Wilber 							strver[0] = extbuf[469];
309735e7442SMatthew Wilber 							strver[1] = '\0';
310735e7442SMatthew Wilber 						}
311*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("software version, letter: %d, "
312*9d79ce81SJorma Karvonen 							"%s\n"), tga_uint16(extbuf, 467), strver);
313735e7442SMatthew Wilber 
314*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("key color (A,R,G,B): %d, %d, %d, "
315*9d79ce81SJorma Karvonen 							"%d\n"), extbuf[470], extbuf[471], extbuf[472],
316*9d79ce81SJorma Karvonen 							extbuf[473]);
317735e7442SMatthew Wilber 
318*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("pixel aspect ratio: %d / %d\n"),
319735e7442SMatthew Wilber 							tga_uint16(extbuf, 474), tga_uint16(extbuf, 476));
320735e7442SMatthew Wilber 
321*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("gamma value: %d / %d\n"),
322735e7442SMatthew Wilber 							tga_uint16(extbuf, 478), tga_uint16(extbuf, 480));
323735e7442SMatthew Wilber 
324*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("color correction offset: 0x%.8lx "
325*9d79ce81SJorma Karvonen 							"(%ld)\n"),	tga_uint32(extbuf, 482),
326*9d79ce81SJorma Karvonen 							tga_uint32(extbuf, 482));
327*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("postage stamp offset: 0x%.8lx "
328*9d79ce81SJorma Karvonen 							"(%ld)\n"),	tga_uint32(extbuf, 486),
329*9d79ce81SJorma Karvonen 							tga_uint32(extbuf, 486));
330*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("scan line offset: 0x%.8lx "
331*9d79ce81SJorma Karvonen 							"(%ld)\n"), tga_uint32(extbuf, 490),
332*9d79ce81SJorma Karvonen 							tga_uint32(extbuf, 490));
333735e7442SMatthew Wilber 
334735e7442SMatthew Wilber 						const char *strattrtype = NULL;
335735e7442SMatthew Wilber 						uint8 attrtype = extbuf[494];
336735e7442SMatthew Wilber 						switch (attrtype) {
337*9d79ce81SJorma Karvonen 							case 0: strattrtype
338*9d79ce81SJorma Karvonen 								= B_TRANSLATE("no alpha"); break;
339*9d79ce81SJorma Karvonen 							case 1: strattrtype
340*9d79ce81SJorma Karvonen 								= B_TRANSLATE("undefined, ignore"); break;
341*9d79ce81SJorma Karvonen 							case 2: strattrtype
342*9d79ce81SJorma Karvonen 								= B_TRANSLATE("undefined, retain"); break;
343*9d79ce81SJorma Karvonen 							case 3: strattrtype
344*9d79ce81SJorma Karvonen 								= B_TRANSLATE("alpha"); break;
345*9d79ce81SJorma Karvonen 							case 4: strattrtype
346*9d79ce81SJorma Karvonen 								= B_TRANSLATE("pre-multiplied alpha"); break;
347735e7442SMatthew Wilber 							default:
348735e7442SMatthew Wilber 								if (attrtype > 4 && attrtype < 128)
349*9d79ce81SJorma Karvonen 									strattrtype = B_TRANSLATE("reserved");
350735e7442SMatthew Wilber 								else
351*9d79ce81SJorma Karvonen 									strattrtype = B_TRANSLATE("unassigned");
352735e7442SMatthew Wilber 								break;
353735e7442SMatthew Wilber 						}
354*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("attributes type: %d (%s)\n"),
355*9d79ce81SJorma Karvonen 							attrtype, strattrtype);
356735e7442SMatthew Wilber 
357735e7442SMatthew Wilber 					} else
358*9d79ce81SJorma Karvonen 						printf(B_TRANSLATE("\nError: Unable to read entire "
359*9d79ce81SJorma Karvonen 							"extension area\n"));
360735e7442SMatthew Wilber 				}
361735e7442SMatthew Wilber 
362d61900aaSMatthew Wilber 			} else
363*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("\nTGA footer not found\n"));
364d61900aaSMatthew Wilber 
365d61900aaSMatthew Wilber 		} else
366*9d79ce81SJorma Karvonen 			printf(B_TRANSLATE("\nError: Unable to read TGA footer "
367*9d79ce81SJorma Karvonen 				"section\n"));
368d61900aaSMatthew Wilber 
369d61900aaSMatthew Wilber 	} else
370*9d79ce81SJorma Karvonen 		printf(B_TRANSLATE("\nError: Unable to get file size\n"));
371d61900aaSMatthew Wilber }
372d61900aaSMatthew Wilber 
373d61900aaSMatthew Wilber int
374d61900aaSMatthew Wilber main(int argc, char **argv)
375d61900aaSMatthew Wilber {
376d61900aaSMatthew Wilber 	printf("\n");
377d61900aaSMatthew Wilber 
378735e7442SMatthew Wilber 	if (argc == 1) {
379*9d79ce81SJorma Karvonen 		printf(B_TRANSLATE("tgainfo - reports information about a TGA image file\n"));
380*9d79ce81SJorma Karvonen 		printf(B_TRANSLATE("\nUsage:\n"));
381*9d79ce81SJorma Karvonen 		printf(B_TRANSLATE("tgainfo filename.tga\n"));
382d61900aaSMatthew Wilber 	}
383735e7442SMatthew Wilber 	else {
384735e7442SMatthew Wilber 		BFile file;
385735e7442SMatthew Wilber 
386735e7442SMatthew Wilber 		for (int32 i = 1; i < argc; i++) {
387735e7442SMatthew Wilber 			if (file.SetTo(argv[i], B_READ_ONLY) != B_OK)
388*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("\nError opening %s\n"), argv[i]);
389735e7442SMatthew Wilber 			else {
390*9d79ce81SJorma Karvonen 				printf(B_TRANSLATE("\nTGA image information for: %s\n"), argv[i]);
391735e7442SMatthew Wilber 				print_tga_info(file);
392735e7442SMatthew Wilber 			}
393735e7442SMatthew Wilber 		}
394735e7442SMatthew Wilber 
395735e7442SMatthew Wilber 	}
396d61900aaSMatthew Wilber 
397d61900aaSMatthew Wilber 	printf("\n");
398d61900aaSMatthew Wilber 
399d61900aaSMatthew Wilber 	return 0;
400d61900aaSMatthew Wilber }
401d61900aaSMatthew Wilber 
402