[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdelibs/kimgio
From:       Melchior Franz <mfranz () kde ! org>
Date:       2005-01-10 19:54:20
Message-ID: 20050110195420.288381CF7C () office ! kde ! org
[Download RAW message or body]

CVS commit by mfranz: 

improve RLE compression for noisy images


  M +24 -16    rgb.cpp   1.31


--- kdelibs/kimgio/rgb.cpp  #1.30:1.31
@@ -352,22 +352,30 @@ uchar SGIImage::intensity(uchar c)
 uint SGIImage::compact(uchar *d, uchar *s)
 {
-        uchar *dest = d, *src = s, patt, *cnt;
-        int n;
-        while (src - s < m_xsize) {
-                if (src - s + 1 == m_xsize) {           // last bit
-                        *dest++ = 0x81;
-                        *dest++ = *src;
+        uchar *dest = d, *src = s, patt, *t, *end = s + m_xsize;
+        int i, n;
+        while (src < end) {
+                for (n = 0, t = src; t + 2 < end && !(*t == t[1] && *t == t[2]); t++)
+                        n++;
+
+                while (n) {
+                        i = n > 126 ? 126 : n;
+                        n -= i;
+                        *dest++ = 0x80 | i;
+                        while (i--)
+                                *dest++ = *src++;
+                }
+
+                if (src == end)
                         break;
-                } else if (*src == src[1]) {
+
                         patt = *src++;
-                        for (n = 1; src - s < m_xsize && n < 126 && *src == patt; src++)
+                for (n = 1; src < end && *src == patt; src++)
                                 n++;
-                        *dest++ = n;
+
+                while (n) {
+                        i = n > 126 ? 126 : n;
+                        n -= i;
+                        *dest++ = i;
                         *dest++ = patt;
-                } else {
-                        cnt = dest++;
-                        for (n = 0; src - s < m_xsize && n < 126 && *src != src[1]; n++)
-                                *dest++ = *src++;
-                        *cnt = 0x80 | n;
                 }
         }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic