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

  1. Chapter 7
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Character Display Routines
  8. 128   Fastgraph User's Guide
  9.  
  10.  
  11. Overview
  12.  
  13.      An important part of any program is the capability to display text or
  14. other characters on the screen.  Fastgraph supports two character sets:  the
  15. hardware or BIOS character set available with each video mode, and
  16. Fastgraph's own software character set for graphics video modes.
  17. Fastgraph/Light does not support the software character set.
  18.  
  19.      We'll begin this chapter with a review of character space, and then
  20. discuss the specifics about hardware and software characters.  At the end of
  21. the chapter, we'll briefly explain how to implement bit-mapped characters
  22. into a program.  To simplify things, the example programs presented in this
  23. chapter are mode-specific examples, and no testing is done to check if the
  24. video mode is available on the user's system.
  25.  
  26.  
  27. Character Space
  28.  
  29.      The coordinate system used for displaying hardware characters is called
  30. character space.  It is the only coordinate system available in text video
  31. modes, but it is a supplementary coordinate system you can use with either
  32. screen space or world space in graphics video modes.  Character space can be
  33. thought of as a grid of rows and columns, with each cell in the grid holding
  34. one character.  Each cell is identified by its unique (row,column) integer
  35. coordinates.  The rows and columns are numbered starting at zero; the origin
  36. is always the upper left corner of the screen.  For example, in the 80-column
  37. by 25-row video modes, the (row,column) coordinates of the screen corners are
  38. shown in the following diagram.
  39.  
  40.                             (0,0)           (0,79)
  41.  
  42.  
  43.                             (24,0)         (24,79)
  44.  
  45. The default number of rows and columns depends on the video mode, as shown in
  46. the following table.  For graphics modes, the table also includes the default
  47. width and height in pixels of a character cell.
  48.  
  49.                            Mode                 Char. Char.
  50.                           Number  Columns Rows  Width Height
  51.  
  52.                              0      40     25
  53.                              1      40     25
  54.                              2      80     25
  55.                              3      80     25
  56.                              4      40     25     8     8
  57.                              5      40     25     8     8
  58.                              6      80     25     8     8
  59.                              7      80     25
  60.                              9      40     25     8     8
  61.                             11      80     25     9    14
  62.                             12      40     25     8     8
  63.                             13      40     25     8     8
  64.                                   Chapter 7:  Character Display Routines   129
  65.  
  66.                             14      80     25     8     8
  67.                             15      80     25     8    14
  68.                             16      80     25     8    14
  69.                             17      80     30     8    16
  70.                             18      80     30     8    16
  71.                             19      40     25     8     8
  72.                             20      40     25     8     8
  73.                             21      40     50     8     8
  74.                             22      40     30     8     8
  75.                             23      40     60     8     8
  76.                             24      80     25     8    16
  77.                             25      80     30     8    16
  78.                             26      100    37     8    16
  79.                             27      128    48     8    16
  80.                             28      100    37     8    16
  81.                             29      128    48     8    16
  82.  
  83. Hardware Characters
  84.  
  85.      Hardware characters are available in all of Fastgraph's supported video
  86. modes.  As explained in Chapter 5, text mode characters have a display
  87. attribute that defines their foreground color, their background color, and
  88. whether or not they blink.  Graphics mode characters appear in a single
  89. color, as determined by the current color index.  Chapter 5 also explained
  90. how Fastgraph's fg_setattr and fg_setcolor routines define the attribute or
  91. color index in which subsequent hardware characters appear.
  92.  
  93.      It is obviously important to define the color or attribute for hardware
  94. characters, but it is equally important to define their location on the
  95. screen.  Fastgraph draws hardware characters at the position defined by the
  96. text cursor.  Like the graphics cursor, the text cursor is not a cursor in
  97. the true sense, but is simply a pair of character space (row,column)
  98. coordinates with a special meaning.  The fg_setmode routine sets the text
  99. cursor position to the character space coordinates (0,0), which of course is
  100. the upper left corner of the screen.2
  101.  
  102.      The Fastgraph routine fg_locate changes the text cursor position.  It
  103. has two integer arguments that specify the (row,column) character space
  104. coordinates of the new position.  The row values must be between 0 and one
  105. less than the number of character rows available.  The column values must be
  106. between 0 and one less than the number of character columns available.
  107.  
  108.      The fg_text routine is Fastgraph's basic character display routine.  It
  109. displays a string of hardware characters, starting at the text cursor
  110. position, using the current color attribute (for text modes) or color index
  111. (for graphics modes).  If the string reaches the last column in a row,
  112. fg_text will wrap the string to the first column of the next row.
  113. Additionally, fg_text leaves the cursor one column to the right of the last
  114. character displayed (or the first column of the next row if the last
  115. character appears at the end of a row).  This feature makes it possible for
  116. successive calls to fg_text to display adjacent strings.  The first argument
  117. ____________________
  118.  
  119.      (2) In reality there are eight  text cursors, one for each video page.
  120. The fg_setmode routine initializes each text cursor position to (0,0).  The
  121. next chapter describes this in more detail.
  122. 130   Fastgraph User's Guide
  123. for the fg_text routine is a character string of arbitrary length, and the
  124. second argument is an integer value that specifies the number of characters
  125. to display from that string.
  126.  
  127.      Example 7-1 illustrates the use of the fg_locate and fg_text routines in
  128. the 80 by 25 color text mode (mode 3).  After establishing the video mode and
  129. making the BIOS cursor invisible, the program displays four strings with
  130. different attributes.  The attributes are selected using the fg_setattr
  131. routine, and the strings are displayed by the fg_text routine.  The first
  132. string appears in yellow (attributes 14,0,0) in the upper left corner of the
  133. screen; the fg_locate routine is not necessary because (0,0) is the default
  134. text cursor position established by fg_setmode.  The second string appears in
  135. light green (10,0,0) one space to the right of the first string.  Its
  136. position relies on the fact fg_text leaves the text cursor positioned one
  137. space to the right of the last character displayed (following the "w" of
  138. "yellow" in this case).  The leading space in " green" leaves a space between
  139. the first and second strings.  Similarly, the third string appears in
  140. blinking light red (12,0,1) one space to the right of the second string.
  141.  
  142.      The program then uses the fg_locate routine to move the text cursor to
  143. the lower left corner of the screen and displays the "Press any key" string.
  144. This string is displayed with a light red foreground against a gray
  145. background (12,7,0).  The extra spaces surrounding the string extend the
  146. background color one character position to the left and right and make the
  147. string more visually appealing.  Finally, once you press any key, the program
  148. restores the original video mode and screen attributes before returning to
  149. DOS.
  150.  
  151.                                  Example 7-1.
  152.  
  153.                       #include <fastgraf.h>
  154.                       void main(void);
  155.  
  156.                       void main()
  157.                       {
  158.                          int old_mode;
  159.  
  160.                          old_mode = fg_getmode();
  161.                          fg_setmode(3);
  162.                          fg_cursor(0);
  163.  
  164.                          fg_setattr(14,0,0);
  165.                          fg_text("yellow",6);
  166.  
  167.                          fg_setattr(10,0,0);
  168.                          fg_text(" green",6);
  169.  
  170.                          fg_setattr(12,0,1);
  171.                          fg_text(" blinking",9);
  172.  
  173.                          fg_setattr(12,7,0);
  174.                          fg_locate(24,0);
  175.                          fg_text(" Press any key. ",16);
  176.                          fg_waitkey();
  177.  
  178.                          fg_setmode(old_mode);
  179.                          fg_reset();
  180.                                   Chapter 7:  Character Display Routines   131
  181.  
  182.                       }
  183.  
  184.      The fg_where routine retrieves the text cursor position in its two
  185. integer arguments.  This routine is not used as frequently as the fg_locate
  186. and fg_text routines because more often than not your program will know the
  187. text cursor position implicitly, or you'll know in advance the locations at
  188. which text will be displayed.  The fg_where routine takes two integer
  189. arguments passed as pointers (that is, by reference), and these two arguments
  190. respectively receive the text cursor's current row and column position.
  191.  
  192.      Example 7-2 produces the same results as example 7-1, but it does so a
  193. bit differently.  It uses its own routine, put_string, to display a string at
  194. a specified row and column.  The put_string routine simply calls fg_locate to
  195. establish the text cursor position and then calls fg_text to display the
  196. string.  Note the use of the C library function strlen to determine the
  197. string length passed to the fg_text routine.  Example 7-2 also uses the
  198. fg_where routine to retrieve the new text cursor positions, which are then
  199. passed to the put_string routine.
  200.  
  201.                                  Example 7-2.
  202.  
  203.                    #include <fastgraf.h>
  204.                    #include <string.h>
  205.                    void main(void);
  206.                    void put_string(char*,int,int);
  207.  
  208.                    void main()
  209.                    {
  210.                       int old_mode;
  211.                       int row, column;
  212.  
  213.                       old_mode = fg_getmode();
  214.                       fg_setmode(3);
  215.                       fg_cursor(0);
  216.  
  217.                       fg_setattr(14,0,0);
  218.                       put_string("yellow",0,0);
  219.  
  220.                       fg_setattr(10,0,0);
  221.                       fg_where(&row,&column);
  222.                       put_string("green",row,column+1);
  223.  
  224.                       fg_setattr(12,0,1);
  225.                       fg_where(&row,&column);
  226.                       put_string("blinking",row,column+1);
  227.  
  228.                       fg_setattr(12,7,0);
  229.                       put_string(" Press any key. ",24,0);
  230.                       fg_waitkey();
  231.  
  232.                       fg_setmode(old_mode);
  233.                       fg_reset();
  234.                    }
  235.  
  236.                    void put_string(string,row,column)
  237.                    char *string;
  238. 132   Fastgraph User's Guide
  239.  
  240.                    int row, column;
  241.                    {
  242.                       fg_locate(row,column);
  243.                       fg_text(string,strlen(string));
  244.                    }
  245.  
  246.      Sometimes you may wish to change the display attribute of existing text,
  247. such as when creating a shadow around the edges of a pop-up window.  The
  248. Fastgraph routine fg_chgattr performs this function.  It applies the current
  249. text display attribute (as defined in the most recent call to fg_setattr or
  250. fg_setcolor) to a given number of characters, starting at the text cursor
  251. position.  It leaves the text cursor one column to the right of the last
  252. character changed (or the first column of the next row if the last character
  253. is at the end of a row).  The fg_chgattr routine's argument specifies the
  254. number of characters to change.  This routine has no effect in graphics video
  255. modes.
  256.  
  257.      The Fastgraph routine fg_chgtext performs somewhat the opposite function
  258. of fg_chgattr.  It displays new text but uses the display attributes already
  259. assigned to the character cells where the text will appear.  The fg_chgtext
  260. routine takes the same two arguments as the fg_text routine, displays the
  261. characters starting at the text cursor position, and leaves the cursor one
  262. column to the right of the last character displayed.  Like fg_chgattr,
  263. fg_chgtext has no effect in graphics video modes.
  264.  
  265.      Example 7-3 illustrates the fg_chgattr and fg_chgtext routines.  It runs
  266. in the 80-column color text mode (mode 3), but if we change the fg_setmode
  267. argument it also would run in the monochrome text mode (mode 7).  The program
  268. first displays the word "hello" in the upper left corner of the screen, using
  269. a gray foreground and black background attribute.  After waiting for a
  270. keystroke, the program calls fg_chgattr to make the word "hello" appear in
  271. reverse video (that is, a black foreground and gray background attribute).
  272. After a second keystroke, the program uses fg_chgtext to change the "h" of
  273. "hello" to upper case.  Following this, the program returns to DOS.
  274.  
  275.                                  Example 7-3.
  276.  
  277.                          #include <fastgraf.h>
  278.                          void main(void);
  279.  
  280.                          void main()
  281.                          {
  282.                             int old_mode;
  283.  
  284.                             old_mode = fg_getmode();
  285.                             fg_setmode(3);
  286.                             fg_cursor(0);
  287.  
  288.                             fg_setattr(7,0,0);
  289.                             fg_text("hello",5);
  290.                             fg_waitkey();
  291.  
  292.                             fg_locate(0,0);
  293.                             fg_setattr(0,7,0);
  294.                             fg_chgattr(5);
  295.                             fg_waitkey();
  296.                                   Chapter 7:  Character Display Routines   133
  297.  
  298.  
  299.                             fg_locate(0,0);
  300.                             fg_chgtext("H",1);
  301.                             fg_waitkey();
  302.  
  303.                             fg_setmode(old_mode);
  304.                             fg_reset();
  305.                          }
  306.  
  307.  
  308.      You also can retrieve the character or attribute stored in a specific
  309. character cell.  The Fastgraph routine fg_getchar retrieves character values,
  310. while fg_getattr retrieves character attributes.  Both routines have two
  311. integer arguments that specify the (row,column) coordinates for the character
  312. cell of interest.  Example 7-4 uses fg_getchar and fg_getattr to obtain the
  313. character and attribute stored at row 24, column 0.  Just before the program
  314. exits, it displays these values.
  315.  
  316.                                  Example 7-4.
  317.  
  318.                      #include <fastgraf.h>
  319.                      #include <stdio.h>
  320.                      void main(void);
  321.  
  322.                      void main()
  323.                      {
  324.                         int attr, value;
  325.                         int old_mode;
  326.  
  327.                         old_mode = fg_getmode();
  328.                         fg_setmode(3);
  329.                         fg_cursor(0);
  330.  
  331.                         fg_setattr(9,7,0);
  332.                         fg_locate(24,0);
  333.                         fg_text("Test",4);
  334.                         value = fg_getchar(24,0);
  335.                         attr  = fg_getattr(24,0);
  336.                         fg_waitkey();
  337.  
  338.                         fg_setmode(old_mode);
  339.                         fg_reset();
  340.                         printf("%c %2.2X\n",value,attr);
  341.                      }
  342.  
  343.  
  344.      If you need to retrieve characters and attributes from a rectangular
  345. area, it's more efficient to use the fg_getimage routine (described in
  346. Chapter 10) than to call fg_getchar and fg_getattr repeatedly.
  347.  
  348.      Displaying hardware characters in graphics video modes is quite
  349. different from doing so in text modes.  Like text modes, we can still use
  350. fg_text to display strings in character space, which of course restricts the
  351. places where strings can appear.  Graphics modes offer the ability to display
  352. strings relative to any pixel, not just character cells.  The fg_print and
  353. fg_justify routines are provided for this purpose.  To compare the two
  354. 134   Fastgraph User's Guide
  355.  
  356. methods of displaying strings in graphics modes, let's begin with an example
  357. of doing so with fg_text.
  358.  
  359.      Example 7-5 is similar to example 7-1, but it runs in the EGA enhanced
  360. graphics mode (mode 16) instead of a text mode.  In graphics modes, the
  361. fg_cursor routine has no effect, so we have omitted it from the program.
  362. Furthermore, characters cannot be displayed with a blinking attribute, so we
  363. have omitted the blinking characters (we could simulate blinking by
  364. repetitively displaying and erasing them, but that is beyond the scope of
  365. this example).  Because graphics mode characters only have a foreground
  366. color, we had to simulate the gray background of the "Press any key" string
  367. by first drawing a rectangle where that string appears.  The differences
  368. between examples 7-5 and 7-1 hold for any graphics video mode, not just mode
  369. 16.
  370.  
  371.                                  Example 7-5.
  372.  
  373.                       #include <fastgraf.h>
  374.                       void main(void);
  375.  
  376.                       void main()
  377.                       {
  378.                          int old_mode;
  379.  
  380.                          old_mode = fg_getmode();
  381.                          fg_setmode(16);
  382.  
  383.                          fg_setcolor(14);
  384.                          fg_text("yellow",6);
  385.  
  386.                          fg_setcolor(10);
  387.                          fg_text(" green",6);
  388.  
  389.                          fg_setcolor(7);
  390.                          fg_rect(0,127,336,349);
  391.                          fg_setcolor(12);
  392.                          fg_locate(24,0);
  393.                          fg_text(" Press any key. ",16);
  394.                          fg_waitkey();
  395.  
  396.                          fg_setmode(old_mode);
  397.                          fg_reset();
  398.                       }
  399.  
  400.      Now let's show how to display graphics mode strings using the more
  401. flexible screen space coordinate system.  The fg_print routine is identical
  402. to fg_text, but it displays a string relative to the graphics cursor position
  403. (that is, in screen space) rather than the character space position
  404. established with fg_locate.  By default, fg_print displays strings so their
  405. lower left corner is at the graphics cursor position.  The fg_justify routine
  406. lets you change this default justification.  Its two parameters, xjust and
  407. yjust, control the string positioning about the current graphics position, as
  408. summarized in the following table:
  409.  
  410.            value of       value of      horizontal      vertical
  411.              xjust          yjust      justification  justification
  412.                                   Chapter 7:  Character Display Routines   135
  413.  
  414.               -1             -1            left           lower
  415.               -1              0            left          center
  416.               -1              1            left           upper
  417.                0             -1           center          lower
  418.                0              0           center         center
  419.                0              1           center          upper
  420.                1             -1            right          lower
  421.                1              0            right         center
  422.                1              1            right          upper
  423.  
  424. Any other justification values produce undefined results.  In the context of
  425. vertical justification, lower justification means the bottom of each
  426. character will be at the current graphics y position.  Upper justification
  427. means the top of each character will be at the graphics y position, while
  428. center justification means characters will be centered about the graphics y
  429. position.  Note that the default justification settings are xjust = -1 and
  430. yjust = -1.  The fg_print routine leaves the graphics cursor positioned just
  431. beyond the bottom right corner of the last character displayed.
  432.  
  433.      Example 7-6 illustrates the use of fg_print and fg_justify to display
  434. justified text in the VGA 640 by 480 16-color graphics mode (mode 18).  The
  435. first series of calls to fg_move, fg_justify, and fg_print display the string
  436. "Fastgraph" left justified, centered, and right justified against the top row
  437. of the screen.  The second series of such calls also displays the string in
  438. these positions, but each is centered vertically in the middle of the screen.
  439. The final series displays the strings against the bottom row of the screen.
  440. The nine calls to fg_justify in example 7-6 represent all possible
  441. justification settings for strings displayed with fg_print.
  442.  
  443.                                  Example 7-6.
  444.  
  445.                          #include <fastgraf.h>
  446.                          void main(void);
  447.  
  448.                          void main()
  449.                          {
  450.                             int old_mode;
  451.  
  452.                             old_mode = fg_getmode();
  453.                             fg_setmode(18);
  454.                             fg_setcolor(9);
  455.                             fg_fillpage();
  456.                             fg_setcolor(14);
  457.  
  458.                             fg_move(0,0);
  459.                             fg_justify(-1,1);
  460.                             fg_print("Fastgraph",9);
  461.                             fg_move(320,0);
  462.                             fg_justify(0,1);
  463.                             fg_print("Fastgraph",9);
  464.                             fg_move(639,0);
  465.                             fg_justify(1,1);
  466.                             fg_print("Fastgraph",9);
  467.  
  468.                             fg_move(0,240);
  469.                             fg_justify(-1,0);
  470. 136   Fastgraph User's Guide
  471.                             fg_print("Fastgraph",9);
  472.                             fg_move(320,240);
  473.                             fg_justify(0,0);
  474.                             fg_print("Fastgraph",9);
  475.                             fg_move(639,240);
  476.                             fg_justify(1,0);
  477.                             fg_print("Fastgraph",9);
  478.  
  479.                             fg_move(0,479);
  480.                             fg_justify(-1,-1);
  481.                             fg_print("Fastgraph",9);
  482.                             fg_move(320,479);
  483.                             fg_justify(0,-1);
  484.                             fg_print("Fastgraph",9);
  485.                             fg_move(639,479);
  486.                             fg_justify(1,-1);
  487.                             fg_print("Fastgraph",9);
  488.                             fg_waitkey();
  489.  
  490.                             fg_setmode(old_mode);
  491.                             fg_reset();
  492.                          }
  493.  
  494.      Example 7-7 demonstrates a side effect that occurs when displaying
  495. characters in graphics modes.  This example uses the MCGA graphics mode (mode
  496. 19) and displays two character strings at the same location.  If we were to
  497. do this in a text mode, the first string would disappear once we displayed
  498. the second string.  In graphics modes, however, the portions of the first
  499. string not covered by characters from the second string are still visible.
  500. The reason for this may not be clear at first, but remember when we display
  501. characters in graphics modes, we aren't really displaying characters but
  502. merely a pixel representation of the characters.  Fastgraph has no way to
  503. distinguish such pixels from any other pixels, no matter if we use fg_text or
  504. fg_print for string display.
  505.  
  506.                                  Example 7-7.
  507.  
  508.                          #include <fastgraf.h>
  509.                          void main(void);
  510.  
  511.                          void main()
  512.                          {
  513.                             int old_mode;
  514.  
  515.                             old_mode = fg_getmode();
  516.                             fg_setmode(19);
  517.  
  518.                             fg_setcolor(14);
  519.                             fg_text("yellow",6);
  520.                             fg_locate(0,0);
  521.                             fg_setcolor(10);
  522.                             fg_text(" green",6);
  523.                             fg_waitkey();
  524.  
  525.                             fg_setmode(old_mode);
  526.                             fg_reset();
  527.                          }
  528.                                   Chapter 7:  Character Display Routines   137
  529.  
  530.      To avoid this problem, the recommended procedure for displaying
  531. characters in graphics modes is to first erase the area where the text will
  532. appear.  The easiest way to do this is to use the fg_rect routine to draw a
  533. rectangle in the background color.  In example 7-7, we could do this by
  534. inserting the statements
  535.  
  536.  
  537.                               fg_setcolor(0);
  538.                               fg_rect(0,47,0,7);
  539.  
  540.  
  541. immediately before the call to fg_locate.  The parameters passed to the
  542. fg_rect routine represent the 48 by 8 pixel region that corresponds to the
  543. first six character cells of row 0 in the 320 by 200 graphics modes.
  544.  
  545.  
  546. Character Height
  547.  
  548.      In VGA and SVGA graphics modes (modes 17 to 29), it's possible to change
  549. the height of characters displayed with fg_print or fg_text.  By default,
  550. characters are 16 pixels high in the VGA and SVGA graphics modes (17, 18, 24
  551. to 29) and 8 pixels high in the MCGA and XVGA graphics modes (19 to 23).  The
  552. fg_fontsize routine lets you display characters from the BIOS 8x8, 8x14, or
  553. 8x16 fonts in any of these modes.  Its only parameter specifies the character
  554. height in pixels; it must be 8, 14, or 16.  If the character height is some
  555. other value, or if fg_fontsize is used in a video mode numbered 16 or less
  556. (that is, in a non-VGA mode), nothing happens.
  557.  
  558.      When we change the character height with fg_fontsize, the number of text
  559. rows on the screen changes accordingly.  The following table shows the number
  560. of text rows available in each supported video mode when using the different
  561. character sizes.  The values in boldface type represent the default character
  562. size and number of rows for that video mode.
  563.  
  564.                                  Mode No. of rows with
  565.                                 Number 8x8  8x14 8x16
  566.  
  567.                                   17    60   34   30
  568.                                   18    60   34   30
  569.                                   19    25   14   12
  570.                                   20    25   14   12
  571.                                   21    50   28   25
  572.                                   22    30   17   15
  573.                                   23    60   34   30
  574.                                   24    50   28   25
  575.                                   25    60   34   30
  576.                                   26    75   42   37
  577.                                   27    96   54   48
  578.                                   28    75   42   37
  579.                                   29    96   54   48
  580.  
  581.      Example 7-8 shows how to use fg_fontsize to activate the 8x8 character
  582. font in the 16-color 640 by 480 VGA graphics mode (mode 18).  In this mode,
  583. characters displayed with fg_print or fg_text are normally 16 pixels high,
  584. 138   Fastgraph User's Guide
  585.  
  586. giving 30 character rows per screen.  When we use the 8x8 font, this
  587. increases to 60 rows because the characters are now half as tall as before.
  588. The example program uses fg_text to display the string "8x8 ROM font" 60
  589. times, once in each row.
  590.  
  591.                                  Example 7-8.
  592.  
  593.                      #include <fastgraf.h>
  594.                      void main(void);
  595.  
  596.                      void main()
  597.                      {
  598.                         int old_mode;
  599.                         int row;
  600.  
  601.                         old_mode = fg_getmode();
  602.                         fg_setmode(18);
  603.  
  604.                         fg_setcolor(9);
  605.                         fg_fillpage();
  606.                         fg_setcolor(15);
  607.                         fg_fontsize(8);
  608.  
  609.                         for (row = 0; row < 60; row++) {
  610.                            fg_locate(row,34);
  611.                            fg_text("8x8 ROM font",12);
  612.                            }
  613.                         fg_waitkey();
  614.  
  615.                         fg_setmode(old_mode);
  616.                         fg_reset();
  617.                      }
  618.  
  619.  
  620. Conversion Routines
  621.  
  622.      In Chapter 4 we introduced Fastgraph's routines for converting
  623. coordinates between character space and screen space.  In this section we'll
  624. review these routines and then present an example that uses some of them.
  625.  
  626.      The fg_xalpha and fg_yalpha routines convert screen space coordinates to
  627. character space.  The fg_xalpha routine converts a screen space x coordinate
  628. to the character space column that contains the coordinate.  Similarly, the
  629. fg_yalpha routine converts a screen space y coordinate to the character space
  630. row that contains the coordinate.
  631.  
  632.      The fg_xconvert and fg_yconvert routines convert character space
  633. coordinates to screen space.  The fg_xconvert routine converts a character
  634. space column to the screen space coordinate of its leftmost pixel.
  635. Similarly, the fg_yconvert routine converts a character space row to the
  636. screen space coordinate of its top (lowest-numbered) pixel.
  637.  
  638.      Example 7-5 demonstrated how to display characters in a graphics mode.
  639. Because characters do not have a background color in graphics modes, that
  640. example used fg_rect to simulate a background color by drawing a gray
  641. rectangle before displaying the text.  It was necessary to determine the
  642.                                   Chapter 7:  Character Display Routines   139
  643.  
  644. screen coordinates of the character cells so we could pass the correct
  645. parameters to fg_rect.  By using the fg_xconvert and fg_yconvert routines, we
  646. can let Fastgraph calculate the required screen coordinates.  This method has
  647. the additional benefit of working in any graphics mode, whereas the
  648. coordinates passed to fg_rect in example 7-5 would only work properly in a
  649. 640 by 350 graphics mode.  Example 7-9 shows how we could extend example 7-5
  650. to use the fg_xconvert and fg_yconvert routines.
  651.  
  652.                                  Example 7-9.
  653.  
  654.                       #include <fastgraf.h>
  655.                       void main(void);
  656.  
  657.                       void main()
  658.                       {
  659.                          int old_mode;
  660.                          int minx, maxx, miny, maxy;
  661.  
  662.                          fg_old_mode = fg_getmode();
  663.                          fg_setmode(16);
  664.  
  665.                          fg_setcolor(14);
  666.                          fg_text("yellow",6);
  667.  
  668.                          fg_setcolor(10);
  669.                          fg_text(" green",6);
  670.  
  671.                          fg_setcolor(7);
  672.                          minx = fg_xconvert(0);
  673.                          maxx = fg_xconvert(16) - 1;
  674.                          miny = fg_yconvert(24);
  675.                          maxy = fg_yconvert(25) - 1;
  676.                          fg_rect(minx,maxx,miny,maxy);
  677.                          fg_setcolor(12);
  678.                          fg_locate(24,0);
  679.                          fg_text(" Press any key. ",16);
  680.                          fg_waitkey();
  681.  
  682.                          fg_setmode(old_mode);
  683.                          fg_reset();
  684.                       }
  685.  
  686.  
  687.  
  688. Software Characters
  689.  
  690.      Software characters, also called stroke characters or vector characters
  691. in other literature, are only are available in graphics video modes.  Unlike
  692. the fixed-size hardware characters, you can display software characters in
  693. any size, at any angle, and at any position.  In addition, software
  694. characters are proportionally spaced.  However, software characters take
  695. longer to draw than do hardware characters.
  696.  
  697.      Fastgraph includes two software character fonts, called the primary font
  698. and the alternate font.  The primary font contains upper and lower case
  699. letters, numbers, punctuation, and most of the other printable ASCII
  700. 140   Fastgraph User's Guide
  701. characters.  The alternate font contains upper and lower case Greek letters
  702. and other mathematical and scientific symbols.
  703.  
  704.      The Fastgraph routine fg_swchar displays a string of software characters
  705. in the current color index (as defined by the most recent call to
  706. fg_setcolor).  The string may contain any characters from the primary font,
  707. the alternate font, or both.  You can display the characters left justified,
  708. centered, or right justified relative to the graphics cursor position.  Just
  709. as the fg_text routine updates the text cursor position, fg_swchar sets the
  710. graphics cursor position just to the right of the last character drawn.  The
  711. characters are clipped according to the current clipping region.  In addition
  712. to the characters, the string passed to fg_swchar also may contain operators
  713. for switching fonts, underlining, subscripting, or superscripting characters.
  714. Because fg_swchar internally uses world space coordinates, you must call the
  715. fg_initw routine at some point in your program before the first call to
  716. fg_swchar.  You also must establish a world space coordinate system with the
  717. fg_setworld routine.
  718.  
  719.      The fg_swchar routine has three arguments.  The first argument is the
  720. character string to display.  The second argument is an integer value that
  721. specifies the number of characters in the string, including any characters
  722. used as special operators.  The third argument is an integer value that
  723. determines the position of the string relative to the graphics cursor
  724. position.  If this value is negative, the lower left corner of the first
  725. character will be at the graphics cursor position.  If it is positive, the
  726. lower right corner of the last character will be at the graphics cursor
  727. position.  If it is zero, the string will be horizontally centered at the
  728. graphics cursor position.
  729.  
  730.      The size of software characters is determined by the values passed to
  731. the fg_setsize, fg_setsizew, and fg_setratio routines.  The fg_setsize
  732. routine has a single integer argument that defines the height of software
  733. characters in screen space units, while the fg_setsizew routine has a single
  734. floating point argument that defines the height in world space units.  If
  735. neither of these routines is called, Fastgraph will use its default character
  736. height of one world space unit.  The fg_setratio routine has a single
  737. floating point argument that defines the aspect ratio for software
  738. characters.  The aspect ratio is the ratio of character width to character
  739. height.  For example, an aspect ratio of 2.0 means characters are twice as
  740. wide as they are high.  If the fg_setratio routine is not called, Fastgraph
  741. uses its default aspect ratio of 1.
  742.  
  743.      Example 7-10 displays both of the software character fonts.  The program
  744. uses the enhanced EGA graphics mode (mode 16), but it could run in any
  745. graphics mode by changing the fg_setmode argument.  After establishing the
  746. video mode, the program calls the fg_initw routine to initialize Fastgraph's
  747. world space parameters; this is required since the software character drawing
  748. routines internally use world space coordinates.  The next statement is a
  749. call to fg_setworld that establishes a world space coordinate system with
  750. 0.01 world space units per pixel.  Following this is a call to fg_setsizew
  751. that defines the character height as 0.21 world space units, or 21 pixels.
  752. Note we could have instead used the fg_setsize routine here with an integer
  753. argument of 21.
  754.  
  755.      The next part of the program draws the characters in the primary font on
  756. the upper half of the screen.  After doing this, the program draws the
  757. alternate font characters on the lower half.  In each case it does this with
  758.                                   Chapter 7:  Character Display Routines   141
  759.  
  760. the fg_swchar routine.  By default, the string passed to fg_swchar will
  761. produce characters from the primary font.  However, you can insert a back
  762. slash character (\) in the string to toggle between the two fonts.  Don't
  763. forget the C language applies a special meaning to the back slash character
  764. within strings, so you must use two consecutive back slashes to insert a
  765. single back slash in the string.
  766.  
  767.                                 Example 7-10.
  768.  
  769.             #include <fastgraf.h>
  770.             void main(void);
  771.  
  772.             void main()
  773.             {
  774.                int old_mode;
  775.  
  776.                old_mode = fg_getmode();
  777.                fg_setmode(16);
  778.                fg_initw();
  779.                fg_setworld(0.0,6.39,0.0,3.49);
  780.                fg_setsizew(0.21);
  781.  
  782.                fg_setcolor(15);
  783.                fg_locate(0,26);
  784.                fg_text("Software characters - font 1",28);
  785.  
  786.                fg_setcolor(10);
  787.                fg_movew(0.0,3.1);
  788.                fg_swchar("ABCDEFGHIJKLMNOPQRSTUVWXYZ",26,-1);
  789.                fg_movew(0.0,2.8);
  790.                fg_swchar("abcdefghijklmnopqrstuvwxyz",26,-1);
  791.                fg_movew(0.0,2.5);
  792.                fg_swchar("0123456789",10,-1);
  793.                fg_movew(0.0,2.2);
  794.                fg_swchar("!\"#$%&'()*+,-./:;<=>?[]^`{|}~",29,-1);
  795.  
  796.                fg_setcolor(15);
  797.                fg_locate(12,26);
  798.                fg_text("Software characters - font 2",28);
  799.  
  800.                fg_setcolor(10);
  801.                fg_movew(0.0,1.4);
  802.                fg_swchar("\\ABCDEFGHIJKLMNOPRSTUWXYZ",25,-1);
  803.                fg_movew(0.0,1.1);
  804.                fg_swchar("\\abcdefghijklmnoprstuwxyz",25,-1);
  805.                fg_movew(0.0,0.4);
  806.                fg_swchar("\\012345678#$%&()*+/<=>?[]{}",27,-1);
  807.                fg_waitkey();
  808.  
  809.                fg_setmode(old_mode);
  810.                fg_reset();
  811.             }
  812.  
  813.      Example 7-10 displays all characters in each font.  If you compare the
  814. primary font strings with the alternate font strings, you'll see the
  815. alternate font contains fewer characters.  For example, the letters Q and V
  816. 142   Fastgraph User's Guide
  817.  
  818. (either upper or lower case) have no corresponding character in the alternate
  819. font.  You might have also noticed the primary font does not support the full
  820. printable ASCII character set.  Any character in a string passed to the
  821. fg_swchar routine that does not have a corresponding character in the current
  822. font will display a blank character.
  823.  
  824.      In addition to the font change operator (the back slash character),
  825. fg_swchar recognizes three other operators.  The superscript operator is a
  826. back slash followed by a caret (\^).  It causes the next character to appear
  827. as a superscript.  Similarly, the subscript operator is a back slash followed
  828. by a lower case v (\v); it causes the next character to appear as a
  829. subscript.  The size of superscripted and subscripted characters is one half
  830. the height of the other characters.  The underline operator is the underscore
  831. character (_).  It causes all subsequent characters in the string to be
  832. underlined until another underscore character is found, or until the end of
  833. the string.  When using these operators, be sure to include them as part of
  834. the string length count passed to fg_swchar.
  835.  
  836.      Example 7-11 illustrates the use of the font selection, superscript,
  837. subscript, and underline operators with the fg_swchar routine.  Again,
  838. because the back slash character has a special meaning to the C programming
  839. language, we must use two consecutive back slashes to represent a single back
  840. slash within the string.  The program displays four strings:
  841.  
  842.                              cos²Θ  + sin²Θ  = 1
  843.                                      H2O
  844.                                      U232
  845.                            One word is underlined.
  846.  
  847. The theta symbol (Θ) in the first string is produced by displaying the
  848. character "h" in the alternate font.  Note another font selection operator
  849. (\) appears immediately after the "h" to revert to the primary font.  The
  850. first string also includes superscript operators (\^) to display the
  851. exponents in the equation.  The second string includes a single subscripted
  852. character, while the third string shows how to display three consecutive
  853. subscripted characters.  Finally, the fourth string illustrates how to
  854. underline characters.
  855.  
  856.      Note example 7-11 also uses the fg_setratio routine.  The first three
  857. strings are drawn with an aspect ratio of 2, making them twice as wide as
  858. they are high.  The fourth string is drawn with an aspect ratio of 1
  859. (Fastgraph's default aspect ratio for software characters), so the character
  860. height is the same as the character width.  Also, the strings are centered
  861. instead of left justified as in the previous example.
  862.  
  863.                                 Example 7-11.
  864.  
  865.             #include <fastgraf.h>
  866.             void main(void);
  867.  
  868.             void main()
  869.             {
  870.                int old_mode;
  871.  
  872.                old_mode = fg_getmode();
  873.                fg_setmode(16);
  874.                                   Chapter 7:  Character Display Routines   143
  875.                fg_setcolor(10);
  876.                fg_initw();
  877.                fg_setworld(0.0,6.39,0.0,3.49);
  878.                fg_setratio(2.0);
  879.                fg_setsizew(0.21);
  880.  
  881.                fg_movew(3.2,3.0);
  882.                fg_swchar("cos\\^2\\h\\ + sin\\^2\\h\\ = 1",25,0);
  883.  
  884.                fg_movew(3.2,2.0);
  885.                fg_swchar("H\\v2O   U\\v2\\v3\\v2",18,0);
  886.  
  887.                fg_movew(3.2,1.0);
  888.                fg_setratio(1.0);
  889.                fg_swchar("One _word_ is underlined.",25,0);
  890.                fg_waitkey();
  891.  
  892.                fg_setmode(old_mode);
  893.                fg_reset();
  894.             }
  895.  
  896.      The fg_setangle routine defines the angle or orientation at which
  897. software characters are displayed.  Its only argument is a floating point
  898. value that specifies the angle, measured in degrees counterclockwise from the
  899. positive x axis.  If a program draws software characters before calling
  900. fg_setangle, Fastgraph will use its default angle of zero degrees (that is,
  901. the characters will be oriented horizontally).
  902.  
  903.      In most programs, the alternate font is not needed.  However, if you use
  904. the fg_swchar routine, Fastgraph will include the definitions of these
  905. characters in your program's data segment.  To prevent wasting this space,
  906. Fastgraph includes the fg_swtext routine.  The fg_swtext routine is same as
  907. the fg_swchar routine, except it does not include the alternate font.  Since
  908. the font selection operator does not apply when using fg_swtext, the routine
  909. simply ignores it.  You should only use fg_swtext if do not use fg_swchar.
  910. If you use both routines, your program will still work correctly, but its
  911. data segment will contain an extra copy of the primary font definitions.
  912.  
  913.      Example 7-12 demonstrates the use of the fg_setangle and fg_swtext
  914. routines.  The program draws a series of strings of the form "nnn degrees",
  915. where nnn is a multiple of 15, radiating from the screen center.  Each string
  916. appears at the specified angle.  For example, the string "15 degrees" is
  917. drawn at an angle of 15 degrees.
  918.  
  919.                                 Example 7-12.
  920.  
  921.                #include <fastgraf.h>
  922.                void main(void);
  923.  
  924.                void main()
  925.                {
  926.                   char string[24];
  927.                   int angle;
  928.                   int old_mode;
  929.  
  930.                   old_mode = fg_getmode();
  931.                   fg_setmode(16);
  932. 144   Fastgraph User's Guide
  933.                   fg_setcolor(10);
  934.                   fg_initw();
  935.                   fg_setworld(0.0,6.39,0.0,3.49);
  936.                   fg_setsizew(0.21);
  937.  
  938.                   for (angle = 0; angle < 360; angle += 15) {
  939.                      fg_movew(3.2,1.75);
  940.                      fg_setangle((double)angle);
  941.                      sprintf(string,"     %3d degrees",angle);
  942.                      fg_swtext(string,16,-1);
  943.                      }
  944.                   fg_waitkey();
  945.  
  946.                   fg_setmode(old_mode);
  947.                   fg_reset();
  948.                }
  949.  
  950.      The final routine pertaining to software characters is fg_swlength,
  951. which returns the length of a specified string of software characters in
  952. world space units.  The length is returned as the routine's floating point
  953. function value.  The fg_swlength routine has two arguments -- a string of
  954. software characters, and an integer value specifying the number of characters
  955. in the string.  As with fg_swchar and fg_swtext, the count includes any of
  956. the special operator characters.
  957.  
  958.      Example 7-13 demonstrates a typical use of the fg_swlength routine.  The
  959. program displays the string "hello there." in light green against a gray
  960. background in the middle of the screen.  As in our previous software
  961. character examples, the program uses mode 16 and first performs the necessary
  962. initializations to use software characters.  Following this, the program uses
  963. the fg_swlength routine to compute the length in world space units of the
  964. string.  Note we have added blank characters to each end of the string passed
  965. to fg_swlength; this increases the length of the actual string and will
  966. effectively give the gray rectangle an extended border on its left and right
  967. sides.  The string length returned by fg_swlength is multiplied by 0.5,
  968. giving the distance from the middle of the screen to either side of the
  969. rectangle.  The program then uses this value to compute the minimum and
  970. maximum x coordinates passed to fg_rectw.  After drawing the gray rectangle,
  971. the program uses fg_swtext to draw the string of software characters in the
  972. middle of the screen.  It then waits for a keystroke before restoring the
  973. original video mode and screen attributes and returning to DOS.
  974.  
  975.                                 Example 7-13.
  976.  
  977.               #include <fastgraf.h>
  978.               void main(void);
  979.  
  980.               void main()
  981.               {
  982.                  int old_mode;
  983.                  double half;
  984.                  double fg_swlength();
  985.  
  986.                  old_mode = fg_getmode();
  987.                  fg_setmode(16);
  988.                  fg_initw();
  989.  
  990.                                   Chapter 7:  Character Display Routines   145
  991.  
  992.                  fg_setworld(0.0,6.39,0.0,3.49);
  993.                  fg_setsizew(0.21);
  994.  
  995.                  fg_setcolor(7);
  996.                  half = fg_swlength(" Hello there. ",14) * 0.5;
  997.                  fg_rectw(3.2-half,3.2+half,1.6,1.9);
  998.  
  999.                  fg_setcolor(10);
  1000.                  fg_movew(3.2,1.65);
  1001.                  fg_swtext("Hello there.",12,0);
  1002.                  fg_waitkey();
  1003.  
  1004.                  fg_setmode(old_mode);
  1005.                  fg_reset();
  1006.               }
  1007.  
  1008.  
  1009.  
  1010. Bit-Mapped Characters
  1011.  
  1012.      Bit-mapped characters combine the properties of hardware and software
  1013. characters.  Like hardware characters, they are a fixed size, but they are
  1014. almost always more visually appealing.  Because they are not scalable, they
  1015. do not require floating point arithmetic, and therefore they are much faster
  1016. than software characters.
  1017.  
  1018.      Fastgraph makes no special provision for bit-mapped characters because
  1019. it treats them as if they were any other bit-mapped image.  For example, to
  1020. use a five-pixel by five-pixel bit-mapped font, you can construct characters
  1021. as shown below and then store these representations in an image array.
  1022.  
  1023.                           *       * * * *       * * * *
  1024.                         *   *     *       *   *
  1025.                       * * * * *   * * * *     *
  1026.                       *       *   *       *   *
  1027.                       *       *   * * * *       * * * *
  1028.  
  1029. The image display routines fg_drawmap and fg_drwimage, discussed in Chapter
  1030. 10, could then be used to display specific characters from the image array.
  1031. Also, the Fastgraph/Fonts  add-on product greatly simplifies adding bit-
  1032. mapped font support to Fastgraph applications.
  1033.  
  1034.  
  1035. Summary of Character Display Routines
  1036.  
  1037.      This section summarizes the functional descriptions of the Fastgraph
  1038. routines presented in this chapter.  More detailed information about these
  1039. routines, including their arguments and return values, may be found in the
  1040. Fastgraph Reference Manual.
  1041.  
  1042.      FG_CHGATTR applies the current text display attribute to a given number
  1043. of characters, starting at the text cursor position.  This routine leaves the
  1044. text cursor one column to the right of the last character changed (or the
  1045. first column of the next row if the last character is at the end of a row).
  1046. It has no effect in graphics video modes.
  1047. 146   Fastgraph User's Guide
  1048.  
  1049.      FG_CHGTEXT displays a string of hardware characters, starting at the
  1050. text cursor position, using the existing text display attributes.  This
  1051. routine leaves the text cursor one column to the right of the last character
  1052. displayed (or the first column of the next row if the last character is at
  1053. the end of a row).  It has no effect in graphics video modes.
  1054.  
  1055.      FG_FONTSIZE enables the 8x8, 8x14, or 8x16 ROM BIOS character font for
  1056. strings displayed with fg_print and fg_text.  This routine is meaningful only
  1057. in VGA and SVGA graphics video modes.
  1058.  
  1059.      FG_GETATTR returns the character attribute stored at the specified
  1060. position on the active video page.  It has no effect in graphics video modes.
  1061.  
  1062.      FG_GETCHAR returns the character value stored at the specified position
  1063. on the active video page.  It has no effect in graphics video modes.
  1064.  
  1065.      FG_JUSTIFY defines the horizontal and vertical justification settings
  1066. for strings displayed with the fg_print.
  1067.  
  1068.      FG_LOCATE establishes the text cursor position for the active video
  1069. page.
  1070.  
  1071.      FG_PRINT displays a string of hardware characters, relative to the
  1072. graphics cursor position, using the current color index.  By default, strings
  1073. are displayed such that the bottom row of the first character is at the
  1074. current graphics position.  On return, the graphics cursor is positioned just
  1075. to the right of the last character displayed.
  1076.  
  1077.      FG_SETANGLE defines the angle or orientation at which software
  1078. characters are displayed.  The angle is measured in degrees counterclockwise
  1079. from the positive x axis.
  1080.  
  1081.      FG_SETATTR establishes the current text display attribute in text video
  1082. modes.  This routine has no effect in graphics video modes.
  1083.  
  1084.      FG_SETCOLOR establishes the current color index (which may be a virtual
  1085. color index in graphics modes).  In text modes, the fg_setcolor routine
  1086. provides an alternate method of establishing the current text display
  1087. attribute.
  1088.  
  1089.      FG_SETRATIO defines the aspect ratio for software characters.  The
  1090. aspect ratio is the ratio of character width to character height.
  1091.  
  1092.      FG_SETSIZE defines the height of software characters in screen space
  1093. units.
  1094.  
  1095.      FG_SETSIZEW defines the height of software characters in world space
  1096. units.
  1097.  
  1098.      FG_SWCHAR displays a string of software characters using the current
  1099. color index.  The string may be left justified, centered, or right justified
  1100. relative to the graphics cursor position.  The string passed to fg_swchar may
  1101. contain special operators that allow switching between fonts, underlining,
  1102. superscripting, or subscripting.  This routine has no effect in text video
  1103. modes.
  1104.                                   Chapter 7:  Character Display Routines   147
  1105.  
  1106.      FG_SWLENGTH returns the length in world space units of a string of
  1107. software characters.
  1108.  
  1109.      FG_SWTEXT is a scaled down version of the fg_swchar routine.  It does
  1110. not include the alternate font character definitions and thus requires less
  1111. memory than fg_swchar.
  1112.  
  1113.      FG_TEXT displays a string of hardware characters, starting at the text
  1114. cursor position, using the current color attribute (for text modes) or color
  1115. index (for graphics modes).  This routine leaves the text cursor one column
  1116. to the right of the last character displayed (or the first column of the next
  1117. row if the last character is at the end of a row).
  1118.  
  1119.      FG_WHERE retrieves the row and column numbers of the text cursor
  1120. position.
  1121.  
  1122.      FG_XALPHA and FG_YALPHA convert screen space coordinates to character
  1123. space.
  1124.  
  1125.      FG_XCONVERT and FG_YCONVERT convert character space coordinates to
  1126. screen space.
  1127. 148   Fastgraph User's Guide