diff options
Diffstat (limited to 'nx-X11/lib/lbxutil/image/dpackbits.c')
-rw-r--r-- | nx-X11/lib/lbxutil/image/dpackbits.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/nx-X11/lib/lbxutil/image/dpackbits.c b/nx-X11/lib/lbxutil/image/dpackbits.c new file mode 100644 index 000000000..f0f2058d0 --- /dev/null +++ b/nx-X11/lib/lbxutil/image/dpackbits.c @@ -0,0 +1,100 @@ +/* $Xorg: dpackbits.c,v 1.4 2000/08/17 19:46:40 cpqbld Exp $ */ +/* + * Copyright (c) 1988, 1989, 1990, 1991, 1992 Sam Leffler + * Copyright (c) 1991, 1992 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ +/* $XFree86: xc/lib/lbxutil/image/dpackbits.c,v 1.3 2000/05/18 23:46:16 dawes Exp $ */ + +#include <X11/Xos.h> +#include <X11/Xfuncproto.h> +#include <X11/extensions/lbximage.h> + +/* + * ------------------------------------------------------------------------- + * PackBits decoding for 8 bit color images + * ------------------------------------------------------------------------- + */ + +static void +DecodePackBits (char **inbuf, + int numPixels, + char *outbuf) + +{ + register char *inptr = *inbuf; + register int n, b; + + while (numPixels > 0) + { + n = (int) *inptr++; + + /* Watch out for compilers that don't sign extend chars... */ + + if (n >= 128) + n -= 256; + + if (n < 0) + { + /* replicate next byte -n+1 times */ + + if (n == -128) /* nop */ + continue; + + n = -n + 1; + numPixels -= n; + for (b = *inptr++; n-- > 0;) + *outbuf++ = b; + } + else + { + /* copy next n+1 bytes literally */ + + memcpy (outbuf, inptr, ++n); + outbuf += n; numPixels -= n; + inptr += n; + } + } + + *inbuf = inptr; +} + + +int +LbxImageDecodePackBits (char *inbuf, + char *outbuf, + int num_scan_lines, + int scan_line_size) + +{ + char *outbuf_start = outbuf; + int padded_scan_line_size = (scan_line_size % 4) ? + scan_line_size + (4 - scan_line_size % 4) : scan_line_size; + + while (num_scan_lines > 0) + { + DecodePackBits (&inbuf, scan_line_size, outbuf); + outbuf += padded_scan_line_size; + num_scan_lines--; + } + + return (outbuf - outbuf_start); +} |