📄 tiffstream.cpp
字号:
// tiff stream interface class implementation#include "tiffstream.h"const char* TiffStream::m_name = "TiffStream";TiffStream::TiffStream(){ m_tif = NULL; m_inStream = NULL; m_outStream = NULL; m_ioStream = NULL; m_streamLength = 0; m_this = reinterpret_cast<thandle_t>(this);};TiffStream::~TiffStream(){ if(m_tif != NULL) TIFFClose(m_tif);}TIFF*TiffStream::makeFileStream(istream* str){ m_inStream = str; m_outStream = NULL; m_ioStream = NULL; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "r", m_this, read, write, seek, close, size, map, unmap); return m_tif;}TIFF*TiffStream::makeFileStream(ostream* str){ m_inStream = NULL; m_outStream = str; m_ioStream = NULL; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "w", m_this, read, write, seek, close, size, map, unmap); return m_tif;}TIFF*TiffStream::makeFileStream(iostream* str){ m_inStream = NULL; m_outStream = NULL; m_ioStream = str; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "r+w", m_this, read, write, seek, close, size, map, unmap); return m_tif;}tsize_tTiffStream::read(thandle_t fd, tdata_t buf, tsize_t size){ istream* istr; TiffStream* ts = reinterpret_cast<TiffStream*>(fd); if(ts->m_inStream != NULL) { istr = ts->m_inStream; } else if(ts->m_ioStream != NULL) { istr = ts->m_ioStream; } int remain = ts->m_streamLength - ts->tell(fd); int actual = remain < size ? remain : size; istr->read(reinterpret_cast<char*>(buf), actual); return istr->gcount();}tsize_tTiffStream::write(thandle_t fd, tdata_t buf, tsize_t size){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); ostream* ostr; if(ts->m_outStream != NULL) { ostr = ts->m_outStream; } else if(ts->m_ioStream != NULL) { ostr = ts->m_ioStream; } streampos start = ostr->tellp(); ostr->write(reinterpret_cast<const char*>(buf), size); return ostr->tellp() - start;}toff_tTiffStream::seek(thandle_t fd, toff_t offset, int origin){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); if(ts->seekInt(fd, offset, origin) == true) return offset; else return -1;}intTiffStream::close(thandle_t fd){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); if(ts->m_inStream != NULL) { ts->m_inStream = NULL; return 0; } else if(ts->m_outStream != NULL) { ts->m_outStream = NULL; return 0; } else if(ts->m_ioStream != NULL) { ts->m_ioStream = NULL; return 0; } return -1;}toff_tTiffStream::size(thandle_t fd){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); return ts->getSize(fd);}int TiffStream::map(thandle_t fd, tdata_t* phase, toff_t* psize){ return 0;}voidTiffStream::unmap(thandle_t fd, tdata_t base, tsize_t size){}unsigned intTiffStream::getSize(thandle_t fd){ if(!isOpen(fd)) return 0; unsigned int pos = tell(fd); seekInt(fd, 0, end); unsigned int size = tell(fd); seekInt(fd, pos, beg); return size;}unsigned intTiffStream::tell(thandle_t fd){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); if(ts->m_inStream != NULL) { return ts->m_inStream->tellg(); } else if(ts->m_outStream != NULL) { return ts->m_outStream->tellp(); } else if(ts->m_ioStream != NULL) { return ts->m_ioStream->tellg(); } return 0;}boolTiffStream::seekInt(thandle_t fd, unsigned int offset, int origin){ if(!isOpen(fd)) return false; ios::seek_dir org; switch(origin) { case beg: org = ios::beg; break; case cur: org = ios::cur; break; case end: org = ios::end; break; } TiffStream* ts = reinterpret_cast<TiffStream*>(fd); if(ts->m_inStream != NULL) { ts->m_inStream->seekg(offset, org); return true; } else if(ts->m_outStream != NULL) { ts->m_outStream->seekp(offset, org); return true; } else if(ts->m_ioStream != NULL) { ts->m_ioStream->seekg(offset, org); ts->m_ioStream->seekp(offset, org); return true; } return false;}boolTiffStream::isOpen(thandle_t fd){ TiffStream* ts = reinterpret_cast<TiffStream*>(fd); return (ts->m_inStream != NULL || ts->m_outStream != NULL || ts->m_ioStream != NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -