#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)); } }