From: Jay Link (jlink@ilbbs.com)
Date: Wed 28 Feb 2001 - 16:50:20 IST
> I want to display one screen (or set the display to off) while drawing two
> other screens, and when the second and third screens are finished I want to
> change between those two over and over again until a key is pressed.
Well, as you probably know, vgagl only gives you one "virtual screen".
For those of you who don't know, this is like a "backstage" area in a
theater, where you can set up the props and backdrops needed for the next
act in a play (in privacy) before bringing them all into view at once, by
transfering everything to the physical screen.
However, as I said, you only get one of these built-in memory areas. So, I
think you will have no choice but to create two new memory areas to use
with gl_putbox() and then gl_getbox().
As the man page says:
The destination pixmap has the size w * h * BYTESPERPIXEL.
So, create two variables of type void or char, and -- since you are using
vgagl -- you can define them using the built-in size macros:
void area1[WIDTH * HEIGHT * BYTESPERPIXEL];
void area2[WIDTH * HEIGHT * BYTESPERPIXEL];
Next, you will need to draw the screen for "area1", and then transfer it
to that area with gl_getbox(). Then, overlay that with the image for
"area2" -- perhaps clearing the screen first, if the two images are sized
differently -- and copy that one with gl_getbox() also.
Here's the syntax:
void gl_getbox(int x, int y, int w, int h, void *dp);
void gl_putbox(int x, int y, int w, int h, void *dp);
Now, you have two options for drawing these screens without anyone seeing
you:
1) As you suggested, you can turn the "real" (or physical screen) off with
vga_screenoff(). However, this depends on the video card, and so it may
not be 100% reliable.
2) Switch your context to gl's virtual screen, and draw everything there.
Then, use gl_getbox() just like before. Since the virtual screen will be
the current context, gl_getbox() will know to look there instead of the
physical screen.
Now, go back to the physical screen, either by using vga_screenon() or
else by changing your context, maybe clear the screen immediately to keep
things clean, and then call gl_putbox() over & over, alternating between
the two memory areas, & probably inserting a slight delay with usleep().
As far as waiting for the user to press a key, you will want a
non-blocking function. So, vga_getch() is BAD in this case, as it will
stop your program. Instead, use either vga_getkey():
int vga_getkey(void);
DESCRIPTION
Read a character from the keyboard without waiting;
returns zero if no key pressed and the ASCII value other-
wise. This function must not be used in raw keyboard mode.
In this situation use keyboard_getstate(3) or key-
board_keypressed(3) instead.
or else vga_waitevent(), which will also look for mouse events.
Hope that helps!
-J
------------------------------------------------------------------
Unsubscribe: To: listbot@svgalib.org
Body: unsubscribe linux-svgalib
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST