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