37#pragma message ("(gth) disabling TGAtoDXTClass temporarily so I can test the WW libs merge...")
49TGAToDXTClass _TGAToDXTConverter;
57TGAToDXTClass::TGAToDXTClass()
58 : WriteTimePtr (
NULL),
62 Buffer =
new unsigned char [BufferSize];
72TGAToDXTClass::~TGAToDXTClass()
84TGAToDXTClass::ErrorCode TGAToDXTClass::Convert (
const char *inputpathname,
const char *outputpathname, FILETIME *writetimeptr,
bool &redundantalpha,
bool dontcheckalpha)
90 WriteTimePtr = writetimeptr;
91 redundantalpha =
false;
93 error_code=TGA_LOAD_ERROR;
97 bool validbitdepth, validsize, validaspect;
105 validbitdepth = ((targa.
Header.PixelDepth == 24) || (targa.
Header.PixelDepth == 32)
106 || ( (targa.
Header.PixelDepth == 8) && (targa.
Header.ColorMapType != 1) ) );
107 validsize = (targa.
Header.Width >= 4) && (targa.
Header.Height >= 4);
110 if (validbitdepth && validsize && validaspect) {
118 if (targa.
Header.PixelDepth == 32) {
121 if (!dontcheckalpha) {
122 byte = (
unsigned char*) targa.
GetImage();
123 if ((*(
byte + 3) == 0x00) || (*(
byte + 3) == 0xff)) {
125 const unsigned char alpha = *(
byte + 3);
127 redundantalpha =
true;
128 for (
unsigned p = 0; p < ((unsigned) targa.
Header.Width) * ((unsigned) targa.
Header.Height); p++) {
129 redundantalpha &= (*(
byte + 3) == alpha);
135 if (!redundantalpha) {
137 errorcode = ::nvDXTcompress ((
unsigned char*) targa.
GetImage(), targa.
Header.Width, targa.
Header.Height, TF_DXT5,
true,
false, 4);
141 unsigned char *nonalphaimage, *nonalphabyte;
144 nonalphaimage =
new unsigned char [3 * ((unsigned) targa.
Header.Width) * ((
unsigned) targa.
Header.Height)];
145 nonalphabyte = nonalphaimage;
147 byte = (
unsigned char*) targa.
GetImage();
148 for (
unsigned p = 0; p < ((unsigned) targa.
Header.Width) * ((unsigned) targa.
Header.Height); p++) {
150 *(nonalphabyte + 0) = *(
byte + 0);
151 *(nonalphabyte + 1) = *(
byte + 1);
152 *(nonalphabyte + 2) = *(
byte + 2);
157 errorcode = ::nvDXTcompress (nonalphaimage, targa.
Header.Width, targa.
Header.Height, TF_DXT1,
true,
false, 3);
158 delete [] nonalphaimage;
161 }
else if (targa.
Header.PixelDepth == 8) {
163 unsigned char *image;
166 image =
new unsigned char [3 * ((unsigned) targa.
Header.Width) * ((
unsigned) targa.
Header.Height)];
168 byte = (
unsigned char*) targa.
GetImage();
169 for (
unsigned p = 0; p < ((unsigned) targa.
Header.Width) * ((unsigned) targa.
Header.Height); p++) {
170 image[3*p]=image[3*p+1]=image[3*p+2]=
byte[p];
173 errorcode = ::nvDXTcompress (image, targa.
Header.Width, targa.
Header.Height, TF_DXT1,
true,
false, 3);
178 errorcode = ::nvDXTcompress ((
unsigned char*) targa.
GetImage(), targa.
Header.Width, targa.
Header.Height, TF_DXT1,
true,
false, 3);
183 if (errorcode >= 0) {
184 Write (outputpathname);
187 error_code = COMPRESSION_ERROR;
190 if (!validbitdepth) error_code = INVALID_BIT_DEPTH;
191 if (!validsize) error_code = INVALID_SIZE;
192 if (!validaspect) error_code = INVALID_ASPECT_RATIO;
205void TGAToDXTClass::Write (
const char *outputpathname)
208 DWORD bytecountwritten;
210 hfile = ::CreateFile (outputpathname, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, 0L,
NULL);
211 if (hfile != INVALID_HANDLE_VALUE) {
212 LockFile (hfile, 0, 0, BufferCount, 0);
213 WriteFile (hfile,
Buffer, BufferCount, &bytecountwritten,
NULL);
214 UnlockFile (hfile, 0, 0, BufferCount, 0);
217 if (WriteTimePtr !=
NULL) {
218 SetFileTime (hfile,
NULL,
NULL, WriteTimePtr);
234void ReadDTXnFile (
DWORD datacount,
void *data)
246void WriteDTXnFile (
DWORD datacount,
void *data)
249 if (_TGAToDXTConverter.BufferSize < _TGAToDXTConverter.BufferCount + datacount) {
251 unsigned newbuffersize;
252 unsigned char *newbuffer;
254 newbuffersize =
MAX (_TGAToDXTConverter.BufferSize * 2, _TGAToDXTConverter.BufferCount + datacount);
255 newbuffer =
new unsigned char [newbuffersize];
257 memcpy (newbuffer, _TGAToDXTConverter.Buffer, _TGAToDXTConverter.BufferCount);
258 delete [] _TGAToDXTConverter.Buffer;
259 _TGAToDXTConverter.Buffer = newbuffer;
260 _TGAToDXTConverter.BufferSize = newbuffersize;
264 memcpy (_TGAToDXTConverter.Buffer + _TGAToDXTConverter.BufferCount, data, datacount);
265 _TGAToDXTConverter.BufferCount += datacount;
long Load(const char *name, char *palette, char *image, bool invert_image=true)
char * GetImage(void) const