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