#include "Image.h"
#include "PngImage.h"
#include <stdio.h>
#include <string.h>
bool LoadFile(const char* filename, ByteArray& data)
{
FILE *fp = fopen(filename, "rb");
if (!fp)
return false;
fseek(fp, 0, SEEK_END);
size_t siz = ftell(fp);
data.resize(siz);
fseek(fp, 0, SEEK_SET);
bool res = (fread(data.data(), siz, 1, fp) != 0);
fclose(fp);
return res;
}
bool SaveFile(const char* filename, const ByteArray& data)
{
FILE *fp = fopen(filename, "wb");
if (!fp)
return false;
fwrite(data.data(), data.size(), 1, fp);
fclose(fp);
return true;
}
bool DecodeTGA(const ByteArray& inData, Image& outImage)
{
const unsigned char *header = inData.data();
if (inData.size() < 18)
return false;
int bpp = header[16];
if (bpp != 24 && bpp != 32)
return false;
outImage.m_width = header[12] | (header[13] << 8);
outImage.m_height = header[14] | (header[15] << 8);
size_t siz = outImage.m_width * outImage.m_height * (bpp / 8);
if (inData.size() < 18+siz)
return false;
outImage.m_type = (bpp == 24) ? RAW_RGB_24BPP : RAW_RGBA_32BPP;
outImage.m_data.resize(siz);
memcpy(outImage.m_data.data(), inData.data() + 18, siz);
return true;
}
bool EncodeTGA(const Image& inImage, ByteArray& outData)
{
if (inImage.m_type != RAW_RGB_24BPP && inImage.m_type != RAW_RGBA_32BPP)
return false;
int bpp = (inImage.m_type == RAW_RGB_24BPP) ? 24 : 32;
size_t siz = inImage.m_width * inImage.m_height * (bpp/8);
outData.resize(18 + siz);
unsigned char *header = outData.data();
memset(header, 0, 18);
header[2] = 2;
header[12] = inImage.m_width & 0xff;
header[13] = (inImage.m_width >> 8) & 0xff;
header[14] = inImage.m_height & 0xff;
header[15] = (inImage.m_height >> 8) & 0xff;
header[16] = bpp;
memcpy(outData.data() + 18, inImage.m_data.data(), siz);
return true;
}
bool DecodePNG(const ByteArray& inData, Image& outImage)
{
return (decodePNG(outImage.m_data, outImage.m_width, outImage.m_height, inData.data(), inData.size()) == 0);
}