home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume21 / xfig / patch02i < prev    next >
Encoding:
Text File  |  1993-10-21  |  32.6 KB  |  1,062 lines

  1. Newsgroups: comp.sources.x
  2. From: envbvs@epb12.lbl.gov (Brian V. Smith)
  3. Subject: v21i029:  xfig - Draw amd manipulate objects in an X-Window, Patch02i/16
  4. Message-ID: <1993Oct21.185854.7192@sparky.sterling.com>
  5. X-Md4-Signature: b79c3efb3ec403b57293865e99b8cd70
  6. Sender: chris@sparky.sterling.com (Chris Olson)
  7. Organization: Sterling Software
  8. Date: Thu, 21 Oct 1993 18:58:54 GMT
  9. Approved: chris@sterling.com
  10.  
  11. Submitted-by: envbvs@epb12.lbl.gov (Brian V. Smith)
  12. Posting-number: Volume 21, Issue 29
  13. Archive-name: xfig/patch02i
  14. Environment: patch, X11, xfig
  15. Patch-To: xfig: Volume 19, Issue 113-139
  16.  
  17. #! /bin/sh
  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. # Contents:  xfig.03
  22. # Wrapped by chris@sparky on Thu Oct 21 13:40:06 1993
  23. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 9 (of 16)."'
  26. if test -f 'xfig.03' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'xfig.03'\"
  28. else
  29.   echo shar: Extracting \"'xfig.03'\" \(30182 characters\)
  30.   sed "s/^X//" >'xfig.03' <<'END_OF_FILE'
  31. X      generic_window("POLYLINE", "Box", &box_ic, done_line, 1, 0);
  32. X      p1 = *new_l->points;
  33. X      p2 = *new_l->points->next->next;
  34. X!     xy_panel(p1.x, p1.y, "First Corner:", &x1_panel, &y1_panel);
  35. X!     xy_panel(p2.x, p2.y, "Opposite Corner:", &x2_panel, &y2_panel);
  36. X      break;
  37. X      case T_ARC_BOX:
  38. X      generic_window("POLYLINE", "ArcBox", &arc_box_ic, done_line, 1, 0);
  39. X      p1 = *new_l->points;
  40. X      p2 = *new_l->points->next->next;
  41. X!     xy_panel(p1.x, p1.y, "First Corner:", &x1_panel, &y1_panel);
  42. X!     xy_panel(p2.x, p2.y, "Opposite Corner:", &x2_panel, &y2_panel);
  43. X      int_panel(new_l->radius, form, "Radius =", &radius);
  44. X      break;
  45. X      case T_EPS_BOX:
  46. X--- 475,489 ----
  47. X      generic_window("POLYLINE", "Box", &box_ic, done_line, 1, 0);
  48. X      p1 = *new_l->points;
  49. X      p2 = *new_l->points->next->next;
  50. X!     xy_panel(p1.x, p1.y, "First Corner", &x1_panel, &y1_panel);
  51. X!     xy_panel(p2.x, p2.y, "Opposite Corner", &x2_panel, &y2_panel);
  52. X      break;
  53. X      case T_ARC_BOX:
  54. X      generic_window("POLYLINE", "ArcBox", &arc_box_ic, done_line, 1, 0);
  55. X      p1 = *new_l->points;
  56. X      p2 = *new_l->points->next->next;
  57. X!     xy_panel(p1.x, p1.y, "First Corner", &x1_panel, &y1_panel);
  58. X!     xy_panel(p2.x, p2.y, "Opposite Corner", &x2_panel, &y2_panel);
  59. X      int_panel(new_l->radius, form, "Radius =", &radius);
  60. X      break;
  61. X      case T_EPS_BOX:
  62. X***************
  63. X*** 495,502 ****
  64. X      str_panel(new_l->eps->file, "EPS Filename =", &eps_name_panel);
  65. X      p1 = *new_l->points;
  66. X      p2 = *new_l->points->next->next;
  67. X!     xy_panel(p1.x, p1.y, "First Corner:", &x1_panel, &y1_panel);
  68. X!     xy_panel(p2.x, p2.y, "Opposite corner:", &x2_panel, &y2_panel);
  69. X  
  70. X      /* make popup flipped menu */
  71. X      FirstArg(XtNfromVert, below);
  72. X--- 494,501 ----
  73. X      str_panel(new_l->eps->file, "EPS Filename =", &eps_name_panel);
  74. X      p1 = *new_l->points;
  75. X      p2 = *new_l->points->next->next;
  76. X!     xy_panel(p1.x, p1.y, "First Corner", &x1_panel, &y1_panel);
  77. X!     xy_panel(p2.x, p2.y, "Opposite corner", &x2_panel, &y2_panel);
  78. X  
  79. X      /* make popup flipped menu */
  80. X      FirstArg(XtNfromVert, below);
  81. X***************
  82. X*** 802,811 ****
  83. X                      XtNumber(special_text_items),
  84. X                     special_text_panel, special_text_select);
  85. X  
  86. X!     xy_panel(new_t->base_x, new_t->base_y, "Origin:", &x1_panel, &y1_panel);
  87. X      font_image_panel(new_psflag ? psfont_menu_bitmaps[new_t->font + 1] :
  88. X!          latexfont_menu_bitmaps[new_t->font], "Font:", &font_panel);
  89. X!     str_panel(new_t->cstring, "Text:", &text_panel);
  90. X  }
  91. X  
  92. X  static
  93. X--- 801,810 ----
  94. X                      XtNumber(special_text_items),
  95. X                     special_text_panel, special_text_select);
  96. X  
  97. X!     xy_panel(new_t->base_x, new_t->base_y, "Origin", &x1_panel, &y1_panel);
  98. X      font_image_panel(new_psflag ? psfont_menu_bitmaps[new_t->font + 1] :
  99. X!          latexfont_menu_bitmaps[new_t->font], "Font", &font_panel);
  100. X!     str_panel(new_t->cstring, "Text", &text_panel);
  101. X  }
  102. X  
  103. X  static
  104. X***************
  105. X*** 832,837 ****
  106. X--- 831,837 ----
  107. X      new_t->color = color;
  108. X      new_t->depth = atoi(panel_get_value(depth_panel));
  109. X      new_t->angle = M_PI / 180 * atoi(panel_get_value(angle_panel));
  110. X+     fixangle(&new_t->angle);    /* keep between 0 and 2PI */
  111. X      new_t->base_x = atoi(panel_get_value(x1_panel));
  112. X      new_t->base_y = atoi(panel_get_value(y1_panel));
  113. X      if (new_t->cstring)
  114. X***************
  115. X*** 839,856 ****
  116. X      s = panel_get_value(text_panel);
  117. X      new_t->cstring = new_string(strlen(s) + 1);
  118. X      strcpy(new_t->cstring, s);
  119. X      canvas_font = lookfont(x_fontnum(new_t->flags, new_t->font), 
  120. X!             new_t->size, new_t->angle*180.0/M_PI);
  121. X!     new_t->fontstruct = canvas_font;
  122. X      size = pf_textwidth(canvas_font, strlen(s), s);
  123. X      new_t->height = size.y;
  124. X      new_t->length = size.x;
  125. X  }
  126. X  
  127. X  static
  128. X  done_text()
  129. X  {
  130. X!     int            xmin, ymin, xmax, ymax;
  131. X  
  132. X      old_t = new_t->next;
  133. X      switch (button_result) {
  134. X--- 839,858 ----
  135. X      s = panel_get_value(text_panel);
  136. X      new_t->cstring = new_string(strlen(s) + 1);
  137. X      strcpy(new_t->cstring, s);
  138. X+     /* get the fontstruct for zoom = 1 to get the size of the string */
  139. X      canvas_font = lookfont(x_fontnum(new_t->flags, new_t->font), 
  140. X!             new_t->size);
  141. X      size = pf_textwidth(canvas_font, strlen(s), s);
  142. X      new_t->height = size.y;
  143. X      new_t->length = size.x;
  144. X+     /* now set the fontstruct for this zoom scale */
  145. X+     reload_text_fstruct(new_t);
  146. X  }
  147. X  
  148. X  static
  149. X  done_text()
  150. X  {
  151. X!     int            xmin, ymin, xmax, ymax, dum;
  152. X  
  153. X      old_t = new_t->next;
  154. X      switch (button_result) {
  155. X***************
  156. X*** 865,871 ****
  157. X      get_new_text_values();
  158. X      new_t->next = NULL;
  159. X      change_text(old_t, new_t);
  160. X!     text_bound(new_t, &xmin, &ymin, &xmax, &ymax);
  161. X      redisplay_zoomed_region(xmin, ymin, xmax, ymax);
  162. X      reset_cursor();
  163. X      break;
  164. X--- 867,874 ----
  165. X      get_new_text_values();
  166. X      new_t->next = NULL;
  167. X      change_text(old_t, new_t);
  168. X!     text_bound(new_t, &xmin, &ymin, &xmax, &ymax,
  169. X!            &dum, &dum, &dum, &dum, &dum, &dum, &dum, &dum);
  170. X      redisplay_zoomed_region(xmin, ymin, xmax, ymax);
  171. X      reset_cursor();
  172. X      break;
  173. X***************
  174. X*** 872,878 ****
  175. X      case CANCEL:
  176. X      if (changed) {
  177. X          draw_text(new_t, ERASE);
  178. X!         text_bound(old_t, &xmin, &ymin, &xmax, &ymax);
  179. X          redisplay_zoomed_region(xmin, ymin, xmax, ymax);
  180. X      } else {
  181. X          toggle_textmarker(old_t);
  182. X--- 875,882 ----
  183. X      case CANCEL:
  184. X      if (changed) {
  185. X          draw_text(new_t, ERASE);
  186. X!         text_bound(old_t, &xmin, &ymin, &xmax, &ymax,
  187. X!            &dum, &dum, &dum, &dum, &dum, &dum, &dum, &dum);
  188. X          redisplay_zoomed_region(xmin, ymin, xmax, ymax);
  189. X      } else {
  190. X          toggle_textmarker(old_t);
  191. X***************
  192. X*** 928,939 ****
  193. X            &angle_panel);
  194. X  
  195. X      if (ellipse_flag) {
  196. X!     f_pos_panel(&new_e->center, "Center:",
  197. X              &x1_panel, &y1_panel);
  198. X!     f_pos_panel(&new_e->radiuses, "Radiuses:",
  199. X              &x2_panel, &y2_panel);
  200. X      } else {
  201. X!     f_pos_panel(&new_e->center, "Center:",
  202. X              &x1_panel, &y1_panel);
  203. X      int_panel(new_e->radiuses.x, form, "Radius =",
  204. X            &x2_panel);
  205. X--- 932,943 ----
  206. X            &angle_panel);
  207. X  
  208. X      if (ellipse_flag) {
  209. X!     f_pos_panel(&new_e->center, "Center",
  210. X              &x1_panel, &y1_panel);
  211. X!     f_pos_panel(&new_e->radiuses, "Radiuses",
  212. X              &x2_panel, &y2_panel);
  213. X      } else {
  214. X!     f_pos_panel(&new_e->center, "Center",
  215. X              &x1_panel, &y1_panel);
  216. X      int_panel(new_e->radiuses.x, form, "Radius =",
  217. X            &x2_panel);
  218. X***************
  219. X*** 945,950 ****
  220. X--- 949,955 ----
  221. X  {
  222. X      get_generic_vals(new_e);
  223. X      new_e->angle = M_PI / 180 * atoi(panel_get_value(angle_panel));
  224. X+     fixangle(&new_e->angle);    /* keep between 0 and 2PI */
  225. X      get_f_pos(&new_e->center, x1_panel, y1_panel);
  226. X      if (ellipse_flag)
  227. X      get_f_pos(&new_e->radiuses, x2_panel, y2_panel);
  228. X***************
  229. X*** 965,972 ****
  230. X  static
  231. X  done_ellipse()
  232. X  {
  233. X-     int            xmin, ymin, xmax, ymax;
  234. X- 
  235. X      old_e = new_e->next;
  236. X      switch (button_result) {
  237. X      case APPLY:
  238. X--- 970,975 ----
  239. X***************
  240. X*** 1009,1017 ****
  241. X      put_generic_vals(new_a);
  242. X      put_generic_arrows(new_a);
  243. X      generic_window("ARC", "Specified by 3 points", &arc_ic, done_arc, 1, 1);
  244. X!     f_pos_panel(&new_a->point[0], "p1:", &x1_panel, &y1_panel);
  245. X!     f_pos_panel(&new_a->point[1], "p2:", &x2_panel, &y2_panel);
  246. X!     f_pos_panel(&new_a->point[2], "p3:", &x3_panel, &y3_panel);
  247. X  }
  248. X  
  249. X  static
  250. X--- 1012,1020 ----
  251. X      put_generic_vals(new_a);
  252. X      put_generic_arrows(new_a);
  253. X      generic_window("ARC", "Specified by 3 points", &arc_ic, done_arc, 1, 1);
  254. X!     f_pos_panel(&new_a->point[0], "p1", &x1_panel, &y1_panel);
  255. X!     f_pos_panel(&new_a->point[1], "p2", &x2_panel, &y2_panel);
  256. X!     f_pos_panel(&new_a->point[2], "p3", &x3_panel, &y3_panel);
  257. X  }
  258. X  
  259. X  static
  260. X***************
  261. X*** 1039,1046 ****
  262. X  static
  263. X  done_arc()
  264. X  {
  265. X-     int            xmin, ymin, xmax, ymax;
  266. X- 
  267. X      old_a = new_a->next;
  268. X      switch (button_result) {
  269. X      case APPLY:
  270. X--- 1042,1047 ----
  271. X***************
  272. X*** 1109,1116 ****
  273. X  static
  274. X  done_spline()
  275. X  {
  276. X-     int            xmin, ymin, xmax, ymax;
  277. X- 
  278. X      old_s = new_s->next;
  279. X      switch (button_result) {
  280. X      case APPLY:
  281. X--- 1110,1115 ----
  282. X***************
  283. X*** 1259,1270 ****
  284. X      Pixmap        image_pm;
  285. X      static int      actions_added=0;
  286. X  
  287. X- #ifdef OPENWIN_BUG
  288. X-     /* to cater for OpenWindows bug - see below */
  289. X-     Pixel        fg, bg;
  290. X- 
  291. X- #endif
  292. X- 
  293. X      static char       *linestyle_items[] = {
  294. X      "Solid Line ", "Dashed Line", "Dotted Line"};
  295. X      static char       *fill_style_items[] = {
  296. X--- 1258,1263 ----
  297. X***************
  298. X*** 1318,1325 ****
  299. X  
  300. X      /* doesn't already exist, create a pixmap from the data (ala panel.c) */
  301. X      /* OpenWindows bug doesn't handle a 1-plane bitmap on a n-plane display */
  302. X      if (!image_pm) {
  303. X! #ifdef OPENWIN_BUG
  304. X      /* get the foreground/background of the widget */
  305. X      FirstArg(XtNforeground, &fg);
  306. X      NextArg(XtNbackground, &bg);
  307. X--- 1311,1319 ----
  308. X  
  309. X      /* doesn't already exist, create a pixmap from the data (ala panel.c) */
  310. X      /* OpenWindows bug doesn't handle a 1-plane bitmap on a n-plane display */
  311. X+     /* so we use CreatePixmap.... */
  312. X      if (!image_pm) {
  313. X!     Pixel        fg, bg;
  314. X      /* get the foreground/background of the widget */
  315. X      FirstArg(XtNforeground, &fg);
  316. X      NextArg(XtNbackground, &bg);
  317. X***************
  318. X*** 1328,1337 ****
  319. X      image_pm = XCreatePixmapFromBitmapData(tool_d, canvas_win,
  320. X                       (char *) icon->data, icon->width, icon->height,
  321. X                       fg, bg, XDefaultDepthOfScreen(tool_s));
  322. X- #else
  323. X-     image_pm = XCreateBitmapFromData(tool_d, canvas_win,
  324. X-                      (char *) icon->data, icon->width, icon->height);
  325. X- #endif
  326. X      pix_table[i].image_pm = image_pm;
  327. X      pix_table[i].image = icon;
  328. X      }
  329. X--- 1322,1327 ----
  330. X***************
  331. X*** 1808,1826 ****
  332. X      <Key>F18: PastePanelKey()\n";
  333. X  
  334. X  static
  335. X! str_panel(string, label, pi_x)
  336. X      char       *string;
  337. X!     char       *label;
  338. X      Widget       *pi_x;
  339. X  {
  340. X      int            width, nlines, i;
  341. X      Dimension        pwidth;
  342. X      PIX_FONT        temp_font;
  343. X  
  344. X      FirstArg(XtNfromVert, below);
  345. X!     NextArg(XtNlabel, label);
  346. X      NextArg(XtNborderWidth, 0);
  347. X!     beside = XtCreateManagedWidget(label, labelWidgetClass, form, Args, ArgCount);
  348. X  
  349. X      /* get the font and width of above label widget */
  350. X      FirstArg(XtNfont, &temp_font);
  351. X--- 1798,1826 ----
  352. X      <Key>F18: PastePanelKey()\n";
  353. X  
  354. X  static
  355. X! str_panel(string, name, pi_x)
  356. X      char       *string;
  357. X!     char       *name;
  358. X      Widget       *pi_x;
  359. X  {
  360. X      int            width, nlines, i;
  361. X      Dimension        pwidth;
  362. X      PIX_FONT        temp_font;
  363. X+     char       *labelname, *textname;
  364. X  
  365. X+     /* make the labels of the widgets xxx_lab for the label part and xxx_text for 
  366. X+     the asciiwidget part */
  367. X+     labelname = (char *) malloc(strlen(name)+5);
  368. X+     textname = (char *) malloc(strlen(name)+6);
  369. X+     strcpy(labelname,name);
  370. X+     strcat(labelname,"_lab");
  371. X+     strcpy(textname,name);
  372. X+     strcat(textname,"_text");
  373. X+ 
  374. X      FirstArg(XtNfromVert, below);
  375. X!     NextArg(XtNlabel, name);
  376. X      NextArg(XtNborderWidth, 0);
  377. X!     beside = XtCreateManagedWidget(labelname, labelWidgetClass, form, Args, ArgCount);
  378. X  
  379. X      /* get the font and width of above label widget */
  380. X      FirstArg(XtNfont, &temp_font);
  381. X***************
  382. X*** 1852,1858 ****
  383. X      NextArg(XtNscrollHorizontal, XawtextScrollWhenNeeded);
  384. X      NextArg(XtNscrollVertical, XawtextScrollWhenNeeded);
  385. X  
  386. X!     *pi_x = XtCreateManagedWidget(label, asciiTextWidgetClass, form, Args, ArgCount);
  387. X  
  388. X      /* make Newline do nothing for now */
  389. X      XtOverrideTranslations(*pi_x, XtParseTranslationTable(text_translations));
  390. X--- 1852,1858 ----
  391. X      NextArg(XtNscrollHorizontal, XawtextScrollWhenNeeded);
  392. X      NextArg(XtNscrollVertical, XawtextScrollWhenNeeded);
  393. X  
  394. X!     *pi_x = XtCreateManagedWidget(textname, asciiTextWidgetClass, form, Args, ArgCount);
  395. X  
  396. X      /* make Newline do nothing for now */
  397. X      XtOverrideTranslations(*pi_x, XtParseTranslationTable(text_translations));
  398. X***************
  399. X*** 1861,1866 ****
  400. X--- 1861,1869 ----
  401. X      XtOverrideTranslations(*pi_x, XtParseTranslationTable(local_translations));
  402. X  
  403. X      below = *pi_x;
  404. X+ 
  405. X+     free((char *) textname);
  406. X+     free((char *) labelname);
  407. X  }
  408. X  
  409. X  static
  410. Xdiff -rc xfig.2.1.7a/e_glue.c xfig.2.1.8/e_glue.c
  411. X*** xfig.2.1.7a/e_glue.c    Tue Jan  5 11:41:16 1993
  412. X--- xfig.2.1.8/e_glue.c    Thu Jun 17 10:05:03 1993
  413. X***************
  414. X*** 15,20 ****
  415. X--- 15,21 ----
  416. X  #include "mode.h"
  417. X  #include "object.h"
  418. X  #include "paintop.h"
  419. X+ #include "u_bound.h"
  420. X  #include "u_create.h"
  421. X  #include "u_draw.h"
  422. X  #include "u_elastic.h"
  423. X***************
  424. X*** 147,152 ****
  425. X--- 148,173 ----
  426. X      compound_bound(c, &c->nwcorner.x, &c->nwcorner.y,
  427. X             &c->secorner.x, &c->secorner.y);
  428. X  
  429. X+     /* if zero width or height in the compound, adjust to next positioning 
  430. X+        grid point or a few pixels if positioning grid is "ANY" */
  431. X+     if (c->nwcorner.x == c->secorner.x) {
  432. X+     if (cur_pointposn == P_ANY) {
  433. X+         c->secorner.x += MARK_SIZ+1;  /* just enough to clear the markers */
  434. X+     }
  435. X+     else {
  436. X+         c->secorner.x += posn_rnd[cur_pointposn];
  437. X+         ceil_coords(c->secorner.x);
  438. X+     }
  439. X+     }
  440. X+     if (c->nwcorner.y == c->secorner.y) {
  441. X+     if (cur_pointposn == P_ANY) {
  442. X+         c->secorner.y += MARK_SIZ+1;  /* just enough to clear the markers */
  443. X+     }
  444. X+     else {
  445. X+         c->secorner.y += posn_rnd[cur_pointposn];
  446. X+         ceil_coords(c->secorner.y);
  447. X+     }
  448. X+     }
  449. X      c->next = NULL;
  450. X      clean_up();
  451. X      set_action(F_GLUE);
  452. X***************
  453. X*** 404,415 ****
  454. X      int            dum;
  455. X  
  456. X      for (t = objects.texts; t != NULL; t = t->next) {
  457. X!     if (appres.textoutline) {
  458. X!         text_bound_actual(t, t->angle, &txmin, &tymin, &txmax, &tymax,
  459. X!                 &dum,&dum,&dum,&dum,&dum,&dum,&dum,&dum);
  460. X!     } else {
  461. X!         text_bound(t, &txmin, &tymin, &txmax, &tymax);
  462. X!     }
  463. X      if (xmin > txmin || xmax < txmax ||
  464. X          ymin > tymin || ymax < tymax)
  465. X          continue;
  466. X--- 425,432 ----
  467. X      int            dum;
  468. X  
  469. X      for (t = objects.texts; t != NULL; t = t->next) {
  470. X!     text_bound(t, &txmin, &tymin, &txmax, &tymax,
  471. X!             &dum,&dum,&dum,&dum,&dum,&dum,&dum,&dum);
  472. X      if (xmin > txmin || xmax < txmax ||
  473. X          ymin > tymin || ymax < tymax)
  474. X          continue;
  475. Xdiff -rc xfig.2.1.7a/e_movept.c xfig.2.1.8/e_movept.c
  476. X*** xfig.2.1.7a/e_movept.c    Tue Feb 16 15:38:22 1993
  477. X--- xfig.2.1.8/e_movept.c    Tue Sep  7 09:38:46 1993
  478. X***************
  479. X*** 25,30 ****
  480. X--- 25,31 ----
  481. X  #include "w_mousefun.h"
  482. X  
  483. X  extern void     force_anglegeom(), force_noanglegeom();
  484. X+ extern        scale_radius();
  485. X  
  486. X  /* local routine declarations */
  487. X  
  488. X***************
  489. X*** 51,57 ****
  490. X  static int    fix_movedsplinepoint();
  491. X  static int    fix_box();
  492. X  static int    fix_movedlinepoint();
  493. X- static int    fix_movedlatexlinepoint();
  494. X  
  495. X  static int    cancel_movedarcpoint();
  496. X  static int    cancel_movedellipsepoint();
  497. X--- 52,57 ----
  498. X***************
  499. X*** 88,94 ****
  500. X  
  501. X  static
  502. X  init_stretch_move_point(obj, type, x, y, p, q)
  503. X!     char       *obj;
  504. X      int            type, x, y;
  505. X      F_point       *p, *q;
  506. X  {
  507. X--- 88,94 ----
  508. X  
  509. X  static
  510. X  init_stretch_move_point(obj, type, x, y, p, q)
  511. X!     F_line       *obj;
  512. X      int            type, x, y;
  513. X      F_point       *p, *q;
  514. X  {
  515. X***************
  516. X*** 213,218 ****
  517. X--- 213,220 ----
  518. X      elastic_cbd();
  519. X      break;
  520. X      }
  521. X+     /* show current radius(ii) */
  522. X+     (canvas_locmove_proc)(cur_x, cur_y);
  523. X      from_x = cur_x;
  524. X      from_y = cur_y;
  525. X      set_temp_cursor(crosshair_cursor);
  526. X***************
  527. X*** 340,345 ****
  528. X--- 342,349 ----
  529. X      canvas_locmove_proc = reshaping_arc;
  530. X      canvas_leftbut_proc = fix_movedarcpoint;
  531. X      canvas_rightbut_proc = cancel_movedarcpoint;
  532. X+     /* show current length(s) */
  533. X+     (canvas_locmove_proc)(cur_x, cur_y);
  534. X  }
  535. X  
  536. X  static
  537. X***************
  538. X*** 435,440 ****
  539. X--- 439,446 ----
  540. X           left_point = p, p = p->next);
  541. X      }
  542. X      }
  543. X+     /* show current length(s) */
  544. X+     (canvas_locmove_proc)(cur_x, cur_y);
  545. X      elastic_linelink();
  546. X      canvas_leftbut_proc = fix_movedsplinepoint;
  547. X      canvas_rightbut_proc = cancel_movedsplinepoint;
  548. X***************
  549. X*** 519,524 ****
  550. X--- 525,532 ----
  551. X      canvas_locmove_proc = constrained_resizing_box;
  552. X      canvas_leftbut_proc = prescale_compound;
  553. X      canvas_rightbut_proc = cancel_compound;
  554. X+     /* show current length(s) */
  555. X+     (canvas_locmove_proc)(cur_x, cur_y);
  556. X  }
  557. X  
  558. X  static
  559. X***************
  560. X*** 606,611 ****
  561. X--- 614,621 ----
  562. X      canvas_locmove_proc = constrained_resizing_box;
  563. X      canvas_leftbut_proc = fix_box;
  564. X      canvas_rightbut_proc = cancel_box;
  565. X+     /* show current length(s) */
  566. X+     (canvas_locmove_proc)(cur_x, cur_y);
  567. X      return;
  568. X  
  569. X      case T_POLYLINE:
  570. X***************
  571. X*** 657,662 ****
  572. X--- 667,674 ----
  573. X      elastic_linelink();
  574. X      canvas_leftbut_proc = fix_movedlinepoint;
  575. X      canvas_rightbut_proc = cancel_movedlinepoint;
  576. X+     /* show current length(s) */
  577. X+     (canvas_locmove_proc)(cur_x, cur_y);
  578. X  }
  579. X  
  580. X  static
  581. X***************
  582. X*** 683,688 ****
  583. X--- 695,702 ----
  584. X          new_l->eps->flipped = 1 - new_l->eps->flipped;
  585. X      }
  586. X      assign_newboxpoint(new_l, fix_x, fix_y, x, y);
  587. X+     if (new_l->type == T_ARC_BOX)    /* don't scale radius unless too large */
  588. X+     scale_radius(new_l, new_l);
  589. X      change_line(cur_l, new_l);
  590. X      draw_line(new_l, PAINT);
  591. X      toggle_linemarker(new_l);
  592. Xdiff -rc xfig.2.1.7a/e_scale.c xfig.2.1.8/e_scale.c
  593. X*** xfig.2.1.7a/e_scale.c    Tue Feb 16 15:26:43 1993
  594. X--- xfig.2.1.8/e_scale.c    Fri Sep  3 15:18:43 1993
  595. X***************
  596. X*** 725,730 ****
  597. X--- 725,745 ----
  598. X      p->x = round(refx + (p->x - refx) * sx);
  599. X      p->y = round(refy + (p->y - refy) * sy);
  600. X      }
  601. X+     /* now scale the radius */
  602. X+     if (l->type == T_ARC_BOX) {
  603. X+     int h,w;
  604. X+     /* scale by the average of height/width factor */
  605. X+     l->radius = round(l->radius * (sx+sy)/2);
  606. X+     /* if the radius is larger than half the width or height, set it to the 
  607. X+        minimum of the width or heigth divided by 2 */
  608. X+     w = abs(l->points->x-l->points->next->next->x);
  609. X+     h = abs(l->points->y-l->points->next->next->y);
  610. X+     if ((l->radius > w/2) || (l->radius > h/2))
  611. X+         l->radius = min2(w,h)/2;
  612. X+     /* finally, if it is 0, make it 1 */
  613. X+     if (l->radius == 0)
  614. X+         l->radius = 1;
  615. X+     }
  616. X  }
  617. X  
  618. X  scale_spline(s, sx, sy, refx, refy)
  619. X***************
  620. X*** 753,765 ****
  621. X      int            refx, refy;
  622. X  {
  623. X      int            i;
  624. X  
  625. X      for (i = 0; i < 3; i++) {
  626. X      a->point[i].x = round(refx + (a->point[i].x - refx) * sx);
  627. X      a->point[i].y = round(refy + (a->point[i].y - refy) * sy);
  628. X      }
  629. X!     compute_arccenter(a->point[0], a->point[1], a->point[2],
  630. X!               &a->center.x, &a->center.y);
  631. X      a->direction = compute_direction(a->point[0], a->point[1], a->point[2]);
  632. X  }
  633. X  
  634. X--- 768,803 ----
  635. X      int            refx, refy;
  636. X  {
  637. X      int            i;
  638. X+     F_point        p[3];
  639. X  
  640. X      for (i = 0; i < 3; i++) {
  641. X+     /* save original points for co-linear check later */
  642. X+     p[i].x = a->point[i].x;
  643. X+     p[i].y = a->point[i].y;
  644. X      a->point[i].x = round(refx + (a->point[i].x - refx) * sx);
  645. X      a->point[i].y = round(refy + (a->point[i].y - refy) * sy);
  646. X      }
  647. X!     if (compute_arccenter(a->point[0], a->point[1], a->point[2],
  648. X!                   &a->center.x, &a->center.y) == 0) {
  649. X!     /* the new arc is co-linear, move the middle point one pixel */
  650. X!     if (a->point[0].x == a->point[1].x) { /* vertical, move middle left or right */
  651. X!         if (p[1].x > p[0].x)
  652. X!         a->point[1].x++;    /* convex to the right -> ) */
  653. X!         else
  654. X!         a->point[1].x--;    /* convex to the left -> ( */
  655. X!     } 
  656. X!     /* check ALSO for horizontally co-linear in case all three points are equal */
  657. X!     if (a->point[0].y == a->point[1].y) { /* horizontal, move middle point up or down */
  658. X!         if (p[1].y > p[0].y)
  659. X!         a->point[1].y++;    /* curves up */
  660. X!         else
  661. X!         a->point[1].y--;    /* curves down */
  662. X!     }
  663. X!     /* now check if the endpoints are equal, move one of them */
  664. X!     if (a->point[0].x == a->point[2].x &&
  665. X!         a->point[0].y == a->point[2].y)
  666. X!         a->point[2].x++;
  667. X!     }
  668. X      a->direction = compute_direction(a->point[0], a->point[1], a->point[2]);
  669. X  }
  670. X  
  671. X***************
  672. X*** 926,931 ****
  673. X--- 964,971 ----
  674. X          new_l->eps->flipped = 1 - new_l->eps->flipped;
  675. X      if (signof(fix_y - from_y) != signof(fix_y - y))
  676. X          new_l->eps->flipped = 1 - new_l->eps->flipped;
  677. X+     } else if (new_l->type == T_ARC_BOX) {    /* scale the radius also */
  678. X+     scale_radius(cur_l, new_l);
  679. X      }
  680. X      change_line(cur_l, new_l);
  681. X      draw_line(new_l, PAINT);
  682. X***************
  683. X*** 933,938 ****
  684. X--- 973,1000 ----
  685. X      wrapup_scale();
  686. X  }
  687. X  
  688. X+ scale_radius(old, new)
  689. X+     F_line       *old, *new;
  690. X+ {
  691. X+     int owd,oht, nwd, nht;
  692. X+     float wdscale, htscale;
  693. X+     owd = abs(old->points->x - old->points->next->next->x);
  694. X+     oht = abs(old->points->y - old->points->next->next->y);
  695. X+     nwd = abs(new->points->x - new->points->next->next->x);
  696. X+     nht = abs(new->points->y - new->points->next->next->y);
  697. X+     wdscale = (float) nwd/owd;
  698. X+     htscale = (float) nht/oht;
  699. X+     /* scale by the average of height/width factor */
  700. X+     new->radius = round(new->radius * (wdscale+htscale)/2);
  701. X+     /* next, if the radius is larger than half the width, set it to the 
  702. X+        minimum of the width or heigth divided by 2 */
  703. X+     if ((new->radius > nwd/2) || (new->radius > nht/2))
  704. X+         new->radius = min2(nwd,nht)/2;
  705. X+     /* finally, if it is 0, make it 1 */
  706. X+     if (new->radius == 0)
  707. X+         new->radius = 1;
  708. X+ }
  709. X+ 
  710. X  static
  711. X  assign_newboxpoint(b, x1, y1, x2, y2)
  712. X      F_line       *b;
  713. X***************
  714. X*** 1021,1026 ****
  715. X--- 1083,1091 ----
  716. X      old_l->next = cur_l;
  717. X      /* now change the original to become the new object */
  718. X      rescale_points(cur_l->points, x, y);
  719. X+     /* and scale the radius if ARC_BOX */
  720. X+     if (cur_l->type == T_ARC_BOX)
  721. X+     scale_radius(old_l, cur_l);
  722. X      draw_line(cur_l, PAINT);
  723. X      toggle_linemarker(cur_l);
  724. X      wrapup_scale();
  725. Xdiff -rc xfig.2.1.7a/e_update.c xfig.2.1.8/e_update.c
  726. X*** xfig.2.1.7a/e_update.c    Fri Feb 12 09:16:07 1993
  727. X--- xfig.2.1.8/e_update.c    Wed May  5 12:01:45 1993
  728. X***************
  729. X*** 24,29 ****
  730. X--- 24,30 ----
  731. X  #include "w_mousefun.h"
  732. X  
  733. X  extern        update_current_settings();
  734. X+ extern PIX_FONT lookfont();
  735. X  static int    init_update_object();
  736. X  static int    init_update_settings();
  737. X  
  738. X***************
  739. X*** 316,323 ****
  740. X      up_part(text->angle, cur_elltextangle*M_PI/180.0, I_ELLTEXTANGLE);
  741. X      up_part(text->color, cur_color, I_COLOR);
  742. X      up_part(text->depth, cur_depth, I_DEPTH);
  743. X!     size = pf_textwidth(lookfont(x_fontnum(text->flags, text->font), text->size,
  744. X!             cur_elltextangle), strlen(text->cstring), text->cstring);
  745. X      text->length = size.x;    /* in pixels */
  746. X      text->height = size.y;    /* in pixels */
  747. X      reload_text_fstruct(text);    /* make sure fontstruct is current */
  748. X--- 317,324 ----
  749. X      up_part(text->angle, cur_elltextangle*M_PI/180.0, I_ELLTEXTANGLE);
  750. X      up_part(text->color, cur_color, I_COLOR);
  751. X      up_part(text->depth, cur_depth, I_DEPTH);
  752. X!     size = pf_textwidth(lookfont(x_fontnum(text->flags, text->font), text->size),
  753. X!             strlen(text->cstring), text->cstring);
  754. X      text->length = size.x;    /* in pixels */
  755. X      text->height = size.y;    /* in pixels */
  756. X      reload_text_fstruct(text);    /* make sure fontstruct is current */
  757. Xdiff -rc xfig.2.1.7a/f_epsobj.c xfig.2.1.8/f_epsobj.c
  758. X*** xfig.2.1.7a/f_epsobj.c    Wed Apr 28 15:25:11 1993
  759. X--- xfig.2.1.8/f_epsobj.c    Tue Aug 31 14:18:38 1993
  760. X***************
  761. X*** 33,39 ****
  762. X      char       *cp;
  763. X      unsigned char  *mp;
  764. X      unsigned int    hexnib;
  765. X!     int            flag,preview;
  766. X      char        buf[300];
  767. X      int            llx, lly, urx, ury, bad_bbox;
  768. X      FILE       *epsf;
  769. X--- 33,39 ----
  770. X      char       *cp;
  771. X      unsigned char  *mp;
  772. X      unsigned int    hexnib;
  773. X!     int            flag;
  774. X      char        buf[300];
  775. X      int            llx, lly, urx, ury, bad_bbox;
  776. X      FILE       *epsf;
  777. Xdiff -rc xfig.2.1.7a/f_read.c xfig.2.1.8/f_read.c
  778. X*** xfig.2.1.7a/f_read.c    Mon May  3 10:41:12 1993
  779. X--- xfig.2.1.8/f_read.c    Tue Sep 14 09:08:19 1993
  780. X***************
  781. X*** 139,145 ****
  782. X      return -2;
  783. X      if (strncmp(buf, "#FIG", 4) == 0) { /* versions 1.4/later have #FIG in
  784. X                       * first line */
  785. X!     if ((sscanf((char*)(index(buf, ' ') + 1), "%f", &fproto)) == 0)    /* assume 1.4 */
  786. X          proto = 14;
  787. X      else
  788. X          proto = (fproto + .01) * 10;    /* protocol version*10 */
  789. X--- 139,145 ----
  790. X      return -2;
  791. X      if (strncmp(buf, "#FIG", 4) == 0) { /* versions 1.4/later have #FIG in
  792. X                       * first line */
  793. X!     if ((sscanf((char*)(strchr(buf, ' ') + 1), "%f", &fproto)) == 0)    /* assume 1.4 */
  794. X          proto = 14;
  795. X      else
  796. X          proto = (fproto + .01) * 10;    /* protocol version*10 */
  797. X***************
  798. X*** 157,165 ****
  799. X      status = read_1_3_objects(fp, obj);
  800. X      }
  801. X  
  802. X!     /* shift the figure on the page if there are negative coords */
  803. X!     /**** DISABLE UNTIL WE PUT IN AN *OPTION* TO DO THIS */
  804. X!     /* shift_figure(obj); */
  805. X  
  806. X      fclose(fp);
  807. X      return (status);
  808. X--- 157,164 ----
  809. X      status = read_1_3_objects(fp, obj);
  810. X      }
  811. X  
  812. X!     /* ask the user if the figure should be shifted if there are negative coords */
  813. X!     shift_figure(obj);
  814. X  
  815. X      fclose(fp);
  816. X      return (status);
  817. X***************
  818. X*** 448,453 ****
  819. X--- 447,453 ----
  820. X      return (NULL);
  821. X      }
  822. X      e->fill_style = FILL_CONVERT(e->fill_style);
  823. X+     fixangle(&e->angle);    /* make sure angle is 0 to 2PI */
  824. X      fixdepth(&e->depth);
  825. X      return (e);
  826. X  }
  827. X***************
  828. X*** 711,717 ****
  829. X      int            ignore = 0;
  830. X      char        s[BUF_SIZE], s_temp[BUF_SIZE], junk[2];
  831. X      float        tx_size, tx_height, tx_length;
  832. X!     extern PIX_ROT_FONT lookfont();
  833. X  
  834. X      if ((t = create_text()) == NULL)
  835. X      return (NULL);
  836. X--- 711,717 ----
  837. X      int            ignore = 0;
  838. X      char        s[BUF_SIZE], s_temp[BUF_SIZE], junk[2];
  839. X      float        tx_size, tx_height, tx_length;
  840. X!     extern PIX_FONT lookfont();
  841. X  
  842. X      if ((t = create_text()) == NULL)
  843. X      return (NULL);
  844. X***************
  845. X*** 726,737 ****
  846. X       * We read text size, height and length as floats because TransFig uses
  847. X       * floats for these, but they are rounded to ints internally to xfig.
  848. X       */
  849. X!     /* read the leading blanks for the string, but delete the first later */
  850. X      n = sscanf(buf, "%*d%d%d%f%d%d%d%f%d%f%f%d%d%[^\1]%[\1]",
  851. X!            &t->type, &t->font, &tx_size, &t->pen,
  852. X!            &t->color, &t->depth, &t->angle,
  853. X!            &t->flags, &tx_height, &tx_length,
  854. X!            &t->base_x, &t->base_y, s, junk);
  855. X      if (n != 13 && n != 14) {
  856. X      file_msg(Err_incomp, "text", line_no);
  857. X      free((char *) t);
  858. X--- 726,773 ----
  859. X       * We read text size, height and length as floats because TransFig uses
  860. X       * floats for these, but they are rounded to ints internally to xfig.
  861. X       */
  862. X!     /* read the leading blanks for the string, but delete the first one later */
  863. X! #ifdef linux
  864. X!     {
  865. X!     char replaced;
  866. X!     int pos;
  867. X!     register int len;
  868. X!     pos = 0;
  869. X!     len = strlen(buf);
  870. X!     while (((unsigned char) buf[pos] <= 'e' ) &&
  871. X!         ((unsigned char) buf[pos] >= ' ' ) && buf[pos] )
  872. X!             pos++;
  873. X!     replaced = buf[pos];
  874. X!     buf[pos]='f';
  875. X!     n = sscanf(buf, "%*d%d%d%f%d%d%d%f%d%f%f%d%d%[^f]%[f]",
  876. X!         &t->type, &t->font, &tx_size, &t->pen,
  877. X!         &t->color, &t->depth, &t->angle,
  878. X!         &t->flags, &tx_height, &tx_length,
  879. X!         &t->base_x, &t->base_y, s, junk);
  880. X!     n--;
  881. X!     if ( n < 13 ) {
  882. X!         file_msg(Err_incomp, "text", line_no);
  883. X!         free((char *) t);
  884. X!         return (NULL);
  885. X!        }
  886. X!     buf[pos]=replaced;
  887. X!     strcpy( s, buf+pos-strlen(s));
  888. X!     len=strlen(s);
  889. X!     if ( len && (s[len-1] ==  '\n') )
  890. X!         s[len-1]='\0';
  891. X!     len=strlen(s);
  892. X!     if ( len && (s[len-1] ==  1) ) {
  893. X!         n++;
  894. X!         s[len-1]='\0';
  895. X!     }
  896. X!     }
  897. X! #else
  898. X      n = sscanf(buf, "%*d%d%d%f%d%d%d%f%d%f%f%d%d%[^\1]%[\1]",
  899. X!         &t->type, &t->font, &tx_size, &t->pen,
  900. X!         &t->color, &t->depth, &t->angle,
  901. X!         &t->flags, &tx_height, &tx_length,
  902. X!         &t->base_x, &t->base_y, s, junk);
  903. X! #endif
  904. X      if (n != 13 && n != 14) {
  905. X      file_msg(Err_incomp, "text", line_no);
  906. X      free((char *) t);
  907. X***************
  908. X*** 742,754 ****
  909. X      t->size = DEFAULT;
  910. X      else
  911. X      t->size = round(tx_size);
  912. X!     while (t->angle < 0.0)
  913. X!     t->angle += M_2PI;
  914. X!     while (t->angle > M_2PI)
  915. X!     t->angle -= M_2PI;
  916. X      /* get the font struct */
  917. X      t->fontstruct = lookfont(x_fontnum(t->flags, t->font), 
  918. X!             round(t->size*zoomscale), t->angle);  
  919. X      t->height = round(tx_height);
  920. X      t->length = round(tx_length);
  921. X      fixdepth(&t->depth);
  922. X--- 778,790 ----
  923. X      t->size = DEFAULT;
  924. X      else
  925. X      t->size = round(tx_size);
  926. X! 
  927. X!     /* make sure angle is 0 to 2PI */
  928. X!     fixangle(&t->angle);
  929. X! 
  930. X      /* get the font struct */
  931. X      t->fontstruct = lookfont(x_fontnum(t->flags, t->font), 
  932. X!             round(t->size*zoomscale));  
  933. X      t->height = round(tx_height);
  934. X      t->length = round(tx_length);
  935. X      fixdepth(&t->depth);
  936. X***************
  937. X*** 843,848 ****
  938. X--- 879,895 ----
  939. X      }
  940. X  }
  941. X  
  942. X+ /* make sure angle is 0 to 2PI */
  943. X+ 
  944. X+ fixangle(angle)
  945. X+     float      *angle;
  946. X+ {
  947. X+     while (*angle < 0.0)
  948. X+     *angle += M_2PI;
  949. X+     while (*angle >= M_2PI)
  950. X+     *angle -= M_2PI;
  951. X+ }
  952. X+ 
  953. X  fixdepth(depth) 
  954. X      int          *depth;
  955. X  {
  956. X***************
  957. X*** 858,863 ****
  958. X--- 905,912 ----
  959. X      }
  960. X  }
  961. X  
  962. X+ char shift_msg[] = "The figure has objects which have negative coordinates,\ndo you wish to shift it back on the page?";
  963. X+ 
  964. X  shift_figure(obj)
  965. X  F_compound       *obj;
  966. X  {
  967. X***************
  968. X*** 900,907 ****
  969. X      }
  970. X      for (t = obj->texts; t != NULL; t = t->next) {
  971. X      int   dum;
  972. X!     text_bound_actual(t, t->angle, &llx, &lly, &urx, &ury, 
  973. X!               &dum,&dum,&dum,&dum,&dum,&dum,&dum,&dum);
  974. X      lowx = min2(llx,lowx);
  975. X      lowy = min2(lly,lowy);
  976. X      }
  977. X--- 949,956 ----
  978. X      }
  979. X      for (t = obj->texts; t != NULL; t = t->next) {
  980. X      int   dum;
  981. X!     text_bound(t, &llx, &lly, &urx, &ury, 
  982. X!           &dum,&dum,&dum,&dum,&dum,&dum,&dum,&dum);
  983. X      lowx = min2(llx,lowx);
  984. X      lowy = min2(lly,lowy);
  985. X      }
  986. X***************
  987. X*** 908,913 ****
  988. X--- 957,966 ----
  989. X      /* check if any part of the figure has negative coords */
  990. X      if (lowx >= 0 && lowy >= 0)
  991. X      return;                /* no, ok */
  992. X+ 
  993. X+     /* ask the user */
  994. X+     if (popup_query(QUERY_YESNO, shift_msg)==RESULT_NO)
  995. X+     return;
  996. X  
  997. X      /* shift the whole figure to keep it "on the page" */
  998. X      dx = dy = 0;
  999. Xdiff -rc xfig.2.1.7a/f_util.c xfig.2.1.8/f_util.c
  1000. X*** xfig.2.1.7a/f_util.c    Mon Mar 22 14:12:25 1993
  1001. X--- xfig.2.1.8/f_util.c    Tue Sep 14 09:08:25 1993
  1002. X***************
  1003. X*** 21,27 ****
  1004. X      char        name[];
  1005. X  
  1006. X  {
  1007. X!     if (*name == '\0') {
  1008. X      return (1);
  1009. X      } else {
  1010. X      return (0);
  1011. X--- 21,27 ----
  1012. X      char        name[];
  1013. X  
  1014. X  {
  1015. X!     if  (name == NULL || *name == '\0') {
  1016. X      return (1);
  1017. X      } else {
  1018. X      return (0);
  1019. X***************
  1020. X*** 74,80 ****
  1021. X  change_directory(path)
  1022. X      char       *path;
  1023. X  {
  1024. X!     if (path == NULL) {
  1025. X      *cur_dir = '\0';
  1026. X      return (0);
  1027. X      }
  1028. X--- 74,80 ----
  1029. X  change_directory(path)
  1030. X      char       *path;
  1031. END_OF_FILE
  1032.   if test 30182 -ne `wc -c <'xfig.03'`; then
  1033.     echo shar: \"'xfig.03'\" unpacked with wrong size!
  1034.   fi
  1035.   # end of 'xfig.03'
  1036. fi
  1037. echo shar: End of archive 9 \(of 16\).
  1038. cp /dev/null ark9isdone
  1039. MISSING=""
  1040. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
  1041.     if test ! -f ark${I}isdone ; then
  1042.     MISSING="${MISSING} ${I}"
  1043.     fi
  1044. done
  1045. if test "${MISSING}" = "" ; then
  1046.     echo You have unpacked all 16 archives.
  1047.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1048.     echo Creating merged patch file xfig.p2
  1049.     cat xfig.[01][0-9] > xfig.p2
  1050.     rm -f xfig.[01][0-9]
  1051. else
  1052.     echo You still must unpack the following archives:
  1053.     echo "        " ${MISSING}
  1054. fi
  1055. exit 0
  1056. exit 0 # Just in case...
  1057. -- 
  1058.   // chris@Sterling.COM           | Send comp.sources.x submissions to:
  1059. \X/  Amiga - The only way to fly! |    sources-x@sterling.com
  1060.  "It's intuitively obvious to the |
  1061.   most casual observer..."        | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
  1062.