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