static void averagePixels(int const boxStart, int const boxSize, tupletable2 const colorfreqtable, unsigned int const depth, tuple const newTuple) { unsigned int n; /* Number of tuples represented by the box */ unsigned int plane; unsigned int i; /* Count the tuples in question */ n = 0; /* initial value */ for (i = 0; i < boxSize; ++i) n += colorfreqtable.table[boxStart + i]->value; for (plane = 0; plane < depth; ++plane) { sample sum; int i; sum = 0; for (i = 0; i < boxSize; ++i) sum += colorfreqtable.table[boxStart+i]->tuple[plane] * colorfreqtable.table[boxStart+i]->value; newTuple[plane] = ROUNDDIV(sum, n); } }
static void averageColors(int const boxStart, int const boxSize, tupletable2 const colorfreqtable, unsigned int const depth, tuple const newTuple) { unsigned int plane; for (plane = 0; plane < depth; ++plane) { sample sum; int i; sum = 0; for (i = 0; i < boxSize; ++i) sum += colorfreqtable.table[boxStart+i]->tuple[plane]; newTuple[plane] = ROUNDDIV(sum, boxSize); } }
/* Function: DecomposeOneLevelInt() Description: Pyramid Decompose one level of wavelet coefficients Input: Width -- Width of Image; Height -- Height of Image; level -- current decomposition level Filter -- Filter Used. MaxCoeff, MinCoeff -- bounds of the output data; Input/Output: OutCoeff -- Ouput wavelet coefficients OutMask -- Output mask corresponding to wavelet coefficients Return: DWT_OK if success. */ Int VTCDWT:: DecomposeOneLevelInt(Int *OutCoeff, UChar *OutMask, Int Width, Int Height, Int level, FILTER *Filter, Int MaxCoeff, Int MinCoeff) { Int *InBuf, *OutBuf ; UChar *InMaskBuf, *OutMaskBuf; Int width = Width>>(level-1); Int height = Height>>(level-1); Int MaxLength = (width > height)?width:height; Int i,k,ret; Int *a; UChar *c,*d; Int *e; /* double check filter type */ if(Filter->DWT_Type != DWT_INT_TYPE) return(DWT_INTERNAL_ERROR); /* allocate line buffers */ InBuf = (Int *) malloc(sizeof(Int)*MaxLength); InMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength); OutBuf = (Int *) malloc(sizeof(Int)*MaxLength); OutMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength); if(InBuf==NULL || InMaskBuf ==NULL || OutBuf == NULL || OutMaskBuf==NULL) return(DWT_MEMORY_FAILED); /* horizontal decomposition first*/ for(i=0,k=0;i<height;i++,k+=Width) { /* get a line of coefficients */ for(a=InBuf, e=OutCoeff+k;a<InBuf+width;a++,e++) { *a = (Int) *e; } /* get a line of mask */ memcpy(InMaskBuf, OutMask+k, sizeof(UChar)*width); /* Perform horizontal SA-DWT */ ret=SADWT1dInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, width, Filter, DWT_HORIZONTAL); if(ret!=DWT_OK) { free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf); return(ret); } /* put the transformed line back */ for(a=OutBuf,e=OutCoeff+k;a<OutBuf+width;a++,e++) { /* Scale and Leave 3 extra bits for precision reason */ *a = ROUNDDIV((*a <<3), Filter->Scale); if(*a > MaxCoeff || *a < MinCoeff) { free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf); return(DWT_COEFF_OVERFLOW); } *e = (Int) *a; } memcpy(OutMask+k, OutMaskBuf, sizeof(UChar)*width); } /* then vertical decomposition */ for(i=0;i<width;i++) { /* get a column of coefficients */ for(a=InBuf, e=OutCoeff+i, c= InMaskBuf, d= OutMask+i; a<InBuf+height; a++, c++, e+=Width, d+=Width) { *a=(Int) *e; *c = *d; } /* perform vertical SA-DWT */ ret=SADWT1dInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, height, Filter, DWT_VERTICAL); if(ret!=DWT_OK) { free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf); return(ret); } /* put the transformed column back */ for(a=OutBuf, e=OutCoeff+i, c= OutMaskBuf, d= OutMask+i; a<OutBuf+height; a++, c++, e+=Width, d+=Width) { /*Scale and leave the sqrt(2)*sqrt(2) factor in the scale */ *a = ROUNDDIV(*a, (Filter->Scale<<2)); if(*a > MaxCoeff || *a < MinCoeff) { free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf); return(DWT_COEFF_OVERFLOW); } *e= (Int) *a; *d = *c; } } free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf); return(DWT_OK); }