DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T v

⟦32014cdf3⟧ TextFile

    Length: 7839 (0x1e9f)
    Types: TextFile
    Names: »view.c«

Derivation

└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z« 
        └─⟦036c765ac⟧ 
            └─⟦this⟧ »TeX3.0/MFcontrib/fonttool/view.c« 
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./tex82/MFcontrib/fonttool/view.c« 
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦63303ae94⟧ »unix3.14/TeX3.14.tar.Z« 
        └─⟦c58930e5c⟧ 
            └─⟦this⟧ »TeX3.14/MFcontrib/fonttool/view.c« 

TextFile

/*
 * File:
 *
 *	view.c
 *
 * Author:
 *
 *	Brad Rullman
 *	Department of Computer Science  FR-35
 *	University of Washington
 *	Seattle, Washington  98155
 *	email: ecola@cs.washington.edu
 *
 *	Copyright @ March, 1987 - This program, or any subset of the functions
 *	herein, is not to be redistributed, or used for personal or commercial
 *	gain in the form of fame, fortune, or shorter working hours, without
 *	the consent of the author.
 *
 * Function:
 *
 *	A file of functions which implement the View subwindow.
 *	Also defines FontTool's drawing op's, which are actually
 *	performed in the ViewSW first, then scaled up to the PaintSW.
 *
 * Contents:
 *
 *   Public:
 *
 *	InitViewSW		Creates the View subwindow.
 *	FixViewSW		Resets the size of the ViewSW.
 *	DrawDot			Paints a dot (cell of pixels) on the screen.
 *	StartLine		Paints the first dot in a set of lines.
 *	DrawLine		Draws a line based on most recent mouse event
 *	FillRegion		Fills enclosed area designated by last click.
 *	MoveRefPoint		Moves the reference point to a new location.
 *	Undo			Undoes the previous paint window operation.
 * 
 *   Private Internal:
 *
 *	doFill			Paints a region of pixels on the screen.
 */

#include "global.h"

/*
 * Statics for when mouse is drawing lines.
 */
static struct pr_pos startPt;	/* startpoint of the current line */
static struct pr_pos endPt;	/* endpoint of the current line   */



/*
 * InitViewSW
 *
 * Input:
 *	none.
 * Output:
 *	none.
 * Action:
 *	Creates the View subwindow, which is a canvas subwindow.
 */
void
InitViewSW()
{
    ViewSW = window_create(FontToolFrame, CANVAS,
			WIN_WIDTH,		MINVIEWSWWIDTH,
			WIN_HEIGHT, 		MINVIEWSWHEIGHT,
			WIN_CURSOR,		MainCursor,
			CANVAS_FAST_MONO,	TRUE,
			0);
    ViewPW = canvas_pixwin(ViewSW);
}



/*
 * FixViewSW
 *
 * Input:
 *	none.
 * Output:
 *	none.
 * Action:
 *	Makes sure the ViewSW is sized correctly, in case the user has
 *	resized the main tool window, or the ViewSW has changed in size.
 */
void
FixViewSW()
{
    Rect r;

    r = (*(Rect *) window_get(FontToolFrame, WIN_RECT));
    ViewRect.r_width = MIN(ViewPR->pr_size.x, r.r_width - 2*FRAMEMARGIN);
    ViewRect.r_height = MIN(
	ViewPR->pr_size.y,
	r.r_height - (int) window_get(FontToolFrame, WIN_TOP_MARGIN)
	    - MessageRect.r_height - SWSPACING - FRAMEMARGIN);
    r = ViewRect;
    window_set(ViewSW, WIN_RECT, &r, 0);
}



/*
 * DrawDot
 *
 * Input: 
 *	xInput, yInput: ViewSW coordinates of a dot to be drawn.
 * Output: 
 *	none.
 * Action: 
 *	Draw a dot on the appropriate data structures, including the screen.
 */
void
DrawDot(xInput, yInput)
int xInput, yInput;
{
    pr_put(ViewPR, xInput, yInput, PaintColor);
    DisplayPR(xInput, yInput, 1, 1);
}



/*
 * StartLine
 *
 * Input: 
 *	xInput, yInput: starting point of a line in the ViewSW.
 * Output: 
 *	none.
 * Action: 
 *	This routine is called if we're in drawlines mode and the left mouse
 *	button has been pressed, indicating the start point of a new line.
 */
void
StartLine(xInput, yInput)
int xInput, yInput;
{
    startPt.x = endPt.x = xInput;
    startPt.y = endPt.y = yInput;
    ResetRect(&UndoRect, startPt.x, startPt.y, 1, 1);
    COPYPR(ViewPR, UndoPR);
    DrawDot(startPt.x, startPt.y);
}



/*
 * DrawLine
 *
 * Input:
 *	xInput, yInput: the ViewSW endpoint of the line.
 * Output:
 *	none.
 * Action:
 *	Proceeds to draw a rubber band line based on the given endpoint
 *	and the already saved startpoint.
 */
void
DrawLine(xInput, yInput)
int xInput, yInput;
{
    /*
     * If the new mouse position is in the same PaintSW cell
     * as last time, don't bother.
     */
    if ( (xInput == endPt.x) && (yInput == endPt.y) ) {
	return;
    }

    endPt.x = xInput;
    endPt.y = yInput;

    /*
     * Undo the previously drawn (unanchored) line, and expand
     * UndoRect to enclose the line to be drawn.
     */
    pr_rop(ViewPR, UndoRect.r_left, UndoRect.r_top,
	   UndoRect.r_width, UndoRect.r_height, PIX_SRC, 
	   UndoPR, UndoRect.r_left, UndoRect.r_top);
    ExpandRect(&UndoRect, endPt.x, endPt.y);

    /*
     * Draw a vector between the two points in the ViewPR, scale it
     * up and copy it into the PaintPR, and display it on screen.
     */
    pr_vector(ViewPR, startPt.x, startPt.y, endPt.x, endPt.y,
	      (PaintColor == BLACK) ? PIX_SET : PIX_CLR, 1);
    DisplayPR(UndoRect.r_left, UndoRect.r_top,
	      UndoRect.r_width, UndoRect.r_height);

    /*
     * The old line has now been erased in the PaintSW, and the new line
     * drawn.  Reset UndoRect to contain JUST the new line.
     */
    ResetRect(&UndoRect, startPt.x, startPt.y, 1, 1);
    ExpandRect(&UndoRect, endPt.x, endPt.y);
}



/*
 * FillRegion
 *
 * Input: 
 *	xInput, yInput: ViewSW coordinates of starting point of the fill op.
 * Output: 
 *	none.
 * Action: 
 *	Fills the closed region pointed to by the current (x, y) mouse
 *	position after resetting the appropriate undo structures.
 */
void
FillRegion(xInput, yInput)
int xInput, yInput;
{
    static void doFill();

    SETCURSORWATCH;
    ResetRect(&UndoRect, xInput, yInput, 1, 1);
    COPYPR(ViewPR, UndoPR);
    doFill(xInput, yInput, !PaintColor, PaintColor);
    DisplayPR(UndoRect.r_left, UndoRect.r_top,
	      UndoRect.r_width, UndoRect.r_height);
    SETCURSORNORMAL;
}



/*
 * doFill
 *
 * Input: 
 *	x, y        : ViewSW coordinates of starting point of fill operation.
 *	oldIntensity: 0 if old color to be re-painted is white, 1 if black.
 *	newIntensity: 1 or 0.
 * Output: 
 *	none.
 * Action: 
 *	Writes pixels of color newIntensity into ViewPR recursively using
 *	a 4-connected policy until no more pixels of oldIntensity can be
 *	reached.  Keeps track of modified area in ViewPR by constantly
 *	updating UndoRect.
 */
static void
doFill(x, y, oldIntensity, newIntensity)
int x, y;
int oldIntensity, newIntensity;
{
    if (pr_get(ViewPR, x, y) == oldIntensity) {
	pr_put(ViewPR, x, y, newIntensity);
	/*
	 * Expand the undo rectangle accordingly so we know what region
	 * to write to the screen when we are done.
	 */
	ExpandRect(&UndoRect, x, y);

	doFill(x + 1, y, oldIntensity, newIntensity);
	doFill(x - 1, y, oldIntensity, newIntensity);
	doFill(x, y + 1, oldIntensity, newIntensity);
	doFill(x, y - 1, oldIntensity, newIntensity);
    }
}



/*
 * MoveRefPoint
 *
 * Input:
 *	xInput, yInput: new location of the reference point in the PaintSW.
 * Output:
 *	none.
 * Action:
 *	Erases the reference point in the PaintSW, resets the current 
 *	reference point location, and redraws it in the PaintSW.
 */
void
MoveRefPoint(xInput, yInput)
int xInput, yInput;
{
    pw_write(PaintPW, ReferenceXY.x, ReferenceXY.y,
	     Magnification, Magnification, PIX_SRC, PaintPR,
	     ReferenceXY.x, ReferenceXY.y);
    ReferenceXY.x = xInput;
    ReferenceXY.y = yInput;
    DrawRefPoint();
}



/*
 * Undo
 *
 * Input:
 *	none.
 * Output:
 *	none.
 * Action:
 *	Copies a bounding box (defined by UndoRect) in UndoPR into ViewPR
 *	(actually done by merely swapping pixrect pointers).  This is
 *	supposedly restoring ViewPR to it's state before the last major
 *	PaintSW operation.  Since the "Move Reference Point" option
 *	involves changing a variable containing coordinates rather than
 *	changing the ViewPR, we first check if this was the previous paint
 *	operation performed.
 */
void
Undo()
{
    struct pixrect *pr;
    struct pr_pos p;

    if (UndoReferenceXY.x > -1) {
	/*
	 * Undo the "Move Reference Point", and switch ReferenceXY and
	 * UndoReferenceXY in case "Undo" is called again.
	 */
	p.x = ReferenceXY.x;
	p.y = ReferenceXY.y;
	MoveRefPoint(UndoReferenceXY.x, UndoReferenceXY.y);
	UndoReferenceXY.x = p.x;
	UndoReferenceXY.y = p.y;
	return;
    }
    pr = UndoPR;
    UndoPR = ViewPR;
    ViewPR = pr;
    DisplayPR(UndoRect.r_left, UndoRect.r_top,
	      UndoRect.r_width, UndoRect.r_height);
}