1
2
3 #include <QDebug>
4
5 #include "t32bitsrv_wrap.h"
6
7 //================================================================================
8
read(const char * srcBuf,int len)9 int t32bitsrv::BufferExchanger::read(const char *srcBuf, int len) {
10 m_data = (UCHAR *)memcpy(m_data, srcBuf, len);
11 return len;
12 }
13
14 //--------------------------------------------------------------------------------
15
write(char * dstBuf,int len)16 int t32bitsrv::BufferExchanger::write(char *dstBuf, int len) {
17 memcpy(dstBuf, m_data, len);
18 m_data += len;
19
20 return len;
21 }
22
23 //================================================================================
24
25 template <typename PIXEL>
read(const char * srcBuf,int len)26 int t32bitsrv::RasterExchanger<PIXEL>::read(const char *srcBuf, int len) {
27 if (m_ras->getWrap() == m_ras->getLx()) {
28 memcpy(m_pix, srcBuf, len);
29 m_pix = (PIXEL *)((UCHAR *)m_pix + len);
30 } else {
31 int xStart = (m_pix - m_ras->pixels(0)) % m_ras->getWrap();
32 int remainingData = len;
33 int lineData = m_ras->getLx() * sizeof(PIXEL);
34 int lineDataToRead = std::min(
35 (int)((m_ras->getLx() - xStart) * sizeof(PIXEL)), remainingData);
36
37 for (; remainingData > 0;
38 m_pix += (m_ras->getWrap() - xStart), remainingData -= lineDataToRead,
39 lineDataToRead = std::min(lineData, remainingData), xStart = 0)
40 memcpy(m_pix, srcBuf, lineDataToRead);
41 }
42
43 return len;
44 }
45
46 //--------------------------------------------------------------------------------
47
48 template <typename PIXEL>
write(char * dstBuf,int len)49 int t32bitsrv::RasterExchanger<PIXEL>::write(char *dstBuf, int len) {
50 // We pass entire pixels, not just bytes
51 len = len - (len % sizeof(PIXEL));
52
53 if (m_ras->getWrap() == m_ras->getLx()) {
54 memcpy(dstBuf, m_pix, len);
55 m_pix = (PIXEL *)((UCHAR *)m_pix + len);
56 } else {
57 int xStart = (m_pix - m_ras->pixels(0)) % m_ras->getWrap();
58 int remainingData = len;
59 int lineData = m_ras->getLx() * sizeof(PIXEL);
60 int lineDataToWrite = std::min(
61 (int)((m_ras->getLx() - xStart) * sizeof(PIXEL)), remainingData);
62
63 for (; remainingData > 0;
64 m_pix += (m_ras->getWrap() - xStart), remainingData -= lineDataToWrite,
65 lineDataToWrite = std::min(lineData, remainingData), xStart = 0)
66 memcpy(dstBuf, m_pix, lineDataToWrite);
67 }
68
69 return len;
70 }
71
72 //--------------------------------------------------------------------------------
73
74 // Explicit specialization of raster exchangers
75 template class DVAPI t32bitsrv::RasterExchanger<TPixel32>;
76
77 //================================================================================
78