diff options
Diffstat (limited to 'libxrdp/xrdp_bitmap32_compress.c')
-rw-r--r-- | libxrdp/xrdp_bitmap32_compress.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/libxrdp/xrdp_bitmap32_compress.c b/libxrdp/xrdp_bitmap32_compress.c index d93dab84..083c4409 100644 --- a/libxrdp/xrdp_bitmap32_compress.c +++ b/libxrdp/xrdp_bitmap32_compress.c @@ -204,35 +204,43 @@ fsplit4(char *in_data, int start_line, int width, int e, } /*****************************************************************************/ +#define DELTA_ONE \ +do { \ + delta = src8[cx] - src8[0]; \ + is_neg = (delta >> 7) & 1; \ + dst8[cx] = (((delta ^ -is_neg) + is_neg) << 1) - is_neg; \ + src8++; \ + dst8++; \ +} while (0) + +/*****************************************************************************/ static int APP_CC fdelta(char *in_plane, char *out_plane, int cx, int cy) { char delta; + char is_neg; char *src8; char *dst8; - int index; - int jndex; + char *src8_end; g_memcpy(out_plane, in_plane, cx); - for (jndex = cy - 2; jndex >= 0; jndex--) + src8 = in_plane; + dst8 = out_plane; + src8_end = src8 + (cx * cy - cx); + while (src8 + 8 <= src8_end) { - src8 = in_plane + jndex * cx; - dst8 = out_plane + jndex * cx; - for (index = 0; index < cx; index++) - { - delta = src8[cx] - src8[0]; - if (delta & 0x80) - { - delta = (((~delta) + 1) << 1) - 1; - } - else - { - delta = delta << 1; - } - dst8[cx] = delta; - src8++; - dst8++; - } + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + DELTA_ONE; + } + while (src8 < src8_end) + { + DELTA_ONE; } return 0; } |