2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
#include "t32bitsrv_wrap.h"
|
|
|
|
|
|
|
|
//================================================================================
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int t32bitsrv::BufferExchanger::read(const char *srcBuf, int len) {
|
|
|
|
m_data = (UCHAR *)memcpy(m_data, srcBuf, len);
|
|
|
|
return len;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int t32bitsrv::BufferExchanger::write(char *dstBuf, int len) {
|
|
|
|
memcpy(dstBuf, m_data, len);
|
|
|
|
m_data += len;
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
return len;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//================================================================================
|
|
|
|
|
|
|
|
template <typename PIXEL>
|
2016-06-15 18:43:10 +12:00
|
|
|
int t32bitsrv::RasterExchanger<PIXEL>::read(const char *srcBuf, int len) {
|
|
|
|
if (m_ras->getWrap() == m_ras->getLx()) {
|
|
|
|
memcpy(m_pix, srcBuf, len);
|
|
|
|
m_pix = (PIXEL *)((UCHAR *)m_pix + len);
|
|
|
|
} else {
|
|
|
|
int xStart = (m_pix - m_ras->pixels(0)) % m_ras->getWrap();
|
|
|
|
int remainingData = len;
|
|
|
|
int lineData = m_ras->getLx() * sizeof(PIXEL);
|
|
|
|
int lineDataToRead = std::min(
|
|
|
|
(int)((m_ras->getLx() - xStart) * sizeof(PIXEL)), remainingData);
|
|
|
|
|
|
|
|
for (; remainingData > 0;
|
|
|
|
m_pix += (m_ras->getWrap() - xStart), remainingData -= lineDataToRead,
|
|
|
|
lineDataToRead = std::min(lineData, remainingData), xStart = 0)
|
|
|
|
memcpy(m_pix, srcBuf, lineDataToRead);
|
|
|
|
}
|
|
|
|
|
|
|
|
return len;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
template <typename PIXEL>
|
2016-06-15 18:43:10 +12:00
|
|
|
int t32bitsrv::RasterExchanger<PIXEL>::write(char *dstBuf, int len) {
|
|
|
|
// We pass entire pixels, not just bytes
|
|
|
|
len = len - (len % sizeof(PIXEL));
|
|
|
|
|
|
|
|
if (m_ras->getWrap() == m_ras->getLx()) {
|
|
|
|
memcpy(dstBuf, m_pix, len);
|
|
|
|
m_pix = (PIXEL *)((UCHAR *)m_pix + len);
|
|
|
|
} else {
|
|
|
|
int xStart = (m_pix - m_ras->pixels(0)) % m_ras->getWrap();
|
|
|
|
int remainingData = len;
|
|
|
|
int lineData = m_ras->getLx() * sizeof(PIXEL);
|
|
|
|
int lineDataToWrite = std::min(
|
|
|
|
(int)((m_ras->getLx() - xStart) * sizeof(PIXEL)), remainingData);
|
|
|
|
|
|
|
|
for (; remainingData > 0;
|
|
|
|
m_pix += (m_ras->getWrap() - xStart), remainingData -= lineDataToWrite,
|
|
|
|
lineDataToWrite = std::min(lineData, remainingData), xStart = 0)
|
|
|
|
memcpy(dstBuf, m_pix, lineDataToWrite);
|
|
|
|
}
|
|
|
|
|
|
|
|
return len;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// Explicit specialization of raster exchangers
|
|
|
|
template class DVAPI t32bitsrv::RasterExchanger<TPixel32>;
|
|
|
|
|
|
|
|
//================================================================================
|