107 lines
1.8 KiB
C++
107 lines
1.8 KiB
C++
// This code is in the public domain -- castanyo@yahoo.es
|
|
|
|
#pragma once
|
|
#ifndef NV_IMAGE_TGAFILE_H
|
|
#define NV_IMAGE_TGAFILE_H
|
|
|
|
#include "nvcore/Stream.h"
|
|
|
|
namespace nv
|
|
{
|
|
|
|
// TGA types
|
|
enum TGAType {
|
|
TGA_TYPE_INDEXED = 1,
|
|
TGA_TYPE_RGB = 2,
|
|
TGA_TYPE_GREY = 3,
|
|
TGA_TYPE_RLE_INDEXED = 9,
|
|
TGA_TYPE_RLE_RGB = 10,
|
|
TGA_TYPE_RLE_GREY = 11
|
|
};
|
|
|
|
#define TGA_INTERLEAVE_MASK 0xc0
|
|
#define TGA_INTERLEAVE_NONE 0x00
|
|
#define TGA_INTERLEAVE_2WAY 0x40
|
|
#define TGA_INTERLEAVE_4WAY 0x80
|
|
|
|
#define TGA_ORIGIN_MASK 0x30
|
|
#define TGA_ORIGIN_LEFT 0x00
|
|
#define TGA_ORIGIN_RIGHT 0x10
|
|
#define TGA_ORIGIN_LOWER 0x00
|
|
#define TGA_ORIGIN_UPPER 0x20
|
|
|
|
#define TGA_HAS_ALPHA 0x0F
|
|
|
|
|
|
/// Tga Header.
|
|
struct TgaHeader {
|
|
uint8 id_length;
|
|
uint8 colormap_type;
|
|
uint8 image_type;
|
|
uint16 colormap_index;
|
|
uint16 colormap_length;
|
|
uint8 colormap_size;
|
|
uint16 x_origin;
|
|
uint16 y_origin;
|
|
uint16 width;
|
|
uint16 height;
|
|
uint8 pixel_size;
|
|
uint8 flags;
|
|
|
|
enum { Size = 18 }; //const static int SIZE = 18;
|
|
};
|
|
|
|
|
|
/// Tga File.
|
|
struct TgaFile {
|
|
|
|
TgaFile() {
|
|
mem = NULL;
|
|
}
|
|
~TgaFile() {
|
|
free();
|
|
}
|
|
|
|
uint size() const {
|
|
return head.width * head.height * (head.pixel_size / 8);
|
|
}
|
|
void allocate() {
|
|
nvCheck( mem == NULL );
|
|
mem = new uint8[size()];
|
|
}
|
|
void free() {
|
|
delete [] mem;
|
|
mem = NULL;
|
|
}
|
|
|
|
TgaHeader head;
|
|
uint8 * mem;
|
|
};
|
|
|
|
|
|
inline Stream & operator<< (Stream & s, TgaHeader & head)
|
|
{
|
|
s << head.id_length << head.colormap_type << head.image_type;
|
|
s << head.colormap_index << head.colormap_length << head.colormap_size;
|
|
s << head.x_origin << head.y_origin << head.width << head.height;
|
|
s << head.pixel_size << head.flags;
|
|
return s;
|
|
}
|
|
|
|
inline Stream & operator<< (Stream & s, TgaFile & tga)
|
|
{
|
|
s << tga.head;
|
|
|
|
if( s.isLoading() ) {
|
|
tga.allocate();
|
|
}
|
|
|
|
s.serialize( tga.mem, tga.size() );
|
|
|
|
return s;
|
|
}
|
|
|
|
} // nv namespace
|
|
|
|
#endif // NV_IMAGE_TGAFILE_H
|