xref: /plan9-contrib/sys/src/cmd/gs/src/shc.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1992, 1995 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: shc.c,v 1.4 2002/02/21 22:24:54 giles Exp $ */
187dd7cddfSDavid du Colombier /* Support code for shc.h */
197dd7cddfSDavid du Colombier #include "std.h"
207dd7cddfSDavid du Colombier #include "scommon.h"
217dd7cddfSDavid du Colombier #include "shc.h"
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier /* ------ Encoding ------ */
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier /* Empty the 1-word buffer onto the output stream. */
267dd7cddfSDavid du Colombier /* q has already been incremented. */
277dd7cddfSDavid du Colombier void
hc_put_code_proc(bool reverse_bits,byte * q,uint cw)287dd7cddfSDavid du Colombier hc_put_code_proc(bool reverse_bits, byte * q, uint cw)
297dd7cddfSDavid du Colombier {
307dd7cddfSDavid du Colombier #define cb(n) ((byte)(cw >> (n * 8)))
317dd7cddfSDavid du Colombier     if (reverse_bits) {
327dd7cddfSDavid du Colombier #if hc_bits_size > 16
337dd7cddfSDavid du Colombier 	q[-3] = byte_reverse_bits[cb(3)];
347dd7cddfSDavid du Colombier 	q[-2] = byte_reverse_bits[cb(2)];
357dd7cddfSDavid du Colombier #endif
367dd7cddfSDavid du Colombier 	q[-1] = byte_reverse_bits[cb(1)];
377dd7cddfSDavid du Colombier 	q[0] = byte_reverse_bits[cb(0)];
387dd7cddfSDavid du Colombier     } else {
397dd7cddfSDavid du Colombier #if hc_bits_size > 16
407dd7cddfSDavid du Colombier 	q[-3] = cb(3);
417dd7cddfSDavid du Colombier 	q[-2] = cb(2);
427dd7cddfSDavid du Colombier #endif
437dd7cddfSDavid du Colombier 	q[-1] = cb(1);
447dd7cddfSDavid du Colombier 	q[0] = cb(0);
457dd7cddfSDavid du Colombier     }
467dd7cddfSDavid du Colombier #undef cb
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier /* Put out any final bytes. */
507dd7cddfSDavid du Colombier /* Note that this does a store_state, but not a load_state. */
517dd7cddfSDavid du Colombier byte *
hc_put_last_bits_proc(stream_hc_state * ss,byte * q,uint bits,int bits_left)527dd7cddfSDavid du Colombier hc_put_last_bits_proc(stream_hc_state * ss, byte * q, uint bits, int bits_left)
537dd7cddfSDavid du Colombier {
547dd7cddfSDavid du Colombier     while (bits_left < hc_bits_size) {
557dd7cddfSDavid du Colombier 	byte c = (byte) (bits >> (hc_bits_size - 8));
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	if (ss->FirstBitLowOrder)
587dd7cddfSDavid du Colombier 	    c = byte_reverse_bits[c];
597dd7cddfSDavid du Colombier 	*++q = c;
607dd7cddfSDavid du Colombier 	bits <<= 8;
617dd7cddfSDavid du Colombier 	bits_left += 8;
627dd7cddfSDavid du Colombier     }
637dd7cddfSDavid du Colombier     ss->bits = bits;
647dd7cddfSDavid du Colombier     ss->bits_left = bits_left;
657dd7cddfSDavid du Colombier     return q;
667dd7cddfSDavid du Colombier }
67