v15i062: A bitmap editor for Suns, Part05/06

Rich Salz rsalz at uunet.UU.NET
Thu Jun 16 01:38:31 AEST 1988


Submitted-by: Raymond T Kreisel <rayk at sbcs.sunysb.edu>
Posting-number: Volume 15, Issue 62
Archive-name: touchup/part05

THIS IS A COMPLETE REPOSTING OF THE ENTIRE PACKAGE.

#! /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 5 (of 6)."
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f brush.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"brush.c\"
else
echo shar: Extracting \"brush.c\" \(2058 characters\)
sed "s/^X//" >brush.c <<'END_OF_brush.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X
X#include <pixrect/pixrect_hs.h>
X
X/**************************************************************************
X	file: brush.c
X	purpose: This file contains all that differents brush styles.
X		Brushes can be created with iconedit, using the upper
X		righthand 32x32 bits.  The 64x64 image from iconedit
X		is then stripped to 32x32 by strip_icon32x32
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
Xstatic short brush1_data[] = {
X#include "brush1.icon.pat"
X};
Xstatic mpr_static(brush1_pr, 32, 32, 1, brush1_data);
X
Xstatic short brush2_data[] = {
X#include "brush2.icon.pat"
X};
Xstatic mpr_static(brush2_pr, 32, 32, 1, brush2_data);
X
Xstatic short brush3_data[] = {
X#include "brush3.icon.pat"
X};
Xstatic mpr_static(brush3_pr, 32, 32, 1, brush3_data);
X
Xstatic short brush4_data[] = {
X#include "brush4.icon.pat"
X};
Xstatic mpr_static(brush4_pr, 32, 32, 1, brush4_data);
X
Xstatic short brush5_data[] = {
X#include "brush5.icon.pat"
X};
Xstatic mpr_static(brush5_pr, 32, 32, 1, brush5_data);
X
Xstatic short brush6_data[] = {
X#include "brush6.icon.pat"
X};
Xstatic mpr_static(brush6_pr, 32, 32, 1, brush6_data);
END_OF_brush.c
if test 2058 -ne `wc -c <brush.c`; then
    echo shar: \"brush.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f circle.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"circle.c\"
else
echo shar: Extracting \"circle.c\" \(3577 characters\)
sed "s/^X//" >circle.c <<'END_OF_circle.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X
X/**************************************************************************
X	file: circle.c
X	purpose: This file contains that routines that draw circles
X		on the screen. A UNDOCUMENTED Sunview function "pw_polypoint"
X		is used to get the list of points that make the circle
X		on to the screen AMAZINGLY FAST.
X		The points that make up the circle are calculated with
X		bresenhams (sp?) incremental circle algorithm.
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include "header.h"
X
Xstruct  pr_pos  ptlist[MAX_PTS];
X
Xdraw_circle(pw, center_x,center_y, radius,ROP)
Xint		center_x,center_y;
XPixwin            *pw;
Xint                radius,ROP;
X{
Xstruct pr_pos      center;
X
X        int             x,y,
X                        error, numpts;
X
X	if (radius==0) return(0);
X	center.x = center_x;
X	center.y = center_y;
X
X           x = 0; y = radius; numpts = 0;
X           error = 3 - (radius << 1);
X
X           while (x < y)
X           {
X             ptlist[numpts].x=center.x+x;   ptlist[numpts++].y=center.y+y;
X             ptlist[numpts].x=center.x-x;   ptlist[numpts++].y=center.y+y;
X             ptlist[numpts].x=center.x+x;   ptlist[numpts++].y=center.y-y;
X             ptlist[numpts].x=center.x-x;   ptlist[numpts++].y=center.y-y;
X             ptlist[numpts].x=center.x+y;   ptlist[numpts++].y=center.y+x;
X             ptlist[numpts].x=center.x-y;   ptlist[numpts++].y=center.y+x;
X             ptlist[numpts].x=center.x+y;   ptlist[numpts++].y=center.y-x;
X             ptlist[numpts].x=center.x-y;   ptlist[numpts++].y=center.y-x;
X   
X             if (error < 0)
X                error = error + (x << 2) + 6;
X             else
X                error = error + ((x-y--) << 2) + 10;
X             x++;
X           }  /* end of while (x , y) */
X   
X           if (x == y)
X           {
X             ptlist[numpts].x=center.x+x;   ptlist[numpts++].y=center.y+y;
X             ptlist[numpts].x=center.x-x;   ptlist[numpts++].y=center.y+y;
X             ptlist[numpts].x=center.x+x;   ptlist[numpts++].y=center.y-y;
X             ptlist[numpts].x=center.x-x;   ptlist[numpts++].y=center.y-y;
X           }
X
X	   my_pw_polypoint(pw,0,0,numpts,ptlist,PIX_SET);
X}  /* end of function draw_circle() */   
X
X
X
Xmy_pw_polypoint(temp_pw,off_x,off_y,count_pts,ptlist, ROP)
XPixwin *temp_pw;
Xint off_x,off_y,count_pts;
Xstruct pr_pos ptlist[];
Xint ROP;
X{
X
X  if (image_depth > 1)
X  {
X    while(--count_pts > 0)
X    {
X      pw_rop(temp_pw,off_x+ptlist[count_pts].x,off_y+ptlist[count_pts].y,1,1
X  	,PIX_COLOR(cur_color) | PIX_SRC ,pattern[0],0,0);
X    }
X  }
X  else
X  {
X    pw_polypoint(temp_pw,off_x,off_y,count_pts,ptlist,ROP);
X  }
X}
END_OF_circle.c
if test 3577 -ne `wc -c <circle.c`; then
    echo shar: \"circle.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f cms_rainbow.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"cms_rainbow.c\"
else
echo shar: Extracting \"cms_rainbow.c\" \(2886 characters\)
sed "s/^X//" >cms_rainbow.c <<'END_OF_cms_rainbow.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file:  cms_rainbow.c
X	purpose: this file contains that funciton that initalizes the
X		the default color table for color sun usage
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
Xextern unsigned char red[256],green[256],blue[256];
X
Xset_colorentry(i, r, g, b)
X{
X  red[i] =r;
X  green[i] =g;
X  blue[i]=b;
X}
X
X
X
Xvoid init_colortable()
X
X{
X    int i, red, green, blue;
X    set_colorentry(0, 255, 255, 255);	/* white */
X    set_colorentry(1, 0, 0, 0);		/* black */
X    red = blue = green = 0;
X
X    for (i = 2; i < 30; i++) {
X	red += 9;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(30, 255, 0, 0);	/* red */
X    red = 255; blue = green = 0;
X    for (i = 30; i < 62; i++) {
X	green += 6;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(62, 255, 195, 0);	/* orange */ /* note diff = 33 */
X    red = 255; blue = 0; green = 195;
X    for (i = 63; i < 96; i++) {
X	green += 2;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(96, 255, 255, 0);	/* yellow */
X    red = 255; blue = 0; green = 255;
X    for (i = 97; i < 133; i++) {
X	red -= 7;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(133, 0, 255, 0);	/* green */
X    red = blue = 0; green = 255;
X    for (i = 134; i < 165; i++) {
X	green -= 8;
X	blue += 8;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(165, 0, 0, 255);	/* blue */
X    red = green = 0; blue = 255;
X    for (i = 165; i < 202; i++) {
X	red += 7;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(202, 255, 0, 255);	/* violet */
X    red = blue = 255; green = 0;
X    for (i = 203; i < 239; i++) {
X	green += 7;
X	set_colorentry(i, red, green, blue);
X    }
X    set_colorentry(239, 255, 255, 255);	/* white */
X    red = blue = green = 255;
X    for (i = 239; i <= 255; i++) {
X	green -= 9;
X	red -= 9;
X	blue -= 9;
X	set_colorentry(i, red, green, blue);
X    }
X}
X
END_OF_cms_rainbow.c
if test 2886 -ne `wc -c <cms_rainbow.c`; then
    echo shar: \"cms_rainbow.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f color_palet.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"color_palet.c\"
else
echo shar: Extracting \"color_palet.c\" \(4455 characters\)
sed "s/^X//" >color_palet.c <<'END_OF_color_palet.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file:color_palet.c
X	purpose: This file contains that functions that handle the color
X		map for usage with color suns
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include "header.h"
X#include <sunwindow/cms_mono.h>
X
X/*
X * Lets go into color mode, scotty
X *
X */
Xset_color()
X{
X  panel_set(mono_cycle,PANEL_SHOW_ITEM, FALSE,0);
X  panel_set(color_button,PANEL_SHOW_ITEM, TRUE,0);
X}
X
X
X/*
X * Back to mono mode
X *
X */
Xset_mono()
X{
X/* set the color map to mono ******** */
X  cms_monochromeload(red,green,blue);
X  my_put_colormap();
X  panel_set(color_button,PANEL_SHOW_ITEM, FALSE,0);
X  panel_set(mono_cycle,PANEL_SHOW_ITEM, TRUE,0);
X}
X
X/*
X * Set the colormap for all of the windows
X */
Xunsigned char temp_red[256],temp_green[256],temp_blue[256];
X
Xmy_put_colormap()
X{
XPixwin *temp_pw;
X
X  pw_setcmsname(pw, "ray kreisel");
X  pw_putcolormap(pw, 0,256,red,green,blue);
X  pw_setcmsname(fat_pw, "ray kreisel");
X  pw_putcolormap(fat_pw, 0,256,red,green,blue);
X  pw_setcmsname(color_pw, "ray kreisel");
X  pw_putcolormap(color_pw, 0,256,red,green,blue);
X
X  bcopy(red,temp_red,256);
X  bcopy(green,temp_green,256);
X  bcopy(blue,temp_blue,256);
X  temp_red[0] = -1;
X  temp_green[0] = -1;
X  temp_blue[0] = -1;
X  temp_red[1] = 0;
X  temp_green[1] = 0;
X  temp_blue[1] = 0;
X
X  temp_pw = (Pixwin *)window_get(panel, WIN_PIXWIN);
X  pw_setcmsname(temp_pw, "ray kreisel");
X  pw_putcolormap(temp_pw, 0,256,red,green,blue);
X
X  temp_pw = (Pixwin *)window_get(command_panel, WIN_PIXWIN);
X  pw_setcmsname(temp_pw, "ray kreisel");
X  pw_putcolormap(temp_pw, 0,256,red,green,blue);
X
X  temp_pw = (Pixwin *)window_get(region_panel, WIN_PIXWIN);
X  pw_setcmsname(temp_pw, "ray kreisel");
X  pw_putcolormap(temp_pw, 0,256,red,green,blue);
X
X  temp_pw = (Pixwin *)window_get(pattern_panel, WIN_PIXWIN);
X  pw_setcmsname(temp_pw, "ray kreisel");
X  pw_putcolormap(temp_pw, 0,256,red,green,blue);
X
X  temp_pw = (Pixwin *)window_get(brush_panel, WIN_PIXWIN);
X  pw_setcmsname(temp_pw, "ray kreisel");
X  pw_putcolormap(temp_pw, 0,256,red,green,blue);
X
X}
X
Xcolor_mode(item, event)
XPanel_item      item;
XEvent           *event;
X{
X    (void)window_set(color_frame, WIN_SHOW, TRUE, 0);
X    draw_colormap();
X}
X
X
X/*
X * Draw the colormap up on a canvas in the color palet window
X */
Xdraw_colormap()
X{
Xint i;
X  for (i=0;i<256;i++)
X    pw_write(color_pw,(i%16)*PALET_BLOCK,i/16*PALET_BLOCK,PALET_BLOCK,PALET_BLOCK,PIX_COLOR(i) | PIX_SRC,NILPR,0,0);
X  update_cur_color(0,0,cur_color);
X}
X
X
X
X/*
X * Get rid of the color palet
X */
Xcolor_done(item, event)
XPanel_item      item;
XEvent           *event;
X{
X    (void)window_set(color_frame, WIN_SHOW, FALSE, 0);
X}
X
X
X/*
X * Make an event handle for the mouse envent of the color palet
X * Let the use pick a block on the color palet and set the current
X * color a cordingly
X */
Xcolor_handle_event(canvas_local, event, arg)
XCanvas  canvas_local;
XEvent   *event;
Xcaddr_t arg;
X{
X    if (event_is_up(event))
X       return;
X    switch (event_id(event)) {
X	 case MS_LEFT:
X		update_cur_color(event_x(event),event_y(event),0);
X		break;
X	}
X}
X
X
X/*
X * Redraw the currrent color at the bottom of the color palet
X */
Xupdate_cur_color(x,y,value)
X{
X  if (value)
X   {
X    cur_color= value;
X   }
X  else
X   {
X     if ((x >= PALET_BLOCK*16) || (y >= PALET_BLOCK*16))
X	   return(0);
X     cur_color = x/PALET_BLOCK + y/PALET_BLOCK*16;
X   }
X  pw_write(color_pw,0,PALET_BLOCK*16+8,PALET_BLOCK*16,PALET_BLOCK*2,PIX_COLOR(cur_color) | PIX_SRC,NILPR,0,0);
X}
X
END_OF_color_palet.c
if test 4455 -ne `wc -c <color_palet.c`; then
    echo shar: \"color_palet.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f command.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"command.c\"
else
echo shar: Extracting \"command.c\" \(4366 characters\)
sed "s/^X//" >command.c <<'END_OF_command.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X
X/**************************************************************************
X	file: command.c
X	purpose: This file contains the icon data for the command icons
X		in the command menu of the righthand side of the main window
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X#include <pixrect/pixrect_hs.h>
X
X
Xstatic short command1_data[] = {
X#include "laso.cicon.pat"
X};
Xstatic mpr_static(command1_pr, 48, 48, 1, command1_data);
X
Xstatic short command2_data[] = {
X#include "circle_h.cicon.pat"
X};
Xstatic mpr_static(command2_pr, 48, 48, 1, command2_data);
X
Xstatic short command3_data[] = {
X#include "draw.cicon.pat"
X};
Xstatic mpr_static(command3_pr, 48, 48, 1, command3_data);
X
Xstatic short command4_data[] = {
X#include "line.cicon.pat"
X};
Xstatic mpr_static(command4_pr, 48, 48, 1, command4_data);
X
Xstatic short command5_data[] = {
X#include "mag.cicon.pat"
X};
Xstatic mpr_static(command5_pr, 48, 48, 1, command5_data);
X
Xstatic short command6_data[] = {
X#include "ffill.cicon.pat"
X};
Xstatic mpr_static(command6_pr, 48, 48, 1, command6_data);
X
Xstatic short command7_data[] = {
X#include "oval_h.cicon.pat"
X};
Xstatic mpr_static(command7_pr, 48, 48, 1, command7_data);
X
Xstatic short command8_data[] = {
X#include "poly_f.cicon.pat"
X};
Xstatic mpr_static(command8_pr, 48, 48, 1, command8_data);
X
Xstatic short command9_data[] = {
X#include "poly_h.cicon.pat"
X};
Xstatic mpr_static(command9_pr, 48, 48, 1, command9_data);
X
Xstatic short command10_data[] = {
X#include "rectan_f.cicon.pat"
X};
Xstatic mpr_static(command10_pr, 48, 48, 1, command10_data);
X
Xstatic short command11_data[] = {
X#include "rectan_h.cicon.pat"
X};
Xstatic mpr_static(command11_pr, 48, 48, 1, command11_data);
X
Xstatic short command12_data[] = {
X#include "text.cicon.pat"
X};
Xstatic mpr_static(command12_pr, 48, 48, 1, command12_data);
X
Xstatic short command13_data[] = {
X#include "sel_reg.cicon.pat"
X};
Xstatic mpr_static(command13_pr, 48, 48, 1, command13_data);
X
Xstatic short command14_data[] = {
X#include "sel_point.cicon.pat"
X};
Xstatic mpr_static(command14_pr, 48, 48, 1, command14_data);
X
Xstatic short command15_data[] = {
X#include "paint.cicon.pat"
X};
Xstatic mpr_static(command15_pr, 48, 48, 1, command15_data);
X
Xstatic short command16_data[] = {
X#include "erase.cicon.pat"
X};
Xstatic mpr_static(command16_pr, 48, 48, 1, command16_data);
X
X/* SELECTED REGION COMMANDS */
X
Xstatic short reg_command1_data[] = {
X#include "cut.cicon.pat"
X};
Xstatic mpr_static(reg_command1_pr, 48, 48, 1, reg_command1_data);
X
Xstatic short reg_command2_data[] = {
X#include "flip_hor.cicon.pat"
X};
Xstatic mpr_static(reg_command2_pr, 48, 48, 1, reg_command2_data);
X
Xstatic short reg_command3_data[] = {
X#include "flip_ver.cicon.pat"
X};
Xstatic mpr_static(reg_command3_pr, 48, 48, 1, reg_command3_data);
X
Xstatic short reg_command4_data[] = {
X#include "inverse.cicon.pat"
X};
Xstatic mpr_static(reg_command4_pr, 48, 48, 1, reg_command4_data);
X
Xstatic short reg_command5_data[] = {
X#include "copy.cicon.pat"
X};
Xstatic mpr_static(reg_command5_pr, 48, 48, 1, reg_command5_data);
X
Xstatic short reg_command6_data[] = {
X#include "paste.cicon.pat"
X};
Xstatic mpr_static(reg_command6_pr, 48, 48, 1, reg_command6_data);
X
Xstatic short reg_command7_data[] = {
X#include "rotate.cicon.pat"
X};
Xstatic mpr_static(reg_command7_pr, 48, 48, 1, reg_command7_data);
X
X
Xstatic short reg_command8_data[] = {
X#include "move.cicon.pat"
X};
Xstatic mpr_static(reg_command8_pr, 48, 48, 1, reg_command8_data);
END_OF_command.c
if test 4366 -ne `wc -c <command.c`; then
    echo shar: \"command.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f confirmer.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"confirmer.c\"
else
echo shar: Extracting \"confirmer.c\" \(4328 characters\)
sed "s/^X//" >confirmer.c <<'END_OF_confirmer.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: confirmer.c
X	purpose: This file contains a simple confirmer copied from the
X	 Sunview manual that has been souped up a little
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include <stdio.h>
X#include <sys/file.h>
X#include <suntool/sunview.h>
X#include <suntool/panel.h>
X#include <suntool/canvas.h>
X#include <suntool/walkmenu.h>
X#include <suntool/scrollbar.h>
X#include <math.h>
X#include <pixrect/pixrect_hs.h>
X
Xextern Panel panel;
X
Xstatic Frame  init_confirmer();
Xstatic void yes_no();
X
X/***************************************************************
X        confirm
X        purpose: To display a window on the base_frame Sunwindow
X                force the user to answer the question by selecting
X		either YES or NO
X        parameter:
X                message: The question to asked.
X        returns:
X		1 : if the user answered YES
X		0 : if the user answered NO
X ***************************************************************/
Xint confirm(message)
Xchar     *message; 
X{
X	Frame     confirmer;
X	int       answer;
X
X/* create the confirmer */
X	confirmer = init_confirmer(message);
X	window_bell(panel);
X/* make the user answer */
X 	answer = (int) window_loop(confirmer);
X
X/* destroy the confirmer */
X	window_set(confirmer, FRAME_NO_CONFIRM, TRUE, 0);
X	window_destroy(confirmer);
X
X    	return answer;
X}
X
Xstatic Frame
Xinit_confirmer(message)
Xchar     *message; 
X{ 
Xextern   Frame  base_frame;
XFrame           confirmer;
XPanel           panel;
XPanel_item      message_item;
Xint 	        left, top, width, height;
XRect	        *r;
Xstruct pixrect  *pr;
X
X/* create the confirmer base frame */
X	confirmer = window_create(base_frame, FRAME, 
X                                  FRAME_SHOW_LABEL, FALSE,
X				  0);
X
X/* create the single panel subwindow */
X	panel = window_create(confirmer, PANEL, 0);
X
X/* put in the message */
X	message_item = panel_create_item(panel, PANEL_MESSAGE,
X					PANEL_LABEL_STRING, message,
X					0);
X
X	pr = panel_button_image(panel, "NO", 3, 0);
X	width = 2 * pr->pr_width + 10;
X
X  	r = (Rect *) panel_get(message_item, PANEL_ITEM_RECT);
X
X/* center the yes/no buttons under the message */
X	left = (r->r_width - width) / 2;
X	if (left < 0)
X	    left = 0;
X	top = rect_bottom(r) + 5;
X
X        panel_create_item(panel, PANEL_BUTTON,
X                  PANEL_ITEM_X, left,
X	          PANEL_ITEM_Y, top,
X	          PANEL_LABEL_IMAGE, pr,
X	          PANEL_CLIENT_DATA, FALSE,
X		  PANEL_NOTIFY_PROC, yes_no,
X		  0);
X 
X        panel_create_item(panel, PANEL_BUTTON,
X	          PANEL_LABEL_IMAGE, panel_button_image(panel, "YES", 3, 0),
X	          PANEL_CLIENT_DATA, TRUE,
X		  PANEL_NOTIFY_PROC, yes_no,
X		  0);
X 
X
X	window_fit(panel);
X	window_fit(confirmer);
X
X/* center the confirmer frame in the base frame */
X	r = (Rect *) window_get(base_frame, WIN_RECT);
X
X	width = (int) window_get(confirmer, WIN_WIDTH);
X	height = (int) window_get(confirmer, WIN_HEIGHT);
X
X	left = (r->r_width - width) / 2;
X	top = (r->r_height - height) / 3;
X
X        if (left < 0) 
X            left = 0; 
X 	if (top < 0)
X	    top = 0;
X
X	window_set(confirmer, WIN_X, left, WIN_Y, top,
X			0);
X
X        left = left + (width - width/3);
X        top = top + height / 2;      
X	window_set(base_frame, WIN_MOUSE_XY, left, top,  0);
X
X	return confirmer;
X}
X
X/* yes/no notify proc */
Xstatic void
Xyes_no(item, event)
XPanel_item   item;
XEvent        *event;
X{
X	window_return(panel_get(item, PANEL_CLIENT_DATA));
X}
X
END_OF_confirmer.c
if test 4328 -ne `wc -c <confirmer.c`; then
    echo shar: \"confirmer.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f disk_io.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"disk_io.c\"
else
echo shar: Extracting \"disk_io.c\" \(14884 characters\)
sed "s/^X//" >disk_io.c <<'END_OF_disk_io.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: disk_io.c
X	purpose: This file handle most of the file I/O stuff
X	  mostly load, save and file completion
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include "header.h"
X
X#include <sys/types.h>
X#include <sys/dir.h>
X#include <sys/file.h>
X#include <pwd.h>
X
Xcolormap_t colormap;
X
X/*
X * Let's do file completion on what we have in the file name prompt
X */
Xmake_new_name(item, event)
XPanel_item      item;
XEvent           *event;
X{
X  strcpy(file_name,(char*)panel_get_value(file_panel));
X  if (complete(file_name))
X	  window_bell(panel);
X  panel_set(file_panel,PANEL_VALUE,file_name,0);
X}
X
X
X/* This function, written by Marc J Newberger,
X * will do both login name completion and file name completion, DAM fast.
X * That means as fast as the csh does it.
X */
Xint complete(template)
X
X    char    *template;
X
X{
X
X    char    dirName[255];
X    char   *prefix;    
X    int     pref_len;
X    char   *suffix;     
X    char   *p, *q;
X    char    first;
X    char    nonUnique;
X    char    twiddleUserCompletion;
X
X    extern  int         errno;
X    struct  direct     *nameEntry;
X    DIR                *dirChan;
X    struct  passwd     *pwdEntry;
X
X    /*
X     *  First do a little parsing of the input. Separate the
X     *  prefix template from the directory if there is one.
X     */
X    twiddleUserCompletion= 0;
X    prefix= template+strlen(template);
X    while (*(--prefix) != '/' && prefix >= template);
X
X    /*
X     *  See if a directory was specified:
X     */
X    if (prefix < template) {
X        /*
X         *  No /'s, could be either a username completion or
X         *  a completion in the current directory.
X         */
X        if (template[0] == '~') {
X            prefix++;
X            twiddleUserCompletion= 1;
X            }
X        else {
X            strcpy(dirName, ".");
X            }
X        }
X    else if (prefix == template) {
X        /*
X         *  Special case !! The directory excluding the trailing
X         *  '/' is zero length. It's the root:
X         */
X        strcpy(dirName, "/");
X        }
X    else {
X        /*
X         *  We're completing a file in a directory.
X         *  The directory may be lead by a ~<username> abbreviation.
X         *  If that's the case expand it.
X         */
X        if (template[0] == '~') {
X            /*
X             *  We need to do twiddle directory expansion.
X             *  See if it's our directory:
X             */
X            if (template[1] == '/') {
X                strcpy(dirName, getenv("HOME"));
X		if ( &template[1] != prefix )
X		  {
X                    p= dirName+strlen(dirName);
X    		    q= &template[1];
X                    while (q < prefix) {
X                        *p= *q;
X                        p++, q++;
X                        }
X                    *p= 0;
X		  }
X                }
X            else {
X                /*
X                 * It's someone else's. Let our fingers
X                 * do the walking. (Why the fuck do they call it
X                 * the "yellow pages" anyway. They're white pages
X                 * dammit !  If they were YELLOW pages, we could
X                 * say ypmatch "Automobile, Dealers, Retail", and
X                 * things like that !).
X                 */
X                for (p= dirName, q= &template[1];
X                        (*p= *q) != '/';
X                            p++, q++);
X                *p= 0;
X                if (!(pwdEntry= getpwnam(dirName))) {
X                    return errno;
X                    }
X                strcpy(dirName, pwdEntry->pw_dir);
X                p= dirName+strlen(dirName);
X                while (q < prefix) {
X                    *p= *q;
X                    p++, q++;
X                    }
X                *p= 0;
X                }
X            }
X        else {
X            /*
X             *  It's a vanilla directory. Strip it out.
X             */
X            strncpy(dirName, template, prefix-template);
X            dirName[prefix-template]= 0;
X            }
X        }
X    /*
X     *  Bump prefix past the '/'.
X     */
X    prefix++;
X
X    /*
X     *  Get the prefix length and a pointer to the end of the
X     *  prefix.
X     */
X    pref_len= strlen(prefix);
X    suffix= template + strlen(template);
X
X    /*
X     *  See whether we're doing filename or username completion:
X     */
X    if (!twiddleUserCompletion) {
X
X        /*
X         *  It's filename completion. Read through the directory:
X         */
X        if ((dirChan= opendir(dirName)) == 0) {
X            return errno;
X            }
X
X        first= 1;
X        nonUnique= 0;
X        for (;;) {
X            if (!(nameEntry= readdir(dirChan))) {
X                break;
X                }
X            if (!strncmp(prefix, nameEntry->d_name, pref_len)) {
X                /*
X                 *  We have a file that matches the template.
X                 *  If it's the first one, we fill the completion
X                 *  suffix with it. Otherwise we scan and pare down
X                 *  the suffix.
X                 */
X                if (first) {
X                    first=  0 ;
X                    strcpy(suffix, nameEntry->d_name+pref_len);
X                    }
X                else {
X                    nonUnique= 1;
X                    p= suffix;
X                    q= nameEntry->d_name+pref_len;
X                    while (*p == *q) {
X                        ++p; ++q;
X                        }
X                    *p= 0;
X
X                    /*
X                     *  A little optimization: If p == suffix, we
X                     *  were unable to do any extension of the name.
X                     *  We might as well quit here.
X                     */
X                    if (p == suffix) {
X                        break;
X                        }
X                    }
X                }
X            }
X
X        closedir(dirChan);
X        }
X    else {
X        /*
X         *  Do ~Username completion. Start by resetting the passwd file.
X         */
X        setpwent();
X
X        first= 1;
X        nonUnique= 0;
X        for (;;) {
X            if (!(pwdEntry= getpwent())) {
X                break;
X                }
X            if (!strncmp(prefix, pwdEntry->pw_name, pref_len)) {
X                /*
X                 *  We have a user that matches the template.
X                 *  If it's the first one, we fill the completion
X                 *  suffix with it. Otherwise we scan and pare down
X                 *  the suffix.
X                 */
X                if (first) {
X                    first=  0 ;
X                    strcpy(suffix, pwdEntry->pw_name+pref_len);
X                    }
X                else {
X                    p= suffix;
X                    q= pwdEntry->pw_name+pref_len;
X                    while (*p == *q) {
X                        ++p; ++q;
X                        }
X
X                    /*
X                     *  Here there is a possibility of seeing the
X                     *  same username twice. For this reason, we
X                     *  only set nonUnique to 1 if we're shortening
X                     *  the suffix. This means that the new name is
X                     *  distinct from any name we've seen.
X                     */
X                    if (*p) {
X                        nonUnique= 1;
X                        *p= 0;
X                        }
X
X                    /*
X                     *  A little optimization: If p == suffix, we
X                     *  were unable to do any extension of the name.
X                     *  We might as well quit here.
X                     */
X                    if (p == suffix) {
X                        break;
X                        }
X                    }
X                }
X            }
X        }
X
X    /*
X     *  If nothing matched, return a -1, if there was non-uniqueness
X     *  return -2.
X     */ 
X    if (first) {
X        return -1;
X        }
X    else if (nonUnique) {
X        return -2;
X        }
X    else {
X        return 0;
X        }
X
X}
X
X
X/*
X * We just got a "load" button event and we want to load in the current
X * filename.
X */
Xload_file(item, event)
XPanel_item      item;
XEvent           *event;
X{
XFILE *fp,*fopen();
Xint err=0;
Xstruct rasterfile file_header;
Xint load_area;
Xchar temp_file[MAX_FILE_NAME];
X
X  /*
X   * Copy the current filename and expand the ~ if it is there
X   */
X  strcpy(temp_file,(char*)panel_get_value(file_panel));
X  get_full_path(temp_file,file_name);
X  load_area = (int)panel_get_value(load_cycle);
X  
X  fp = fopen(file_name,"r");
X  if (fp == NULL)
X	{
X         ERRORstr("Cannot open file: ",file_name);
X	 fclose(fp);
X	 return(0);
X	}
X
X  /*
X   * Try to read the header of the raster file and check if it is color
X   */
X  err = pr_load_header(fp,&file_header);
X  if (file_header.ras_maplength > 3*256) err=1;
X  if (err)
X	{
X	 ERROR("Cannot load the rasterfile header.");
X	 fclose(fp);
X	 return(0);
X	}
X
X  if (load_area == LOAD_ALL)  
X    {
X     clear_screen();
X     colormap.map[0] = red;
X     colormap.map[1] = green;
X     colormap.map[2] = blue;
X     colormap.type = file_header.ras_maptype;
X     colormap.length = file_header.ras_maplength/3;
X    }
X  /*
X   * load in the colormap for the raster file
X   */
X  if (pr_load_colormap(fp,&file_header,&colormap))
X	{
X	 ERROR("Cannot load the rasterfile colormap.");	
X	 fclose(fp);
X	 return(0);
X	}
X  /*
X   * reset the memory pixrect and load the baby in
X   */
X  MY_pr_destroy(undo_pr);
X  undo_pr = (struct pixrect *)pr_load_image(fp,&file_header,&colormap);
X
X  if (undo_pr == NULL)
X	{
X         ERROR("Cannot allocate pixrect for loaded image file, not enough memory!");
X	 fclose(fp);
X	 return(0);
X	}
X
X  fclose(fp);
X
X
X  /*
X   * We are loading to the main drawing area so lets set all
X   * the color maps
X   */
X  if (load_area == LOAD_ALL)  
X    {
X     if (file_header.ras_depth > 1)
X       {
X	my_put_colormap();
X	set_color();
X       }
X     else
X       {
X        set_mono();
X        (void)window_set(canvas,
X	    CANVAS_WIDTH,		file_header.ras_width,
X	    CANVAS_HEIGHT,		file_header.ras_height,
X	    0);
X       }
X     panel_set(save_cycle,PANEL_VALUE, SAVE_ALL,0);
X     image_wid = file_header.ras_width;
X     image_hgt = file_header.ras_height;
X     image_depth = file_header.ras_depth;
X     pw_write(pw,0,0, image_wid,image_hgt, PIX_SRC, undo_pr,0,0);
X    }
X  else
X    {
X    /*
X     * we load the image into the cut/paste buffer
X     */
X    MY_pr_destroy(cut_buffer_pr);
X    cut_buffer_pr = my_mem_create(file_header.ras_width,file_header.ras_height,file_header.ras_depth);
X    pr_rop(cut_buffer_pr,0,0,file_header.ras_width,file_header.ras_height,
X			PIX_SRC,undo_pr,0,0);
X    MY_pr_destroy(undo_pr);
X    undo_pr = my_mem_create(image_wid,image_hgt,image_depth);
X    }
X}
X
X
X
X/*
X * Save a file out out to the current filename
X *
X */
Xsave_file(item, event)
XPanel_item      item;
XEvent           *event;
X{
XFILE *fp,*fopen();
Xint type = RT_STANDARD;
Xint copy_flag = TRUE;
Xchar temp_file[MAX_FILE_NAME];
X
X /*
X  * Is the raster file to be run-length encode or not
X  */
X if((int)panel_get_value(compress_cycle))
X	type = RT_BYTE_ENCODED;
X else
X	type = RT_STANDARD;
X  
X  /*
X   * Copy the current filename and expand the ~ if it is there
X   */
X strcpy(temp_file,(char*)panel_get_value(file_panel));
X get_full_path(temp_file,file_name);
X if (file_exist(file_name))
X	{
X         if (!confirm("Over write existing file ?"))
X	 return(0);
X	}
X /*
X  * dump standard SUN raster file with color table to disk file
X  */
X fp = fopen(file_name,"w");
X  if (fp == NULL)
X	{
X	 fclose(fp);
X         ERRORstr("Cannot write to file: ",file_name);
X	 return(0);
X	}
X /*
X  * Save the whole drawing are out to the disk file
X  */
X if (SAVE_ALL == (int)panel_get_value(save_cycle))
X   {
X     clean_point();
X     clean_region();
X     fat_done();
X     save_screen();
X
X     if (!undo_pr)
X	undo_pr = my_mem_create(image_wid,image_hgt,image_depth);
X     pr_rop(undo_pr,0,0,image_wid,image_hgt,PIX_SRC,pw->pw_prretained,0,0);
X     pr_dump(undo_pr,fp,&colormap,type,copy_flag);
X   }
X else
X   {
X  /*
X   * just save the cut/Paste buffer out to the file
X   */
X     if (cut_buffer_pr == NULL)
X	{
X	 ERROR("The Cut/Paste buffer is empty");
X	 fclose(fp);
X	 return(0);
X	}
X     pr_dump(cut_buffer_pr,fp,&colormap,type,copy_flag);
X   }
X fclose(fp);
X}
X
X
X/*
X * Check if a file exist or not
X */
Xfile_exist(file_name)
Xchar *file_name;
X{
XFILE *fp;
X  fp = fopen(file_name,"r");
X  fclose(fp);
X  if (fp != NULL)
X	return(TRUE);
X  else
X	return(FALSE);
X}
X
X
X/*
X * Take a filename with a ~ character at the begining and return
X * the full path name to that file
X */
Xget_full_path(template,full_path)
Xchar template[];
Xchar full_path[];
X{
X    char   *p, *q;
X    struct  passwd     *pwdEntry;
X        /*
X         *  We're completing a file in a directory.
X         *  The directory may be lead by a ~<username> abbreviation.
X         *  If that's the case expand it.
X         */
X        if (template[0] == '~') {
X            /*
X             *  We need to do twiddle directory expansion.
X             *  See if it's our directory:
X             */
X            if (template[1] == '/') {
X                strcpy(full_path, getenv("HOME"));
X		strcat(full_path,&template[1]);
X                }
X            else {
X                /*
X                 * It's someone else's. Let our fingers
X                 * do the walking. (Why the fuck do they call it
X                 * the "yellow pages" anyway. They're white pages
X                 * dammit !  If they were YELLOW pages, we could
X                 * say ypmatch "Automobile, Dealers, Retail", and
X                 * things like that !).
X                 */
X                for (p= full_path, q= &template[1];
X                        (*p= *q) != '/';
X                            p++, q++);
X                *p= 0;
X                if (!(pwdEntry= getpwnam(full_path))) {
X                    return errno;
X                    }
X                strcpy(full_path, pwdEntry->pw_dir);
X		strcat(full_path,q);
X                }
X	}
X	else
X	  	strcpy(full_path,template);
X}		 
X
END_OF_disk_io.c
if test 14884 -ne `wc -c <disk_io.c`; then
    echo shar: \"disk_io.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f drawing.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"drawing.c\"
else
echo shar: Extracting \"drawing.c\" \(16127 characters\)
sed "s/^X//" >drawing.c <<'END_OF_drawing.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: drawing.c
X	purpose: This file has most of the functions that draw stuff
X	on the screen.
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include"header.h"
X
Xstruct pr_pos poly_points[MAX_POLY];
X
Xstruct pixrect *brush_temp_pr = NULL;
X
X/*
X * What we do that someone selects a new pattern
X */
Xselect_pattern(item, event)
XPanel_item      item;
XEvent           *event;
X{
X  panel_set(current_pattern,PANEL_LABEL_IMAGE,pattern[(int)panel_get_value(pattern_choice)],0);
X
X}
X
X
X/*
X * let the user define his own patterns to paint with
X * works for color and mono
X */
Xpattern_define(item, event)
XPanel_item      item;
XEvent           *event;
X{
X
X  if (select_pt_x == -1)
X     {
X	ERROR("Select a point first, then select Define Pattern.");
X	set_select_mode();
X	return(0);
X     }
X  select_point(select_pt_x,select_pt_y);
X  if (image_depth > 1)
X   {
X      pattern[39]  = my_mem_create(PATTERN_SIZE,PATTERN_SIZE,image_depth);
X      pattern40_pr = *(pattern[39]);
X   }
X  pr_rop(pattern[39],0,0,PATTERN_SIZE,PATTERN_SIZE,
X		PIX_SRC,pw->pw_prretained,select_pt_x-PATTERN_SIZE/2,
X		select_pt_y-PATTERN_SIZE/2);
X
X  panel_paint(pattern_choice,PANEL_NO_CLEAR);
X  reset_point();
X  print_msg("The user defined pattern is now stored in the last pattern element.");
X}
X
X
X/*
X * Take the current text string and put that Baby up on the bitmap
X * in the right font
X */
Xdraw_text()
X{
Xint x,y;
X
X  if (select_pt_x != -1)
X    {
X      x = select_pt_x;
X      y = select_pt_y;
X      clean_point();
X      save_screen();
X      pw_text(pw,x,y,PIX_COLOR(cur_color) | PIX_SRC,font_array[(int)panel_get_value(text_size_item)],
X		(char*)panel_get_value(text_panel));
X    }
X  else
X    {
X      ERROR("Select a point first, fill in TEXT STRING, then select ABC.");
X      window_set(panel,PANEL_CARET_ITEM,text_panel,0);
X      set_select_mode();
X    }
X}
X
X
X/*
X * draw a line on the bitmap
X */
Xdraw_line(x1,y1,x2,y2,ROP,color)
Xint x1,y1,x2,y2,ROP,color;
X{
X  pw_vector(pw,x1,y1,x2,y2,ROP,color);
X}
X
X
X/*
X * draw a rectangle on the bitmap
X */
Xdraw_rectangle(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X  top_x = x1;
X  top_y = y1;
X  bottom_x = x2;
X  bottom_y = y2;
X  if ((int)panel_get_value(command_choice)==RECT_F)
X	fill_region();
X  else
X	reset_region();
X  if ((int)panel_get_value(border_cycle))
X  {
X    pw_vector(pw,x1,y1,x2,y1,PIX_SRC,cur_color);
X    pw_vector(pw,x2,y1,x2,y2,PIX_SRC,cur_color);
X    pw_vector(pw,x2,y2,x1,y2,PIX_SRC,cur_color);
X    pw_vector(pw,x1,y2,x1,y1,PIX_SRC,cur_color);
X  }
X}
X
X
X/*
X * highlight the selected region on the drawing area by throwing up a
X * XORed rectangle
X */
Xselect_region(pw,x1,y1,x2,y2)
Xstruct pixwin *pw;
Xint x1,y1,x2,y2;
X{
X  pw_vector(pw,x1,y1,x2,y1,PIX_XOR,1);
X  pw_vector(pw,x2,y1,x2,y2,PIX_XOR,1);
X  pw_vector(pw,x2,y2,x1,y2,PIX_XOR,1);
X  pw_vector(pw,x1,y2,x1,y1,PIX_XOR,1);
X}
X
X
X/*
X * reset the current REGION
X */
Xreset_region()
X{
X  top_x=0;
X  top_y=0;
X  bottom_x=0;
X  bottom_y=0;
X}
X
X
X/*
X * draw up a point, how stupid ???
X */
Xdraw_point(pw,x,y)
Xstruct pixwin *pw;
Xint x,y;
X{
X  pw_put(pw,x,y,cur_color);
X}
X
X
X/*
X * Draw up the paint brush by copying the current pattern
X * through a stencil of the current brush
X */
Xdraw_brush(pw,x,y)
Xstruct pixwin *pw;
Xint x,y;
X{
X  if (brush_temp_pr == NULL)
X    brush_temp_pr = my_mem_create(PATTERN_SIZE,PATTERN_SIZE,1);
X
X
X  if (((int)panel_get_value(pattern_choice) != 39) || (image_depth == 1))
X  {
X	if (brush_temp_pr->pr_depth != 1)
X	{
X   	  MY_pr_destroy(brush_temp_pr);
X  	  brush_temp_pr = my_mem_create(PATTERN_SIZE,PATTERN_SIZE,1);
X	}
X	pr_replrop(brush_temp_pr,0,0,PATTERN_SIZE,PATTERN_SIZE, PIX_SRC,pattern[(int)panel_get_value(pattern_choice)],x,y);
X        pw_stencil(pw,x-PATTERN_SIZE/2,y-PATTERN_SIZE/2,PATTERN_SIZE,PATTERN_SIZE,PIX_COLOR(cur_color) | PIX_SRC,
X	brushes[(int)panel_get_value(brush_choice)],0,0,brush_temp_pr,0,0);
X  }
X  else
X  {
X	if (brush_temp_pr->pr_depth != image_depth)
X	{
X   	  MY_pr_destroy(brush_temp_pr);
X  	  brush_temp_pr = my_mem_create(PATTERN_SIZE,PATTERN_SIZE,image_depth);
X	}
X	pr_replrop(brush_temp_pr,0,0,PATTERN_SIZE,PATTERN_SIZE, PIX_SRC,pattern[(int)panel_get_value(pattern_choice)],x,y);
X        pw_stencil(pw,x-PATTERN_SIZE/2,y-PATTERN_SIZE/2,PATTERN_SIZE,PATTERN_SIZE, PIX_SRC,
X	brushes[(int)panel_get_value(brush_choice)],0,0,brush_temp_pr,0,0);
X
X  }
X
X}
X
X
X/*
X * flip-flop two varibles (ints)
X */
Xswap(x,y)
Xint *x,*y;
X{
Xint temp;
X  temp = *x;
X  *x = *y;
X  *y = temp;
X}
X
X
Xregion_fix()
X{
X  if (top_x > bottom_x)
X     swap(&top_x,&bottom_x);
X  if (top_y > bottom_y)
X     swap(&top_y,&bottom_y);
X} 
X
X
X/*
X * put the eraser on the drawing area
X */
Xerase_brush(pw,x,y)
Xstruct pixwin *pw;
Xint x,y;
X{
X  select_region(pw,top_x,top_y,top_x+PATTERN_SIZE,top_y+PATTERN_SIZE);
X  pw_rop(pw,x-PATTERN_SIZE/2,y-PATTERN_SIZE/2,PATTERN_SIZE,PATTERN_SIZE, PIX_SRC,0,0,0);
X  top_x = x-PATTERN_SIZE/2; top_y= y-PATTERN_SIZE/2;
X  select_region(pw,top_x,top_y,top_x+PATTERN_SIZE,top_y+PATTERN_SIZE);
X}
X
X
X/*
X * draw up some cross hairs to be used to select a point
X */
X#define CROSS_HAIR 20
Xselect_point(x,y)
Xint x,y;
X{
X  pw_vector(pw,x-CROSS_HAIR,y,x+CROSS_HAIR,y,PIX_XOR,1);
X  pw_vector(pw,x,y-CROSS_HAIR,x,y+CROSS_HAIR,PIX_XOR,1);
X}
X
X
X/*
X * reset the currently selected point
X */
Xreset_point()
X{
X  select_pt_x = 0-1;
X  select_pt_y = 0-1;
X}
X
X
X/*
X * take a currently selected region and invert that baby ! FAST !!!
X */
Xinverse_region()
X{
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X     region_fix();
X     pw_replrop(pw,top_x,top_y,bottom_x-top_x,bottom_y-top_y, PIX_XOR, pattern[0],0,0);
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X    }
X  else
X    {
X     ERROR("Select a region first, then select INVERSE.");
X     panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X     mouse_parms();
X    }
X}
X
X
X
X/*
X * take a currently selected region and rotate around the center
X * point.  SLOW !!
X */
Xrotate_region()
X{
Xregister i,j,t1,t2;
X
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X     region_fix();
X     MY_pr_destroy(cut_buffer_pr);
X     cut_buffer_pr = my_mem_create(bottom_x-top_x,bottom_y-top_y,image_depth);
X     pr_rop(cut_buffer_pr,0,0,bottom_x-top_x,bottom_y-top_y,
X		PIX_SRC,pw->pw_prretained,top_x,top_y);
X     t1 = top_x + cut_buffer_pr->pr_size.x/2+ cut_buffer_pr->pr_size.y/2;
X     t2 = top_y - cut_buffer_pr->pr_size.x/2+ cut_buffer_pr->pr_size.y/2;
X     for (j = 0; j < cut_buffer_pr->pr_size.y; j++)
X       for (i = 0; i < cut_buffer_pr->pr_size.x; i++)
X	    pw_rop(pw, t1-j, t2+i, 1,1, PIX_SRC, cut_buffer_pr,i,j);
X
X     top_x = top_x + cut_buffer_pr->pr_size.x/2 - cut_buffer_pr->pr_size.y/2;
X     top_y = top_y - cut_buffer_pr->pr_size.x/2 + cut_buffer_pr->pr_size.y/2;
X     bottom_x = top_x + cut_buffer_pr->pr_size.y;
X     bottom_y = top_y + cut_buffer_pr->pr_size.x;
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X    }
X  else
X    {
X     ERROR("Select a region first, then select ROTATE.");
X     panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X     mouse_parms();
X    }
X}
X
X
X
X/*
X * take a currently selected region and make a mirror image of it
X */
Xflip_hor_region()
X{
Xregister i;
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X     region_fix();
X     MY_pr_destroy(cut_buffer_pr);
X     cut_buffer_pr = my_mem_create(bottom_x-top_x,bottom_y-top_y,image_depth);
X     pr_rop(cut_buffer_pr,0,0,bottom_x-top_x,bottom_y-top_y,
X		PIX_SRC,pw->pw_prretained,top_x,top_y);
X     for (i = 0; i < cut_buffer_pr->pr_size.x; i++) {
X	    pw_rop(pw, top_x+(cut_buffer_pr->pr_size.x - i)-1,top_y,
X			1,cut_buffer_pr->pr_size.y, PIX_SRC, cut_buffer_pr,i,0);
X	}
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X    }
X  else
X    {
X     ERROR("Select a region first, then select MIRROR.");
X     panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X     mouse_parms();
X    }
X}
X
X
X/*
X * take a currently selected region and turn it upside down
X */
Xflip_ver_region()
X{
Xregister i;
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X     region_fix();
X     MY_pr_destroy(cut_buffer_pr);
X     cut_buffer_pr = my_mem_create(bottom_x-top_x,bottom_y-top_y,image_depth);
X     pr_rop(cut_buffer_pr,0,0,bottom_x-top_x,bottom_y-top_y,
X		PIX_SRC,pw->pw_prretained,top_x,top_y);
X     for (i = 0; i < cut_buffer_pr->pr_size.y; i++) {
X	    pw_rop(pw, top_x, top_y+(cut_buffer_pr->pr_size.y - i)-1,
X			cut_buffer_pr->pr_size.x, 1, PIX_SRC, cut_buffer_pr, 0, i);
X	}
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X    }
X  else
X    {
X     ERROR("Select a region first, then select FLIP VERTICAL.");
X     panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X     mouse_parms();
X    }
X}
X
X
X
X/*
X * grab what is in the Cut/Paste buffer and put it up on the drawing area
X */
Xpaste_region()
X{
Xint ROP=PIX_SRC;
X
X  if (select_pt_x == -1)
X     {
X	ERROR("Select a point first, then select PASTE.");
X	set_select_mode();
X	return(0);
X     }
X  if (cut_buffer_pr)
X  {
X     select_point(select_pt_x,select_pt_y);
X     save_screen();
X     pw_write(pw,select_pt_x,select_pt_y,cut_buffer_pr->pr_size.x,cut_buffer_pr->pr_size.y, ROP, cut_buffer_pr,0,0);
X     reset_point();
X  }
X  else
X	ERROR("The Cut/Paste buffer is empty.");
X}
X
X
X/*
X * grab the currently selected region on the drawing area and stuff
X * it into the cut/paste buffer AND destroy the source area by
X * filling in with the current paint pattern
X */
Xcut_region()
X{
Xint t1,t2,t3,t4;
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X      t1 = top_x;
X      t2 = top_y;
X      t3 = bottom_x;
X      t4 = bottom_y;
X      copy_region();
X      top_x = t1;
X      top_y = t2;
X      bottom_x = t3;
X      bottom_y = t4;
X      select_region(pw,top_x,top_y,bottom_x,bottom_y);
X      fill_region();
X      set_select_mode();
X      print_msg("Region copied to Cut/Paste buffer, select a point and then press PASTE.");
X    }
X   else
X    {
X     ERROR("Select a region first, then select CUT.");
X     panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X     mouse_parms();
X    }
X}
X
X
X/*
X * grab the currently selected region on the drawing area and stuff
X * it into the cut/paste buffer
X */
Xcopy_region()
X{
X  if (top_x || top_y || bottom_x || bottom_y)
X    {
X     select_region(pw,top_x,top_y,bottom_x,bottom_y);
X     region_fix();
X     MY_pr_destroy(cut_buffer_pr);
X     cut_buffer_pr = my_mem_create(bottom_x-top_x,bottom_y-top_y,image_depth);
X     pr_rop(cut_buffer_pr,0,0,bottom_x-top_x,bottom_y-top_y,
X		PIX_SRC,pw->pw_prretained,top_x,top_y);
X     reset_region();
X    }
X   else
X    {
X	ERROR("Select a region first, then select COPY.");
X        panel_set(command_choice,PANEL_VALUE,SEL_REG,0);
X        mouse_parms();
X    }
X}
X
X
X/*
X * take the cut/paste buffer and XOR it that stuff on to the drawing area
X * so that I can move that sucker around FAST
X */
Xmove_region(old_x,old_y,new_x,new_y)
Xint old_x,old_y,new_x,new_y;
X{
X  if (cut_buffer_pr)
X    {
X     pw_write(pw,old_x-cut_buffer_pr->pr_size.x/2,
X		 old_y-cut_buffer_pr->pr_size.y/2,
X		 cut_buffer_pr->pr_size.x,
X		 cut_buffer_pr->pr_size.y,
X		 PIX_XOR, cut_buffer_pr,0,0);
X
X     pw_write(pw,new_x-cut_buffer_pr->pr_size.x/2,
X		 new_y-cut_buffer_pr->pr_size.y/2,
X		 cut_buffer_pr->pr_size.x,
X		 cut_buffer_pr->pr_size.y,
X		 PIX_XOR, cut_buffer_pr,0,0);
X    }
X   else
X    {
X       ERROR("CUT or COPY a region first, then select MOVE.");
X    }
X}
X
X
X/*
X * fill in a rectanglar region with the current paint pattern
X */
Xfill_region(item, event)
XPanel_item      item;
XEvent           *event;
X{
X   if (top_x || top_y || bottom_x || bottom_y)
X    {
X      select_region(pw,top_x,top_y,bottom_x,bottom_y);
X      region_fix();
X      pw_replrop(pw,top_x,top_y,bottom_x-top_x,bottom_y-top_y,PIX_COLOR(cur_color) | PIX_SRC,pattern[(int)panel_get_value(pattern_choice)],0,0);
X      reset_region();
X    }
X}
X
X
X/*
X * let the user lasso any free form region on the drawing area
X * and stuff that into the cut/paste buffer
X */
Xlaso_cut_paste()
X{
Xint found;
Xint i,no_points;
Xint npts[1];
X
X  top_x = image_wid;
X  top_y = image_hgt;
X  bottom_x = 0;
X  bottom_y = 0;
X
X  i=0;
X  while ((i<MAX_PTS) && (ptlist[i++].x != -1));
X  no_points = --i;
X  npts[0] = no_points; 
X  pw_polygon_2(pw,0,0,1,npts,ptlist,PIX_XOR,pattern[0],0,0);
X  pw_polygon_2(pw,0,0,1,npts,ptlist,PIX_XOR,pattern[0],0,0);
X
X  for (i=0;i < no_points;i++)
X    {
X        top_x = MIN(top_x,ptlist[i].x);
X        top_y = MIN(top_y,ptlist[i].y);
X        bottom_x = MAX(bottom_x,ptlist[i].x);
X        bottom_y = MAX(bottom_y,ptlist[i].y);
X    	if (i>0)
X	    pw_vector(pw,ptlist[i].x,ptlist[i].y,
X    		     ptlist[i-1].x,ptlist[i-1].y,PIX_XOR,1);
X    }
X  for (i=0;i < no_points;i++)
X    {
X        ptlist[i].x -=top_x;
X        ptlist[i].y -=top_y;
X    }
X  MY_pr_destroy(cut_buffer_pr);
X  cut_buffer_pr = my_mem_create(bottom_x-top_x,bottom_y-top_y,image_depth);
X  pr_polygon_2(cut_buffer_pr,0,0,1,npts,ptlist,PIX_SRC,pw->pw_prretained,top_x,top_y);
X  reset_region();
X  print_msg("The selected area is now in the Cut/Paste buffer.");
X}
X
X
X/*
X * the user can lasso any area on the screen by just encircling the
X * object on the bitmap
X * we do this by remembering all of the points the mouse moved to
X * and make a polygon stencil from these points
X */
Xlaso_addpt(py_pts,x,y)
Xstruct pr_pos py_pts[];
Xint x,y;
X{
Xint found;
Xint i;
Xint npts[1];
X
X  found =0;
X  i=0;
X  while (i<MAX_PTS && !found)
X    {
X      if (py_pts[i++].x == -1)
X	found=TRUE;
X    }
X  i--;
X  npts[0] =i;
X        
X  py_pts[i].x = x;
X  py_pts[i].y = y;
X  if (i>0)
X    pw_vector(pw,py_pts[i].x,py_pts[i].y,py_pts[i-1].x,py_pts[i-1].y,PIX_XOR,1);
X  i++;
X  py_pts[i].x = 0-1;
X  py_pts[i].y = 0-1;
X}
X
X
X/*
X * add a point to the list of vetexs in the current polygon
X */
Xpoly_addpt(py_pts,x,y)
Xstruct pr_pos py_pts[];
Xint x,y;
X{
Xint found;
Xint i;
X
X  found =0;
X  i=0;
X  while (i<MAX_POLY && !found)
X    {
X      if (py_pts[i++].x == -1)
X	found=TRUE;
X    }
X  i--;
X       {
X         py_pts[i].x = x;
X         py_pts[i].y = y;
X	 i++;
X	 py_pts[i].x = 0-1;
X	 py_pts[i].y = 0-1;
X       }
X}
X
X
X/*
X * take the list of currnet vertexs and draw up the
X * the polygon and fill it with the current paint pattern
X */
Xdraw_poly(py_pts)
Xstruct pr_pos py_pts[];
X{
Xint npts[1];
Xint found;
Xint i;
X
X  if (py_pts[0].x == 0-1)
X	return(0);
X
X  found =0;
X  i=0;
X  while (i<MAX_POLY && !found)
X    {
X      if (py_pts[i++].x == -1)
X	found=TRUE;
X    }
X  i--;
X
X  npts[0] =i;
X
X  /*
X   * do we want this baby filled ????
X   */ 
X  if ((int)panel_get_value(command_choice)==POLY_F)
X	   pw_polygon_2(pw,0,0,1,npts,py_pts,PIX_COLOR(cur_color) | PIX_SRC,pattern[(int)panel_get_value(pattern_choice)],0,0);
X
X  /*
X   * do we want to wrap the polygon up in a vector border
X   */
X  if ((int)panel_get_value(border_cycle))
X  {
X      i=1;
X      while (i<MAX_POLY && (py_pts[i].x != -1))
X        {
X    	pw_vector(pw,py_pts[i].x,py_pts[i].y,
X    		     py_pts[i-1].x,py_pts[i-1].y,PIX_SRC,cur_color);
X    	i++;
X        }
X      i--;
X      pw_vector(pw,py_pts[i].x,py_pts[i].y,
X    		     py_pts[0].x,py_pts[0].y,PIX_SRC,cur_color);
X  }
X  clean_poly();
X}
X
X
X/*
X * reset the vertex list for the current polygon
X */
Xclean_poly()
X{
X  poly_points[0].x = 0-1;
X  poly_points[0].y = 0-1;
X}
END_OF_drawing.c
if test 16127 -ne `wc -c <drawing.c`; then
    echo shar: \"drawing.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fat.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"fat.c\"
else
echo shar: Extracting \"fat.c\" \(5661 characters\)
sed "s/^X//" >fat.c <<'END_OF_fat.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: fat.c
X	purpose: This file contains the functions that handle the
X		magnifing class command.
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include "header.h"
X
Xint old_cur_color=0-1;
X
X/*
X * Let's go into magnify mode !!
X */
Xfat_mode(item, event)
XPanel_item      item;
XEvent           *event;
X{
X    if (image_depth==1)
X	old_cur_color = cur_color;
X    if (select_pt_x == -1)
X       {
X	ERROR("Select point first then select Magnify");
X	set_select_mode();
X	return(0);
X       }
X    
X    if (fat_source_x != -1)
X       select_fat_region();
X    fat_source_x = select_pt_x- (int)window_get(fat_canvas, CANVAS_WIDTH)/magnify_fac/2;
X    fat_source_y = select_pt_y- (int)window_get(fat_canvas, CANVAS_HEIGHT)/magnify_fac/2;
X    clean_point();
X    (void)window_set(fat_frame, WIN_SHOW, TRUE, 0);
X    select_fat_region();
X    fat_update(0,0);
X}
X
X
X/*
X * kill off the magnify window
X */
Xfat_done(item, event)
XPanel_item      item;
XEvent           *event;
X{
X    if ((image_depth==1) && (old_cur_color != -1))
X    {
X	cur_color = old_cur_color;
X        old_cur_color = 0-1;
X    }
X    if (fat_source_x != -1)
X       select_fat_region();
X    (void)window_set(fat_frame, WIN_SHOW, FALSE, 0);
X    fat_source_x = 0-1;
X    fat_source_y = 0-1;
X}
X
X
X
X/*
X * The event handler for the canvas of the magnifying class window
X * You can do 3 things.
X *  left: inverse the bit the mouse is on top of and continue
X *		to draw in that color
X *  middle: use this to draw the magnified view
X *  right: use to set the current color to the color of the pixel
X * 		under the cursor
X */
Xfat_handle_event(canvas_local, event)
XCanvas  canvas_local;
XEvent   *event;
X{
X    if (event_is_up(event))
X       return;
X    switch (event_id(event)) {
X	 case MS_LEFT:
X		if (image_depth ==1)
X                   {
X		      cur_color = 1^pw_get(pw,fat_source_x + (int)event_x(event)/magnify_fac,fat_source_y + (int)event_y(event)/magnify_fac);
X		   }
X		fat_draw(fat_pw,pw, event_x(event), event_y(event));
X		break;
X	 case MS_MIDDLE:
X		fat_x = event_x(event);
X		fat_y = event_y(event);
X		break;
X	 case MS_RIGHT:
X		 fat_match_color(event_x(event), event_y(event));
X       		 break;
X         case LOC_DRAG:
X            if (window_get(canvas_local, WIN_EVENT_STATE, MS_LEFT))
X		fat_draw(fat_pw,pw, event_x(event), event_y(event));
X	    else if (window_get(canvas_local, WIN_EVENT_STATE, MS_MIDDLE))
X		{
X		fat_update(fat_x-event_x(event),fat_y-event_y(event));
X		fat_x = event_x(event);
X		fat_y = event_y(event);
X		}
X	    break;
X
X	}
X}
X
X
X/*
X * Find out the color of the pixel under the cursor
X */
Xfat_match_color(x,y)
Xint x,y;
X{
X  x = fat_source_x + x/magnify_fac;
X  y = fat_source_y + y/magnify_fac;
X  update_cur_color(0,0,pw_get(pw,x,y));
X}
X
X
X/*
X * This is the function that updates the display of the magnifyied view
X * This function is called when the middle but is used to draw this window
X */
Xfat_update(offset_x,offset_y)
Xint offset_x,offset_y;
X{
Xint w,h;
X
X  w = (int) window_get(fat_canvas, CANVAS_WIDTH);
X  h = (int) window_get(fat_canvas, CANVAS_HEIGHT);
X  select_fat_region();
X  fat_source_x += offset_x/magnify_fac;
X  fat_source_y += offset_y/magnify_fac;
X  if (w >= SCREEN_MAX_X)
X     w=SCREEN_MAX_X-1;
X  if (h >= SCREEN_MAX_Y)
X     h=SCREEN_MAX_Y-1;
X
X/*
X * check if you are within the pixrect
X */
X#ifdef NO_FASTAN
X  if (fat_source_x < 0)
X	fat_source_x = 0;
X  if (fat_source_y < 0)
X	fat_source_y = 0;
X  if (fat_source_x+w/magnify_fac > image_wid)
X	fat_source_x = image_wid - w/magnify_fac;
X  if (fat_source_y+h/magnify_fac > image_hgt)
X	fat_source_y = image_hgt - h/magnify_fac;
X#endif
X
X  pw_mag(fat_pw, 0, 0, w, h, magnify_fac, pw->pw_prretained,
X	 fat_source_x, fat_source_y);
X  select_fat_region();
X}
X
X
X/*
X * get the current magnification level
X */
Xfat_parms(item, event)
XPanel_item      item;
XEvent           *event;
X{
X  select_fat_region();
X  magnify_fac = (int)panel_get_value(magnify_cycle) + 1;
X  select_fat_region();
X  fat_update(0,0);
X}
X
X
X/*
X * show which region of the drawing area bitmap is being magnified
X */
Xselect_fat_region()
X{
Xint w,h;
X  w = (int) window_get(fat_canvas, CANVAS_WIDTH);
X  h = (int) window_get(fat_canvas, CANVAS_HEIGHT);
X  select_region(pw,fat_source_x-1,fat_source_y-1,
X		  fat_source_x+w/magnify_fac+1,fat_source_y+h/magnify_fac+1);
X}
X
X
X
X/*
X * handle the drawing inside of the magnified view window
X */
Xfat_draw(fat_pw,pw,x,y)
Xstruct pixwin *fat_pw,*pw;
Xint x,y;
X{
X  x = x/magnify_fac*magnify_fac;
X  y = y/magnify_fac*magnify_fac;
X  pw_write(fat_pw,x,y,magnify_fac,magnify_fac,PIX_COLOR(cur_color) | PIX_SRC,NILPR,0,0);
X  x = fat_source_x + x/magnify_fac;
X  y = fat_source_y + y/magnify_fac;
X  pw_put(pw,x,y,cur_color);
X}
X
END_OF_fat.c
if test 5661 -ne `wc -c <fat.c`; then
    echo shar: \"fat.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f ffill.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"ffill.c\"
else
echo shar: Extracting \"ffill.c\" \(2770 characters\)
sed "s/^X//" >ffill.c <<'END_OF_ffill.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: ffill.c
X	purpose: this file has the functions that do flood fill
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include "header.h"
X
X
X/*
X * let's go into flood fill mode because we got a button click on flood fill
X */
Xfill_mode(item, event)
XPanel_item      item;
XEvent           *event;
X{
Xint x,y;
X
X
X  if (select_pt_x != -1)
X      {
X         print_msg("Hold down the RIGHT mouse button to cancel flood fill.");
X  	 x = select_pt_x;
X         y = select_pt_y;
X	 clean_point();
X	 save_screen();
X	 pw_put(pw,x,y,cur_color^1);
X	 if (ffill(x,y,cur_color))
X		ERROR("Flood fill cancelled !!");
X	 else
X	    hide_msg();
X      }
X  else
X      {
X	ERROR("Select point first, then select flood fill");
X	set_select_mode();
X      }
X}
X
X
X#define FILL_CANCEL 1
X
X/*
X * this is a simple recursive flood fill that will work
X * on mono bitmaps
X * call it will the start x,y coordinates and the color
X * to fill with, which is also the bounary color
X */
Xffill(x,y,n)
Xint x,y,n;
X{
Xint flag;
Xregister i,j,k,bx;
X
X        if (window_get(canvas, WIN_EVENT_STATE, MS_RIGHT))
X            return(FILL_CANCEL);
X
X	if (x<0 || x>=image_wid || y<0 || y>=image_hgt || pw_get(pw,x,y)==n)
X		return(0);
X	pw_put(pw,x,y,n);
X        bx = x-1;
X	for (i=x-1;i>=0;i--) {
X		if (pw_get(pw,i,y)!=n)
X			bx = i;
X		else 
X		    {
X			pw_vector(pw,bx,y,x,y, PIX_SRC,n);
X			break;
X		    }
X		}
X        bx = x+1;
X	for (j=x+1;j<image_wid;j++)
X		if (pw_get(pw,j,y)!=n)
X			bx = j;
X		else 
X		     {
X			pw_vector(pw,bx,y,x,y, PIX_SRC,n);
X			break;
X		     }
X
X        flag = 0;
X	for (k=i+1;k<j;k++)
X	{
X		if (y>0 && pw_get(pw,k,y-1)!=n)
X			flag = ffill(k,y-1,n);
X		if (y<image_hgt-1 && pw_get(pw,k,y+1)!=n)
X			flag = ffill(k,y+1,n);
X                if (flag) break;
X	}
Xreturn(flag);
X}
X
END_OF_ffill.c
if test 2770 -ne `wc -c <ffill.c`; then
    echo shar: \"ffill.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fonts.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"fonts.c\"
else
echo shar: Extracting \"fonts.c\" \(4529 characters\)
sed "s/^X//" >fonts.c <<'END_OF_fonts.c'
X
X/**************************************************************************
X   Touchup a bitmap graphics editor for the Sun Workstation running SunView
X   Copyright (c) 1988 by Raymond Kreisel
X   1/22/88 @ Suny Stony Brook
X
X   This program may be redistributed without fee as long as this copyright
X   notice is intact.
X
X==> PLEASE send comments and bug reports to one of the following addresses:
X
X	   Ray Kreisel
X	   CS Dept., SUNY at Stony Brook, Stony Brook NY 11794
X
X	   UUCP: {allegra, philabs, pyramid, research}!sbcs!rayk   
X	   ARPA-Internet: rayk at sbcs.sunysb.edu			
X	   CSnet: rayk at suny-sb
X	   (If nobody is home at any of the above addresses try:
X		S72QKRE at TOWSONVX.BITNET			        )
X
X "If I get home before daylight, I just might get some sleep tonight...."
X
X**************************************************************************/
X/**************************************************************************
X	file: fonts
X	purpose: the get most of the good system fixed width fonts
X		from the sys dirs and set them up in memory
X
X	modifications:
X		date:	Tue Mar 22 22:04:58 EST 1988
X		author:	rayk
X		changes:add comments
X**************************************************************************/
X
X#include <pixrect/pixrect_hs.h>
X
X
X
X#define cour_b_10F  "/usr/lib/fonts/fixedwidthfonts/cour.b.10"
X#define cour_b_12F  "/usr/lib/fonts/fixedwidthfonts/cour.b.12"
X#define cour_b_16F  "/usr/lib/fonts/fixedwidthfonts/cour.b.16"
X#define cour_b_24F  "/usr/lib/fonts/fixedwidthfonts/cour.b.24"
X
X#define cour_r_10F  "/usr/lib/fonts/fixedwidthfonts/cour.r.10"
X#define cour_r_12F  "/usr/lib/fonts/fixedwidthfonts/cour.r.12"
X#define cour_r_16F  "/usr/lib/fonts/fixedwidthfonts/cour.r.16"
X#define cour_r_24F  "/usr/lib/fonts/fixedwidthfonts/cour.r.24"
X
X#define screen_r_7F   "/usr/lib/fonts/fixedwidthfonts/screen.r.7"
X#define screen_r_11F  "/usr/lib/fonts/fixedwidthfonts/screen.r.11"
X#define screen_r_12F  "/usr/lib/fonts/fixedwidthfonts/screen.r.12"
X#define screen_r_14F  "/usr/lib/fonts/fixedwidthfonts/screen.r.14"
X#define screen_b_12F  "/usr/lib/fonts/fixedwidthfonts/screen.b.12"
X#define screen_b_14F  "/usr/lib/fonts/fixedwidthfonts/screen.b.14"
X
X#define pcfont_b_14F  "/usr/lib/fonts/fixedwidthfonts/pcfont.b.14"
X#define pcfont_r_14F  "/usr/lib/fonts/fixedwidthfonts/pcfont.r.14"
X
X#define serif_r_10F  "/usr/lib/fonts/fixedwidthfonts/serif.r.10"
X#define serif_r_11F  "/usr/lib/fonts/fixedwidthfonts/serif.r.11"
X#define serif_r_16F  "/usr/lib/fonts/fixedwidthfonts/serif.r.16"
X
Xstruct  pixfont  *screen_r_7;
Xstruct  pixfont  *screen_r_11;
Xstruct  pixfont  *screen_r_12;
Xstruct  pixfont  *screen_r_14;
Xstruct  pixfont  *screen_b_12;
Xstruct  pixfont  *screen_b_14;
X
Xstruct  pixfont  *pcfont_b_14;
Xstruct  pixfont  *pcfont_r_14;
X
Xstruct  pixfont  *cour_b_10;
Xstruct  pixfont  *cour_b_12;
Xstruct  pixfont  *cour_b_16;
Xstruct  pixfont  *cour_b_24;
X
Xstruct  pixfont  *cour_r_10;
Xstruct  pixfont  *cour_r_12;
Xstruct  pixfont  *cour_r_14;
Xstruct  pixfont  *cour_r_16;
Xstruct  pixfont  *cour_r_18;
Xstruct  pixfont  *cour_r_24;
X
Xstruct  pixfont  *serif_r_10;
Xstruct  pixfont  *serif_r_11;
Xstruct  pixfont  *serif_r_16;
X
X
X#define FONT_NO 19
X
X
Xstruct  pixfont  *font_array[FONT_NO];
X
Xinit_font()
X{
X
X   screen_r_7  = pf_open(screen_r_7F);
X   screen_r_11 = pf_open(screen_r_11F);
X   screen_r_12 = pf_open(screen_r_12F);
X   screen_r_14 = pf_open(screen_r_14F);
X   screen_b_12 = pf_open(screen_b_12F);
X   screen_b_14 = pf_open(screen_b_14F);
X
X   pcfont_b_14 = pf_open(pcfont_b_14F);
X   pcfont_r_14 = pf_open(pcfont_r_14F);
X
X   cour_b_10 = pf_open(cour_b_10F); 
X   cour_b_12 = pf_open(cour_b_12F);
X   cour_b_16 = pf_open(cour_b_16F);
X   cour_b_24 = pf_open(cour_b_24F); 
X
X   cour_r_10 = pf_open(cour_r_10F);
X   cour_r_12 = pf_open(cour_r_12F);
X   cour_r_16 = pf_open(cour_r_16F);
X   cour_r_24 = pf_open(cour_r_24F);
X
X   serif_r_10 = pf_open(serif_r_10F);           
X   serif_r_11 = pf_open(serif_r_11F);          
X   serif_r_16 = pf_open(serif_r_16F);
X
X  font_array[0] = cour_r_10;
X  font_array[1] = cour_r_12;
X  font_array[2] = cour_r_16;
X  font_array[3] = cour_r_24;
X
X  font_array[4] = cour_b_10;
X  font_array[5] = cour_b_12;
X  font_array[6] = cour_b_16;
X  font_array[7] = cour_b_24;
X
X  font_array[8] = serif_r_10;
X  font_array[9] = serif_r_11;
X  font_array[10] = serif_r_16;
X
X  font_array[11] = screen_r_7;
X  font_array[12] = screen_r_11;
X  font_array[13] = screen_r_12;
X  font_array[14] = screen_r_14;
X  font_array[15] = screen_b_12;
X  font_array[16] = screen_b_14;
X
X  font_array[17] = pcfont_b_14;
X  font_array[18] = pcfont_r_14;
X}
X
END_OF_fonts.c
if test 4529 -ne `wc -c <fonts.c`; then
    echo shar: \"fonts.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 5 \(of 6\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.



More information about the Comp.sources.unix mailing list