Blob Blame Raw


#include <QDebug>

#include "t32bitsrv_wrap.h"

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

int t32bitsrv::BufferExchanger::read(const char *srcBuf, int len)
{
	m_data = (UCHAR *)memcpy(m_data, srcBuf, len);
	return len;
}

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

int t32bitsrv::BufferExchanger::write(char *dstBuf, int len)
{
	memcpy(dstBuf, m_data, len);
	m_data += len;

	return len;
}

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

template <typename PIXEL>
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;
}

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

template <typename PIXEL>
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;
}

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

//  Explicit specialization of raster exchangers
template class DVAPI t32bitsrv::RasterExchanger<TPixel32>;

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