mikew@wyse.wyse.com (Mike Wexler) (08/31/88)
Submitted-by: dana@thumper.bellcore.com (Dana A. Chee) Posting-number: Volume 1, Issue 17 Archive-name: xfig/patch4 Below are the patches which incorportate the changes that John Kohl announced in comp.windows.x. This is patch 4 (in keeping with expo) and is being submitted to comp.sources.x and stored on expo. It should create a patch file (since I didn't have one). The reason it is patchlevel 3 is to stay in line with the minor version number (which is now 3). Dana Chee Bellcore MRE 2Q-250 (201) 829-4488 dana@bellcore.com ==================== xfig.patch.4 diff -c /dev/null patchlevel.h *** /dev/null Fri Aug 26 09:30:01 1988 --- patchlevel.h Fri Aug 26 09:06:45 1988 *************** *** 0 **** --- 1 ---- + #define PATCHLEVEL 3 diff -c README.X11.orig README.X11 *** README.X11.orig Fri Aug 12 22:30:14 1988 --- README.X11 Fri Aug 26 10:28:14 1988 *************** *** 61,63 **** --- 61,78 ---- Dana Chee of Bellcore contributed lots of cleanups and put right some features I didn't know how to do properly. (Thanks, Dana.) Released to world. + + xfig 1.4.2: + + 23 Aug 88 Dana Chee (Bellcore) + Fixed color, added mouse tracking option. + + xfig 1.4.3: + + 26 Aug 88 Dana Chee (Bellcore) + Added John Kohl's changes to fix color and make + inverse video work on a monochrome display. + Allow scaling of compound objects on a side as well as + a corner. + Allow compound objects within a compound. + diff -c /tmp/panel.c panel.c *** /tmp/panel.c Fri Aug 26 09:38:46 1988 --- panel.c Thu Aug 25 11:25:16 1988 *************** *** 132,138 **** --- 132,144 ---- { XtNheight, (XtArgVal)0 }, { XtNhSpace, (XtArgVal)SWITCH_ICON_SPACING }, { XtNvSpace, (XtArgVal)SWITCH_ICON_SPACING }, + /* Fix the size of the panel window by chaining both top & bottom + to the top, and both left & right to the right */ + { XtNtop, (XtArgVal)XtChainTop}, + { XtNbottom, (XtArgVal)XtChainTop}, { XtNleft, (XtArgVal)XtChainLeft }, + { XtNright, (XtArgVal)XtChainLeft }, + { XtNresizable, (XtArgVal) FALSE }, }; extern void button_select(); *************** *** 152,157 **** --- 158,164 ---- { XtNheight, (XtArgVal)0 }, { XtNbackgroundPixmap, (XtArgVal)NULL }, { XtNcallback, (XtArgVal)button_callbacks }, + { XtNresizable, (XtArgVal) FALSE }, }; extern int PANEL_LEFT, PANEL_TOP, PANEL_HEIGHT, PANEL_WID; *************** *** 206,212 **** XSetForeground(d, cgc, fg); XSetBackground(d, cgc, bg); - /*XCopyGC(d, gc, ~0, cgc);*/ for (i = 0; i < N_SWITCHES; ++i) { sw = &switches[i]; --- 213,218 ---- diff -c /tmp/ruler.c ruler.c *** /tmp/ruler.c Fri Aug 26 09:38:50 1988 --- ruler.c Fri Aug 26 08:51:05 1988 *************** *** 18,28 **** --- 18,36 ---- #define QUARTER_MARK 8 #define SIXTEENTH_MARK 6 + #ifndef X11 #define MARK_HT 5 #define TRM_WID 15 #define TRM_HT 8 #define SRM_WID 8 #define SRM_HT 15 + #else + #define MARK_HT 5 + #define TRM_WID 16 + #define TRM_HT 8 + #define SRM_WID 8 + #define SRM_HT 16 + #endif extern int CANVAS_HEIGHT, CANVAS_WIDTH; extern int SIDERULER_WIDTH, SIDERULER_HEIGHT; *************** *** 31,37 **** extern int TOPRULER_LEFT, TOPRULER_TOP; extern null_proc(); extern int RHS_PANEL; ! extern int tracking; static lasty = -100; static lastx = -100; --- 39,45 ---- extern int TOPRULER_LEFT, TOPRULER_TOP; extern null_proc(); extern int RHS_PANEL; ! extern int TRACKING; static lasty = -100; static lastx = -100; *************** *** 39,44 **** --- 47,53 ---- static char *number[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" }; static int troffx = -7, troffy = -10; + #ifndef X11 static short tr_marker_image[8] = { 0xFFFE, /* *************** */ 0x7FFC, /* ************* */ *************** *** 49,56 **** --- 58,78 ---- 0x0380, /* *** */ 0x0100 /* * */ }; + #else + static char tr_marker_image[16] = { + 0xFF, 0xFE, /* *************** */ + 0x7F, 0xFC, /* ************* */ + 0x3F, 0xF8, /* *********** */ + 0x1F, 0xF0, /* ********* */ + 0x0F, 0xE0, /* ******* */ + 0x07, 0xC0, /* ***** */ + 0x03, 0x80, /* *** */ + 0x01, 0x00 /* * */ + }; + #endif static mpr_static(trm_pr, TRM_WID, TRM_HT, 1, tr_marker_image); static int srroffx = 2, srroffy = -7; + #ifndef X11 static short srr_marker_image[15] = { 0x0100, /* * */ 0x0300, /* ** */ *************** *** 68,80 **** 0x0300, /* ** */ 0x0100 /* * */ }; - #ifndef X11 - static mpr_static(srrm_pr, SRM_WID, SRM_HT, 1, srr_marker_image); #else ! static mpr_static(srrm_pr, 16, SRM_HT, 1, srr_marker_image); #endif static int srloffx = -10, srloffy = -7; static short srl_marker_image[15] = { 0x8000, /* * */ 0xC000, /* ** */ --- 90,119 ---- 0x0300, /* ** */ 0x0100 /* * */ }; #else ! static char srr_marker_image[16] = { ! 0x01, /* * */ ! 0x03, /* ** */ ! 0x07, /* *** */ ! 0x0F, /* **** */ ! 0x1F, /* ***** */ ! 0x3F, /* ****** */ ! 0x7F, /* ******* */ ! 0xFF, /* ******** */ ! 0x7F, /* ******* */ ! 0x3F, /* ****** */ ! 0x1F, /* ***** */ ! 0x0F, /* **** */ ! 0x07, /* *** */ ! 0x03, /* ** */ ! 0x01, /* * */ ! 0x00 ! }; #endif + static mpr_static(srrm_pr, SRM_WID, SRM_HT, 1, srr_marker_image); static int srloffx = -10, srloffy = -7; + #ifndef X11 static short srl_marker_image[15] = { 0x8000, /* * */ 0xC000, /* ** */ *************** *** 92,102 **** 0xC000, /* ** */ 0x8000 /* * */ }; - #ifndef X11 - static mpr_static(srlm_pr, SRM_WID, SRM_HT, 1, srl_marker_image); #else ! static mpr_static(srlm_pr, 16, SRM_HT, 1, srl_marker_image); #endif #ifdef X11 static Pixmap toparrow_pm, sidearrow_pm; --- 131,157 ---- 0xC000, /* ** */ 0x8000 /* * */ }; #else ! static char srl_marker_image[16] = { ! 0x80, /* * */ ! 0xC0, /* ** */ ! 0xE0, /* *** */ ! 0xF0, /* **** */ ! 0xF8, /* ***** */ ! 0xFC, /* ****** */ ! 0xFE, /* ******* */ ! 0xFF, /* ******** */ ! 0xFE, /* ******* */ ! 0xFC, /* ****** */ ! 0xF8, /* ***** */ ! 0xF0, /* **** */ ! 0xE0, /* *** */ ! 0xC0, /* ** */ ! 0x80, /* * */ ! 0x00 ! }; #endif + static mpr_static(srlm_pr, SRM_WID, SRM_HT, 1, srl_marker_image); #ifdef X11 static Pixmap toparrow_pm, sidearrow_pm; *************** *** 111,121 **** pw_write(topruler_pixwin, x + troffx, RULER_WIDTH + troffy, TRM_WID, TRM_HT, INV_PAINT, &trm_pr, 0, 0); #else ! XCopyArea(tool_d, toparrow_pm, topruler_pixwin, gccache[INV_PAINT], 0, 0, trm_pr.width, trm_pr.height, - lastx + troffx, TOPRULER_HEIGHT + troffy); - XCopyArea(tool_d, toparrow_pm, topruler_pixwin, gccache[INV_PAINT], - 0, 0, trm_pr.width, trm_pr.height, x + troffx, TOPRULER_HEIGHT + troffy); #endif X11 lastx = x; --- 166,176 ---- pw_write(topruler_pixwin, x + troffx, RULER_WIDTH + troffy, TRM_WID, TRM_HT, INV_PAINT, &trm_pr, 0, 0); #else ! XClearArea(tool_d, topruler_pixwin,lastx + troffx, ! TOPRULER_HEIGHT + troffy,trm_pr.width, ! trm_pr.height, False); ! XCopyArea(tool_d, toparrow_pm, topruler_pixwin, topgc, 0, 0, trm_pr.width, trm_pr.height, x + troffx, TOPRULER_HEIGHT + troffy); #endif X11 lastx = x; *************** *** 181,186 **** --- 236,246 ---- { XtNhorizDistance, (XtArgVal)0 }, { XtNfromVert, (XtArgVal)NULL }, { XtNvertDistance, (XtArgVal)0 }, + { XtNresizable, (XtArgVal)FALSE }, + { XtNtop, (XtArgVal)XtRubber }, + { XtNbottom, (XtArgVal)XtRubber }, + { XtNleft, (XtArgVal)XtRubber }, + { XtNright, (XtArgVal)XtRubber }, }; extern int SIDERULER_WIDTH, SIDERULER_HEIGHT; *************** *** 193,203 **** --- 253,275 ---- ruler_args[3].value = SIDERULER_HEIGHT = CANVAS_HEIGHT; ruler_args[5].value = (XtArgVal)canvas_sw; ruler_args[7].value = (XtArgVal)topruler_sw; + /* Place the sideruler below the topruler, next to the canvas, + but fixed offset from the top of the form */ + ruler_args[10].value = (XtArgVal)XtChainTop; + ruler_args[11].value = (XtArgVal)XtRubber; + ruler_args[12].value = (XtArgVal)XtRubber; + ruler_args[13].value = (XtArgVal)XtRubber; + sideruler_sw = XtCreateWidget("sruler", labelWidgetClass, tool, ruler_args, XtNumber(ruler_args)); return(1); } + redisplay_sideruler() + { + XClearWindow(tool_d, sideruler_pixwin); + } + setup_rulers() { register int i, j; *************** *** 254,259 **** --- 326,350 ---- ruler_args[0].value = (XtArgVal)p; XtSetValues(topruler_sw, ruler_args, 1); + /* The arrows will be XORed into the rulers. + We want the foreground color in the arrow to result in + the foreground or background color in the display. + so if the source pixel is fg^bg, it produces fg when XOR'ed + with bg, and bg when XOR'ed with bg. + + If the source pixel is zero, it produces fg when XOR'ed with + fg, and bg when XOR'ed with bg. + */ + XSetForeground(tool_d, gc, fg ^ bg); + XSetBackground(tool_d, gc, 0); + + /* make pixmaps for top ruler arrow */ + toparrow_pm = XCreatePixmap(tool_d, topruler_pixwin, trm_pr.width, + trm_pr.height, + DefaultDepthOfScreen(tool_s)); + XPutImage(tool_d, toparrow_pm, gc, &trm_pr, 0, 0, 0, 0, + trm_pr.width, trm_pr.height); + /* side ruler, adjustments for digits are kludges based on 6x13 char */ p = XCreatePixmap(tool_d, sideruler_pixwin, SIDERULER_WIDTH, SIDERULER_HEIGHT, *************** *** 317,329 **** ruler_args[0].value = (XtArgVal)p; XtSetValues(sideruler_sw, ruler_args, 1); ! /* make pixmaps for ruler arrows */ ! toparrow_pm = XCreatePixmap(tool_d, topruler_pixwin, trm_pr.width, ! trm_pr.height, ! DefaultDepthOfScreen(tool_s)); ! XPutImage(tool_d, toparrow_pm, gc, &trm_pr, 0, 0, 0, 0, ! trm_pr.width, trm_pr.height); ! if( RHS_PANEL ) { sidearrow_pm = XCreatePixmap(tool_d, sideruler_pixwin, --- 408,418 ---- ruler_args[0].value = (XtArgVal)p; XtSetValues(sideruler_sw, ruler_args, 1); ! /* Colors set as above */ ! XSetForeground(tool_d, gc, fg ^ bg); ! XSetBackground(tool_d, gc, 0); ! ! /* make pixmaps for side ruler arrow */ if( RHS_PANEL ) { sidearrow_pm = XCreatePixmap(tool_d, sideruler_pixwin, *************** *** 434,443 **** --- 523,545 ---- ruler_args[2].value = TOPRULER_WIDTH = CANVAS_WIDTH;; ruler_args[3].value = TOPRULER_HEIGHT = RULER_WIDTH; ruler_args[5].value = (XtArgVal)panel_sw; + ruler_args[7].value = (XtArgVal)NULL; + /* fix the top & bottom to the top of the form, + the left to the panel, and the right is rubber */ + ruler_args[10].value = (XtArgVal)XtChainTop; + ruler_args[11].value = (XtArgVal)XtChainTop; + ruler_args[12].value = (XtArgVal)XtRubber; + ruler_args[13].value = (XtArgVal)XtRubber; + topruler_sw = XtCreateWidget("truler", labelWidgetClass, tool, ruler_args, XtNumber(ruler_args)); return(1); } + + redisplay_topruler() + { + XClearWindow(tool_d, topruler_pixwin); + } #endif X11 #ifndef X11 *************** *** 479,485 **** set_rulermark(x, y) int x, y; { ! if( tracking ) { set_siderulermark(y); set_toprulermark(x); --- 581,587 ---- set_rulermark(x, y) int x, y; { ! if( TRACKING ) { set_siderulermark(y); set_toprulermark(x); *************** *** 486,491 **** --- 588,601 ---- } } + #ifdef X11 + redisplay_rulers() + { + redisplay_topruler(); + redisplay_sideruler(); + } + #endif + set_siderulermark(y) int y; { *************** *** 508,528 **** lasty = sy; #else if( RHS_PANEL ) { XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! gccache[INV_PAINT], 0, 0, srlm_pr.width, ! srlm_pr.height, RULER_WIDTH+srloffx, lasty + srloffy); ! XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! gccache[INV_PAINT], 0, 0, srlm_pr.width, srlm_pr.height, RULER_WIDTH+srloffx, y + srloffy); } else { XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! gccache[INV_PAINT], 0, 0, srrm_pr.width, ! srrm_pr.height, -srroffx, lasty + srroffy); ! XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! gccache[INV_PAINT], 0, 0, srrm_pr.width, ! srrm_pr.height, -srroffx, y + srroffy); } lasty = y; #endif X11 --- 618,642 ---- lasty = sy; #else if( RHS_PANEL ) { + /* Because the ruler uses a background pixmap, we can win + here by using XClearArea to erase the old thing. */ + XClearArea(tool_d, sideruler_pixwin, + RULER_WIDTH+srloffx, lasty + srloffy, + srlm_pr.width, srlm_pr.height, False); XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! sidegc, 0, 0, srlm_pr.width, srlm_pr.height, RULER_WIDTH+srloffx, y + srloffy); } else { + /* Because the ruler uses a background pixmap, we can win + here by using XClearArea to erase the old thing. */ + XClearArea(tool_d, sideruler_pixwin, + srroffx, lasty + srroffy, + srlm_pr.width, srlm_pr.height, False); XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin, ! sidegc, 0, 0, srrm_pr.width, ! srrm_pr.height, srroffx, y + srroffy); } lasty = y; #endif X11 diff -c /tmp/main.c main.c *** /tmp/main.c Fri Aug 26 09:38:54 1988 --- main.c Thu Aug 25 11:19:36 1988 *************** *** 54,65 **** extern int DEBUG; extern int RHS_PANEL; extern int INVERSE; TOOL tool; int WINDOW_WIDTH, WINDOW_HEIGHT; char file_header[32] = "#FIG "; static char *file = NULL; - int tracking = 1; get_args(argc, argv) int argc; --- 54,65 ---- extern int DEBUG; extern int RHS_PANEL; extern int INVERSE; + extern int TRACKING; TOOL tool; int WINDOW_WIDTH, WINDOW_HEIGHT; char file_header[32] = "#FIG "; static char *file = NULL; get_args(argc, argv) int argc; *************** *** 115,125 **** break; case 't': /* turn on tracking */ ! tracking = 1; break; case 'n': /* turn off tracking */ ! tracking = 0; break; default: --- 115,125 ---- break; case 't': /* turn on tracking */ ! TRACKING = 1; break; case 'n': /* turn off tracking */ ! TRACKING = 0; break; default: *************** *** 192,198 **** {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(int), (Cardinal)&INVERSE, XtRBoolean, (caddr_t)&false}, {"trackCursor", "Track", XtRBoolean, sizeof(int), ! (Cardinal)&tracking, XtRBoolean, (caddr_t)&true}, }; static XrmOptionDescRec options[] = --- 192,198 ---- {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(int), (Cardinal)&INVERSE, XtRBoolean, (caddr_t)&false}, {"trackCursor", "Track", XtRBoolean, sizeof(int), ! (Cardinal)&TRACKING, XtRBoolean, (caddr_t)&true}, }; static XrmOptionDescRec options[] = *************** *** 247,252 **** --- 247,283 ---- tool_sn = DefaultScreen(tool_d); gc = DefaultGC(tool_d, tool_sn); + + if( CellsOfScreen(tool_s) == 2 && INVERSE ) + { + XrmValue value; + XrmDatabase newdb = (XrmDatabase) 0; + extern XrmDatabase XtDefaultDB; + + value.size = sizeof("White"); + value.addr = "White"; + XrmPutResource(&newdb, "xfig*borderColor", "String", + &value); + value.size = sizeof("White"); + value.addr = "White"; + XrmPutResource(&newdb, "xfig*foreground", "String", + &value); + value.size = sizeof("Black"); + value.addr = "Black"; + XrmPutResource(&newdb, "xfig*background", "String", + &value); + XrmMergeDatabases(newdb, &XtDefaultDB); + + /* now set the tool part, since its already created */ + XtSetArg(tmp_arg[0], XtNborderColor, + WhitePixelOfScreen(tool_s)); + XtSetArg(tmp_arg[1], XtNforeground, + WhitePixelOfScreen(tool_s)); + XtSetArg(tmp_arg[2], XtNbackground, + BlackPixelOfScreen(tool_s)); + XtSetValues(tool, tmp_arg, 3); + } + init_font(); init_cursor(); form = XtCreateManagedWidget("form", formWidgetClass, tool, *************** *** 264,270 **** CANVAS_HEIGHT = landscape ? DEF_CANVAS_WIDTH : DEF_CANVAS_HEIGHT; ! if( CANVAS_HEIGHT < DEF_CANVAS_HEIGHT ) ICON_COLUMN = ICON_COLUMN_LAND; (void)init_panel(form); --- 295,302 ---- CANVAS_HEIGHT = landscape ? DEF_CANVAS_WIDTH : DEF_CANVAS_HEIGHT; ! if( (CANVAS_HEIGHT < DEF_CANVAS_HEIGHT) || ! (HeightOfScreen(tool_s) < DEF_CANVAS_HEIGHT) ) ICON_COLUMN = ICON_COLUMN_LAND; (void)init_panel(form); diff -c /tmp/version.h version.h *** /tmp/version.h Fri Aug 26 09:38:57 1988 --- version.h Wed Aug 24 08:30:22 1988 *************** *** 8,11 **** */ #define FIG_VERSION "1.4" ! #define MINOR_VERSION ".2" --- 8,11 ---- */ #define FIG_VERSION "1.4" ! #define MINOR_VERSION ".3" diff -c /tmp/xfig.1 xfig.1 *** /tmp/xfig.1 Fri Aug 26 09:38:59 1988 --- xfig.1 Thu Aug 25 15:34:19 1988 *************** *** 263,269 **** Create ellipses using the same procedure as for the drawing of circles. .TP .I GLUE ! Glue the primitive objects within a bounding box into a compound object (the bounding box itself is not part of the figure; it is a visual aid for manipulating the compound). .TP --- 263,269 ---- Create ellipses using the same procedure as for the drawing of circles. .TP .I GLUE ! Glue the objects within a bounding box into a compound object (the bounding box itself is not part of the figure; it is a visual aid for manipulating the compound). .TP *************** *** 302,307 **** --- 302,309 ---- Only compound objects can be scaled. Click the left button on a corner of the bounding box, stretch the bounding box to the desired size, and click the middle button. + Or click the left button on a side of the bounding box, stretch that + side to the desired size, and click the middle button. .TP .I SPLINE Create (quadratic spline) spline objects. *************** *** 313,319 **** .I TEXT Create text strings. Click the left button at the desired position on the canvas window, then enter text from the keyboard. ! Terminate by clicking the middle button or typing the return key. .TP .I TURN Turn \fIPOLYGON\fP into a \fICLOSED INTERPOLATED SPLINE\fP object, or --- 315,325 ---- .I TEXT Create text strings. Click the left button at the desired position on the canvas window, then enter text from the keyboard. ! A DEL or ^H (backspace) will delete a character, while a ^U will kill ! the entire line. ! Terminate by clicking the middle button or typing the return key. To ! edit text, click on an existing text string with the left button. ! Insertion of characters will take place at that point. .TP .I TURN Turn \fIPOLYGON\fP into a \fICLOSED INTERPOLATED SPLINE\fP object, or *************** *** 466,484 **** .SH ACKNOWLEDGEMENT Many thanks goes to Professor Donald E. Fussell who inspired the creation of this tool. ! .SH AUTHOR Supoj Sutanthavibul .br University of Texas at Austin .br ! (supoj@sally.UTEXAS.EDU) .sp ! Manual page modified by R. P. C. Rodgers, UCSF School of Pharmacy, San Francisco, CA 94118 .sp ! Frank Schmuck of Cornell contributed the LaTeX line drawing modes. .sp ! X11 port by Ken Yap (ken@cs.rochester.edu). .sp Variable window sizes, cleanup of X11 port, right hand side panel ! under X11, X11 manual page provided by Dana Chee (dana@bellcore.com). --- 472,522 ---- .SH ACKNOWLEDGEMENT Many thanks goes to Professor Donald E. Fussell who inspired the creation of this tool. ! .SH AUTHORS ! Original author: ! .br Supoj Sutanthavibul .br University of Texas at Austin .br ! (supoj@sally.utexas.edu) .sp ! Manual page modified by: ! .br ! R. P. C. Rodgers ! .br ! UCSF School of Pharmacy ! .br San Francisco, CA 94118 .sp ! The LaTeX line drawing modes were contributed by: ! .br ! Frank Schmuck ! .br ! Cornell University .sp ! X11 port by: ! .br ! Ken Yap ! .br ! Rochester ! .br ! (ken@cs.rochester.edu) .sp Variable window sizes, cleanup of X11 port, right hand side panel ! under X11, X11 manual page provided by: ! .br ! Dana Chee ! .br ! Bellcore ! .br ! (dana@bellcore.com) ! .sp ! Cleanup of color port to X11 by: ! .br ! John T. Kohl ! .br ! MIT ! .br ! (jtkohl@athena.mit.edu) ! diff -c /tmp/scale.c scale.c *** /tmp/scale.c Fri Aug 26 09:39:02 1988 --- scale.c Thu Aug 25 15:51:04 1988 *************** *** 21,27 **** extern int fix_x, fix_y, cur_x, cur_y; extern F_pos last_position, new_position; /* used in undo */ ! extern F_compound *compound_point_search(); extern (*canvas_kbd_proc)(); extern (*canvas_locmove_proc)(); extern (*canvas_leftbut_proc)(); --- 21,27 ---- extern int fix_x, fix_y, cur_x, cur_y; extern F_pos last_position, new_position; /* used in undo */ ! extern F_compound *compound_point_search(), *compound_search(); extern (*canvas_kbd_proc)(); extern (*canvas_locmove_proc)(); extern (*canvas_leftbut_proc)(); *************** *** 32,41 **** prescale_compound(), elastic_compoundbox(); static F_compound *compound; static double cosa, sina; static int fromx, fromy; - init_scale_compound(); scale_compound_selected() --- 32,42 ---- prescale_compound(), elastic_compoundbox(); + static enum {WEST, NORTH, EAST, SOUTH, CORNER} side; + static int save_coord; static F_compound *compound; static double cosa, sina; static int fromx, fromy; init_scale_compound(); scale_compound_selected() *************** *** 53,89 **** int x, y; { double dx, dy, l; ! ! if ((compound = compound_point_search(x, y, TOLERANCE, &cur_x, &cur_y)) ! == NULL) { ! return; ! } ! if (compound->nwcorner.x == cur_x) ! fix_x = compound->secorner.x; ! else ! fix_x = compound->nwcorner.x; ! if (compound->nwcorner.y == cur_y) ! fix_y = compound->secorner.y; ! else ! fix_y = compound->nwcorner.y; ! ! dx = cur_x - fix_x; dy = cur_y - fix_y; ! l = sqrt(dx*dx + dy*dy); ! cosa = fabs(dx / l); sina = fabs(dy / l); ! ! fromx = cur_x; fromy = cur_y; ! win_setmouseposition(canvas_swfd, cur_x, cur_y); ! draw_compoundbox(compound, INV_PAINT); ! draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT); ! set_latestcompound(compound); ! canvas_locmove_proc = elastic_compoundbox; ! canvas_middlebut_proc = prescale_compound; ! canvas_leftbut_proc = canvas_rightbut_proc = null_proc; ! set_action_on(); ! set_temp_cursor(&null_cursor); ! win_setmouseposition(canvas_swfd, x, y); } elastic_compoundbox(x, y) int x, y; { --- 54,149 ---- int x, y; { double dx, dy, l; ! ! if ((compound = compound_point_search(x, y, TOLERANCE, &cur_x, ! &cur_y)) != NULL) ! { ! if (compound->nwcorner.x == cur_x) ! fix_x = compound->secorner.x; ! else ! fix_x = compound->nwcorner.x; ! if (compound->nwcorner.y == cur_y) ! fix_y = compound->secorner.y; ! else ! fix_y = compound->nwcorner.y; ! ! side = CORNER; ! dx = cur_x - fix_x; dy = cur_y - fix_y; ! l = sqrt(dx*dx + dy*dy); ! cosa = fabs(dx / l); sina = fabs(dy / l); ! ! fromx = cur_x; fromy = cur_y; ! win_setmouseposition(canvas_swfd, cur_x, cur_y); ! draw_compoundbox(compound, INV_PAINT); ! draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT); ! set_latestcompound(compound); ! canvas_locmove_proc = elastic_compoundbox; ! canvas_middlebut_proc = prescale_compound; ! canvas_leftbut_proc = canvas_rightbut_proc = null_proc; ! set_action_on(); ! set_temp_cursor(&null_cursor); ! win_setmouseposition(canvas_swfd, x, y); } + else if ((compound = compound_search(x, y, TOLERANCE, &cur_x, &cur_y)) + != NULL ) + { + /* figure out which side the cursor is close to. */ + if (compound->nwcorner.x == cur_x) + side = WEST; + else if (compound->nwcorner.y == cur_y) + side = NORTH; + else if (compound->secorner.x == cur_x) + side = EAST; + else if (compound->secorner.y == cur_y) + side = SOUTH; + else + return; + + /* figure out a fixed point of the compound for scaling */ + switch (side) { + case WEST: + case NORTH: + fix_x = compound->secorner.x; + fix_y = compound->secorner.y; + cur_x = compound->nwcorner.x; + cur_y = compound->nwcorner.y; + break; + case EAST: + case SOUTH: + fix_x = compound->nwcorner.x; + fix_y = compound->nwcorner.y; + cur_x = compound->secorner.x; + cur_y = compound->secorner.y; + break; + } + + /* save initial corner position */ + fromx = cur_x; fromy = cur_y; + /* save x or y coordinate for restoring the cursor */ + /* at the end of the scaling */ + switch (side) { + case NORTH: case SOUTH: + save_coord = x; + break; + case EAST: case WEST: + save_coord = y; + break; + } + /* erase the compound box. */ + win_setmouseposition(canvas_swfd, cur_x, cur_y); + draw_compoundbox(compound, INV_PAINT); + draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT); + set_latestcompound(compound); + canvas_locmove_proc = elastic_compoundbox; + canvas_middlebut_proc = prescale_compound; + canvas_leftbut_proc = canvas_rightbut_proc = null_proc; + set_action_on(); + set_temp_cursor(&null_cursor); + win_setmouseposition(canvas_swfd, x, y); + } + } + elastic_compoundbox(x, y) int x, y; { *************** *** 98,115 **** { double xx, yy, d; ! xx = x - fix_x; ! yy = y - fix_y; ! d = sqrt(xx*xx + yy*yy); ! if (xx < 0) ! cur_x = fix_x - round(d * cosa); ! else ! cur_x = fix_x + round(d * cosa); ! if (yy < 0) ! cur_y = fix_y - round(d * sina); ! else ! cur_y = fix_y + round(d * sina); } prescale_compound(x, y) int x, y; --- 158,187 ---- { double xx, yy, d; ! switch(side) { ! case CORNER: ! xx = x - fix_x; ! yy = y - fix_y; ! d = sqrt(xx*xx + yy*yy); ! if (xx < 0) ! cur_x = fix_x - round(d * cosa); ! else ! cur_x = fix_x + round(d * cosa); ! if (yy < 0) ! cur_y = fix_y - round(d * sina); ! else ! cur_y = fix_y + round(d * sina); ! break; ! case NORTH: ! case SOUTH: ! cur_y = y; ! break; ! case EAST: ! case WEST: ! cur_x = x; ! break; } + } prescale_compound(x, y) int x, y; *************** *** 130,135 **** --- 202,218 ---- last_position.y = fromy; new_position.x = cur_x; new_position.y = cur_y; + /* update cursor position for single axis scaling. */ + switch (side) { + case NORTH: case SOUTH: + /* maintain old horiz. pos. */ + cur_x = save_coord; + break; + case EAST: case WEST: + /* maintain old vert. pos. */ + cur_y = save_coord; + break; + } clean_up(); set_action_object(F_SCALE, O_COMPOUND); set_latestcompound(compound); *************** *** 147,152 **** --- 230,236 ---- F_ellipse *e; F_text *t; F_arc *a; + F_compound *c1; int x1, y1, x2, y2; x1 = round(refx + (c->nwcorner.x - refx) * sx); *************** *** 172,177 **** --- 256,264 ---- } for (t = c->texts; t != NULL; t = t->next) { scale_text(t, sx, sy, refx, refy); + } + for (c1 = c->compounds; c1 != NULL; c1 = c1->next) { + scale_compound(c1, sx, sy, refx, refy); } } diff -c /tmp/canvas.c canvas.c *** /tmp/canvas.c Fri Aug 26 09:39:05 1988 --- canvas.c Fri Aug 26 08:51:04 1988 *************** *** 150,155 **** --- 150,156 ---- { XtNhorizDistance, (XtArgVal)0 }, { XtNfromVert, (XtArgVal)NULL }, { XtNvertDistance, (XtArgVal)0 }, + { XtNtop, (XtArgVal)XtChainTop }, }; static void canvas_exposed(tool, event, params, nparams) *************** *** 161,166 **** --- 162,168 ---- if (((XExposeEvent *)event)->count > 0) return; redisplay_canvas(); + redisplay_rulers(); } static void set_pos(tool, event, params, nparams) *************** *** 193,201 **** --- 195,210 ---- <Key>:Event()\n\ <Expose>:Expose()\n"; + static Arg canvas_color_args[] = { + { XtNforeground, (XtArgVal) &x_fg_color.pixel }, + { XtNbackground, (XtArgVal) &x_bg_color.pixel }, + }; + int init_canvas(tool) TOOL tool; { + XColor fixcolors[2]; + canvas_args[3].value = CANVAS_WIDTH; canvas_args[4].value = CANVAS_HEIGHT; canvas_args[5].value = (XtArgVal)panel_sw; *************** *** 202,207 **** --- 211,233 ---- canvas_args[7].value = (XtArgVal)topruler_sw; canvas_sw = XtCreateWidget("canvas", labelWidgetClass, tool, canvas_args, XtNumber(canvas_args)); + XtGetValues(canvas_sw, canvas_color_args, XtNumber(canvas_color_args)); + + /* get the RGB values for recolor cursor use -- may want to have + cursor color resource */ + fixcolors[0] = x_fg_color; + fixcolors[1] = x_bg_color; + XQueryColors(tool_d, DefaultColormapOfScreen(tool_s), fixcolors, 2); + x_fg_color = fixcolors[0]; + x_bg_color = fixcolors[1]; + + /* now fix the global GC */ + XSetState(tool_d, gc, x_fg_color.pixel, x_bg_color.pixel, GXcopy, + AllPlanes); + + /* and recolor the cursors */ + recolor_cursors(); + canvas_leftbut_proc = null_proc; canvas_middlebut_proc = null_proc; canvas_rightbut_proc = null_proc; *************** *** 240,245 **** --- 266,286 ---- switch (event->type) { case MotionNotify: + { + Window rw, cw; + static int sx = -10000, sy = -10000; + int rx, ry, cx, cy; + unsigned int mask; + + XQueryPointer(event->display, event->window, + &rw, &cw, + &rx, &ry, + &cx, &cy, + &mask); + if(cx == sx && cy == sy) break; + x = sx = cx; + y = sy = cy; + } set_rulermark(x, y); (*canvas_locmove_proc)(x, y); break; diff -c /tmp/cursor.c cursor.c *** /tmp/cursor.c Fri Aug 26 09:39:07 1988 --- cursor.c Wed Aug 24 15:37:56 1988 *************** *** 106,109 **** --- 106,128 ---- vbar_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_xterm); wait_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_watch); } + recolor_cursors() + { + register Display *d = tool_d; + + XRecolorCursor(d, (Cursor)arrow_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)bull_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)buster_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)char_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)crosshair_cursor.bitmap, &x_fg_color, + &x_bg_color); + XRecolorCursor(d, (Cursor)null_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)magnifier_cursor.bitmap, &x_fg_color, + &x_bg_color); + XRecolorCursor(d, (Cursor)pencil_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)pick15_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)pick9_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)vbar_cursor.bitmap, &x_fg_color, &x_bg_color); + XRecolorCursor(d, (Cursor)wait_cursor.bitmap, &x_fg_color, &x_bg_color); + } #endif X11 diff -c /tmp/xtra.c xtra.c *** /tmp/xtra.c Fri Aug 26 09:39:09 1988 --- xtra.c Fri Aug 26 08:51:07 1988 *************** *** 12,17 **** --- 12,24 ---- #include "paintop.h" #include "font.h" + #define CTRL_H 8 + #define NL 10 + #define CR 13 + #define CTRL_U 21 + #define CTRL_X 24 + #define DEL 127 + pr_size pf_textwidth(n, f, s) int n; XFontStruct *f; *************** *** 27,50 **** return (ret); } ! static GC makegc(op) { register GC ngc; XGCValues gcv; ! ngc = XCreateGC(tool_d, XtWindow(canvas_sw), 0, &gcv); ! XCopyGC(tool_d, gc, ~0, ngc); ! XSetFunction(tool_d, ngc, op); ! XSetFont(tool_d, ngc, roman_font->fid); return (ngc); } init_gc() { ! gccache[PAINT] = makegc(PAINT); ! gccache[ERASE] = makegc(ERASE); ! gccache[INV_PAINT] = makegc(INV_PAINT); ! gccache[MERGE] = makegc(MERGE); } /* --- 34,110 ---- return (ret); } ! static GC makegc(op, fg, bg) ! int op; ! Pixel fg; ! Pixel bg; { register GC ngc; XGCValues gcv; + int gcmask; ! gcv.font = roman_font->fid; ! gcmask = GCFunction|GCForeground|GCBackground|GCFont; ! switch (op) { ! case PAINT: ! gcv.foreground = fg; ! gcv.background = bg; ! gcv.function = GXcopy; ! break; ! case ERASE: ! gcv.foreground = bg; ! gcv.background = bg; ! gcv.function = GXcopy; ! break; ! case INV_PAINT: ! gcv.foreground = fg ^ bg; ! gcv.background = bg; ! gcv.function = GXxor; ! break; ! case MERGE: ! gcv.foreground = fg; ! gcv.background = bg; ! gcv.function = GXor; ! break; ! } ! ! ngc = XCreateGC(tool_d, XtWindow(canvas_sw), gcmask, &gcv); ! XCopyGC(tool_d, gc, ~(gcmask), ngc); return (ngc); } + static GC msg_gccache[0x10]; + init_gc() { ! Pixel bg, fg; ! Arg tmp_arg[2]; ! ! gccache[PAINT] = makegc(PAINT, x_fg_color.pixel, x_bg_color.pixel); ! gccache[ERASE] = makegc(ERASE, x_fg_color.pixel, x_bg_color.pixel); ! gccache[INV_PAINT] = makegc(INV_PAINT, x_fg_color.pixel, ! x_bg_color.pixel); ! gccache[MERGE] = makegc(MERGE, x_fg_color.pixel, x_bg_color.pixel); ! ! /* Need to get the values so we can make GC's which XOR correctly */ ! XtSetArg(tmp_arg[0], XtNforeground, &fg); ! XtSetArg(tmp_arg[1], XtNbackground, &bg); ! XtGetValues(msg_sw, tmp_arg, 2); ! ! msg_gccache[PAINT] = makegc(PAINT, fg, bg); ! msg_gccache[ERASE] = makegc(ERASE, fg, bg); ! ! XtSetArg(tmp_arg[0], XtNforeground, &fg); ! XtSetArg(tmp_arg[1], XtNbackground, &bg); ! XtGetValues(topruler_sw, tmp_arg, 2); ! ! topgc = makegc(INV_PAINT, fg, bg); ! ! XtSetArg(tmp_arg[0], XtNforeground, &fg); ! XtSetArg(tmp_arg[1], XtNbackground, &bg); ! XtGetValues(sideruler_sw, tmp_arg, 2); ! ! sidegc = makegc(INV_PAINT, fg, bg); } /* *************** *** 117,127 **** XWindowAttributes attr; XClearArea(tool_d, msgswfd, 0, 0, 0, 0, False); ! /* uses knowledge that gccache[PAINT] uses roman_font - tsk */ len = strlen(prompt); width = char_width(roman_font); y = char_height(roman_font) + 2; ! XDrawString(tool_d, msgswfd, gccache[PAINT], 2, y, prompt, len); x = width * len + 4; XGetWindowAttributes(tool_d, msgswfd, &attr); XSelectInput(tool_d, msgswfd, attr.your_event_mask | KeyPressMask); --- 177,187 ---- XWindowAttributes attr; XClearArea(tool_d, msgswfd, 0, 0, 0, 0, False); ! /* uses knowledge that msg_gccache[PAINT] uses roman_font - tsk */ len = strlen(prompt); width = char_width(roman_font); y = char_height(roman_font) + 2; ! XDrawString(tool_d, msgswfd, msg_gccache[PAINT], 2, y, prompt, len); x = width * len + 4; XGetWindowAttributes(tool_d, msgswfd, &attr); XSelectInput(tool_d, msgswfd, attr.your_event_mask | KeyPressMask); *************** *** 134,161 **** continue; switch (buf[0]) { ! case '\b': ! case '\0177': if (r != reply) { x -= width; --r; ! XDrawString(tool_d, msgswfd, gccache[ERASE], x, y, r, 1); } break; ! case 'U' & 0x1f: ! case 'X' & 0x1f: while (r != reply) { x -= width; --r; ! XDrawString(tool_d, msgswfd, gccache[ERASE], x, y, r, 1); } break; ! case '\n': ! case '\r': *r = '\0'; XClearArea(tool_d, msgswfd, 0, 0, 0, 0, False); return; --- 194,221 ---- continue; switch (buf[0]) { ! case CTRL_H: ! case DEL: if (r != reply) { x -= width; --r; ! XDrawString(tool_d, msgswfd, msg_gccache[ERASE], x, y, r, 1); } break; ! case CTRL_U: ! case CTRL_X: while (r != reply) { x -= width; --r; ! XDrawString(tool_d, msgswfd, msg_gccache[ERASE], x, y, r, 1); } break; ! case CR: ! case NL: *r = '\0'; XClearArea(tool_d, msgswfd, 0, 0, 0, 0, False); return; *************** *** 162,168 **** default: if (buf[0] < ' ' || buf[0] > '~') continue; ! XDrawString(tool_d, msgswfd, gccache[PAINT], x, y, buf, 1); x += width; *r++ = buf[0]; --- 222,228 ---- default: if (buf[0] < ' ' || buf[0] > '~') continue; ! XDrawString(tool_d, msgswfd, msg_gccache[PAINT], x, y, buf, 1); x += width; *r++ = buf[0]; diff -c /tmp/glue.c glue.c *** /tmp/glue.c Fri Aug 26 09:39:11 1988 --- glue.c Thu Aug 25 12:08:44 1988 *************** *** 106,111 **** --- 106,113 ---- c->secorner.x, c->secorner.y); get_arc(&c->arcs, c->nwcorner.x, c->nwcorner.y, c->secorner.x, c->secorner.y); + get_compound(&c->compounds, c->nwcorner.x, c->nwcorner.y, + c->secorner.x, c->secorner.y); /* get rid of point-marker */ if (pointmarker_shown) toggle_compoundpointmarker(c); if (c->ellipses != NULL) return(1); *************** *** 113,118 **** --- 115,121 ---- if (c->lines != NULL) return(1); if (c->texts != NULL) return(1); if (c->arcs != NULL) return(1); + if (c->compounds != NULL) return(1); return(0); } *************** *** 269,274 **** --- 272,318 ---- } } + get_compound(list, xmin, ymin, xmax, ymax) + F_compound **list; + int xmin, ymin, xmax, ymax; + { + F_compound *compd, *c, *cc; + for (c = objects.compounds; c != NULL;) + { + if (xmin > c->nwcorner.x) + { + cc = c; + c = c->next; + continue; + } + if (xmax < c->secorner.x) + { + cc = c; + c = c->next; + continue; + } + if (ymin > c->nwcorner.y) + { + cc = c; + c = c->next; + continue; + } + if (ymax < c->secorner.y) + { + cc = c; + c = c->next; + continue; + } + compd = c; + if (c == objects.compounds) + c = objects.compounds = objects.compounds->next; + else + c = cc->next = c->next; + compd->next = *list; + *list = compd; + } + } + F_compound * compound_point_search(x, y, tol, px, py) int x, y, tol, *px, *py; *************** *** 308,314 **** F_compound *c; { draw_compoundelements(c, foreground_color, foreground_color, ! PAINT, PAINT, PAINT); } erase_compound(c) --- 352,358 ---- F_compound *c; { draw_compoundelements(c, foreground_color, foreground_color, ! PAINT, PAINT, PAINT, PAINT); } erase_compound(c) *************** *** 315,326 **** F_compound *c; { draw_compoundelements(c, background_color, background_color, ! ERASE, ERASE, INV_PAINT); } ! draw_compoundelements(c, arcop, ellipseop, lineop, splineop, textop) F_compound *c; ! int arcop, ellipseop, lineop, splineop, textop; { F_line *l; F_spline *s; --- 359,370 ---- F_compound *c; { draw_compoundelements(c, background_color, background_color, ! ERASE, ERASE, INV_PAINT, ERASE); } ! draw_compoundelements(c, arcop, ellipseop, lineop, splineop, textop, compop) F_compound *c; ! int arcop, ellipseop, lineop, splineop, textop, compop; { F_line *l; F_spline *s; *************** *** 327,333 **** F_ellipse *e; F_text *t; F_arc *a; ! pw_batch_on(canvas_pixwin); for (l = c->lines; l != NULL; l = l->next) { draw_line(l, lineop); --- 371,378 ---- F_ellipse *e; F_text *t; F_arc *a; ! F_compound *c1; ! pw_batch_on(canvas_pixwin); for (l = c->lines; l != NULL; l = l->next) { draw_line(l, lineop); *************** *** 344,349 **** --- 389,398 ---- for (t = c->texts; t != NULL; t = t->next) { draw_text(t, textop); } + for (c1 = c->compounds; c1 != NULL; c1 = c1->next) { + draw_compoundbox(c1, INV_PAINT); + compop == ERASE ? erase_compound(c1) : draw_compound(c1); + } pw_batch_off(canvas_pixwin); } *************** *** 414,416 **** --- 463,468 ---- for (c = objects.compounds; c != NULL; c = c->next) draw_compoundbox(c, INV_PAINT); } + + + diff -c /tmp/resources.h resources.h *** /tmp/resources.h Fri Aug 26 09:39:14 1988 --- resources.h Thu Aug 25 13:27:17 1988 *************** *** 146,152 **** EXTERN Display *tool_d; EXTERN Screen *tool_s; EXTERN int tool_sn; ! EXTERN GC gc, gccache[0x10]; struct icon { short ic_width, ic_height; /* overall icon dimensions */ --- 146,153 ---- EXTERN Display *tool_d; EXTERN Screen *tool_s; EXTERN int tool_sn; ! EXTERN GC gc, gccache[0x10], topgc, sidegc; ! EXTERN XColor x_fg_color, x_bg_color; struct icon { short ic_width, ic_height; /* overall icon dimensions */ diff -c /tmp/global.c global.c *** /tmp/global.c Fri Aug 26 09:39:16 1988 --- global.c Thu Aug 25 11:21:04 1988 *************** *** 115,120 **** --- 115,121 ---- int DEBUG = 0; int RHS_PANEL = 0; int INVERSE = 0; + int TRACKING = 1; /************************ Status ****************************/ diff -c /tmp/popup.c popup.c *** /tmp/popup.c Fri Aug 26 09:39:18 1988 --- popup.c Thu Aug 25 14:17:11 1988 *************** *** 96,102 **** XtTranslations popdown_actions, pane_actions; menu = XtCreatePopupShell("popup_menu", overrideShellWidgetClass, tool, ! menu_args, 0); popdown_actions = XtParseTranslationTable( "<Btn3Up>:MenuPopdown()\n\ <LeaveWindow>:MenuPopdown()\n"); --- 96,102 ---- XtTranslations popdown_actions, pane_actions; menu = XtCreatePopupShell("popup_menu", overrideShellWidgetClass, tool, ! menu_args, XtNumber(menu_args)); popdown_actions = XtParseTranslationTable( "<Btn3Up>:MenuPopdown()\n\ <LeaveWindow>:MenuPopdown()\n"); diff -c /tmp/flip.c flip.c *** /tmp/flip.c Fri Aug 26 09:39:21 1988 --- flip.c Thu Aug 25 15:54:51 1988 *************** *** 371,376 **** --- 371,377 ---- F_ellipse *e; F_spline *s; F_text *t; + F_compound *c1; int p, q; switch(flip_axis) { *************** *** 397,400 **** --- 398,403 ---- flip_spline(s, x, y, flip_axis); for (t = c->texts; t != NULL; t = t->next) flip_text(t, x, y, flip_axis); + for (c1 = c->compounds; c1 != NULL; c1 = c1->next) + flip_compound(c1, x, y, flip_axis); } diff -c /tmp/rotate.c rotate.c *** /tmp/rotate.c Fri Aug 26 09:39:24 1988 --- rotate.c Thu Aug 25 15:59:51 1988 *************** *** 441,446 **** --- 441,447 ---- F_ellipse *e; F_spline *s; F_text *t; + F_compound *c1; int x1, y1, x2, y2; switch(rotate_angle) { *************** *** 471,474 **** --- 472,477 ---- rotate_spline(s, x, y, rotate_angle); for (t = c->texts; t != NULL; t = t->next) rotate_text(t, x, y, rotate_angle); + for (c1 = c->compounds; c1 != NULL; c1 = c1->next) + rotate_compound(c1, x, y, rotate_angle); } -- Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330