home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / mag_discs / volume_8 / issue_06 / risc_os / DrawModule < prev    next >
Text File  |  1988-10-04  |  27KB  |  562 lines

  1. Draw module specification
  2. =========================
  3.  
  4. The current Draw module does not implement the floating point parts of this
  5. specification. Upgrading it to do so is a possible future development, but
  6. not a likely one.
  7.  
  8.  
  9. Path format
  10. ===========
  11.  
  12. A path is a sequence of one or more of the following path elements, each of
  13. which is a sequence of words:
  14.  
  15.   0 n                  = end of path, with n bytes remaining in buffer (n is
  16.                            only important for output buffers, and will not be
  17.                            read for input paths).
  18.   1 ptr                = pointer to continuation of path.
  19.   2 x y                = move to (x,y), starting new subpath. This subpath
  20.                            will affect winding numbers and so is filled
  21.                            normally.
  22.   3 x y                = move to (x,y), starting new subpath. This subpath
  23.                            does not affect winding numbers when filling (used
  24.                            internally for thin-stroking paths). Note that any
  25.                            subpath started by this element will always be
  26.                            considered "closed" and so will never be closed by
  27.                            the "close open subpaths" operation.
  28.   4                    = close current subpath with a gap (c.f. element type
  29.                            7).
  30.   5                    = close current subpath with a line (c.f. element type
  31.                            8).
  32.   6 x1 y1 x2 y2 x3 y3  = Bezier curve to (x3,y3), with control points at
  33.                            (x1,y1) and (x2,y2);
  34.   7 x y                = gap to (x,y), not starting new subpath - used
  35.                            internally for the gaps in non-thickened dashed
  36.                            lines.
  37.   8 x y                = line to (x,y).
  38.  
  39. Only the bottom byte of the element type (i.e. the first word in each of the
  40. sequences above) is significant: the remaining three bytes are free for use
  41. in any way a client of the Draw module sees fit. (On output to the input
  42. path, the Draw module will leave these three bytes unchanged; on output to a
  43. standard output path, the Draw module will store zeroes in these three
  44. bytes.)
  45.  
  46. The element types noted as being used internally above can quite legitimately
  47. be used externally - the notes are simply to explain why these types exist at
  48. all.
  49.  
  50. Note that there are order constraints on these elements - in particular,
  51. element types 4 to 8 may not be used when there is no current subpath,
  52. element types 2 and 3 start a new current subpath (ending any previous
  53. subpath), and element types 4 and 5 end the current subpath.
  54.  
  55. Two lines, gaps or Bezier curves are considered to be adjacent if they both
  56. appear in the same subpath and one is defined immediately after the other, or
  57. if one of them is the first line, gap or Bezier curve of a subpath and the
  58. other closes that subpath (i.e. it is a path element type 4 or 5 and ends the
  59. subpath concerned). Adjacency of lines is used to decide whether to use a
  60. join to connect them when thickening a path.
  61.  
  62. A subpath is called closed if it ends with a path element of type 4 or 5 (so
  63. that its last line, gap or Bezier curve is adjacent to its first one);
  64. otherwise, it is called open. Note that a subpath which happens to end at the
  65. same point that it started is not closed unless it actually ends with a type
  66. 4 or 5 path element: this can make a difference to whether its first and last
  67. line segments are connected with a join or with two caps when the path is
  68. thickened.
  69.  
  70.  
  71. The Draw module SWIs
  72. ====================
  73.  
  74. All calls come in two versions, one a fixed point version and the other
  75. floating point. The former is faster but allows a smaller range of user
  76. co-ordinate systems and is sometimes less accurate.
  77.  
  78. For the fixed point versions, all numbers that relate to distances in the
  79. co-ordinate space (e.g. co-ordinates, line widths, etc.) are expressed in
  80. user-defined units before transformation. When the transformed path is output
  81. to the screen (in particular, when Draw_Fill or Draw_Stroke is called), the
  82. units after transformation are 1/256 of an OS unit (i.e. approx. 1/(256*180)
  83. inch = 1/46080 inch = 1/640 point). The default flatness is 512 (2 OS units),
  84. which produces reasonable results when output is to the screen and the
  85. identity matrix is used. All dimensionless quantities have 16 binary places
  86. (i.e. &10000 represents the constant 1.0).
  87.  
  88. Note that in the standard matrix:
  89.  
  90.       ( a  b  0 )
  91.       ( c  d  0 )
  92.       ( e  f  1 ),
  93.  
  94. a, b, c and d are dimensionless quantities (so have 16 binary places), while
  95. e and f represent a translation in the output co-ordinate space and so are
  96. expressed in output units (i.e. units after transformation). This varying
  97. interpretation of matrix elements is unpleasant, but necessary to retain
  98. reasonable behaviour (e.g. we want the inverses of all sensible matrices to
  99. be representable with reasonable accuracy).
  100.  
  101. The floating point versions use IEEE single precision floating point numbers
  102. in all circumstances. They are distinguished by the suffix FP on the name of
  103. the call. The default flatness is 2.0, for the same reason as above.
  104.  
  105. Note: unless otherwise specified below, all co-ordinates are user
  106. co-ordinates. PostScript concepts that are not redefined here should be
  107. interpreted as PostScript interprets them.
  108.  
  109. A further note: all calls use the colour (both pixel pattern and operation)
  110. set up for the OS VDU routines.
  111.  
  112. This means in particular that they can do things that PostScript cannot do -
  113. e.g. fill using operations such as AND, OR, EOR that pay attention to the
  114. current contents of the screen. Given this fact, I see no reason to restrict
  115. the module to PostScript's capabilities in other areas. This has resulted in
  116. the following additional non-PostScript abilities for the Draw module:
  117.  
  118.   (a) Choice of fill style - e.g. fill including/excluding boundary, fill to
  119.       halfway through boundary, fill exterior, etc.
  120.   (b) "Positive winding number" and "negative winding number" rules as well
  121.       as PostScript's "non-zero winding number" and "even-odd winding number"
  122.       rules.
  123.   (c) Line cap enhancements - particularly differing "leading" and "trailing"
  124.       line caps and triangular line caps (together, these allow arrowed lines
  125.       and similar effects).
  126.  
  127. Any program which wants to remain PostScript-compatible (which includes e.g.
  128. working with printer drivers) will of course have to avoid using these
  129. enhancements.
  130.  
  131.  
  132. Draw_Fill, Draw_FillFP
  133. ======================
  134.  
  135. These imitate the PostScript "fill" operator - i.e. they close open subpaths,
  136. flatten the path, transform it to standard co-ordinates, fix it if the call
  137. is Draw_FillFP and fill the result.
  138.  
  139. "Closing open subpaths" means adding a path element of type 5 ("close with
  140. line") to the end of any open subpaths in the path.
  141.  
  142. "Flattening" a path means bisecting any Bezier curves it contains
  143. recursively, at least until each of the resulting Bezier curves lies
  144. completely within a specified distance of the line segment joining its
  145. endpoints, and then replacing each such of the resulting Bezier curves by the
  146. line segment joining its endpoints. The specified distance is called the
  147. "flatness".
  148.  
  149. Entry:  R0 points to the path.
  150.  
  151.         R1 contains the fill style:
  152.  
  153.              Bits 0,1:  0 = non-zero winding number rule;
  154.                         1 = negative winding number rule;
  155.                         2 = even-odd winding number rule;
  156.                         3 = positive winding number rule;
  157.              Bit 2:     Set if non-boundary exterior pixels are to be
  158.                           plotted, clear if they are not;
  159.              Bit 3:     Set if boundary exterior pixels are to be plotted,
  160.                           clear if they are not;
  161.              Bit 4:     Set if boundary interior pixels are to be plotted,
  162.                           clear if they are not.
  163.              Bit 5:     Set if non-boundary interior pixels are to be
  164.                           plotted, clear if they are not;
  165.              Bits 6-31 are reserved and should be zero.
  166.  
  167.            R1=0 is a special case. According to the above, it means "don't
  168.            fill anything, non-zero rule" - a pretty useless operation. For
  169.            convenience, it specifies a sensible default fill style, namely
  170.            &30 (i.e. "fill to halfway through boundary, non-zero rule").
  171.  
  172.         R2 points to the matrix, held as 6 words in memory (in the order
  173.            a,b,c,d,e,f for the matrix above); R2=0 means the identity
  174.            matrix. Note that the code assumes that one user-defined unit is
  175.            a small fraction of a pixel, and matrices that multiply
  176.            distances by large factors may lead to inaccurate results.
  177.  
  178.         R3 contains the flatness, in user co-ordinates; R3=0 means default
  179.            flatness.
  180.  
  181. Exit:   R0 is corrupt (if V clear),
  182.            or points to error block (if V set).
  183.  
  184.         R1-R11 preserved.
  185.  
  186. Some of the terms used above need defining. Briefly, pixels whose centres lie
  187. inside the path according to the winding number rule chosen are interior
  188. pixels, and pixels that would be plotted if the (flattened) path were plotted
  189. with thin line segments (i.e. 1 pixel wide line segments) are boundary
  190. pixels. If you are happy with these definitions, skip down to the section on
  191. Draw_Stroke. If you want more precise details, read on...
  192.  
  193. To determine whether a pixel is an "interior" pixel, calculate the winding
  194. number W of the path around the central point of the pixel. The pixel is then
  195. an interior pixel if:
  196.  
  197.   * the non-zero winding number rule is selected and W <> 0.
  198.   * the negative winding number rule is selected and W < 0.
  199.   * the even-odd winding number rule is selected and W is odd.
  200.   * the positive winding number rule is selected and W > 0.
  201.  
  202. Otherwise, the pixel is an exterior pixel.
  203.  
  204. Lines (including flattened Bezier curves) and gaps both contribute to the
  205. winding number calculation, provided the subpath that contains them started
  206. with an "move to" path element of type 2. Those in subpaths which started
  207. with a "move to" path element of type 3 are ignored.
  208.  
  209. To determine whether a pixel is a "boundary" pixel, consider the "diamond"
  210. that can be inscribed in the pixel by joining the centres of its sides. If a
  211. line (or part of a flattened Bezier curve, but not a gap) in the path passes
  212. through this "diamond", the pixel is a boundary pixel. Otherwise, it is a
  213. non-boundary pixel.
  214.  
  215. For the purposes of all the calculations above, regard the path as consisting
  216. of mathematical (i.e. infinitely thin) line segments. If e.g. a pixel centre
  217. or a vertex of a "diamond" lies precisely on the path, resolve the problem by
  218. regarding the path as lying very slightly to the right of its real position.
  219. If this doesn't help (because the line segment involved is exactly
  220. horizontal), regard it as lying very alightly above its real position.
  221.         
  222.  
  223. Draw_Stroke, Draw_StrokeFP
  224. ==========================
  225.  
  226. These emulate the PostScript "stroke" operator - i.e. they:
  227.  
  228.   (a) flatten the path;
  229.   (b) apply a dash pattern to the path;
  230.   (c) thicken the path, using the current line joins and caps;
  231.   (d) re-flatten the path if the specified thickness is non-zero;
  232.   (e) transform the path to standard co-ordinates;
  233.   (f) fix the path if the call is Draw_StrokeFP;
  234.   (g) fill the resulting path.
  235.  
  236. "Applying a dash pattern to a path" means replacing the line segments it
  237. containns by an appropriate sequence of lines and dashes, determined from the
  238. dash pattern and the distance along the path from the start of the current
  239. line segment to the start of the line segment. It is not possible to apply a
  240. dash pattern to a path containing a Bezier curve.
  241.  
  242. "Thickening" a path means:
  243.  
  244.   (a) If the thickness is zero, converting all "move to" path elements of
  245.       type 2 to "move to" path elements of type 3, and otherwise leaving the
  246.       path unchanged. Line caps and joins are ignored.
  247.   (b) If the thickness is non-zero, expanding each line segment in the path
  248.       to a subpath defining a rectangle centred on the original line segment
  249.       and of width equal to the specified thickness and expanding endpoints
  250.       of line segments to subpaths defining appropriately sized and shaped
  251.       caps and joins. Joins are used at common endpoints of two adjacent line
  252.       segments. Caps are used at other endpoints, with the leading or
  253.       trailing cap style being used depending on whether the endpoint
  254.       concerned is a leading or trailing endpoint as the path is traversed.
  255.  
  256. It is not possible to thicken a path with non-zero thickness if it contains a
  257. Bezier curve.
  258.  
  259. Except in the special case of the line width being 0 (which means that as
  260. thin a path as possible is plotted, with line caps and joins being ignored),
  261. thickening the path is likely to result in a path that winds multiply around
  262. some pixels and/or in multiple plotting of some pixels. It is therefore
  263. inadvisable to use winding number rules other than the non-zero one, or
  264. non-idempotent colour operations (e.g. EOR). It is also inadvisable to try
  265. plotting the non-boundary exterior pixels. The on-screen results of doing any
  266. of these will probably not be what you expect!
  267.  
  268. Entry:  R0 points to the path.
  269.  
  270.         R1 contains the fill style, as for Draw_Fill, except that R1=0 has a
  271.            slightly different interpretation. If the line width is non-zero,
  272.            it means &30 as above. If the line width is zero, it means &18
  273.            (i.e. "fill boundary"), as the flattened and thickened path will
  274.            in fact have no interior in this case! For zero width lines, the
  275.            default fill style is usually the only sensible one.
  276.              In addition, the top bit of R1 can be set to require the Draw
  277.            module to plot the stroke all at once (i.e. using the "plot
  278.            normally" option of Draw_ProcessPath rather than the "plot subpath
  279.            by subpath" option). The main effects of this change are that the
  280.            code will never double-plot a pixel, but also that it uses more
  281.            workspace - possibly quite a lot more!
  282.  
  283.         R2 points to the matrix or contains 0, as for Draw_Fill.
  284.  
  285.         R3 contains the flatness or contains 0, as for Draw_Fill.
  286.  
  287.         R4 contains the line thickness, or 0 for a thin stroke (one pixel
  288.            wide, with line caps and joins being ignored).
  289.  
  290.         R5 points to a line cap and join specification, which is a word-
  291.            aligned four word area containing:
  292.  
  293.              Offset 0:  Byte 0 holds join style:
  294.                           0 = mitered joins;
  295.                           1 = round joins;
  296.                           2 = bevelled joins.
  297.                         Byte 1 holds leading cap style:
  298.                           0 = butt caps;
  299.                           1 = round caps;
  300.                           2 = projecting square caps;
  301.                           3 = triangular caps.
  302.                         Byte 2 holds trailing cap style, with the same
  303.                           allowed values as for leading caps.
  304.                         Byte 3 is reserved and should be zero.
  305.              Offset 4:  This holds a parameter associated with joins. For
  306.                         mitered joins, this is the miter limit. It is not
  307.                         used for the other join types. Note that the miter
  308.                         limit is a dimensionless quantity and so (for
  309.                         Draw_Stroke) is a fixed point number with 16 binary
  310.                         places.
  311.              Offset 8:  This holds a parameter associated with leading caps.
  312.                         For triangular caps, this contains two 16 bit
  313.                         unsigned numbers, each of which should be regarded as
  314.                         having 8 binary places. The most significant part of
  315.                         the number specifies how many line widths the cap
  316.                         goes beyond the end of the line, and the least
  317.                         significant part how many line widths it goes to the
  318.                         side of the centre of the line. Thus e.g. &1000100
  319.                         means a cap going 1 line width beyond the end of the
  320.                         line and 1 line width to each side of its centre -
  321.                         i.e. the cap width is twice the line width, and its
  322.                         shape is a 45/90/45 degree triangle. This parameter
  323.                         is not used for the other cap styles.
  324.              Offset 12: This holds a similar parameter associated with
  325.                         trailing caps.
  326.  
  327.            The module will make no attempt to read the last three words if
  328.            the corresponding cap or join style does not use them, so it is
  329.            legitimate to use a smaller area than four words if these
  330.            parameters are not required.
  331.  
  332.         R6 points to a dash pattern, or contains 0 if an undashed line is
  333.            required. A dash pattern must be word-aligned and has the
  334.            following format:
  335.  
  336.              Offset 0:           Distance into the dash pattern to start.
  337.              Offset 4:           Number N of elements in the dash pattern.
  338.              Offsets 8 to 4N+4:  Elements of the dash pattern, each of which
  339.                                  is a distance.
  340.  
  341.            The dash pattern starts with a dash of length equal to the first
  342.            element above, then a gap of length equal to the second element
  343.            above, etc. When the last element of the dash pattern has been
  344.            used, the module starts again from the beginning. Note that if the
  345.            number of elements of the dash pattern is odd, the distances will
  346.            be interpreted differently the second time through, with the first
  347.            element being a gap, the second a dash, etc.
  348.  
  349. Exit:   R0 is corrupt (if V clear),
  350.            or points to error block (if V set).
  351.  
  352.         R1-R11 preserved.
  353.  
  354.  
  355. Draw_StrokePath, Draw_StrokePathFP
  356. ==================================
  357.  
  358. Entry:  R0, R2-R6 set as for Draw_Stroke.
  359.  
  360.         R1 points to a word-aligned output buffer (which holds words 0, N,
  361.         then N free bytes), or contains 0 to ask for the required output
  362.         buffer size (i.e. N+8).
  363.  
  364. Exit:   If V set, R0 points to an error block.
  365.  
  366.         If V clear and R1 was non-zero on entry, the output path has been
  367.         inserted into the buffer, ending with an end of path indicator (i.e.
  368.         words 0, N, where N is the number of free bytes following in the
  369.         buffer). R0 points to this end of path indicator (and so is a
  370.         suitable output buffer value for a subsequent path generating call
  371.         that is to append to the path).
  372.  
  373.         If V clear and R1 was zero, R0 holds the required length.
  374.  
  375.         R1-R11 preserved.
  376.  
  377. This call puts the given path through all the stages done by Draw_Stroke or
  378. Draw_StrokeFP above, except the final fill. It then either saves the path
  379. that would be filled in a specified buffer or reports on how big a buffer is
  380. required, as requested.
  381.  
  382.  
  383. Draw_FlattenPath, Draw_FlattenPathFP
  384. ====================================
  385.  
  386. Entry:  R0 points to the input path.
  387.  
  388.         R1 points to a word-aligned output buffer (which holds words 0, N,
  389.            then N free bytes), or contains 0 to ask for the required output
  390.            buffer size (i.e. N+8).
  391.  
  392.         R2 contains the flatness, or 0 if the default flatness is to be used.
  393.  
  394. Exit:   If V set, R0 points to an error block.
  395.  
  396.         If V clear and R1 was non-zero, the output path has been inserted
  397.         into the buffer, ending with an end of path indicator (i.e. words 0,
  398.         N, where N is the number of free bytes following in the buffer). R0
  399.         points to this end of path indicator.
  400.  
  401.         If V clear and R1 was zero, R0 holds the required length.
  402.  
  403.         R1-R11 preserved.
  404.  
  405. This call flattens the given path. It then either saves the resulting path in
  406. a specified buffer or reports on how big a buffer is required, as requested.
  407.  
  408.  
  409. Draw_TransformPath, Draw_TransformPathFP
  410. ========================================
  411.  
  412. Entry:  R0 points to the input path.
  413.  
  414.         R1 points to a word-aligned output buffer (which holds words 0, N,
  415.            then N free bytes), or contains 0 to transform the path in situ.
  416.  
  417.         R2 points to the matrix or contains 0, as for Draw_Fill.
  418.  
  419.         R3 is zero for fixed point output, &80000000 for floating point
  420.            output. All other values are reserved.
  421.  
  422. Exit:   If V set, R0 points to an error block.
  423.  
  424.         If V clear and R1 was 0, R0 is corrupt.
  425.  
  426.         If V clear and R1 pointed to an output buffer, the output path has
  427.         been inserted into the buffer, ending with an end of path indicator
  428.         (i.e. words 0, N, where N is the number of free bytes following in
  429.         the buffer). R0 points to this end of path indicator.
  430.  
  431.         R1-R11 preserved.
  432.  
  433. This call puts the path through a transformation matrix and possibly fixes or
  434. floats it. It then either outputs the resulting path to a specified output
  435. buffer or puts it into the memory originally occupied by the input path.
  436. (Note that this call will never change the length of the path or indeed of
  437. any of its components. This last option is therefore safe - something which
  438. was not true for the two preceding calls.)
  439.  
  440.  
  441. Draw_ProcessPath, Draw_ProcessPathFP
  442. ====================================
  443.  
  444. This allows a path to be put through a general set of the processes used when
  445. doing Stroke or Fill. One or more of the following can be requested, in the
  446. order given:
  447.  
  448.   (a) close open subpaths;
  449.   (b) flatten the path;
  450.   (c) apply a dash pattern to the path;
  451.   (d) thicken the path;
  452.   (e) re-flatten the path;
  453.   (f) transform the path by a matrix;
  454.   (g) fix a floating point path or float a fixed point one;
  455.   (h) output the resulting path by one of six techniques:
  456.       (i)   output to a specified output buffer;
  457.       (ii)  count how long an output buffer is required for the given path
  458.             and operations.
  459.       (iii) fill the path normally - not legitimate for a floating point
  460.             path;
  461.       (iv)  fill the path subpath by subpath (this option saves workspace and
  462.             can sometimes be used legitimately - for example, Draw_Stroke
  463.             will often use it). Also not legitimate for a floating point path.
  464.       (v)   output to the input buffer (i.e. modify the path in situ). Only
  465.             valid if the path's length cannot be changed by the call - i.e.
  466.             if steps (a) to (e) above are not requested.
  467.       (vi)  output the path's bounding box, in transformed co-ordinates. This
  468.             bounding box does not pay attention to pixel boundaries and is
  469.             "inclusive" on all sides.
  470.  
  471. All combinations of these are allowed, other than the exceptions noted above.
  472. However, some are likely to produce errors (e.g. thickening a non- flattened
  473. path) and others are likely to produce strange results (e.g. filling a path
  474. containing open subpaths).
  475.  
  476. All the calls above (Draw_Fill, etc.) translate into specific calls to
  477. Draw_ProcessPath or Draw_ProcessPathFP: they are provided to ensure that
  478. suitable names exist for common operations and to reduce the number of
  479. registers requiring setting up and/or preserving.
  480.  
  481. Entry:  R0 points to the input path.
  482.  
  483.         R1 contains a fill style in its bottom 6 bits, as for Draw_Fill,
  484.            except that R1=0 has no special meaning. Other bits have the
  485.            following meanings:
  486.  
  487.              Bits 6-26 are reserved and should be zero.
  488.              Bit 27:  set if open subpaths are to be closed (step (a) above).
  489.              Bit 28:  set if the path is to be flattened initially (step (b)
  490.                         above).
  491.              Bit 29:  set if the path is to be thickened (step (d) above).
  492.              Bit 30:  set if path is to be re-flattened (step (e) above).
  493.              Bit 31:  set if output path should be floating point, clear if
  494.                         it should be fixed point (step (g) above).
  495.  
  496.         R2 points to a matrix, or contains 0 if no transformation by a matrix
  497.            is to be done (step (f) above).
  498.  
  499.         R3 contains the flatness, or 0 for the default flatness (used in
  500.            steps (b) and (e) above).
  501.  
  502.         R4 contains the line thickness (used in step (d) above). R5 points to
  503.            a line join and cap specification (used in step (d) above).
  504.  
  505.         R6 points to a dash pattern, or contains 0 if the path is not to be
  506.            dashed (step (c) above).
  507.  
  508.         R7 points to a word-aligned output buffer (which holds words 0, N,
  509.            then N free bytes), or contains one of the following special
  510.            values:
  511.  
  512.              0: output to the input path. This will only be accepted if the
  513.                 requested operations on the path are ones that cannot change
  514.                 its length - i.e. transforming the path by a matrix and
  515.                 fixing or floating it.
  516.              1: fill the path normally.
  517.              2: fill the path subpath by subpath.
  518.              3: count the size of output buffer required.
  519.              &80000000+address: output the bounding box of the processed path
  520.                 to the (word-aligned) address and the three following words,
  521.                 in the order lowX, lowY, highX, highY. Note: if this option
  522.                 is applied to an non-flat path, a valid but non-minimal
  523.                 bounding box will be produced.
  524.  
  525. Exit:   R1-R11 preserved.
  526.  
  527.         If V set, R0 points to an error block.
  528.  
  529.         If V clear:
  530.           If R7 was 0, 1 or 2 on entry, R0 is corrupt.
  531.           If R7 was 3 on entry, R0 holds the size of output buffer required
  532.             (i.e. N+8 if the output buffer should be words 0, N, followed
  533.             by N free bytes).
  534.           If R7 pointed to an output buffer, the output path will have been
  535.             inserted into the buffer and R0 points to the new end of path
  536.             indicator.
  537.  
  538.  
  539. The Draw module vector DrawV
  540. ============================
  541.  
  542. This provides a means of indirecting the calls above.
  543.  
  544. Entry:  R0-R7 hold values appropriate for the call concerned.
  545.         R8 specifies which call is involved:
  546.               0: Draw_ProcessPath
  547.               1: Draw_ProcessPathFP
  548.               2: Draw_Fill
  549.               3: Draw_FillFP
  550.               4: Draw_Stroke
  551.               5: Draw_StrokeFP
  552.               6: Draw_StrokePath
  553.               7: Draw_StrokePathFP
  554.               8: Draw_FlattenPath
  555.               9: Draw_FlattenPathFP
  556.              10: Draw_TransformPath
  557.              11: Draw_TransformPathFP
  558.  
  559. Exit:   R0 holds a suitable return value.
  560.         V set or clear as appropriate.
  561.         R1-R11 corrupt.
  562.