README.HARDCOPY
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Hardcopy Interface for Xgraph
  3.  *
  4.  * Major differences from first version:
  5.  *   A flags argument has been added to xg_init().  This new argument
  6.  *   is used to specify a new binary option: D_DOCU.  See below
  7.  *   for details.
  8.  *
  9.  *   Four new parameters are passed to the device initialization routine:
  10.  *   title_family, title_size, axis_family, and axis_size.  See the 
  11.  *   description of xg_init() for details.
  12.  *   
  13.  *   Clipping is done automatically by xgraph.  The xg_clip() routine
  14.  *   is obsolete.
  15.  *
  16.  *   The xg_line() routine has become the xg_seg() routine.  It now
  17.  *   draws segments rather than a series of lines.  
  18.  * 
  19.  *   A new field (max_segs) in the device structure now specifies 
  20.  *   the maximum number of segments the device can handle in a group.
  21.  */
  22. /*
  23.  * Adding an output device to xgraph
  24.  *
  25.  * Step 1
  26.  *   Write versions of the following routines for your device:
  27.  *   xg_init(), xg_text(), xg_seg(), xg_dot(), and xg_end().
  28.  *   The interface and function of these routines are described
  29.  *   in detail below.  These routines should be named according
  30.  *   to your device.  For example,  the initialization routine
  31.  *   for the Postscript output device is psInit().  Also,  name
  32.  *   your source file after your device (e.g. the postscript
  33.  *   routines are in the file ps.c).  Instructions continue
  34.  *   after the description of the interface routines.
  35.  *
  36.  *   The definitions below are quoted here as a convenience.  In
  37.  *   your output module, you can include "xgout.h" to obtain these
  38.  *   definitions.
  39.  */
  40. #define D_COLOR 0x01
  41. #define ERRBUFSIZE 2048
  42. #define D_DOCU 0x01
  43. typedef struct xg_out {
  44.     int dev_flags; /* Device characteristic flags           */
  45.     int area_w, area_h; /* Width and height in pixels            */
  46.     int bdr_pad; /* Padding from border                   */
  47.     int axis_pad; /* Extra space around axis labels        */
  48.     int tick_len; /* Length of a tick mark                 */
  49.     int legend_pad; /* Top of legend text to legend line     */
  50.     int axis_width; /* Width of big character of axis font   */
  51.     int axis_height; /* Height of big character of axis font  */
  52.     int title_width; /* Width of big character of title font  */
  53.     int title_height; /* Height of big character of title font */
  54.     int max_segs; /* Maximum number of segments in group   */
  55.     void (*xg_text)(); /* Draws text at a location              */
  56.     void (*xg_seg)(); /* Draws a series of segments            */
  57.     void (*xg_dot)(); /* Draws a dot or marker at a location   */
  58.     void (*xg_end)(); /* Stops the drawing sequence            */
  59.     char *user_state; /* User supplied state information       */
  60. } xgOut;
  61. int xg_init(strm, width, height, title_family, title_size,
  62.             axis_family, axis_size, out_info, errmsg)
  63. FILE *strm; /* Output stream              */
  64. int width, height; /* Size of space (microns)    */
  65. char *title_family; /* Name of title font family  */
  66. double title_size; /* Title font height (points) */
  67. char *axis_family; /* Name of axis font family   */
  68. double axis_size; /* Axis font height (points)  */
  69. int flags; /* Flags (see below)          */
  70. xgOut *out_info; /* Device info (RETURN)       */
  71. char errmsg[ERRBUFSIZE]; /* Error message area         */
  72. /*
  73.  * This routine is called by xgraph just before drawing is to
  74.  * begin.  The desired size of the plot is given by `width'
  75.  * and `height'.  The parameters `title_family', `title_size',
  76.  * `axis_family', and `axis_size' specify the names of the
  77.  * title and axis fonts and their vertical sizes (in points).
  78.  * These parameters can be ignored if your device does not
  79.  * support multiple fonts.  The `flags' argument specifies
  80.  * certain binary flags to the output routines.  These
  81.  * flags are:
  82.  *  D_DOCU:
  83.  *      If this flag is set,  it indicates the user has specified that
  84.  * the output will be included in some larger document.  Devices
  85.  * may choose to use this information to produce output that
  86.  * can be integrated into documents with less effort.  For example,
  87.  * the Postscript output routines produce bounding box information
  88.  * when this flag is set.
  89.  * The routine should fill in all of the fields of `out_info' with 
  90.  * appropriate values.  The values are described below:
  91.  *  area_w, area_h:  
  92.  *  Size of the drawing space in device coordinates.
  93.  * This should take in account the requested area
  94.  * given by `width', and `height'.
  95.  *  bdr_pad:  
  96.  *  Xgraph will leave this number of device coordinates around
  97.  * all of the outer edges of the graph.
  98.  *  axis_pad: 
  99.  * Additional space around axis labels (in devcoords)
  100.  * so that the labels do not appear crowded.
  101.  *  legend_pad:
  102.  * Space (in devcoords) from the top of legend text to
  103.  * the representative line drawn above the legend text.
  104.  *  tick_len:    
  105.  * Size of a tick mark placed on axis (in devcoords)
  106.  *  axis_width:  
  107.  * An estimate of the width of a large character in
  108.  *      the axis font (in devcoords).  This can be an overestimate.  An
  109.  *      underestimate may produce bad results.
  110.  *  axis_height: 
  111.  * An estimate of the height of a large character in
  112.  *      the axis labeling font (in devcoords).
  113.  *  title_width, title_height:  
  114.  * Same as above except for the title font.
  115.  *  max_segs:
  116.  * Due to buffering constraints,  some devices may not be able to
  117.  * handle massive segment lists.  This parameter tells xgraph not
  118.  * to send more than `max_segs' segments in one request.
  119.  * Output to the device should be written to the stream `strm'.
  120.  * The functions are described individually below.  After filling
  121.  * in the parameters and setting the function pointers,  the routine
  122.  * should initialize its drawing state and store any extra needed
  123.  * information in `user_state'.  This value will be passed to all
  124.  * other routines during the drawing sequence.  If the device
  125.  * cannot initialize,  it should return a zero status and fill
  126.  * `errmsg' with an informative error message.
  127.  */
  128. /* Text justifications */
  129. #define T_CENTER 0
  130. #define T_LEFT 1
  131. #define T_UPPERLEFT 2
  132. #define T_TOP 3
  133. #define T_UPPERRIGHT 4
  134. #define T_RIGHT 5
  135. #define T_LOWERRIGHT 6
  136. #define T_BOTTOM 7
  137. #define T_LOWERLEFT 8
  138. /* Text styles */
  139. #define T_AXIS 0
  140. #define T_TITLE 1
  141. void xg_text(user_state, x, y, text, just, style)
  142. char *user_state; /* Value set in xg_init   */
  143. int x, y; /* Text position (pixels) */
  144. char *text; /* Null terminated text   */
  145. int just; /* Justification (above)  */
  146. int style; /* Text style (above)     */
  147. /*
  148.  * This routine should draw text at the indicated position using
  149.  * the indicated justification and style.  The justification refers
  150.  * to the location of the point in reference to the text.  For example,
  151.  * if just is T_LOWERLEFT,  (x,y) should be located at the lower left
  152.  * edge of the text string.
  153.  */
  154. /* Line Styles */
  155. #define L_AXIS 0
  156. #define L_ZERO 1
  157. #define L_VAR 2
  158. void xg_seg(user_state, ns, seglist, width, style, lappr, color)
  159. char *user_state; /* Value set in xg_init */
  160. int ns; /* Number of segments   */
  161. XSegment *seglist; /* X array of segments  */
  162. int width; /* Width of lines       */
  163. int style; /* See above            */
  164. int lappr; /* Line appearence      */
  165. int color; /* Line color (if any)  */
  166. /*
  167.  * This routine draws a number of line segments at the points
  168.  * given in `seglist'.  Note that contiguous segments need not share
  169.  * endpoints but often do.  All segments should be `width' devcoords wide
  170.  * and drawn in style `style'.  The `width' may be zero meaning that
  171.  * the line should be drawn as thin as the device allows.  If `style' is 
  172.  * L_VAR, the parameters `color' and `lappr' should be used to draw the 
  173.  * line.  Both parameters vary from 0 to 7.  If the device is capable of
  174.  * color,  `color' varies faster than `style'.  If the device 
  175.  * has no color,  `style' will vary faster than `color' and
  176.  * `color' can be safely ignored.  However,  if the
  177.  * the device has more than 8 line appearences,  the two can
  178.  * be combined to specify 64 line style variations.
  179.  * Xgraph promises not to send more than the `max_segs' in the
  180.  * xgOut structure passed back from xg_init().
  181.  */
  182. /* Marker styles */
  183. #define P_PIXEL 0
  184. #define P_DOT 1
  185. #define P_MARK 2
  186. void xg_dot(user_state, x, y, style, type, color)
  187. char *user_state; /* Value set in xg_init    */
  188. int x, y; /* Location in pixel units */
  189. int style; /* Dot style               */
  190. int type; /* Type of marker          */
  191. int color; /* Marker color (if any)   */
  192. /*
  193.  * This routine should draw a marker at location `x,y'.  If the
  194.  * style is P_PIXEL,  the dot should be a single pixel.  If
  195.  * the style is P_DOT,  the dot should be a reasonably large
  196.  * dot.  If the style is P_MARK,  it should be a distinguished
  197.  * mark which is specified by `type' (0-7).  If the output
  198.  * device is capable of color,  the marker should be drawn in
  199.  * `color' (0-7) which corresponds with the color for xg_line.
  200.  */
  201. void xg_end(user_state)
  202. char *user_state;
  203. /*
  204.  * This routine is called after a drawing sequence is complete.
  205.  * It can be used to clean up the user state and set the device
  206.  * state appropriately.  This routine is optional in the structure.
  207.  */
  208. /*
  209.  * Adding an output device to xgraph
  210.  *
  211.  * Step 2
  212.  *   Edit the file hard_devices.c.  Declare your initialization
  213.  *   function and add your device to the list of devices,
  214.  *   hard_devices[].  The structure hard_dev is described below
  215.  *   and is defined in hard_devices.h:
  216.  */
  217. #define MFNAME 25
  218. typedef enum hard_dev_docu_defn { NONE, NO, YES } hard_dev_docu;
  219. typedef struct hard_dev {
  220.     char *dev_name; /* Device name                */
  221.     int (*dev_init)(); /* Initialization function    */
  222.     char *dev_spec; /* Default pipe program       */
  223.     char dev_file[MFNAME]; /* Default file name          */
  224.     char dev_printer[MFNAME]; /* Default printer name       */
  225.     double dev_max_dim; /* Default maximum dimension (cm)    */
  226.     char dev_title_font[MFNAME];/* Default name of title font        */
  227.     double dev_title_size; /* Default size of title font (pnts) */
  228.     char dev_axis_font[MFNAME]; /* Default name of axis font         */
  229.     double dev_axis_size; /* Default size of axis font (pnts)  */
  230.     hard_dev_docu dev_docu; /* Document predicate                */
  231. };
  232. /*
  233.  * dev_spec:
  234.  *    The dev_spec field should be a command that directly outputs to
  235.  *    your device.  The command should contain one %s directive that
  236.  *    will be filled in with the name of the device from the hardcopy
  237.  *    dialog.
  238.  * dev_file:
  239.  *    The default file to write output to if the user selects `To File'.
  240.  * dev_printer:
  241.  *    The default printer to write output to if the user selects
  242.  *    `To Device'.
  243.  * dev_max_dim:
  244.  *    The default maximum dimension for the device in centimeters.
  245.  * dev_title_font, dev_title_size:
  246.  *    The default title font and size.  Sizes are specified in
  247.  *    points (1/72 inch).
  248.  * dev_axis_font, dev_axis_size:
  249.  *    The default axis font and size.
  250.  * dev_docu
  251.  *    Some devices may require extra preparation when including xgraph 
  252.  *    output in a document.  This parameter indicates the default
  253.  *    value of the Document predicate in the hardcopy dialog.  If
  254.  *    the value is NONE, the device doesn't need any special preparation
  255.  *    for producing output for inclusion in documents.
  256.  */
  257. /*
  258.  * Adding an output device to xgraph
  259.  *
  260.  * Step 3
  261.  *   Edit the file Makefile.  Add your source file to the SRC variable
  262.  *   and the corresponding object file to the OBJ variable.  Finally,
  263.  *   remake xgraph.  Your device should now be available in the
  264.  *   hardcopy dialog.
  265.  */