v12i031: tgif, Part15/23
William Cheng
william at CS.UCLA.EDU
Thu Mar 14 03:23:00 AEST 1991
Submitted-by: william at CS.UCLA.EDU (William Cheng)
Posting-number: Volume 12, Issue 31
Archive-name: tgif/part15
---------------------------------> cut here <---------------------------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 15 (of 23)."
# Contents: stk.c stretch.c
# Wrapped by william at oahu on Wed Mar 6 09:57:48 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'stk.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'stk.c'\"
else
echo shar: Extracting \"'stk.c'\" \(6069 characters\)
sed "s/^X//" >'stk.c' <<'END_OF_FILE'
X/*
X * Author: William Chia-Wei Cheng (william at cs.ucla.edu)
X *
X * Copyright (C) 1990, 1991, William Cheng.
X */
X#ifndef lint
Xstatic char RCSid[] =
X "@(#)$Header: /tmp_mnt/n/kona/tangram/u/william/X11/TGIF2/RCS/stk.c,v 2.0 91/03/05 12:48:31 william Exp $";
X#endif
X
X#include <stdio.h>
X#include <X11/Xlib.h>
X#include "const.h"
X#include "types.h"
X
X#include "align.e"
X#include "button.e"
X#include "choice.e"
X#include "color.e"
X#include "dup.e"
X#include "file.e"
X#include "font.e"
X#include "grid.e"
X#include "mark.e"
X#include "menu.e"
X#include "msg.e"
X#include "names.e"
X#include "obj.e"
X#include "pattern.e"
X#include "ruler.e"
X#include "scroll.e"
X#include "select.e"
X#include "setup.e"
X#include "text.e"
X
Xstatic struct StkRec * topStk = NULL;
X
Xint AncesterModified ()
X{
X struct StkRec * stk_ptr;
X
X for (stk_ptr = topStk; stk_ptr != NULL; stk_ptr = stk_ptr->next)
X if (stk_ptr->file_mod) return (TRUE);
X return (FALSE);
X}
X
Xvoid InitStk ()
X{
X curSymDir[0] = '\0';
X}
X
Xvoid PushIcon ()
X{
X struct StkRec * stk_ptr;
X struct ObjRec * obj_ptr;
X char sym_name[MAXPATHLENGTH], path_name[MAXPATHLENGTH];
X char file_name[MAXPATHLENGTH], s[MAXPATHLENGTH];
X FILE * fp;
X
X if (topSel == NULL || topSel != botSel || topSel->obj->type != OBJ_ICON)
X {
X Msg ("Please select one ICON object to push into.");
X return;
X }
X
X strcpy (sym_name, topSel->obj->detail.r->s);
X if (!GetSymbolPath (sym_name, path_name))
X {
X sprintf (s, "Can not find '%s.sym' in %s", sym_name, curDomainPath);
X Msg (s);
X return;
X }
X
X strcat (sym_name, ".sym");
X sprintf (file_name, "%s/%s", path_name, sym_name);
X
X if ((fp = fopen (file_name, "r")) == NULL)
X {
X sprintf (s, "Can not open '%s', icon not pushed into.", file_name);
X Msg (s);
X return;
X }
X
X HighLightReverse ();
X
X stk_ptr = (struct StkRec *) calloc (1, sizeof(struct StkRec));
X stk_ptr->next = topStk;
X stk_ptr->sel = topSel->obj;
X stk_ptr->first = topObj;
X stk_ptr->last = botObj;
X stk_ptr->file_mod = fileModified;
X stk_ptr->id = objId;
X stk_ptr->page_style = pageStyle;
X
X stk_ptr->orig_x = drawOrigX;
X stk_ptr->orig_y = drawOrigY;
X stk_ptr->zoom = zoomScale;
X stk_ptr->grid = xyGrid;
X stk_ptr->grid_on = gridOn;
X stk_ptr->color = colorIndex;
X stk_ptr->h_align = horiAlign;
X stk_ptr->v_align = vertAlign;
X stk_ptr->line_w = lineWidth;
X stk_ptr->line_s = lineStyle;
X stk_ptr->fill = objFill;
X stk_ptr->pen = penPat;
X stk_ptr->just = textJust;
X stk_ptr->font = curFont;
X stk_ptr->f_style = curStyle;
X stk_ptr->f_size = curSize;
X stk_ptr->f_dpi = curFontDPI;
X
X topObj = botObj = NULL;
X
X strcpy (stk_ptr->dir, curDir);
X if (stk_ptr->name_valid = curFileDefined)
X strcat (stk_ptr->name, curFileName);
X strcpy (stk_ptr->sym_dir, curSymDir);
X strcpy (stk_ptr->domain, curDomainName);
X
X topStk = stk_ptr;
X
X sprintf (s, "Pushing into '%s' ...", file_name);
X Msg (s);
X CleanUpDrawingWindow ();
X XClearWindow (mainDisplay, drawWindow);
X SetFileModified (FALSE);
X
X while (ReadObj (fp, &obj_ptr, FALSE))
X if (obj_ptr != NULL)
X {
X AddObj (NULL, topObj, obj_ptr);
X if (PointInBBox (obj_ptr->x, obj_ptr->y, drawWinBBox) ||
X BBoxIntersect (obj_ptr->bbox, drawWinBBox))
X DrawObj (drawWindow, obj_ptr);
X }
X
X if (topObj == NULL)
X {
X DrawPaperBoundary ();
X RedrawGridLines ();
X }
X
X fclose (fp);
X strcpy (curFileName, sym_name);
X strcpy (curSymDir, path_name);
X curFileDefined = TRUE;
X
X sprintf (s, "Current file is '%s'.", file_name);
X Msg (s);
X
X RedrawTitleWindow ();
X}
X
Xvoid PopIcon ()
X{
X char dummy[MAXPATHLENGTH];
X
X if (topStk == NULL)
X {
X Msg ("Already at top level.");
X return;
X }
X if (fileModified)
X {
X switch (YesNoCancel ("File modified, save file before quit? [ync](y)"))
X {
X case CONFIRM_YES: SaveFile (); break;
X case CONFIRM_NO: break;
X case CONFIRM_CANCEL: return;
X }
X }
X fileModified = topStk->file_mod;
X objId = topStk->id;
X
X CleanUpDrawingWindow ();
X
X drawOrigX = topStk->orig_x;
X drawOrigY = topStk->orig_y;
X zoomScale = topStk->zoom;
X xyGrid = topStk->grid;
X gridOn = topStk->grid_on;
X colorIndex = topStk->color;
X horiAlign = topStk->h_align;
X vertAlign = topStk->v_align;
X lineWidth = topStk->line_w;
X lineStyle = topStk->line_s;
X objFill = topStk->fill;
X penPat = topStk->pen;
X textJust = topStk->just;
X curFont = topStk->font;
X curStyle = topStk->f_style;
X curFontDPI = topStk->f_dpi;
X
X topObj = topStk->first;
X botObj = topStk->last;
X strcpy (curDomainName, topStk->domain);
X strcpy (curSymDir, topStk->sym_dir);
X if (curFileDefined = topStk->name_valid)
X {
X strcpy (curFileName, topStk->name);
X if (*curSymDir == '\0')
X sprintf (dummy, "Poping back to '%s/%s'.", topStk->dir, curFileName);
X else
X sprintf (dummy, "Poping back to '%s/%s'.", curSymDir, curFileName);
X Msg (dummy);
X }
X else
X {
X sprintf (dummy, "Poping back to parent level. Current file undefined.");
X Msg (dummy);
X }
X if (strcmp (curDir, topStk->dir) != 0)
X {
X strcpy (curDir, topStk->dir);
X UpdateDirInfo ();
X }
X else
X strcpy (curDir, topStk->dir);
X
X topSel = botSel = (struct SelRec *) calloc (1, sizeof(struct SelRec));
X topSel->next = NULL;
X topSel->prev = NULL;
X topSel->obj = topStk->sel;
X UpdSelBBox ();
X
X if (pageStyle != topStk->page_style) UpdPageStyle (topStk->page_style);
X UpdDrawWinWH ();
X SetCanvasFont ();
X RedrawRulers ();
X if (pageStyle == topStk->page_style) RedrawScrollBars ();
X RedrawChoiceWindow ();
X RedrawTitleWindow ();
X UpdDrawWinBBox ();
X
X cfree (topStk);
X topStk = topStk->next;
X ClearAndRedrawDrawWindow ();
X XSync (mainDisplay, TRUE);
X justDupped = FALSE;
X}
X
Xvoid CleanUpStk ()
X{
X for ( ; topStk != NULL; topStk = topStk->next)
X {
X topObj = topStk->first;
X botObj = topStk->last;
X DelAllObj ();
X cfree (topStk);
X }
X curSymDir[0] = '\0';
X}
END_OF_FILE
if test 6069 -ne `wc -c <'stk.c'`; then
echo shar: \"'stk.c'\" unpacked with wrong size!
fi
# end of 'stk.c'
fi
if test -f 'stretch.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'stretch.c'\"
else
echo shar: Extracting \"'stretch.c'\" \(44036 characters\)
sed "s/^X//" >'stretch.c' <<'END_OF_FILE'
X/*
X * Author: William Chia-Wei Cheng (william at cs.ucla.edu)
X *
X * Copyright (C) 1990, 1991, William Cheng.
X */
X#ifndef lint
Xstatic char RCSid[] =
X "@(#)$Header: /tmp_mnt/n/kona/tangram/u/william/X11/TGIF2/RCS/stretch.c,v 2.0 91/03/05 12:48:33 william Exp $";
X#endif
X
X#include <stdio.h>
X#include <math.h>
X#include <X11/Xlib.h>
X#include "const.h"
X#include "types.h"
X
X#include "arc.e"
X#include "choice.e"
X#include "color.e"
X#include "cursor.e"
X#include "drawing.e"
X#include "dup.e"
X#include "font.e"
X#include "grid.e"
X#include "move.e"
X#include "obj.e"
X#include "poly.e"
X#include "raster.e"
X#include "ruler.e"
X#include "select.e"
X#include "setup.e"
X#include "spline.e"
X#include "text.e"
X#include "xbitmap.e"
X
X#define PtInMark(PtX,PtY,MarkX,MarkY) ((PtX) >= (MarkX)-2 && \
X (PtY) >= (MarkY)-2 && (PtX) <= (MarkX)+2 && (PtY) <= (MarkY)+2)
X#define MyDashedLine(W,GC,V,N) XDrawLines (mainDisplay, W, GC, V, N, \
X CoordModeOrigin)
X
Xstatic
Xint PtIn4Corners (XOff, YOff, BBox, Corner)
X int XOff, YOff, * Corner;
X struct BBRec BBox;
X{
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.ltx), OFFSET_Y(BBox.lty)))
X {
X *Corner = 1;
X return(TRUE);
X }
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.ltx), OFFSET_Y(BBox.rby)))
X {
X *Corner = 7;
X return(TRUE);
X }
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.rbx), OFFSET_Y(BBox.lty)))
X {
X *Corner = 3;
X return(TRUE);
X }
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.rbx), OFFSET_Y(BBox.rby)))
X {
X *Corner = 5;
X return(TRUE);
X }
X return (FALSE);
X}
X
Xstatic
Xint PtIn8Places (XOff, YOff, BBox, Corner)
X int XOff, YOff, * Corner;
X struct BBRec BBox;
X{
X register int xmid, ymid;
X
X if (BBox.rbx - BBox.ltx >= 10)
X {
X xmid = (BBox.ltx+BBox.rbx) / 2;
X if (PtInMark (XOff, YOff, OFFSET_X(xmid), OFFSET_Y(BBox.lty)))
X {
X *Corner = 2;
X return(TRUE);
X }
X if (PtInMark (XOff, YOff, OFFSET_X(xmid), OFFSET_Y(BBox.rby)))
X {
X *Corner = 6;
X return(TRUE);
X }
X }
X if (BBox.rby - BBox.lty >= 10)
X {
X ymid = (BBox.lty+BBox.rby) / 2;
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.ltx), OFFSET_Y(ymid)))
X {
X *Corner = 8;
X return(TRUE);
X }
X if (PtInMark (XOff, YOff, OFFSET_X(BBox.rbx), OFFSET_Y(ymid)))
X {
X *Corner = 4;
X return(TRUE);
X }
X }
X return (PtIn4Corners (XOff, YOff, BBox, Corner));
X}
X
Xint PtInPolyMark (XOff, YOff, NumPts, V, Index)
X int XOff, YOff, NumPts, * Index;
X XPoint * V;
X{
X register int i;
X
X for (i = 0; i < NumPts; i++)
X if (PtInMark (XOff, YOff, OFFSET_X(V[i].x), OFFSET_Y(V[i].y)))
X {
X *Index = i;
X return (TRUE);
X }
X return (FALSE);
X}
X
Xstruct SelRec * PtInSelMark (XOff, YOff, Corner)
X int XOff, YOff, * Corner;
X /* XOff and YOff are screen offsets */
X /* 1 2 3 */
X /* 8 4 */
X /* 7 6 5 */
X{
X register struct SelRec * sel_ptr;
X register struct ObjRec * obj_ptr;
X
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X {
X obj_ptr = sel_ptr->obj;
X switch (obj_ptr->type)
X {
X case OBJ_POLY:
X if (PtInPolyMark (XOff, YOff, obj_ptr->detail.p->n,
X obj_ptr->detail.p->vlist, Corner))
X return (sel_ptr);
X break;
X case OBJ_POLYGON:
X if (PtInPolyMark (XOff, YOff, obj_ptr->detail.g->n-1,
X obj_ptr->detail.g->vlist, Corner))
X return (sel_ptr);
X break;
X case OBJ_BOX:
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_OVAL:
X case OBJ_ARC:
X case OBJ_RCBOX:
X if (PtIn8Places (XOff, YOff, obj_ptr->obbox, Corner))
X return (sel_ptr);
X break;
X case OBJ_TEXT:
X case OBJ_XBM:
X case OBJ_ICON:
X if (PtIn4Corners (XOff, YOff, obj_ptr->obbox, Corner))
X return (sel_ptr);
X break;
X }
X }
X return (NULL);
X}
X
Xstatic XPoint v[5];
X
Xstatic
Xvoid StretchPoly (XGridOff, YGridOff, ObjPtr, NumPts, V, Index)
X int XGridOff, YGridOff, NumPts, Index;
X XPoint * V;
X struct ObjRec * ObjPtr;
X{
X int x, y, dx, dy, num = 0, stretching = TRUE;
X int ltx, lty, rbx, rby, curved;
X int grid_x = XGridOff, grid_y = YGridOff;
X XEvent input;
X
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X curved = ObjPtr->detail.p->curved;
X if (Index == 0 || Index == NumPts-1)
X {
X num = 2;
X if (Index == 0)
X {
X v[0].x = OFFSET_X(V[1].x); v[0].y = OFFSET_Y(V[1].y);
X v[1].x = OFFSET_X(V[0].x); v[1].y = OFFSET_Y(V[0].y);
X }
X else
X {
X v[0].x = OFFSET_X(V[NumPts-2].x);
X v[0].y = OFFSET_Y(V[NumPts-2].y);
X v[1].x = OFFSET_X(V[NumPts-1].x);
X v[1].y = OFFSET_Y(V[NumPts-1].y);
X }
X }
X else
X {
X num = 3;
X v[0].x = OFFSET_X(V[Index-1].x); v[0].y = OFFSET_Y(V[Index-1].y);
X v[1].x = OFFSET_X(V[Index].x); v[1].y = OFFSET_Y(V[Index].y);
X v[2].x = OFFSET_X(V[Index+1].x); v[2].y = OFFSET_Y(V[Index+1].y);
X }
X break;
X case OBJ_POLYGON:
X curved = ObjPtr->detail.g->curved;
X num = 3;
X if (Index == 0 || Index == NumPts-1)
X {
X v[0].x = OFFSET_X(V[1].x); v[0].y = OFFSET_Y(V[1].y);
X v[1].x = OFFSET_X(V[0].x); v[1].y = OFFSET_Y(V[0].y);
X v[2].x = OFFSET_X(V[NumPts-2].x); v[2].y = OFFSET_Y(V[NumPts-2].y);
X }
X else
X {
X v[0].x = OFFSET_X(V[Index-1].x); v[0].y = OFFSET_Y(V[Index-1].y);
X v[1].x = OFFSET_X(V[Index].x); v[1].y = OFFSET_Y(V[Index].y);
X v[2].x = OFFSET_X(V[Index+1].x); v[2].y = OFFSET_Y(V[Index+1].y);
X }
X break;
X }
X
X ltx = ObjPtr->bbox.ltx;
X lty = ObjPtr->bbox.lty;
X rbx = ObjPtr->bbox.rbx;
X rby = ObjPtr->bbox.rby;
X
X XGrabPointer (mainDisplay, drawWindow, FALSE,
X PointerMotionMask | ButtonReleaseMask,
X GrabModeAsync, GrabModeAsync, None, handCursor, CurrentTime);
X
X MyDashedLine (drawWindow, revDefaultGC, v, num);
X dx = dy = 0;
X while (stretching)
X {
X XNextEvent (mainDisplay, &input);
X if (input.type == ButtonRelease)
X {
X XUngrabPointer (mainDisplay, CurrentTime);
X stretching = FALSE;
X
X MyDashedLine (drawWindow, revDefaultGC, v, num);
X HighLightReverse ();
X
X if (dx != 0 || dy != 0)
X {
X dx <<= zoomScale;
X dy <<= zoomScale;
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X V[Index].x += dx; V[Index].y += dy;
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX, drawOrigY,
X ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X break;
X case OBJ_POLYGON:
X V[Index].x += dx; V[Index].y += dy;
X if (Index == 0)
X {
X V[NumPts-1].x += dx; V[NumPts-1].y += dy;
X }
X else if (Index == NumPts-1)
X {
X V[0].x += dx; V[0].y += dy;
X }
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX, drawOrigY,
X ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X break;
X }
X UpdPolyBBox (ObjPtr, NumPts, V);
X
X UpdSelBBox ();
X RedrawAreas (botObj, ltx-(1<<zoomScale), lty-(1<<zoomScale),
X rbx+(1<<zoomScale), rby+(1<<zoomScale),
X ObjPtr->bbox.ltx-(1<<zoomScale),
X ObjPtr->bbox.lty-(1<<zoomScale),
X ObjPtr->bbox.rbx+(1<<zoomScale),
X ObjPtr->bbox.rby+(1<<zoomScale));
X SetFileModified (TRUE);
X }
X HighLightForward ();
X }
X else if (input.type == MotionNotify)
X {
X x = input.xmotion.x;
X y = input.xmotion.y;
X GridXY (x, y, &grid_x, &grid_y);
X
X MyDashedLine (drawWindow, revDefaultGC, v, num);
X
X dx = grid_x - XGridOff;
X dy = grid_y - YGridOff;
X v[1].x = OFFSET_X(V[Index].x) + dx;
X v[1].y = OFFSET_Y(V[Index].y) + dy;
X MarkRulers (grid_x, grid_y);
X
X MyDashedLine (drawWindow, revDefaultGC, v, num);
X }
X }
X}
X
Xstatic double multX, multY;
Xstatic int pivotX, pivotY, changeX, changeY, moveX, moveY;
X
Xstatic
Xvoid StretchedXY (X, Y, NewX, NewY)
X int X, Y, * NewX, * NewY; /* screen offsets */
X{
X register int dx, dy;
X
X dx = round ((double)((double)(X - pivotX) * multX));
X dy = round ((double)((double)(Y - pivotY) * multY));
X *NewX = pivotX + dx;
X *NewY = pivotY + dy;
X}
X
Xstatic
Xvoid SetPivot (Corner, OBBox)
X int Corner;
X struct BBRec OBBox;
X /* pivotX, pivotY, moveX, moveY will be set to screen offsets */
X{
X switch (Corner)
X {
X case 1:
X pivotX = OBBox.rbx; pivotY = OBBox.rby;
X moveX = OBBox.ltx; moveY = OBBox.lty;
X changeX = changeY = TRUE;
X break;
X case 2:
X pivotX = moveX = (OBBox.ltx+OBBox.rbx)/2; pivotY = OBBox.rby;
X moveY = OBBox.lty;
X changeX = FALSE; changeY = TRUE;
X break;
X case 3:
X pivotX = OBBox.ltx; pivotY = OBBox.rby;
X moveX = OBBox.rbx; moveY = OBBox.lty;
X changeX = changeY = TRUE;
X break;
X case 4:
X pivotX = OBBox.ltx; pivotY = moveY = (OBBox.ltx+OBBox.rby)/2;
X moveX = OBBox.rbx;
X changeX = TRUE; changeY = FALSE;
X break;
X case 5:
X pivotX = OBBox.ltx; pivotY = OBBox.lty;
X moveX = OBBox.rbx; moveY = OBBox.rby;
X changeX = changeY = TRUE;
X break;
X case 6:
X pivotX = moveX = (OBBox.ltx+OBBox.rbx)/2; pivotY = OBBox.lty;
X moveY = OBBox.rby;
X changeX = FALSE; changeY = TRUE;
X break;
X case 7:
X pivotX = OBBox.rbx; pivotY = OBBox.lty;
X moveX = OBBox.ltx; moveY = OBBox.rby;
X changeX = changeY = TRUE;
X break;
X case 8:
X pivotX = OBBox.rbx; pivotY = moveY = (OBBox.lty+OBBox.rby)/2;
X moveX = OBBox.ltx;
X changeX = TRUE; changeY = FALSE;
X break;
X }
X multX = 1.0;
X multY = 1.0;
X pivotX = OFFSET_X(pivotX);
X pivotY = OFFSET_Y(pivotY);
X moveX = OFFSET_X(moveX);
X moveY = OFFSET_Y(moveY);
X}
X
Xstatic
Xvoid StretchObj (ObjPtr, Corner)
X struct ObjRec * ObjPtr;
X int Corner;
X{
X register int i;
X register struct ObjRec * ptr;
X struct AttrRec * attr_ptr;
X struct ArcRec * arc_ptr;
X int x, y, dx, dy, old_x, old_y, w, h;
X int ltx, lty, rbx, rby;
X int real_ltx, real_lty, real_rbx, real_rby;
X
X StretchedXY (OFFSET_X(ObjPtr->obbox.ltx), OFFSET_Y(ObjPtr->obbox.lty),
X <x, <y);
X StretchedXY (OFFSET_X(ObjPtr->obbox.rbx), OFFSET_Y(ObjPtr->obbox.rby),
X &rbx, &rby);
X CalcBBox (ltx, lty, rbx, rby, &real_ltx, &real_lty, &real_rbx, &real_rby);
X
X StretchedXY (OFFSET_X(ObjPtr->x), OFFSET_Y(ObjPtr->y), &x, &y);
X w = (ObjPtr->obbox.rbx - ObjPtr->obbox.ltx) << zoomScale;
X h = (ObjPtr->obbox.rby - ObjPtr->obbox.lty) << zoomScale;
X
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_POLY:
X case OBJ_POLYGON:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_SYM:
X case OBJ_GROUP:
X ObjPtr->obbox.ltx = ObjPtr->x = (real_ltx << zoomScale) + drawOrigX;
X ObjPtr->obbox.lty = ObjPtr->y = (real_lty << zoomScale) + drawOrigY;
X ObjPtr->obbox.rbx = (real_rbx << zoomScale) + drawOrigX;
X ObjPtr->obbox.rby = (real_rby << zoomScale) + drawOrigY;
X break;
X case OBJ_TEXT:
X ObjPtr->x = (x << zoomScale) + drawOrigX;
X ObjPtr->y = (y << zoomScale) + drawOrigY;
X if (multX < 0)
X ObjPtr->detail.t->just = MAXJUSTS - 1 - ObjPtr->detail.t->just;
X if (multY < 0) ObjPtr->y -= h;
X UpdTextBBox (ObjPtr);
X break;
X case OBJ_ICON:
X case OBJ_XBM:
X old_x = ObjPtr->x;
X old_y = ObjPtr->y;
X ObjPtr->x = (x << zoomScale) + drawOrigX;
X ObjPtr->y = (y << zoomScale) + drawOrigY;
X if (multX < 0) ObjPtr->x -= w;
X if (multY < 0) ObjPtr->y -= h;
X dx = ObjPtr->x - old_x;
X dy = ObjPtr->y - old_y;
X MoveObj (ObjPtr, dx, dy);
X break;
X }
X
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X for (i = 0; i < ObjPtr->detail.p->n; i++)
X {
X StretchedXY (OFFSET_X(ObjPtr->detail.p->vlist[i].x),
X OFFSET_Y(ObjPtr->detail.p->vlist[i].y), &x, &y);
X ObjPtr->detail.p->vlist[i].x = (x << zoomScale) + drawOrigX;
X ObjPtr->detail.p->vlist[i].y = (y << zoomScale) + drawOrigY;
X }
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_ARC:
X arc_ptr = ObjPtr->detail.a;
X
X StretchedXY (OFFSET_X(arc_ptr->xc), OFFSET_Y(arc_ptr->yc), &x, &y);
X arc_ptr->xc = ObjPtr->x = (x<<zoomScale)+drawOrigX;
X arc_ptr->yc = ObjPtr->y = (y<<zoomScale)+drawOrigY;
X StretchedXY (OFFSET_X(arc_ptr->x1), OFFSET_Y(arc_ptr->y1), &x, &y);
X arc_ptr->x1 = (x<<zoomScale)+drawOrigX;
X arc_ptr->y1 = (y<<zoomScale)+drawOrigY;
X StretchedXY (OFFSET_X(arc_ptr->x2), OFFSET_Y(arc_ptr->y2), &x, &y);
X arc_ptr->x2 = (x<<zoomScale)+drawOrigX;
X arc_ptr->y2 = (y<<zoomScale)+drawOrigY;
X StretchedXY (OFFSET_X(arc_ptr->ltx), OFFSET_Y(arc_ptr->lty), &x, &y);
X arc_ptr->w = 2*abs((x<<zoomScale)+drawOrigX-arc_ptr->xc);
X arc_ptr->h = 2*abs((y<<zoomScale)+drawOrigY-arc_ptr->yc);
X arc_ptr->ltx = arc_ptr->xc-(arc_ptr->w/2);
X arc_ptr->lty = arc_ptr->yc-(arc_ptr->h/2);
X
X if (multX < 0)
X {
X if (arc_ptr->angle1 > 0)
X arc_ptr->angle1 = (180*64) - arc_ptr->angle1;
X else
X arc_ptr->angle1 = (-180)*64 - arc_ptr->angle1;
X arc_ptr->angle2 = -(arc_ptr->angle2);
X }
X if (multY < 0)
X {
X arc_ptr->angle1 = -(arc_ptr->angle1);
X arc_ptr->angle2 = -(arc_ptr->angle2);
X }
X
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_RCBOX:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_BOX:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_OVAL:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_TEXT: break;
X case OBJ_POLYGON:
X for (i = 0; i < ObjPtr->detail.g->n; i++)
X {
X StretchedXY (OFFSET_X(ObjPtr->detail.g->vlist[i].x),
X OFFSET_Y(ObjPtr->detail.g->vlist[i].y), &x, &y);
X ObjPtr->detail.g->vlist[i].x = (x << zoomScale) + drawOrigX;
X ObjPtr->detail.g->vlist[i].y = (y << zoomScale) + drawOrigY;
X }
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_SYM:
X case OBJ_GROUP:
X for (ptr = ObjPtr->detail.r->first; ptr != NULL; ptr = ptr->next)
X StretchObj (ptr, Corner);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X StretchObj (attr_ptr->obj, Corner);
X break;
X case OBJ_ICON: break;
X case OBJ_XBM: break;
X }
X AdjObjBBox (ObjPtr);
X}
X
Xstatic
Xvoid StretchAllSel (Corner)
X int Corner;
X{
X struct SelRec * sel_ptr;
X
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X StretchObj (sel_ptr->obj, Corner);
X}
X
Xstatic
Xvoid StretchBox (XGridOff, YGridOff, ObjPtr, Corner)
X int XGridOff, YGridOff, Corner;
X struct ObjRec * ObjPtr;
X{
X int x, y, stretching = TRUE;
X int ltx, lty, rbx, rby, sel_ltx, sel_lty, sel_rbx, sel_rby;
X int stretched_ltx, stretched_lty, stretched_rbx, stretched_rby;
X int stretched_sel_ltx, stretched_sel_lty, stretched_sel_rbx;
X int stretched_sel_rby;
X double obj_w, obj_h;
X int grid_x = XGridOff, grid_y = YGridOff;
X XEvent input;
X
X SetPivot (Corner, ObjPtr->obbox);
X
X stretched_sel_ltx = sel_ltx = OFFSET_X(selLtX);
X stretched_sel_lty = sel_lty = OFFSET_Y(selLtY);
X stretched_sel_rbx = sel_rbx = OFFSET_X(selRbX);
X stretched_sel_rby = sel_rby = OFFSET_Y(selRbY);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1, stretched_sel_lty-1,
X stretched_sel_rbx+1, stretched_sel_rby+1);
X
X stretched_ltx = ltx = OFFSET_X(ObjPtr->obbox.ltx);
X stretched_lty = lty = OFFSET_Y(ObjPtr->obbox.lty);
X stretched_rbx = rbx = OFFSET_X(ObjPtr->obbox.rbx);
X stretched_rby = rby = OFFSET_Y(ObjPtr->obbox.rby);
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X
X if (ltx == rbx)
X {
X Msg ("Can not stretch! Object has ZERO width!");
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1,
X stretched_sel_lty-1, stretched_sel_rbx+1, stretched_sel_rby+1);
X return;
X }
X else if (lty == rby)
X {
X Msg ("Can not stretch! Object has ZERO height!");
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1,
X stretched_sel_lty-1, stretched_sel_rbx+1, stretched_sel_rby+1);
X return;
X }
X
X obj_w = (double)(moveX - pivotX);
X obj_h = (double)(moveY - pivotY);
X
X XGrabPointer (mainDisplay, drawWindow, FALSE,
X PointerMotionMask | ButtonReleaseMask,
X GrabModeAsync, GrabModeAsync, None, handCursor, CurrentTime);
X
X while (stretching)
X {
X XNextEvent (mainDisplay, &input);
X if (input.type == ButtonRelease)
X {
X XUngrabPointer (mainDisplay, CurrentTime);
X stretching = FALSE;
X
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1,
X stretched_sel_lty-1, stretched_sel_rbx+1, stretched_sel_rby+1);
X
X if (multX != (double)1.0 || multY != (double)1.0)
X {
X HighLightReverse ();
X StretchAllSel (Corner);
X CalcBBox (stretched_sel_ltx, stretched_sel_lty, stretched_sel_rbx,
X stretched_sel_rby, <x, <y, &rbx, &rby);
X RedrawAreas (botObj, selLtX-(1<<zoomScale), selLtY-(1<<zoomScale),
X selRbX+(1<<zoomScale), selRbY+(1<<zoomScale),
X ((ltx-1)<<zoomScale)+drawOrigX,
X ((lty-1)<<zoomScale)+drawOrigY,
X ((rbx+1)<<zoomScale)+drawOrigX,
X ((rby+1)<<zoomScale)+drawOrigY);
X HighLightForward ();
X UpdSelBBox ();
X SetFileModified (TRUE);
X }
X }
X else if (input.type == MotionNotify)
X {
X x = input.xmotion.x;
X y = input.xmotion.y;
X GridXY (x, y, &grid_x, &grid_y);
X MarkRulers (grid_x, grid_y);
X
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1,
X stretched_sel_lty-1, stretched_sel_rbx+1, stretched_sel_rby+1);
X
X if (changeX)
X multX = (double)(moveX + grid_x - XGridOff - pivotX) / obj_w;
X else
X multX = (double)1.0;
X if (changeY)
X multY = (double)(moveY + grid_y - YGridOff - pivotY) / obj_h;
X else
X multY = (double)1.0;
X
X StretchedXY (sel_ltx, sel_lty, &stretched_sel_ltx, &stretched_sel_lty);
X StretchedXY (sel_rbx, sel_rby, &stretched_sel_rbx, &stretched_sel_rby);
X StretchedXY (ltx, lty, &stretched_ltx, &stretched_lty);
X StretchedXY (rbx, rby, &stretched_rbx, &stretched_rby);
X SelBox (drawWindow, revDefaultGC, stretched_sel_ltx-1,
X stretched_sel_lty-1, stretched_sel_rbx+1, stretched_sel_rby+1);
X SelBox (drawWindow, revDefaultGC, stretched_ltx, stretched_lty,
X stretched_rbx, stretched_rby);
X }
X }
X}
X
Xvoid StretchSel (XGridOff, YGridOff, ObjPtr, Corner)
X int XGridOff, YGridOff, Corner;
X struct ObjRec * ObjPtr;
X{
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_GROUP:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_SYM:
X case OBJ_TEXT:
X StretchBox (XGridOff, YGridOff, ObjPtr, Corner);
X break;
X case OBJ_POLY:
X StretchPoly (XGridOff, YGridOff, ObjPtr, ObjPtr->detail.p->n,
X ObjPtr->detail.p->vlist, Corner);
X break;
X case OBJ_POLYGON:
X StretchPoly (XGridOff, YGridOff, ObjPtr, ObjPtr->detail.g->n,
X ObjPtr->detail.g->vlist, Corner);
X break;
X case OBJ_ICON: break;
X case OBJ_XBM: break;
X }
X}
X
Xstatic
Xvoid FlipObjHorizontal (ObjPtr)
X struct ObjRec * ObjPtr;
X{
X register XPoint * v;
X register int i, two_x_pivot;
X int new_obj_ltx, new_obj_rbx, num_pts;
X struct ObjRec * obj_ptr;
X struct AttrRec * attr_ptr;
X struct ArcRec * arc_ptr;
X
X SetFileModified (TRUE);
X two_x_pivot = selObjLtX + selObjRbX;
X new_obj_ltx = two_x_pivot - ObjPtr->obbox.rbx;
X new_obj_rbx = two_x_pivot - ObjPtr->obbox.ltx;
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_POLY:
X case OBJ_POLYGON:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_XBM:
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X if (ObjPtr->type == OBJ_XBM) FlipXBmHorizontal (ObjPtr);
X ObjPtr->obbox.ltx = ObjPtr->x = new_obj_ltx;
X ObjPtr->obbox.rbx = new_obj_rbx;
X break;
X case OBJ_TEXT:
X switch (ObjPtr->detail.t->rotate)
X {
X case ROTATE0:
X case ROTATE180:
X ObjPtr->x = two_x_pivot - ObjPtr->x;
X ObjPtr->detail.t ->just = MAXJUSTS - 1 - ObjPtr->detail.t->just;
X break;
X case ROTATE90: ObjPtr->x = new_obj_rbx; break;
X case ROTATE270: ObjPtr->x = new_obj_ltx; break;
X }
X UpdTextBBox (ObjPtr);
X break;
X/* case OBJ_ICON: */
X/* dx = new_obj_ltx - ObjPtr->x; */
X/* MoveObj (ObjPtr, dx, 0); */
X/* break; */
X }
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X num_pts = ObjPtr->detail.p->n;
X v = ObjPtr->detail.p->vlist;
X for (i = 0; i < num_pts; i++, v++) (*v).x = two_x_pivot - (*v).x;
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjHorizontal (attr_ptr->obj);
X break;
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_RCBOX:
X case OBJ_XBM:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjHorizontal (attr_ptr->obj);
X break;
X case OBJ_TEXT: break;
X case OBJ_POLYGON:
X num_pts = ObjPtr->detail.g->n;
X v = ObjPtr->detail.g->vlist;
X for (i = 0; i < num_pts; i++, v++) (*v).x = two_x_pivot - (*v).x;
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjHorizontal (attr_ptr->obj);
X break;
X case OBJ_ARC:
X arc_ptr = ObjPtr->detail.a;
X arc_ptr->xc = two_x_pivot - arc_ptr->xc;
X arc_ptr->x1 = two_x_pivot - arc_ptr->x1;
X arc_ptr->x2 = two_x_pivot - arc_ptr->x2;
X arc_ptr->dir = !(arc_ptr->dir);
X arc_ptr->ltx = two_x_pivot - arc_ptr->ltx - arc_ptr->w;
X if (arc_ptr->angle1 > 0)
X arc_ptr->angle1 = (180*64) - arc_ptr->angle1;
X else
X arc_ptr->angle1 = (-180)*64 - arc_ptr->angle1;
X arc_ptr->angle2 = -(arc_ptr->angle2);
X UpdArcBBox (ObjPtr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjHorizontal (attr_ptr->obj);
X break;
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X obj_ptr = ObjPtr->detail.r->first;
X for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->next)
X FlipObjHorizontal (obj_ptr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjHorizontal (attr_ptr->obj);
X break;
X/* case OBJ_ICON: break; */
X }
X AdjObjBBox (ObjPtr);
X}
X
Xstatic
Xvoid FlipObjVertical (ObjPtr)
X struct ObjRec * ObjPtr;
X{
X register XPoint * v;
X register int i, two_x_pivot;
X int new_obj_lty, new_obj_rby, num_pts;
X struct ObjRec * obj_ptr;
X struct AttrRec * attr_ptr;
X struct ArcRec * arc_ptr;
X
X SetFileModified (TRUE);
X two_x_pivot = selObjLtY + selObjRbY;
X new_obj_lty = two_x_pivot - ObjPtr->obbox.rby;
X new_obj_rby = two_x_pivot - ObjPtr->obbox.lty;
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_POLY:
X case OBJ_POLYGON:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_XBM:
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X if (ObjPtr->type == OBJ_XBM) FlipXBmVertical (ObjPtr);
X ObjPtr->obbox.lty = ObjPtr->y = new_obj_lty;
X ObjPtr->obbox.rby = new_obj_rby;
X break;
X case OBJ_TEXT:
X switch (ObjPtr->detail.t->rotate)
X {
X case ROTATE0: ObjPtr->y = new_obj_lty; break;
X case ROTATE180: ObjPtr->y = new_obj_rby; break;
X case ROTATE90:
X case ROTATE270:
X ObjPtr->y = two_x_pivot - ObjPtr->y;
X ObjPtr->detail.t ->just = MAXJUSTS - 1 - ObjPtr->detail.t->just;
X break;
X }
X UpdTextBBox (ObjPtr);
X break;
X/* case OBJ_ICON: */
X/* dy = new_obj_lty - ObjPtr->y; */
X/* MoveObj (ObjPtr, 0, dy); */
X/* break; */
X }
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X num_pts = ObjPtr->detail.p->n;
X v = ObjPtr->detail.p->vlist;
X for (i = 0; i < num_pts; i++, v++) (*v).y = two_x_pivot - (*v).y;
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjVertical (attr_ptr->obj);
X break;
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_RCBOX:
X case OBJ_XBM:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjVertical (attr_ptr->obj);
X break;
X case OBJ_TEXT: break;
X case OBJ_POLYGON:
X num_pts = ObjPtr->detail.g->n;
X v = ObjPtr->detail.g->vlist;
X for (i = 0; i < num_pts; i++, v++) (*v).y = two_x_pivot - (*v).y;
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjVertical (attr_ptr->obj);
X break;
X case OBJ_ARC:
X arc_ptr = ObjPtr->detail.a;
X arc_ptr->yc = two_x_pivot - arc_ptr->yc;
X arc_ptr->y1 = two_x_pivot - arc_ptr->y1;
X arc_ptr->y2 = two_x_pivot - arc_ptr->y2;
X arc_ptr->dir = !(arc_ptr->dir);
X arc_ptr->lty = two_x_pivot - arc_ptr->lty - arc_ptr->h;
X arc_ptr->angle1 = -(arc_ptr->angle1);
X arc_ptr->angle2 = -(arc_ptr->angle2);
X UpdArcBBox (ObjPtr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjVertical (attr_ptr->obj);
X break;
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X obj_ptr = ObjPtr->detail.r->first;
X for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->next)
X FlipObjVertical (obj_ptr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X FlipObjVertical (attr_ptr->obj);
X break;
X/* case OBJ_ICON: break; */
X }
X AdjObjBBox (ObjPtr);
X}
X
Xstatic int rotatePivotX;
Xstatic int rotatePivotY;
X
Xstatic
Xvoid SetRotatePivot ()
X{
X if (topSel != NULL && topSel == botSel && topSel->obj->type == OBJ_TEXT)
X {
X rotatePivotX = topSel->obj->x;
X rotatePivotY = topSel->obj->y;
X }
X else
X {
X rotatePivotX = (selObjLtX + selObjRbX) / 2;
X rotatePivotY = (selObjLtY + selObjRbY) / 2;
X }
X}
X
Xstatic
Xvoid RotatePtClockWise (X, Y, NewX, NewY)
X int X, Y, * NewX, * NewY;
X{
X *NewX = rotatePivotX + rotatePivotY - Y;
X *NewY = rotatePivotY - rotatePivotX + X;
X}
X
Xstatic
Xvoid RotateObjClockWise (ObjPtr)
X struct ObjRec * ObjPtr;
X{
X register XPoint * v;
X register int i;
X int x, y, ltx, lty, rbx, rby, num_pts, new_h;
X struct ObjRec * obj_ptr;
X struct AttrRec * attr_ptr;
X struct ArcRec * arc_ptr;
X
X SetFileModified (TRUE);
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_POLY:
X case OBJ_POLYGON:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_XBM:
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X if (ObjPtr->type == OBJ_XBM) RotateXBmClockWise (ObjPtr);
X RotatePtClockWise (ObjPtr->obbox.ltx, ObjPtr->obbox.rby, <x, <y);
X RotatePtClockWise (ObjPtr->obbox.rbx, ObjPtr->obbox.lty, &rbx, &rby);
X ObjPtr->obbox.ltx = ObjPtr->x = ltx;
X ObjPtr->obbox.lty = ObjPtr->y = lty;
X ObjPtr->obbox.rbx = rbx;
X ObjPtr->obbox.rby = rby;
X break;
X case OBJ_TEXT:
X RotatePtClockWise (ObjPtr->x, ObjPtr->y, &x, &y);
X ObjPtr->x = x;
X ObjPtr->y = y;
X ObjPtr->detail.t->rotate = (ObjPtr->detail.t->rotate+1) & 0x3;
X UpdTextBBox (ObjPtr);
X break;
X/* case OBJ_ICON: */
X/* RotatePtClockWise (ObjPtr->obbox.ltx, ObjPtr->obbox.lty, <x, <y);*/
X/* dx = ltx - ObjPtr->obbox.ltx; */
X/* dy = lty - ObjPtr->obbox.lty; */
X/* MoveObj (ObjPtr, dx, dy); */
X/* break; */
X }
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X num_pts = ObjPtr->detail.p->n;
X v = ObjPtr->detail.p->vlist;
X for (i = 0; i < num_pts; i++, v++)
X {
X RotatePtClockWise ((*v).x, (*v).y, &x, &y);
X (*v).x = x;
X (*v).y = y;
X }
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjClockWise (attr_ptr->obj);
X break;
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_RCBOX:
X case OBJ_XBM:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjClockWise (attr_ptr->obj);
X break;
X case OBJ_TEXT: break;
X case OBJ_POLYGON:
X num_pts = ObjPtr->detail.g->n;
X v = ObjPtr->detail.g->vlist;
X for (i = 0; i < num_pts; i++, v++)
X {
X RotatePtClockWise ((*v).x, (*v).y, &x, &y);
X (*v).x = x;
X (*v).y = y;
X }
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjClockWise (attr_ptr->obj);
X break;
X case OBJ_ARC:
X arc_ptr = ObjPtr->detail.a;
X
X RotatePtClockWise (arc_ptr->xc, arc_ptr->yc, &x, &y);
X arc_ptr->xc = ObjPtr->x = x; arc_ptr->yc = ObjPtr->y = y;
X RotatePtClockWise (arc_ptr->x1, arc_ptr->y1, &x, &y);
X arc_ptr->x1 = x; arc_ptr->y1 = y;
X RotatePtClockWise (arc_ptr->x2, arc_ptr->y2, &x, &y);
X arc_ptr->x2 = x; arc_ptr->y2 = y;
X RotatePtClockWise (arc_ptr->ltx, arc_ptr->lty+arc_ptr->h, &x, &y);
X arc_ptr->ltx = x; arc_ptr->lty = y;
X new_h = arc_ptr->w;
X arc_ptr->w = arc_ptr->h; arc_ptr->h = new_h;
X arc_ptr->angle1 -= (arc_ptr->angle1 < (-90*64)) ? (-270*64) : (90*64);
X UpdArcBBox (ObjPtr);
X
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjClockWise (attr_ptr->obj);
X break;
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X obj_ptr = ObjPtr->detail.r->first;
X for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->next)
X RotateObjClockWise (obj_ptr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjClockWise (attr_ptr->obj);
X break;
X/* case OBJ_ICON: break; */
X }
X AdjObjBBox (ObjPtr);
X}
X
Xstatic
Xvoid RotatePtCounter (X, Y, NewX, NewY)
X int X, Y, * NewX, * NewY;
X{
X *NewX = rotatePivotX - rotatePivotY + Y;
X *NewY = rotatePivotY + rotatePivotX - X;
X}
X
Xstatic
Xvoid RotateObjCounter (ObjPtr)
X struct ObjRec * ObjPtr;
X{
X register XPoint * v;
X register int i;
X int x, y, ltx, lty, rbx, rby, num_pts, new_h;
X struct ObjRec * obj_ptr;
X struct AttrRec * attr_ptr;
X struct ArcRec * arc_ptr;
X
X SetFileModified (TRUE);
X switch (ObjPtr->type)
X {
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_POLY:
X case OBJ_POLYGON:
X case OBJ_ARC:
X case OBJ_RCBOX:
X case OBJ_XBM:
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X if (ObjPtr->type == OBJ_XBM) RotateXBmCounter (ObjPtr);
X RotatePtCounter (ObjPtr->obbox.rbx, ObjPtr->obbox.lty, <x, <y);
X RotatePtCounter (ObjPtr->obbox.ltx, ObjPtr->obbox.rby, &rbx, &rby);
X ObjPtr->obbox.ltx = ObjPtr->x = ltx;
X ObjPtr->obbox.lty = ObjPtr->y = lty;
X ObjPtr->obbox.rbx = rbx;
X ObjPtr->obbox.rby = rby;
X break;
X case OBJ_TEXT:
X RotatePtCounter (ObjPtr->x, ObjPtr->y, &x, &y);
X ObjPtr->x = x;
X ObjPtr->y = y;
X ObjPtr->detail.t->rotate = (ObjPtr->detail.t->rotate+3) & 0x3;
X UpdTextBBox (ObjPtr);
X break;
X/* case OBJ_ICON: */
X/* RotatePtCounter (ObjPtr->obbox.ltx, ObjPtr->obbox.lty, <x, <y); */
X/* dx = ltx - ObjPtr->obbox.ltx; */
X/* dy = lty - ObjPtr->obbox.lty; */
X/* MoveObj (ObjPtr, dx, dy); */
X/* break; */
X }
X switch (ObjPtr->type)
X {
X case OBJ_POLY:
X num_pts = ObjPtr->detail.p->n;
X v = ObjPtr->detail.p->vlist;
X for (i = 0; i < num_pts; i++, v++)
X {
X RotatePtCounter ((*v).x, (*v).y, &x, &y);
X (*v).x = x;
X (*v).y = y;
X }
X if (ObjPtr->detail.p->curved)
X {
X cfree (ObjPtr->detail.p->svlist);
X ObjPtr->detail.p->svlist = MakeSplinePolyVertex (
X &(ObjPtr->detail.p->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.p->n, ObjPtr->detail.p->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjCounter (attr_ptr->obj);
X break;
X case OBJ_BOX:
X case OBJ_OVAL:
X case OBJ_RCBOX:
X case OBJ_XBM:
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjCounter (attr_ptr->obj);
X break;
X case OBJ_TEXT: break;
X case OBJ_POLYGON:
X num_pts = ObjPtr->detail.g->n;
X v = ObjPtr->detail.g->vlist;
X for (i = 0; i < num_pts; i++, v++)
X {
X RotatePtCounter ((*v).x, (*v).y, &x, &y);
X (*v).x = x;
X (*v).y = y;
X }
X if (ObjPtr->detail.g->curved)
X {
X cfree (ObjPtr->detail.g->svlist);
X ObjPtr->detail.g->svlist = MakeSplinePolygonVertex (
X &(ObjPtr->detail.g->sn), drawOrigX,
X drawOrigY, ObjPtr->detail.g->n, ObjPtr->detail.g->vlist);
X }
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjCounter (attr_ptr->obj);
X break;
X case OBJ_ARC:
X arc_ptr = ObjPtr->detail.a;
X
X RotatePtCounter (arc_ptr->xc, arc_ptr->yc, &x, &y);
X arc_ptr->xc = ObjPtr->x = x; arc_ptr->yc = ObjPtr->y = y;
X RotatePtCounter (arc_ptr->x1, arc_ptr->y1, &x, &y);
X arc_ptr->x1 = x; arc_ptr->y1 = y;
X RotatePtCounter (arc_ptr->x2, arc_ptr->y2, &x, &y);
X arc_ptr->x2 = x; arc_ptr->y2 = y;
X RotatePtCounter (arc_ptr->ltx+arc_ptr->w, arc_ptr->lty, &x, &y);
X arc_ptr->ltx = x; arc_ptr->lty = y;
X new_h = arc_ptr->w;
X arc_ptr->w = arc_ptr->h; arc_ptr->h = new_h;
X arc_ptr->angle1 += (arc_ptr->angle1 > 90*64) ? (-270*64) : (90*64);
X UpdArcBBox (ObjPtr);
X
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjCounter (attr_ptr->obj);
X break;
X case OBJ_GROUP:
X case OBJ_SYM:
X case OBJ_ICON:
X obj_ptr = ObjPtr->detail.r->first;
X for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->next)
X RotateObjCounter (obj_ptr);
X attr_ptr = ObjPtr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X RotateObjCounter (attr_ptr->obj);
X break;
X/* case OBJ_ICON: break; */
X }
X AdjObjBBox (ObjPtr);
X}
X
Xvoid FlipHorizontal ()
X{
X register struct SelRec * sel_ptr;
X int saved_ltx, saved_lty, saved_rbx, saved_rby;
X
X if (topSel == NULL) return;
X
X saved_ltx = selLtX; saved_lty = selLtY;
X saved_rbx = selRbX; saved_rby = selRbY;
X HighLightReverse ();
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X FlipObjHorizontal (sel_ptr->obj);
X UpdSelBBox ();
X RedrawAreas (botObj, saved_ltx-(1<<zoomScale), saved_lty-(1<<zoomScale),
X saved_rbx+(1<<zoomScale), saved_rby+(1<<zoomScale),
X selLtX-(1<<zoomScale), selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X selRbY+(1<<zoomScale));
X HighLightForward ();
X justDupped = FALSE;
X}
X
Xvoid FlipVertical ()
X{
X register struct SelRec * sel_ptr;
X int saved_ltx, saved_lty, saved_rbx, saved_rby;
X
X if (topSel == NULL) return;
X
X saved_ltx = selLtX; saved_lty = selLtY;
X saved_rbx = selRbX; saved_rby = selRbY;
X HighLightReverse ();
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X FlipObjVertical (sel_ptr->obj);
X UpdSelBBox ();
X RedrawAreas (botObj, saved_ltx-(1<<zoomScale), saved_lty-(1<<zoomScale),
X saved_rbx+(1<<zoomScale), saved_rby+(1<<zoomScale),
X selLtX-(1<<zoomScale), selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X selRbY+(1<<zoomScale));
X HighLightForward ();
X justDupped = FALSE;
X}
X
Xvoid RotateClockWise ()
X{
X register struct SelRec * sel_ptr;
X int saved_ltx, saved_lty, saved_rbx, saved_rby;
X int text_obj_created, text_cursor_shown;
X
X if (topSel == NULL)
X {
X text_cursor_shown = textCursorShown;
X text_obj_created = TieLooseEnds ();
X curRotate = (curRotate+1) & 0x3;
X ShowRotate ();
X if (!text_obj_created && curChoice == DRAWTEXT && text_cursor_shown)
X {
X NewCurText ();
X RedrawCurText ();
X }
X else
X textCursorShown = FALSE;
X return;
X }
X
X saved_ltx = selLtX; saved_lty = selLtY;
X saved_rbx = selRbX; saved_rby = selRbY;
X HighLightReverse ();
X SetRotatePivot ();
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X RotateObjClockWise (sel_ptr->obj);
X UpdSelBBox ();
X RedrawAreas (botObj, saved_ltx-(1<<zoomScale), saved_lty-(1<<zoomScale),
X saved_rbx+(1<<zoomScale), saved_rby+(1<<zoomScale),
X selLtX-(1<<zoomScale), selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X selRbY+(1<<zoomScale));
X HighLightForward ();
X justDupped = FALSE;
X}
X
Xvoid RotateCounter ()
X{
X register struct SelRec * sel_ptr;
X int saved_ltx, saved_lty, saved_rbx, saved_rby;
X int text_obj_created, text_cursor_shown;
X
X if (topSel == NULL)
X {
X text_cursor_shown = textCursorShown;
X text_obj_created = TieLooseEnds ();
X curRotate = (curRotate+3) & 0x3;
X ShowRotate ();
X if (!text_obj_created && curChoice == DRAWTEXT && text_cursor_shown)
X {
X NewCurText ();
X RedrawCurText ();
X }
X else
X textCursorShown = FALSE;
X return;
X }
X
X saved_ltx = selLtX; saved_lty = selLtY;
X saved_rbx = selRbX; saved_rby = selRbY;
X HighLightReverse ();
X SetRotatePivot ();
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X RotateObjCounter (sel_ptr->obj);
X UpdSelBBox ();
X RedrawAreas (botObj, saved_ltx-(1<<zoomScale), saved_lty-(1<<zoomScale),
X saved_rbx+(1<<zoomScale), saved_rby+(1<<zoomScale),
X selLtX-(1<<zoomScale), selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X selRbY+(1<<zoomScale));
X HighLightForward ();
X justDupped = FALSE;
X}
END_OF_FILE
if test 44036 -ne `wc -c <'stretch.c'`; then
echo shar: \"'stretch.c'\" unpacked with wrong size!
fi
# end of 'stretch.c'
fi
echo shar: End of archive 15 \(of 23\).
cp /dev/null ark15isdone
MISSING=""
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 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 23 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
---------------------------------> cut here <---------------------------------
--
Bill Cheng // UCLA Computer Science Department // (213) 206-7135
3277 Boelter Hall // Los Angeles, California 90024 // USA
william at CS.UCLA.EDU ...!{uunet|ucbvax}!cs.ucla.edu!william
--
Dan Heller
------------------------------------------------
O'Reilly && Associates Z-Code Software
Senior Writer President
argv at ora.com argv at zipcode.com
------------------------------------------------
General Email: argv at sun.com
Comp-sources-x stuff: comp-sources.x at uunet.uu.net
More information about the Comp.sources.x
mailing list