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

  1. Chapter 10
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Bit-Mapped Images
  8. 190   Fastgraph User's Guide
  9.  
  10.  
  11. Overview
  12.  
  13.      In this chapter, we'll continue our discussion of images by
  14. concentrating on an important class of images called bit-mapped images.
  15. Fastgraph includes routines to display, retrieve, and manipulate bit-mapped
  16. images in mode-specific and mode-independent formats.  This chapter will
  17. discuss the Fastgraph routines that deal with both classes of bit-mapped
  18. images.
  19.  
  20.      Displaying bit-mapped images is an essential part of animation with
  21. Fastgraph.  While the image files discussed in the previous chapter are
  22. useful for displaying backgrounds or importing pictures from other sources,
  23. an animation sequence can only achieve its speed through the bit-mapped image
  24. display routines described in this chapter, along with the block transfer
  25. routines of the next chapter.
  26.  
  27.  
  28. Mode-Independent Bit-Mapped Images
  29.  
  30.      This section will discuss the image display routines that use the same
  31. bit-mapped image format for all graphics video modes.  Another class of
  32. routines, described in the next section, use different formats for different
  33. video modes.  While these mode-independent image display routines are more
  34. general, they achieve this generality at the sake of execution speed.  This
  35. may especially be a concern if the image is large, or if speed is critical in
  36. an application (as in arcade-style graphics).  For many programs, however,
  37. the mode-independent routines provide all the image display capability
  38. needed.
  39.  
  40.      Let's begin by returning to an example of a very simple image -- the
  41. triangle introduced in the previous chapter:
  42.  
  43.                               . . . . * . . . .
  44.                               . . . * x * . . .
  45.                               . . * x x x * . .
  46.                               . * x x x x x * .
  47.                               * * * * * * * * *
  48.  
  49. Recall that the triangle's perimeter is a different color than its interior
  50. pixels, and to use this image with Fastgraph, we must inscribe the triangle
  51. in a rectangular area.  As before, our triangle is nine pixels wide at its
  52. base and five pixels high.  The pixels indicated by an asterisk (*) are the
  53. triangle's perimeter, while those indicated by an x represent its interior
  54. points.  We need to distinguish between these pixels because they will be
  55. different colors.  The pixels shown as periods (.) are not part of the
  56. triangle itself.  They are required to make the image rectangular, so from
  57. Fastgraph's perspective they are indeed part of the image.
  58.  
  59.      The Fastgraph routine fg_drawmap is a suitable routine for drawing our
  60. triangle.  To use fg_drawmap, we must create separate bit maps for each color
  61. in the image (excluding the points used to fill the rectangular region, which
  62. are considered transparent).  In this example, we will thus need two bit
  63. maps -- one for the perimeter points, and one for the interior points.  Let's
  64. break the image into these two bit maps.
  65.                                           Chapter 10:  Bit-Mapped Images   191
  66.  
  67.                   . . . . * . . . .        . . . . . . . . .
  68.                   . . . * . * . . .        . . . . x . . . .
  69.                   . . * . . . * . .        . . . x x x . . .
  70.                   . * . . . . . * .        . . x x x x x . .
  71.                   * * * * * * * * *        . . . . . . . . .
  72.  
  73.                   perimeter points          interior points
  74.  
  75.      The next step is to convert these two bit maps into their binary
  76. representations.  Just as there are eight bits in a byte, we will create a
  77. data structure (an array in this case) with each byte holding eight pixels.
  78. Bits that are set (1) indicate the corresponding pixel will appear displayed
  79. in the color associated with that bit map.  Bits that are reset (0) leave the
  80. corresponding pixel unchanged.  The size of each bit map array must be at
  81. least 10 bytes because each bit map contains five rows with nine pixels in
  82. each row (that is, two bytes are required for each row of the image).  Hence,
  83. when we convert these bit maps to their binary representations, and
  84. subsequently to their hexadecimal equivalent, the results will appear as
  85. shown below.  The boldface bits represent the actual image; the other bits
  86. are filler bits needed to complete each row of the bit maps after the ninth
  87. pixel.  All filler bits must be zero.
  88.  
  89.               0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0         08   00
  90.  
  91.               0 0 0 1 0 1 0 0   0 0 0 0 0 0 0 0         14   00
  92.  
  93.               0 0 1 0 0 0 1 0   0 0 0 0 0 0 0 0         22   00
  94.  
  95.               0 1 0 0 0 0 0 1   0 0 0 0 0 0 0 0         41   00
  96.  
  97.               1 1 1 1 1 1 1 1   1 0 0 0 0 0 0 0         FF   80
  98.  
  99.                               perimeter bit map
  100.  
  101.  
  102.               0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0         00   00
  103.  
  104.               0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0         08   00
  105.  
  106.               0 0 0 1 1 1 0 0   0 0 0 0 0 0 0 0         1C   00
  107.  
  108.               0 0 1 1 1 1 1 0   0 0 0 0 0 0 0 0         3E   00
  109.  
  110.               0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0         00   00
  111.  
  112.                                interior bit map
  113.  
  114.      The next question is the order in which the bit maps are stored in the
  115. corresponding data structures.  Since our data structure is an array, it is
  116. only necessary to show the relationship of the subscripts to the bit map
  117. structures above.  The next diagram shows the subscript order for the case of
  118. a two-column by five-row bit map.
  119.  
  120.                                   [8]   [9]
  121.  
  122.                                   [6]   [7]
  123. 192   Fastgraph User's Guide
  124.  
  125.                                   [4]   [5]
  126.  
  127.                                   [2]   [3]
  128.  
  129.                                   [0]   [1]
  130.  
  131.      From this diagram, we see the first element of the array (that is, the
  132. element with subscript [0]) represents the lower left corner of the image.
  133. The subscript progression then continues right until reaching the end of the
  134. first row.  It then resumes at the leftmost element of the second row and
  135. continues to the right until the end of that row.  It continues in this
  136. manner for all remaining rows.
  137.  
  138.      We are now ready to present an example program to display our triangle.
  139. The program will use the Fastgraph routine fg_drawmap, which expects three
  140. arguments.  The first argument is the bit map array (passed by reference),
  141. the second is the width of the bit map in bytes, and the last is the height
  142. of the bit map in pixel rows.  The fg_drawmap routine displays the image such
  143. that its lower left corner is at the graphics cursor position on the active
  144. video page.  The routine has no effect in text video modes.  Additionally,
  145. fg_drawmap displays the image using the current color index, which means we
  146. will need to call fg_drawmap once for each color in the image.
  147.  
  148.      Example 10-1 runs in any 320 by 200 color graphics mode (it could be
  149. made to run in mode 12 too, but that would detract from the purpose of the
  150. example).  After establishing the video mode, the program uses fg_rect to
  151. fill the entire screen with a gray rectangle (white in CGA).  Next, the
  152. program establishes (156,101) as the graphics cursor position; this causes
  153. the triangle to be centered on the screen.  The two calls to fg_drawmap, one
  154. for each color in the image, actually display the triangle.  Note especially
  155. how fg_setcolor is used before each call to fg_drawmap to define the current
  156. color index.  The result is a triangle with a blue perimeter (cyan in CGA)
  157. and green interior (magenta in CGA).
  158.  
  159.                                 Example 10-1.
  160.  
  161.              #include <fastgraf.h>
  162.              #include <stdio.h>
  163.              #include <stdlib.h>
  164.              void main(void);
  165.  
  166.              char perimeter[] = {
  167.                 0xFF,0x80,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00
  168.                 };
  169.              char interior[] = {
  170.                 0x00,0x00,0x3E,0x00,0x1C,0x00,0x08,0x00,0x00,0x00
  171.                 };
  172.  
  173.              void main()
  174.              {
  175.                 int old_mode, new_mode;
  176.  
  177.                 new_mode = fg_bestmode(320,200,1);
  178.                 if (new_mode < 0 || new_mode == 12) {
  179.                    printf("This program requires a 320 ");
  180.  
  181.                                           Chapter 10:  Bit-Mapped Images   193
  182.  
  183.                    printf("x 200 color graphics mode.\n");
  184.                    exit(1);
  185.                    }
  186.  
  187.                 old_mode = fg_getmode();
  188.                 fg_setmode(new_mode);
  189.  
  190.                 fg_setcolor(7);
  191.                 fg_rect(0,319,0,199);
  192.  
  193.                 fg_move(156,101);
  194.                 fg_setcolor(1);
  195.                 fg_drawmap(perimeter,2,5);
  196.                 fg_setcolor(2);
  197.                 fg_drawmap(interior,2,5);
  198.                 fg_waitkey();
  199.  
  200.                 fg_setmode(old_mode);
  201.                 fg_reset();
  202.              }
  203.  
  204.      The different color bit maps used by fg_drawmap do not all have to be
  205. the same size.  In our triangle example, the perimeter is 9 pixels wide by 5
  206. pixels high, but the interior is only 5 pixels wide by 3 pixels high.  Hence,
  207. the bit map for the interior pixels only requires one byte for each of its
  208. three rows, so we can store it in a three-byte array.  Its structure would
  209. be:
  210.  
  211.                                   [2]   08
  212.  
  213.                                   [1]   1C
  214.  
  215.                                   [0]   3E
  216.  
  217.      Example 10-2 is similar to example 10-1, but it uses a three-byte array
  218. for the interior bit map.  Note the second call to fg_move in this example.
  219. It is needed because the bottom row of the smaller interior bit map
  220. corresponds to the second row of the larger perimeter bit map.  In other
  221. words, the interior bit map must be displayed one row above the perimeter bit
  222. map.
  223.  
  224.                                 Example 10-2.
  225.  
  226.              #include <fastgraf.h>
  227.              #include <stdio.h>
  228.              #include <stdlib.h>
  229.              void main(void);
  230.  
  231.              char perimeter[] = {
  232.                 0xFF,0x80,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00
  233.                 };
  234.              char interior[] = {
  235.                 0x3E,0x1C,0x08
  236.                 };
  237.  
  238. 194   Fastgraph User's Guide
  239.  
  240.  
  241.              void main()
  242.              {
  243.                 int old_mode, new_mode;
  244.  
  245.                 new_mode = fg_bestmode(320,200,1);
  246.                 if (new_mode < 0 || new_mode == 12) {
  247.                    printf("This program requires a 320 ");
  248.                    printf("x 200 color graphics mode.\n");
  249.                    exit(1);
  250.                    }
  251.  
  252.                 old_mode = fg_getmode();
  253.                 fg_setmode(new_mode);
  254.  
  255.                 fg_setcolor(7);
  256.                 fg_rect(0,319,0,199);
  257.  
  258.                 fg_move(156,101);
  259.                 fg_setcolor(1);
  260.                 fg_drawmap(perimeter,2,5);
  261.                 fg_move(156,100);
  262.                 fg_setcolor(2);
  263.                 fg_drawmap(interior,1,3);
  264.                 fg_waitkey();
  265.  
  266.                 fg_setmode(old_mode);
  267.                 fg_reset();
  268.              }
  269.  
  270.  
  271.      In example 10-2, the time required to execute the second call to fg_move
  272. may not be worth the saving of 7 bytes.  When array space is critical, or
  273. when the images are larger, the use of smaller bit maps for certain colors
  274. may be more valuable.
  275.  
  276.      Yet another possibility for example 10-2 would be to shift the elements
  277. of the interior bit map two pixels to the left.  In this way, the bit map
  278. would be aligned against the left side of the array, just as the perimeter
  279. bit map is.  The three values comprising the interior bit map would then
  280. become F8, 70, and 20.  We also would need to change the x coordinate in the
  281. second call to fg_move from 156 to 158.
  282.  
  283.  
  284. Mode-Specific Bit-Mapped Images
  285.  
  286.      This section will discuss the image display routines that use bit-mapped
  287. image formats that are specific to each text and graphics video mode.  The
  288. different image formats closely resemble the structure of video memory in
  289. each mode, so these routines are much faster than displaying mode-independent
  290. bit maps with fg_drawmap.  If you use the mode-specific bit maps in a program
  291. that supports several video modes, there will be some additional programming
  292. that is not needed when using mode-independent bit maps.  Usually, however,
  293. your efforts will be rewarded with significantly faster graphics.
  294.                                           Chapter 10:  Bit-Mapped Images   195
  295.  
  296.      We'll demonstrate the use of mode-specific bit maps in graphics modes
  297. with the familiar two-color triangle whose pixel representation appears
  298. below.
  299.  
  300.                               . . . . * . . . .
  301.                               . . . * x * . . .
  302.                               . . * x x x * . .
  303.                               . * x x x x x * .
  304.                               * * * * * * * * *
  305.  
  306.      As before, our triangle is nine pixels wide at its base and five pixels
  307. high.  The pixels indicated by an asterisk (*) are the triangle's perimeter,
  308. while those indicated by an x represent its interior points.  We need to
  309. distinguish between these pixels because they will be different colors.  The
  310. pixels shown as periods (.) are not part of the triangle itself.  They are
  311. required to make the image rectangular, so from Fastgraph's perspective they
  312. are indeed part of the image.
  313.  
  314.  
  315. Regular Images
  316.  
  317.      The Fastgraph routine fg_drwimage displays regular mode-specific bit-
  318. mapped images (by regular, we mean an image that is neither clipped nor
  319. rotated).  Its arguments are the same as for the fg_drawmap routine, and the
  320. bit map array's subscript order is also the same as for fg_drawmap.  The
  321. major difference is the bit map structure -- we combine the information for
  322. all colors into a single bit map, in a way consistent with the structure of
  323. video memory for the various modes.  As with the other image display
  324. routines, fg_drwimage displays the image on the active video page with its
  325. lower left corner at the graphics cursor position (or the text cursor
  326. position for text modes).  We'll now examine the use of fg_drwimage in
  327. several video modes.
  328.  
  329. CGA four-color graphics modes
  330.  
  331.      In the four-color CGA graphics modes (modes 4 and 5), each pixel can
  332. assume a value between 0 and 3.  This means it takes two bits to represent a
  333. pixel, or put another way, each byte of video memory holds four pixels.  Our
  334. triangle image is nine pixels wide, so three bytes are needed for each row of
  335. the image.  Because the image is five pixels high, we need a bit map array of
  336. at least 15 bytes (five rows times three bytes per row) to hold the image.
  337.  
  338.      The image's binary representation and its hexadecimal equivalent for the
  339. four-color CGA graphics modes are shown below.  The binary values in boldface
  340. represent the actual image; the others are the filler bits needed to complete
  341. each row of the bit map after the ninth pixel.  We have coded the perimeter
  342. pixels to be color 1 (01 binary) and the interior pixels to be color 2 (10
  343. binary).  Any pixel whose value is zero (00 binary) is transparent and will
  344. thus leave the contents of video memory at that position unchanged.
  345.  
  346.          00 00 00 00   01 00 00 00   00 00 00 00         00   40   00
  347.  
  348.          00 00 00 01   10 01 00 00   00 00 00 00         01   90   00
  349.  
  350.          00 00 01 10   10 10 01 00   00 00 00 00         06   A4   00
  351.  
  352. 196   Fastgraph User's Guide
  353.  
  354.          00 01 10 10   10 10 10 01   00 00 00 00         1A   A9   00
  355.  
  356.          01 01 01 01   01 01 01 01   01 00 00 00         55   55   40
  357.  
  358.      Example 10-3 uses this mode-specific bit map to display the triangle in
  359. the standard CGA four-color graphics mode (mode 4).  After establishing the
  360. video mode, the program uses fg_rect to fill the entire screen with a white
  361. rectangle.  Next, the program establishes (156,101) as the graphics cursor
  362. position; this causes the triangle to be centered on the screen.  The call to
  363. fg_drwimage produces a triangle with a cyan perimeter (color 1) and a magenta
  364. interior (color 2).
  365.  
  366.                                 Example 10-3.
  367.  
  368.               #include <fastgraf.h>
  369.               #include <stdio.h>
  370.               #include <stdlib.h>
  371.               void main(void);
  372.  
  373.               char triangle[] = {
  374.                  0x55,0x55,0x40, 0x1A,0xA9,0x00, 0x06,0xA4,0x00,
  375.                  0x01,0x90,0x00, 0x00,0x40,0x00
  376.                  };
  377.  
  378.               void main()
  379.               {
  380.                  int old_mode;
  381.  
  382.                  if (fg_testmode(4,1) == 0) {
  383.                     printf("This program requires a 320 ");
  384.                     printf("x 200 CGA graphics mode.\n");
  385.                     exit(1);
  386.                     }
  387.  
  388.                  old_mode = fg_getmode();
  389.                  fg_setmode(4);
  390.  
  391.                  fg_setcolor(7);
  392.                  fg_rect(0,319,0,199);
  393.  
  394.                  fg_move(156,101);
  395.                  fg_drwimage(triangle,3,5);
  396.                  fg_waitkey();
  397.  
  398.                  fg_setmode(old_mode);
  399.                  fg_reset();
  400.               }
  401.  
  402.  
  403. CGA two-color graphics mode
  404.  
  405.      In the two-color CGA graphics mode (mode 6), each pixel can assume the
  406. values 0 or 1.  This means it takes just one bit to represent a pixel, so
  407. each byte of video memory holds eight pixels.  Our triangle image is nine
  408. pixels wide, so two bytes are needed for each row of the image.  Because the
  409.                                           Chapter 10:  Bit-Mapped Images   197
  410.  
  411. image is five pixels high, we need a bit map array of at least 10 bytes (five
  412. rows times two bytes per row) to hold the image.
  413.  
  414.      The image's binary representation and its hexadecimal equivalent for the
  415. two-color CGA graphics mode is shown below.  The binary values in boldface
  416. represent the actual image; the others are the filler bits needed to complete
  417. each row of the bit map after the ninth pixel.  We have coded both the
  418. perimeter pixels and the interior pixels to be color 1.  Any pixel whose
  419. value is zero is transparent and will thus leave the contents of video memory
  420. at that position unchanged.
  421.  
  422.               0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0         08   00
  423.  
  424.               0 0 0 1 1 1 0 0   0 0 0 0 0 0 0 0         1C   00
  425.  
  426.               0 0 1 1 1 1 1 0   0 0 0 0 0 0 0 0         3E   00
  427.  
  428.               0 1 1 1 1 1 1 1   0 0 0 0 0 0 0 0         7F   00
  429.  
  430.               1 1 1 1 1 1 1 1   1 0 0 0 0 0 0 0         FF   80
  431.  
  432.      Example 10-4 uses this mode-specific bit map to display the triangle in
  433. the CGA two-color graphics mode (mode 6).  After establishing the video mode,
  434. the program establishes (316,101) as the graphics cursor position; this
  435. causes the triangle to be centered on the screen.  The call to fg_drwimage
  436. produces a solid triangle.
  437.  
  438.                                 Example 10-4.
  439.  
  440.                   #include <fastgraf.h>
  441.                   #include <stdio.h>
  442.                   #include <stdlib.h>
  443.                   void main(void);
  444.  
  445.                   char triangle[] = {
  446.                      0xFF,0x80, 0x7F,0x00, 0x3E,0x00,
  447.                      0x1C,0x00, 0x08,0x00
  448.                      };
  449.  
  450.                   void main()
  451.                   {
  452.                      int old_mode;
  453.  
  454.                      if (fg_testmode(6,1) == 0) {
  455.                         printf("This program requires a ");
  456.                         printf("CGA graphics mode.\n");
  457.                         exit(1);
  458.                         }
  459.  
  460.                      old_mode = fg_getmode();
  461.                      fg_setmode(6);
  462.  
  463.                      fg_move(316,101);
  464.                      fg_drwimage(triangle,2,5);
  465.                      fg_waitkey();
  466.  
  467. 198   Fastgraph User's Guide
  468.  
  469.  
  470.                      fg_setmode(old_mode);
  471.                      fg_reset();
  472.                   }
  473.  
  474.  
  475. Tandy/PCjr 16-color graphics mode
  476.  
  477.      The structure of the mode-specific bit maps for the Tandy/PCjr 16-color
  478. graphics mode (mode 9) is the same as the mode-specific bit map structure for
  479. the EGA/VGA/SVGA 16-color graphics modes discussed later in this section.
  480.  
  481. Hercules graphics modes
  482.  
  483.      The structure of the mode-specific bit maps for the Hercules graphics
  484. modes (modes 11 and 12) is the same as two of the CGA graphics modes.  For
  485. the standard Hercules graphics mode (mode 11), please refer to the discussion
  486. of CGA two-color (mode 6) bit maps.  For the low-resolution Hercules graphics
  487. mode (mode 12), please refer to the discussion of the CGA four-color (mode 4)
  488. bit maps.
  489.  
  490. EGA/VGA/SVGA 16-color graphics modes
  491.  
  492.      In the native EGA and VGA graphics modes (modes 13 through 18) and the
  493. 16-color SVGA graphics modes (modes 28 and 29), each pixel can assume a value
  494. between 0 and 15.  This means it takes four bits to represent a pixel, so
  495. each byte of the bit map holds two pixels.  Our triangle image is nine pixels
  496. wide, so five bytes are needed for each row of the image.  Because the image
  497. is five pixels high, we need a bit map array of at least 25 bytes (five rows
  498. times five bytes per row) to hold the image.
  499.  
  500.      In these modes, it is easy to develop the hexadecimal representation of
  501. a bit map without first producing its binary equivalent.  This is because a
  502. pixel value and a hexadecimal digit each occupy four bits.  The triangle's
  503. hexadecimal representation for these video modes is shown below.  The pixels
  504. in boldface represent the actual image; the others are the filler values
  505. needed to complete each row of the bit map after the ninth pixel.  We have
  506. chosen to display the perimeter pixels in color 1 and the interior pixels in
  507. color 2.  Any pixel whose value is zero is transparent and will thus leave
  508. the contents of video memory at that position unchanged.
  509.  
  510.                             00   00   10   00   00
  511.  
  512.                             00   01   21   00   00
  513.  
  514.                             00   12   22   10   00
  515.  
  516.                             01   22   22   21   00
  517.  
  518.                             11   11   11   11   10
  519.  
  520.      Example 10-5 is similar to example 10-3, but it uses the 320 by 200 EGA
  521. graphics mode (mode 13) and the mode-specific bit map just constructed to
  522. display the triangle.  The call to fg_drwimage produces a triangle with a
  523. blue perimeter (color 1) and a green interior (color 2).
  524.                                           Chapter 10:  Bit-Mapped Images   199
  525.  
  526.  
  527.                                 Example 10-5.
  528.  
  529.                 #include <fastgraf.h>
  530.                 #include <stdio.h>
  531.                 #include <stdlib.h>
  532.                 void main(void);
  533.  
  534.                 char triangle[] = {
  535.                    0x11,0x11,0x11,0x11,0x10,
  536.                    0x01,0x22,0x22,0x21,0x00,
  537.                    0x00,0x12,0x22,0x10,0x00,
  538.                    0x00,0x01,0x21,0x00,0x00,
  539.                    0x00,0x00,0x10,0x00,0x00
  540.                    };
  541.  
  542.                 void main()
  543.                 {
  544.                    int old_mode;
  545.  
  546.                    if (fg_testmode(13,1) == 0) {
  547.                       printf("This program requires a 320 ");
  548.                       printf("x 200 EGA graphics mode.\n");
  549.                       exit(1);
  550.                       }
  551.  
  552.                    old_mode = fg_getmode();
  553.                    fg_setmode(13);
  554.  
  555.                    fg_setcolor(7);
  556.                    fg_rect(0,319,0,199);
  557.  
  558.                    fg_move(156,101);
  559.                    fg_drwimage(triangle,5,5);
  560.                    fg_waitkey();
  561.  
  562.                    fg_setmode(old_mode);
  563.                    fg_reset();
  564.                 }
  565.  
  566.  
  567. 256-color graphics modes
  568.  
  569.      In the 256-color graphics modes (modes 19 through 27), each pixel can
  570. assume a value between 0 and 255 (FF hex).  This means it takes eight bits to
  571. represent a pixel, or each byte of video memory holds one pixel.  Our
  572. triangle image is nine pixels wide, so nine bytes are needed for each row of
  573. the image.  Because the image is five pixels high, we need a bit map array of
  574. at least 45 bytes (five rows times nine bytes per row) to hold the image.
  575. Note we will never need any filler bits in the 256-color video modes.
  576.  
  577.      It is especially simple to develop the bit map for an image in the 256-
  578. color modes because each byte holds exactly one pixel.  The triangle's
  579. hexadecimal representation for the 256-color graphics modes is shown below.
  580. As before, we have coded the perimeter pixels to be color 1 (01 hex) and the
  581. interior pixels to be color 2 (02 hex).  Any pixel whose value is zero is
  582. 200   Fastgraph User's Guide
  583.  
  584. transparent and will thus leave the contents of video memory at that position
  585. unchanged.
  586.  
  587.                   00   00   00   00   01   00   00   00   00
  588.  
  589.                   00   00   00   01   02   01   00   00   00
  590.  
  591.                   00   00   01   02   02   02   01   00   00
  592.  
  593.                   00   01   02   02   02   02   02   01   00
  594.  
  595.                   01   01   01   01   01   01   01   01   01
  596.  
  597.      Example 10-6 is also similar to example 10-3, but it uses the MCGA 256-
  598. color graphics mode (mode 19) and the mode-specific bit map just constructed
  599. to display the triangle.  The call to fg_drwimage produces a triangle with a
  600. blue perimeter (color 1) and a green interior (color 2).
  601.  
  602.                                 Example 10-6.
  603.  
  604.                #include <fastgraf.h>
  605.                #include <stdio.h>
  606.                #include <stdlib.h>
  607.                void main(void);
  608.  
  609.                char triangle[] = {
  610.                   0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
  611.                   0x00,0x01,0x02,0x02,0x02,0x02,0x02,0x01,0x00,
  612.                   0x00,0x00,0x01,0x02,0x02,0x02,0x01,0x00,0x00,
  613.                   0x00,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x00,
  614.                   0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00
  615.                   };
  616.  
  617.                void main()
  618.                {
  619.                   int old_mode;
  620.  
  621.                   if (fg_testmode(19,1) == 0) {
  622.                      printf("This program requires a 320 ");
  623.                      printf("x 200 MCGA graphics mode.\n");
  624.                      exit(1);
  625.                      }
  626.  
  627.                   old_mode = fg_getmode();
  628.                   fg_setmode(19);
  629.  
  630.                   fg_setcolor(7);
  631.                   fg_rect(0,319,0,199);
  632.  
  633.                   fg_move(156,101);
  634.                   fg_drwimage(triangle,9,5);
  635.                   fg_waitkey();
  636.  
  637.                   fg_setmode(old_mode);
  638.                   fg_reset();
  639.                }
  640.                                           Chapter 10:  Bit-Mapped Images   201
  641.  
  642.      Sometimes you may need to include black pixels that are not transparent
  643. in a mode-specific bit-mapped image.  The easiest way to do this is to use
  644. fg_palette or fg_setrgb to make an unused color index black and then use that
  645. color index for non-transparent black pixels.  For example, calling
  646. fg_palette(8,0) in a 16-color graphics mode would display color 8 pixels as
  647. black.  Similarly, fg_setrgb(248,0,0,0) in a 256-color graphics mode would
  648. display color 248 pixels as black.  The choice of colors 8 and 248 in these
  649. examples is arbitrary; any unused color will do.  Another possibility is to
  650. use masking maps, discussed later in this chapter.
  651.  
  652.  
  653. Text Modes
  654.  
  655.      You also can use the fg_drwimage routine to display images in text video
  656. modes (modes 0, 1, 2, 3, and 7).  As one might expect, the image structure in
  657. the text modes is rather different from the graphics modes.  In Chapter 5 we
  658. saw that each character cell on the screen actually consists of a character
  659. and an attribute.  The character value determines what character is
  660. displayed, while the attribute value controls the character's appearance.
  661. The structure of the attribute is:
  662.  
  663.                   bits   attribute
  664.  
  665.                    0-3   foreground color
  666.                    4-6   background color
  667.                     7    blinking
  668.  
  669.      The text mode image structure used with fg_drwimage also consists of a
  670. series of characters and attributes.  For example, the following diagram
  671. illustrates the structure of an image that is three characters wide and two
  672. characters high.
  673.  
  674.  
  675.                    char   attr   char   attr   char   attr
  676.  
  677.                    char   attr   char   attr   char   attr
  678.  
  679.  
  680.      To illustrate the use of fg_drwimage in a text video mode, we'll display
  681. the phrase "hello there" on two different lines in the center of the screen.
  682. Furthermore, let's assume we would like the first character of each word to
  683. appear in foreground color 1, the second in color 2, and so forth.  Our image
  684. will consist of two lines each containing five characters, and each character
  685. requires two bytes of storage (one for the character and another for its
  686. attribute), so we'll need a 20-byte array for holding the image.  The array
  687. really doesn't hold a bit map as in the graphics modes, so in the text modes
  688. the first argument passed to fg_drwimage is instead called the image array.
  689. In our example, the structure of the image array is:
  690.  
  691.            'h'    1    'e'    2    'l'    3    'l'    4    'o'    5
  692.  
  693.            't'    1    'h'    2    'e'    3    'r'    4    'e'    5
  694.  
  695. 202   Fastgraph User's Guide
  696.  
  697. The subscript order that fg_drwimage uses for text modes is the same as for
  698. the graphics modes.  For our five-row by two-column image, this means the
  699. array subscripts would be numbered as follows:
  700.  
  701.               [10] [11] [12] [13] [14] [15] [16] [17] [18] [19]
  702.  
  703.                [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
  704.  
  705.      Depending on the character and attribute values in the image array,
  706. fg_drwimage can display new characters and attributes, new characters leaving
  707. the existing attribute unchanged, new attributes leaving the existing
  708. character unchanged, or leave both the existing character and attribute
  709. unchanged in video memory.  To keep an existing character or attribute,
  710. simply specify a value of 0 in the corresponding element of the image array.
  711. This capability is analogous to the fact that zero-valued pixels in graphics
  712. mode bit maps leave video memory unchanged.
  713.  
  714.      Example 10-7 demonstrates the use of the fg_drwimage routine in the 80-
  715. column color text mode (mode 3).  After establishing the video mode and
  716. making the cursor invisible, the program calls fg_drwimage to display the
  717. "hello there" image just discussed (note we pass the dimensions of the image
  718. array as the number of bytes, not the number of characters).  The program
  719. waits for a keystroke and then calls fg_drwimage again, passing a different
  720. image array (called "image") of the same size.  This array changes the first
  721. letter of both words from lower case to upper case (leaving the attribute
  722. unchanged), and it makes the remaining characters have the same attribute as
  723. the first character.  This is done in part by using zero-valued characters
  724. and attributes to leave video memory unchanged.  After waiting for another
  725. keystroke, the program exits.
  726.  
  727.                                 Example 10-7.
  728.  
  729.                     #include <fastgraf.h>
  730.                     void main(void);
  731.  
  732.                     char hello[] = {
  733.                        't',1, 'h',2, 'e',3, 'r',4, 'e',5,
  734.                        'h',1, 'e',2, 'l',3, 'l',4, 'o',5
  735.                        };
  736.  
  737.                     char image[] = {
  738.                        'T',0, 0,1, 0,1, 0,1, 0,1,
  739.                        'H',0, 0,1, 0,1, 0,1, 0,1
  740.                        };
  741.  
  742.                     void main()
  743.                     {
  744.                        int old_mode;
  745.  
  746.                        old_mode = fg_getmode();
  747.                        fg_setmode(3);
  748.                        fg_cursor(0);
  749.  
  750.                        fg_locate(12,37);
  751.  
  752.                                           Chapter 10:  Bit-Mapped Images   203
  753.  
  754.                        fg_drwimage(hello,10,2);
  755.                        fg_waitkey();
  756.  
  757.                        fg_drwimage(image,10,2);
  758.                        fg_waitkey();
  759.  
  760.                        fg_setmode(old_mode);
  761.                        fg_reset();
  762.                     }
  763.  
  764.  
  765.  
  766. Clipped Images
  767.  
  768.      The fg_drwimage routine displays an image without regard to the current
  769. clipping limits.  If you want the image to be displayed with respect to the
  770. clipping limits (as established by the most recent call to fg_setclip), you
  771. should use the fg_clpimage routine instead of fg_drwimage.  Fg_clpimage takes
  772. the same three arguments as fg_drwimage, and also displays the image such
  773. that its lower left corner is at the graphics cursor position.  Unlike
  774. fg_drwimage, the fg_clpimage routine has no effect when used in a text video
  775. mode.  Because of the additional overhead involved in checking the clipping
  776. limits, fg_clpimage is not as fast as fg_drwimage.
  777.  
  778.  
  779. Reversed Images
  780.  
  781.      The fg_revimage routine displays an image reversed (that is, mirrored
  782. about the y-axis).  Fg_revimage takes the same three arguments as
  783. fg_drwimage, and also displays the image such that its lower left corner is
  784. at the graphics cursor position.  The fg_revimage routine has no effect when
  785. used in a text video mode.
  786.  
  787.  
  788. Reversed Clipped Images
  789.  
  790.      The fg_flpimage routine combines the effects of the fg_revimage and
  791. fg_clpimage routines -- it displays a reversed image with respect to the
  792. current clipping limits.  Fg_flpimage takes the same three arguments as
  793. fg_drwimage, and also displays the image such that its lower left corner is
  794. at the graphics cursor position.  Like the fg_clpimage routine, fg_flpimage
  795. has no effect when used in a text video mode.
  796.  
  797.  
  798. Images Without Transparent Pixels
  799.  
  800.      The fg_putimage routine is the same as fg_drwimage except it does not
  801. consider color 0 pixels to be transparent.  Because it does not need to check
  802. for transparent pixels, fg_putimage is faster than fg_drwimage.  Using
  803. fg_putimage is recommended for cases where transparency is not an issue.
  804.  
  805.  
  806. Some Examples
  807.  
  808.      Example 10-8 illustrates the use of the fg_drwimage, fg_clpimage,
  809. fg_revimage, fg_flpimage, and fg_putimage routines in the standard CGA four-
  810. 204   Fastgraph User's Guide
  811.  
  812. color graphics mode (mode 4).  The program uses each of these routines to
  813. display a small white arrow, as shown in the pixel map below.
  814.  
  815.                              . . . . . . * . . .
  816.                              . . . . . . * * . .
  817.                              * * * * * * * * * .
  818.                              * * * * * * * * * *
  819.                              * * * * * * * * * .
  820.                              . . . . . . * * . .
  821.                              . . . . . . * . . .
  822.  
  823. As before, we must first convert this image to a bit map.  The image is ten
  824. pixels wide and seven high.  In mode 4, each pixel occupies two bits, so we
  825. need a 21-byte array (7 rows by 3 columns) to store the image.  Since we want
  826. to make the arrow white, each pixel will be displayed in color 3 (11 binary).
  827. Here is the bit map and its hexadecimal equivalent for the arrow image in
  828. mode 4 (the actual image is in boldface).
  829.  
  830.          00 00 00 00   00 00 11 00   00 00 00 00         00   0C   00
  831.  
  832.          00 00 00 00   00 00 11 11   00 00 00 00         00   0F   00
  833.  
  834.          11 11 11 11   11 11 11 11   11 00 00 00         FF   FF   C0
  835.  
  836.          11 11 11 11   11 11 11 11   11 11 00 00         FF   FF   F0
  837.  
  838.          11 11 11 11   11 11 11 11   11 00 00 00         FF   FF   C0
  839.  
  840.          00 00 00 00   00 00 11 11   00 00 00 00         00   0F   00
  841.  
  842.          00 00 00 00   00 00 11 00   00 00 00 00         00   0C   00
  843.  
  844.      After establishing the video mode, the program fills the screen with
  845. color 1 pixels and defines a clipping region.  It then uses fg_drwimage to
  846. display the arrow pointing to the right and fg_clpimage to do the same thing,
  847. but with respect to the clipping limits.  Because the left edge of the arrow
  848. is displayed at x=10 and the right clipping limit is at x=15, the call to
  849. fg_clpimage only draws the first six columns of the arrow (that is, it does
  850. not draw the arrow head).
  851.  
  852.      Next, example 10-8 uses fg_revimage to display the arrow pointing to the
  853. left.  To allow for the filler pixels, we must establish the graphics cursor
  854. position two pixels to the left of the position used by fg_drwimage if we
  855. want the tip of the left-pointing arrow to align with the tail of the right-
  856. pointing arrow.  The program then uses fg_flpimage to display an arrow
  857. pointing to the left with regard to the clipping limits.  The call to
  858. fg_flpimage displays the arrow head and the first two columns of the arrow
  859. shaft.  Finally, the program uses fg_putimage to display the unclipped right-
  860. pointing arrow without transparent pixels (this produces a black border
  861. around the arrow).
  862.  
  863.                                 Example 10-8.
  864.  
  865.               #include <fastgraf.h>
  866.               #include <stdio.h>
  867.  
  868.                                           Chapter 10:  Bit-Mapped Images   205
  869.  
  870.               #include <stdlib.h>
  871.               void main(void);
  872.  
  873.               char arrow[] = {
  874.                  0x00,0x0C,0x00, 0x00,0x0F,0x00, 0xFF,0xFF,0xC0,
  875.                  0xFF,0xFF,0xF0, 0xFF,0xFF,0xC0, 0x00,0x0F,0x00,
  876.                  0x00,0x0C,0x00
  877.                  };
  878.  
  879.               void main()
  880.               {
  881.                  int old_mode;
  882.  
  883.                  if (fg_testmode(4,1) == 0) {
  884.                     printf("This program requires a 320 ");
  885.                     printf("x 200 CGA graphics mode.\n");
  886.                     exit(1);
  887.                     }
  888.  
  889.                  old_mode = fg_getmode();
  890.                  fg_setmode(4);
  891.                  fg_setcolor(1);
  892.                  fg_fillpage();
  893.                  fg_setclip(0,15,0,199);
  894.  
  895.                  fg_move(10,10);
  896.                  fg_drwimage(arrow,3,7);
  897.                  fg_move(10,20);
  898.                  fg_clpimage(arrow,3,7);
  899.                  fg_move(8,30);
  900.                  fg_revimage(arrow,3,7);
  901.                  fg_move(8,40);
  902.                  fg_flpimage(arrow,3,7);
  903.                  fg_move(8,50);
  904.                  fg_putimage(arrow,3,7);
  905.                  fg_waitkey();
  906.  
  907.                  fg_setmode(old_mode);
  908.                  fg_reset();
  909.               }
  910.  
  911.  
  912.      Example 10-9 is the same as example 10-8, but it uses the low resolution
  913. EGA graphics mode (mode 13).  If we changed the mode number specified in the
  914. calls to fg_testmode and fg_setmode, the program also would run in any 16-
  915. color graphics mode.  In these modes, we store two pixels per byte in the bit
  916. map array, so we need a 35-byte array (7 rows by 5 columns) to store the
  917. image.  Here is the bit map's hexadecimal equivalent for the arrow image in
  918. mode 13, followed by the program to display it.
  919.  
  920.                             00   00   00   F0   00
  921.  
  922.                             00   00   00   FF   00
  923.  
  924.                             FF   FF   FF   FF   F0
  925.  
  926. 206   Fastgraph User's Guide
  927.                             FF   FF   FF   FF   FF
  928.  
  929.                             FF   FF   FF   FF   F0
  930.  
  931.                             00   00   00   FF   00
  932.  
  933.                             00   00   00   F0   00
  934.  
  935.  
  936.                                 Example 10-9.
  937.  
  938.                 #include <fastgraf.h>
  939.                 #include <stdio.h>
  940.                 #include <stdlib.h>
  941.                 void main(void);
  942.  
  943.                 char arrow[] = {
  944.                    0x00,0x00,0x00,0xF0,0x00,
  945.                    0x00,0x00,0x00,0xFF,0x00,
  946.                    0xFF,0xFF,0xFF,0xFF,0xF0,
  947.                    0xFF,0xFF,0xFF,0xFF,0xFF,
  948.                    0xFF,0xFF,0xFF,0xFF,0xF0,
  949.                    0x00,0x00,0x00,0xFF,0x00,
  950.                    0x00,0x00,0x00,0xF0,0x00
  951.                    };
  952.  
  953.                 void main()
  954.                 {
  955.                    int old_mode;
  956.  
  957.                    if (fg_testmode(13,1) == 0) {
  958.                       printf("This program requires a 320 ");
  959.                       printf("x 200 EGA graphics mode.\n");
  960.                       exit(1);
  961.                       }
  962.  
  963.                    old_mode = fg_getmode();
  964.                    fg_setmode(13);
  965.                    fg_setcolor(1);
  966.                    fg_fillpage();
  967.                    fg_setclip(0,15,0,199);
  968.  
  969.                    fg_move(10,10);
  970.                    fg_drwimage(arrow,5,7);
  971.                    fg_move(10,20);
  972.                    fg_clpimage(arrow,5,7);
  973.                    fg_move(8,30);
  974.                    fg_revimage(arrow,5,7);
  975.                    fg_move(8,40);
  976.                    fg_flpimage(arrow,5,7);
  977.                    fg_move(8,50);
  978.                    fg_putimage(arrow,5,7);
  979.                    fg_waitkey();
  980.  
  981.                    fg_setmode(old_mode);
  982.                    fg_reset();
  983.                 }
  984.                                           Chapter 10:  Bit-Mapped Images   207
  985.  
  986.  
  987. Retrieving Images
  988.  
  989.      Sometimes it is necessary to retrieve an image from video memory and
  990. store it in one or more arrays as a bit-mapped image.  Fastgraph includes two
  991. routines, fg_getmap and fg_getimage, for this purpose.  The fg_getmap routine
  992. retrieves pixels of the current color index and stores them in the mode-
  993. independent bit map format used by fg_drawmap.  The fg_getimage routine
  994. retrieves an image and stores it in the mode-specific bit map format used by
  995. fg_drwimage, fg_clpimage, fg_revimage, fg_flpimage, and fg_putimage.  The
  996. arguments to fg_getmap and fg_getimage are respectively analogous to those of
  997. fg_drawmap and fg_drwimage:  the first is an array (passed by reference) to
  998. receive the bit map, the second is the width of the bit map in bytes, and the
  999. last is the height of the bit map in pixel rows.  With either routine, the
  1000. graphics cursor position on the active video page defines the lower left
  1001. corner of the image to retrieve.
  1002.  
  1003.      If we want to use the fg_getmap routine to retrieve an image containing
  1004. more than one color, we must call the routine once per color.  In this case
  1005. we'll usually want to pass different bit map arrays to fg_getmap (or perhaps
  1006. different offsets into the same array).  This might seem unusual at first,
  1007. but it parallels the behavior of the fg_drawmap routine.  That is, to display
  1008. a multicolor image using fg_drawmap, we must call it once for each color in
  1009. the image.
  1010.  
  1011.      Example 10-10 demonstrates a typical use of the fg_getmap routine.  The
  1012. program displays the word "text" in the upper left corner of the screen using
  1013. a 320 by 200 graphics mode.  It uses fg_getmap to retrieve the word as an
  1014. image and then displays it in a new position with the fg_drawmap routine.
  1015. Let's look at the program now, and afterward we'll more closely examine the
  1016. screen coordinates and the structure of the bit map array.
  1017.  
  1018.                                 Example 10-10.
  1019.  
  1020.                 #include <fastgraf.h>
  1021.                 #include <stdio.h>
  1022.                 #include <stdlib.h>
  1023.                 void main(void);
  1024.  
  1025.                 void main()
  1026.                 {
  1027.                    char bitmap[32];
  1028.                    int old_mode, new_mode;
  1029.  
  1030.                    new_mode = fg_bestmode(320,200,1);
  1031.                    if (new_mode < 0 || new_mode == 12) {
  1032.                       printf("This program requires a 320 ");
  1033.                       printf("x 200 color graphics mode.\n");
  1034.                       exit(1);
  1035.                       }
  1036.  
  1037.                    old_mode = fg_getmode();
  1038.                    fg_setmode(new_mode);
  1039.  
  1040.                    fg_setcolor(9);
  1041.  
  1042. 208   Fastgraph User's Guide
  1043.  
  1044.                    fg_text("text",4);
  1045.                    fg_waitkey();
  1046.  
  1047.                    fg_move(0,7);
  1048.                    fg_getmap(bitmap,4,8);
  1049.                    fg_move(4,15);
  1050.                    fg_drawmap(bitmap,4,8);
  1051.                    fg_waitkey();
  1052.  
  1053.                    fg_setmode(old_mode);
  1054.                    fg_reset();
  1055.                 }
  1056.  
  1057.      In all 320 by 200 graphics video modes, individual characters are 8
  1058. pixels wide and 8 pixels high.  This means the lower left corner of the (0,0)
  1059. character cell is referenced by the screen coordinates (0,7).  Hence, these
  1060. are the coordinates of the first call to fg_move.  The image retrieved in
  1061. example 10-10 is four characters long (32 pixels wide), so we need a bit map
  1062. array capable of holding 8 rows of 32 pixels (4 bytes) each.  Our bit map
  1063. array is therefore a 32-byte array, logically structured to have 4 columns
  1064. and 8 rows.  These values are the width and height arguments passed to
  1065. fg_getmap and fg_drawmap.
  1066.  
  1067.      After it retrieves the image, example 10-10 displays it one line below
  1068. and one-half character cell (four pixels) to the right of its original
  1069. position.  In other words, the program displays the image four pixels to the
  1070. right of the (1,0) character cell.  The lower left corner of that cell is
  1071. referenced by the screen coordinates (0,15), so the image should appear at
  1072. the position (4,15).  These are the coordinates of the second call to
  1073. fg_move.
  1074.  
  1075.      Example 10-11 illustrates the use of the fg_getmap and fg_drawmap
  1076. routines to retrieve and display a two-color image.  This example is similar
  1077. to example 10-10, but this program first draws a rectangle in the upper left
  1078. corner of the screen and then displays the word "text" on top of the
  1079. rectangle in a different color.  Each character in a 320 by 200 graphics
  1080. video mode is 8 pixels wide and 8 pixels high, so the rectangle must be 32
  1081. pixels wide (4 characters times 8 pixels per character) and 8 pixels high.
  1082. The image to retrieve will be the same size as the rectangle.
  1083.  
  1084.      The image retrieved in example 10-10 required a 32-byte array, logically
  1085. structured to have 4 columns and 8 rows.  Example 10-11 will retrieve an
  1086. image of the same structure, but the image contains two colors instead of
  1087. just one.  This means we need two 32-byte arrays, one for each color, to hold
  1088. the image.  We could instead use a single 64-byte array and pass an offset
  1089. into that array (specifically, &bitmap[32]) for processing the second color.
  1090.  
  1091.                                 Example 10-11.
  1092.  
  1093.                 #include <fastgraf.h>
  1094.                 #include <stdio.h>
  1095.                 #include <stdlib.h>
  1096.                 void main(void);
  1097.  
  1098.                 void main()
  1099.                 {
  1100.                                           Chapter 10:  Bit-Mapped Images   209
  1101.  
  1102.                    char bitmap1[32], bitmap2[32];
  1103.                    int old_mode, new_mode;
  1104.  
  1105.                    new_mode = fg_bestmode(320,200,1);
  1106.                    if (new_mode < 0 || new_mode == 12) {
  1107.                       printf("This program requires a 320 ");
  1108.                       printf("x 200 color graphics mode.\n");
  1109.                       exit(1);
  1110.                       }
  1111.  
  1112.                    old_mode = fg_getmode();
  1113.                    fg_setmode(new_mode);
  1114.  
  1115.                    fg_setcolor(7);
  1116.                    fg_rect(0,31,0,7);
  1117.                    fg_setcolor(9);
  1118.                    fg_text("text",4);
  1119.                    fg_waitkey();
  1120.  
  1121.                    fg_move(0,7);
  1122.                    fg_setcolor(7);
  1123.                    fg_getmap(bitmap1,4,8);
  1124.                    fg_setcolor(9);
  1125.                    fg_getmap(bitmap2,4,8);
  1126.  
  1127.                    fg_move(4,15);
  1128.                    fg_setcolor(7);
  1129.                    fg_drawmap(bitmap1,4,8);
  1130.                    fg_setcolor(9);
  1131.                    fg_drawmap(bitmap2,4,8);
  1132.                    fg_waitkey();
  1133.  
  1134.                    fg_setmode(old_mode);
  1135.                    fg_reset();
  1136.                 }
  1137.  
  1138.  
  1139.      Example 10-12 is similar to example 10-11, but it uses fg_getimage and
  1140. fg_drwimage instead of fg_getmap and fg_drawmap to retrieve and display the
  1141. image.  That is, it uses the mode-specific rather than the mode-independent
  1142. image retrieval and display routines.  When using the mode-specific routines,
  1143. the size of the bit map needed to hold the image depends on the video mode.
  1144. For programs that run in only one video mode, bit map widths are constant,
  1145. but when a program must run in several video modes, the width is variable.
  1146. The Fastgraph routine fg_imagesiz computes the number of bytes required to
  1147. store a mode-specific bit-mapped image of specified dimensions.  Its two
  1148. integer arguments specify the image width and height in pixels.
  1149.  
  1150.      The program computes the image width in bytes by passing a height of 1
  1151. to fg_imagesiz.  The size of the bit map array in example 10-12 is 256 bytes,
  1152. the size required in 256-color graphics modes (32 bytes times 8 bytes).
  1153. Other video modes require less storage, so in these modes only a portion of
  1154. the bit map array will actually be used.  The image width is then used in the
  1155. calls to both fg_getimage and fg_drwimage.
  1156. 210   Fastgraph User's Guide
  1157.                                 Example 10-12.
  1158.  
  1159.                 #include <fastgraf.h>
  1160.                 #include <stdio.h>
  1161.                 #include <stdlib.h>
  1162.                 void main(void);
  1163.  
  1164.                 void main()
  1165.                 {
  1166.                    char bitmap[256];
  1167.                    int old_mode, new_mode;
  1168.                    int width;
  1169.  
  1170.                    new_mode = fg_bestmode(320,200,1);
  1171.                    if (new_mode < 0 || new_mode == 12) {
  1172.                       printf("This program requires a 320 ");
  1173.                       printf("x 200 color graphics mode.\n");
  1174.                       exit(1);
  1175.                       }
  1176.  
  1177.                    old_mode = fg_getmode();
  1178.                    fg_setmode(new_mode);
  1179.                    width = (int)fg_imagesiz(32,1);
  1180.  
  1181.                    fg_setcolor(7);
  1182.                    fg_rect(0,31,0,7);
  1183.                    fg_setcolor(9);
  1184.                    fg_text("text",4);
  1185.                    fg_waitkey();
  1186.  
  1187.                    fg_move(0,7);
  1188.                    fg_getimage(bitmap,width,8);
  1189.                    fg_move(4,15);
  1190.                    fg_drwimage(bitmap,width,8);
  1191.                    fg_waitkey();
  1192.  
  1193.                    fg_setmode(old_mode);
  1194.                    fg_reset();
  1195.                 }
  1196.  
  1197. While this example used an array to store the image, it's usually preferable
  1198. to allocate dynamic memory for this purpose.  We could have done this in
  1199. example 10-12 by calling fg_imagesiz with arguments of 32 (width) and 8
  1200. (height).  The routine's return value would then tell us the number of bytes
  1201. we would need to allocate.
  1202.  
  1203.      We also can use the fg_getimage routine to retrieve images in text video
  1204. modes.  In text modes, however, there are a few differences we must consider
  1205. when using fg_getimage.  First, the text cursor position, not the graphics
  1206. cursor position, specifies the lower left corner of the image.  Hence, we
  1207. must use the fg_locate routine instead of fg_move to define the image
  1208. location.  Second, the image width is always twice the number of characters
  1209. per image row (that is, for each character we have a character byte and an
  1210. attribute byte).  The fg_getmap routine has no effect when used in a text
  1211. video mode.
  1212.                                           Chapter 10:  Bit-Mapped Images   211
  1213.      Example 10-13 shows a simple use of fg_getimage in text modes.  This
  1214. program is similar to example 10-12, but it runs in an 80-column text mode
  1215. rather than a 320 by 200 graphics mode.  As before, the program will retrieve
  1216. the four characters "text" as an image from the upper left corner of the
  1217. screen and then display it in a different location.  Because the image
  1218. consists of four characters in one row, the image width is 8 bytes and the
  1219. image height is 1.
  1220.  
  1221.                                 Example 10-13.
  1222.  
  1223.                    #include <fastgraf.h>
  1224.                    #include <stdio.h>
  1225.                    #include <stdlib.h>
  1226.                    void main(void);
  1227.  
  1228.                    void main()
  1229.                    {
  1230.                       int old_mode;
  1231.                       char image[8];
  1232.  
  1233.                       old_mode = fg_getmode();
  1234.  
  1235.                       if (fg_testmode(3,1))
  1236.                          fg_setmode(3);
  1237.                       else if (fg_testmode(7,1))
  1238.                          fg_setmode(7);
  1239.                       else {
  1240.                          printf("This program requires\n");
  1241.                          printf("an 80-column display.\n");
  1242.                          exit(1);
  1243.                          }
  1244.  
  1245.                       fg_cursor(0);
  1246.  
  1247.                       fg_setattr(9,7,0);
  1248.                       fg_text("text",4);
  1249.                       fg_waitkey();
  1250.  
  1251.                       fg_locate(0,0);
  1252.                       fg_getimage(image,8,1);
  1253.                       fg_locate(1,1);
  1254.                       fg_drwimage(image,8,1);
  1255.                       fg_waitkey();
  1256.  
  1257.                       fg_setmode(old_mode);
  1258.                       fg_reset();
  1259.                    }
  1260.  
  1261.  
  1262.      Finally, here's a tip that's worth remembering.  In the native EGA and
  1263. VGA graphics modes (13 to 18) and the 16-color SVGA graphics modes (28 and
  1264. 29), the routines for displaying and retrieving mode-specific bit maps can be
  1265. anywhere from 10% to 20% faster if the current graphics x position is an even
  1266. number.  This is because these routines must perform additional bit map
  1267. alignment when displaying or retrieving images starting at odd-numbered
  1268. pixels.
  1269. 212   Fastgraph User's Guide
  1270.  
  1271. Pixel Run Maps
  1272.  
  1273.      The bit maps used with the fg_drawmap, fg_drwimage, and related routines
  1274. can consume array space quite rapidly.  This is especially true if the image
  1275. is large or contains many colors.  For example, a mode-independent bit-mapped
  1276. image that occupies the entire screen in a 320 by 200 graphics mode requires
  1277. 8,000 bytes of space per color.  Fastgraph provides another mode-independent
  1278. image format called pixel run maps, which are more efficient in terms of
  1279. space.  Pixel run maps are structured just like the pixel run files
  1280. introduced in the previous chapter, but the image resides in an array instead
  1281. of a file.
  1282.  
  1283.      Let's return to our familiar triangle example and show how we could use
  1284. a pixel run map to display it.
  1285.  
  1286.                               . . . . * . . . .
  1287.                               . . . * x * . . .
  1288.                               . . * x x x * . .
  1289.                               . * x x x x x * .
  1290.                               * * * * * * * * *
  1291.  
  1292. As before, the pixels indicated by an asterisk (*) are the triangle's
  1293. perimeter, while those indicated by an x represent its interior points.  The
  1294. pixels shown as periods (.) are not part of the triangle itself, but they are
  1295. part of the pixel run map.
  1296.  
  1297.      Using the standard pixel run format introduced in the previous chapter,
  1298. we see it takes 16 pixel runs to store our triangle image as a pixel run map.
  1299. If we want to display the perimeter pixels in color 1, the interior pixels in
  1300. color 2, and the filler area in color 7, the pixel run map would contain 16
  1301. sets of (color,count) pairs:  (1,9), (7,1), (1,1), (2,5), (1,1), (7,3),
  1302. (1,1), (2,3), (1,1), (7,5), (1,1), (2,1), (1,1), (7,7), (1,1), and (7,4).
  1303. Unlike the bit-mapped image formats already discussed, pixel run maps have no
  1304. provision for transparent colors.
  1305.  
  1306.      The Fastgraph routine fg_display displays an image stored as a pixel run
  1307. map.  The fg_display routine expects three arguments.  The first is an array
  1308. containing the pixel runs (passed by reference), the second is the number of
  1309. pixel runs in the array, and the third is the width in pixels of the image.
  1310. As with the other image display routines, the fg_display routine displays the
  1311. image such that its lower left corner is at the graphics cursor position on
  1312. the active video page.  Again, the format of the pixel run map is the same as
  1313. that of a standard pixel run file.  In addition, any display patterns defined
  1314. by fg_pattern also apply to fg_display.
  1315.  
  1316.      Example 10-14 uses the fg_display routine to display the triangle as a
  1317. pixel run map in a 320 by 200 graphics mode.  The program displays the
  1318. triangle against a background of color 7, so the selection of color 7 for the
  1319. filler area was important.  If some other color were chosen, the filler area
  1320. would not blend in with the background.
  1321.  
  1322.                                 Example 10-14.
  1323.  
  1324.                 #include <fastgraf.h>
  1325.                 #include <stdio.h>
  1326.                 #include <stdlib.h>
  1327.                                           Chapter 10:  Bit-Mapped Images   213
  1328.  
  1329.                 void main(void);
  1330.  
  1331.                 char triangle[] = {
  1332.                    1,9, 7,1, 1,1, 2,5, 1,1, 7,3, 1,1, 2,3,
  1333.                    1,1, 7,5, 1,1, 2,1, 1,1, 7,7, 1,1, 7,4
  1334.                    };
  1335.  
  1336.                 void main()
  1337.                 {
  1338.                    int old_mode, new_mode;
  1339.  
  1340.                    new_mode = fg_bestmode(320,200,1);
  1341.                    if (new_mode < 0 || new_mode == 12) {
  1342.                       printf("This program requires a 320 ");
  1343.                       printf("x 200 color graphics mode.\n");
  1344.                       exit(1);
  1345.                       }
  1346.  
  1347.                    old_mode = fg_getmode();
  1348.                    fg_setmode(new_mode);
  1349.  
  1350.                    fg_setcolor(7);
  1351.                    fg_rect(0,319,0,199);
  1352.  
  1353.                    fg_move(156,101);
  1354.                    fg_display(triangle,16,9);
  1355.                    fg_waitkey();
  1356.  
  1357.                    fg_setmode(old_mode);
  1358.                    fg_reset();
  1359.                 }
  1360.  
  1361.      As you might guess, Fastgraph also offers a packed pixel run map image
  1362. format analogous to the packed pixel run file format introduced in the
  1363. previous chapter.  Example 10-15 is the same as example 10-14, but it uses
  1364. fg_displayp rather than fg_display to display the image.  Note the use of
  1365. hexadecimal numbers for defining the packed color values, which of course is
  1366. not necessary but certainly easier to read than expressing the quantities as
  1367. decimal numbers.  As with fg_display, any display patterns defined by
  1368. fg_pattern also apply to fg_displayp.
  1369.  
  1370.                                 Example 10-15.
  1371.  
  1372.                 #include <fastgraf.h>
  1373.                 #include <stdio.h>
  1374.                 #include <stdlib.h>
  1375.                 void main(void);
  1376.  
  1377.                 char triangle[] = {
  1378.                    0x17,9,1, 0x12,1,5, 0x17,1,3, 0x12,1,3,
  1379.                    0x17,1,5, 0x12,1,1, 0x17,1,7, 0x17,1,4
  1380.                    };
  1381.  
  1382.                 void main()
  1383.                 {
  1384.                    int old_mode, new_mode;
  1385. 214   Fastgraph User's Guide
  1386.  
  1387.                    new_mode = fg_bestmode(320,200,1);
  1388.                    if (new_mode < 0 || new_mode == 12) {
  1389.                       printf("This program requires a 320 ");
  1390.                       printf("x 200 color graphics mode.\n");
  1391.                       exit(1);
  1392.                       }
  1393.  
  1394.                    old_mode = fg_getmode();
  1395.                    fg_setmode(new_mode);
  1396.  
  1397.                    fg_setcolor(7);
  1398.                    fg_rect(0,319,0,199);
  1399.  
  1400.                    fg_move(156,101);
  1401.                    fg_displayp(triangle,16,9);
  1402.                    fg_waitkey();
  1403.  
  1404.                    fg_setmode(old_mode);
  1405.                    fg_reset();
  1406.                 }
  1407.  
  1408.  
  1409.      Both the fg_display and fg_displayp routines require the pixel run image
  1410. to be stored in an array.  In examples 10-14 and 10-15, the image is defined
  1411. within the program itself.  We can also use these routines in place of
  1412. fg_dispfile when the image is stored in a file if we first read the file
  1413. contents into an array.  Example 10-16 demonstrates this procedure.  The
  1414. program displays two identical images stored in files, one in standard pixel
  1415. run format and the other in packed pixel run format.
  1416.  
  1417.      The first image, in standard pixel run format, is in the file CORAL.SPR.
  1418. Note the program must open the file for reading in binary mode ("rb" in the
  1419. call to fopen).  The program reads the file's entire contents into the
  1420. pixel_runs array, whose size must be at least as large as the file size.
  1421. Because the image is stored in standard pixel run format, the number of pixel
  1422. runs is one-half the file size.  The program then uses the fg_move routine to
  1423. establish the lower left corner of the screen as the graphics cursor position
  1424. and then calls fg_display to display the image.  The image fills the entire
  1425. screen, so its width is 320 pixels.
  1426.  
  1427.      After waiting for a keystroke, the program similarly displays the second
  1428. image.  This image is in the file CORAL.PPR and is stored in packed pixel run
  1429. format.  Because the image is packed, the number of pixel runs is two-thirds
  1430. the file size.  The program then clears the previous image from the screen
  1431. and calls fg_displayp to display the image.  After another keystroke, the
  1432. program restores the original video mode and screen attributes and returns to
  1433. DOS.
  1434.  
  1435.                                 Example 10-16.
  1436.  
  1437.              #include <fastgraf.h>
  1438.              #include <io.h>
  1439.              #include <stdio.h>
  1440.              #include <stdlib.h>
  1441.              void main(void);
  1442.  
  1443.                                           Chapter 10:  Bit-Mapped Images   215
  1444.  
  1445.              char pixel_runs[20000];
  1446.  
  1447.              void main()
  1448.              {
  1449.                 long filelength();
  1450.                 FILE *stream;
  1451.                 int file_size, run_count;
  1452.                 int old_mode, new_mode;
  1453.  
  1454.                 new_mode = fg_bestmode(320,200,1);
  1455.                 if (new_mode < 0 || new_mode == 12) {
  1456.                    printf("This program requires a 320 ");
  1457.                    printf("x 200 color graphics mode.\n");
  1458.                    exit(1);
  1459.                    }
  1460.  
  1461.                 old_mode = fg_getmode();
  1462.                 fg_setmode(new_mode);
  1463.  
  1464.                 stream = fopen("CORAL.SPR","rb");
  1465.                 file_size = (int)(filelength(fileno(stream)));
  1466.                 fread(pixel_runs,sizeof(char),file_size,stream);
  1467.                 fclose(stream);
  1468.                 run_count = file_size / 2;
  1469.                 fg_move(0,199);
  1470.                 fg_display(pixel_runs,run_count,320);
  1471.                 fg_waitkey();
  1472.  
  1473.                 stream = fopen("CORAL.PPR","rb");
  1474.                 file_size = (int)(filelength(fileno(stream)));
  1475.                 fread(pixel_runs,sizeof(char),file_size,stream);
  1476.                 fclose(stream);
  1477.                 run_count = file_size / 3 * 2;
  1478.                 fg_erase();
  1479.                 fg_displayp(pixel_runs,run_count,320);
  1480.                 fg_waitkey();
  1481.  
  1482.                 fg_setmode(old_mode);
  1483.                 fg_reset();
  1484.              }
  1485.  
  1486.  
  1487. Masking Maps
  1488.  
  1489.      It is not possible to include color 0 pixels in an image displayed with
  1490. the fg_drwimage, fg_clpimage, fg_revimage, or fg_flpimage routines.  This is
  1491. because these routines consider color 0 pixels to be transparent, which means
  1492. such pixels do not affect the corresponding pixels in video memory.  There
  1493. are times, however, when you will want color 0 pixels to be destructive, or
  1494. replace the video memory contents.
  1495.  
  1496.      Consider again the arrow image of example 10-8.  In that example, we
  1497. displayed a white (color 3) arrow against a black (color 0) background in the
  1498. standard CGA four-color graphics mode.  Suppose, though, that we want to do
  1499. just the opposite -- display a black (color 0) arrow against a white (color
  1500. 3) background.  We could of course use fg_putimage, fg_drawmap, or one of the
  1501. 216   Fastgraph User's Guide
  1502.  
  1503. routines for displaying pixel run maps, but these methods do not support
  1504. clipping or reversing an image.  There are, however, four Fastgraph routines
  1505. designed just for this purpose.  These routines are fg_drawmask, fg_clipmask,
  1506. fg_revmask, and fg_flipmask.
  1507.  
  1508.      Each of these routines uses a data structure called a masking map.  A
  1509. masking map is similar in structure to a pixel run map, but it does not
  1510. include any information about colors.  Instead, it consists of a series of
  1511. pixel runs that alternate between protected and unprotected pixels.  An
  1512. example might best clarify this.
  1513.  
  1514.      Once again, here is the arrow image of example 10-8.
  1515.  
  1516.                              . . . . . . * . . .
  1517.                              . . . . . . * * . .
  1518.                              * * * * * * * * * .
  1519.                              * * * * * * * * * *
  1520.                              * * * * * * * * * .
  1521.                              . . . . . . * * . .
  1522.                              . . . . . . * . . .
  1523.  
  1524. This time, though, we want the arrow to appear in color 0.  Put another way,
  1525. we need the "period" pixels (.) to protect video memory, while we want the
  1526. "asterisk" pixels (*) to zero video memory.  Looking at this problem from the
  1527. perspective of a pixel run map, we have an alternating series of "protect"
  1528. and "zero" runs.  We don't need any information about pixel colors, just
  1529. whether to protect or to zero video memory.
  1530.  
  1531.      This is precisely the structure of a masking map.  Starting from the
  1532. lower left corner of the image and proceeding to the right, wrapping up to
  1533. the next row when needed, we could represent this image as a masking map with
  1534. 6 protected pixels, 1 zeroed pixel, 9 protected pixels, 2 zeroed pixels, and
  1535. so on.  In general, the structure of a masking map is as follows.
  1536.  
  1537.                       [1]   length of 1st protect run
  1538.  
  1539.                       [2]   length of 1st  zero   run
  1540.  
  1541.                       [3]   length of 2nd protect run
  1542.  
  1543.                       [4]   length of 2nd  zero   run
  1544.                                         .
  1545.                                         .
  1546.                                         .
  1547.                                         .
  1548.                                         .
  1549.                     [n-2]   length of final protect run
  1550.  
  1551.                     [n-1]   length of final  zero   run
  1552.  
  1553.      Looking at this diagram, we see that the even-numbered array elements
  1554. hold the length of the "protect" runs, and the odd-numbered elements hold the
  1555. length of the "zero" runs.  If you need the first run to be a "zero" run,
  1556. just include a "protect" run of length zero as the first element of the
  1557. array.  If the final run is a "protect" run, you do not need to include a
  1558.                                           Chapter 10:  Bit-Mapped Images   217
  1559.  
  1560. zero-length "zero" run at the end of the array.  Finally, if either type of
  1561. run exceeds 255 pixels, you'll need to split this into two or more pixel
  1562. runs.  In this case, be sure to include a zero-length run of the other type
  1563. between the two array elements.
  1564.  
  1565.      Example 10-17 illustrates the use of a masking map through the
  1566. fg_drawmask, fg_clipmask, fg_revmask, and fg_flipmask routines in the
  1567. standard CGA four-color graphics mode (mode 4) to draw a black (color 0)
  1568. arrow against a white background.  These four routines are respectively
  1569. analogous to the fg_drwimage, fg_clpimage, fg_revimage, and fg_flpimage
  1570. routines, but they use masking maps rather than bit maps.  The first argument
  1571. of each routine is the masking map array (passed by reference), the second
  1572. argument is the number of runs (that is, the number of elements) in the
  1573. masking map array, and the third argument is the width in pixels of the
  1574. image.
  1575.  
  1576.                                 Example 10-17.
  1577.  
  1578.                 #include <fastgraf.h>
  1579.                 #include <stdio.h>
  1580.                 #include <stdlib.h>
  1581.                 void main(void);
  1582.  
  1583.                 char arrow[] = {6,1,9,2,2,9,1,19,7,2,8,1};
  1584.  
  1585.                 void main()
  1586.                 {
  1587.                    int old_mode;
  1588.  
  1589.                    if (fg_testmode(4,1) == 0) {
  1590.                       printf("This program requires a 320 ");
  1591.                       printf("x 200 CGA graphics mode.\n");
  1592.                       exit(1);
  1593.                       }
  1594.  
  1595.                    old_mode = fg_getmode();
  1596.                    fg_setmode(4);
  1597.                    fg_setclip(0,15,0,199);
  1598.  
  1599.                    fg_setcolor(3);
  1600.                    fg_rect(0,319,0,199);
  1601.  
  1602.                    fg_move(10,10);
  1603.                    fg_drawmask(arrow,12,10);
  1604.                    fg_move(10,20);
  1605.                    fg_clipmask(arrow,12,10);
  1606.                    fg_move(10,30);
  1607.                    fg_revmask(arrow,12,10);
  1608.                    fg_move(10,40);
  1609.                    fg_flipmask(arrow,12,10);
  1610.                    fg_waitkey();
  1611.  
  1612.                    fg_setmode(old_mode);
  1613.                    fg_reset();
  1614.                 }
  1615.  
  1616. 218   Fastgraph User's Guide
  1617.      One of the more useful features of masking maps is the ability to clear
  1618. a portion of video memory before placing an image there.  This technique
  1619. provides an efficient, simple way to include color 0 pixels in an image.  It
  1620. is especially effective when displaying large or dithered images because the
  1621. masking map is typically much smaller than the bit map required by fg_drawmap
  1622. or its related routines.  Example 10-18 illustrates this process in the
  1623. standard CGA four-color graphics mode (mode 4) by displaying our arrow image
  1624. against a colored background.  In this example, the arrow has a white (color
  1625. 3) perimeter and a black (color 0) interior.
  1626.  
  1627.      The program displays the arrow in two steps.  It first uses fg_drawmask
  1628. to clear the video memory where the arrow will be displayed.  It then draws
  1629. the arrow's perimeter using the fg_drwimage routine.  The interior pixels in
  1630. the perimeter bit map are transparent, but since we just zeroed that video
  1631. memory, they appear in color 0.  Note we could improve this example by
  1632. creating a smaller masking map that only applies to the rectangle inscribing
  1633. the arrow's interior.  That is, we don't need to zero the video memory under
  1634. the arrow's perimeter because we will immediately display other pixels there.
  1635.  
  1636.                                 Example 10-18.
  1637.  
  1638.               #include <fastgraf.h>
  1639.               #include <stdio.h>
  1640.               #include <stdlib.h>
  1641.               void main(void);
  1642.  
  1643.               char arrow_white[] = {
  1644.                  0x00,0x0C,0x00, 0x00,0x0F,0x00, 0xFF,0xFC,0xC0,
  1645.                  0xC0,0x00,0x30, 0xFF,0xFC,0xC0, 0x00,0x0F,0x00,
  1646.                  0x00,0x0C,0x00
  1647.                  };
  1648.               char arrow_black[] = {6,1,9,2,2,9,1,19,7,2,8,1};
  1649.  
  1650.               void main()
  1651.               {
  1652.                  int old_mode;
  1653.  
  1654.                  if (fg_testmode(4,1) == 0) {
  1655.                     printf("This program requires a 320 ");
  1656.                     printf("x 200 CGA graphics mode.\n");
  1657.                     exit(1);
  1658.                     }
  1659.  
  1660.                  old_mode = fg_getmode();
  1661.                  fg_setmode(4);
  1662.  
  1663.                  fg_setcolor(2);
  1664.                  fg_rect(0,319,0,199);
  1665.  
  1666.                  fg_move(10,10);
  1667.                  fg_drawmask(arrow_black,12,10);
  1668.                  fg_drwimage(arrow_white,3,7);
  1669.                  fg_waitkey();
  1670.  
  1671.                  fg_setmode(old_mode);
  1672.                  fg_reset();
  1673.               }
  1674.                                           Chapter 10:  Bit-Mapped Images   219
  1675.  
  1676. Summary of Bit-Mapped Image Display Routines
  1677.  
  1678.      This section summarizes the functional descriptions of the Fastgraph
  1679. routines presented in this chapter.  More detailed information about these
  1680. routines, including their arguments and return values, may be found in the
  1681. Fastgraph Reference Manual.
  1682.  
  1683.      For all bit-mapped image routines, images are displayed or retrieved so
  1684. their lower left corner is at the graphics cursor position (or text cursor
  1685. position for those routines that also work in text video modes).
  1686.  
  1687.      FG_CLIPMASK displays a clipped image stored as a masking map.  This
  1688. routine has no effect when used in a text video mode.
  1689.  
  1690.      FG_CLPIMAGE displays a clipped image stored as a mode-specific bit map.
  1691. Color 0 pixels are considered transparent.  This routine has no effect when
  1692. used in a text video mode.
  1693.  
  1694.      FG_DISPLAY displays an image stored in Fastgraph's standard pixel run
  1695. format, where the image resides in an array.  This routine has no effect when
  1696. used in a text video mode.
  1697.  
  1698.      FG_DISPLAYP displays an image stored in Fastgraph's packed pixel run
  1699. format, where the image resides in an array.  This routine has no effect when
  1700. used in a text video mode.
  1701.  
  1702.      FG_DRAWMAP displays an image stored as a mode-independent bit map.  This
  1703. routine has no effect when used in a text video mode.
  1704.  
  1705.      FG_DRAWMASK displays an image stored as a masking map.  This routine has
  1706. no effect when used in a text video mode.
  1707.  
  1708.      FG_DRWIMAGE displays an image stored as a mode-specific bit map.  Color
  1709. 0 pixels are considered transparent.
  1710.  
  1711.      FG_FLIPMASK displays a reversed clipped image stored as a masking map.
  1712. This routine has no effect when used in a text video mode.
  1713.  
  1714.      FG_FLPIMAGE displays a reversed clipped image stored as a mode-specific
  1715. bit map.  Color 0 pixels are considered transparent.  This routine has no
  1716. effect when used in a text video mode.
  1717.  
  1718.      FG_GETIMAGE retrieves an image as a mode-specific bit map.
  1719.  
  1720.      FG_GETMAP retrieves an image as a mode-independent bit map.  This
  1721. routine has no effect when used in a text video mode.
  1722.  
  1723.      FG_IMAGESIZ determines the number of bytes required to store a mode-
  1724. specific bit-mapped image of specified dimensions.
  1725.  
  1726.      FG_PUTIMAGE displays an image stored as a mode-specific bit map.  No
  1727. support is provided for transparent pixels.
  1728. 220   Fastgraph User's Guide
  1729.  
  1730.      FG_REVIMAGE displays a reversed image stored as a mode-specific bit map.
  1731. Color 0 pixels are considered transparent.  This routine has no effect when
  1732. used in a text video mode.
  1733.  
  1734.      FG_REVMASK displays a reversed image stored as a masking map.  This
  1735. routine has no effect when used in a text video mode.