diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-05-18 17:01:29 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-08-24 13:37:51 -0400 |
commit | c0b048ebef41b3a79d42e96c0ecaef65e1bb7599 (patch) | |
tree | eb634cbf7d8a07379490c36a795c6522bea58095 /common/lz_compress_tmpl.c | |
parent | 0c1b6de4ad1b3e9d6da50979bb259f0acdc2fd2f (diff) | |
download | spice-common-c0b048ebef41b3a79d42e96c0ecaef65e1bb7599.tar.gz spice-common-c0b048ebef41b3a79d42e96c0ecaef65e1bb7599.tar.xz spice-common-c0b048ebef41b3a79d42e96c0ecaef65e1bb7599.zip |
Add support for A8 images to the LZ routines
This format is needed to add Render support to the X driver, so we
need the ability to compress and decompress it.
Diffstat (limited to 'common/lz_compress_tmpl.c')
-rw-r--r-- | common/lz_compress_tmpl.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/common/lz_compress_tmpl.c b/common/lz_compress_tmpl.c index 6db5387..7e2ce42 100644 --- a/common/lz_compress_tmpl.c +++ b/common/lz_compress_tmpl.c @@ -71,6 +71,21 @@ } #endif +#ifdef LZ_A8 +#define PIXEL one_byte_pixel_t +#define FNAME(name) lz_a8_##name +#define ENCODE_PIXEL(e, pix) encode(e, (pix).a) // gets the pixel and write only the needed bytes + // from the pixel +#define SAME_PIXEL(pix1, pix2) ((pix1).a == (pix2).a) +#define HASH_FUNC(v, p) { \ + v = DJB2_START; \ + DJB2_HASH(v, p[0].a); \ + DJB2_HASH(v, p[1].a); \ + DJB2_HASH(v, p[2].a); \ + v &= HASH_MASK; \ + } +#endif + #ifdef LZ_RGB_ALPHA //#undef LZ_RGB_ALPHA #define PIXEL rgb32_pixel_t @@ -177,7 +192,7 @@ static void FNAME(compress_seg)(Encoder *encoder, LzImageSegment *seg, PIXEL *fr size_t distance; /* minimum match length */ -#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) +#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_A8) size_t len = 3; #elif defined(LZ_RGB16) size_t len = 2; @@ -234,7 +249,7 @@ static void FNAME(compress_seg)(Encoder *encoder, LzImageSegment *seg, PIXEL *fr ip++; /* minimum match length for rgb16 is 2 and for plt and alpha is 3 */ -#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_RGB16) +#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_RGB16) || defined(LZ_A8) if (!SAME_PIXEL(*ref, *ip)) { ref++; ip++; @@ -244,7 +259,7 @@ static void FNAME(compress_seg)(Encoder *encoder, LzImageSegment *seg, PIXEL *fr ip++; #endif -#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) +#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_A8) if (!SAME_PIXEL(*ref, *ip)) { ref++; ip++; @@ -255,7 +270,7 @@ static void FNAME(compress_seg)(Encoder *encoder, LzImageSegment *seg, PIXEL *fr #endif /* far, needs at least 5-byte match */ if (distance >= MAX_DISTANCE) { -#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) +#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_A8) if (ref >= (ref_limit - 1)) { goto literal; } @@ -272,7 +287,7 @@ static void FNAME(compress_seg)(Encoder *encoder, LzImageSegment *seg, PIXEL *fr ref++; ip++; len++; -#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) +#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA) || defined(LZ_A8) if (!SAME_PIXEL(*ref, *ip)) { ref++; ip++; @@ -464,9 +479,11 @@ static void FNAME(compress)(Encoder *encoder) LzImageSegment *cur_seg = encoder->head_image_segs; HashEntry *hslot; PIXEL *ip; + PIXEL *ip_start; // fetch the first image segment that is not too small while (cur_seg && ((((PIXEL *)cur_seg->lines_end) - ((PIXEL *)cur_seg->lines)) < 4)) { + ip_start = cur_seg->lines; // coping the segment if (cur_seg->lines != cur_seg->lines_end) { ip = (PIXEL *)cur_seg->lines; @@ -526,4 +543,5 @@ static void FNAME(compress)(Encoder *encoder) #undef LZ_RGB16 #undef LZ_RGB24 #undef LZ_RGB32 +#undef LZ_A8 #undef HASH_FUNC2 |