libfreerdp-codec: start implementing delta-encoding of planar scanlines
This commit is contained in:
parent
021ef0533e
commit
52a1b328f2
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user