#ifndef _XPRESS_H_ #define _XPRESS_H_ #ifdef _MSC_VER #pragma once #endif /* ------------------------------------------------------------------------ */ /* */ /* Copyright (c) Microsoft Corporation, 2000-2002. All rights reserved. */ /* Copyright (c) Andrew Kadatch, 1991-2002. All rights reserved. */ /* */ /* Microsoft Confidential -- do not redistribute. */ /* */ /* ------------------------------------------------------------------------ */ #ifdef __cplusplus extern "C" { #endif /* ---------------------- Common declarations ------------------------- */ /* ------------------- */ // max. size of input block #define XPRESS_MAX_BLOCK_LOG 16 #define XPRESS_MAX_BLOCK (1 << XPRESS_MAX_BLOCK_LOG) // preferred data alignment to avoid misaligned accesses #define XPRESS_ALIGNMENT 8 // declare default calling convention used in xpress #if !defined (UNIX) && !defined (XPRESS_CALL) #define XPRESS_CALL __stdcall #endif #if !defined (XPRESS_EXPORT) #define XPRESS_EXPORT #endif // user-supplied callback function that allocates memory // if there is no memory available it shall return NULL typedef void * XPRESS_CALL XpressAllocFn ( void *Context, // user-defined context (as passed to XpressEncodeCreate) int AllocSize // size of memory block to allocate (bytes) ); // user-supplied callback function that releases memory typedef void XPRESS_CALL XpressFreeFn ( void *Context, // user-defined context (as passed to XpressEncodeClose) void *Address // pointer to the block to be freed ); /* ----------------------------- Encoder ------------------------------ */ /* ------- */ // declare unique anonymous types for type safety typedef struct {int XpressEncodeDummy;} *XpressEncodeStream; // allocate and initialize encoder's data structures // returns NULL if callback returned NULL (not enough memory) XPRESS_EXPORT XpressEncodeStream XPRESS_CALL XpressEncodeCreate ( int MaxOrigSize, // max size of original data block (bytes) void *Context, // user-defined context info (will be passed to AllocFn) XpressAllocFn *AllocFn, // memory allocation callback int CompressionLevel // use 0 for speed, 9 for quality ); // callback function called by XpressEncode to indicate compression progress typedef void XPRESS_CALL XpressProgressFn ( void *Context, // user-defined context int EncodedSize // size of processed original data (bytes) ); // returns size of compressed data // if compression failed then compressed buffer is left as is, and // original data should be saved instead XPRESS_EXPORT int XPRESS_CALL XpressEncode ( XpressEncodeStream EncodeStream, // encoder's workspace void *CompAdr, // address of beggining of output memory region int CompSize, // size of output memory region (bytes) const void *OrigAdr, // address of beggining of input data block int OrigSize, // input data block size (bytes) XpressProgressFn *ProgressFn, // NULL or progress callback void *ProgressContext, // user-defined context that will be passed to ProgressFn int ProgressSize // call ProgressFn each time ProgressSize bytes processed ); // returns size of compressed data // if compression failed then compressed buffer is left as is, and // original data should be saved instead XPRESS_EXPORT int XPRESS_CALL XpressEncodeEx ( XpressEncodeStream EncodeStream, // encoder's workspace void *CompAdr, // address of beggining of output memory region int CompSize, // size of output memory region (bytes) const void *OrigAdr, // address of beggining of input data block int OrigSize, // input data block size (bytes) XpressProgressFn *ProgressFn, // NULL or progress callback void *ProgressContext, // user-defined context that will be passed to ProgressFn int ProgressSize, // call ProgressFn each time ProgressSize bytes processed int CompressionLevel // CompressionLevel should not exceed MaxCompressionLevel ); // returns MaxCompressionLevel or (-1) if stream was not initialized properly XPRESS_EXPORT int XPRESS_CALL XpressEncodeGetMaxCompressionLevel ( XpressEncodeStream EncodeStream // encoder's workspace ); // invalidate encoding stream and release workspace memory XPRESS_EXPORT void XPRESS_CALL XpressEncodeClose ( XpressEncodeStream EncodeStream, // encoder's workspace void *Context, // user-defined context for FreeFn XpressFreeFn *FreeFn // memory release callback ); /* ----------------------------- Decoder ------------------------------ */ /* ------- */ // declare unique anonymous types for type safety typedef struct {int XpressDecodeDummy;} *XpressDecodeStream; // allocate memory for decoder. Returns NULL if not enough memory. XPRESS_EXPORT XpressDecodeStream XPRESS_CALL XpressDecodeCreate ( void *Context, // user-defined context info (will be passed to AllocFn) XpressAllocFn *AllocFn // memory allocation callback ); // decode compressed block. Returns # of decoded bytes or -1 otherwise XPRESS_EXPORT int XPRESS_CALL XpressDecode ( XpressDecodeStream DecodeStream, // decoder's workspace void *OrigAdr, // address of beginning out output memory region int OrigSize, // size of output memory region (bytes) int DecodeSize, // # of bytes to decode ( <= OrigSize) const void *CompAdr, // address of beginning of compressed data block int CompSize // size of compressed data block (bytes) ); // invalidate decoding stream and release workspace memory XPRESS_EXPORT void XPRESS_CALL XpressDecodeClose ( XpressDecodeStream DecodeStream, // encoder's workspace void *Context, // user-defined context info (will be passed to FreeFn) XpressFreeFn *FreeFn // callback that releases the memory ); #ifdef __cplusplus }; #endif #endif /* _XPRESS_H_ */