[comp.sources.x] v12i025: tgif, Part09/23

william@CS.UCLA.EDU (William Cheng) (03/11/91)

Submitted-by: william@CS.UCLA.EDU (William Cheng)
Posting-number: Volume 12, Issue 25
Archive-name: tgif/part09

---------------------------------> 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 9 (of 23)."
# Contents:  pattern.c prtgif.c
# Wrapped by william@oahu on Wed Mar  6 09:57:26 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'pattern.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pattern.c'\"
else
echo shar: Extracting \"'pattern.c'\" \(29469 characters\)
sed "s/^X//" >'pattern.c' <<'END_OF_FILE'
X/*
X * Author:	William Chia-Wei Cheng (william@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/pattern.c,v 2.0 91/03/05 12:47:50 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 "arc.e"
X#include "choice.e"
X#include "drawing.e"
X#include "mark.e"
X#include "menu.e"
X#include "obj.e"
X#include "poly.e"
X#include "raster.e"
X#include "select.e"
X#include "setup.e"
X#include "spline.e"
X
Xint     objFill = NONEPAT;
Xint     lineStyle = LS_RIGHT;
Xint     lineWidth = 0;
Xint     penPat = SOLIDPAT;
Xint     curSpline = LT_STRAIGHT;
Xint     curDash = 0;
X
Xvoid ModeMenu (X, Y)
X   int	X, Y;
X{
X   int		index, * fore_colors, *valid;
X
X   DefaultColorArrays (MAXCHOICES, &fore_colors, &valid);
X   cfree (valid);
X   index = PxMpMenuLoop (X, Y, choiceImageW, choiceImageH, MAXCHOICES, 1,
X         MAXCHOICES, fore_colors, choicePixmap, SINGLECOLOR);
X
X   if (index != INVALID) SetCurChoice (index);
X}
X
Xstatic
Xint ChangeObjFill (ObjPtr, FillIndex)
X   struct ObjRec	* ObjPtr;
X   int			FillIndex;
X{
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->fill != FillIndex)
X            {
X               obj_ptr->detail.b->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->fill != FillIndex)
X            {
X               obj_ptr->detail.o->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->fill != FillIndex)
X            {
X               obj_ptr->detail.p->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->fill != FillIndex)
X            {
X               obj_ptr->detail.g->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->fill != FillIndex)
X            {
X               if (obj_ptr->detail.a->fill == NONEPAT || FillIndex == NONEPAT)
X               {
X                  obj_ptr->detail.a->fill = FillIndex;
X                  UpdArcBBox (obj_ptr);
X               }
X               else
X                  obj_ptr->detail.a->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->fill != FillIndex)
X            {
X               obj_ptr->detail.rcb->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_XBM:
X            if (obj_ptr->detail.xbm->fill != FillIndex)
X            {
X               obj_ptr->detail.xbm->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_SYM:
X         case OBJ_GROUP:
X            if (ChangeObjFill (obj_ptr->detail.r->last, FillIndex))
X               changed = TRUE;
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelFill (FillIndex)
X   int	FillIndex;
X{
X   register struct SelRec	* sel_ptr;
X   int				changed = FALSE, ltx, lty, rbx, rby;
X
X   if (topSel == NULL)
X   {
X      objFill = FillIndex;
X      ShowFill ();
X      return;
X   }
X
X   HighLightReverse ();
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X      switch (sel_ptr->obj->type)
X      {
X         case OBJ_BOX:
X            if (sel_ptr->obj->detail.b->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.b->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (sel_ptr->obj->detail.o->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.o->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLY:
X            if (sel_ptr->obj->detail.p->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.p->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (sel_ptr->obj->detail.g->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.g->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (sel_ptr->obj->detail.a->fill != FillIndex)
X            {
X               if (sel_ptr->obj->detail.a->fill==NONEPAT || FillIndex==NONEPAT)
X               {
X                  sel_ptr->obj->detail.a->fill = FillIndex;
X                  UpdArcBBox (sel_ptr->obj);
X               }
X               else
X                  sel_ptr->obj->detail.a->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (sel_ptr->obj->detail.rcb->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.rcb->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_XBM:
X            if (sel_ptr->obj->detail.xbm->fill != FillIndex)
X            {
X               sel_ptr->obj->detail.xbm->fill = FillIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_SYM:
X         case OBJ_GROUP:
X            if (ChangeObjFill (sel_ptr->obj->detail.r->last, FillIndex))
X               changed = TRUE;
X            break;
X      }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      ltx = selLtX; lty = selLtY; rbx = selRbX; rby = selRbY;
X      UpdSelBBox ();
X      RedrawAreas (botObj, ltx-(1<<zoomScale), lty-(1<<zoomScale),
X            rbx+(1<<zoomScale), rby+(1<<zoomScale), selLtX-(1<<zoomScale),
X            selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X            selRbY+(1<<zoomScale));
X   }
X   HighLightForward ();
X}
X
Xvoid FillMenu (X, Y)
X   int	X, Y;
X{
X   int		index, * fore_colors, * valid;
X
X   DefaultColorArrays (MAXPATTERNS, &fore_colors, &valid);
X   cfree (valid);
X   index = PxMpMenuLoop (X, Y, choiceImageW, choiceImageH, 4, 5, MAXPATTERNS,
X         fore_colors, patPixmap, SINGLECOLOR);
X
X   if (index != INVALID) ChangeAllSelFill (index);
X}
X
Xstatic
Xint ChangeObjLineStyle (ObjPtr, StyleIndex)
X   struct ObjRec	* ObjPtr;
X   int			StyleIndex;
X{
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->style != StyleIndex)
X            {
X               obj_ptr->detail.p->style = StyleIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineStyle (obj_ptr->detail.r->last, StyleIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelLineStyle (StyleIndex)
X   int	StyleIndex;
X{
X   register struct SelRec	* sel_ptr;
X   register struct ObjRec	* obj_ptr;
X   int				ltx, lty, rbx, rby, changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      lineStyle = StyleIndex;
X      ShowLineStyle ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X   {
X      obj_ptr = sel_ptr->obj;
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->style != StyleIndex)
X            {
X               obj_ptr->detail.p->style = StyleIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineStyle (obj_ptr->detail.r->last, StyleIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      ltx = selLtX; lty = selLtY; rbx = selRbX; rby = selRbY;
X      UpdSelBBox ();
X      RedrawAreas (botObj, ltx-(1<<zoomScale), lty-(1<<zoomScale),
X            rbx+(1<<zoomScale), rby+(1<<zoomScale), selLtX-(1<<zoomScale),
X            selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X            selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
X
Xstatic
Xint ChangeObjLineType (ObjPtr, TypeIndex)
X   struct ObjRec	* ObjPtr;
X   int			TypeIndex;
X{
X   register struct ObjRec       * obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->curved != TypeIndex)
X            {
X               if ((obj_ptr->detail.p->curved = TypeIndex) == LT_SPLINE)
X                  obj_ptr->detail.p->svlist = MakeSplinePolyVertex (
X                        &(obj_ptr->detail.p->sn), drawOrigX, drawOrigY,
X                        obj_ptr->detail.p->n, obj_ptr->detail.p->vlist);
X               else
X                  cfree (obj_ptr->detail.p->svlist);
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->curved != TypeIndex)
X            {
X               if ((obj_ptr->detail.g->curved = TypeIndex) == LT_SPLINE)
X                  obj_ptr->detail.g->svlist = MakeSplinePolygonVertex (
X                        &(obj_ptr->detail.g->sn), drawOrigX, drawOrigY,
X                        obj_ptr->detail.g->n, obj_ptr->detail.g->vlist);
X               else
X                  cfree (obj_ptr->detail.g->svlist);
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineType (obj_ptr->detail.r->last, TypeIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelLineType (TypeIndex)
X   int	TypeIndex;
X{
X   register struct SelRec	* sel_ptr;
X   register struct ObjRec	* obj_ptr;
X   int				ltx, lty, rbx, rby, changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      curSpline = TypeIndex;
X      ShowLineType ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X   {
X      obj_ptr = sel_ptr->obj;
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->curved != TypeIndex)
X            {
X               if ((obj_ptr->detail.p->curved = TypeIndex) == LT_SPLINE)
X                  obj_ptr->detail.p->svlist = MakeSplinePolyVertex (
X                        &(obj_ptr->detail.p->sn), drawOrigX, drawOrigY,
X                        obj_ptr->detail.p->n, obj_ptr->detail.p->vlist);
X               else
X                  cfree (obj_ptr->detail.p->svlist);
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->curved != TypeIndex)
X            {
X               if ((obj_ptr->detail.g->curved = TypeIndex) == LT_SPLINE)
X                  obj_ptr->detail.g->svlist = MakeSplinePolygonVertex (
X                        &(obj_ptr->detail.g->sn), drawOrigX, drawOrigY,
X                        obj_ptr->detail.g->n, obj_ptr->detail.g->vlist);
X               else
X                  cfree (obj_ptr->detail.g->svlist);
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineType (obj_ptr->detail.r->last, TypeIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      ltx = selLtX; lty = selLtY; rbx = selRbX; rby = selRbY;
X      UpdSelBBox ();
X      RedrawAreas (botObj, ltx-(1<<zoomScale), lty-(1<<zoomScale),
X            rbx+(1<<zoomScale), rby+(1<<zoomScale), selLtX-(1<<zoomScale),
X            selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X            selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
X
Xstatic
Xint ChangeObjLineWidth (ObjPtr, WidthIndex)
X   struct ObjRec	* ObjPtr;
X   int			WidthIndex;
X{
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->width != WidthIndex)
X            {
X               obj_ptr->detail.p->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->width != WidthIndex)
X            {
X               obj_ptr->detail.b->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->width != WidthIndex)
X            {
X               obj_ptr->detail.o->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->width != WidthIndex)
X            {
X               obj_ptr->detail.g->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->width != WidthIndex)
X            {
X               obj_ptr->detail.a->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->width != WidthIndex)
X            {
X               obj_ptr->detail.rcb->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineWidth (obj_ptr->detail.r->last, WidthIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelLineWidth (WidthIndex)
X   int	WidthIndex;
X{
X   register struct SelRec	* sel_ptr;
X   register struct ObjRec	* obj_ptr;
X   int				ltx, lty, rbx, rby, changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      lineWidth = WidthIndex;
X      ShowLineWidth ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X   {
X      obj_ptr = sel_ptr->obj;
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->width != WidthIndex)
X            {
X               obj_ptr->detail.p->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->width != WidthIndex)
X            {
X               obj_ptr->detail.b->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->width != WidthIndex)
X            {
X               obj_ptr->detail.o->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->width != WidthIndex)
X            {
X               obj_ptr->detail.g->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->width != WidthIndex)
X            {
X               obj_ptr->detail.a->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->width != WidthIndex)
X            {
X               obj_ptr->detail.rcb->width = WidthIndex;
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineWidth (obj_ptr->detail.r->last, WidthIndex))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      ltx = selLtX; lty = selLtY; rbx = selRbX; rby = selRbY;
X      UpdSelBBox ();
X      RedrawAreas (botObj, ltx-(1<<zoomScale), lty-(1<<zoomScale),
X            rbx+(1<<zoomScale), rby+(1<<zoomScale), selLtX-(1<<zoomScale),
X            selLtY-(1<<zoomScale), selRbX+(1<<zoomScale),
X            selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
X
Xstatic
Xint ChangeObjDashes (ObjPtr, DashIndex)
X   struct ObjRec	* ObjPtr;
X   int			DashIndex;
X{
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->dash != DashIndex)
X            {
X               obj_ptr->detail.p->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->dash != DashIndex)
X            {
X               obj_ptr->detail.b->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->dash != DashIndex)
X            {
X               obj_ptr->detail.o->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->dash != DashIndex)
X            {
X               obj_ptr->detail.g->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->dash != DashIndex)
X            {
X               obj_ptr->detail.a->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->dash != DashIndex)
X            {
X               obj_ptr->detail.rcb->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjLineWidth (obj_ptr->detail.r->last, DashIndex))
X               changed = TRUE;
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelDashes (DashIndex)
X   int	DashIndex;
X{
X   register struct SelRec	* sel_ptr;
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      curDash = DashIndex;
X      ShowLineWidth ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X   {
X      obj_ptr = sel_ptr->obj;
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->dash != DashIndex)
X            {
X               obj_ptr->detail.p->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->dash != DashIndex)
X            {
X               obj_ptr->detail.b->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->dash != DashIndex)
X            {
X               obj_ptr->detail.o->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->dash != DashIndex)
X            {
X               obj_ptr->detail.g->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->dash != DashIndex)
X            {
X               obj_ptr->detail.a->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->dash != DashIndex)
X            {
X               obj_ptr->detail.rcb->dash = DashIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjDashes (obj_ptr->detail.r->last, DashIndex))
X               changed = TRUE;
X            break;
X      }
X   }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      RedrawAnArea (botObj, selLtX-(1<<zoomScale), selLtY-(1<<zoomScale),
X            selRbX+(1<<zoomScale), selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
X
Xvoid LineStyleMenu (X, Y)
X   int	X, Y;
X{
X   int		index, * fore_colors, * valid;
X
X   DefaultColorArrays (MAXLINEWIDTHS+MAXLINETYPES+MAXDASHES+MAXLINESTYLES,
X         &fore_colors, &valid);
X   cfree (valid);
X   index = PxMpMenuLoop (X, Y, menuImageW, menuImageH,
X         MAXLINEWIDTHS+MAXLINETYPES+MAXDASHES+MAXLINESTYLES, 1,
X         MAXLINEWIDTHS+MAXLINETYPES+MAXDASHES+MAXLINESTYLES,
X         fore_colors, lineStylePixmap, SINGLECOLOR);
X   if (index == INVALID) return;
X
X   if (index < MAXLINEWIDTHS)
X      ChangeAllSelLineWidth (index);
X   else if (index < MAXLINEWIDTHS+MAXLINETYPES)
X      ChangeAllSelLineType (index - MAXLINEWIDTHS);
X   else if (index < MAXLINEWIDTHS+MAXLINETYPES+MAXDASHES)
X      ChangeAllSelDashes (index - MAXLINEWIDTHS - MAXLINETYPES);
X   else
X      ChangeAllSelLineStyle (index - MAXLINEWIDTHS - MAXLINETYPES - MAXDASHES);
X}
X
Xstatic
Xint ChangeObjPen (ObjPtr, PenIndex)
X   struct ObjRec	* ObjPtr;
X   int			PenIndex;
X{
X   register struct ObjRec	* obj_ptr;
X   int				changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            if (obj_ptr->detail.p->pen != PenIndex)
X            {
X               obj_ptr->detail.p->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_TEXT:
X            if (obj_ptr->detail.t->pen != PenIndex)
X            {
X               obj_ptr->detail.t->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_BOX:
X            if (obj_ptr->detail.b->pen != PenIndex)
X            {
X               obj_ptr->detail.b->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (obj_ptr->detail.o->pen != PenIndex)
X            {
X               obj_ptr->detail.o->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (obj_ptr->detail.g->pen != PenIndex)
X            {
X               obj_ptr->detail.g->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (obj_ptr->detail.a->pen != PenIndex)
X            {
X               obj_ptr->detail.a->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (obj_ptr->detail.rcb->pen != PenIndex)
X            {
X               obj_ptr->detail.rcb->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjPen (obj_ptr->detail.r->last, PenIndex))
X               changed = TRUE;
X            break;
X      }
X   return (changed);
X}
X
Xvoid ChangeAllSelPen (PenIndex)
X   int	PenIndex;
X{
X   register struct SelRec	* sel_ptr;
X   int				changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      penPat = PenIndex;
X      ShowPen ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X      switch (sel_ptr->obj->type)
X      {
X         case OBJ_POLY:
X            if (sel_ptr->obj->detail.p->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.p->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_TEXT:
X            if (sel_ptr->obj->detail.t->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.t->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_BOX:
X            if (sel_ptr->obj->detail.b->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.b->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_OVAL:
X            if (sel_ptr->obj->detail.o->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.o->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_POLYGON:
X            if (sel_ptr->obj->detail.g->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.g->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_ARC:
X            if (sel_ptr->obj->detail.a->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.a->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X         case OBJ_RCBOX:
X            if (sel_ptr->obj->detail.rcb->pen != PenIndex)
X            {
X               sel_ptr->obj->detail.rcb->pen = PenIndex;
X               changed = TRUE;
X            }
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ChangeObjPen (sel_ptr->obj->detail.r->last, PenIndex))
X               changed = TRUE;
X            break;
X      }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      RedrawAnArea (botObj, selLtX-(1<<zoomScale), selLtY-(1<<zoomScale),
X            selRbX+(1<<zoomScale), selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
X
Xvoid PenMenu (X, Y)
X   int	X, Y;
X{
X   int		index, * fore_colors, * valid;
X
X   DefaultColorArrays (MAXPATTERNS, &fore_colors, &valid);
X   cfree (valid);
X   index = PxMpMenuLoop (X, Y, choiceImageW, choiceImageH, 4, 5, MAXPATTERNS,
X         fore_colors, patPixmap, SINGLECOLOR);
X
X   if (index != INVALID) ChangeAllSelPen (index);
X}
X
Xstatic
Xint ToggleObjLineType (ObjPtr)
X   struct ObjRec	* ObjPtr;
X{
X   register struct ObjRec       * obj_ptr;
X   register int			changed = FALSE;
X
X   for (obj_ptr = ObjPtr; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            obj_ptr->detail.p->curved = !obj_ptr->detail.p->curved;
X            if (obj_ptr->detail.p->curved == LT_SPLINE)
X               obj_ptr->detail.p->svlist = MakeSplinePolyVertex (
X                     &(obj_ptr->detail.p->sn), drawOrigX, drawOrigY,
X                     obj_ptr->detail.p->n, obj_ptr->detail.p->vlist);
X            else
X               cfree (obj_ptr->detail.p->svlist);
X            changed = TRUE;
X            AdjObjBBox (obj_ptr);
X            break;
X         case OBJ_POLYGON:
X            obj_ptr->detail.g->curved = !obj_ptr->detail.g->curved;
X            if (obj_ptr->detail.g->curved == LT_SPLINE)
X               obj_ptr->detail.g->svlist = MakeSplinePolygonVertex (
X                     &(obj_ptr->detail.g->sn), drawOrigX, drawOrigY,
X                     obj_ptr->detail.g->n, obj_ptr->detail.g->vlist);
X            else
X               cfree (obj_ptr->detail.g->svlist);
X            changed = TRUE;
X            AdjObjBBox (obj_ptr);
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ToggleObjLineType (obj_ptr->detail.r->last))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   return (changed);
X}
X
Xvoid ToggleAllSelLineType ()
X{
X   register struct SelRec	* sel_ptr;
X   register struct ObjRec	* obj_ptr;
X   register int			changed = FALSE;
X
X   if (topSel == NULL)
X   {
X      curSpline = !curSpline;
X      ShowLineType ();
X      return;
X   }
X
X   for (sel_ptr = botSel; sel_ptr != NULL; sel_ptr = sel_ptr->prev)
X   {
X      obj_ptr = sel_ptr->obj;
X      switch (obj_ptr->type)
X      {
X         case OBJ_POLY:
X            obj_ptr->detail.p->curved = !(obj_ptr->detail.p->curved);
X            if (obj_ptr->detail.p->curved == LT_SPLINE)
X            obj_ptr->detail.p->svlist = MakeSplinePolyVertex (
X                     &(obj_ptr->detail.p->sn), drawOrigX, drawOrigY,
X                     obj_ptr->detail.p->n, obj_ptr->detail.p->vlist);
X            else
X               cfree (obj_ptr->detail.p->svlist);
X            changed = TRUE;
X            AdjObjBBox (obj_ptr);
X            break;
X         case OBJ_POLYGON:
X            obj_ptr->detail.g->curved = !(obj_ptr->detail.g->curved);
X            if (obj_ptr->detail.g->curved == LT_SPLINE)
X               obj_ptr->detail.g->svlist = MakeSplinePolygonVertex (
X                     &(obj_ptr->detail.g->sn), drawOrigX, drawOrigY,
X                     obj_ptr->detail.g->n, obj_ptr->detail.g->vlist);
X            else
X               cfree (obj_ptr->detail.g->svlist);
X            changed = TRUE;
X            AdjObjBBox (obj_ptr);
X            break;
X
X         case OBJ_GROUP:
X         case OBJ_SYM:
X            if (ToggleObjLineType (obj_ptr->detail.r->last))
X            {
X               changed = TRUE;
X               AdjObjBBox (obj_ptr);
X            }
X            break;
X      }
X   }
X
X   if (changed)
X   {
X      SetFileModified (TRUE);
X      HighLightReverse ();
X      RedrawAnArea (botObj, selLtX-(1<<zoomScale), selLtY-(1<<zoomScale),
X            selRbX+(1<<zoomScale), selRbY+(1<<zoomScale));
X      HighLightForward ();
X   }
X}
END_OF_FILE
if test 29469 -ne `wc -c <'pattern.c'`; then
    echo shar: \"'pattern.c'\" unpacked with wrong size!
fi
# end of 'pattern.c'
fi
if test -f 'prtgif.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'prtgif.c'\"
else
echo shar: Extracting \"'prtgif.c'\" \(4965 characters\)
sed "s/^X//" >'prtgif.c' <<'END_OF_FILE'
X/*
X * Author:	William Chia-Wei Cheng (william@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/prtgif.c,v 2.0 91/03/05 12:48:03 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 "file.e"
X#include "grid.e"
X#include "obj.e"
X#include "setup.e"
X
X#define PRTGIF (TRUE)
X
Xextern char	* getenv ();
X/* extern int	malloc_debug (); */
X
Xint	lastFile = TRUE;
X
Xshort   pDrawFontAsc[] =
X{
X    8, 10, 12, 14, 17, 22, 
X    8, 10, 12, 14, 17, 22, 
X    8, 10, 12, 14, 17, 23, 
X    8, 10, 12, 14, 17, 22, 
X    8,  9, 11, 13, 15, 19, 
X    7,  9, 11, 12, 15, 20, 
X    7,  9, 11, 13, 15, 19, 
X    7,  9, 11, 12, 15, 20, 
X    9, 11, 12, 14, 18, 24, 
X    9, 11, 12, 14, 17, 24, 
X    9, 11, 12, 14, 17, 24, 
X    9, 11, 12, 14, 17, 24, 
X    8, 11, 12, 14, 18, 23, 
X    8, 11, 12, 15, 18, 24, 
X    8, 11, 12, 14, 16, 23, 
X    8, 11, 12, 14, 16, 24, 
X    8, 10, 12, 14, 18, 24, 
X    9, 14, 15, 18, 23, 30, 
X   10, 14, 16, 17, 23, 30, 
X    9, 13, 15, 17, 22, 30, 
X    9, 13, 15, 18, 22, 30, 
X    9, 12, 14, 15, 19, 26, 
X    9, 12, 14, 15, 21, 26, 
X    9, 12, 14, 15, 19, 26, 
X    9, 12, 14, 15, 20, 26, 
X   11, 14, 16, 18, 24, 31, 
X   11, 14, 16, 18, 24, 31, 
X   11, 14, 16, 18, 24, 31, 
X   11, 14, 16, 18, 24, 31, 
X   11, 14, 16, 19, 24, 32, 
X   11, 15, 16, 19, 24, 33, 
X   11, 14, 16, 18, 23, 32, 
X   11, 15, 16, 19, 24, 32, 
X   11, 12, 13, 14, 19, 27 
X};
X
Xshort   pDrawFontDes[] =
X{
X    2,  3,  3,  4,  4,  6, 
X    2,  3,  3,  4,  4,  6, 
X    2,  3,  3,  4,  5,  6, 
X    2,  3,  3,  3,  4,  6, 
X    2,  2,  3,  3,  4,  5, 
X    2,  2,  3,  4,  5,  5, 
X    2,  2,  3,  3,  4,  5, 
X    2,  2,  3,  4,  5,  5, 
X    2,  2,  3,  3,  4,  5, 
X    2,  2,  3,  3,  5,  5, 
X    2,  2,  3,  3,  5,  5, 
X    2,  2,  3,  3,  5,  5, 
X    2,  2,  3,  3,  4,  5, 
X    2,  2,  3,  3,  4,  5, 
X    2,  2,  3,  3,  6,  5, 
X    2,  2,  3,  3,  6,  5, 
X    3,  4,  4,  6,  7,  8, 
X    3,  3,  4,  4,  6,  7, 
X    3,  3,  4,  4,  6,  7, 
X    3,  4,  4,  5,  6,  7, 
X    3,  3,  4,  4,  6,  7, 
X    2,  3,  3,  4,  5,  6, 
X    2,  4,  3,  5,  5,  7, 
X    2,  3,  4,  4,  5,  6, 
X    2,  4,  4,  5,  5,  7, 
X    2,  3,  4,  4,  5,  7, 
X    2,  3,  4,  5,  5,  7, 
X    2,  3,  4,  5,  5,  7, 
X    2,  3,  4,  5,  5,  7, 
X    2,  3,  3,  4,  5,  7, 
X    2,  3,  3,  4,  5,  7, 
X    2,  3,  3,  4,  5,  7, 
X    2,  3,  3,  4,  5,  7, 
X    4,  3,  4,  5,  5,  7 
X};
X
Xstatic
Xint PrTgifLoad (FileName)
X   char	* FileName;
X{
X   struct ObjRec	* obj_ptr;
X   char 		full_name[MAXPATHLENGTH];
X   int			len;
X   FILE			* fp;
X
X   len = strlen (FileName);
X   if (len >= 4 && strcmp (&FileName[len-4], ".obj") == 0)
X      strcpy (full_name, FileName);
X   else
X      sprintf (full_name, "%s.obj", FileName);
X
X   if ((fp = fopen (full_name, "r")) == NULL)
X   {
X      printf ("Can not open '%s'.\n", full_name);
X      return (FALSE);
X   }
X
X   printf ("Reading '%s' ...\n", full_name);
X
X   while (ReadObj (fp, &obj_ptr, PRTGIF))
X      if (obj_ptr != NULL)
X         AddObj (NULL, topObj, obj_ptr);
X
X   fclose (fp);
X   return (TRUE);
X}
X
Xmain (argc, argv)
X   int	argc;
X   char	* argv[];
X{
X   char	inbuf[MAXSTRING+1];
X   char	* c_ptr;
X   int	len, file_name_found;
X
X/* malloc_debug (1); */
X
X   if ((c_ptr = getenv ("TGIFPATH")) == NULL)
X      strcpy (drawPath, TGIF_PATH);
X   else
X      if (strlen (c_ptr) >= MAXSTRING)
X         /* must be an error */
X         strcpy (drawPath, TGIF_PATH);
X      else
X         strcpy (drawPath, c_ptr);
X
X   strcpy (printCommand, "lpr");
X
X   c_ptr = printCommand;
X   c_ptr += strlen ("lpr");
X   file_name_found = FALSE;
X   for (argc--, argv++; argc > 0; argc--, argv++)
X   {
X      if (**argv == '-')
X      {
X         if ((strcmp (*argv, "-p") == 0) || (strcmp (*argv, "-eps") == 0))
X            whereToPrint = LATEX_FIG;
X         else if ((strcmp (*argv, "-f") == 0) || (strcmp (*argv, "-ps") == 0))
X            whereToPrint = PS_FILE;
X         else
X         {
X            strcat (c_ptr++, " ");
X            strcat (c_ptr, *argv);
X            c_ptr += strlen (*argv);
X         }
X      }
X      else
X         break;
X   }
X
X   switch (argc)
X   {
X      case 0:
X         printf ("\nTgif File Name to Print> ");
X         while (fgets (inbuf, MAXSTRING, stdin) != NULL)
X         {
X            len = strlen (inbuf);
X            if (len > 0)
X            {
X               if (inbuf[--len] == '\n') inbuf[len] = '\0';
X               if (PrTgifLoad (inbuf))
X               {
X                  Dump (PRTGIF, inbuf);
X                  DelAllObj ();
X               }
X            }
X            printf ("\nTgif File Name to Print> ");
X         }
X         break;
X      default:
X         for ( ; argc > 0; argc--, argv++)
X         {
X            lastFile = (argc == 1);
X            if (PrTgifLoad (*argv))
X            {
X               Dump (PRTGIF, *argv);
X               DelAllObj ();
X            }
X         }
X   }
X   printf ("\n");
X   exit (0);
X}
END_OF_FILE
if test 4965 -ne `wc -c <'prtgif.c'`; then
    echo shar: \"'prtgif.c'\" unpacked with wrong size!
fi
# end of 'prtgif.c'
fi
echo shar: End of archive 9 \(of 23\).
cp /dev/null ark9isdone
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@CS.UCLA.EDU      ...!{uunet|ucbvax}!cs.ucla.edu!william