www.pudn.com > EZW_.rar > MAP.C


#include "map.h" 
/*---------------------------------------------------------------------------*/ 
/*---------------------------------------------------------------------------*/ 
/*  
 * 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. 
 * 
 */ 
/*---------------------------------------------------------------------------*/ 
/*---------------------------------------------------------------------------*/ 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
MAP *MapAlloc(int hsize, int vsize, int nsteps) 
{ 
	MAP *map; 
	int i; 
	int *lowHSize, *lowVSize, *highHSize, *highVSize; 
 
	assert(nsteps > 0); 
 
	if ((map = (MAP *)malloc(sizeof(MAP)))==NULL){ 
		MapError("Fail to allocate map.\n"); 
	} 
 
	map->hsize = hsize; 
	map->vsize = vsize; 
	map->nsteps = nsteps; 
 
	/* ensure that all status starts with value 0 */ 
	map->symbol = (int *)calloc(map->hsize*map->vsize, sizeof(int)); 
	 
	map->nSubbands		= 3*map->nsteps+1; 
	map->subbandSize	= (int *)calloc(map->nSubbands, sizeof(int)); 
	map->subbandHSize = (int *)calloc(map->nSubbands, sizeof(int)); 
	map->subbandVSize = (int *)calloc(map->nSubbands, sizeof(int)); 
	map->subbandPtr	= (int **)calloc(map->nSubbands, sizeof(int *)); 
 
	lowHSize = (int *)calloc(map->nsteps, sizeof(int)); 
	lowVSize = (int *)calloc(map->nsteps, sizeof(int)); 
	highHSize = (int *)calloc(map->nsteps, sizeof(int)); 
	highVSize = (int *)calloc(map->nsteps, sizeof(int)); 
 
	lowHSize[map->nsteps-1] = (map->hsize+1)/2; 
	lowVSize[map->nsteps-1] = (map->vsize+1)/2; 
	highHSize[map->nsteps-1] = map->hsize/2;  
	highVSize[map->nsteps-1] = map->vsize/2; 
	 
	/* set the sizes for each blocks */ 
	for (i = map->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] */ 
	map->subbandPtr[0] = map->symbol; 
	map->subbandHSize[0] = lowHSize[0]; 
	map->subbandVSize[0] = lowVSize[0]; 
	map->subbandSize[0] = map->subbandHSize[0]*map->subbandVSize[0]; 
	 
	/* all other high pass subbands, do each scale at once */ 
	for (i = 0; i < map->nsteps; i++) { 
		map->subbandHSize[3*i+1] = highHSize[i]; 
		map->subbandVSize[3*i+1] = lowVSize[i]; 
		map->subbandHSize[3*i+2] = lowHSize[i]; 
		map->subbandVSize[3*i+2] = highVSize[i]; 
		map->subbandHSize[3*i+3] = highHSize[i]; 
		map->subbandVSize[3*i+3] = highVSize[i]; 
	} 
	 
	/* set the data pointers */ 
	for (i = 1; i < map->nSubbands; i++) { 
		map->subbandSize[i] = map->subbandHSize[i]*map->subbandVSize[i]; 
		map->subbandPtr[i] = map->subbandPtr[i-1] + map->subbandSize[i-1]; 
	} 
	 
	/* release allocated memory */ 
	free(lowHSize); 
	free(lowVSize); 
	free(highHSize); 
	free(highVSize); 
	 
	return map; 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void MapDealloc(MAP *map) 
{ 
	if (map!=NULL){ 
		free(map->symbol); 
		free(map->subbandSize); 
		free(map->subbandHSize); 
		free(map->subbandVSize); 
		free(map->subbandPtr); 
		free(map); 
	} 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
int MapGetNodeSymbol(MAP *map, int scale, int orientation, int x, int y) 
{ 
	int idx; 
 
	if (scale==0){ 
		idx = 0;	 
	} 
	else{ 
		idx = 3*scale - 2 + orientation; 
	} 
	 
	return (map->subbandPtr[idx][y*map->subbandHSize[idx] + x]); 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void MapSetNodeSymbol(MAP *map, int scale, int orientation, int x, int y,  
							 int symbol) 
{ 
	int idx; 
 
	if (scale==0){ 
		idx = 0; 
	} 
	else{ 
		idx = 3*scale - 2 + orientation; 
	} 
 
	map->subbandPtr[idx][y*map->subbandHSize[idx] + x] = symbol; 
 
	return; 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/	 
void MapError(char *fmt, ...) 
{ 
	va_list argptr; 
	 
	va_start( argptr, fmt ); 
	fprintf(stderr, "MapError: " ); 
	vprintf( fmt, argptr ); 
	va_end( argptr ); 
	exit( -1 ); 
} 
 
/*----------------------------------------------------------------------------*/	 
/*----------------------------------------------------------------------------*/