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