diff --git a/libfreerdp/codec/bitmap_encode.c b/libfreerdp/codec/bitmap_encode.c index 5cdca0b93..9db6f1a14 100644 --- a/libfreerdp/codec/bitmap_encode.c +++ b/libfreerdp/codec/bitmap_encode.c @@ -23,27 +23,9 @@ #include -#define GETPIXEL8(d, x, y, w) (*(((unsigned char*)d) + ((y) * (w) + (x)))) #define GETPIXEL16(d, x, y, w) (*(((unsigned short*)d) + ((y) * (w) + (x)))) #define GETPIXEL32(d, x, y, w) (*(((unsigned int*)d) + ((y) * (w) + (x)))) -/*****************************************************************************/ -#define IN_PIXEL8(in_ptr, in_x, in_y, in_w, in_last_pixel, in_pixel); \ - { \ - if (in_ptr == 0) \ - { \ - in_pixel = 0; \ - } \ - else if (in_x < in_w) \ - { \ - in_pixel = GETPIXEL8(in_ptr, in_x, in_y, in_w); \ - } \ - else \ - { \ - in_pixel = in_last_pixel; \ - } \ - } - /*****************************************************************************/ #define IN_PIXEL16(in_ptr, in_x, in_y, in_w, in_last_pixel, in_pixel); \ { \ @@ -78,35 +60,6 @@ } \ } -/*****************************************************************************/ -/* color */ -#define OUT_COLOR_COUNT1(in_count, in_s, in_data) \ - { \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x3 << 5) | in_count; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write_UINT8(in_s, in_data); \ - } \ - else if (in_count < 256 + 32) \ - { \ - Stream_Write_UINT8(in_s, 0x60); \ - temp = in_count - 32; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write_UINT8(in_s, in_data); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf3); \ - Stream_Write_UINT16(in_s, in_count); \ - Stream_Write_UINT8(in_s, in_data); \ - } \ - } \ - in_count = 0; \ - } - /*****************************************************************************/ /* color */ #define OUT_COLOR_COUNT2(in_count, in_s, in_data) \ @@ -171,36 +124,6 @@ in_count = 0; \ } -/*****************************************************************************/ -/* copy */ -#define OUT_COPY_COUNT1(in_count, in_s, in_data) \ - { \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x4 << 5) | in_count; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write(in_s, Stream_Buffer(in_data), in_count); \ - } \ - else if (in_count < 256 + 32) \ - { \ - Stream_Write_UINT8(in_s, 0x80); \ - temp = in_count - 32; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write(in_s, Stream_Buffer(in_data), in_count); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf4); \ - Stream_Write_UINT16(in_s, in_count); \ - Stream_Write(in_s, Stream_Buffer(in_data), in_count); \ - } \ - } \ - in_count = 0; \ - Stream_SetPosition(in_data, 0); \ - } - /*****************************************************************************/ /* copy */ #define OUT_COPY_COUNT2(in_count, in_s, in_data) \ @@ -267,39 +190,6 @@ Stream_SetPosition(in_data, 0); \ } -/*****************************************************************************/ -/* bicolor */ -#define OUT_BICOLOR_COUNT1(in_count, in_s, in_color1, in_color2) \ - { \ - if (in_count > 0) \ - { \ - if (in_count / 2 < 16) \ - { \ - temp = (0xe << 4) | (in_count / 2); \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write_UINT8(in_s, in_color1); \ - Stream_Write_UINT8(in_s, in_color2); \ - } \ - else if (in_count / 2 < 256 + 16) \ - { \ - Stream_Write_UINT8(in_s, 0xe0); \ - temp = in_count / 2 - 16; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write_UINT8(in_s, in_color1); \ - Stream_Write_UINT8(in_s, in_color2); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf8); \ - temp = in_count / 2; \ - Stream_Write_UINT16(in_s, temp); \ - Stream_Write_UINT8(in_s, in_color1); \ - Stream_Write_UINT8(in_s, in_color2); \ - } \ - } \ - in_count = 0; \ - } - /*****************************************************************************/ /* bicolor */ #define OUT_BICOLOR_COUNT2(in_count, in_s, in_color1, in_color2) \ @@ -378,31 +268,6 @@ in_count = 0; \ } -/*****************************************************************************/ -/* fill */ -#define OUT_FILL_COUNT1(in_count, in_s) \ - { \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - Stream_Write_UINT8(in_s, in_count); \ - } \ - else if (in_count < 256 + 32) \ - { \ - Stream_Write_UINT8(in_s, 0x0); \ - temp = in_count - 32; \ - Stream_Write_UINT8(in_s, temp); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf0); \ - Stream_Write_UINT16(in_s, in_count); \ - } \ - } \ - in_count = 0; \ - } - /*****************************************************************************/ /* fill */ #define OUT_FILL_COUNT2(in_count, in_s) \ @@ -453,32 +318,6 @@ in_count = 0; \ } -/*****************************************************************************/ -/* mix */ -#define OUT_MIX_COUNT1(in_count, in_s) \ - { \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x1 << 5) | in_count; \ - Stream_Write_UINT8(in_s, temp); \ - } \ - else if (in_count < 256 + 32) \ - { \ - Stream_Write_UINT8(in_s, 0x20); \ - temp = in_count - 32; \ - Stream_Write_UINT8(in_s, temp); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf1); \ - Stream_Write_UINT16(in_s, in_count); \ - } \ - } \ - in_count = 0; \ - } - /*****************************************************************************/ /* mix */ #define OUT_MIX_COUNT2(in_count, in_s) \ @@ -531,35 +370,6 @@ in_count = 0; \ } -/*****************************************************************************/ -/* fom */ -#define OUT_FOM_COUNT1(in_count, in_s, in_mask, in_mask_len) \ - { \ - if (in_count > 0) \ - { \ - if ((in_count % 8) == 0 && in_count < 249) \ - { \ - temp = (0x2 << 5) | (in_count / 8); \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write(in_s, in_mask, in_mask_len); \ - } \ - else if (in_count < 256) \ - { \ - Stream_Write_UINT8(in_s, 0x40); \ - temp = in_count - 1; \ - Stream_Write_UINT8(in_s, temp); \ - Stream_Write(in_s, in_mask, in_mask_len); \ - } \ - else \ - { \ - Stream_Write_UINT8(in_s, 0xf2); \ - Stream_Write_UINT16(in_s, in_count); \ - Stream_Write(in_s, in_mask, in_mask_len); \ - } \ - } \ - in_count = 0; \ - } - /*****************************************************************************/ /* fom */ #define OUT_FOM_COUNT2(in_count, in_s, in_mask, in_mask_len) \ @@ -618,7 +428,6 @@ in_count = 0; \ } -/*****************************************************************************/ #define TEST_FILL \ ((last_line == 0 && pixel == 0) || \ (last_line != 0 && pixel == ypixel)) @@ -646,8 +455,7 @@ bicolor_spin = 0; \ } -/*****************************************************************************/ -int freerdp_bitmap_compress(char* in_data, int width, int height, +int freerdp_bitmap_compress(char* srcData, int width, int height, wStream* s, int bpp, int byte_limit, int start_line, wStream* temp_s, int e) { char *line; @@ -691,303 +499,11 @@ int freerdp_bitmap_compress(char* in_data, int width, int height, mix_count = 0; fom_count = 0; - if (bpp == 8) - { - mix = 0xFF; - out_count = end; - line = in_data + width * start_line; - - while (start_line >= 0 && out_count < 32768) - { - i = Stream_GetPosition(s) + count; - - if (i - color_count >= byte_limit && - i - bicolor_count >= byte_limit && - i - fill_count >= byte_limit && - i - mix_count >= byte_limit && - i - fom_count >= byte_limit) - { - break; - } - - out_count += end; - - for (i = 0; i < end; i++) - { - /* read next pixel */ - IN_PIXEL8(line, i, 0, width, last_pixel, pixel); - IN_PIXEL8(last_line, i, 0, width, last_ypixel, ypixel); - - if (!TEST_FILL) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - RESET_COUNTS; - } - - fill_count = 0; - } - - if (!TEST_MIX) - { - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - RESET_COUNTS; - } - - mix_count = 0; - } - - if (!TEST_COLOR) - { - if (color_count > 3 && - color_count >= fill_count && - color_count >= bicolor_count && - color_count >= mix_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_COLOR_COUNT1(color_count, s, last_pixel); - RESET_COUNTS; - } - - color_count = 0; - } - - if (!TEST_BICOLOR) - { - if (bicolor_count > 3 && - bicolor_count >= fill_count && - bicolor_count >= color_count && - bicolor_count >= mix_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor2, bicolor1); - } - - RESET_COUNTS; - } - - bicolor_count = 0; - bicolor1 = last_pixel; - bicolor2 = pixel; - bicolor_spin = 0; - } - - if (!TEST_FOM) - { - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - - fom_count = 0; - fom_mask_len = 0; - } - - if (TEST_FILL) - { - fill_count++; - } - - if (TEST_MIX) - { - mix_count++; - } - - if (TEST_COLOR) - { - color_count++; - } - - if (TEST_BICOLOR) - { - bicolor_spin = !bicolor_spin; - bicolor_count++; - } - - if (TEST_FOM) - { - if ((fom_count % 8) == 0) - { - fom_mask[fom_mask_len] = 0; - fom_mask_len++; - } - - if (pixel == (ypixel ^ mix)) - { - fom_mask[fom_mask_len - 1] |= (1 << (fom_count % 8)); - } - - fom_count++; - } - - Stream_Write_UINT8(temp_s, pixel); - count++; - last_pixel = pixel; - last_ypixel = ypixel; - } - - /* can't take fix, mix, or fom past first line */ - if (last_line == 0) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - RESET_COUNTS; - } - - fill_count = 0; - - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - RESET_COUNTS; - } - - mix_count = 0; - - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - - fom_count = 0; - fom_mask_len = 0; - } - - last_line = line; - line = line - width; - start_line--; - lines_sent++; - } - - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - } - else if (mix_count > 3 && - mix_count >= color_count && - mix_count >= bicolor_count && - mix_count >= fill_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - } - else if (color_count > 3 && - color_count >= mix_count && - color_count >= bicolor_count && - color_count >= fill_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_COLOR_COUNT1(color_count, s, last_pixel); - } - else if (bicolor_count > 3 && - bicolor_count >= mix_count && - bicolor_count >= color_count && - bicolor_count >= fill_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor2, bicolor1); - } - - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else if (fom_count > 3 && - fom_count >= mix_count && - fom_count >= color_count && - fom_count >= fill_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - } - else - { - OUT_COPY_COUNT1(count, s, temp_s); - } - } - else if ((bpp == 15) || (bpp == 16)) + if ((bpp == 15) || (bpp == 16)) { mix = (bpp == 15) ? 0xBA1F : 0xFFFF; out_count = end * 2; - line = in_data + width * start_line * 2; + line = srcData + width * start_line * 2; while (start_line >= 0 && out_count < 32768) { @@ -1279,7 +795,7 @@ int freerdp_bitmap_compress(char* in_data, int width, int height, { mix = 0xFFFFFF; out_count = end * 3; - line = in_data + width * start_line * 4; + line = srcData + width * start_line * 4; while (start_line >= 0 && out_count < 32768) {