home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume16 / xfig-2.1.3 / part17 < prev    next >
Internet Message Format  |  1992-02-04  |  57KB

  1. Path: uunet!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  2. From: envbvs@bea.lbl.gov (Brian V. Smith)
  3. Newsgroups: comp.sources.x
  4. Subject: v16i022: Xfig 2.1.3, Part17/25
  5. Message-ID: <1992Feb4.150149.1201@msi.com>
  6. Date: 4 Feb 92 15:01:49 GMT
  7. References: <csx-16i006-xfig-2.1.3@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: Molecular Simulations, Inc.
  10. Lines: 1946
  11. Approved: dcmartin@msi.com
  12. Originator: dcmartin@fascet
  13.  
  14. Submitted-by: envbvs@bea.lbl.gov (Brian V. Smith)
  15. Posting-number: Volume 16, Issue 22
  16. Archive-name: xfig-2.1.3/part17
  17.  
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  22. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  23. # If this archive is complete, you will see the following message at the end:
  24. #        "End of archive 17 (of 25)."
  25. # Contents:  Doc/FORMAT1.4 Doc/FORMAT2.0 d_ellipse.c e_addpt.c
  26. #   e_delete.c object.h
  27. # Wrapped by dcmartin@fascet on Tue Feb  4 06:42:31 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'Doc/FORMAT1.4' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'Doc/FORMAT1.4'\"
  31. else
  32. echo shar: Extracting \"'Doc/FORMAT1.4'\" \(9377 characters\)
  33. sed "s/^X//" >'Doc/FORMAT1.4' <<'END_OF_FILE'
  34. X****** This is the old format 1.4. ******
  35. X
  36. XThe following is the format of fig output (fig 1.4).
  37. X
  38. X(1) The very first line is a comment line containing the name and version:
  39. X    #FIG 1.4
  40. X
  41. X    The character # at the first column of a line indicates that the line
  42. X    is a comment line which will be ignored.
  43. X
  44. X(2) The first non-comment line consists of two numbers :
  45. X
  46. X    int    fig_resolution        (pixels/inch)
  47. X    int    coordinate_system    (1 : origin is at the lower left corner
  48. X                     2 : Upper left)
  49. X
  50. X    Fig_resolution is the resolution fig is using for the current file.
  51. X    It may not be the same as screen resolution (which can be higher or
  52. X    lower).  I assume that a pixel is square, therefore this number
  53. X    represents drawing resolution in both direction.  I've experimented
  54. X    with fig automatically changing this number according to the resolution
  55. X    of the monitor it is running on (The screen resolution, width and height
  56. X    in pixels, not pixel/inch, can be done by doing a ioctl on the /dev/fb).
  57. X    I've found that for monitors with higher resolution but same size
  58. X    (19" diagonal), I preferred using the pixels for other things than
  59. X    having fig occupying most of the screen.  Thus I opted for a fixed
  60. X    pixel-per-inch number which make fig window smaller on higher resolution
  61. X    monitor (than the standard sun monitor).  This however may change in
  62. X    the future version.
  63. X
  64. X(3) The rest of the file contains various objects.  An object can be one
  65. X    of six classes (or types).
  66. X
  67. X      i)    Arc.
  68. X     ii)    Ellipse which is a generalization of circle.
  69. X    iii)    Polyline which includes polygon and box.
  70. X     iv)    Spline which includes closed/open control/interpolated spline.
  71. X      v)    Text.
  72. X     vi)    Compound object which is composed of one or more objects.
  73. X
  74. X    In the following elaboration on object formats, every value of fig
  75. X    output are separated by blank characters or new line ('\n').  The
  76. X    value of the not-used parameters will be -1.
  77. X
  78. X    A number of values are described as unused or not applicable to some
  79. X    object even though they are defined for those objects.  These value
  80. X    will (hopefully) be used in the future version of fig.  The intention
  81. X    of their uses are the following.
  82. X
  83. X    Value            Usage
  84. X    -----            -----
  85. X    area_fill    The stipple pattern (which will be align) for
  86. X            filling object internals.  For example, an filled
  87. X            arc will look like a piece of pie.
  88. X
  89. X    pen        This will be a structure defining the shape of
  90. X            pen used in drawing objects.  It also includes
  91. X            the the stipple pattern for line filling.
  92. X            The default pen is a circular pen with black
  93. X            filling.
  94. X
  95. X    thickness    Every pen has the thickness of one.
  96. X            Thickness scales the size of a pen. 
  97. X
  98. X    depth        This value adds a half dimension to fig.
  99. X            It is useful when we have overlapping filled
  100. X            objects and we want one to obliterate another.
  101. X            An object can have only one depth (including
  102. X            compound object).  An object that is in less
  103. X            depth can obscure the one with greater depth
  104. X            if they overlap.
  105. X    
  106. X    line_style    Only polyline (including polygon and box) can
  107. X            be rendered with dashed line.  However the
  108. X            objects created when the dash-line mode was on
  109. X            will be recorded as such.  Currently the filter
  110. X            f2ps (1) is able to render the desired line style
  111. X            effect on hard copy.  Three line styles are defined.
  112. X
  113. X                0 : SOLID_LINE
  114. X                1 : DASH_LINE
  115. X                2 : DOTTED_LINE
  116. X
  117. X    style_val    For dash style, it is the length of a dash.
  118. X            For dotted line it indicates the approximated
  119. X            gap of consecutive dots. 
  120. X
  121. X    (3.1) ARC
  122. X
  123. X    First line :
  124. X    type    name            (brief description)
  125. X    ----    ----            -------------------
  126. X    int    object_code        (always 5)
  127. X    int    sub_type        (always    1)
  128. X    int    line_style        (See the end of this section)
  129. X    int    line_thickness        (pixels, not used)
  130. X    int    color            (not used)
  131. X    int    depth            (not used)
  132. X    int    pen            (not used)
  133. X    int    area_fill        (not used)
  134. X    float    style_val        (pixels, not used)
  135. X    int    direction        (0 : clockwise, 1 : counterclockwise)
  136. X    int    forward_arrow        (0: no forward arrow, 1: on)
  137. X    int    backward_arrow        (0: no forward arrow, 1: on)
  138. X    float    center_x, center_y    (center of the arc)
  139. X    int    x1, y1            (pixels, the 1st point the user entered)
  140. X    int    x2, y2            (pixels, the 2nd point)
  141. X    int    x3, y3            (pixels, the last point)
  142. X
  143. X    Forward arrow line (Optional; absent if forward_arrow is 0) :
  144. X    type    name            (brief description)
  145. X    ----    ----            -------------------
  146. X    int    arrow_type        (not used)
  147. X    int    arrow_style        (not used)
  148. X    int    arrow_thickness        (not used)
  149. X    int    arrow_width        (pixels)
  150. X    int    arrow_height        (pixels)
  151. X
  152. X    Backward arrow line (Optional; absent if backward_arrow is 0) :
  153. X    type    name            (brief description)
  154. X    ----    ----            -------------------
  155. X    int    arrow_type        (not used)
  156. X    int    arrow_style        (not used)
  157. X    int    arrow_thickness        (not used)
  158. X    int    arrow_width        (pixels)
  159. X    int    arrow_height        (pixels)
  160. X
  161. X    (3.2) COMPOUND
  162. X
  163. X    A line with object code 6 signifies the start of a compound.
  164. X    There are four more numbers on this line which indicate the
  165. X    upper right corner and the lower left corner of the bounding
  166. X    box of this compound.  A line with object code -6 signifies
  167. X    the end of the compound.  Compound may be nested.
  168. X
  169. X    First line :
  170. X    type    name            (brief description)
  171. X    ----    ----            -------------------
  172. X    int    object_code        (always 6)
  173. X    int    upperright_corner_x    (pixels)
  174. X    int    upperright_corner_y    (pixels)
  175. X    int    lowerleft_corner_x    (pixels)
  176. X    int    lowerleft_corner_y    (pixels)
  177. X
  178. X    Subsequent lines :
  179. X    objects
  180. X    .
  181. X    .
  182. X
  183. X    Last line :
  184. X    -6
  185. X
  186. X    (3.3) ELLIPSE
  187. X
  188. X    First line :
  189. X    type    name            (brief description)
  190. X    ----    ----            -------------------
  191. X    int    object_code        (always 1)
  192. X    int    sub_type        (1 : ellipse defined by radiuses
  193. X                     2 : ellipse defined by diameters
  194. X                     3 : circle defined by radius
  195. X                     4 : circle defined by diameter)
  196. X    int    line_style        (See the end of this section)
  197. X    int    thickness        (pixels, not used)
  198. X    int    color            (not used)
  199. X    int    depth            (not used)
  200. X    int    pen            (not used)
  201. X    int    area_fill        (not used)
  202. X    float    style_val        (pixels, not used)
  203. X    int    direction        (always 1)
  204. X    float    angle            (radian, the angle of the x-axis)
  205. X    int    center_x, center_y    (pixels)
  206. X    int    radius_x, radius_y    (pixels)
  207. X    int    start_x, start_y    (pixels; the 1st point entered)
  208. X    int    end_x, end_y        (pixels; the last point entered)
  209. X
  210. X    (3.4) POLYLINE
  211. X
  212. X    First line :
  213. X    type    name            (brief description)
  214. X    ----    ----            -------------------
  215. X    int    object_code        (always 1)
  216. X    int    sub_type        (1 : polyline, 2 : box, 3 : polygon)
  217. X    int    line_style        (See the end of this section)
  218. X    int    thickness        (pixels, not used)
  219. X    int    color            (not used)
  220. X    int    depth            (not used)
  221. X    int    pen            (not used)
  222. X    int    area_fill        (not used)
  223. X    float    style_val        (pixels)
  224. X    int    forward_arrow        (0: off, 1: on)
  225. X    int    backward_arrow        (0: off, 1: on)
  226. X
  227. X    Forward arrow line : same as ARC object
  228. X
  229. X    Backward arrow line : same as ARC object
  230. X
  231. X    Points line :
  232. X    type    name            (brief description)
  233. X    ----    ----            -------------------
  234. X    int    x1, y1            (pixels)
  235. X    int    x2, y2            (pixels)
  236. X      .
  237. X      .
  238. X    int    xn, yn            (this will be the same as the 1st
  239. X                    point for polygon and box)
  240. X    int    x, y            (always 9999, 9999; marks the end of
  241. X                    point for polygon and box)
  242. X
  243. X    (3.5) SPLINE
  244. X
  245. X    First line :
  246. X    type    name            (brief description)
  247. X    ----    ----            -------------------
  248. X    int    object_code        (always 1)
  249. X    int    sub_type        (1 : open spline
  250. X                     2 : closed spline
  251. X                     3 : open interpolated spline
  252. X                     4 : closed interpolated spline)
  253. X    int    line_style        (See the end of this section)
  254. X    int    thickness        (pixels, not used)
  255. X    int    color            (not used)
  256. X    int    depth            (not used)
  257. X    int    pen            (not used)
  258. X    int    area_fill        (not used)
  259. X    float    style_val        (pixels, not used)
  260. X    int    forward_arrow        (0: off, 1: on)
  261. X    int    backward_arrow        (0: off, 1: on)
  262. X
  263. X    Forward arrow line : same as ARC object
  264. X
  265. X    Backward arrow line : same as ARC object
  266. X
  267. X    Points line : same as POLYLINE object
  268. X
  269. X    Control points line (absent if sub_type is 1 or 2) :
  270. X    Control points of interpolated spline.  There are two control
  271. X    points for each knots.  A section i, of the spline is drawn
  272. X    using Bezier cubic with the following four points:
  273. X        (x ,y ), (rx ,ry ), (lx      , ly   ), (x   , y   ).
  274. X          i  i        i    i      i+1    i+1     i+1   i+1
  275. X    For closed interpolated spline the last pair of control points,
  276. X    (lxn,lyn) and (rxn,ryn) (which can be ignored), are the same as
  277. X    (lx1,ly1) and (rx1,ry1) respectively.
  278. X
  279. X    type    name            (brief description)
  280. X    ----    ----            -------------------
  281. X    float    lx1, ly1        (pixels)
  282. X    float    rx1, ry1        (pixels)
  283. X    float    lx2, ly2        (pixels)
  284. X    float    rx2, ry2        (pixels)
  285. X      .
  286. X      .
  287. X    float    lxn, lyn        (pixels)
  288. X    float    rxn, ryn        (pixels)
  289. X
  290. X    (3.6) TEXT
  291. X    type    name            (brief description)
  292. X    ----    ----            -------------------
  293. X    int    object             (always 4)
  294. X    int    sub_type        (0 : Left justified
  295. X                     1 : Center justified
  296. X                     2 : Right justified)
  297. X    int    font             (not used)
  298. X    int    font_size         (not used)
  299. X    int    pen            (not used)
  300. X    int    color            (not used)
  301. X    int    depth            (not used)
  302. X    int    angle            (radian, not used, the angle of the
  303. X                    the base line of the string)
  304. X    int    font_style        (not used)
  305. X    int    height            (pixels)
  306. X    int    length            (pixels)
  307. X    int    x, y            (pixels, coordinate of the origin
  308. X                     of the string.  If sub_type = 0, it is
  309. X                     the lower left corner of the string.
  310. X                     If sub_type = 1, it is the lower
  311. X                     center.  Otherwise it is the lower
  312. X                     right corner of the string.)
  313. X    char    string[]        (ascii characters; starts after a blank
  314. X                    character following the last number and
  315. X                    ends before the character '\1'.  This
  316. X                    character is not part of the string.
  317. X                    Note that the string may contain '\n'.)
  318. END_OF_FILE
  319. if test 9377 -ne `wc -c <'Doc/FORMAT1.4'`; then
  320.     echo shar: \"'Doc/FORMAT1.4'\" unpacked with wrong size!
  321. fi
  322. # end of 'Doc/FORMAT1.4'
  323. fi
  324. if test -f 'Doc/FORMAT2.0' -a "${1}" != "-c" ; then 
  325.   echo shar: Will not clobber existing file \"'Doc/FORMAT2.0'\"
  326. else
  327. echo shar: Extracting \"'Doc/FORMAT2.0'\" \(9404 characters\)
  328. sed "s/^X//" >'Doc/FORMAT2.0' <<'END_OF_FILE'
  329. XThe following is the format of fig output for Protocol version 2.0:
  330. X
  331. X(1) The very first line is a comment line containing the name and version:
  332. X    #FIG 2.0
  333. X
  334. X    The character # at the first column of a line indicates that the line
  335. X    is a comment line which will be ignored.
  336. X
  337. X(2) The first non-comment line consists of two numbers :
  338. X
  339. X    int    fig_resolution        (pixels/inch)
  340. X    int    coordinate_system    (1 : origin is at the lower left corner
  341. X                     2 : Upper left)
  342. X
  343. X    Fig_resolution is the resolution fig is using for the current file.
  344. X    It may not be the same as screen resolution (which can be higher or
  345. X    lower).  I assume that a pixel is square, therefore this number
  346. X    represents drawing resolution in both direction.  I've experimented
  347. X    with fig automatically changing this number according to the resolution
  348. X    of the monitor it is running on (The screen resolution, width and height
  349. X    in pixels, not pixel/inch, can be done by doing a ioctl on the /dev/fb).
  350. X    I've found that for monitors with higher resolution but same size
  351. X    (19" diagonal), I preferred using the pixels for other things than
  352. X    having fig occupying most of the screen.  Thus I opted for a fixed
  353. X    pixel-per-inch number which make fig window smaller on higher resolution
  354. X    monitor (than the standard sun monitor).  This however may change in
  355. X    the future version.
  356. X
  357. X(3) The rest of the file contains various objects.  An object can be one
  358. X    of six classes (or types).
  359. X
  360. X      i)    Ellipse which is a generalization of circle.
  361. X     ii)    Polyline which includes polygon and box.
  362. X    iii)    Spline which includes closed/open control/interpolated spline.
  363. X     iv)    Text.
  364. X      v)    Arc.
  365. X     vi)    Compound object which is composed of one or more objects.
  366. X
  367. X    In the following elaboration on object formats, every value of fig
  368. X    output are separated by blank characters or new line ('\n').  The
  369. X    value of the not-used parameters will be -1.
  370. X
  371. X    A number of values are described as unused or not applicable to some
  372. X    object even though they are defined for those objects.  These value
  373. X    will (hopefully) be used in the future version of fig.  The intention
  374. X    of their uses are the following.
  375. X
  376. X    Value            Usage
  377. X    -----            -----
  378. X    area_fill    The gray color for filling object internals.
  379. X            Non-TFX:(gray color; 0=no fill,1=white,21=black)
  380. X            TFX:    (gray color; 0=no fill,1=black, 5=white)
  381. X
  382. X    pen        This will be a structure defining the shape of
  383. X            pen used in drawing objects.  It also includes
  384. X            the the stipple pattern for line filling.
  385. X            The default pen is a circular pen with black
  386. X            filling.
  387. X
  388. X    thickness    Every pen has the thickness of one.
  389. X            Thickness scales the size of a pen. 
  390. X
  391. X    depth        This value adds a half dimension to fig.
  392. X            It is useful when we have overlapping filled
  393. X            objects and we want one to obliterate another.
  394. X            An object can have only one depth (including
  395. X            compound object).  An object that is in less
  396. X            depth can obscure the one with greater depth
  397. X            if they overlap.
  398. X    
  399. X    style        Three line styles are defined.
  400. X
  401. X                0 : SOLID_LINE
  402. X                1 : DASH_LINE
  403. X                2 : DOTTED_LINE
  404. X
  405. X    style_val    For dash style, it is the length of a dash.
  406. X            For dotted line it indicates the approximated
  407. X            gap of consecutive dots. 
  408. X    
  409. X    radius        For rounded-corner boxes, this is the radius of
  410. X            the corners.
  411. X
  412. X    (3.1) ELLIPSE
  413. X
  414. X    First line :
  415. X    type    name            (brief description)
  416. X    ----    ----            -------------------
  417. X    int    object_code        (always 1)
  418. X    int    sub_type        (1 : ellipse defined by radiuses
  419. X                     2 : ellipse defined by diameters
  420. X                     3 : circle defined by radius
  421. X                     4 : circle defined by diameter)
  422. X    int    style            (See the end of this section)
  423. X    int    thickness        (pixels, not used)
  424. X    int    color            (not used)
  425. X    int    depth            (not used)
  426. X    int    pen            (not used)
  427. X    int    area_fill        (gray color)
  428. X    float    style_val        (pixels, not used)
  429. X    int    direction        (always 1)
  430. X    float    angle            (radian, the angle of the x-axis)
  431. X    int    center_x, center_y    (pixels)
  432. X    int    radius_x, radius_y    (pixels)
  433. X    int    start_x, start_y    (pixels; the 1st point entered)
  434. X    int    end_x, end_y        (pixels; the last point entered)
  435. X
  436. X    (3.2) POLYLINE
  437. X
  438. X    First line :
  439. X    type    name            (brief description)
  440. X    ----    ----            -------------------
  441. X    int    object_code        (always 2)
  442. X    int    sub_type        (1 : polyline, 2 : box, 
  443. X                     3 : polygon, 4 : rounded-corner box)
  444. X    int    style            (See the end of this section)
  445. X    int    thickness        (pixels, not used)
  446. X    int    color            (not used)
  447. X    int    depth            (not used)
  448. X    int    pen            (not used)
  449. X    int    area_fill    *    (gray color)
  450. X    float    style_val        (pixels)
  451. X    int    radius        **    (pixels, radius of rounded-corner boxes)
  452. X    int    forward_arrow        (0: off, 1: on)
  453. X    int    backward_arrow        (0: off, 1: on)
  454. X
  455. X*  Fill only available for box, polygon and rounded-corner box, not polyline.
  456. X** This component exists only in rounded-corner box object.
  457. X
  458. X    Forward arrow line : same as ARC object
  459. X
  460. X    Backward arrow line : same as ARC object
  461. X
  462. X    Points line :
  463. X    type    name            (brief description)
  464. X    ----    ----            -------------------
  465. X    int    x1, y1            (pixels)
  466. X    int    x2, y2            (pixels)
  467. X      .
  468. X      .
  469. X    int    xn, yn            (this will be the same as the 1st
  470. X                    point for polygon and box)
  471. X    int    x, y            (always 9999, 9999; marks the end of
  472. X                    point for polygon and box)
  473. X
  474. X    (3.3) SPLINE
  475. X
  476. X    First line :
  477. X    type    name            (brief description)
  478. X    ----    ----            -------------------
  479. X    int    object_code        (always 3)
  480. X    int    sub_type        (0 : open spline
  481. X                     1 : closed spline
  482. X                     2 : open interpolated spline
  483. X                     3 : closed interpolated spline)
  484. X    int    style            (See the end of this section)
  485. X    int    thickness        (pixels, not used)
  486. X    int    color            (not used)
  487. X    int    depth            (not used)
  488. X    int    pen            (not used)
  489. X    int    area_fill        (gray color)
  490. X    float    style_val        (pixels, not used)
  491. X    int    forward_arrow        (0: off, 1: on)
  492. X    int    backward_arrow        (0: off, 1: on)
  493. X
  494. X    Forward arrow line : same as ARC object
  495. X
  496. X    Backward arrow line : same as ARC object
  497. X
  498. X    Points line : same as POLYLINE object
  499. X
  500. X    Control points line (absent if sub_type is 1 or 2) :
  501. X    Control points of interpolated spline.  There are two control
  502. X    points for each knots.  A section i, of the spline is drawn
  503. X    using Bezier cubic with the following four points:
  504. X        (x ,y ), (rx ,ry ), (lx      , ly   ), (x   , y   ).
  505. X          i  i        i    i      i+1    i+1     i+1   i+1
  506. X    For closed interpolated spline the last pair of control points,
  507. X    (lxn,lyn) and (rxn,ryn) (which can be ignored), are the same as
  508. X    (lx1,ly1) and (rx1,ry1) respectively.
  509. X
  510. X    type    name            (brief description)
  511. X    ----    ----            -------------------
  512. X    float    lx1, ly1        (pixels)
  513. X    float    rx1, ry1        (pixels)
  514. X    float    lx2, ly2        (pixels)
  515. X    float    rx2, ry2        (pixels)
  516. X      .
  517. X      .
  518. X    float    lxn, lyn        (pixels)
  519. X    float    rxn, ryn        (pixels)
  520. X
  521. X    (3.4) TEXT
  522. X    type    name            (brief description)
  523. X    ----    ----            -------------------
  524. X    int    object             (always 4)
  525. X    int    sub_type        (0 : Left justified
  526. X                     1 : Center justified
  527. X                     2 : Right justified)
  528. X    int    font             (font number 0-...)
  529. X    int    font_size         (point size)
  530. X    int    pen            (not used)
  531. X    int    color            (not used)
  532. X    int    depth            (not used)
  533. X    float    angle            (radian, not used, the angle of the
  534. X                    the base line of the string)
  535. X    int    font_style        (not used)
  536. X    int    height            (pixels)
  537. X    int    length            (pixels)
  538. X    int    x, y            (pixels, coordinate of the origin
  539. X                     of the string.  If sub_type = 0, it is
  540. X                     the lower left corner of the string.
  541. X                     If sub_type = 1, it is the lower
  542. X                     center.  Otherwise it is the lower
  543. X                     right corner of the string.)
  544. X    char    string[]        (ascii characters; starts after a blank
  545. X                    character following the last number and
  546. X                    ends before the character '\1'.  This
  547. X                    character is not part of the string.
  548. X                    Note that the string may contain '\n'.)
  549. X    (3.5) ARC
  550. X
  551. X    First line :
  552. X    type    name            (brief description)
  553. X    ----    ----            -------------------
  554. X    int    object_code        (always 5)
  555. X    int    sub_type        (always    1)
  556. X    int    style            (See the end of this section)
  557. X    int    line_thickness        (pixels, not used)
  558. X    int    color            (not used)
  559. X    int    depth            (not used)
  560. X    int    pen            (not used)
  561. X    int    area_fill        (gray color)
  562. X    float    style_val        (pixels, not used)
  563. X    int    direction        (0 : clockwise, 1 : counterclockwise)
  564. X    int    forward_arrow        (0: no forward arrow, 1: on)
  565. X    int    backward_arrow        (0: no forward arrow, 1: on)
  566. X    float    center_x, center_y    (center of the arc)
  567. X    int    x1, y1            (pixels, the 1st point the user entered)
  568. X    int    x2, y2            (pixels, the 2nd point)
  569. X    int    x3, y3            (pixels, the last point)
  570. X
  571. X    Forward arrow line (Optional; absent if forward_arrow is 0) :
  572. X    type    name            (brief description)
  573. X    ----    ----            -------------------
  574. X    int    arrow_type        (not used)
  575. X    int    arrow_style        (not used)
  576. X    float    arrow_thickness        (not used)
  577. X    float    arrow_width        (pixels)
  578. X    float    arrow_height        (pixels)
  579. X
  580. X    Backward arrow line (Optional; absent if backward_arrow is 0) :
  581. X    type    name            (brief description)
  582. X    ----    ----            -------------------
  583. X    int    arrow_type        (not used)
  584. X    int    arrow_style        (not used)
  585. X    float    arrow_thickness        (not used)
  586. X    float    arrow_width        (pixels)
  587. X    float    arrow_height        (pixels)
  588. X
  589. X    (3.6) COMPOUND
  590. X
  591. X    A line with object code 6 signifies the start of a compound.
  592. X    There are four more numbers on this line which indicate the
  593. X    upper right corner and the lower left corner of the bounding
  594. X    box of this compound.  A line with object code -6 signifies
  595. X    the end of the compound.  Compound may be nested.
  596. X
  597. X    First line :
  598. X    type    name            (brief description)
  599. X    ----    ----            -------------------
  600. X    int    object_code        (always 6)
  601. X    int    upperright_corner_x    (pixels)
  602. X    int    upperright_corner_y    (pixels)
  603. X    int    lowerleft_corner_x    (pixels)
  604. X    int    lowerleft_corner_y    (pixels)
  605. X
  606. X    Subsequent lines :
  607. X    objects
  608. X    .
  609. X    .
  610. X
  611. X    Last line :
  612. X    -6
  613. X
  614. X
  615. END_OF_FILE
  616. if test 9404 -ne `wc -c <'Doc/FORMAT2.0'`; then
  617.     echo shar: \"'Doc/FORMAT2.0'\" unpacked with wrong size!
  618. fi
  619. # end of 'Doc/FORMAT2.0'
  620. fi
  621. if test -f 'd_ellipse.c' -a "${1}" != "-c" ; then 
  622.   echo shar: Will not clobber existing file \"'d_ellipse.c'\"
  623. else
  624. echo shar: Extracting \"'d_ellipse.c'\" \(9065 characters\)
  625. sed "s/^X//" >'d_ellipse.c' <<'END_OF_FILE'
  626. X/*
  627. X * FIG : Facility for Interactive Generation of figures
  628. X * Copyright (c) 1985 by Supoj Sutanthavibul
  629. X *
  630. X * "Permission to use, copy, modify, distribute, and sell this software and its
  631. X * documentation for any purpose is hereby granted without fee, provided that
  632. X * the above copyright notice appear in all copies and that both that
  633. X * copyright notice and this permission notice appear in supporting
  634. X * documentation, and that the name of M.I.T. not be used in advertising or
  635. X * publicity pertaining to distribution of the software without specific,
  636. X * written prior permission.  M.I.T. makes no representations about the
  637. X * suitability of this software for any purpose.  It is provided "as is"
  638. X * without express or implied warranty."
  639. X *
  640. X */
  641. X
  642. X#include "fig.h"
  643. X#include "resources.h"
  644. X#include "mode.h"
  645. X#include "object.h"
  646. X#include "paintop.h"
  647. X#include "u_create.h"
  648. X#include "u_elastic.h"
  649. X#include "u_list.h"
  650. X#include "w_canvas.h"
  651. X#include "w_mousefun.h"
  652. X
  653. X/*************************  local procedures  ********************/
  654. X
  655. Xstatic int    init_ellipsebyradius_drawing();
  656. Xstatic int    init_ellipsebydiameter_drawing();
  657. Xstatic int    init_circlebyradius_drawing();
  658. Xstatic int    init_circlebydiameter_drawing();
  659. Xstatic int    create_ellipsebydia();
  660. Xstatic int    create_ellipsebyrad();
  661. Xstatic int    create_circlebyrad();
  662. Xstatic int    create_circlebydia();
  663. Xstatic int    cancel_ellipsebydia();
  664. Xstatic int    cancel_ellipsebyrad();
  665. Xstatic int    cancel_circlebyrad();
  666. Xstatic int    cancel_circlebydia();
  667. X
  668. Xellipsebyradius_drawing_selected()
  669. X{
  670. X    canvas_kbd_proc = null_proc;
  671. X    canvas_locmove_proc = null_proc;
  672. X    canvas_leftbut_proc = init_ellipsebyradius_drawing;
  673. X    canvas_middlebut_proc = null_proc;
  674. X    canvas_rightbut_proc = null_proc;
  675. X    set_cursor(arrow_cursor);
  676. X    set_mousefun("center point", "", "");
  677. X    reset_action_on();
  678. X}
  679. X
  680. Xstatic
  681. Xinit_ellipsebyradius_drawing(x, y)
  682. X    int            x, y;
  683. X{
  684. X    cur_x = fix_x = x;
  685. X    cur_y = fix_y = y;
  686. X    center_marker(fix_x, fix_y);
  687. X    set_mousefun("corner point", "", "cancel");
  688. X    draw_mousefun_canvas();
  689. X    canvas_locmove_proc = resizing_ebr;
  690. X    canvas_rightbut_proc = cancel_ellipsebyrad;
  691. X    canvas_leftbut_proc = create_ellipsebyrad;
  692. X    set_temp_cursor(null_cursor);
  693. X    elastic_ebr();
  694. X    set_action_on();
  695. X}
  696. X
  697. Xstatic
  698. Xcancel_ellipsebyrad()
  699. X{
  700. X    elastic_ebr();
  701. X    center_marker(fix_x, fix_y);
  702. X    ellipsebyradius_drawing_selected();
  703. X    draw_mousefun_canvas();
  704. X}
  705. X
  706. Xstatic
  707. Xcreate_ellipsebyrad(x, y)
  708. X    int            x, y;
  709. X{
  710. X    F_ellipse       *ellipse;
  711. X
  712. X    elastic_ebr();
  713. X    center_marker(fix_x, fix_y);
  714. X    if ((ellipse = create_ellipse()) == NULL)
  715. X    return;
  716. X
  717. X    ellipse->type = T_ELLIPSE_BY_RAD;
  718. X    ellipse->style = cur_linestyle;
  719. X    ellipse->thickness = cur_linewidth;
  720. X    ellipse->style_val = cur_styleval * (cur_linewidth + 1) / 2;
  721. X    ellipse->angle = cur_angle;
  722. X    ellipse->color = cur_color;
  723. X    ellipse->depth = 0;
  724. X    ellipse->pen = 0;
  725. X    ellipse->fill_style = cur_fillstyle;
  726. X    ellipse->direction = 1;
  727. X    ellipse->center.x = fix_x;
  728. X    ellipse->center.y = fix_y;
  729. X    ellipse->radiuses.x = abs(x - fix_x) + 1;
  730. X    ellipse->radiuses.y = abs(y - fix_y) + 1;
  731. X    ellipse->start.x = fix_x;
  732. X    ellipse->start.y = fix_y;
  733. X    ellipse->end.x = x;
  734. X    ellipse->end.y = y;
  735. X    ellipse->next = NULL;
  736. X    draw_ellipse(ellipse, PAINT);
  737. X    add_ellipse(ellipse);
  738. X    ellipsebyradius_drawing_selected();
  739. X    draw_mousefun_canvas();
  740. X}
  741. X
  742. Xellipsebydiameter_drawing_selected()
  743. X{
  744. X    set_mousefun("first corner", "", "");
  745. X    canvas_kbd_proc = null_proc;
  746. X    canvas_locmove_proc = null_proc;
  747. X    canvas_leftbut_proc = init_ellipsebydiameter_drawing;
  748. X    canvas_middlebut_proc = null_proc;
  749. X    canvas_rightbut_proc = null_proc;
  750. X    set_cursor(arrow_cursor);
  751. X    reset_action_on();
  752. X}
  753. X
  754. Xstatic
  755. Xinit_ellipsebydiameter_drawing(x, y)
  756. X    int            x, y;
  757. X{
  758. X    cur_x = fix_x = x;
  759. X    cur_y = fix_y = y;
  760. X    center_marker(fix_x, fix_y);
  761. X    set_mousefun("final corner", "", "cancel");
  762. X    draw_mousefun_canvas();
  763. X    canvas_locmove_proc = resizing_ebd;
  764. X    canvas_rightbut_proc = cancel_ellipsebydia;
  765. X    canvas_leftbut_proc = create_ellipsebydia;
  766. X    set_temp_cursor(null_cursor);
  767. X    elastic_ebd();
  768. X    set_action_on();
  769. X}
  770. X
  771. Xstatic
  772. Xcancel_ellipsebydia()
  773. X{
  774. X    elastic_ebd();
  775. X    center_marker(fix_x, fix_y);
  776. X    ellipsebydiameter_drawing_selected();
  777. X    draw_mousefun_canvas();
  778. X}
  779. X
  780. Xstatic
  781. Xcreate_ellipsebydia(x, y)
  782. X    int            x, y;
  783. X{
  784. X    F_ellipse       *ellipse;
  785. X
  786. X    elastic_ebd();
  787. X    center_marker(fix_x, fix_y);
  788. X    if ((ellipse = create_ellipse()) == NULL)
  789. X    return;
  790. X
  791. X    ellipse->type = T_ELLIPSE_BY_DIA;
  792. X    ellipse->style = cur_linestyle;
  793. X    ellipse->thickness = cur_linewidth;
  794. X    ellipse->style_val = cur_styleval * (cur_linewidth + 1) / 2;
  795. X    ellipse->angle = cur_angle;
  796. X    ellipse->color = cur_color;
  797. X    ellipse->depth = 0;
  798. X    ellipse->pen = NULL;
  799. X    ellipse->fill_style = cur_fillstyle;
  800. X    ellipse->direction = 1;
  801. X    ellipse->center.x = (fix_x + x) / 2;
  802. X    ellipse->center.y = (fix_y + y) / 2;
  803. X    ellipse->radiuses.x = abs(ellipse->center.x - fix_x);
  804. X    ellipse->radiuses.y = abs(ellipse->center.y - fix_y);
  805. X    ellipse->start.x = fix_x;
  806. X    ellipse->start.y = fix_y;
  807. X    ellipse->end.x = x;
  808. X    ellipse->end.y = y;
  809. X    ellipse->next = NULL;
  810. X    draw_ellipse(ellipse, PAINT);
  811. X    add_ellipse(ellipse);
  812. X    ellipsebydiameter_drawing_selected();
  813. X    draw_mousefun_canvas();
  814. X}
  815. X
  816. X/***************************  circle  section  ************************/
  817. X
  818. Xcirclebyradius_drawing_selected()
  819. X{
  820. X    set_mousefun("center point", "", "");
  821. X    canvas_kbd_proc = null_proc;
  822. X    canvas_locmove_proc = null_proc;
  823. X    canvas_leftbut_proc = init_circlebyradius_drawing;
  824. X    canvas_middlebut_proc = null_proc;
  825. X    canvas_rightbut_proc = null_proc;
  826. X    set_cursor(arrow_cursor);
  827. X    reset_action_on();
  828. X}
  829. X
  830. Xstatic
  831. Xinit_circlebyradius_drawing(x, y)
  832. X    int            x, y;
  833. X{
  834. X    cur_x = fix_x = x;
  835. X    cur_y = fix_y = y;
  836. X    center_marker(fix_x, fix_y);
  837. X    set_mousefun("set radius", "", "cancel");
  838. X    draw_mousefun_canvas();
  839. X    canvas_locmove_proc = resizing_cbr;
  840. X    canvas_rightbut_proc = cancel_circlebyrad;
  841. X    canvas_leftbut_proc = create_circlebyrad;
  842. X    set_temp_cursor(null_cursor);
  843. X    elastic_cbr();
  844. X    set_action_on();
  845. X}
  846. X
  847. Xstatic
  848. Xcancel_circlebyrad()
  849. X{
  850. X    elastic_cbr();
  851. X    center_marker(fix_x, fix_y);
  852. X    circlebyradius_drawing_selected();
  853. X    draw_mousefun_canvas();
  854. X}
  855. X
  856. Xstatic
  857. Xcreate_circlebyrad(x, y)
  858. X    int            x, y;
  859. X{
  860. X    F_ellipse       *c;
  861. X    int            rx, ry;
  862. X
  863. X    elastic_cbr();
  864. X    center_marker(fix_x, fix_y);
  865. X    if ((c = create_ellipse()) == NULL)
  866. X    return;
  867. X
  868. X    c->type = T_CIRCLE_BY_RAD;
  869. X    c->style = cur_linestyle;
  870. X    c->thickness = cur_linewidth;
  871. X    c->style_val = cur_styleval * (cur_linewidth + 1) / 2;
  872. X    c->angle = 0.0;
  873. X    c->color = cur_color;
  874. X    c->depth = 0;
  875. X    c->pen = NULL;
  876. X    c->fill_style = cur_fillstyle;
  877. X    c->direction = 1;
  878. X    c->center.x = fix_x;
  879. X    c->center.y = fix_y;
  880. X    rx = fix_x - x;
  881. X    ry = fix_y - y;
  882. X    c->radiuses.x = c->radiuses.y = round(sqrt((double) (rx * rx + ry * ry)));
  883. X    c->start.x = fix_x;
  884. X    c->start.y = fix_y;
  885. X    c->end.x = fix_x + c->radiuses.x;
  886. X    c->end.y = fix_y + c->radiuses.y;
  887. X    c->next = NULL;
  888. X    draw_ellipse(c, PAINT);
  889. X    add_ellipse(c);
  890. X    circlebyradius_drawing_selected();
  891. X    draw_mousefun_canvas();
  892. X}
  893. X
  894. Xcirclebydiameter_drawing_selected()
  895. X{
  896. X    set_mousefun("diameter point", "", "");
  897. X    canvas_kbd_proc = null_proc;
  898. X    canvas_locmove_proc = null_proc;
  899. X    canvas_leftbut_proc = init_circlebydiameter_drawing;
  900. X    canvas_middlebut_proc = null_proc;
  901. X    canvas_rightbut_proc = null_proc;
  902. X    set_cursor(arrow_cursor);
  903. X    reset_action_on();
  904. X}
  905. X
  906. Xstatic
  907. Xinit_circlebydiameter_drawing(x, y)
  908. X    int            x, y;
  909. X{
  910. X    cur_x = fix_x = x;
  911. X    cur_y = fix_y = y;
  912. X    center_marker(fix_x, fix_y);
  913. X    set_mousefun("final point", "", "cancel");
  914. X    draw_mousefun_canvas();
  915. X    canvas_locmove_proc = resizing_cbd;
  916. X    canvas_leftbut_proc = create_circlebydia;
  917. X    canvas_rightbut_proc = cancel_circlebydia;
  918. X    set_temp_cursor(null_cursor);
  919. X    elastic_cbd();
  920. X    set_action_on();
  921. X}
  922. X
  923. Xstatic
  924. Xcancel_circlebydia()
  925. X{
  926. X    elastic_cbd();
  927. X    center_marker(fix_x, fix_y);
  928. X    circlebydiameter_drawing_selected();
  929. X    draw_mousefun_canvas();
  930. X}
  931. X
  932. Xstatic
  933. Xcreate_circlebydia(x, y)
  934. X    int            x, y;
  935. X{
  936. X    F_ellipse       *c;
  937. X    int            rx, ry;
  938. X
  939. X    elastic_cbd();
  940. X    center_marker(fix_x, fix_y);
  941. X    if ((c = create_ellipse()) == NULL)
  942. X    return;
  943. X
  944. X    c->type = T_CIRCLE_BY_DIA;
  945. X    c->style = cur_linestyle;
  946. X    c->thickness = cur_linewidth;
  947. X    c->style_val = cur_styleval * (cur_linewidth + 1) / 2;
  948. X    c->angle = 0.0;
  949. X    c->color = cur_color;
  950. X    c->depth = 0;
  951. X    c->pen = NULL;
  952. X    c->fill_style = cur_fillstyle;
  953. X    c->direction = 1;
  954. X    c->center.x = (fix_x + x) / 2 + .5;
  955. X    c->center.y = (fix_y + y) / 2 + .5;
  956. X    rx = x - c->center.x;
  957. X    ry = y - c->center.y;
  958. X    c->radiuses.x = c->radiuses.y = round(sqrt((double) (rx * rx + ry * ry)));
  959. X    c->start.x = fix_x;
  960. X    c->start.y = fix_y;
  961. X    c->end.x = x;
  962. X    c->end.y = y;
  963. X    c->next = NULL;
  964. X    draw_ellipse(c, PAINT);
  965. X    add_ellipse(c);
  966. X    circlebydiameter_drawing_selected();
  967. X    draw_mousefun_canvas();
  968. X}
  969. END_OF_FILE
  970. if test 9065 -ne `wc -c <'d_ellipse.c'`; then
  971.     echo shar: \"'d_ellipse.c'\" unpacked with wrong size!
  972. fi
  973. # end of 'd_ellipse.c'
  974. fi
  975. if test -f 'e_addpt.c' -a "${1}" != "-c" ; then 
  976.   echo shar: Will not clobber existing file \"'e_addpt.c'\"
  977. else
  978. echo shar: Extracting \"'e_addpt.c'\" \(8363 characters\)
  979. sed "s/^X//" >'e_addpt.c' <<'END_OF_FILE'
  980. X/*
  981. X * FIG : Facility for Interactive Generation of figures
  982. X * Copyright (c) 1985 by Supoj Sutanthavibul
  983. X *
  984. X * "Permission to use, copy, modify, distribute, and sell this software and its
  985. X * documentation for any purpose is hereby granted without fee, provided that
  986. X * the above copyright notice appear in all copies and that both that
  987. X * copyright notice and this permission notice appear in supporting
  988. X * documentation, and that the name of M.I.T. not be used in advertising or
  989. X * publicity pertaining to distribution of the software without specific,
  990. X * written prior permission.  M.I.T. makes no representations about the
  991. X * suitability of this software for any purpose.  It is provided "as is"
  992. X * without express or implied warranty."
  993. X *
  994. X */
  995. X
  996. X#include "fig.h"
  997. X#include "resources.h"
  998. X#include "mode.h"
  999. X#include "object.h"
  1000. X#include "paintop.h"
  1001. X#include "u_create.h"
  1002. X#include "u_elastic.h"
  1003. X#include "u_search.h"
  1004. X#include "w_canvas.h"
  1005. X#include "w_mousefun.h"
  1006. Xextern void    force_positioning();
  1007. Xextern void    force_nopositioning();
  1008. X
  1009. Xstatic int    init_point_adding();
  1010. Xstatic int    fix_linepoint_adding();
  1011. Xstatic int    mm_fix_linepoint_adding();
  1012. Xstatic int    fix_splinepoint_adding();
  1013. Xstatic int    init_splinepointadding();
  1014. Xstatic int    init_linepointadding();
  1015. Xstatic int    find_endpoints();
  1016. X
  1017. Xpoint_adding_selected()
  1018. X{
  1019. X    set_mousefun("break/add here", "", "");
  1020. X    canvas_kbd_proc = null_proc;
  1021. X    canvas_locmove_proc = null_proc;
  1022. X    init_searchproc_left(init_point_adding);
  1023. X    canvas_leftbut_proc = object_search_left;
  1024. X    canvas_middlebut_proc = null_proc;
  1025. X    canvas_rightbut_proc = null_proc;
  1026. X    set_cursor(pick9_cursor);
  1027. X    force_nopositioning();
  1028. X    constrained = MOVE_ARB;
  1029. X}
  1030. X
  1031. Xstatic int
  1032. Xinit_point_adding(p, type, x, y, px, py)
  1033. X    char       *p;
  1034. X    int            type;
  1035. X    int            x, y;
  1036. X    int            px, py;
  1037. X{
  1038. X    switch (type) {
  1039. X    case O_POLYLINE:
  1040. X    cur_l = (F_line *) p;
  1041. X    /* the search routine will ensure that we don't have a box */
  1042. X    init_linepointadding(px, py);
  1043. X    break;
  1044. X    case O_SPLINE:
  1045. X    cur_s = (F_spline *) p;
  1046. X    init_splinepointadding(px, py);
  1047. X    break;
  1048. X    default:
  1049. X    return;
  1050. X    }
  1051. X    force_positioning();
  1052. X}
  1053. X
  1054. Xstatic
  1055. Xwrapup_pointadding()
  1056. X{
  1057. X    reset_action_on();
  1058. X    point_adding_selected();
  1059. X    draw_mousefun_canvas();
  1060. X}
  1061. X
  1062. Xstatic
  1063. Xcancel_pointadding()
  1064. X{
  1065. X    elastic_linelink();
  1066. X    wrapup_pointadding();
  1067. X}
  1068. X
  1069. Xstatic
  1070. Xcancel_line_pointadding()
  1071. X{
  1072. X    if (left_point != NULL && right_point != NULL)
  1073. X    pw_vector(canvas_win, left_point->x, left_point->y,
  1074. X          right_point->x, right_point->y, INV_PAINT,
  1075. X          cur_l->thickness, cur_l->style, cur_l->style_val,
  1076. X          cur_l->color);
  1077. X    cancel_pointadding();
  1078. X}
  1079. X
  1080. X/**************************  spline  *******************************/
  1081. X
  1082. Xstatic int
  1083. Xinit_splinepointadding(px, py)
  1084. X    int            px, py;
  1085. X{
  1086. X    set_action_on();
  1087. X    set_mousefun("place new point", "", "cancel");
  1088. X    draw_mousefun_canvas();
  1089. X    find_endpoints(cur_s->points, px, py, &left_point, &right_point);
  1090. X    set_temp_cursor(null_cursor);
  1091. X    cur_x = px;
  1092. X    cur_y = py;
  1093. X    if (left_point == NULL && closed_spline(cur_s)) {
  1094. X    /* The added_point is between the 1st and 2nd point. */
  1095. X    left_point = right_point;
  1096. X    right_point = right_point->next;
  1097. X    }
  1098. X    elastic_linelink();
  1099. X    canvas_locmove_proc = extending_line;
  1100. X    canvas_leftbut_proc = fix_splinepoint_adding;
  1101. X    canvas_rightbut_proc = cancel_pointadding;;
  1102. X}
  1103. X
  1104. Xstatic
  1105. Xfix_splinepoint_adding(x, y)
  1106. X    int            x, y;
  1107. X{
  1108. X    F_point       *p;
  1109. X
  1110. X    if ((p = create_point()) == NULL) {
  1111. X    wrapup_pointadding();
  1112. X    return;
  1113. X    }
  1114. X    p->x = x;
  1115. X    p->y = y;
  1116. X    elastic_linelink();
  1117. X    splinepoint_adding(cur_s, left_point, p, right_point);
  1118. X    wrapup_pointadding();
  1119. X}
  1120. X
  1121. X/*
  1122. X * Added_point is always inserted between left_point and
  1123. X * right_point, except in two cases. (1) left_point is NULL, the added_point
  1124. X * will be prepended to the list of points. This case will never occur if the
  1125. X * spline is closed (periodic). (2) right_point is NULL, the added_point will
  1126. X * be appended to the end of the list.
  1127. X */
  1128. X
  1129. Xsplinepoint_adding(spline, left_point, added_point, right_point)
  1130. X    F_spline       *spline;
  1131. X    F_point       *left_point, *added_point, *right_point;
  1132. X{
  1133. X    F_control       *c;
  1134. X
  1135. X    if (int_spline(spline)) {    /* Interpolated spline */
  1136. X    if ((c = create_cpoint()) == NULL)
  1137. X        return;
  1138. X    }
  1139. X    set_temp_cursor(wait_cursor);
  1140. X    mask_toggle_splinemarker(spline);
  1141. X    draw_spline(spline, ERASE); /* erase old spline */
  1142. X    if (left_point == NULL) {
  1143. X    added_point->next = spline->points;
  1144. X    spline->points = added_point;
  1145. X    } else {
  1146. X    added_point->next = right_point;
  1147. X    left_point->next = added_point;
  1148. X    }
  1149. X
  1150. X    if (int_spline(spline)) {    /* Interpolated spline */
  1151. X    c->next = spline->controls;
  1152. X    spline->controls = c;
  1153. X    remake_control_points(spline);
  1154. X    }
  1155. X    draw_spline(spline, PAINT); /* draw the modified spline */
  1156. X    mask_toggle_splinemarker(spline);
  1157. X    clean_up();
  1158. X    set_modifiedflag();
  1159. X    set_last_prevpoint(left_point);
  1160. X    set_last_selectedpoint(added_point);
  1161. X    set_action_object(F_ADD_POINT, O_SPLINE);
  1162. X    set_latestspline(spline);
  1163. X    reset_cursor();
  1164. X}
  1165. X
  1166. X/***************************  line  ********************************/
  1167. X
  1168. Xstatic int
  1169. Xinit_linepointadding(px, py)
  1170. X    int            px, py;
  1171. X{
  1172. X    set_action_on();
  1173. X    set_mousefun("place new point", "", "cancel");
  1174. X    draw_mousefun_canvas();
  1175. X    find_endpoints(cur_l->points, px, py, &left_point, &right_point);
  1176. X    set_temp_cursor(null_cursor);
  1177. X    win_setmouseposition(canvas_win, px, py);
  1178. X
  1179. X    /* set cur_x etc at new point coords */
  1180. X    cur_x = fix_x = px;
  1181. X    cur_y = fix_y = py;
  1182. X    if (left_point == NULL && cur_l->type == T_POLYGON) {
  1183. X    left_point = right_point;
  1184. X    right_point = right_point->next;
  1185. X    }
  1186. X    /* erase line segment where new point is */
  1187. X    if (left_point != NULL && right_point != NULL)
  1188. X    pw_vector(canvas_win, left_point->x, left_point->y,
  1189. X          right_point->x, right_point->y, ERASE,
  1190. X          cur_l->thickness, cur_l->style, cur_l->style_val,
  1191. X          cur_l->color);
  1192. X
  1193. X    /* draw in rubber-band line */
  1194. X    elastic_linelink();
  1195. X    if (latexline_mode || latexarrow_mode) {
  1196. X    canvas_locmove_proc = latex_line;
  1197. X    canvas_leftbut_proc = mm_fix_linepoint_adding;
  1198. X    }
  1199. X    if ((mountain_mode || manhattan_mode) &&
  1200. X    (left_point == NULL || right_point == NULL)) {
  1201. X    canvas_locmove_proc = constrainedangle_line;
  1202. X    canvas_leftbut_proc = mm_fix_linepoint_adding;
  1203. X    } else {
  1204. X    canvas_locmove_proc = reshaping_line;
  1205. X    canvas_leftbut_proc = fix_linepoint_adding;
  1206. X    }
  1207. X    canvas_rightbut_proc = cancel_line_pointadding;;
  1208. X}
  1209. X
  1210. Xstatic
  1211. Xfix_linepoint_adding(x, y)
  1212. X    int            x, y;
  1213. X{
  1214. X    F_point       *p;
  1215. X
  1216. X    if ((p = create_point()) == NULL) {
  1217. X    wrapup_pointadding();
  1218. X    return;
  1219. X    }
  1220. X    p->x = x;
  1221. X    p->y = y;
  1222. X    elastic_linelink();
  1223. X    linepoint_adding(cur_l, left_point, p, right_point);
  1224. X    wrapup_pointadding();
  1225. X}
  1226. X
  1227. Xstatic
  1228. Xmm_fix_linepoint_adding()
  1229. X{
  1230. X    F_point       *p;
  1231. X
  1232. X    if ((p = create_point()) == NULL) {
  1233. X    wrapup_pointadding();
  1234. X    return;
  1235. X    }
  1236. X    p->x = cur_x;
  1237. X    p->y = cur_y;
  1238. X    elastic_linelink();
  1239. X    linepoint_adding(cur_l, left_point, p, right_point);
  1240. X    wrapup_pointadding();
  1241. X}
  1242. X
  1243. Xlinepoint_adding(line, left_point, added_point, right_point)
  1244. X    F_line       *line;
  1245. X    F_point       *left_point, *added_point, *right_point;
  1246. X{
  1247. X    mask_toggle_linemarker(line);
  1248. X    draw_line(line, ERASE);
  1249. X    if (left_point == NULL) {
  1250. X    added_point->next = line->points;
  1251. X    line->points = added_point;
  1252. X    } else {
  1253. X    added_point->next = left_point->next;
  1254. X    left_point->next = added_point;
  1255. X    }
  1256. X    draw_line(line, PAINT);
  1257. X    clean_up();
  1258. X    mask_toggle_linemarker(line);
  1259. X    set_action_object(F_ADD_POINT, O_POLYLINE);
  1260. X    set_latestline(line);
  1261. X    set_last_prevpoint(left_point);
  1262. X    set_last_selectedpoint(added_point);
  1263. X    set_modifiedflag();
  1264. X}
  1265. X
  1266. X/*******************************************************************/
  1267. X
  1268. X/*
  1269. X * If (x,y) is close to a point, q, fp points to q and sp points to q->next
  1270. X * (right).  However if q is the first point, fp contains NULL and sp points
  1271. X * to q.
  1272. X */
  1273. X
  1274. Xstatic int
  1275. Xfind_endpoints(p, x, y, fp, sp)
  1276. X    F_point       *p, **fp, **sp;
  1277. X    int            x, y;
  1278. X{
  1279. X    int            d;
  1280. X    F_point       *a = NULL, *b = p;
  1281. X
  1282. X    if (x == b->x && y == b->y) {
  1283. X    *fp = a;
  1284. X    *sp = b;
  1285. X    return;
  1286. X    }
  1287. X    for (a = p, b = p->next; b != NULL; a = b, b = b->next) {
  1288. X    if (x == b->x && y == b->y) {
  1289. X        *fp = b;
  1290. X        *sp = b->next;
  1291. X        return;
  1292. X    }
  1293. X    if (close_to_vector(a->x, a->y, b->x, b->y, x, y, 1, 1.0, &d, &d)) {
  1294. X        *fp = a;
  1295. X        *sp = b;
  1296. X        return;
  1297. X    }
  1298. X    }
  1299. X    *fp = a;
  1300. X    *sp = b;
  1301. X}
  1302. END_OF_FILE
  1303. if test 8363 -ne `wc -c <'e_addpt.c'`; then
  1304.     echo shar: \"'e_addpt.c'\" unpacked with wrong size!
  1305. fi
  1306. # end of 'e_addpt.c'
  1307. fi
  1308. if test -f 'e_delete.c' -a "${1}" != "-c" ; then 
  1309.   echo shar: Will not clobber existing file \"'e_delete.c'\"
  1310. else
  1311. echo shar: Extracting \"'e_delete.c'\" \(6252 characters\)
  1312. sed "s/^X//" >'e_delete.c' <<'END_OF_FILE'
  1313. X/*
  1314. X * FIG : Facility for Interactive Generation of figures
  1315. X * Copyright (c) 1985 by Supoj Sutanthavibul
  1316. X *
  1317. X * "Permission to use, copy, modify, distribute, and sell this software and its
  1318. X * documentation for any purpose is hereby granted without fee, provided that
  1319. X * the above copyright notice appear in all copies and that both that
  1320. X * copyright notice and this permission notice appear in supporting
  1321. X * documentation, and that the name of M.I.T. not be used in advertising or
  1322. X * publicity pertaining to distribution of the software without specific,
  1323. X * written prior permission.  M.I.T. makes no representations about the
  1324. X * suitability of this software for any purpose.  It is provided "as is"
  1325. X * without express or implied warranty."
  1326. X *
  1327. X */
  1328. X
  1329. X#include "fig.h"
  1330. X#include "resources.h"
  1331. X#include "mode.h"
  1332. X#include "object.h"
  1333. X#include "paintop.h"
  1334. X#include "u_create.h"
  1335. X#include "u_draw.h"
  1336. X#include "u_elastic.h"
  1337. X#include "u_search.h"
  1338. X#include "u_list.h"
  1339. X#include "u_undo.h"
  1340. X#include "w_canvas.h"
  1341. X#include "w_mousefun.h"
  1342. X#include "w_setup.h"
  1343. X
  1344. Xstatic int    init_delete();
  1345. Xstatic int    init_delete_region(), delete_region(), cancel_delete_region();
  1346. Xstatic int    init_delete_to_scrap();
  1347. X
  1348. Xdelete_selected()
  1349. X{
  1350. X    set_mousefun("delete object", "delete region", "del to cut buf");
  1351. X    canvas_kbd_proc = null_proc;
  1352. X    canvas_locmove_proc = null_proc;
  1353. X    init_searchproc_left(init_delete);
  1354. X    init_searchproc_right(init_delete_to_scrap);
  1355. X    canvas_leftbut_proc = object_search_left;
  1356. X    canvas_rightbut_proc = object_search_right;
  1357. X    canvas_middlebut_proc = init_delete_region;
  1358. X    set_cursor(buster_cursor);
  1359. X    reset_action_on();
  1360. X}
  1361. X
  1362. Xstatic
  1363. Xinit_delete(p, type, x, y, px, py)
  1364. X    char       *p;
  1365. X    int            type;
  1366. X    int            x, y;
  1367. X    int            px, py;
  1368. X{
  1369. X    switch (type) {
  1370. X    case O_COMPOUND:
  1371. X    cur_c = (F_compound *) p;
  1372. X    delete_compound(cur_c);
  1373. X    redisplay_compound(cur_c);
  1374. X    break;
  1375. X    case O_POLYLINE:
  1376. X    cur_l = (F_line *) p;
  1377. X    delete_line(cur_l);
  1378. X    redisplay_line(cur_l);
  1379. X    break;
  1380. X    case O_TEXT:
  1381. X    cur_t = (F_text *) p;
  1382. X    delete_text(cur_t);
  1383. X    redisplay_text(cur_t);
  1384. X    break;
  1385. X    case O_ELLIPSE:
  1386. X    cur_e = (F_ellipse *) p;
  1387. X    delete_ellipse(cur_e);
  1388. X    redisplay_ellipse(cur_e);
  1389. X    break;
  1390. X    case O_ARC:
  1391. X    cur_a = (F_arc *) p;
  1392. X    delete_arc(cur_a);
  1393. X    redisplay_arc(cur_a);
  1394. X    break;
  1395. X    case O_SPLINE:
  1396. X    cur_s = (F_spline *) p;
  1397. X    delete_spline(cur_s);
  1398. X    redisplay_spline(cur_s);
  1399. X    break;
  1400. X    default:
  1401. X    return;
  1402. X    }
  1403. X}
  1404. X
  1405. Xstatic
  1406. Xinit_delete_region(x, y)
  1407. X    int            x, y;
  1408. X{
  1409. X    init_box_drawing(x, y);
  1410. X    set_mousefun("", "final corner", "cancel");
  1411. X    draw_mousefun_canvas();
  1412. X    canvas_leftbut_proc = null_proc;
  1413. X    canvas_middlebut_proc = delete_region;
  1414. X    canvas_rightbut_proc = cancel_delete_region;
  1415. X}
  1416. X
  1417. Xstatic
  1418. Xcancel_delete_region()
  1419. X{
  1420. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  1421. X    delete_selected();
  1422. X    draw_mousefun_canvas();
  1423. X}
  1424. X
  1425. Xstatic
  1426. Xdelete_region(x, y)
  1427. X    int            x, y;
  1428. X{
  1429. X    F_compound       *c;
  1430. X
  1431. X    if ((c = create_compound()) == NULL)
  1432. X    return;
  1433. X
  1434. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  1435. X    c->nwcorner.x = min2(fix_x, x);
  1436. X    c->nwcorner.y = min2(fix_y, y);
  1437. X    c->secorner.x = max2(fix_x, x);
  1438. X    c->secorner.y = max2(fix_y, y);
  1439. X    tag_obj_in_region(c->nwcorner.x,c->nwcorner.y,c->secorner.x,c->secorner.y);
  1440. X    if (compose_compound(c) == 0) {
  1441. X    free((char *) c);
  1442. X    delete_selected();
  1443. X    draw_mousefun_canvas();
  1444. X    put_msg("Empty region, figure unchanged");
  1445. X    return;
  1446. X    }
  1447. X    clean_up();
  1448. X    toggle_markers_in_compound(c);
  1449. X    set_tags(c,0);
  1450. X    set_latestobjects(c);
  1451. X    tail(&objects, &object_tails);
  1452. X    append_objects(&objects, &saved_objects, &object_tails);
  1453. X    cut_objects(&objects, &object_tails);
  1454. X    set_action_object(F_DELETE, O_ALL_OBJECT);
  1455. X    set_modifiedflag();
  1456. X    redisplay_compound(c);
  1457. X    delete_selected();
  1458. X    draw_mousefun_canvas();
  1459. X}
  1460. X
  1461. Xstatic
  1462. Xinit_delete_to_scrap(p, type, x, y, px, py)
  1463. X    char       *p;
  1464. X    int            type;
  1465. X    int            x, y;
  1466. X    int            px, py;
  1467. X{
  1468. X    extern char        cut_buf_name[];
  1469. X    extern char        file_header[];
  1470. X
  1471. X    FILE       *fp;
  1472. X    struct stat        file_status;
  1473. X
  1474. X    if (stat(cut_buf_name, &file_status) == 0) {    /* file exists */
  1475. X    if (file_status.st_mode & S_IFDIR) {
  1476. X        put_msg("Error: \"%s\" is a directory", cut_buf_name);
  1477. X        return;
  1478. X    }
  1479. X    if (file_status.st_mode & S_IWRITE) {    /* writing is permitted */
  1480. X        if (file_status.st_uid != geteuid()) {
  1481. X        put_msg("Error: access denied to cut file");
  1482. X        return;
  1483. X        }
  1484. X    } else {
  1485. X        put_msg("Error: cut file is read only");
  1486. X        return;
  1487. X    }
  1488. X    } else if (errno != ENOENT) {
  1489. X    put_msg("Error: cut file didn't pass stat check");
  1490. X    return;            /* file does exist but stat fails */
  1491. X    }
  1492. X    if ((fp = fopen(cut_buf_name, "w")) == NULL) {
  1493. X    put_msg("Error: couldn't open cut file %s", sys_errlist[errno]);
  1494. X    return;
  1495. X    } else {
  1496. X    (void) fprintf(fp, "%s\n", file_header);
  1497. X    (void) fprintf(fp, "%d %d\n", PIX_PER_INCH, 2);
  1498. X    }
  1499. X
  1500. X    switch (type) {
  1501. X    case O_COMPOUND:
  1502. X    cur_c = (F_compound *) p;
  1503. X    write_compound(fp, cur_c);
  1504. X    delete_compound(cur_c);
  1505. X    redisplay_compound(cur_c);
  1506. X    break;
  1507. X    case O_POLYLINE:
  1508. X    cur_l = (F_line *) p;
  1509. X    write_line(fp, cur_l);
  1510. X    delete_line(cur_l);
  1511. X    redisplay_line(cur_l);
  1512. X    break;
  1513. X    case O_TEXT:
  1514. X    cur_t = (F_text *) p;
  1515. X    write_text(fp, cur_t);
  1516. X    delete_text(cur_t);
  1517. X    redisplay_text(cur_t);
  1518. X    break;
  1519. X    case O_ELLIPSE:
  1520. X    cur_e = (F_ellipse *) p;
  1521. X    write_ellipse(fp, cur_e);
  1522. X    delete_ellipse(cur_e);
  1523. X    redisplay_ellipse(cur_e);
  1524. X    break;
  1525. X    case O_ARC:
  1526. X    cur_a = (F_arc *) p;
  1527. X    write_arc(fp, cur_a);
  1528. X    delete_arc(cur_a);
  1529. X    redisplay_arc(cur_a);
  1530. X    break;
  1531. X    case O_SPLINE:
  1532. X    cur_s = (F_spline *) p;
  1533. X    write_spline(fp, cur_s);
  1534. X    delete_spline(cur_s);
  1535. X    redisplay_spline(cur_s);
  1536. X    break;
  1537. X    default:
  1538. X    fclose(fp);
  1539. X    return;
  1540. X    }
  1541. X    put_msg("Object deleted to scrap");
  1542. X    fclose(fp);
  1543. X}
  1544. X
  1545. Xdelete_all()
  1546. X{
  1547. X    clean_up();
  1548. X    set_action_object(F_DELETE, O_ALL_OBJECT);
  1549. X
  1550. X    /*
  1551. X     * Aggregate assignment between variables is allowed, but not from
  1552. X     * constant (weird!?)
  1553. X     */
  1554. X
  1555. X    set_latestobjects(&objects);
  1556. X
  1557. X    objects.arcs = NULL;
  1558. X    objects.compounds = NULL;
  1559. X    objects.ellipses = NULL;
  1560. X    objects.lines = NULL;
  1561. X    objects.splines = NULL;
  1562. X    objects.texts = NULL;
  1563. X
  1564. X    object_tails.arcs = NULL;
  1565. X    object_tails.compounds = NULL;
  1566. X    object_tails.ellipses = NULL;
  1567. X    object_tails.lines = NULL;
  1568. X    object_tails.splines = NULL;
  1569. X    object_tails.texts = NULL;
  1570. X}
  1571. END_OF_FILE
  1572. if test 6252 -ne `wc -c <'e_delete.c'`; then
  1573.     echo shar: \"'e_delete.c'\" unpacked with wrong size!
  1574. fi
  1575. # end of 'e_delete.c'
  1576. fi
  1577. if test -f 'object.h' -a "${1}" != "-c" ; then 
  1578.   echo shar: Will not clobber existing file \"'object.h'\"
  1579. else
  1580. echo shar: Extracting \"'object.h'\" \(9014 characters\)
  1581. sed "s/^X//" >'object.h' <<'END_OF_FILE'
  1582. X/*
  1583. X * FIG : Facility for Interactive Generation of figures
  1584. X * Copyright (c) 1985 by Supoj Sutanthavibul
  1585. X *
  1586. X * "Permission to use, copy, modify, distribute, and sell this software and its
  1587. X * documentation for any purpose is hereby granted without fee, provided that
  1588. X * the above copyright notice appear in all copies and that both that
  1589. X * copyright notice and this permission notice appear in supporting
  1590. X * documentation, and that the name of M.I.T. not be used in advertising or
  1591. X * publicity pertaining to distribution of the software without specific,
  1592. X * written prior permission.  M.I.T. makes no representations about the
  1593. X * suitability of this software for any purpose.  It is provided "as is"
  1594. X * without express or implied warranty."
  1595. X *
  1596. X */
  1597. X
  1598. X#define        DEFAULT              (-1)
  1599. X#define        SOLID_LINE        0
  1600. X#define        DASH_LINE        1
  1601. X#define        DOTTED_LINE        2
  1602. X#define        RUBBER_LINE        3
  1603. X#define        PANEL_LINE        4
  1604. X
  1605. X#define        Color            long
  1606. X
  1607. X#define        BLACK            0
  1608. X#define        WHITE            7
  1609. X
  1610. Xtypedef struct f_pattern {
  1611. X    int            w, h;
  1612. X    int           *p;
  1613. X}
  1614. X        F_pattern;
  1615. X
  1616. Xtypedef struct f_point {
  1617. X    int            x, y;
  1618. X    struct f_point *next;
  1619. X}
  1620. X        F_point;
  1621. X
  1622. Xtypedef struct f_pos {
  1623. X    int            x, y;
  1624. X}
  1625. X        F_pos;
  1626. X
  1627. Xtypedef struct f_arrow {
  1628. X    int            type;
  1629. X    int            style;
  1630. X    float        thickness;
  1631. X    float        wid;
  1632. X    float        ht;
  1633. X}
  1634. X        F_arrow;
  1635. X
  1636. Xtypedef struct f_ellipse {
  1637. X    int            tagged;
  1638. X    int            type;
  1639. X#define                    T_ELLIPSE_BY_RAD    1
  1640. X#define                    T_ELLIPSE_BY_DIA    2
  1641. X#define                    T_CIRCLE_BY_RAD        3
  1642. X#define                    T_CIRCLE_BY_DIA        4
  1643. X    int            style;
  1644. X    int            thickness;
  1645. X    Color        color;
  1646. X    int            depth;
  1647. X    int            direction;
  1648. X    float        style_val;
  1649. X    float        angle;
  1650. X    int            pen;
  1651. X    int            fill_style;
  1652. X#define                    UNFILLED    0
  1653. X#define                    WHITE_FILL    1
  1654. X#define                    BLACK_FILL    21
  1655. X    struct f_pos    center;
  1656. X    struct f_pos    radiuses;
  1657. X    struct f_pos    start;
  1658. X    struct f_pos    end;
  1659. X    struct f_ellipse *next;
  1660. X}
  1661. X        F_ellipse;
  1662. X
  1663. Xtypedef struct f_arc {
  1664. X    int            tagged;
  1665. X    int            type;
  1666. X#define                    T_3_POINTS_ARC        1
  1667. X    int            style;
  1668. X    int            thickness;
  1669. X    Color        color;
  1670. X    int            depth;
  1671. X    int            pen;
  1672. X    int            fill_style;
  1673. X    float        style_val;
  1674. X    int            direction;
  1675. X    struct f_arrow *for_arrow;
  1676. X    struct f_arrow *back_arrow;
  1677. X    struct {
  1678. X    float        x, y;
  1679. X    }            center;
  1680. X    struct f_pos    point[3];
  1681. X    struct f_arc   *next;
  1682. X}
  1683. X        F_arc;
  1684. X
  1685. X#define        CLOSED_PATH        0
  1686. X#define        OPEN_PATH        1
  1687. X#define        DEF_BOXRADIUS        7
  1688. X#define        DEF_DASHLENGTH        4
  1689. X#define        DEF_DOTGAP        3
  1690. X
  1691. Xtypedef struct f_eps {
  1692. X    char        file[256];
  1693. X    int            flipped;
  1694. X    unsigned char  *bitmap;
  1695. X    float        hw_ratio;
  1696. X    int            size_x, size_y;
  1697. X    struct f_pos    bit_size;
  1698. X    Pixmap        pixmap;
  1699. X    int            pix_rotation, pix_width, pix_height, pix_flipped;
  1700. X}
  1701. X        F_eps;
  1702. X
  1703. Xextern char    EMPTY_EPS[];
  1704. X
  1705. Xtypedef struct f_line {
  1706. X    int            tagged;
  1707. X    int            type;
  1708. X#define                    T_POLYLINE    1
  1709. X#define                    T_BOX        2
  1710. X#define                    T_POLYGON    3
  1711. X#define                    T_ARC_BOX    4
  1712. X#define                    T_EPS_BOX    5
  1713. X    int            style;
  1714. X    int            thickness;
  1715. X    Color        color;
  1716. X    int            depth;
  1717. X    float        style_val;
  1718. X    int            pen;
  1719. X    int            fill_style;
  1720. X    int            radius;    /* corner radius for T_ARC_BOX */
  1721. X    struct f_arrow *for_arrow;
  1722. X    struct f_arrow *back_arrow;
  1723. X    struct f_point *points;
  1724. X    struct f_eps   *eps;
  1725. X    struct f_line  *next;
  1726. X}
  1727. X        F_line;
  1728. X
  1729. Xtypedef struct f_text {
  1730. X    int            tagged;
  1731. X    int            type;
  1732. X#define                    T_LEFT_JUSTIFIED    0
  1733. X#define                    T_CENTER_JUSTIFIED    1
  1734. X#define                    T_RIGHT_JUSTIFIED    2
  1735. X    int            font;
  1736. X    int            size;    /* point size */
  1737. X    Color        color;
  1738. X    int            depth;
  1739. X    float        angle;    /* in radian */
  1740. X
  1741. X    int            flags;
  1742. X#define                    RIGID_TEXT        1
  1743. X#define                    SPECIAL_TEXT        2
  1744. X#define                    PSFONT_TEXT        4
  1745. X#define                    HIDDEN_TEXT        8
  1746. X
  1747. X    int            height;    /* pixels */
  1748. X    int            length;    /* pixels */
  1749. X    int            base_x;
  1750. X    int            base_y;
  1751. X    int            pen;
  1752. X    char       *cstring;
  1753. X    struct f_text  *next;
  1754. X}
  1755. X        F_text;
  1756. X
  1757. X#define MAXFONT(T) (psfont_text(T) ? NUM_PS_FONTS : NUM_LATEX_FONTS)
  1758. X
  1759. X#define        rigid_text(t) \
  1760. X            (t->flags == DEFAULT \
  1761. X                || (t->flags & RIGID_TEXT))
  1762. X
  1763. X#define        special_text(t) \
  1764. X            ((t->flags != DEFAULT \
  1765. X                && (t->flags & SPECIAL_TEXT)))
  1766. X
  1767. X#define        psfont_text(t) \
  1768. X            (t->flags != DEFAULT \
  1769. X                && (t->flags & PSFONT_TEXT))
  1770. X
  1771. X#define        hidden_text(t) \
  1772. X            (t->flags != DEFAULT \
  1773. X                && (t->flags & HIDDEN_TEXT))
  1774. X
  1775. X#define        text_length(t) \
  1776. X            (hidden_text(t) ? hidden_text_length : t->length)
  1777. X
  1778. X#define        using_ps    (cur_textflags & PSFONT_TEXT)
  1779. X
  1780. Xtypedef struct f_control {
  1781. X    float        lx, ly, rx, ry;
  1782. X    struct f_control *next;
  1783. X}
  1784. X        F_control;
  1785. X
  1786. X#define        int_spline(s)        (s->type & 0x2)
  1787. X#define        normal_spline(s)    (!(s->type & 0x2))
  1788. X#define        closed_spline(s)    (s->type & 0x1)
  1789. X#define        open_spline(s)        (!(s->type & 0x1))
  1790. X
  1791. Xtypedef struct f_spline {
  1792. X    int            tagged;
  1793. X    int            type;
  1794. X#define                    T_OPEN_NORMAL    0
  1795. X#define                    T_CLOSED_NORMAL 1
  1796. X#define                    T_OPEN_INTERP    2
  1797. X#define                    T_CLOSED_INTERP 3
  1798. X    int            style;
  1799. X    int            thickness;
  1800. X    Color        color;
  1801. X    int            depth;
  1802. X    float        style_val;
  1803. X    int            pen;
  1804. X    int            fill_style;
  1805. X    struct f_arrow *for_arrow;
  1806. X    struct f_arrow *back_arrow;
  1807. X    /*
  1808. X     * For T_OPEN_NORMAL and T_CLOSED_NORMAL points are control points while
  1809. X     * they are knots for T_OPEN_INTERP and T_CLOSED_INTERP whose control
  1810. X     * points are stored in controls.
  1811. X     */
  1812. X    struct f_point *points;
  1813. X    struct f_control *controls;
  1814. X    struct f_spline *next;
  1815. X}
  1816. X        F_spline;
  1817. X
  1818. Xtypedef struct f_compound {
  1819. X    int            tagged;
  1820. X    struct f_pos    nwcorner;
  1821. X    struct f_pos    secorner;
  1822. X    struct f_line  *lines;
  1823. X    struct f_ellipse *ellipses;
  1824. X    struct f_spline *splines;
  1825. X    struct f_text  *texts;
  1826. X    struct f_arc   *arcs;
  1827. X    struct f_compound *compounds;
  1828. X    struct f_compound *next;
  1829. X}
  1830. X        F_compound;
  1831. X
  1832. Xtypedef struct f_linkinfo {
  1833. X    struct f_line  *line;
  1834. X    struct f_point *endpt;
  1835. X    struct f_point *prevpt;
  1836. X    int            two_pts;
  1837. X    struct f_linkinfo *next;
  1838. X}
  1839. X        F_linkinfo;
  1840. X
  1841. X#define        ARROW_SIZE        sizeof(struct f_arrow)
  1842. X#define        POINT_SIZE        sizeof(struct f_point)
  1843. X#define        CONTROL_SIZE        sizeof(struct f_control)
  1844. X#define        ELLOBJ_SIZE        sizeof(struct f_ellipse)
  1845. X#define        ARCOBJ_SIZE        sizeof(struct f_arc)
  1846. X#define        LINOBJ_SIZE        sizeof(struct f_line)
  1847. X#define        TEXOBJ_SIZE        sizeof(struct f_text)
  1848. X#define        SPLOBJ_SIZE        sizeof(struct f_spline)
  1849. X#define        COMOBJ_SIZE        sizeof(struct f_compound)
  1850. X#define        EPS_SIZE        sizeof(struct f_eps)
  1851. X#define        LINKINFO_SIZE        sizeof(struct f_linkinfo)
  1852. X
  1853. X/**********************     object codes  **********************/
  1854. X
  1855. X#define        O_ELLIPSE        1
  1856. X#define        O_POLYLINE        2
  1857. X#define        O_SPLINE        3
  1858. X#define        O_TEXT            4
  1859. X#define        O_ARC            5
  1860. X#define        O_COMPOUND        6
  1861. X#define        O_END_COMPOUND        -O_COMPOUND
  1862. X#define        O_ALL_OBJECT        99
  1863. X
  1864. X/*********************    object masks  ************************/
  1865. X
  1866. X#define M_NONE            0x000
  1867. X#define M_POLYLINE_POLYGON    0x001
  1868. X#define M_POLYLINE_LINE        0x002
  1869. X#define M_POLYLINE_BOX        0x004    /* includes ARCBOX */
  1870. X#define M_SPLINE_O_NORMAL    0x008
  1871. X#define M_SPLINE_C_NORMAL    0x010
  1872. X#define M_SPLINE_O_INTERP    0x020
  1873. X#define M_SPLINE_C_INTERP    0x040
  1874. X#define M_TEXT_NORMAL        0x080
  1875. X#define M_TEXT_HIDDEN        0x100
  1876. X#define M_ARC            0x200
  1877. X#define M_ELLIPSE        0x400
  1878. X#define M_COMPOUND        0x800
  1879. X
  1880. X#define M_TEXT        (M_TEXT_HIDDEN | M_TEXT_NORMAL)
  1881. X#define M_SPLINE_O    (M_SPLINE_O_NORMAL | M_SPLINE_O_INTERP)
  1882. X#define M_SPLINE_C    (M_SPLINE_C_NORMAL | M_SPLINE_C_INTERP)
  1883. X#define M_SPLINE_NORMAL (M_SPLINE_O_NORMAL | M_SPLINE_C_NORMAL)
  1884. X#define M_SPLINE_INTERP (M_SPLINE_O_INTERP | M_SPLINE_C_INTERP)
  1885. X#define M_SPLINE    (M_SPLINE_NORMAL | M_SPLINE_INTERP)
  1886. X#define M_POLYLINE    (M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_POLYLINE_BOX)
  1887. X#define M_VARPTS_OBJECT (M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_SPLINE)
  1888. X#define M_OPEN_OBJECT    (M_POLYLINE_LINE | M_SPLINE_O | M_ARC)
  1889. X#define M_ROTATE_ANGLE    (M_VARPTS_OBJECT | M_ARC | M_TEXT | M_COMPOUND)
  1890. X#define M_OBJECT    (M_ELLIPSE | M_POLYLINE | M_SPLINE | M_TEXT | M_ARC)
  1891. X#define M_NO_TEXT    (M_ELLIPSE | M_POLYLINE | M_SPLINE | M_COMPOUND | M_ARC)
  1892. X#define M_ALL        (M_OBJECT | M_COMPOUND)
  1893. X
  1894. X/************************  Objects  **********************/
  1895. X
  1896. Xextern F_compound objects;
  1897. X
  1898. X/************  global working pointers ************/
  1899. X
  1900. Xextern F_line  *cur_l, *new_l, *old_l;
  1901. Xextern F_arc   *cur_a, *new_a, *old_a;
  1902. Xextern F_ellipse *cur_e, *new_e, *old_e;
  1903. Xextern F_text  *cur_t, *new_t, *old_t;
  1904. Xextern F_spline *cur_s, *new_s, *old_s;
  1905. Xextern F_compound *cur_c, *new_c, *old_c;
  1906. Xextern F_point *first_point, *cur_point;
  1907. Xextern F_linkinfo *cur_links;
  1908. X
  1909. X/*************** object attribute settings ***********/
  1910. X
  1911. X/*  Lines  */
  1912. Xextern int    cur_linewidth;
  1913. Xextern int    cur_linestyle;
  1914. Xextern float    cur_dashlength;
  1915. Xextern float    cur_dotgap;
  1916. Xextern float    cur_styleval;
  1917. Xextern int    pen_size;
  1918. Xextern int    pen_type;
  1919. Xextern Color    cur_color;
  1920. Xextern int    cur_boxradius;
  1921. Xextern int    cur_fillstyle;
  1922. Xextern int    cur_arrowmode;
  1923. X
  1924. X/* Text */
  1925. Xextern int    cur_fontsize;    /* font size */
  1926. Xextern int    cur_latex_font;
  1927. Xextern int    cur_ps_font;
  1928. Xextern int    cur_textjust;
  1929. Xextern int    cur_textflags;
  1930. X
  1931. X/* Misc */
  1932. Xextern float    cur_angle;
  1933. END_OF_FILE
  1934. if test 9014 -ne `wc -c <'object.h'`; then
  1935.     echo shar: \"'object.h'\" unpacked with wrong size!
  1936. fi
  1937. # end of 'object.h'
  1938. fi
  1939. echo shar: End of archive 17 \(of 25\).
  1940. cp /dev/null ark17isdone
  1941. MISSING=""
  1942. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
  1943.     if test ! -f ark${I}isdone ; then
  1944.     MISSING="${MISSING} ${I}"
  1945.     fi
  1946. done
  1947. if test "${MISSING}" = "" ; then
  1948.     echo You have unpacked all 25 archives.
  1949.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1950. else
  1951.     echo You still need to unpack the following archives:
  1952.     echo "        " ${MISSING}
  1953. fi
  1954. ##  End of shell archive.
  1955. exit 0
  1956. -- 
  1957. Molecular Simulations, Inc.             mail: dcmartin@msi.com
  1958. 796 N. Pastoria Avenue                  uucp: uunet!dcmartin
  1959. Sunnyvale, California 94086             at&t: 408/522-9236
  1960.