1 /*
2  * in_tga.cpp -- read a Truevision Targa TGA file
3  * by pts@fazekas.hu at Sat Mar  2 00:49:35 CET 2002
4  *
5  */
6 
7 #ifdef __GNUC__
8 #ifndef __clang__
9 #pragma implementation
10 #endif
11 #endif
12 
13 #include "image.hpp"
14 #include "error.hpp"
15 #include "gensio.hpp" /* Filter::UngetFILED */
16 
17 #if USE_IN_TGA
18 
19 #include "input-tga.ci" /* defines tga_load_image */
20 
in_tga_reader(Image::Loader::UFD * ufd,SimBuffer::Flat const &)21 static Image::Sampled *in_tga_reader(Image::Loader::UFD *ufd, SimBuffer::Flat const&) {
22   Image::Sampled *ret=0;
23   bitmap_type bitmap=tga_load_image(((Filter::UngetFILED*)ufd)->getFILE(/*seekable:*/false));
24   /* Imp: Work without duplicated memory allocation */
25   if (BITMAP_PLANES(bitmap)==1) {
26     Image::Gray *img=new Image::Gray(BITMAP_WIDTH(bitmap), BITMAP_HEIGHT(bitmap), 8);
27     memcpy(img->getRowbeg(), BITMAP_BITS(bitmap), (slen_t)BITMAP_WIDTH(bitmap)*BITMAP_HEIGHT(bitmap));
28     ret=img;
29   } else if (BITMAP_PLANES(bitmap)==3) {
30     Image::RGB *img=new Image::RGB(BITMAP_WIDTH(bitmap), BITMAP_HEIGHT(bitmap), 8);
31     memcpy(img->getRowbeg(), BITMAP_BITS(bitmap), (slen_t)3*BITMAP_WIDTH(bitmap)*BITMAP_HEIGHT(bitmap));
32     ret=img;
33   } else assert(0 && "invalid TGA depth");
34   delete [] BITMAP_BITS(bitmap);
35   return ret;
36 }
37 
in_tga_checker(char buf[Image::Loader::MAGIC_LEN],char[Image::Loader::MAGIC_LEN],SimBuffer::Flat const &,Image::Loader::UFD *)38 static Image::Loader::reader_t in_tga_checker(char buf[Image::Loader::MAGIC_LEN], char [Image::Loader::MAGIC_LEN], SimBuffer::Flat const&, Image::Loader::UFD*) {
39   /* vvv Unfortunately not all targa images have that footer */
40   /* return 0==memcmp(bufend+Image::Loader::MAGIC_LEN-18, "TRUEVISION-XFILE", 16) */
41   /* vvv 30..127: Aladdin Ghostscript adds 58 bytes of header */
42   return (unsigned char)buf[0]>=30 && (unsigned char)buf[0]<=63 &&
43     (unsigned char)buf[1]<=11 &&
44     ((unsigned char)buf[16]<=8 || (unsigned char)buf[16]==24)
45    ? in_tga_reader : 0;
46 }
47 
48 #else
49 #define in_tga_checker NULLP
50 #endif /* USE_IN_XPM */
51 
52 Image::Loader in_tga_loader = { "TGA", in_tga_checker, 0 };
53