Sun, 16 Mar 2003 15:27:06 +0000
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;