[BACK]Return to README CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/README, Revision 1.1

1.1     ! maekawa     1: DOCUMENTATION FOR GNUPLOT TERMINAL DRIVER WRITERS
        !             2: By Russell Lang 1/90
        !             3:
        !             4: Updated for new file layout by drd 4/95
        !             5:
        !             6: Paragraphs about inclusion of TERM_HELP added by rcc 1/96
        !             7:
        !             8: No change to the interface between gnuplot and the terminal drivers,
        !             9: but we would like to make the terminal drivers standalone
        !            10:
        !            11: 1) in order move the support for the terminal drivers outside of the
        !            12:    support for the main program, thereby encouraging a library of
        !            13:    contributed drivers
        !            14: 2) To make it easy for users to add contributed drivers, by adding
        !            15:    a single #include line to term.h
        !            16: 3) To allow individual compilation on DOS, to save the overlay
        !            17:    manager from having to load _all_ drivers together.
        !            18:
        !            19: CORRECTION - scale() interface is no longer supported, since it
        !            20: is incompatible with multiplot.
        !            21:
        !            22: Whole of terminal driver should be contained in one <driver>.trm file,
        !            23: with a fairly strict layout as detailed below - this allows the
        !            24: gnuplot maintainers to change the way the terminal drivers are
        !            25: compiled without having to change the drivers themselves.
        !            26:
        !            27: term.h, and therefore each file.trm file, may be loaded more than once,
        !            28: with different sections selected by macros.
        !            29:
        !            30: Each driver provides all the functions it needs, and a table of
        !            31: function pointers and other data to interface to gnuplot.
        !            32: The table entry is currently defined as follows in plot.h:
        !            33:
        !            34: struct TERMENTRY {
        !            35:
        !            36: /* required entries */
        !            37:
        !            38:        char *name;
        !            39:        char *description;
        !            40:        unsigned int xmax,ymax,v_char,h_char,v_tic,h_tic;
        !            41:
        !            42:        void (*options) __PROTO((void));
        !            43:        void (*init) __PROTO((void));
        !            44:        void (*reset) __PROTO((void));
        !            45:        void (*text) __PROTO((void));
        !            46:        int (*scale) __PROTO((double, double));
        !            47:        void (*graphics) __PROTO((void));
        !            48:        void (*move) __PROTO((unsigned int, unsigned int));
        !            49:        void (*vector) __PROTO((unsigned int, unsigned int));
        !            50:        void (*linetype) __PROTO((int));
        !            51:        void (*put_text) __PROTO((unsigned int, unsigned int,char*));
        !            52:
        !            53: /* optional entries */
        !            54:
        !            55:        int (*text_angle) __PROTO((int));
        !            56:        int (*justify_text) __PROTO((enum JUSTIFY));
        !            57:        void (*point) __PROTO((unsigned int, unsigned int,int));
        !            58:        void (*arrow) __PROTO((unsigned int, unsigned int, unsigned int,
        !            59:                           unsigned int, int));
        !            60:    int (*set_font) __PROTO((char *font));  /* "font,size" */
        !            61:        void (*set_pointsize) __PROTO((double size)); /* notification of set pointsize */
        !            62:        int flags; /* various flags */
        !            63:    void (*suspend) __PROTO((void)); /* after one plot of multiplot */
        !            64:    void (*resume) __PROTO((void));  /* before subsequent plot of multiplot */
        !            65:    void (*boxfill) __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height)); /* clear part of multiplot */
        !            66:    void (*linewidth) __PROTO((double linewidth));
        !            67:    void (*pointsize) __PROTO((double pointsize));
        !            68: };
        !            69:
        !            70: One consequence of (1) is that we would like drivers to be backwards
        !            71: compatible - drivers in the correct form below should work in future
        !            72: versions of gnuplot without change. C compilers guarantee to fill
        !            73: unitialised members of a structure to zero, so gnuplot can detect old
        !            74: drivers, in which fields have not been initalised, and can point
        !            75: new interface entry pointers to dummy functions.
        !            76:
        !            77: We can add fields to the terminal structure, but only at the end of the list.
        !            78: If you design a terminal that cant work without a new interface being defined,
        !            79: and consequent changes to the main gnuplot source, please contact
        !            80: bug-gnuplot@dartmouth.edu simply to ensure that you have the most
        !            81: up to date defn of the terminal structure. Also, please ensure that
        !            82: the 'set term' command checks for 0 values in added fields when an
        !            83: old driver is selected, and a pointer to a suitable 'cant do' function
        !            84: is provided. It is therefore not required (and in fact not possible)
        !            85: to add padding fields to the end of all drivers.
        !            86:
        !            87: Similarly, if you add an optional field to an old driver, take care
        !            88: to ensure that all intervening fields are padded with zeros.
        !            89:
        !            90: Some of the above fields are required - this should not be a problem,
        !            91: since they were all required in earlier releases of gnuplot.
        !            92: The later fields are interfaces to capabilities that not all devices
        !            93: can do, or for which the generic routines provided should be adequate.
        !            94: There are several null ('cant do') functions provided by term.c which
        !            95: a driver can reference in the table. Similarly, for bitmap devices, there
        !            96: are generic routines for lines and text provided by bitmap.c
        !            97:
        !            98:
        !            99:
        !           100: Here's a brief description of each variable:
        !           101:
        !           102: The char *name is a pointer to a string containing the name
        !           103: of the terminal.  This name is used by the 'set terminal' and
        !           104: 'show terminal' commands.
        !           105: The name must be unique and must not be confused with an abbreviation
        !           106: of another name.  For example if the name "postscript" exists, it is not
        !           107: possible to have another name "postscript2".
        !           108: Keep the name under 15 characters.
        !           109:
        !           110: The char *description is a pointer to a string containing a
        !           111: description of the terminal, which is displayed in response
        !           112: to the 'set terminal' command.
        !           113: Keep the description under 60 characters.
        !           114:
        !           115: xmax is the maximum number of points in the x direction.
        !           116: The range of points used by gnuplot is 0 to xmax-1.
        !           117:
        !           118: ymax is the maximum number of points in the y direction.
        !           119: The range of points used by gnuplot is 0 to ymax-1.
        !           120:
        !           121: v_char is the height of characters, in the same units as xmax and ymax.
        !           122: The border for labelling at the top and bottom of the plot is
        !           123: calculated using v_char.
        !           124: v_char is used as the vertical line spacing for characters.
        !           125:
        !           126: h_char is the width of characters, in the same units as xmax and ymax.
        !           127: The border for labelling at the left and right of the plot is
        !           128: calculated using h_char, for example.
        !           129: If the _justify_text function returns FALSE, h_char is used to justify
        !           130: text right or centre.  If characters are not fixed width, then the
        !           131: _justify_text function must correctly justify the text.
        !           132:
        !           133: v_tic is the vertical size of tics along the x axis,
        !           134: in the same units as ymax.
        !           135:
        !           136: h_tic is the horizontal size of tics along the y axis,
        !           137: in the same units as xmax.
        !           138:
        !           139: v_tic and h_tic should give tics of the same physical size on the
        !           140: output. The ratio of these two quantities is used by gnuplot to set the
        !           141: aspect ratio to 1 so that circles appear circular when 'set size square'
        !           142: is active.
        !           143:
        !           144: All the above values need not be static - values can be substituted
        !           145: into the table during terminal initialisation, based on options for
        !           146: example.
        !           147:
        !           148:
        !           149:
        !           150: Here's a brief description of what each term.c function does:
        !           151:
        !           152: _options()  Called when terminal type is selected.
        !           153: This procedure should parse options on the command line.  A list of the
        !           154: currently selected options should be stored in term_options[] in a form
        !           155: suitable for use with the set term command.  term_options[] is used by
        !           156: the save command.  Use options_null() if no options are available.
        !           157:
        !           158: _init()  Called once, when the device is first selected.  This procedure
        !           159: should set up things that only need to be set once, like handshaking and
        !           160: character sets etc...
        !           161: There is a global variable 'pointsize' which you might want to use here.
        !           162: If set pointsize is issued after init has been called, the set_pointsize()
        !           163: function is called.
        !           164:
        !           165: _reset()  Called when gnuplot is exited, the output device changed or
        !           166: the terminal type changed.  This procedure should reset the device,
        !           167: possibly flushing a buffer somewhere or generating a form feed.
        !           168:
        !           169: _scale(xs,ys) Called just before _graphics(). This takes the x and y
        !           170: scaling factors as information. If the terminal would like to do its
        !           171: own scaling, it returns TRUE. Otherwise, it can ignore the information
        !           172: and return FALSE: do_plot will do the scaling for you. null_scale is
        !           173: provided to do just this, so most drivers can ignore this function
        !           174: entirely. The Latex driver is currently the only one providing its own
        !           175: scaling. PLEASE DO NOT USE THIS INTERFACE - IT IS NOT COMPATIBLE WITH
        !           176: MULTIPLOT.
        !           177:
        !           178: _graphics()  Called just before a plot is going to be displayed.  This
        !           179: procedure should set the device into graphics mode.  Devices which can't
        !           180: be used as terminals (like plotters) will probably be in graphics mode
        !           181: always and therefore won't need this.
        !           182:
        !           183: _text()  Called immediately after a plot is displayed.  This procedure
        !           184: should set the device back into text mode if it is also a terminal, so
        !           185: that commands can be seen as they're typed.  Again, this will probably
        !           186: do nothing if the device can't be used as a terminal. This call can
        !           187: be used to trigger conversion and output for bitmap devices.
        !           188:
        !           189: _move(x,y)  Called at the start of a line.  The cursor should move to the
        !           190: (x,y) position without drawing.
        !           191:
        !           192: _vector(x,y)  Called when a line is to be drawn.  This should display a line
        !           193: from the last (x,y) position given by _move() or _vector() to this new (x,y)
        !           194: position.
        !           195:
        !           196: _linetype(lt)  Called to set the line type before text is displayed or
        !           197: line(s) plotted.  This procedure should select a pen color or line
        !           198: style if the device has these capabilities.
        !           199: lt is an integer from -2 to 0 or greater.
        !           200: An lt of -2 is used for the border of the plot.
        !           201: An lt of -1 is used for the X and Y axes.
        !           202: lt 0 and upwards are used for plots 0 and upwards.
        !           203: If _linetype() is called with lt greater than the available line types,
        !           204: it should map it to one of the available line types.
        !           205: Most drivers provide 9 different linetypes (lt is 0 to 8).
        !           206:
        !           207: _put_text(x,y,str)  Called to display text at the (x,y) position,
        !           208: while in graphics mode.   The text should be vertically (with respect
        !           209: to the text) justified about (x,y).  The text is rotated according
        !           210: to _text_angle and then horizontally (with respect to the text)
        !           211: justified according to _justify_text.
        !           212:
        !           213:
        !           214: The following are optional
        !           215:
        !           216:
        !           217: _text_angle(ang)  Called to rotate the text angle when placing the y label.
        !           218: If ang = 0 then text is horizontal.  If ang = 1 then text is vertically
        !           219: upwards.  Returns TRUE if text can be rotated, FALSE otherwise.
        !           220: [But you must return TRUE if called with ang=0]
        !           221:
        !           222: _justify_text(mode)  Called to justify text left, right or centre.
        !           223: If mode = LEFT then text placed by _put_text is flushed left against (x,y).
        !           224: If mode = CENTRE then centre of text is at (x,y).
        !           225: If mode = RIGHT then text is placed flushed right against (x,y).
        !           226: Returns TRUE if text can be justified
        !           227: Returns FALSE otherwise and then _put_text assumes text is flushed left;
        !           228: justification of text is then performed by calculating the text width
        !           229: using strlen(text) * h_char.
        !           230:
        !           231: _point(x,y,point)  Called to place a point at position (x,y).
        !           232: point is -1 or an integer from 0 upwards.
        !           233: At least 6 point types (numbered 0 to 5) are normally provided.
        !           234: Point type -1 is a dot.
        !           235: If point is more than the available point types then it should
        !           236: be mapped back to one of the available points.
        !           237: Two _point() functions called do_point() and line_and_point() are
        !           238: provided in term.c and should be suitable for most drivers.
        !           239: do_point() draws the points in the current line type.
        !           240: If your driver uses dotted line types (generally because it is
        !           241: monochrome), you should use line_and_point() which changes to
        !           242: line type 0 before drawing the point.  line type 0 should be solid.
        !           243:
        !           244: There is a global variable 'pointsize' which is controlled by the
        !           245: set pointsize command. If possible, use that. pointsize should be
        !           246: examined at terminal init. If it is subsequently changed, the
        !           247: set_pointsize() fn will be called.
        !           248:
        !           249:
        !           250: _arrow(sx,sy,ex,ey,head)  Called to draw an arrrow from (sx,sy) to (ex,ey).
        !           251: A head is drawn on the arrow if head = TRUE.
        !           252: An _arrow() function called do_arrow() is provided in term.c which will
        !           253: draw arrows using the _move() and _vector() functions.
        !           254: Drivers should use do_arrow unless it causes problems.
        !           255:
        !           256: _set_font() is called to set the font of labels, etc [new 3.7 feature]
        !           257: fonts are selected as strings "name,size"
        !           258:
        !           259: _pointsize() is used to set the pointsize for subsequent points
        !           260:
        !           261: _flags stores various flags describing driver capabilities. Currently
        !           262:  three bits are allocated
        !           263:   - TERM_CAN_MULTIPLOT - driver can do multiplot
        !           264:   fully-interactively when output is not redirected. ie text and graphics
        !           265:   go to different places, or driver can flip using suspend.
        !           266:   - TERM_CANT_MULTIPLOT - driver cannot multiplot, even if output
        !           267:   is redirected.
        !           268:   - TERM_BINARY - output file must be opened in binary mode
        !           269:   Another bit is earmarked for VMS_PASTHRU, but not yet implemented.
        !           270:
        !           271: _suspend() - called before gnuplot issues a prompt in multiplot mode
        !           272:    linux vga driver uses this entry point to flip from graphics to
        !           273:    text mode. X11 driver will take this opportunity to paint the window
        !           274:    on the display.
        !           275:
        !           276: _resume() - called after suspend(), before subsequent plots of a multiplot.
        !           277:
        !           278: _boxfill() - fills a box in given style (currently unimplemented - always
        !           279:            background colour at present). used by 'clear' in multiplot for
        !           280:            support of inset graphs
        !           281:
        !           282: _linewidth() - sets the linewidth
        !           283:
        !           284: The following should illustrate the order in which calls to these
        !           285: routines are made:
        !           286:
        !           287:  _options()
        !           288:   _init()
        !           289:     _scale(xs,ys)
        !           290:     _graphics()
        !           291:       _linewidth(lw)
        !           292:       _linetype(lt)
        !           293:       _move(x,y)
        !           294:       _vector(x,y)
        !           295:       _pointsize(size)
        !           296:       _point(x,y,point)
        !           297:       _text_angle(angle)
        !           298:       _justify(mode)
        !           299:       _set_font(font)
        !           300:       _put_text(x,y,text)
        !           301:       _arrow(sx,sy,ex,ey)
        !           302:     _text()
        !           303:     _graphics()
        !           304:       .
        !           305:     _suspend()
        !           306:     _set_pointsize()
        !           307:     _resume()
        !           308:       .
        !           309:     _text()
        !           310:   _reset()
        !           311:
        !           312:
        !           313: ------------------------------------
        !           314:
        !           315: BITMAP DEVICES
        !           316:
        !           317: A file bitmap.c is provided, implementing a generic set of bitmap
        !           318: routines. It provides all the routines required to generate a
        !           319: bitmap in memory, drawing lines and writing text. A simple driver
        !           320: need provide only a text() entry point, which converts and outputs
        !           321: the stored bitmap in the format required by the device.
        !           322:
        !           323: Internally, the bitmap is built of one or more planes of 1
        !           324: bit per pixel. In fact, I think the library would be easier to
        !           325: use if it offered one or more planes of pixels with 1,2,4 or 8
        !           326: bits per pixel, since not all bitmap devices are based on planes,
        !           327: and the planes have to be recombined at the end at present.
        !           328: In general, a device would use either planes or bits-per-pixel,
        !           329: though I guess a 24-bit bitmap could use 3 planes of 8 bits
        !           330: per pixel..?
        !           331:
        !           332:
        !           333: The pixels are currently organised horizontally packed into bytes.
        !           334:
        !           335: ie
        !           336:
        !           337: ********%%%%%%%%$$$$$$$$!!!!!!!! etc
        !           338: ^^^^^^^^@@@@@@@@########++++++++ etc
        !           339:
        !           340: where like symbols are stored in one byte. Vertical packing can be
        !           341: arranged by reversing x and y dimensions and setting the global
        !           342: b_rastermode to TRUE.  (eg epson 8-pin dot-matrix printer)
        !           343:
        !           344:
        !           345: Functions provided are
        !           346:
        !           347: (internal fns ? - should probably be static, not external ?)
        !           348: b_setpixel(x,y,value)
        !           349: b_setmaskpixel(x,y,value)
        !           350: b_putc(x,y,char,angle)
        !           351: b_setvalue(size)
        !           352:
        !           353: setting up stuff
        !           354:
        !           355: b_makebitmap(x,y,planes)  - make a bitmap of size x * y
        !           356: b_freebitmap()            - free bitmap
        !           357: b_charsize(size)
        !           358:
        !           359:
        !           360: gnuplot driver interface functions  (can go straight into gnuplot structure)
        !           361:
        !           362: b_setlinetype(linetype)
        !           363: b_move(x,y)
        !           364: b_vector(x,y)
        !           365: b_put_text(x,y,*str)
        !           366: b_text_angle(ang)
        !           367:
        !           368:
        !           369:
        !           370: I think that the library could be made easier to use if we defined
        !           371: a structure which described the bitmap (raster mode, planes, bits-per-pixel,
        !           372: colours, etc) and then added to the gnuplot term struct a pointer to
        !           373: this structure. Then we could have b_graphics() routine which did all
        !           374: the initialisation that presently has to be done by the driver graphics()
        !           375: entry point.  Also, one day I would like to have parsing, including
        !           376: terminal driver options, table-driven, but I'm getting ahead of myself
        !           377: here.
        !           378:
        !           379:
        !           380: At present, bitmap.c is linked into gnuplot unconditionally. Perhaps
        !           381: it should be put into a library, so that it is linked in only if
        !           382: any of the user-selected drivers require bitmap support.
        !           383:
        !           384: There may be scope to do similar things with some of the other
        !           385: stuff that is shared by several drivers. Rather than requiring,
        !           386: for example, that LATEX driver is required if EMTEX is to be used,
        !           387: the shared routines could be extracted to a library and linked
        !           388: if any of the drivers which use them are used.  Just a thought...
        !           389:
        !           390: ------------------------------------
        !           391:
        !           392: FILE LAYOUT
        !           393: -----------
        !           394:
        !           395: I think a file layout like the following will leave most flexibility
        !           396: to the gnuplot maintainers. I use REGIS for example.
        !           397:
        !           398:
        !           399: #include "driver.h"
        !           400:
        !           401:
        !           402: #ifdef TERM_REGISTER
        !           403: register_term(regis) /* no ; */
        !           404: #endif
        !           405:
        !           406:
        !           407: #ifdef TERM_PROTO
        !           408: TERM_PUBLIC void REGISinit __PROTO((void));
        !           409: TERM_PUBLIC void REGISgraphics __PROTO((void));
        !           410: /* etc */
        !           411: #define GOT_REGIS_PROTO
        !           412: #endif
        !           413:
        !           414:
        !           415: #ifndef TERM_PROTO_ONLY
        !           416: #ifdef TERM_BODY
        !           417:
        !           418: TERM_PUBLIC void REGISinit()
        !           419: {
        !           420:   /* etc */
        !           421: }
        !           422:
        !           423: /* etc */
        !           424:
        !           425: #endif
        !           426:
        !           427:
        !           428: #ifdef TERM_TABLE
        !           429:
        !           430: TERM_TABLE_START(regis_driver)
        !           431:   /* no { */
        !           432:   "regis", "REGIS graphics language",
        !           433:   REGISXMAX, /* etc */
        !           434:   /* no } */
        !           435: TERM_TABLE_END(regis_driver)
        !           436:
        !           437: #undef LAST_TERM
        !           438: #define LAST_TERM regis_driver
        !           439:
        !           440: #endif /* TERM_TABLE */
        !           441: #endif /* TERM_PROTO_ONLY */
        !           442:
        !           443:
        !           444:
        !           445:
        !           446: #ifdef TERM_HELP
        !           447: START_HELP(regis)
        !           448: "1 regis",
        !           449: "?set terminal regis",
        !           450: "?regis",
        !           451: " The `regis` terminal device generates output in the REGIS graphics language.",
        !           452: " It has the option of using 4 (the default) or 16 colors.",
        !           453: "",
        !           454: " Syntax:",
        !           455: "         set term regis {4 | 16}"
        !           456: END_HELP(regis)
        !           457: #endif
        !           458:
        !           459:
        !           460: --------------
        !           461:
        !           462: The first three lines in the TERM_HELP section must contain the same
        !           463: name as that specified by register_term, since this is the name that
        !           464: will be entered into the list of available terminals.  If more than
        !           465: one name is registered, the additional names should have their own
        !           466: two "?" lines, but not the "1" line.
        !           467:
        !           468: Each record is enclosed in double-quotes and (except for the last
        !           469: record) followed by a comma.  The text is copied as a single string
        !           470: into gnuplot.doc, so the syntax must obey the rules of that entity.
        !           471: If the text includes double-quotes or backslashes, these must be
        !           472: escaped by preceding each occurence with a backslash.
        !           473:
        !           474: --------------
        !           475:
        !           476: Rationale:
        !           477:
        !           478: We may want to compile all drivers into term.c or one driver at a time
        !           479: this layout should support both
        !           480: TERM_PUBLIC will be static  if all modules are in term.c, or blank
        !           481: otherwise.
        !           482: Please make private support functions static if possible.
        !           483:
        !           484:
        !           485: We may include term.h, and therefore all these files, one or more times.
        !           486: If just once (all modules compiled into term.c) putting the four
        !           487: parts in this order should make it work.
        !           488:
        !           489: we may compile the table entries into either an array or a linked list
        !           490: This organisation should support both
        !           491:
        !           492: For separate compilation, we may write a program which
        !           493: defines TERM_REGISTER and #include term.h to find out which drivers are
        !           494: selected in term.h and thereby generate a makefile.
        !           495:
        !           496:
        !           497:
        !           498: For a driver which depends on another (eg enhpost and pslatex on post)
        !           499: the driver can do something like
        !           500:
        !           501: #ifndef GOT_POST_PROTO
        !           502: #define TERM_PROTO_ONLY
        !           503: #include "post.trm"
        !           504: #undef TERM_PROTO_ONLY
        !           505: #endif
        !           506:
        !           507: this is probably needed only in the TERM_TABLE section only, but may
        !           508: also be used in the body. The TERM_PROTO_ONLY means that we pick up
        !           509: only the protos from post.trm, even if current driver is being compiled
        !           510: with TERM_BODY or TERM_TABLE
        !           511:
        !           512: If we do it the linked-list way, the arg to TERM_TABLE_START will be
        !           513: the name of the variable, so any valid, unique name is fine.
        !           514: The TERM_TABLE_START macro will do all the work of linking the entries
        !           515: together, probably using LAST_TERM
        !           516:
        !           517: The inclusion of the TERM_HELP section (and removal of terminal documentation
        !           518: from the master gnuplot.doc file) means that the online help will include
        !           519: discussions of only those terminals available to the user.  For generation
        !           520: of the printed manual, all can be included.
        !           521:
        !           522:
        !           523: Please make as many things as possible static, but do still try to use unique
        !           524: names since all drivers may all be compiled into term.o
        !           525:
        !           526: The bit in the PROTO section is basically what you would put into a .h
        !           527: file if we had them - everything that is needed by the TABLE_ENTRY
        !           528: should be defined in this part. In particular, dont forget all the maxes
        !           529: and character sizes and things for the table entry.
        !           530:
        !           531: Dont forget to put TERM_PUBLIC in the defns of the fns as well as the
        !           532: prototypes. It will probably always expand to 'static' except for pcs.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>