tga.cpp
00001
00002
00003
00004
00005
00006
00007
00008
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
00021
00022
00023
00024
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
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
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)
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
1.3.8