added run length encoding function.

Thu, 20 Feb 2003 12:11:06 +0000

author
eric
date
Thu, 20 Feb 2003 12:11:06 +0000
changeset 57
b2a2f61135bb
parent 56
425e8c46d318
child 58
d1c6dc4bf34a

added run length encoding function.

bitblt.c file | annotate | diff | revisions
bitblt.h file | annotate | diff | revisions
     1.1 --- a/bitblt.c	Wed Feb 19 10:34:35 2003 +0000
     1.2 +++ b/bitblt.c	Thu Feb 20 12:11:06 2003 +0000
     1.3 @@ -4,7 +4,7 @@
     1.4   *      will be compressed using ITU-T T.6 (G4) fax encoding.
     1.5   *
     1.6   * bitblt routines
     1.7 - * $Id: bitblt.c,v 1.11 2003/02/19 02:14:44 eric Exp $
     1.8 + * $Id: bitblt.c,v 1.12 2003/02/20 04:11: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 @@ -726,6 +726,79 @@
    1.13  }
    1.14  
    1.15  
    1.16 -void bitblt_init (void)
    1.17 +int32_t get_row_run_lengths (Bitmap *src,
    1.18 +			     int32_t y,
    1.19 +			     int32_t min_x, int32_t max_x,
    1.20 +			     int32_t max_runs,
    1.21 +			     uint32_t *run_length)
    1.22  {
    1.23 +  uint8_t *byte_ptr;
    1.24 +  uint8_t byte;
    1.25 +  int bit_pos;
    1.26 +
    1.27 +  uint32_t byte_cnt;
    1.28 +  int last_bits;
    1.29 +  bool last_flag = 0;
    1.30 +
    1.31 +  uint8_t pol = 0x00;  /* 0x00 = counting zeros (white),
    1.32 +			  0xff = counting ones (black) */
    1.33 +
    1.34 +  uint32_t rl;
    1.35 +  int32_t i = 0;
    1.36 +
    1.37 +  /* adjust coordinate system */
    1.38 +  y -= src->rect.min.y;
    1.39 +  min_x -= src->rect.min.x;
    1.40 +  max_x -= src->rect.min.x;
    1.41 +
    1.42 +  byte_ptr = (uint8_t *) (src->bits + y * src->row_words);
    1.43 +  byte_cnt = (max_x / 8) + 1 - (min_x / 8);
    1.44 +  last_bits = max_x % 8;
    1.45 +
    1.46 +  rl = 0;
    1.47 +  pol = 0x00;  /* initially count white pixels */
    1.48 +
    1.49 +  byte_ptr += min_x / 8;
    1.50 +  bit_pos = min_x % 8;
    1.51 +  byte = *(byte_ptr++);
    1.52 +
    1.53 +  /* is the first byte also the last? */
    1.54 +  if (--byte_cnt == 0)
    1.55 +    {
    1.56 +      byte <<= (7 - last_bits);	  /* last byte may be partial */
    1.57 +      bit_pos += (7 - last_bits);
    1.58 +      last_flag = 1;
    1.59 +    }
    1.60 +
    1.61 +  for (;;)
    1.62 +    {
    1.63 +      int b2 = rle_tab [bit_pos] [pol ^ byte];
    1.64 +      rl += b2;
    1.65 +      bit_pos += b2;
    1.66 +      if (bit_pos == 8)
    1.67 +	{
    1.68 +	  if (last_flag)
    1.69 +	    {
    1.70 +	      if (rl)
    1.71 +		run_length [i++] = rl;
    1.72 +	      return (i);
    1.73 +	    }
    1.74 +	  bit_pos = 0;
    1.75 +	  byte = *(byte_ptr++);
    1.76 +	  if (--byte_cnt == 0)
    1.77 +	    {
    1.78 +	      byte <<= (7 - last_bits);	  /* last byte may be partial */
    1.79 +	      bit_pos += (7 - last_bits);
    1.80 +	      last_flag = 1;
    1.81 +	    }
    1.82 +	}
    1.83 +      else
    1.84 +	{
    1.85 +	  run_length [i++] = rl;
    1.86 +	  if (i == max_runs)
    1.87 +	    return (-i);
    1.88 +	  rl = 0;
    1.89 +	  pol ^= 0xff;
    1.90 +	}
    1.91 +    }
    1.92  }
     2.1 --- a/bitblt.h	Wed Feb 19 10:34:35 2003 +0000
     2.2 +++ b/bitblt.h	Thu Feb 20 12:11:06 2003 +0000
     2.3 @@ -4,7 +4,7 @@
     2.4   *      will be compressed using ITU-T T.6 (G4) fax encoding.
     2.5   *
     2.6   * bitblt routines
     2.7 - * $Id: bitblt.h,v 1.10 2003/02/19 02:14:44 eric Exp $
     2.8 + * $Id: bitblt.h,v 1.11 2003/02/20 04:11:06 eric Exp $
     2.9   * Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
    2.10   *
    2.11   * This program is free software; you can redistribute it and/or modify
    2.12 @@ -98,3 +98,25 @@
    2.13  
    2.14  
    2.15  void reverse_bits (uint8_t *p, int byte_count);
    2.16 +
    2.17 +
    2.18 +/*
    2.19 + * get_row_run_lengths counts the runs of 0 and 1 bits in row
    2.20 + * y of a bitmap, from min_x through max_x inclusive.  The run lengths
    2.21 + * will be stored in the run_length array.  The first entry will be
    2.22 + * the length of a zero run (which length may be zero, if the first
    2.23 + * bit is a one).  The next entry will the be the length of a run of
    2.24 + * ones, and they will alternate from there, with even entries representing
    2.25 + * runs of zeros, and odd entries representing runs of ones.
    2.26 + *
    2.27 + * max_runs should be set to the maximum number of run lengths that
    2.28 + * can be stored in the run_length array.
    2.29 + *
    2.30 + * Returns the actual number of runs counted, or -max_runs if there
    2.31 + * was not enough room in the array.
    2.32 + */
    2.33 +int32_t get_row_run_lengths (Bitmap *src,
    2.34 +			     int32_t y,
    2.35 +			     int32_t min_x, int32_t max_x,
    2.36 +			     int32_t max_runs,
    2.37 +			     uint32_t *run_length);