hally@SCYLLA.DREA.DND.CA (dave hally) (01/31/91)
The following small program makes a 101 x 101 window, clears it to
white, and saves it in the file white.img. It works correctly.
#include <gl.h>
main()
{ prefposition(500,600,500,600);
winopen("mytest");
RGBmode();
/* doublebuffer(); */
gconfig();
cpack(0xffffff);
clear();
/* swapbuffers(); */
system("scrsave white.img 500 600 500 600");
}
When the comment delimiters are removed so that double buffering is in
force, the display on the screen is exactly the same, but now in the file,
every pixel has the colour value f0f0f0 (very light gray) instead of
ffffff (white). What is going on?
If the colour map is used instead of RGBmode, it works correctly both
with and without double buffering.
(BTW: I have a 4D/20 running 3.3.1)
Dave
blbates@AERO4.LARC.NASA.GOV ("Brent L. Bates AAD/TAB MS361 x42854") (02/01/91)
Doesn't scrsave only get the back buffer, so in you example you don't get the white background but the root back ground. -- Brent L. Bates NASA-Langley Research Center M.S. 361 Hampton, Virginia 23665-5225 (804) 864-2854 E-mail: blbates@aero4.larc.nasa.gov or blbates@aero8.larc.nasa.gov
drb@eecg.toronto.edu (David R. Blythe) (02/02/91)
In article <9101311334.AA06753@scylla.drea.dnd.ca> hally@SCYLLA.DREA.DND.CA (dave hally) writes: >The following small program makes a 101 x 101 window, clears it to >white, and saves it in the file white.img. It works correctly. > >#include <gl.h> >main() >{ prefposition(500,600,500,600); > winopen("mytest"); > RGBmode(); >/* doublebuffer(); */ > gconfig(); > cpack(0xffffff); > clear(); >/* swapbuffers(); */ > system("scrsave white.img 500 600 500 600"); >} > >When the comment delimiters are removed so that double buffering is in >force, the display on the screen is exactly the same, but now in the file, >every pixel has the colour value f0f0f0 (very light gray) instead of >ffffff (white). What is going on? > >If the colour map is used instead of RGBmode, it works correctly both >with and without double buffering. > >(BTW: I have a 4D/20 running 3.3.1) > > Dave This sounds weird, maybe there is a bug in the PI library. Here is some code that saves the contents of an RGB or color map window. If you have turned on double buffering make sure you call readsource(SRC_FRONT); before calling savewin() if you want the front buffer since the back buffer is the default. I find this a touch faster when I am saving an animation sequence to disk [though for better animations you would probably want the versions that decimate by 2 or 4]. [ BTW, there is similar code in the -lgutil library - but it uses readRGB(), etc (look in the source for libgutil in 4Dgifts for documentation :-).] david blythe ontario centre for large scale computation drb@clsc.utoronto.ca ----------------------------- cut here --------------------------------------- #include <gl/gl.h> #include <gl/image.h> #include <gl/get.h> savewin(name) char *name; { long xsize, ysize; int x, y; short *sbuf; IMAGE *im; char *malloc(); getsize(&xsize, &ysize); /* can we create the file ?? */ if ((x = creat(name, 0666)) < 0) return -1; else close(x); if ((x = getdisplaymode()) == DMRGB || x == DMRGBDOUBLE) { im = iopen(name,"w",RLE(1),3,xsize,ysize,3); sbuf = (short *)malloc(xsize*3*sizeof(short)); for(y = 0; y < ysize; y++) { lrectread(0, y, xsize-1, y, sbuf); for(x = 0; x < xsize; x++) { long s = *((long *)sbuf+xsize-x-1); sbuf[0*xsize+xsize-x-1] = s&0xff; sbuf[1*xsize+xsize-x-1] = (s>>8)&0xff; sbuf[2*xsize+xsize-x-1] = (s>>16)&0xff; } putrow(im,sbuf,y,0); /* red row */ putrow(im,sbuf+xsize,y,1); /* green row */ putrow(im,sbuf+2*xsize,y,2); /* blue row */ } } else { im = iopen(name,"w",RLE(2),2,xsize,ysize,1); isetcolormap(im, CM_SCREEN); sbuf = (short *)malloc(xsize*sizeof(short)); for(y = 0; y < ysize; y++) { rectread(0, y, xsize-1, y, sbuf); putrow(im,sbuf,y,0); } } iclose(im); free((char *)im); /* would be nice if iclose() did this */ free((char *)sbuf); return 0; }