--- FORMAT3.2.orig Wed Apr 3 10:27:14 2002 +++ FORMAT3.2 Wed Apr 3 10:27:14 2002 @@ -0,0 +1,563 @@ +/* + * FIG : Facility for Interactive Generation of figures + * Copyright (c) 1985 by Supoj Sutanthavibul + * Parts Copyright (c) 1989-1999 by Brian V. Smith + * Parts Copyright (c) 1991 by Paul King + * Parts Copyright (c) 1995 by C. Blanc and C. Schlick + * + * The X Consortium, and any party obtaining a copy of these files from + * the X Consortium, directly or indirectly, is granted, free of charge, a + * full and unrestricted irrevocable, world-wide, paid up, royalty-free, + * nonexclusive right and license to deal in this software and + * documentation files (the "Software"), including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons who receive + * copies from any such party to do so, with the only requirement being + * that this copyright notice remain intact. This license includes without + * limitation a license to do the foregoing actions under any patents of + * the party supplying this software to the X Consortium. + */ + +The new components in protocol 3.2 are the paper size, magnification, +single/multiple page indicator and transparent color for GIF export in the +header. + +The other modification between version 3.1 and version 3.2 of the +protocol is the mathematical model used for splines. The new version +uses X-splines which allows the user to mix interpolation and approximation +points in a same curve. More precisely, it means that an X-spline curve +is neither an interpolated spline nor an approximated one, it is BOTH +(the behaviour of each point is controlled by one single parameter +called "shape factor"). For additional information about X-splines, see: + + "X-Splines: A Spline Model Designed for the End User" + by C. Blanc and C. Schlick, Proceedings of SIGGRAPH'95 + +Caveat: Because spline models of previous versions (quadratic B-splines +and Bezier with hidden points) are no longer supported, curves that are +present in version 3.1 and older files are automatically converted to +X-splines. This translation is only an approximation process. It means +that the converted curves are not exactly the same as the original ones. +Though the translation usually provides almost identical curves, some +hand-fitting may be needed in some pathological cases. + +------------------------------------------------------------------------------- +Description of the Fig Format Follows +------------------------------------------------------------------------------- + +(1) The very first line is a comment line containing the name and version: + #FIG 3.2 + + The character # at the first column of a line indicates that the line + is a comment line which will be preserved when the Fig file is read in. + The user may edit them with the popup editor. + + The comment line(s) must immediately precede the object to which they + are associated. In the case of the "whole figure comments" mentioned + below, they immediately precede the (resolution,coord_system) line. + +(2) The first non-comment line consists of the following: + + string orientation ("Landscape" or "Portrait") + string justification ("Center" or "Flush Left") + string units ("Metric" or "Inches") + string papersize ("Letter", "Legal", "Ledger", "Tabloid", + "A", "B", "C", "D", "E", + "A4", "A3", "A2", "A1", "A0" and "B5") + float magnification (export and print magnification, %) + string multiple-page ("Single" or "Multiple" pages) + int transparent color (color number for transparent color for GIF + export. -3=background, -2=None, -1=Default, + 0-31 for standard colors or 32- for user colors) + # optional comment (An optional set of comments may be here, + which are associated with the whole figure) + int resolution coord_system (Fig units/inch and coordinate system: + 1: origin at lower left corner (NOT USED) + 2: upper left) + + Fig_resolution is the resolution of the figure in the file. + Xfig will always write the file with a resolution of 1200ppi so it + will scale the figure upon reading it in if its resolution is different + from 1200ppi. Pixels are assumed to be square. + + Xfig will read the orientation string and change the canvas to match + either the Landscape or Portrait mode of the figure file. + + The units specification is self-explanatory. + + The coordinate_system variable is ignored - the origin is ALWAYS the + upper-left corner. + + ** Coordinates are given in "fig_resolution" units. + ** Line thicknesses are given in 1/80 inch (0.3175mm) or 1 screen pixel. + When exporting to EPS, PostScript or any bitmap format (e.g. GIF), the + line thickness is reduced to 1/160 inch (0.159mm) to "lighten" the look. + ** dash-lengths/dot-gaps are given in 80-ths of an inch. + + +(3) The rest of the file contains various objects. An object can be one + of six classes (or types). + + 0) Color pseudo-object. + 1) Arc. + 2) Ellipse which is a generalization of circle. + 3) Polyline which includes polygon and box. + 4) Spline which includes + closed/open approximated/interpolated/x-spline spline. + 5) Text. + 6) Compound object which is composed of one or more objects. + + In the following elaboration on object formats, every value of fig + output are separated by blank characters or new line ('\n'). The + value of the unused parameters will be -1. + + Some fields are described as "enumeration type" or "bit vector"; the + values which these fields can take are defined in the header file object.h. + The pen_style field is unused. + These values may be defined in some future version of Fig. + + The two color fields (pen and fill; pen only, for texts) are + defined as follows: + + -1 = Default + 0 = Black + 1 = Blue + 2 = Green + 3 = Cyan + 4 = Red + 5 = Magenta + 6 = Yellow + 7 = White + 8-11 = four shades of blue (dark to lighter) + 12-14 = three shades of green (dark to lighter) + 15-17 = three shades of cyan (dark to lighter) + 18-20 = three shades of red (dark to lighter) + 21-23 = three shades of magenta (dark to lighter) + 24-26 = three shades of brown (dark to lighter) + 27-30 = four shades of pink (dark to lighter) + 31 = Gold + + values from 32 to 543 (512 total) are user colors and + are defined in color pseudo-objects (type 0) + + Your X server may limit the number of colors to something less + than this, especially on a 8-bit PseudoColor visual, where + the number of usable colors will be 256 minus the number of colors + xfig preallocates for itself and the 32 standard colors (about 48). + + For WHITE color, the area fill field is defined as follows: + + -1 = not filled + 0 = black + ... values from 1 to 19 are shades of grey, from darker to lighter + 20 = white + 21-40 not used + 41-56 see patterns for colors, below + + For BLACK or DEFAULT color, the area fill field is defined as follows: + + -1 = not filled + 0 = white + ... values from 1 to 19 are shades of grey, from lighter to darker + 20 = black + 21-40 not used + 41-56 see patterns for colors, below + + For all other colors, the area fill field is defined as follows: + + -1 = not filled + 0 = black + ... values from 1 to 19 are "shades" of the color, from darker to lighter. + A shade is defined as the color mixed with black + 20 = full saturation of the color + ... values from 21 to 39 are "tints" of the color from the color to white. + A tint is defined as the color mixed with white + 40 = white + 41 = 30 degree left diagonal pattern + 42 = 30 degree right diagonal pattern + 43 = 30 degree crosshatch + 44 = 45 degree left diagonal pattern + 45 = 45 degree right diagonal pattern + 46 = 45 degree crosshatch + 47 = horizontal bricks + 48 = vertical bricks + 49 = horizontal lines + 50 = vertical lines + 51 = crosshatch + 52 = horizontal "shingles" skewed to the right + 53 = horizontal "shingles" skewed to the left + 54 = vertical "shingles" skewed one way + 55 = vertical "shingles"skewed the other way + 56 = fish scales + 57 = small fish scales + 58 = circles + 59 = hexagons + 60 = octagons + 61 = horizontal "tire treads" + 62 = vertical "tire treads" + + The depth field is defined as follows: + + 0 ... 999 where larger value means object is deeper than (under) + objects with smaller depth + + The line_style field is defined as follows: + + -1 = Default + 0 = Solid + 1 = Dashed + 2 = Dotted + 3 = Dash-dotted + 4 = Dash-double-dotted + 5 = Dash-triple-dotted + + The style_val field is defined as the length, in 1/80 inches, of the on/off + dashes for dashed lines, and the distance between the dots, in 1/80 inches, + for dotted lines. + + The join_style field is defined FOR LINES only as follows: + + 0 = Miter (the default in xfig 2.1 and earlier) + 1 = Round + 2 = Bevel + + The cap_style field is defined FOR LINES, OPEN SPLINES and ARCS only as follows: + + 0 = Butt (the default in xfig 2.1 and earlier) + 1 = Round + 2 = Projecting + + The arrow_type field is defined for LINES, ARCS and OPEN SPLINES + only as follows: + + 0 = Stick-type (the default in xfig 2.1 and earlier) + + \ + \ + _______________\ + / + / + / + + 1 = Closed triangle: + + |\ + | \ + ________| \ + | / + | / + |/ + + 2 = Closed with "indented" butt: + + |\ + \ \ + \ \ + __________\ \ + / / + / / + / / + |/ + + 3 = Closed with "pointed" butt: + + /\ + / \ + / \ + ________/ \ + \ / + \ / + \ / + \/ + + The arrow_style field is defined for LINES, ARCS and OPEN SPLINES + only as follows: + + 0 = Hollow (actually filled with white) + 1 = Filled with pen_color + +(3.0) OBJECT DEFINITION: + + (3.1) Color Pseudo-objects (user-defined colors) + This is used to define arbitrary colors beyond the 32 standard colors. + The color objects must be defined before any other Fig objects. + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 0) + int color_number (color number, from 32-543 (512 total)) + hex string rgb values (hexadecimal string describing red, + green and blue values (e.g. #330099) ) + + (3.2) ARC + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 5) + int sub_type (1: open ended arc + 2: pie-wedge (closed) ) + int line_style (enumeration type) + int line_thickness (1/80 inch) + int pen_color (enumeration type, pen color) + int fill_color (enumeration type, fill color) + int depth (enumeration type) + int pen_style (pen style, not used) + int area_fill (enumeration type, -1 = no fill) + float style_val (1/80 inch) + int cap_style (enumeration type) + int direction (0: clockwise, 1: counterclockwise) + int forward_arrow (0: no forward arrow, 1: on) + int backward_arrow (0: no forward arrow, 1: on) + float center_x, center_y (center of the arc) + int x1, y1 (Fig units, the 1st point the user entered) + int x2, y2 (Fig units, the 2nd point) + int x3, y3 (Fig units, the last point) + + Forward arrow line (Optional; absent if forward_arrow is 0): + type name (brief description) + ---- ---- ------------------- + int arrow_type (enumeration type) + int arrow_style (enumeration type) + float arrow_thickness (1/80 inch) + float arrow_width (Fig units) + float arrow_height (Fig units) + + Backward arrow line (Optional; absent if backward_arrow is 0): + type name (brief description) + ---- ---- ------------------- + int arrow_type (enumeration type) + int arrow_style (enumeration type) + float arrow_thickness (1/80 inch) + float arrow_width (Fig units) + float arrow_height (Fig units) + + (3.3) COMPOUND + + A line with object code 6 signifies the start of a compound. + There are four more numbers on this line which indicate the + upper left corner and the lower right corner of the bounding + box of this compound. A line with object code -6 signifies + the end of the compound. Compound may be nested. + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 6) + int upperleft_corner_x (Fig units) + int upperleft_corner_y (Fig units) + int lowerright_corner_x (Fig units) + int lowerright_corner_y (Fig units) + + Subsequent lines: + objects + . + . + + Last line: + -6 + + (3.4) ELLIPSE + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 1) + int sub_type (1: ellipse defined by radii + 2: ellipse defined by diameters + 3: circle defined by radius + 4: circle defined by diameter) + int line_style (enumeration type) + int thickness (1/80 inch) + int pen_color (enumeration type, pen color) + int fill_color (enumeration type, fill color) + int depth (enumeration type) + int pen_style (pen style, not used) + int area_fill (enumeration type, -1 = no fill) + float style_val (1/80 inch) + int direction (always 1) + float angle (radians, the angle of the x-axis) + int center_x, center_y (Fig units) + int radius_x, radius_y (Fig units) + int start_x, start_y (Fig units; the 1st point entered) + int end_x, end_y (Fig units; the last point entered) + + (3.5) POLYLINE + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 2) + int sub_type (1: polyline + 2: box + 3: polygon + 4: arc-box) + 5: imported-picture bounding-box) + int line_style (enumeration type) + int thickness (1/80 inch) + int pen_color (enumeration type, pen color) + int fill_color (enumeration type, fill color) + int depth (enumeration type) + int pen_style (pen style, not used) + int area_fill (enumeration type, -1 = no fill) + float style_val (1/80 inch) + int join_style (enumeration type) + int cap_style (enumeration type, only used for POLYLINE) + int radius (1/80 inch, radius of arc-boxes) + int forward_arrow (0: off, 1: on) + int backward_arrow (0: off, 1: on) + int npoints (number of points in line) + + Forward arrow line: same as ARC object + + Backward arrow line: same as ARC object + + Points line: + type name (brief description) + ---- ---- ------------------- + int x1, y1 (Fig units) + int x2, y2 (Fig units) + . + . + int xnpoints ynpoints (this will be the same as the 1st + point for polygon and box) + + PIC line: + type name (brief description) + ---- ---- ------------------- + boolean flipped orientation = normal (0) or flipped (1) + char file[] name of picture file to import + + (3.6) SPLINE + + First line: + type name (brief description) + ---- ---- ------------------- + int object_code (always 3) + int sub_type (0: open approximated spline + 1: closed approximated spline + 2: open interpolated spline + 3: closed interpolated spline + 4: open x-spline + 5: closed x-spline) + int line_style (See the end of this section) + int thickness (1/80 inch) + int pen_color (enumeration type, pen color) + int fill_color (enumeration type, fill color) + int depth (enumeration type) + int pen_style (pen style, not used) + int area_fill (enumeration type, -1 = no fill) + float style_val (1/80 inch) + int cap_style (enumeration type, only used for open splines) + int forward_arrow (0: off, 1: on) + int backward_arrow (0: off, 1: on) + int npoints (number of control points in spline) + + Forward arrow line: same as ARC object + + Backward arrow line: same as ARC object + + Points line: same as POLYLINE object + + Control points line : + + There is one shape factor for each point. The value of this factor + must be between -1 (which means that the spline is interpolated at + this point) and 1 (which means that the spline is approximated at + this point). The spline is always smooth in the neighbourhood of a + control point, except when the value of the factor is 0 for which + there is a first-order discontinuity (i.e. angular point). + + (3.7) TEXT + type name (brief description) + ---- ---- ------------------- + int object (always 4) + int sub_type (0: Left justified + 1: Center justified + 2: Right justified) + int color (enumeration type) + int depth (enumeration type) + int pen_style (enumeration , not used) + int font (enumeration type) + float font_size (font size in points) + float angle (radians, the angle of the text) + int font_flags (bit vector) + float height (Fig units) + float length (Fig units) + int x, y (Fig units, coordinate of the origin + of the string. If sub_type = 0, it is + the lower left corner of the string. + If sub_type = 1, it is the lower + center. Otherwise it is the lower + right corner of the string.) + char string[] (ASCII characters; starts after a blank + character following the last number and + ends before the sequence '\001'. This + sequence is not part of the string. + Characters above octal 177 are + represented by \xxx where xxx is the + octal value. This permits fig files to + be edited with 7-bit editors and sent + by e-mail without data loss. + Note that the string may contain '\n'.) + + The font_flags field is defined as follows: + + Bit Description + + 0 Rigid text (text doesn't scale when scaling compound objects) + 1 Special text (for LaTeX) + 2 PostScript font (otherwise LaTeX font is used) + 3 Hidden text + + The font field is defined as follows: + + For font_flags bit 2 = 0 (LaTeX fonts): + + 0 Default font + 1 Roman + 2 Bold + 3 Italic + 4 Sans Serif + 5 Typewriter + + For font_flags bit 2 = 1 (PostScript fonts): + + (.ft value) + -1 Default font + 0 Times Roman + 1 Times Italic + 2 Times Bold + 3 Times Bold Italic + 4 AvantGarde Book + 5 AvantGarde Book Oblique + 6 AvantGarde Demi + 7 AvantGarde Demi Oblique + 8 Bookman Light + 9 Bookman Light Italic + 10 Bookman Demi + 11 Bookman Demi Italic + 12 Courier + 13 Courier Oblique + 14 Courier Bold + 15 Courier Bold Oblique + 16 Helvetica + 17 Helvetica Oblique + 18 Helvetica Bold + 19 Helvetica Bold Oblique + 20 Helvetica Narrow + 21 Helvetica Narrow Oblique + 22 Helvetica Narrow Bold + 23 Helvetica Narrow Bold Oblique + 24 New Century Schoolbook Roman + 25 New Century Schoolbook Italic + 26 New Century Schoolbook Bold + 27 New Century Schoolbook Bold Italic + 28 Palatino Roman + 29 Palatino Italic + 30 Palatino Bold + 31 Palatino Bold Italic + 32 Symbol + 33 Zapf Chancery Medium Italic + 34 Zapf Dingbats