|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 6429 (0x191d)
Types: TextFile
Names: »paint.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z«
└─⟦036c765ac⟧
└─⟦this⟧ »TeX3.0/MFcontrib/fonttool/paint.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
└─⟦this⟧ »./tex82/MFcontrib/fonttool/paint.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦63303ae94⟧ »unix3.14/TeX3.14.tar.Z«
└─⟦c58930e5c⟧
└─⟦this⟧ »TeX3.14/MFcontrib/fonttool/paint.c«
/*
* File:
*
* paint.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 Paint subwindow.
*
* Contents:
*
* Public:
*
* InitPaintSW Creates the PaintSW and associated pixwin.
* FixPaintSW Resets size and position of PaintSW.
*
* Private:
*
* paintSWInputHandler Handles mouse input in the PaintSW.
*/
#include "global.h"
#include <suntool/scrollbar.h>
static Scrollbar ScrollbarVert; /* vertical scrollbar */
static Scrollbar ScrollbarHori; /* horizontal scrollbar */
static int ScrollbarBreadth; /* default thickness of scrollbar */
/*
* InitPaintSW
*
* Input:
* none.
* Output:
* none.
* Action:
* Create the paint subwindow, which is a canvas subwindow.
* The paint subwindow will catch mouse input (position and button)
* and take appropriate action.
*/
void
InitPaintSW()
{
static void paintSWInputHandler();
ScrollbarBreadth = (int) scrollbar_get(SCROLLBAR, SCROLL_THICKNESS);
ScrollbarVert = scrollbar_create(0);
ScrollbarHori = scrollbar_create(0);
PaintSW = window_create(FontToolFrame, CANVAS,
CANVAS_AUTO_SHRINK, FALSE,
CANVAS_AUTO_EXPAND, FALSE,
CANVAS_WIDTH, SCALEUP(MINVIEWSWWIDTH),
CANVAS_HEIGHT, SCALEUP(MINVIEWSWHEIGHT),
WIN_WIDTH, SCALEUP(MINVIEWSWWIDTH) + ScrollbarBreadth,
WIN_HEIGHT, SCALEUP(MINVIEWSWHEIGHT) + ScrollbarBreadth,
WIN_CURSOR, PaintCursor,
WIN_VERTICAL_SCROLLBAR, ScrollbarVert,
WIN_HORIZONTAL_SCROLLBAR, ScrollbarHori,
WIN_CONSUME_PICK_EVENTS, WIN_NO_EVENTS, WIN_MOUSE_BUTTONS,
LOC_DRAG, LOC_STILL, 0,
WIN_EVENT_PROC, paintSWInputHandler,
CANVAS_FAST_MONO, TRUE,
0);
PaintPW = canvas_pixwin(PaintSW);
}
/*
* FixPaintSW
*
* Input:
* none.
* Output:
* none.
* Action:
* Makes sure the PaintSW is positioned and sized correctly, in case
* the user has resized the main tool window, the ViewSW has changed
* in size, or a new magnification has been selected. Note that the
* contents of the PaintSW must first be "homed" to scrolling position
* (0, 0), otherwise resizing it makes no sense.
*/
void
FixPaintSW()
{
Rect r;
r = *((Rect *) window_get(FontToolFrame, WIN_RECT));
PaintRect.r_top = MAX(
ViewRect.r_top + ViewRect.r_height + SWSPACING,
OptionRect.r_top + OptionRect.r_height + SWSPACING);
PaintRect.r_width = MIN(
SCALEUP(ViewRect.r_width) + ScrollbarBreadth,
r.r_width - 2*FRAMEMARGIN);
PaintRect.r_height = MIN(
SCALEUP(ViewRect.r_height) + ScrollbarBreadth,
r.r_height
- (int) window_get(FontToolFrame, WIN_TOP_MARGIN)
- MessageRect.r_height
- MAX(ViewRect.r_height, OptionRect.r_height)
- 2*SWSPACING
- FRAMEMARGIN);
scrollbar_scroll_to(ScrollbarVert, 0);
scrollbar_scroll_to(ScrollbarHori, 0);
r = PaintRect;
window_set(PaintSW, WIN_RECT, &r, 0);
window_set(PaintSW,
CANVAS_WIDTH, SCALEUP(ViewPR->pr_size.x),
CANVAS_HEIGHT, SCALEUP(ViewPR->pr_size.y),
0);
}
/*
* paintSWInputHandler
*
* Input:
* window: A subwindow handle.
* event : A pointer to an event.
* arg : "An optional argument containing data pertinent to the event."
* Output:
* none.
* Action:
* paintSWInputHandler is called when one of the events specified
* in the input mask for the paint subwindow has occurred.
*/
static void
paintSWInputHandler(window, event, arg)
Window window;
Event *event;
caddr_t arg;
{
int xView, yView;
enum mouseButs {none, left, middle, right};
static enum mouseButs currentMousePressed;
/*
* Convert to the unmagnified coordinates used in the ViewSW.
*/
xView = SCALEDOWN(event_x(event));
yView = SCALEDOWN(event_y(event));
switch(event_id(event)) {
case MS_LEFT:
if (event_is_down(event)) {
currentMousePressed = left;
PaintColor = BLACK;
RasterChanged = 1;
switch(MouseMode) {
case MODEPOINTS:
ResetRect(&UndoRect, xView, yView, 1, 1);
COPYPR(ViewPR, UndoPR);
DrawDot(xView, yView);
CLEARUNDOREFPT;
break;
case MODELINES:
StartLine(xView, yView);
CLEARUNDOREFPT;
break;
case MODEFILL:
FillRegion(xView, yView);
CLEARUNDOREFPT;
break;
case MODEMOVE: /* move the reference point */
SETUNDOREFPT;
MoveRefPoint(SCALEUP(xView), SCALEUP(yView));
ClearMsg();
break;
}
}
else {
currentMousePressed = none;
}
break;
case MS_MIDDLE:
if (event_is_down(event)) {
currentMousePressed = middle;
PaintColor = WHITE;
RasterChanged = 1;
switch(MouseMode) {
case MODEPOINTS:
ResetRect(&UndoRect, xView, yView, 1, 1);
COPYPR(ViewPR, UndoPR);
DrawDot(xView, yView);
CLEARUNDOREFPT;
break;
case MODELINES:
StartLine(xView, yView);
CLEARUNDOREFPT;
break;
case MODEFILL:
FillRegion(xView, yView);
CLEARUNDOREFPT;
break;
case MODEMOVE: /* move the reference point */
SETUNDOREFPT;
MoveRefPoint(SCALEUP(xView), SCALEUP(yView));
ClearMsg();
break;
}
}
else {
currentMousePressed = none;
}
break;
case MS_RIGHT: /* Undo */
if (event_is_down(event)) {
SETCURSORWATCH;
Undo();
SETCURSORNORMAL;
}
break;
case LOC_DRAG:
if ( (currentMousePressed == left) ||
(currentMousePressed == middle) ) {
switch (MouseMode) {
case MODEPOINTS:
ExpandRect(&UndoRect, xView, yView);
DrawDot(xView, yView);
break;
case MODELINES:
DrawLine(xView, yView);
break;
case MODEFILL:
break;
case MODEMOVE:
/*
* If the new mouse position is not in the same
* PaintSW cell as in the last event, go ahead and
* move the reference point.
*/
if ( (SCALEUP(xView) != ReferenceXY.x) ||
(SCALEUP(yView) != ReferenceXY.y) ) {
MoveRefPoint(SCALEUP(xView), SCALEUP(yView));
}
break;
}
}
break;
case LOC_STILL:
if ( (MouseMode == MODELINES) && (currentMousePressed != none) ) {
DrawLine(xView, yView);
}
break;
default:
break;
}
}