Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

tga.cpp

00001 //----------------------------------------------------------------------------// 00002 // viewer.h // 00003 // Copyright (C) 2003 Desmecht Laurent // 00004 //----------------------------------------------------------------------------// 00005 // This program is free software; you can redistribute it and/or modify it // 00006 // under the terms of the GNU General Public License as published by the Free // 00007 // Software Foundation; either version 2 of the License, or (at your option) // 00008 // any later version. // 00009 //----------------------------------------------------------------------------// 00010 00011 #include "tga.h" 00012 00013 #define TGA_TYPE_MAPPED 1 00014 #define TGA_TYPE_COLOR 2 00015 #define TGA_TYPE_GRAY 3 00016 #define TGA_TYPE_MAPPED_RLE 9 00017 #define TGA_TYPE_COLOR_RLE 10 00018 #define TGA_TYPE_GRAY_RLE 11 00019 00020 /* Image descriptor. 00021 3-0: attribute bpp 00022 4: left-to-right ordering 00023 5: top-to-bottom ordering 00024 7-6: zero 00025 */ 00026 #define TGA_DESC_ABITS 0x0f 00027 #define TGA_DESC_HORIZONTAL 0x10 00028 #define TGA_DESC_VERTICAL 0x20 00029 00030 00031 00032 00033 CTga::CTga() 00034 { 00035 m_SizeX=0; 00036 m_SizeY=0; 00037 m_Bpp=0; 00038 m_dest=NULL; 00039 } 00040 00041 int CTga::Release() 00042 { 00043 if(m_dest!=NULL) 00044 { 00045 free(m_dest); 00046 m_dest=NULL; 00047 return -1; 00048 } 00049 return 0; 00050 } 00051 00052 int CTga::ReadFile(const char *str) 00053 { 00054 unsigned char l,r,g,b,a; 00055 unsigned char *tmp; 00056 00057 if(m_dest!=NULL) 00058 { 00059 return -1; 00060 } 00061 00062 00063 FILE *file; 00064 file=fopen(str,"rb"); 00065 00066 if(file==NULL) 00067 return 0; 00068 00069 // Read the header 00070 00071 TgaHeader.idlength=fgetc(file); 00072 TgaHeader.colourmaptype=fgetc(file); 00073 TgaHeader.datatypecode=fgetc(file); 00074 TgaHeader.colourmaporigin=fgetc(file); 00075 TgaHeader.colourmaporigin+=fgetc(file)<<8; 00076 TgaHeader.colourmaplength=fgetc(file); 00077 TgaHeader.colourmaplength+=fgetc(file)<<8; 00078 TgaHeader.colourmapdepth=fgetc(file); 00079 TgaHeader.x_origin=fgetc(file); 00080 TgaHeader.x_origin+=fgetc(file)<<8; 00081 TgaHeader.y_origin=fgetc(file); 00082 TgaHeader.y_origin+=fgetc(file)<<8; 00083 TgaHeader.SizeX=fgetc(file); 00084 TgaHeader.SizeX+=fgetc(file)<<8; 00085 TgaHeader.SizeY=fgetc(file); 00086 TgaHeader.SizeY+=fgetc(file)<<8; 00087 TgaHeader.Bpp=fgetc(file); 00088 TgaHeader.imagedescriptor=fgetc(file); 00089 00090 // Return if the format is unsupported 00091 00092 if(TgaHeader.datatypecode!=TGA_TYPE_COLOR 00093 && TgaHeader.datatypecode!=TGA_TYPE_GRAY 00094 && TgaHeader.datatypecode!=TGA_TYPE_COLOR_RLE) 00095 return 0; 00096 00097 00098 if(TgaHeader.Bpp!=8 00099 && TgaHeader.Bpp!=24 00100 && TgaHeader.Bpp!=32) 00101 return 0; 00102 00103 00104 if(TgaHeader.Bpp==8) 00105 m_dest = (unsigned char*)malloc(TgaHeader.SizeX*TgaHeader.SizeY); 00106 if(TgaHeader.Bpp==32 || TgaHeader.Bpp==24) 00107 m_dest = (unsigned char*)malloc(TgaHeader.SizeX*TgaHeader.SizeY*4); 00108 00109 00110 if(TgaHeader.datatypecode==TGA_TYPE_COLOR || TgaHeader.datatypecode==TGA_TYPE_GRAY) 00111 { 00112 for(int y=0;y<TgaHeader.SizeY;y++) 00113 for(int x=0;x<TgaHeader.SizeX;x++) 00114 { 00115 if(TgaHeader.Bpp==8) 00116 { 00117 r=fgetc(file); 00118 m_dest[x+y*TgaHeader.SizeX]=r; 00119 } 00120 if(TgaHeader.Bpp==24 || TgaHeader.Bpp==32) 00121 { 00122 b=fgetc(file); 00123 g=fgetc(file); 00124 r=fgetc(file); 00125 if(TgaHeader.Bpp==24) 00126 a=255; 00127 else 00128 a=fgetc(file); 00129 00130 m_dest[(x+y*TgaHeader.SizeX)*4]=r; 00131 m_dest[(x+y*TgaHeader.SizeX)*4+1]=g; 00132 m_dest[(x+y*TgaHeader.SizeX)*4+2]=b; 00133 m_dest[(x+y*TgaHeader.SizeX)*4+3]=a; 00134 } 00135 } 00136 } 00137 if(TgaHeader.datatypecode==TGA_TYPE_COLOR_RLE) 00138 { 00139 int x=0; 00140 while(x<TgaHeader.SizeX*TgaHeader.SizeY) 00141 { 00142 l=fgetc(file); 00143 if(l & 0x80) 00144 { 00145 l=l & 0x7F; 00146 b=fgetc(file); 00147 g=fgetc(file); 00148 r=fgetc(file); 00149 if(TgaHeader.Bpp==24) 00150 a=255; 00151 else 00152 a=fgetc(file); 00153 00154 00155 for(int i=0;i<l+1;i++) 00156 { 00157 m_dest[x*4]=r; 00158 m_dest[x*4+1]=g; 00159 m_dest[x*4+2]=b; 00160 m_dest[x*4+3]=a; 00161 x++; 00162 } 00163 } 00164 else 00165 { 00166 l=l & 0x7F; 00167 for(int i=0;i<l+1;i++) 00168 { 00169 b=fgetc(file); 00170 g=fgetc(file); 00171 r=fgetc(file); 00172 00173 if(TgaHeader.Bpp==24) 00174 a=255; 00175 else 00176 a=fgetc(file); 00177 00178 00179 m_dest[x*4]=r; 00180 m_dest[x*4+1]=g; 00181 m_dest[x*4+2]=b; 00182 m_dest[x*4+3]=a; 00183 x++; 00184 } 00185 } 00186 } 00187 } 00188 00189 00190 m_SizeX=TgaHeader.SizeX; 00191 m_SizeY=TgaHeader.SizeY; 00192 m_Bpp=TgaHeader.Bpp; 00193 if(m_Bpp==24)m_Bpp=32; 00194 fclose(file); 00195 00196 00197 00198 if((TgaHeader.imagedescriptor & 0x0020)==0) //we flip the file 00199 { 00200 00201 tmp=m_dest; 00202 00203 if(TgaHeader.Bpp==8) 00204 m_dest = (unsigned char*)malloc(TgaHeader.SizeX*TgaHeader.SizeY); 00205 if(TgaHeader.Bpp==32 || TgaHeader.Bpp==24) 00206 m_dest = (unsigned char*)malloc(TgaHeader.SizeX*TgaHeader.SizeY*4); 00207 00208 00209 for(int y=0;y<TgaHeader.SizeY;y++) 00210 { 00211 for(int x=0;x<TgaHeader.SizeX;x++) 00212 { 00213 if(m_Bpp==8) 00214 { 00215 r=tmp[x+(TgaHeader.SizeY-y-1)*TgaHeader.SizeX]; 00216 m_dest[x+y*TgaHeader.SizeX]=r; 00217 } 00218 if(m_Bpp==32) 00219 { 00220 r=tmp[(x+(TgaHeader.SizeY-y-1)*TgaHeader.SizeX)*4]; 00221 g=tmp[(x+(TgaHeader.SizeY-y-1)*TgaHeader.SizeX)*4+1]; 00222 b=tmp[(x+(TgaHeader.SizeY-y-1)*TgaHeader.SizeX)*4+2]; 00223 a=tmp[(x+(TgaHeader.SizeY-y-1)*TgaHeader.SizeX)*4+3]; 00224 m_dest[(x+y*TgaHeader.SizeX)*4]=r; 00225 m_dest[(x+y*TgaHeader.SizeX)*4+1]=g; 00226 m_dest[(x+y*TgaHeader.SizeX)*4+2]=b; 00227 m_dest[(x+y*TgaHeader.SizeX)*4+3]=a; 00228 00229 00230 } 00231 } 00232 00233 } 00234 free(tmp); 00235 } 00236 00237 00238 return -1; 00239 00240 } 00241 00242 00243

Generated on Sun Aug 15 19:19:23 2004 for OpenCAL: Open Computer Animation Library by doxygen 1.3.8