[Spice-devel] [spice-server PATCH v1 1/12] glz: use PIXEL_PTR to cast PIXEL*

Frediano Ziglio fziglio at redhat.com
Thu Aug 6 05:03:01 PDT 2015


> 
> Besides making the code a bit cleaner this would help avoid warnings
> about alignment from clang.
> 
> ./glz_encode_tmpl.c:321:29: error: cast from 'uint8_t *'
> (aka 'unsigned char *') to 'rgb16_pixel_t *' (aka 'unsigned short *')
> increases required alignment from 1 to 2 [-Werror,-Wcast-align]
>  ref_limit = (PIXEL *)(seg->lines_end);
>              ^~~~~~~~~~~~~~~~~~~~~~~~~

I don't know but it feels like lines_end and lines fields should be void* instead.

Frediano

> ---
>  server/glz_encode_tmpl.c | 48
>  ++++++++++++++++++++++++++----------------------
>  1 file changed, 26 insertions(+), 22 deletions(-)
> 
> diff --git a/server/glz_encode_tmpl.c b/server/glz_encode_tmpl.c
> index 1402f95..9101196 100644
> --- a/server/glz_encode_tmpl.c
> +++ b/server/glz_encode_tmpl.c
> @@ -128,14 +128,17 @@
>  
>  #endif
>  
> +#define PIXEL_PTR(ptr) \
> +    ((PIXEL *)(void *)ptr)
> +
>  #ifndef LZ_PLT
>  #define PIXEL_ID(pix_ptr, seg_ptr) \
> -    ((pix_ptr) - ((PIXEL *)(seg_ptr)->lines) + (seg_ptr)->pixels_so_far)
> +    ((pix_ptr) - PIXEL_PTR((seg_ptr)->lines) + (seg_ptr)->pixels_so_far)
>  #define PIXEL_DIST(src_pix_ptr, src_seg_ptr, ref_pix_ptr, ref_seg_ptr) \
>      (PIXEL_ID(src_pix_ptr,src_seg_ptr) - PIXEL_ID(ref_pix_ptr, ref_seg_ptr))
>  #else
>  #define PIXEL_ID(pix_ptr, seg_ptr, pix_per_byte) \
> -    (((pix_ptr) - ((PIXEL *)(seg_ptr)->lines)) * pix_per_byte +
> (seg_ptr)->pixels_so_far)
> +    (((pix_ptr) - PIXEL_PTR((seg_ptr)->lines)) * pix_per_byte +
> (seg_ptr)->pixels_so_far)
>  #define PIXEL_DIST(src_pix_ptr, src_seg_ptr, ref_pix_ptr, ref_seg_ptr,
>  pix_per_byte) \
>      ((PIXEL_ID(src_pix_ptr,src_seg_ptr, pix_per_byte) - \
>      PIXEL_ID(ref_pix_ptr, ref_seg_ptr, pix_per_byte)) / pix_per_byte)
> @@ -211,13 +214,13 @@ static INLINE size_t FNAME(do_match)(SharedDictionary
> *dict,
>      } else { // the ref is at different image - encode offset from the image
>      start
>  #ifndef LZ_PLT
>          *o_pix_distance = PIXEL_DIST(ref, ref_seg,
> -                                     (PIXEL
> *)(dict->window.segs[ref_seg->image->first_seg].lines),
> +
> PIXEL_PTR(dict->window.segs[ref_seg->image->first_seg].lines),
>                                       &dict->window.segs[ref_seg->image->first_seg]
>                                       );
>  #else
>          // in bytes
>          *o_pix_distance = PIXEL_DIST(ref, ref_seg,
> -                                     (PIXEL
> *)(dict->window.segs[ref_seg->image->first_seg].lines),
> +
> PIXEL_PTR(dict->window.segs[ref_seg->image->first_seg].lines),
>                                       &dict->window.segs[ref_seg->image->first_seg],
>                                       pix_per_byte);
>  #endif
> @@ -269,8 +272,8 @@ static void FNAME(compress_seg)(Encoder *encoder,
> uint32_t seg_idx, PIXEL *from,
>  {
>      WindowImageSegment *seg = &encoder->dict->window.segs[seg_idx];
>      const PIXEL *ip = from;
> -    const PIXEL *ip_bound = (PIXEL *)(seg->lines_end) - BOUND_OFFSET;
> -    const PIXEL *ip_limit = (PIXEL *)(seg->lines_end) - LIMIT_OFFSET;
> +    const PIXEL *ip_bound = PIXEL_PTR(seg->lines_end) - BOUND_OFFSET;
> +    const PIXEL *ip_limit = PIXEL_PTR(seg->lines_end) - LIMIT_OFFSET;
>      int hval;
>      int copy = copied;
>  #ifdef  LZ_PLT
> @@ -307,7 +310,7 @@ static void FNAME(compress_seg)(Encoder *encoder,
> uint32_t seg_idx, PIXEL *from,
>  
>          /* check for a run */
>  
> -        if (LZ_EXPECT_CONDITIONAL(ip > (PIXEL *)(seg->lines))) {
> +        if (LZ_EXPECT_CONDITIONAL(ip > PIXEL_PTR(seg->lines))) {
>              if (SAME_PIXEL(ip[-1], ip[0]) && SAME_PIXEL(ip[0], ip[1]) &&
>              SAME_PIXEL(ip[1], ip[2])) {
>                  PIXEL x;
>                  pix_dist = 1;
> @@ -315,7 +318,7 @@ static void FNAME(compress_seg)(Encoder *encoder,
> uint32_t seg_idx, PIXEL *from,
>  
>                  ip += 3;
>                  ref = anchor + 2;
> -                ref_limit = (PIXEL *)(seg->lines_end);
> +                ref_limit = PIXEL_PTR(seg->lines_end);
>                  len = 3;
>  
>                  x = *ref;
> @@ -348,11 +351,11 @@ static void FNAME(compress_seg)(Encoder *encoder,
> uint32_t seg_idx, PIXEL *from,
>              if (REF_SEG_IS_VALID(encoder->dict, encoder->id,
>                                   ref_seg, seg)) {
>  #ifdef CHAINED_HASH
> -                ref = ((PIXEL *)ref_seg->lines) +
> encoder->dict->htab[hval][hash_id].ref_pix_idx;
> +                ref = PIXEL_PTR(ref_seg->lines) +
> encoder->dict->htab[hval][hash_id].ref_pix_idx;
>  #else
> -                ref = ((PIXEL *)ref_seg->lines) +
> encoder->dict->htab[hval].ref_pix_idx;
> +                ref = PIXEL_PTR(ref_seg->lines) +
> encoder->dict->htab[hval].ref_pix_idx;
>  #endif
> -                ref_limit = (PIXEL *)ref_seg->lines_end;
> +                ref_limit = PIXEL_PTR(ref_seg->lines_end);
>  
>                  len = FNAME(do_match)(encoder->dict, ref_seg, ref,
>                  ref_limit, seg, ip, ip_bound,
>  #ifdef  LZ_PLT
> @@ -378,7 +381,7 @@ static void FNAME(compress_seg)(Encoder *encoder,
> uint32_t seg_idx, PIXEL *from,
>  #endif
>  
>          /* update hash table */
> -        UPDATE_HASH(encoder->dict, hval, seg_idx, anchor - ((PIXEL
> *)seg->lines));
> +        UPDATE_HASH(encoder->dict, hval, seg_idx, anchor -
> PIXEL_PTR(seg->lines));
>  
>          if (!len) {
>              goto literal;
> @@ -425,7 +428,7 @@ match:        // RLE or dictionary (both are encoded by
> distance from ref (-1) a
>          if (ip > anchor) {
>  #endif
>              HASH_FUNC(hval, ip);
> -            UPDATE_HASH(encoder->dict, hval, seg_idx, ip - ((PIXEL
> *)seg->lines));
> +            UPDATE_HASH(encoder->dict, hval, seg_idx, ip -
> PIXEL_PTR(seg->lines));
>              ip++;
>  #if defined(LZ_RGB16) || defined(LZ_RGB24) || defined(LZ_RGB32)
>          } else {ip++;
> @@ -435,7 +438,7 @@ match:        // RLE or dictionary (both are encoded by
> distance from ref (-1) a
>          if (ip > anchor) {
>  #endif
>              HASH_FUNC(hval, ip);
> -            UPDATE_HASH(encoder->dict, hval, seg_idx, ip - ((PIXEL
> *)seg->lines));
> +            UPDATE_HASH(encoder->dict, hval, seg_idx, ip -
> PIXEL_PTR(seg->lines));
>              ip++;
>  #if defined(LZ_RGB24) || defined(LZ_RGB32)
>          } else {
> @@ -505,16 +508,16 @@ static void FNAME(compress)(Encoder *encoder)
>      // fetch the first image segment that is not too small
>      while ((seg_id != NULL_IMAGE_SEG_ID) &&
>             (dict->window.segs[seg_id].image->id == encoder->cur_image.id) &&
> -           ((((PIXEL *)dict->window.segs[seg_id].lines_end) -
> -             ((PIXEL *)dict->window.segs[seg_id].lines)) < 4)) {
> +           ((PIXEL_PTR(dict->window.segs[seg_id].lines_end) -
> +             PIXEL_PTR(dict->window.segs[seg_id].lines)) < 4)) {
>          // coping the segment
>          if (dict->window.segs[seg_id].lines !=
>          dict->window.segs[seg_id].lines_end) {
> -            ip = (PIXEL *)dict->window.segs[seg_id].lines;
> +            ip = PIXEL_PTR(dict->window.segs[seg_id].lines);
>              // Note: we assume MAX_COPY > 3
>              encode_copy_count(encoder, (uint8_t)(
> -                                  (((PIXEL
> *)dict->window.segs[seg_id].lines_end) -
> -                                   ((PIXEL
> *)dict->window.segs[seg_id].lines)) - 1));
> -            while (ip < (PIXEL *)dict->window.segs[seg_id].lines_end) {
> +
> (PIXEL_PTR(dict->window.segs[seg_id].lines_end)
> -
> +
> PIXEL_PTR(dict->window.segs[seg_id].lines))
> - 1));
> +            while (ip < PIXEL_PTR(dict->window.segs[seg_id].lines_end)) {
>                  ENCODE_PIXEL(encoder, *ip);
>                  ip++;
>              }
> @@ -527,7 +530,7 @@ static void FNAME(compress)(Encoder *encoder)
>          return;
>      }
>  
> -    ip = (PIXEL *)dict->window.segs[seg_id].lines;
> +    ip = PIXEL_PTR(dict->window.segs[seg_id].lines);
>  
>  
>      encode_copy_count(encoder, MAX_COPY - 1);
> @@ -550,11 +553,12 @@ static void FNAME(compress)(Encoder *encoder)
>          seg_id != NULL_IMAGE_SEG_ID && (
>          dict->window.segs[seg_id].image->id == encoder->cur_image.id);
>          seg_id = dict->window.segs[seg_id].next) {
> -        FNAME(compress_seg)(encoder, seg_id, (PIXEL
> *)dict->window.segs[seg_id].lines, 0);
> +        FNAME(compress_seg)(encoder, seg_id,
> PIXEL_PTR(dict->window.segs[seg_id].lines), 0);
>      }
>  }
>  
>  #undef FNAME
> +#undef PIXEL_PTR
>  #undef PIXEL_ID
>  #undef PIXEL_DIST
>  #undef PIXEL
> --
> 2.4.3
> 


More information about the Spice-devel mailing list