You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.1 KiB
140 lines
3.1 KiB
5 years ago
|
//
|
||
|
// mxToolKit (c) 1999 by Mete Ciragan
|
||
|
//
|
||
|
// file: mxTga.cpp
|
||
|
// implementation: all
|
||
|
// last modified: Apr 15 1999, Mete Ciragan
|
||
|
// copyright: The programs and associated files contained in this
|
||
|
// distribution were developed by Mete Ciragan. The programs
|
||
|
// are not in the public domain, but they are freely
|
||
|
// distributable without licensing fees. These programs are
|
||
|
// provided without guarantee or warrantee expressed or
|
||
|
// implied.
|
||
|
//
|
||
|
#include "mxtk/mxTga.h"
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
|
||
|
|
||
|
mxImage *
|
||
|
mxTgaRead (const char *filename)
|
||
|
{
|
||
|
FILE *file;
|
||
|
file = fopen (filename, "rb");
|
||
|
if (!file)
|
||
|
return 0;
|
||
|
|
||
|
byte identFieldLength;
|
||
|
byte colorMapType;
|
||
|
byte imageTypeCode;
|
||
|
fread (&identFieldLength, sizeof (byte), 1, file);
|
||
|
fread (&colorMapType, sizeof (byte), 1, file);
|
||
|
fread (&imageTypeCode, sizeof (byte), 1, file);
|
||
|
|
||
|
fseek (file, 12, SEEK_SET);
|
||
|
|
||
|
word width, height;
|
||
|
byte pixelSize;
|
||
|
fread (&width, sizeof (word), 1, file);
|
||
|
fread (&height, sizeof (word), 1, file);
|
||
|
fread (&pixelSize, sizeof (byte), 1, file);
|
||
|
|
||
|
// only 24-bit RGB uncompressed
|
||
|
if (colorMapType != 0 ||
|
||
|
imageTypeCode != 2 ||
|
||
|
pixelSize != 24)
|
||
|
{
|
||
|
fclose (file);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
fseek (file, 18 + identFieldLength, SEEK_SET);
|
||
|
|
||
|
mxImage *image = new mxImage ();
|
||
|
if (!image->create (width, height, 24))
|
||
|
{
|
||
|
delete image;
|
||
|
fclose (file);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
byte *data = (byte *) image->data;
|
||
|
for (int y = 0; y < height; y++)
|
||
|
{
|
||
|
byte *scanline = (byte *) &data[(height - y - 1) * width * 3];
|
||
|
for (int x = 0; x < width; x++)
|
||
|
{
|
||
|
scanline[x * 3 + 2] = (byte) fgetc (file);
|
||
|
scanline[x * 3 + 1] = (byte) fgetc (file);
|
||
|
scanline[x * 3 + 0] = (byte) fgetc (file);
|
||
|
//scanline[x * 4 + 3] = 0xff;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose (file);
|
||
|
|
||
|
return image;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
bool
|
||
|
mxTgaWrite (const char *filename, mxImage *image)
|
||
|
{
|
||
|
if (!image)
|
||
|
return false;
|
||
|
|
||
|
if (image->bpp != 24)
|
||
|
return false;
|
||
|
|
||
|
FILE *file = fopen (filename, "wb");
|
||
|
if (!file)
|
||
|
return false;
|
||
|
|
||
|
//
|
||
|
// write header
|
||
|
//
|
||
|
fputc (0, file); // identFieldLength
|
||
|
fputc (0, file); // colorMapType == 0, no color map
|
||
|
fputc (2, file); // imageTypeCode == 2, uncompressed RGB
|
||
|
|
||
|
word w = 0;
|
||
|
fwrite (&w, sizeof (word), 1, file); // colorMapOrigin
|
||
|
fwrite (&w, sizeof (word), 1, file); // colorMapLength
|
||
|
fputc (0, file); // colorMapEntrySize
|
||
|
|
||
|
fwrite (&w, sizeof (word), 1, file); // imageOriginX
|
||
|
fwrite (&w, sizeof (word), 1, file); // imageOriginY
|
||
|
|
||
|
w = (word) image->width;
|
||
|
fwrite (&w, sizeof (word), 1, file); // imageWidth
|
||
|
|
||
|
w = (word) image->height;
|
||
|
fwrite (&w, sizeof (word), 1, file); // imageHeight
|
||
|
|
||
|
fputc (24, file); // imagePixelSize
|
||
|
fputc (0, file); // imageDescriptorByte
|
||
|
|
||
|
// write no ident field
|
||
|
|
||
|
// write no color map
|
||
|
|
||
|
// write imagedata
|
||
|
|
||
|
byte *data = (byte *) image->data;
|
||
|
for (int y = 0; y < image->height; y++)
|
||
|
{
|
||
|
byte *scanline = (byte *) &data[(image->height - y - 1) * image->width * 3];
|
||
|
for (int x = 0; x < image->width; x++)
|
||
|
{
|
||
|
fputc ((byte) scanline[x * 3 + 2], file);
|
||
|
fputc ((byte) scanline[x * 3 + 1], file);
|
||
|
fputc ((byte) scanline[x * 3 + 0], file);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose (file);
|
||
|
|
||
|
return true;
|
||
|
}
|