/********************************************************
** Copyright 2002 Earth Resource Mapping Ltd.
** This document contains proprietary source code of
** Earth Resource Mapping Ltd, and can only be used under
** one of the three licenses as described in the 
** license.txt file supplied with this distribution. 
** See separate license.txt file for license details 
** and conditions.
**
** This software is covered by US patent #6,442,298,
** #6,102,897 and #6,633,688.  Rights to use these patents 
** is included in the license agreements.
**
** FILE:     $Archive: /NCS/Source/include/NCSJPCProgression.h $
** CREATED:  13/12/2002 3:27:34 PM
** AUTHOR:   Simon Cope
** PURPOSE:  CNCSJPCProgression class header
** EDITS:    [xx] ddMmmyy NAME COMMENTS
 *******************************************************/

#ifndef NCSJPCPROGRESSION_H
#define NCSJPCPROGRESSION_H

#include "NCSDefs.h"
#include "NCSJPCTypes.h"
#include "NCSJPCPOCMarker.h"

	/**
	 * CNCSJPCProgression class - Implements JPC progressions.
	 * 
	 * @author       Simon Cope
	 * @version      $Revision: 1.12 $ $Author: simon $ $Date: 2005/01/17 09:11:23 $ 
	 */	
class NCSJPC_EXPORT_ALL CNCSJPCProgression {
public:
			/** Current Layer being decoded */
	UINT16	m_nCurTile;
			/** Current Layer being decoded */
	UINT16	m_nCurLayer;
		/** Current Resolution being decoded */
	UINT8	m_nCurResolution;
		/** Current Component being decoded */
	UINT16	m_nCurComponent;
		/** Current Precinct X being decoded */
	UINT32	m_nCurPrecinctX;
		/** Current Precinct Y being decoded */
	UINT32	m_nCurPrecinctY;
		/** Current Packet Number */
	NCSJPCPacketId m_nCurPacket;
		/** Current TX being decoded */
	INT32	m_nCurTX;
		/** Current TY being decoded */
	INT32	m_nCurTY;
		/** Current TX increment amount */
	INT32	m_nIncTX;
		/** Current TY increment amount */
	INT32	m_nIncTY;

		/** Default constructor, initialises members */
	CNCSJPCProgression();
		/** Virtual destructor */
	virtual ~CNCSJPCProgression();
	
		/** 
		 * Get the current POC marker PO if present.
		 * @return      CNCSJPCPOCMarker::ProgressionOrder	Current PO.
		 */
	CNCSJPCPOCMarker::ProgressionOrder *CurrentPO(class CNCSJPCTilePartHeader *pMainTP);
		/** 
		 * Increment the current POC marker PO if present and current PO is complete.
		 * @param		bComplete	Flag indicating if current PO is complete
		 * @return      CNCSError	NCS_SUCCESS or error on failure.
		 */
	CNCSError IncrementPO(CNCSJPCTilePartHeader *pMainTP, bool &bComplete);

		/** 
		 * Start the progression order from the beginning.
		 * @return      CNCSError	NCS_SUCCESS, or Error code on failure.
		 */
	virtual CNCSError Start(CNCSJPCTilePartHeader *pMainTP);
	virtual CNCSError Start(CNCSJPCTilePartHeader *pMainTP, INT32 nComponent, INT32 nResolution);

		/** 
		 * Increment the progression order from the current location, parsing packet headers in the process.
		 * @param		pData		Data for Step function
		 * @param		bComplete	Progression order is complete.
		 * @return      CNCSError	NCS_SUCCESS, or Error code on failure.
		 */
	virtual CNCSError Iterate(CNCSJPCTilePartHeader *pMainTP, void *pData, bool &bComplete);

		/** 
		 * Perform the "Step" for this progression.
		 * @return      bool		true, or false on error & m_Error is set to actual error code.
		 */
	virtual bool Step(class CNCSJPCComponent *pComponent,
					  class CNCSJPCResolution *pResolution,
					  class CNCSJPCPrecinct *pPrecinct);
		/** 
		 * Perform the "StepRow" for this progression.
		 * The progression stepper can return true here to skip the entire row
		 * 
		 * @return      bool		true, or false on row not skipped.
		 */
	virtual bool StepRow(class CNCSJPCComponent *pComponent,
						 class CNCSJPCResolution *pResolution);

		/**
		 * Calculate the Precinct 'k' X from the current progression
		 * @return		INT32		Precinct 'k' X
		 */
	UINT32 CalculatePrecinctX(CNCSJPCTilePartHeader *pMainTP, class CNCSJPCComponent *pComponent, class CNCSJPCResolution *pResolution);
		/**
		 * Calculate the Precinct 'k' Y from the current progression
		 * @return		INT32		Precinct 'k' Y
		 */
	UINT32 CalculatePrecinctY(CNCSJPCTilePartHeader *pMainTP, class CNCSJPCComponent *pComponent, class CNCSJPCResolution *pResolution);
protected:
	// Data for step function
	void *m_pData;
	// Progression order is complete
	bool m_bDone;
	// Error code when Step() returns false
	CNCSError m_Error;
};



#endif // !NCSJPCPROGRESSION_H