/* szlib.h -- defines, typedefs, and data structures for szlib API functions. */

/*==============================================================================
The SZIP Science Data Lossless Compression Program is Copyright (C) 2001 Science
& Technology Corporation @ UNM.  All rights released.  Copyright (C) 2003 Lowell
H. Miles and Jack A. Venbrux.  Licensed to ICs Corp. for distribution by the
University of Illinois' National Center for Supercomputing Applications as a
part of the HDF data storage and retrieval file format and software library
products package.  All rights reserved.  Do not modify or use for other
purposes.

SZIP implements an extended Rice adaptive lossless compression algorithm
for sample data.  The primary algorithm was developed by R. F. Rice at
Jet Propulsion Laboratory.  

SZIP embodies certain inventions patented by the National Aeronautics &
Space Administration.  United States Patent Nos. 5,448,642, 5,687,255,
and 5,822,457 have been licensed to ICs Corp. for distribution with the
HDF data storage and retrieval file format and software library products.
All rights reserved.

Revocable (in the event of breach by the user or if required by law), 
royalty-free, nonexclusive sublicense to use SZIP decompression software 
routines and underlying patents is hereby granted by ICs Corp. to all users 
of and in conjunction with HDF data storage and retrieval file format and 
software library products.

Revocable (in the event of breach by the user or if required by law), 
royalty-free, nonexclusive sublicense to use SZIP compression software 
routines and underlying patents for non-commercial, scientific use only 
is hereby granted by ICs Corp. to users of and in conjunction with HDF 
data storage and retrieval file format and software library products.

For commercial use license to SZIP compression software routines and underlying 
patents please contact ICs Corp. at ICs Corp., 721 Lochsa Street, Suite 8,
Post Falls, ID 83854.  (208) 262-2008.

==============================================================================*/
#ifndef _SZLIB_H
#define _SZLIB_H

#include "ricehdf.h"
#include "szip_adpt.h"

#define SZLIB_VERSION "2.1"

/*
   The application must update next_in and avail_in when avail_in has
   dropped to zero. It must update next_out and avail_out when avail_out
   has dropped to zero. The application must initialize zalloc, zfree and
   opaque before calling the init function. All other fields are set by the
   compression library and must not be updated by the application.

   The fields total_in and total_out can be used for statistics or
   progress reports. After compression, total_in holds the total size of
   the uncompressed data and may be saved for use in the decompressor
   (particularly if the decompressor wants to decompress everything in
   a single step).
*/

#define SZ_NULL  0

/*** API flush values ***/
#define SZ_NO_FLUSH      0
#define SZ_FINISH        4

/*** API state values ***/
#define SZ_INPUT_IMAGE   5
#define SZ_OUTPUT_IMAGE  6

/*** API return values ***/
#define SZ_OK			0
#define SZ_STREAM_END	1
#define SZ_OUTBUFF_FULL 2

/*** API error values defined in ricehdf.h ***/
/* SZ_STREAM_ERROR */
/* SZ_MEM_ERROR    */
/* SZ_INIT_ERROR   */
/* SZ_PARAM_ERROR  */
/* SZ_NO_ENCODER_ERROR  */

/*** API options_mask values defined in ricehdf.h ***/
/* SZ_ALLOW_K13_OPTION_MASK */
/* SZ_CHIP_OPTION_MASK      */
/* SZ_EC_OPTION_MASK        */
/* SZ_LSB_OPTION_MASK       */
/* SZ_MSB_OPTION_MASK       */
/* SZ_NN_OPTION_MASK        */
/* SZ_RAW_OPTION_MASK       */

/*** API MAX limits defined in ricehdf.h ***/
/* SZ_MAX_BLOCKS_PER_SCANLINE */
/* SZ_MAX_PIXELS_PER_BLOCK    */
/* SZ_MAX_PIXELS_PER_SCANLINE */

typedef struct sz_hidden_data_s
	{
	char *image_in;
	long avail_in;
	char *next_in;

	char *image_out;
	long avail_out;
	char *next_out;
	} sz_hidden_data; 

typedef struct sz_stream_s
	{
	char    		*next_in;  /* next input byte */
	unsigned int	avail_in;  /* number of bytes available at next_in */
	unsigned long	total_in;  /* total nb of input bytes read so far */

	char			*next_out; /* next output byte should be put there */
	unsigned int	avail_out; /* remaining free space at next_out */
	unsigned long	total_out; /* total nb of bytes output so far */

	char			*msg;
	int				state;

	void			*hidden;	/* this data hidden from user */

	int		options_mask;
	int		bits_per_pixel;
	int		pixels_per_block;
	int		pixels_per_scanline;
	long	image_pixels;
	} sz_stream;

typedef sz_stream *sz_streamp;

typedef struct SZ_com_t_s
	{
	int options_mask;
	int bits_per_pixel;
	int pixels_per_block;
	int pixels_per_scanline;
	} SZ_com_t;

__SZ_DLL__ int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param);
__SZ_DLL__ int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, const void *source, size_t sourceLen, SZ_com_t *param);

__SZ_DLL__ int SZ_DecompressInit(sz_stream *strm);
__SZ_DLL__ int SZ_Decompress(sz_stream *strm, int flush);
__SZ_DLL__ int SZ_DecompressEnd(sz_stream *strm);

__SZ_DLL__ int SZ_CompressInit(sz_stream *strm);
__SZ_DLL__ int SZ_Compress(sz_stream *strm, int flush);
__SZ_DLL__ int SZ_CompressEnd(sz_stream *strm);
__SZ_DLL__ int SZ_encoder_enabled(void);

#endif /* _SZLIB_H */