📄 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 );
}
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -