V9/jtools/src/cip/transform.c

/*
  %Z%  %M%  version %I% %Q%of %H% %T%
  Last Delta:  %G% %U% to %P%
*/

#include "cip.h"

struct thing *
reflect(master,p) 
register struct thing *master; 
Point p;
{
  register struct thing *t; 
  register Point *plist;  
  register int i;
  Point temp;

  if ((t = (struct thing *) getSpace(sizeof(struct thing))) != TNULL) {
    *t = *master;
    if (p.y!=0) {		/* x-axis - change y coordinate */
      t->origin.y = p.y - t->origin.y;
    }
    else {		/* y-axis - change x coordinate */
      t->origin.x = p.x - t->origin.x;
    }
    switch(t->type) {
      case CIRCLE:
      case ELLIPSE:
      case TEXT: {
	break;
      }
      case BOX: {
	if (p.y!=0) {
	  t->otherValues.corner.y = p.y - t->otherValues.corner.y;
	}
	else {
	  t->otherValues.corner.x = p.x - t->otherValues.corner.x;
	}
	break;
      }
      case LINE: {
	if (p.y!=0) {
	  t->otherValues.end.y = p.y - t->otherValues.end.y;
	}
	else {
	  t->otherValues.end.x = p.x - t->otherValues.end.x;
	}
	break;
      }
      case ARC: {
	if (p.y!=0) {
	  t->otherValues.arc.start.y = p.y - t->otherValues.arc.start.y;
	  t->otherValues.arc.end.y = p.y - t->otherValues.arc.end.y;
	}
	else {
	  t->otherValues.arc.start.x = p.x - t->otherValues.arc.start.x;
	  t->otherValues.arc.end.x = p.x - t->otherValues.arc.end.x;
	}
	temp = t->otherValues.arc.start;
	t->otherValues.arc.start = t->otherValues.arc.end;
	t->otherValues.arc.end = temp;
	break;
      }
      case SPLINE: {
	if ((plist = (Point *) getSpace((t->otherValues.spline.used+3)
				*sizeof(Point))) != (Point *) NULL) {
	  for (i=0; i<t->otherValues.spline.used+3; i++) {
	    plist[i] = t->otherValues.spline.plist[i];
	    if (p.y==0) {
	      plist[i].x = p.x - plist[i].x;
	    }
	    else {
	      plist[i].y = p.y - plist[i].y;
	    }
	  }
	  t->otherValues.spline.plist = plist;
	}
	break;
      }
      case MACRO: {
	break;
      }
    }
    BoundingBox(t);
    return(t);
  }
  return (master);
}