Blob Blame Raw


#include "texception.h"
#include "tfilepath.h"
#include "tiio_bmp.h"
#include "filebmp.h"

namespace
{

string buildBMPExceptionString(int retCode)
{
	switch (retCode) {
	case UNSUPPORTED_BMP_FORMAT:
		return " : unsupported bmp format";
	case OUT_OF_MEMORY:
		return " : out of memory";
	case UNEXPECTED_EOF:
		return " : unexptected EOF";
	case CANT_OPEN_FILE:
		return " : can't open file";
	case WRITE_ERROR:
		return " : writing error";
	default:
		return " : I/O error";
	}
}

} //namespace
//------------------------------------------------------------

TImageP TImageReaderBmp::load()
{
	TImageP image;
	void *buff;
	int retCode = readbmp(getFilePath().getWideString().c_str(), &m_lx, &m_ly, &buff);
	if (retCode != OK) {
		throw TImageException(getFilePath(), buildBMPExceptionString(retCode));
	}

	TRaster32P raster;
	raster.create(m_lx, m_ly);
	raster->lock();
	memcpy(raster->pixels(), buff, m_lx * m_ly * sizeof(TPixel32));
	raster->unlock();
	TRasterImageP rasImage(raster);
	// image->setRaster(raster);
	delete[] buff;
	return TImageP(rasImage);
}

//------------------------------------------------------------

/*
void TImageReaderBmp::load(const TRasterP &ras, const TPoint &pos,
                              int shrinkX, int shrinkY)
{
void *buff;
int x0 = pos.x;
int y0 = pos.y;
int x1 = x0 + ras->getLx() * shrinkX - 1;
int y1 = y0 + ras->getLy() * shrinkY - 1;

int retCode = readbmpregion(m_path.getFullPath().c_str(), &buff, x0, y0, x1, y1, shrinkX);
if (retCode!= OK) 
  throw TImageException(getFilePath().getFullPath(), buildBMPExceptionString(retCode));
memcpy(ras->getRawData(), buff, ras->getLx() * ras->getLy() * 4);
delete [] buff;
}
*/

//------------------------------------------------------------

TDimension TImageReaderBmp::getSize() const
{
	TDimension d(0, 0);
	int retCode = readbmp_size(getFilePath().getWideString().c_str(), &(d.lx), &(d.ly));
	if (retCode != OK)
		throw TImageException(getFilePath(), buildBMPExceptionString(retCode));
	return d;
}

//------------------------------------------------------------

TRect TImageReaderBmp::getBBox() const
{
	TRect r;
	int retCode = readbmp_bbox(getFilePath().getWideString().c_str(), &(r.x0), &(r.y0), &(r.x1), &(r.y1));
	if (retCode != OK)
		throw TImageException(getFilePath(), buildBMPExceptionString(retCode));
	return r;
}

//============================================================

void TImageWriterBmp::save(const TImageP &image)
{
	TRasterImageP rasImage(image);

	TRaster32P ras32;
	ras32 = rasImage->getRaster();

	TRasterGR8P ras8;
	ras8 = rasImage->getRaster();
	void *buff = 0;
	int pixSize;

	if (!ras32 && !ras8))
    throw TImageException(m_path, buildBMPExceptionString(UNSUPPORTED_BMP_FORMAT));

	rasImage->getRaster()->lock();
	if (ras32) {
		buff = ras32->getRawData();
		m_lx = ras32->getLx();
		m_ly = ras32->getLy();
		pixSize = 32;
	} else {
		buff = ras8->getRawData();
		m_lx = ras8->getLx();
		m_ly = ras8->getLy();
		pixSize = 8;
	}

	int retCode = writebmp(getFilePath().getWideString().c_str(), m_lx, m_ly, buff, pixSize);
	rasImage->getRaster()->unlock();
	if (retCode != OK) {
		throw TImageException(m_path, buildBMPExceptionString(retCode));
	}
}