fix shifting in flip_h().

Sun, 16 Mar 2003 15:27:06 +0000

author
eric
date
Sun, 16 Mar 2003 15:27:06 +0000
changeset 135
5d3d2dccb3ff
parent 134
313aba417199
child 136
82d6f19753d6

fix shifting in flip_h().

bitblt.c file | annotate | diff | revisions
     1.1 --- a/bitblt.c	Sun Mar 16 13:58:26 2003 +0000
     1.2 +++ b/bitblt.c	Sun Mar 16 15:27:06 2003 +0000
     1.3 @@ -2,7 +2,7 @@
     1.4   * tumble: build a PDF file from image files
     1.5   *
     1.6   * bitblt routines
     1.7 - * $Id: bitblt.c,v 1.16 2003/03/13 00:57:05 eric Exp $
     1.8 + * $Id: bitblt.c,v 1.17 2003/03/16 07:27:06 eric Exp $
     1.9   * Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
    1.10   *
    1.11   * This program is free software; you can redistribute it and/or modify
    1.12 @@ -56,6 +56,24 @@
    1.13  }
    1.14  
    1.15  
    1.16 +static void reverse_range_of_bytes (uint8_t *b, uint32_t count)
    1.17 +{
    1.18 +  uint8_t *b2 = b + count - 1;
    1.19 +  
    1.20 +  while (b < b2)
    1.21 +    {
    1.22 +      uint8_t t = bit_reverse_byte [*b];
    1.23 +      *b = bit_reverse_byte [*b2];
    1.24 +      *b2 = t;
    1.25 +      b++;
    1.26 +      b2--;
    1.27 +    }
    1.28 +
    1.29 +  if (b == b2)
    1.30 +    *b = bit_reverse_byte [*b];
    1.31 +}
    1.32 +
    1.33 +
    1.34  static word_t *temp_buffer;
    1.35  static word_t temp_buffer_size;
    1.36  
    1.37 @@ -627,30 +645,22 @@
    1.38  void flip_h (Bitmap *src)
    1.39  {
    1.40    word_t *rp;  /* row pointer */
    1.41 -  word_t *p1;  /* work src ptr */
    1.42 -  word_t *p2;  /* work dest ptr */
    1.43    int32_t y;
    1.44    int shift1, shift2;
    1.45  
    1.46 -  realloc_temp_buffer ((src->row_words + 1) * sizeof (word_t));
    1.47 -
    1.48    rp = src->bits;
    1.49    if ((rect_width (& src->rect) & 7) == 0)
    1.50      {
    1.51        for (y = src->rect.min.y; y < src->rect.max.y; y++)
    1.52  	{
    1.53 -	  memcpy (temp_buffer, rp, src->row_words * sizeof (word_t));
    1.54 -	  p1 = temp_buffer + src->row_words;
    1.55 -	  p2 = rp;
    1.56 -
    1.57 -	  while (p1 >= temp_buffer)
    1.58 -	    *(p2++) = bit_reverse_word (*(p1--));
    1.59 -      
    1.60 +          reverse_range_of_bytes ((uint8_t *) rp, rect_width (& src->rect) / 8);
    1.61  	  rp += src->row_words;
    1.62  	}
    1.63        return;
    1.64      }
    1.65  
    1.66 +  realloc_temp_buffer ((src->row_words + 1) * sizeof (word_t));
    1.67 +
    1.68    temp_buffer [0] = 0;
    1.69    shift1 = rect_width (& src->rect) & (BITS_PER_WORD - 1);
    1.70    shift2 = BITS_PER_WORD - shift1;
    1.71 @@ -658,6 +668,8 @@
    1.72    for (y = src->rect.min.y; y < src->rect.max.y; y++)
    1.73      {
    1.74        word_t d1, d2;
    1.75 +      word_t *p1;  /* work src ptr */
    1.76 +      word_t *p2;  /* work dest ptr */
    1.77  
    1.78        memcpy (temp_buffer + 1, rp, src->row_words * sizeof (word_t));
    1.79        p1 = temp_buffer + src->row_words;
    1.80 @@ -667,8 +679,10 @@
    1.81  
    1.82        while (p1 >= temp_buffer)
    1.83  	{
    1.84 +	  word_t t;
    1.85  	  d1 = *(p1--);
    1.86 -	  *(p2++) = bit_reverse_word ((d1 << shift1) | (d2 >> shift2));
    1.87 +	  t = (d1 >> shift1) | (d2 << shift2);
    1.88 +	  *(p2++) = bit_reverse_word (t);
    1.89  	  d2 = d1;
    1.90  	}      
    1.91  
    1.92 @@ -676,6 +690,7 @@
    1.93      }
    1.94  }
    1.95  
    1.96 +
    1.97  void flip_v (Bitmap *src)
    1.98  {
    1.99    word_t *p1, *p2;