www.pudn.com > EZW_.rar > subbandsymbol.c


/*----------------------------------------------------------------------------*/ 
/*----------------------------------------------------------------------------*/ 
/*  
 * Mow-Song, Ng 2/9/2002 
 * msng@mmu.edu.my 
 * http://www.pesona.mmu.edu.my/~msng 
 * 
 * I do not claim copyright to the code, but if you use them or modify them, 
 * please drop me a mail. 
 * 
 */ 
/*---------------------------------------------------------------------------*/ 
/*---------------------------------------------------------------------------*/ 
 
#include "subbandsymbol.h" 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
SubbandSymbol *SubbandSymbolAlloc(int hsize, int vsize, int nsteps) 
{ 
	SubbandSymbol *symbol; 
	int i; 
	int *lowHSize, *lowVSize, *highHSize, *highVSize; 
 
	assert(nsteps > 0); 
 
	if ((symbol = (SubbandSymbol *)malloc(sizeof(SubbandSymbol)))==NULL){ 
		SubbandSymbolError("Fail to allocate symbol.\n"); 
	} 
 
	symbol->hsize = hsize; 
	symbol->vsize = vsize; 
	symbol->nsteps = nsteps; 
 
	/* ensure that all status starts with value 0 */ 
	symbol->symbol = (int *)calloc(symbol->hsize*symbol->vsize, sizeof(int)); 
	 
	symbol->nSubbands		= 3*symbol->nsteps+1; 
	symbol->subbandSize	= (int *)calloc(symbol->nSubbands, sizeof(int)); 
	symbol->subbandHSize = (int *)calloc(symbol->nSubbands, sizeof(int)); 
	symbol->subbandVSize = (int *)calloc(symbol->nSubbands, sizeof(int)); 
	symbol->subbandPtr	= (int **)calloc(symbol->nSubbands, sizeof(int *)); 
 
	lowHSize = (int *)calloc(symbol->nsteps, sizeof(int)); 
	lowVSize = (int *)calloc(symbol->nsteps, sizeof(int)); 
	highHSize = (int *)calloc(symbol->nsteps, sizeof(int)); 
	highVSize = (int *)calloc(symbol->nsteps, sizeof(int)); 
 
	lowHSize[symbol->nsteps-1] = (symbol->hsize+1)/2; 
	lowVSize[symbol->nsteps-1] = (symbol->vsize+1)/2; 
	highHSize[symbol->nsteps-1] = symbol->hsize/2;  
	highVSize[symbol->nsteps-1] = symbol->vsize/2; 
	 
	/* set the sizes for each blocks */ 
	for (i = symbol->nsteps-2; i >= 0; i--) { 
		lowHSize[i] = (lowHSize[i+1]+1)/2; 
		lowVSize[i] = (lowVSize[i+1]+1)/2; 
		highHSize[i] = lowHSize[i+1]/2; 
		highVSize[i] = lowVSize[i+1]/2;  
	} 
	 
	/* subband[0] */ 
	symbol->subbandPtr[0] = symbol->symbol; 
	symbol->subbandHSize[0] = lowHSize[0]; 
	symbol->subbandVSize[0] = lowVSize[0]; 
	symbol->subbandSize[0] = symbol->subbandHSize[0]*symbol->subbandVSize[0]; 
	 
	/* all other high pass subbands, do each scale at once */ 
	for (i = 0; i < symbol->nsteps; i++) { 
		symbol->subbandHSize[3*i+1] = highHSize[i]; 
		symbol->subbandVSize[3*i+1] = lowVSize[i]; 
		symbol->subbandHSize[3*i+2] = lowHSize[i]; 
		symbol->subbandVSize[3*i+2] = highVSize[i]; 
		symbol->subbandHSize[3*i+3] = highHSize[i]; 
		symbol->subbandVSize[3*i+3] = highVSize[i]; 
	} 
	 
	/* set the data pointers */ 
	for (i = 1; i < symbol->nSubbands; i++) { 
		symbol->subbandSize[i] = symbol->subbandHSize[i]*symbol->subbandVSize[i]; 
		symbol->subbandPtr[i] = symbol->subbandPtr[i-1] + symbol->subbandSize[i-1]; 
	} 
	 
	/* release allocated memory */ 
	free(lowHSize); 
	free(lowVSize); 
	free(highHSize); 
	free(highVSize); 
	 
	return symbol; 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void SubbandSymbolDealloc(SubbandSymbol *symbol) 
{ 
	if (symbol!=NULL){ 
		free(symbol->symbol); 
		free(symbol->subbandSize); 
		free(symbol->subbandHSize); 
		free(symbol->subbandVSize); 
		free(symbol->subbandPtr); 
		free(symbol); 
	} 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
int SubbandSymbolGetNodeSymbol(SubbandSymbol *symbol, int scale,  
										 int orientation, int x, int y) 
{ 
	int idx; 
 
	if (scale==0){ 
		idx = 0;	 
	} 
	else{ 
		idx = 3*scale - 2 + orientation; 
	} 
	 
	return (symbol->subbandPtr[idx][y*symbol->subbandHSize[idx] + x]); 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void SubbandSymbolSetNodeSymbol(SubbandSymbol *symbol, int scale,  
										  int orientation, int x, int y, int s) 
{ 
	int idx; 
 
	if (scale==0){ 
		idx = 0; 
	} 
	else{ 
		idx = 3*scale - 2 + orientation; 
	} 
 
	symbol->subbandPtr[idx][y*symbol->subbandHSize[idx] + x] = s; 
 
	return; 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void SubbandSymbolError(char *fmt, ...) 
{ 
	va_list argptr; 
	 
	va_start( argptr, fmt ); 
	fprintf(stderr, "SubbandSymbolError: " ); 
	vprintf( fmt, argptr ); 
	va_end( argptr ); 
	exit( -1 ); 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/