#include #include "YIQWin.h" #include "iflinterface.h" YIQWin::YIQWin() { dataImage.pixels=NULL; xselection=yselection=selectionsize=0; yiqImage.resize(200,200); yiqHighQuality.resize(200,200); attachImage(yiqImage); //generateYIQImage(40); maxYIQPointsToPlot=1000000; } YIQWin::~YIQWin() { } void YIQWin::idle() { static int lum=226; lum=lum-4; //printf ("%d\n",lum); if (lum<0) { setIdleInterval(-1); return; } addYIQStep(yiqImage,lum); glutSetWindow(glWindowNum); glutPostRedisplay(); //yiqImage=yiqHighQuality; } void renderString (int x, int y, char *str); void YIQWin::displayTitle() { glColor3f(.9,.9,.9); renderString(5,height-15,"YIQ Colorspace"); } void YIQWin::display() { imageinfo=yiqImage; // Make sure the size and pixel pointers are right ImageWin::display(); displayTitle(); // Make sure a valid dataImage exists if (dataImage.pixels==NULL) return; // Figure step size int step = selectionsize / sqrt(maxYIQPointsToPlot); if (step <1 ) step =1; // Draw the dots for (int x=xselection-selectionsize; x< xselection+selectionsize; x+=step) for (int y=yselection-selectionsize; y< yselection+selectionsize; y+=step) { Vector3 yiq,rgb; rgb.x=dataImage.r(x,y); rgb.y=dataImage.g(x,y); rgb.z=dataImage.b(x,y); //cout << "yiqwin_rgb " << rgb << "\n"; rgb2yiq(rgb,yiq); //yiq2rgb(yiq,rgb); //cout << yiq << "\n" << rgb << " - done\n" << flush; plotIQpoint(yiq.y,yiq.z); } } void YIQWin::rgb2yiq(Vector3 &rgb, Vector3 &yiq) { static const Matrix3 trans( 0.2990 , 0.5870 , 0.1140, 0.5960 , -0.2750 , -0.3210, 0.2120 , -0.5280 , 0.3110); yiq = trans.apply(rgb); } void YIQWin::yiq2rgb(Vector3 &yiq, Vector3 &rgb) { static const Matrix3 trans( 1.0031 , 0.9548 , 0.6179, 0.9968 , -0.2707 , -0.6448, 1.0085 , -1.1105 , 1.6996); rgb = trans.apply(yiq); } void YIQWin::loadYIQImage(char *filename) { if (filename==NULL) filename="/u/jedavis/img/misc/yiq.rgb"; readJDImage(filename, yiqImage); if (yiqImage.xsize==0 || yiqImage.ysize==0) { yiqImage.resize(200,200); generateYIQImage(20); } attachImage(yiqImage); // make sure the window resizes } void YIQWin::addYIQStep(ImageInfo yiqImage, short lum) { Vector3 rgb; Vector3 yiq; //cout << yiqImage.xsize << " " << yiqImage.ysize << "\n" << flush; //cout << width << " " << height << "\n" << flush; short w=yiqImage.xsize/2; short h=yiqImage.ysize/2; float scale = 300.0/yiqImage.xsize; for (int x=0; x255 || rgb.y<0 || rgb.z <0 || rgb.y>255 || rgb.z>255) { //rgb = Vector3(0,0,0); } else { // cout << "rgb " << rgb.x << " " << rgb.y // << " " << rgb.z << "\n" << flush; yiqImage.r(x,y)=rgb.x; yiqImage.g(x,y)=rgb.y; yiqImage.b(x,y)=rgb.z; yiqImage.a(x,y)=255; } } } void YIQWin::generateYIQImage(short stepsize) { for (int lum=255; lum>0; lum=lum-stepsize) addYIQStep(yiqImage,lum); } void YIQWin::plotIQpoint(float i, float q) { static short s=2; //drawn dot box size float scale = yiqImage.xsize/300.0; short w=yiqImage.xsize/2; short h=yiqImage.ysize/2; i = (i)*scale+w; q = height-1-(h+q*scale); glColor3f(1,1,1); glBegin(GL_POLYGON); glVertex2s(i-s,q-s); glVertex2s(i+s,q-s); glVertex2s(i+s,q+s); glVertex2s(i-s,q+s); glEnd(); }