libfreerdp-codec: start implementing delta-encoding of planar scanlines

This commit is contained in:
Marc-André Moreau 2013-11-26 16:07:55 -05:00
parent 021ef0533e
commit 52a1b328f2
3 changed files with 140 additions and 0 deletions

View File

@ -147,6 +147,94 @@ int freerdp_bitmap_compress_planar_rle_plane_scanline(BYTE* plane, int size)
return 0;
}
int freerdp_bitmap_planar_delta_encode_scanlines(BYTE* plane, int width, int height)
{
char s2c;
int delta;
int i, j, k;
k = 0;
for (i = 0; i < height; i++)
{
printf("{ ");
for (j = 0; j < width; j++)
{
printf("%4d%s", plane[k],
(j + 1 == width) ? " }\n" : ", ");
k++;
}
}
printf("\n");
k = 0;
for (i = 0; i < height; i++)
{
printf("{ ");
for (j = 0; j < width; j++)
{
if (i < 1)
{
delta = plane[j];
printf("%4d%s", delta,
(j + 1 == width) ? " }\n" : ", ");
}
else
{
delta = plane[(i * width) + j] - plane[((i - 1) * width) + j];
printf("%4d%s", (int) delta,
(j + 1 == width) ? " }\n" : ", ");
}
k++;
}
}
printf("\n");
k = 0;
for (i = 0; i < height; i++)
{
printf("{ ");
for (j = 0; j < width; j++)
{
if (i < 1)
{
delta = plane[j];
s2c = (delta >= 0) ? (char) delta : (char) (~((BYTE) (delta * -1)) + 1);
printf("%4d%s", s2c,
(j + 1 == width) ? " }\n" : ", ");
}
else
{
delta = plane[(i * width) + j] - plane[((i - 1) * width) + j];
s2c = (delta >= 0) ? (char) delta : (char) (~((BYTE) (delta * -1)) + 1);
printf("%4d%s", s2c,
(j + 1 == width) ? " }\n" : ", ");
}
k++;
}
}
printf("\n");
return 0;
}
BYTE* freerdp_bitmap_compress_planar(BYTE* data, UINT32 format, int width, int height, int scanline, BYTE* dstData, int* dstSize)
{
int size;

View File

@ -63,5 +63,6 @@ typedef struct _RDP6_BITMAP_STREAM RDP6_BITMAP_STREAM;
int freerdp_split_color_planes(BYTE* data, UINT32 format, int width, int height, int scanline, BYTE* planes[4]);
int freerdp_bitmap_compress_planar_rle_plane_scanline(BYTE* plane, int size);
int freerdp_bitmap_planar_delta_encode_scanlines(BYTE* plane, int width, int height);
#endif /* FREERDP_CODEC_PLANAR_PRIVATE_H */

View File

@ -160,6 +160,55 @@ const BYTE TEST_RLE_COMPRESSED_BITMAP[220] =
const BYTE TEST_RLE_SCANLINE_UNCOMPRESSED[12] =
"AAAABBCCCCCD";
/**
* [MS-RDPEGDI] 3.1.9.2.1 Encoding Run-Length Sequences
*/
/* Scanline Absolute Values */
const BYTE TEST_RDP6_SCANLINES_ABSOLUTE[3][6] =
{
{ 255, 255, 255, 255, 254, 253 },
{ 254, 192, 132, 96, 75, 25 },
{ 253, 140, 62, 14, 135, 193 }
};
/* Scanline Delta Values */
const int TEST_RDP6_SCANLINES_DELTA[3][6] =
{
{ 255, 255, 255, 255, 254, 253 },
{ -1, -63, -123, -159, -179, -228 },
{ -1, -52, -70, -82, 60, 168 }
};
/* Scanline Delta Values (1-byte two's complement) */
const char TEST_RDP6_SCANLINES_DELTA_2C[3][6] =
{
{ -1, -1, -1, -1, -2, -3 },
{ -1, -63, -123, 97, 77, 28 },
{ -1, -52, -70, -82, 60, -88 }
};
/* Scanline Delta Values (1-byte two's complement, encoded) */
const char TEST_RDP6_SCANLINES_DELTA_2C_ENCODED[3][6] =
{
{ -1, -1, -1, -1, -2, -3 },
{ -1, 125, 11, -62, -102, 56 },
{ 1, 103, -117, -93, 120, -81 }
};
/* Scanline Delta Values (1-byte two's complement, encoded, unsigned) */
const BYTE TEST_RDP6_SCANLINES_DELTA_2C_ENCODED_UNSIGNED[3][6] =
{
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD },
{ 0x01, 0x7D, 0xF5, 0xC2, 0x9A, 0x38 },
{ 0x01, 0x67, 0x8B, 0xA3, 0x78, 0xAF }
};
#include "../planar.h"
int TestFreeRDPCodecPlanar(int argc, char* argv[])
@ -181,6 +230,8 @@ int TestFreeRDPCodecPlanar(int argc, char* argv[])
freerdp_bitmap_compress_planar_rle_plane_scanline((BYTE*) TEST_RLE_SCANLINE_UNCOMPRESSED, 12);
freerdp_bitmap_planar_delta_encode_scanlines((BYTE*) TEST_RDP6_SCANLINES_ABSOLUTE, 6, 3);
freerdp_clrconv_free(clrconv);
free(srcBitmap32);