home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / ST_USER / 1990 / USERAU90.MSA / TEXT_GEM.DOC < prev    next >
Text File  |  1990-06-24  |  8KB  |  186 lines

  1.                        TUNE IN TO THE TEST CARD
  2.  
  3.  
  4.             In Part 2 of his introduction to GEM programming
  5.            Roland Waddilove examines some common VDI functions
  6.  
  7.  
  8. In the first part of this series of programming articles exploring GEM we
  9. created our first program - a simple routine that displayed a message on the
  10. screen and then waited for a mouse button to be clicked.
  11.  
  12.     We'll continue looking at the VDI (virtual device interface) functions and
  13. try out some of the most common ones. To see what can be achieved using a few
  14. simple VDI functions double click on either MONO_CRD.PRG in monochrome or
  15. COLR_CRD.PRG in low res colour.
  16.  
  17.     Last month we used the v_gtext() function to print a message on the screen
  18. and it appeared to be quite a simple process. However, we ignored a host of
  19. related functions that directly effect the way in which v_gtext() works.
  20.  
  21.     Look at almost any page produced by a desktop publishing program and you'll
  22. see a wide variety of type sizes, styles and even angles. All this can be
  23. achieved with the humble v_gtext() VDI function so we'll look first at the
  24. related functions that affect the way it displays text.
  25.  
  26.     A very simple and eay-to-use VDI function called vst_color() - note the
  27. American way of spelling colour - sets the ink in which text is printed. Two
  28. (short) integer parameters are required, the workstation handle and the ink:
  29.  
  30. short handle,ink;
  31. vst_color(handle, ink);
  32.  
  33.     The ink number range and the colours displayed depend on the screen mode in
  34. use and the palette (which may be set by the control panel or from within the
  35. program). In low res the inks range from 0 to 15, in medium res it's 0 to 3 and
  36. in monochrome you have a choice of either 0 or 1.
  37.  
  38.     If you don't set the text colour at the start of your program you'll
  39. probably find that it defaults to something sensible like black text on a white
  40. background. Also, the vst_color() returns the colour actually set, which may be
  41. different than the one you wanted, for instance, if you supply an out of range
  42. number.
  43.  
  44.     Another fairly simple VDI function is vst_effects(), which is used to set
  45. the text style, such as bold, italic, underlined and so on. Like the previous
  46. function, only two (short) integer parameters are required, the graphic
  47. woorkstation handle and the bit-mapped effects byte:
  48.  
  49. short handle,effects;
  50. vst_effects(handle, effects);
  51.  
  52.     Each bit in the effects byte turns on a particular text style and you can
  53. set more than one bit to combine the effects:
  54.  
  55. BIT      EFFECT
  56. --------------------
  57.  0       Thickened
  58.  1       Shaded
  59.  2       Skewed
  60.  3       Underlined
  61.  4       Outlined
  62.  5       Shadowed
  63.  
  64.     Text can be printed up the screen, down it, horizontally forwards or
  65. backwards simply by setting the angle of rotation with vst_rotation(). Although
  66. this function lets you set the angle at which text will be printed to a tenth
  67. of a degree, normally only four orientations are possible - 0, 90, 180 and 270
  68. degrees.
  69.  
  70.     Since vst_rotation() only accepts integer parameters, the angle must be in
  71. tenths of a degree, that is 0, 900, 1800, 2700. The value returned by this call
  72. is the angle actually set.
  73.  
  74.     So, to print some italic text vertically down the screen (you'll have to
  75. turn your monitor on its side to read it), the following three lines of code
  76. would be used:
  77.  
  78. vst_rotation(handle,2700);
  79. vst_effects(handle,4);
  80. v_gtext(handle,50,50,"This is a test...");
  81.  
  82.     If you try printing some text on top of a coloured background you'll see
  83. that the characters are printed within a white box as the background colour is
  84. always set to zero, which is normally white.
  85.  
  86.     To prevent this background from being shown, the VDI function vsw_mode()
  87. enables you to set the text writing mode. It can be normal, transparent or
  88. exclusively ORed. The function call looks like this:
  89.  
  90. short handle,mode;
  91. vsw_mode(handle,mode);
  92.  
  93.     The value of mode ranges from one to four:
  94.  
  95. VALUE    EFFECT
  96. --------------------------------------------------------------------
  97.   1      Replace - background and foreground pixels overwrite screen
  98.   2      Transparent - only foreground pixels written to screen
  99.   3      XOR - all pixels are XORed with the screen
  100.   4      Reverse transparent - only background pixels written
  101.  
  102.     We still aren't finished with the v_gtext() function as there are yet more
  103. related functions that affect its output. We'll now move on to two very similar
  104. functions which set the size of the text displayed on the screen - vst_height()
  105. and vst_points().
  106.  
  107.     The size of text is set by specifying either the height in pixels or
  108. points, where a point is 1/72 of an inch. The width is proportional to the
  109. height so altering the latter will affect the former. The two calls look like
  110. this:
  111.  
  112. short handle, h, p, wchar, hchar, wbox, hbox;
  113. vst_height(handle, h, &wchar, &hchar, &wbox, &hbox);
  114. vst_point(handle, p, &wchar, &hchar, &wbox, &hbox);
  115.  
  116.     If you use the first function then pass the height in pixels in 'h', or use
  117. 'p' in the second. The four extra parameters are used by the VDI to return the
  118. width and height of the characters that will be used and the width and height
  119. of the box in which they are printed.
  120.  
  121.     If a particular point or pixel size that you have asked for isn't available
  122. then the figure may be rounded down to the nearest one. The actual values set
  123. will be returned in wchar, hchar, wbox and hbox.
  124.  
  125.     Nearly finished this marathon run through the text manipulation commands
  126. and just two more functions to look at - v_justified() and vst_alignment().
  127. Word processors like 1st Word Plus and ST Writer are able to print text so that
  128. both the right-hand and left-hand margins are straight.
  129.  
  130.     Many magazines and newspapers have a straight right edge, but some have
  131. ragged ones. If it's straight then the text has been justified - extra tiny
  132. spaces have been added between the words, the letters or both in order to nmake
  133. all the lines of text exactly the same length.
  134.  
  135.     This effect is easily achieved by using v_justified() instead of v_gtext().
  136. Extra parameters are tagged on to the end of the ones used in v_gtext() to tell
  137. the VDI how long to make the line of text and whether it should add letter or
  138. word spacing or both. Here's the VDI function call:
  139.  
  140. short handle, x, y, len, word, char;
  141. char *string;
  142. v_justified(handle, x, y, string, len, word, char);
  143.  
  144.  
  145.     The first four parameters are the same as for v_gtext() so there shouldn't
  146. be any problems setting these. The 'len' parameter tells the VDI how many
  147. pixels long to make the text, while the 'word' and 'char' flags take values of
  148. one or zero to indicate whether word or character spacing (or both) should be
  149. used to pad out the text if necessary.
  150.  
  151.     At last we come to the end of the VDI text functions with the
  152. vst_alignment() call. With this you can left or right justify text or centre
  153. it, and use various points in the character cell as the coordinates to print
  154. at. The function call is:
  155.  
  156. short handle, h, v, hset, vset);
  157. vst_alignment(handle, h, v, &hset, &vset);
  158.  
  159.     The 'h' parameter is used to set the horizontal alignment and can be:
  160.  
  161. 0   Left justified
  162. 1   Centre justified
  163. 2   Right justified
  164.  
  165.     The 'v' parameter is the vertical alignment and the following values can be
  166. used:
  167.  
  168. 0   Base line (default) - bottom of characters without descenders
  169. 1   Half line - top of lowercase characters
  170. 2   Ascent line - top of upper case characters
  171. 3   Bottom - bottom of character cell
  172. 4   Descent - bottom of characters with descenders
  173. 5   Top - top of the character cell
  174.  
  175.     That just about wraps up this month's GEM programming article. To see some
  176. of these VDI functions used in practice take a look at the two Test Card
  177. programs - MONO_CRD.PRG and COLR_CRD.PRG. This displays two lines of text in
  178. two different sizes and colours. I'll also be documenting some of the other VDI
  179. calls next month so you can see a sneak preview of the shape of things to
  180. come.
  181.  
  182.  
  183. HARDWARE: ALL STs, MONO AND COLOUR
  184.  
  185.  
  186.