www.pudn.com > 3DEDITOR.rar > PICTURE.CPP


#include "stdafx.h" 
#include  
#include  
#include  
#include  
#include "jpeg.h" 
 
int sizes[]={ 1,2,4,8,16,32,64,128,256 }; 
int nsizes=8; 
 
int byteRGB::Intensity(void) 
{ 
    return (int)(r*299/1000 + g*587/1000 + b*114/1000); 
} 
 
void byteRGB::ToYIQ(void) 
{ 
	unsigned char y,i,q; 
 
	y=(299*r+587*g+114*b)/1000; 
	i=(596*r-275*g-321*b)/1192+127; 
	q=(212*r-523*g+311*b)/1046+127; 
 
	y=((int)y-127)*2/3+127; 
	i=((int)i-127)*2/3+127; 
	q=((int)q-127)*2/3+127; 
 
	r=y; 
	g=i; 
	b=q; 
} 
 
void byteRGB::FromYIQ(void) 
{ 
	unsigned char y,i,q; 
	int u,I,Q; 
	I=((int)g-127)*166/127; 
	Q=((int)b-127)*148/127; 
 
	u=(int)r+(956*I+621*Q)/1000; 
	u=(u-127)*3/2+127; 
	y=u<0?0:u>255?255:u; 
	u=(int)r-(272*I+647*Q)/1000; 
	u=(u-127)*3/2+127; 
	i=u<0?0:u>255?255:u; 
	u=(int)r+(1703*Q-1106*I)/1000; 
	u=(u-127)*3/2+127; 
	q=u<0?0:u>255?255:u; 
 
	r=y; 
	g=i; 
	b=q; 
} 
 
void picture::ErasePicture(char c) 
{ 
     int a; 
     for( a=0;a=0;a-- ) 
            { 
              fread((char *)buf[a],sx,3,fp); 
 
			  int z=0,p=0; 
              for( ;z=0;a-- ) 
             { 
              for( b=0;bsx) 
			break; 
	if (isy) 
			break; 
	if (i=0;a-- ) 
			fread( (char *)buf[a],wx,1,fp ); 
		fclose(fp); 
 
		build_icon(); 
		return 1; 
		} 
	return 0; 
} 
 
 
int picture::LoadJPG(char *name) 
{ 
	FreePicture(); 
	JPEGDATA data; 
	FILE *fp; 
	fp=fopen(name,"rb"); 
	if (fp) 
		{ 
		memset(&data,0,sizeof(JPEGDATA)); 
		data.input_file = fp; 
		JpegInfo(&data); 
		fclose(fp); 
		if (data.components==3 || data.components==1) 
			{ 
			bytespixel=data.components; 
			if (bytespixel==3) 
				CreatePicture24(data.width,data.height); 
			else CreatePicture8(data.width,data.height,0); 
 
			fp=fopen(name,"rb"); 
			data.ptr             = buf[0]; 
			data.input_file      = fp; 
			data.hWnd            = 0; 
			data.ProgressMsg     = 0; 
 
			JpegRead(&data); 
			fclose(fp); 
 
			if (data.status==0) 
				{ 
				build_icon(); 
				return 1; 
				} 
			else FreePicture(); 
			} 
		} 
	return 0; 
} 
 
void picture::ToYIQ() 
{ 
	if (bytespixel!=3) 
		return ; 
	int x,y; 
	byteRGB *rgb; 
 
	for( y=0;yToYIQ(); 
	} 
} 
 
void picture::FromYIQ() 
{ 
	if (bytespixel!=3) 
		return ; 
	int x,y; 
	byteRGB *rgb; 
 
	for( y=0;yFromYIQ(); 
	} 
} 
 
 
void cor_inter(float xi[3], float yi[3], float c[3][3], float x, float y, byteRGB *rgb) 
{ 
	int a; 
	float v[3][2],m[3][2],n[3]; 
 
	for( a=0;a<3;a++ ) 
		{ 
		v[a][0]=xi[a]; 
		v[a][1]=yi[a]; 
		} 
 
	m[0][0]=x-v[0][0]; 
	m[0][1]=y-v[0][1]; 
	m[1][0]=v[2][0]-v[0][0]; 
	m[1][1]=v[2][1]-v[0][1]; 
	m[2][0]=v[1][0]-v[0][0]; 
	m[2][1]=v[1][1]-v[0][1]; 
 
	n[0]=m[1][0]*m[2][1]-m[1][1]*m[2][0]; 
	n[1]=m[0][0]*m[2][1]-m[0][1]*m[2][0]; 
	n[2]=m[0][0]*m[1][1]-m[0][1]*m[1][0]; 
 
	for( a=0;a<3;a++ ) 
		*((&rgb->r)+a)=(unsigned char)(((c[2][a]-c[0][a])*n[1]-(c[1][a]-c[0][a])*n[2])/n[0]+c[0][a]); 
	 
} 
 
void picture::GetPixel(int x,int y,byteRGB *rgb) 
{ 
	if (buf==0) 
		return; 
 
	x=(x%sx); 
	y=(y%sy); 
 
	if(x<0) 
		x=sx+x; 
	if(y<0) 
		y=sy+y; 
 
	if (bytespixel==3) 
		*rgb=*((byteRGB *)&buf[y][x*3]); 
	else if (pal) 
			*rgb=pal[buf[y][x]]; 
		else rgb->r=rgb->g=rgb->b=buf[y][x]; 
} 
 
#define ROUND(x) ((x)>=0?((int)(x)):((int)(x)-1)) 
 
void picture::GetPixel(float x, float y, byteRGB * rgb,int textinterp) 
{ 
	if (textinterp==0) 
		{ 
		GetPixel(ROUND(x), ROUND(y), rgb); 
		return; 
		} 
	 
	float xi[3], yi[3]; 
	float cor[3][3]; 
	int ix=ROUND(x),iy=ROUND(y); 
		 
	byteRGB rgbt; 
	 
	if (buf==0) 
		return; 
 
	GetPixel(ix, iy, &rgbt); 
	cor[2][0]=rgbt.r; 
	cor[2][1]=rgbt.g; 
	cor[2][2]=rgbt.b; 
 
	GetPixel(ix, iy+1, &rgbt); 
	cor[2][0]+=rgbt.r; 
	cor[2][1]+=rgbt.g; 
	cor[2][2]+=rgbt.b; 
 
	GetPixel(ix+1, iy, &rgbt); 
	cor[2][0]+=rgbt.r; 
	cor[2][1]+=rgbt.g; 
	cor[2][2]+=rgbt.b; 
 
	GetPixel(ix+1, iy+1, &rgbt); 
	cor[2][0]+=rgbt.r; 
	cor[2][1]+=rgbt.g; 
	cor[2][2]+=rgbt.b; 
 
	cor[2][0]/=4; 
	cor[2][1]/=4; 
	cor[2][2]/=4; 
		 
	if((y-iy)>(ix+1-x)) 
	{ 
		xi[0]=(float)(ix+1); 
		yi[0]=(float)(iy+1); 
	} 
	else 
	{ 
		xi[0]=(float)(ix); 
		yi[0]=(float)(iy); 
	} 
 
	if((x-ix)>(y-iy)) 
	{ 
		xi[1]=(float)(ix+1); 
		yi[1]=(float)(iy); 
	} 
	else 
	{ 
		xi[1]=(float)(ix); 
		yi[1]=(float)(iy+1); 
	} 
	 
	GetPixel((int)xi[0], (int)yi[0], &rgbt); 
	cor[0][0]=rgbt.r; 
	cor[0][1]=rgbt.g; 
	cor[0][2]=rgbt.b; 
 
	GetPixel((int)xi[1], (int)yi[1], &rgbt); 
	cor[1][0]=rgbt.r; 
	cor[1][1]=rgbt.g; 
	cor[1][2]=rgbt.b; 
 
	xi[2]=ix+0.5f; 
	yi[2]=iy+0.5f; 
 
	cor_inter(xi, yi, cor, x, y, rgb); 
}