/*
 * jlossy.h
 *
 * This file was part of the Independent JPEG Group's software:
 * Copyright (C) 1998, Thomas G. Lane.
 * Lossless JPEG Modifications:
 * Copyright (C) 1999, Ken Murchison.
 * For conditions of distribution and use, see the accompanying README file.
 *
 * This include file contains common declarations for the lossy (DCT-based)
 * JPEG codec modules.
 */

#ifndef JLOSSY_H
#define JLOSSY_H


/* Lossy-specific compression codec (compressor proper) */
typedef struct {
  struct jpeg_c_codec pub; /* public fields */


  /* Coefficient buffer control */
  JMETHOD(void, coef_start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
  /*  JMETHOD(boolean, coef_compress_data, (j_compress_ptr cinfo,
					JSAMPIMAGE input_buf));*/

  /* Pointer to data which is private to coef module */
  void *coef_private;


  /* Forward DCT (also controls coefficient quantization) */
  JMETHOD(void, fdct_start_pass, (j_compress_ptr cinfo));
  /* perhaps this should be an array??? */
  JMETHOD(void, fdct_forward_DCT, (j_compress_ptr cinfo,
				   jpeg_component_info * compptr,
				   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
				   JDIMENSION start_row, JDIMENSION start_col,
				   JDIMENSION num_blocks));

  /* Pointer to data which is private to fdct module */
  void *fdct_private;


  /* Entropy encoding */
  JMETHOD(boolean, entropy_encode_mcu, (j_compress_ptr cinfo,
					JBLOCKROW *MCU_data));

  /* Pointer to data which is private to entropy module */
  void *entropy_private;

} jpeg_lossy_c_codec;

typedef jpeg_lossy_c_codec * j_lossy_c_ptr;



typedef JMETHOD(void, inverse_DCT_method_ptr,
		(j_decompress_ptr cinfo, jpeg_component_info * compptr,
		 JCOEFPTR coef_block,
		 JSAMPARRAY output_buf, JDIMENSION output_col));

/* Lossy-specific decompression codec (decompressor proper) */
typedef struct {
  struct jpeg_d_codec pub; /* public fields */


  /* Coefficient buffer control */
  JMETHOD(void, coef_start_input_pass, (j_decompress_ptr cinfo));
  JMETHOD(void, coef_start_output_pass, (j_decompress_ptr cinfo));

  /* Pointer to array of coefficient virtual arrays, or NULL if none */
  jvirt_barray_ptr *coef_arrays;

  /* Pointer to data which is private to coef module */
  void *coef_private;


  /* Entropy decoding */
  JMETHOD(void, entropy_start_pass, (j_decompress_ptr cinfo));
  JMETHOD(boolean, entropy_decode_mcu, (j_decompress_ptr cinfo,
					JBLOCKROW *MCU_data));

  /* This is here to share code between baseline and progressive decoders; */
  /* other modules probably should not use it */
  boolean entropy_insufficient_data;	/* set TRUE after emitting warning */

  /* Pointer to data which is private to entropy module */
  void *entropy_private;


  /* Inverse DCT (also performs dequantization) */
  JMETHOD(void, idct_start_pass, (j_decompress_ptr cinfo));

  /* It is useful to allow each component to have a separate IDCT method. */
  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];

  /* Pointer to data which is private to idct module */
  void *idct_private;

} jpeg_lossy_d_codec;

typedef jpeg_lossy_d_codec * j_lossy_d_ptr;


/* Compression module initialization routines */
EXTERN(void) jinit_lossy_c_codec JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
					  boolean need_full_buffer));
EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_shuff_encoder JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));

/* Decompression module initialization routines */
EXTERN(void) jinit_lossy_d_codec JPP((j_decompress_ptr cinfo));
EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
					  boolean need_full_buffer));
EXTERN(void) jinit_shuff_decoder JPP((j_decompress_ptr cinfo));
EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));

#endif /* JLOSSY_H */
