home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Graphics / graphics-16000.iso / msdos / animutil / fastgfx / fg303b / manuals.arj / USER17.DOC < prev    next >
Text File  |  1993-10-02  |  8KB  |  214 lines

  1. Chapter 17
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Miscellaneous Routines
  8.  
  9. 304   Fastgraph User's Guide
  10.  
  11. Overview
  12.  
  13.      There are a few remaining Fastgraph routines that really don't fit into
  14. any of the categories discussed so far.  For this reason, they are described
  15. separately in this chapter.
  16.  
  17.  
  18. Determining Available Memory
  19.  
  20.      The fg_memavail routine returns the amount of free conventional memory
  21. (in bytes) available to DOS.  It returns the amount of memory as its function
  22. value, which is a 32-bit unsigned integer.  Fg_memavail has no arguments.
  23.  
  24.      Example 17-1 uses fg_memavail to show the effects of creating and
  25. releasing virtual pages.  When run in a video mode in which video pages 1 and
  26. 2 are physical pages, the amount of free memory remains the same because
  27. these pages use memory that is resident on the video adapter.  However, in
  28. modes where pages 1 and 2 are virtual pages, the amount of free memory
  29. decreases after each call to fg_allocate and returns to its original value
  30. after the calls to fg_freepage.  Note how the program requests and validates
  31. the video mode.
  32.  
  33.                                 Example 17-1.
  34.  
  35.        #include <fastgraf.h>
  36.        #include <stdio.h>
  37.        #include <stdlib.h>
  38.        void main(void);
  39.  
  40.        void main()
  41.        {
  42.           long original, mem0, mem1, mem2;
  43.           int  mode, old_mode;
  44.  
  45.           printf("Which video mode? ");
  46.           scanf("%d",&mode);
  47.  
  48.           if (fg_testmode(mode,0) == 0) {
  49.              printf("Your system does not support that video mode.\n");
  50.              exit(1);
  51.              }
  52.           if (fg_testmode(mode,3) == 0) {
  53.              printf("Your system does not have enough memory.\n");
  54.              exit(1);
  55.              }
  56.  
  57.           original = fg_memavail();
  58.           old_mode = fg_getmode();
  59.           fg_setmode(mode);
  60.           mem0 = fg_memavail();
  61.           fg_allocate(1);
  62.           mem1 = fg_memavail();
  63.           fg_allocate(2);
  64.           mem2 = fg_memavail();
  65.  
  66.           fg_freepage(1);
  67.                                      Chapter 17:  Miscellaneous Routines   305
  68.           fg_freepage(2);
  69.           fg_setmode(old_mode);
  70.           fg_reset();
  71.  
  72.           printf("originally     = %ld\n",original);
  73.           printf("after setmode  = %ld\n",mem0);
  74.           printf("after 1st page = %ld\n",mem1);
  75.           printf("after 2nd page = %ld\n",mem2);
  76.           printf("at end         = %ld\n",memavail());
  77.        }
  78.  
  79.  
  80. Choosing the Video Memory Update Function
  81.  
  82.      In Chapter 12, we saw how to use the fg_setfunc routine to perform XOR
  83. animation in native EGA and VGA graphics modes (modes 13 to 18).  In these
  84. video modes, fg_setfunc controls the logical operation applied when the
  85. contents of video memory change.  The specific operation is defined by its
  86. argument, as shown below.
  87.  
  88.                      value of   logical
  89.                      argument  operation
  90.  
  91.                          0    replacement
  92.                          1        and
  93.                          2        or
  94.                          3   exclusive or
  95.  
  96. If your program does not use the fg_setfunc routine, replacement mode is
  97. always used.  That is, information written to video memory replaces whatever
  98. was there before.  Again, fg_setfunc is meaningful only in modes 13 to 18.
  99.  
  100.      Example 17-2 demonstrates the fg_setfunc routine.  The program is
  101. similar to example 6-11 which displays 200 random rectangles on the screen.
  102. However, example 17-2 displays the rectangles in XOR mode, which means the
  103. rectangle intersections will appear in different colors.
  104.  
  105.                                 Example 17-2.
  106.  
  107.             #include <fastgraf.h>
  108.             #include <stdio.h>
  109.             #include <stdlib.h>
  110.             void main(void);
  111.  
  112.             #define RECTANGLES 200
  113.             #define SWAP(a,b,temp) { temp = a; a = b; b = temp; }
  114.  
  115.             void main()
  116.             {
  117.                int i;
  118.                int minx, maxx, miny, maxy;
  119.                int old_mode;
  120.                int temp;
  121.                int xres, yres;
  122.  
  123.                if (fg_egacheck() == 0) {
  124.  
  125. 306   Fastgraph User's Guide
  126.  
  127.                   printf("This program requires EGA or VGA.\n");
  128.                   exit(1);
  129.                   }
  130.  
  131.                old_mode = fg_getmode();
  132.                fg_setmode(fg_automode());
  133.                fg_setfunc(3);
  134.  
  135.                xres = fg_getmaxx() + 1;
  136.                yres = fg_getmaxy() + 1;
  137.  
  138.                for (i = 0; i < RECTANGLES; i++) {
  139.                   minx = rand() % xres;
  140.                   maxx = rand() % xres;
  141.                   miny = rand() % yres;
  142.                   maxy = rand() % yres;
  143.                   if (minx > maxx)
  144.                      SWAP(minx,maxx,temp);
  145.                   if (miny > maxy)
  146.                      SWAP(miny,maxy,temp);
  147.                   fg_setcolor(rand()%16);
  148.                   fg_rect(minx,maxx,miny,maxy);
  149.                   }
  150.  
  151.                fg_setmode(old_mode);
  152.                fg_reset();
  153.             }
  154.  
  155.  
  156.  
  157. Controlling Vertical Retrace Synchronization
  158.  
  159.      The vertical retrace is the brief period when the monitor's electron
  160. beam travels from the bottom of the screen back to the upper left corner to
  161. begin a new display refresh cycle.  Depending on the monitor, the vertical
  162. retrace typically occurs between 50 and 60 times per second.
  163.  
  164.      Certain graphics operations must be performed during a vertical retrace
  165. interval to avoid potential screen flickering or snow.  These include page
  166. flipping, panning, and reading or writing a block of video DAC registers or
  167. palettes.  By default, Fastgraph's routines that perform these operations
  168. automatically provide the necessary vertical retrace synchronization.  In
  169. most applications, these vertical retrace controls are completely sufficient.
  170. There are times, however, when you may wish to disable Fastgraph's vertical
  171. retrace checking and perform the vertical retrace synchronization at the
  172. application level.
  173.  
  174.      This is the purpose of Fastgraph's fg_waitvr routine.  To disable all
  175. internal vertical retrace synchronization within Fastgraph, call fg_waitvr
  176. with a zero argument.  If you want to re-enable it, pass a non-zero value to
  177. fg_waitvr (note that this is the default state).  The Fastgraph routines
  178. relevant to the vertical retrace are fg_getdacs, fg_makegif, fg_makepcx,
  179. fg_palettes, fg_pan, fg_setdacs, fg_setvpage, fg_showgif, and fg_showpcx.
  180. The vertical retrace is applicable to fg_makepcx and fg_showpcx in 16-color
  181. and 256-color graphics modes only.
  182.                                      Chapter 17:  Miscellaneous Routines   307
  183.  
  184.      As an example of why you might want to do disable Fastgraph's vertical
  185. retrace controls, consider page flipping.  After fg_setvpage defines the
  186. display start address for the new visual page, it waits for a vertical
  187. retrace interval so the new starting address can take effect.  If fg_setvpage
  188. didn't do this, graphics displayed before the next vertical retrace would
  189. sometimes appear on the screen before the old visual page is completely
  190. removed.  Suppose, though, that immediately after the page flip you did some
  191. calculations or other work that didn't affect the video display.  If you
  192. disable Fastgraph's vertical retrace synchronization, you might achieve a
  193. faster frame rate because you can perform the post-page-flip calculations
  194. during a time when the system is normally waiting for the vertical retrace.
  195. Depending on the extent of these calculations, you may find that it's not
  196. even necessary to wait for the vertical retrace following a page flip.
  197.  
  198.  
  199. Summary of Miscellaneous Routines
  200.  
  201.      This section summarizes the functional descriptions of the Fastgraph
  202. routines presented in this chapter.  More detailed information about these
  203. routines, including their arguments and return values, may be found in the
  204. Fastgraph Reference Manual.
  205.  
  206.      FG_MEMAVAIL returns the amount of memory available to DOS.
  207.  
  208.      FG_SETFUNC specifies the logical operation (replacement, or, and,
  209. exclusive or) applied when video memory changes in the native EGA and VGA
  210. graphics modes.  This routine has no effect in other video modes.
  211.  
  212.      FG_WAITVR disables or enables vertical retrace synchronization within
  213. Fastgraph.
  214. 308   Fastgraph User's Guide