faster postprocessing
authorMoritz Hanke <hanke@dkrz.de>
Fri, 7 Dec 2012 15:18:31 +0000 (16:18 +0100)
committerThomas Jahns <jahns@dkrz.de>
Tue, 19 Feb 2013 10:33:02 +0000 (11:33 +0100)
src/decode.c

index c99b8ae..4385036 100644 (file)
@@ -75,7 +75,7 @@
     {                                                                   \
         uint32_t *bp, *flush_end;                                       \
         int64_t d, m, th2;                                              \
-        int64_t data, med;                                              \
+        int64_t data, med, half_d, xmin, xmax;                          \
         struct internal_state *state = strm->state;                     \
                                                                         \
         flush_end = state->rsip;                                        \
             else                                                        \
                 med = (state->xmax - state->xmin) / 2 + 1;              \
                                                                         \
+            xmin = state->xmin;                                         \
+            xmax = state->xmax;                                         \
+                                                                        \
             for (bp = state->flush_start; bp < flush_end; bp++) {       \
                 d = *bp;                                                \
-                th2 = (data < med ?                                     \
-                       data - state->xmin :                             \
-                       state->xmax - data) << 1;                        \
-                if (d <= th2) {                                         \
-                    data += ((d + 1) / 2 ^ -(d & 1)) + (d & 1);         \
+                half_d = (d + 1) >> 1;                                  \
+                                                                        \
+                if (data < med) {                                       \
+                    if (half_d <= data - xmin) {                        \
+                        if (d & 1)                                      \
+                            data -= half_d;                             \
+                        else                                            \
+                            data += half_d;                             \
+                    } else {                                            \
+                        data = xmin + d;                                \
+                    }                                                   \
                 } else {                                                \
-                    if (data < med)                                     \
-                        data = state->xmin + d;                         \
-                    else                                                \
-                        data = state->xmax - d;                         \
+                    if (half_d <= xmax - data) {                        \
+                        if (d & 1)                                      \
+                            data -= half_d;                             \
+                        else                                            \
+                            data += half_d;                             \
+                    } else {                                            \
+                        data = xmax - d;                                \
+                    }                                                   \
                 }                                                       \
                 put_##KIND(strm, data);                                 \
             }                                                           \