129 lines
3.3 KiB
C++
129 lines
3.3 KiB
C++
|
|
|
|
#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));
|
|
}
|
|
}
|