]> source.dussan.org Git - tigervnc.git/commitdiff
Fixed a problem with copying discontinuous pixel data to IRIX JPEG ompressor.
authorConstantin Kaplinsky <const@tightvnc.com>
Tue, 4 Sep 2007 09:12:59 +0000 (09:12 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Tue, 4 Sep 2007 09:12:59 +0000 (09:12 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2335 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/IrixDMIC_RawToJpeg.cxx
common/rfb/IrixDMIC_RawToJpeg.h
common/rfb/IrixDMJpegCompressor.cxx

index 6b7630470ee8467cd1a85d33483f3969243603cb..b3378a782c1157bd511b134e1dfef5c82cee6f5d 100644 (file)
@@ -311,6 +311,32 @@ IrixDMIC_RawToJpeg::copyToBuffer(DMbuffer buf, const void *data, int dataSize)
   return true;
 }
 
+//
+// Fill in a DMbuffer with data.
+//
+// NOTE: The caller must make sure that the buffer size is no less
+//       than (nRows * rowSize).
+//
+
+bool
+IrixDMIC_RawToJpeg::copyToBuffer(DMbuffer buf, const void *data,
+                                 int rowSize, int nRows, int stride)
+{
+  char *dataBytes = (char *)data;
+  char *bufPtr = (char *)dmBufferMapData(buf);
+  for (int i = 0; i < nRows; i++) {
+    memcpy(bufPtr, &dataBytes[i * stride], rowSize);
+    bufPtr += rowSize;
+  }
+
+  if (dmBufferSetSize(buf, nRows * rowSize) != DM_SUCCESS) {
+    reportError("dmBufferSetSize");
+    return false;
+  }
+
+  return true;
+}
+
 //
 // Map DMbuffer to physical memory.
 //
index 33674bd30d0f5931130254bd015d5c7f01bc35a5..b067e135820dbbaaaf8c200753a998e64c47a9a9 100644 (file)
@@ -28,6 +28,8 @@ namespace rfb {
 
     static bool allocBuffer(DMbuffer *pbuf, DMbufferpool pool);
     static bool copyToBuffer(DMbuffer buf, const void *data, int dataSize);
+    static bool copyToBuffer(DMbuffer buf, const void *data,
+                             int rowSize, int nRows, int stride);
     static int getBufferSize(DMbuffer buf);
     static void * mapBufferData(DMbuffer buf);
     static void freeBuffer(DMbuffer buf);
index 57e8aa80fc1b2562987fc37966638120f2258797..dda059f8814c522a85b3f034875ab76265e59841 100644 (file)
@@ -79,8 +79,9 @@ IrixDMJpegCompressor::compress(const rdr::U32 *buf,
   if (!m_ic.allocBuffer(&srcBuf, m_srcPool)) {
     return;
   }
-  // FIXME: Currently, copyToBuffer() copies parts of the image incorrectly.
-  if (!m_ic.copyToBuffer(srcBuf, buf, w * h * (fmt->bpp / 8))) {
+  int widthInBytes = w * (fmt->bpp / 8);
+  int strideInBytes = stride * (fmt->bpp / 8);
+  if (!m_ic.copyToBuffer(srcBuf, buf, widthInBytes, h, strideInBytes)) {
     m_ic.freeBuffer(srcBuf);
     return;
   }