www.pudn.com > xiaobo.zip.zip > haar2.c


#include  
#include  
#include  
#include  
 
void haar2_Transform2D(int **rows, int width, int height, int levels,bool inverse) 
{ 
int *plane,*line,*nextline,*base; 
int step,step2,x,y,bx,by,ll_width,block; 
int a,b,c,d,A,B,C,D; 
 
	if ( levels == 0 ) return; 
 
	ll_width = width>>levels; 
	block = 1<>2; 
							B = a-b-c+d; 
							C = a+b-c-d; 
							D = a-b+c-d; 
 
							line[x] 			= A;	nextline[x]			= C; 
							line[x+step]		= B;	nextline[x+step]	= D;				 
						} 
					} 
				} 
			} 
		} 
 
	} else { 
 
		for(bx=0;bx>2);				\ 
 							b = A + ((3 - B + C - D)>>2);				\ 
 							c = A + ((3 - B - C + D)>>2);				\ 
 							d = A + ((3 + B - C - D)>>2);				\ 
 							line[0]		= a;	nextline[0] 	= c;	\ 
 							line[step]	= b;	nextline[step]	= d;		 
 /** un_haar_quartet() **/ 
 
				switch(levels) { 
					case 0: break; 
					case 1: 
						line = base;	nextline = base + width; 
						un_haar_quartet(line,nextline,1); 
						break; 
					case 2: 
						line = base;	nextline = base + width+width; 
						un_haar_quartet(line,nextline,2); 
 
						line = base;	nextline = base + width; 
						un_haar_quartet(line,nextline,1); 
						line += 2; nextline += 2; 
						un_haar_quartet(line,nextline,1); 
						line += width+width; nextline += width+width; 
						un_haar_quartet(line,nextline,1); 
						line -= 2; nextline -= 2; 
						un_haar_quartet(line,nextline,1); 
						break; 
					case 3: 
						step = 4; step2 = step+step; 
						line = base;	nextline = line + step*width;  
						un_haar_quartet(line,nextline,step); 
 
						step = 2; step2 = step+step; 
						line = base;	nextline = line + step*width;  
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += width*step2; nextline += width*step2; 
						un_haar_quartet(line,nextline,step); 
						line -= step2; nextline -= step2; 
						un_haar_quartet(line,nextline,step); 
 
						step = 1; step2 = step+step; 
						line = base;	nextline = line + width;  
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line = base+width*2;	nextline = line + width;  
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line = base+width*4;	nextline = line + width;  
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line = base+width*6;	nextline = line + width;  
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						line += step2; nextline += step2; 
						un_haar_quartet(line,nextline,step); 
						break; 
 
					default: 
 
						/** go backwards in scale **/ 
						for(step=(block>>1);step>=1;step>>=1) { 
							step2 = step + step; 
 
							for(y=0;y>2); 
									b = A + ((3 - B + C - D)>>2); 
									c = A + ((3 - B - C + D)>>2); 
									d = A + ((3 + B - C - D)>>2); 
 
									line[x]			= a;	nextline[x] 	= c; 
									line[x+step]	= b;	nextline[x+step]= d; 
								} 
							} 
						} 
					break; 
				} 
 
			} 
		} 
	} 
}