/* ============================================================================== WordUp Graphics Toolkit Version 5.0 Demonstration Program 53 VESA demonstration file. Any program which uses the WGT VESA library requires the existence of a VESA driver. Most video card manufacturers include software drivers with their installation diskettes. You can also find drivers for most popular cards on a BBS. VESA calls perform the same functions as their 320*200 equivalents in WGT. *** PROJECT *** This program requires the WGT5_WC.LIB and WVESA_WC.LIB files to be linked. *** DATA FILES *** WGT1.PCX and WGT2.PCX must be in your executable directory. WATCOM C++ VERSION ============================================================================== */ #include #include #include block wgt; /* Pointer to our first image to load */ block wgt2; /* Pointer to our second image to load */ block ptr; /* Temporary pointer */ color pal[256]; /* Our color palette */ int videomode[10]; /* Array to hold supported modes */ int totalmodes; /* Total number of supported VESA modes */ char vstring[7][18] = { "640 x 350 x 256", "640 x 400 x 256", "640 x 480 x 256", "800 x 600 x 256", "1024 x 768 x 256", "1280 x 1024 x 256", "1600 x 1200 x 256" }; void getmodes (void) { totalmodes = 0; /* Start counter at 0 modes supported */ /* Now find supported modes and add them to our array */ if (wvesa_supported (V640x350)) { videomode[totalmodes] = V640x350; totalmodes++; } if (wvesa_supported (V640x400)) { videomode[totalmodes] = V640x400; totalmodes++; } if (wvesa_supported (V640x480)) { videomode[totalmodes] = V640x480; totalmodes++; } if (wvesa_supported (V800x600)) { videomode[totalmodes] = V800x600; totalmodes++; } if (wvesa_supported (V1024x768)) { videomode[totalmodes] = V1024x768; totalmodes++; } if (wvesa_supported (V1280x1024)) { videomode[totalmodes] = V1280x1024; totalmodes++; } if (wvesa_supported (V1600x1200)) { videomode[totalmodes] = V1600x1200; totalmodes++; } } int which_string (int mode) { /* This function simply returns a string number to display based on the highlighted video mode */ switch (mode) { case V640x350 : return 0; case V640x400 : return 1; case V640x480 : return 2; case V800x600 : return 3; case V1024x768 : return 4; case V1280x1024 : return 5; case V1600x1200 : return 6; } return 0; } int select_mode (void) { int ctr; int done; int selected; struct rccoord endy; char ch; printf ("\nPress ENTER to selected highlighted mode, any other key advances highlight.\n"); for (ctr = 0; ctr < totalmodes; ctr++) /* Show supported modes */ { _settextposition (13 + ctr, 1); _outtext (vstring[ which_string (videomode[ctr]) ]); } endy = _gettextposition (); selected = 0; done = 0; while (!done) { _settextcolor (12); /* Highlight string */ _settextposition (13 + selected, 1); _outtext (vstring[ which_string (videomode[selected]) ]); ch = getch (); if (ch == 13) /* Abort when ENTER pressed */ done = 1; else { _settextcolor (7); /* De-highlight previous */ _settextposition (13 + selected, 1); _outtext (vstring[ which_string (videomode[selected]) ]); selected++; if (selected >= totalmodes) /* Wrap around list */ selected = 0; } } _settextposition (endy.row + 1, 1); return videomode[selected]; /* Return the selected mode */ } void do_pixels (void) { while (!kbhit ()) /* Random pixels */ { wsetcolor (rand() % 256); wvesa_putpixel (rand() % VESAmode.XResolution, rand() % VESAmode.YResolution); } getch (); } void do_lines (void) { while (!kbhit ()) /* Random lines */ { wsetcolor (rand () % 256); wvesa_line (0, 0, rand () % VESAmode.XResolution, rand () % VESAmode.YResolution); } getch (); } void do_bars (void) { while (!kbhit ()) /* Random bars */ { wsetcolor (rand () % 256); wvesa_bar (rand () % VESAmode.XResolution, rand () % VESAmode.YResolution, rand () % VESAmode.XResolution, rand () % VESAmode.YResolution); } getch (); } void do_rectangles (void) { while (!kbhit ()) /* Random rectangles */ { wsetcolor (rand () % 256); wvesa_rectangle (rand () % VESAmode.XResolution, rand () % VESAmode.YResolution, rand () % VESAmode.XResolution, rand () % VESAmode.YResolution); } getch (); } void do_text (void) { wtexttransparent (TEXTFGBG); wtextbackground (0); while (!kbhit ()) /* Random rectangles */ { wtextcolor (rand () % 256); wvesa_outtextxy (rand () % VESAmode.XResolution, rand () % VESAmode.YResolution, NULL, "VESA Text String"); } getch (); } void do_blocks (void) { while (!kbhit ()) /* Randomly paste blocks */ { if (ptr == wgt) /* Alternate between block 1 and block 2 */ ptr = wgt2; else ptr = wgt; wvesa_putblock (rand () % VESAmode.XResolution, rand () % VESAmode.YResolution, ptr, NORMAL); } getch (); } void main (void) { int oldmode; /* Video mode before program was started */ int mymode = 0; /* Selected video mode */ oldmode = wgetmode (); /* Preserve our original video mode */ _clearscreen (_GCLEARSCREEN); /* Clear the screen */ if (wvesa_detected ()) /* Look for VESA driver */ printf ("SVGA detected.\n"); else { printf ("SVGA support not found. Please check for VESA driver presence.\n"); exit (1); } /* Display the video card maunfacturer's string */ printf ("VESA version %x\n", VGA.VESAVersion); printf ("VIDEO CARD OEM STRING:\n%s\n", VGA.OEMStringPtr); if (VGA.VESAVersion >= 0x200) { printf ("OEM Software revision #%x\n", VGA.OemSoftwareRev); printf ("OEM Vendor Name: %s\n", VGA.OemVendorNamePtr); printf ("OEM Product Name: %s\n", VGA.OemProductNamePtr); printf ("OEM Product Revision: %s\n", VGA.OemProductRevPtr); } else printf ("\n\n\n\n"); printf ("Memory on card: %dk\n", VGA.TotalMemory * 64); getmodes (); /* Find supported video modes */ if (totalmodes == 0) { printf ("256 color SVGA modes not supported. Program aborted.\n"); exit (1); } else { mymode = select_mode (); } if (!wvesa_getmodeinfo (mymode)) printf ("Mode detection failed.\n"); else { printf ("\nMode %x selected.\n\n", mymode); printf ("X resolution : %5d\nY resolution : %5d\n", VESAmode.XResolution, VESAmode.YResolution); printf ("Banks: %d\n", VESAmode.NumberOfBanks); printf ("Window Granularity : %d\n", VESAmode.WinGranularity); printf ("Window size in Kb : %d\n", VESAmode.WinSize); if (VESAmode.WinAAttributes & 1 == 0) printf("Window A not supported\n"); else printf("Window A Segment : %x\n", VESAmode.WinASegment); if (VESAmode.WinBAttributes & 1 == 0) printf("Window B not supported\n"); else printf("Window B Segment : %x\n", VESAmode.WinBSegment); } printf ("\n\nPRESS ANY KEY TO ENTER GRAPHICS MODE\n"); getch (); vga256 (); if (!wvesa_init (mymode)) { printf ("Unable to initialize graphics mode.\n"); exit (1); } wgt = wloadpcx ("wgt1.pcx", pal); /* Load our images */ wgt2 = wloadpcx ("wgt2.pcx", pal); wsetpalette (0, 255, pal); do_pixels (); /* Perform our demo */ wvesa_cls (15); do_blocks (); do_lines (); do_bars (); do_rectangles (); do_text (); wfreeblock (wgt); /* Free the images */ wfreeblock (wgt2); wsetmode (oldmode); /* Return text mode */ }