303 lines
8.6 KiB
C
303 lines
8.6 KiB
C
/* NMshowpoint.c -
|
||
*
|
||
* This file provides procedures that use the highlight layer
|
||
* to display information about particular points. Currently,
|
||
* this is used to highlight selected terminals in nets.
|
||
*
|
||
* *********************************************************************
|
||
* * Copyright (C) 1985, 1990 Regents of the University of California. *
|
||
* * Permission to use, copy, modify, and distribute this *
|
||
* * software and its documentation for any purpose and without *
|
||
* * fee is hereby granted, provided that the above copyright *
|
||
* * notice appear in all copies. The University of California *
|
||
* * makes no representations about the suitability of this *
|
||
* * software for any purpose. It is provided "as is" without *
|
||
* * express or implied warranty. Export of this software outside *
|
||
* * of the United States of America may require an export license. *
|
||
* *********************************************************************
|
||
*/
|
||
|
||
#ifndef lint
|
||
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/netmenu/NMshowpt.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
|
||
#endif /* not lint */
|
||
|
||
#include <stdio.h>
|
||
|
||
#include "utils/magic.h"
|
||
#include "utils/geometry.h"
|
||
#include "tiles/tile.h"
|
||
#include "utils/hash.h"
|
||
#include "database/database.h"
|
||
#include "windows/windows.h"
|
||
#include "graphics/graphics.h"
|
||
#include "dbwind/dbwind.h"
|
||
#include "utils/styles.h"
|
||
#include "utils/main.h"
|
||
#include "utils/malloc.h"
|
||
|
||
/* The net highlight information consists of an array of points.
|
||
* Around each point, this file redisplays a box with a hollow
|
||
* center. Each box is displayed on the screen either MAXLAMBDAS
|
||
* across, or MAXPIXELS across, whichever is less. This means
|
||
* that a) the boxes don't get too large at large view magnifications,
|
||
* and b) when erasing a box, we have an upper limit on how much area
|
||
* (in lambda coordinates) will have to be redisplayed.
|
||
*/
|
||
|
||
static Point * nmspPoints = NULL; /* Pointer to array of points. */
|
||
static int nmspArraySize = 0; /* Size of array. */
|
||
static int nmspArrayUsed = 0; /* Number of entries actually used. */
|
||
|
||
#define MAXLAMBDAS 30
|
||
#define MAXPIXELS 14
|
||
#define THICKNESS 3
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* NMRedrawPoints --
|
||
*
|
||
* This procedure is called by the highlight package to redisplay
|
||
* our highlights. A lock has already been made on the window by the
|
||
* highlight code.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* Information gets redisplayed on the screen.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
int
|
||
NMRedrawPoints(window, plane)
|
||
MagWindow *window; /* Window in which to redisplay. */
|
||
Plane *plane; /* Non-space tiles on this plane indicate
|
||
* the areas where highlights must be redrawn.
|
||
*/
|
||
{
|
||
int i;
|
||
Rect dbArea, screen;
|
||
extern int nmspAlways1(); /* Forward reference. */
|
||
|
||
/* Make sure that we have something to display, and that the
|
||
* root definition for this window is the edit's root definition.
|
||
*/
|
||
|
||
if (nmspArrayUsed == 0) return 0;
|
||
if (((CellUse *)(window->w_surfaceID))->cu_def != EditRootDef) return 0;
|
||
|
||
for (i = 0; i < nmspArrayUsed; i += 1)
|
||
{
|
||
/* Make a rectangle around the point that is either MAXLAMBAS
|
||
* across in database coordinates or MAXPIXELS across in screen
|
||
* coordinates, whichever is smaller.
|
||
*/
|
||
|
||
dbArea.r_xbot = nmspPoints[i].p_x - MAXLAMBDAS/2;
|
||
dbArea.r_ybot = nmspPoints[i].p_y - MAXLAMBDAS/2;
|
||
dbArea.r_xtop = dbArea.r_xbot + MAXLAMBDAS;
|
||
dbArea.r_ytop = dbArea.r_ybot + MAXLAMBDAS;
|
||
if (!DBSrPaintArea((Tile *) NULL, plane, &dbArea,
|
||
&DBAllButSpaceBits, nmspAlways1, (ClientData) NULL))
|
||
continue;
|
||
|
||
WindSurfaceToScreen(window, &dbArea, &screen);
|
||
if (((screen.r_xtop - screen.r_xbot) > MAXPIXELS)
|
||
|| ((screen.r_ytop - screen.r_ybot) > MAXPIXELS))
|
||
{
|
||
dbArea.r_ur = dbArea.r_ll = nmspPoints[i];
|
||
WindSurfaceToScreen(window, &dbArea, &screen);
|
||
screen.r_xbot -= MAXPIXELS/2;
|
||
screen.r_xtop += MAXPIXELS/2;
|
||
screen.r_ybot -= MAXPIXELS/2;
|
||
screen.r_ytop += MAXPIXELS/2;
|
||
}
|
||
|
||
/* If the rectangle is less than 2*THICKNESS across, draw it
|
||
* solid. Otherwise, draw it with a hollow center (i.e. as
|
||
* four boxes).
|
||
*/
|
||
|
||
if (((screen.r_xtop - screen.r_xbot) < 2*THICKNESS)
|
||
|| ((screen.r_ytop - screen.r_ybot) < 2*THICKNESS))
|
||
{
|
||
GrClipBox(&screen, STYLE_SOLIDHIGHLIGHTS);
|
||
}
|
||
else
|
||
{
|
||
Rect screen2;
|
||
screen2 = screen;
|
||
screen2.r_ytop = screen2.r_ybot + THICKNESS - 1;
|
||
GrClipBox(&screen2, STYLE_SOLIDHIGHLIGHTS);
|
||
screen2.r_ytop = screen.r_ytop;
|
||
screen2.r_ybot = screen2.r_ytop - THICKNESS + 1;
|
||
GrClipBox(&screen2, STYLE_SOLIDHIGHLIGHTS);
|
||
screen2.r_ybot = screen.r_ybot + THICKNESS - 1;
|
||
screen2.r_xtop = screen2.r_xbot + THICKNESS - 1;
|
||
GrClipBox(&screen2, STYLE_SOLIDHIGHLIGHTS);
|
||
screen2.r_xtop = screen.r_xtop;
|
||
screen2.r_xbot = screen2.r_xtop - THICKNESS + 1;
|
||
GrClipBox(&screen2, STYLE_SOLIDHIGHLIGHTS);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int
|
||
nmspAlways1()
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* NMAddPoint --
|
||
*
|
||
* This procedure adds a point to the list of those being
|
||
* highlighted.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* The point is added to our internal list of those to be
|
||
* highlighted. It will also be displayed on the screen
|
||
* after the next call to WindUpdate.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
NMAddPoint(point)
|
||
Point *point; /* Point to be highlighted, in coordinates
|
||
* of EditRootDef.
|
||
*/
|
||
{
|
||
int i;
|
||
Point *newArray;
|
||
Rect area;
|
||
|
||
/* Make sure this point isn't already on the list. */
|
||
|
||
for (i = 0; i < nmspArrayUsed; i += 1)
|
||
{
|
||
if ((nmspPoints[i].p_x == point->p_x)
|
||
&& (nmspPoints[i].p_y == point->p_y)) return;
|
||
}
|
||
|
||
/* Make sure there's enough space in the array. Make it
|
||
* bigger if necessary.
|
||
*/
|
||
|
||
if (nmspArrayUsed == nmspArraySize)
|
||
{
|
||
nmspArraySize *= 2;
|
||
if (nmspArraySize < 10) nmspArraySize = 10;
|
||
newArray = (Point *) mallocMagic((unsigned)nmspArraySize*sizeof(Point));
|
||
for (i = 0; i < nmspArrayUsed; i += 1)
|
||
newArray[i] = nmspPoints[i];
|
||
if (nmspPoints != NULL) freeMagic((char *) nmspPoints);
|
||
nmspPoints = newArray;
|
||
}
|
||
|
||
/* Add in the new point at the end of the array. */
|
||
|
||
nmspPoints[nmspArrayUsed] = *point;
|
||
nmspArrayUsed += 1;
|
||
|
||
/* Remember the area to be redisplayed. */
|
||
|
||
area.r_xbot = point->p_x - MAXLAMBDAS/2;
|
||
area.r_xtop = point->p_x + MAXLAMBDAS/2;
|
||
area.r_ybot = point->p_y - MAXLAMBDAS/2;
|
||
area.r_ytop = point->p_y + MAXLAMBDAS/2;
|
||
DBWHLRedraw(EditRootDef, &area, FALSE);
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* NMDeletePoint --
|
||
*
|
||
* This procedure removes a point from the list of those
|
||
* being highlighted.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* The highlight information is removed from our internal list.
|
||
* The screen will not be updated until the next WindUpdate
|
||
* call.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
NMDeletePoint(point)
|
||
Point *point; /* Point to be un-highlighted, in coords
|
||
* of EditRootDef.
|
||
*/
|
||
{
|
||
int i;
|
||
Rect area;
|
||
|
||
/* Remove from list (smash list down to cover hole. */
|
||
|
||
for (i = 0; i < nmspArrayUsed; i += 1)
|
||
{
|
||
if ((nmspPoints[i].p_x != point->p_x)
|
||
|| (nmspPoints[i].p_y != point->p_y)) continue;
|
||
for (i += 1; i < nmspArrayUsed; i += 1)
|
||
nmspPoints[i-1] = nmspPoints[i];
|
||
nmspArrayUsed -= 1;
|
||
break;
|
||
}
|
||
|
||
/* Redisplay on screen. */
|
||
|
||
area.r_xbot = point->p_x - MAXLAMBDAS/2;
|
||
area.r_xtop = area.r_xbot + MAXLAMBDAS;
|
||
area.r_ybot = point->p_y - MAXLAMBDAS/2;
|
||
area.r_ytop = area.r_ybot + MAXLAMBDAS;
|
||
DBWHLRedraw(EditRootDef, &area, TRUE);
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* NMClearPoints --
|
||
*
|
||
* This procedure clears the list of points being highlighted.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* All points are removed from the list. The screen won't be
|
||
* updated until the next call to WindUpdate.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
NMClearPoints()
|
||
{
|
||
int i;
|
||
Rect area;
|
||
|
||
for (i = 0; i < nmspArrayUsed; i += 1)
|
||
{
|
||
area.r_xbot = nmspPoints[i].p_x - MAXLAMBDAS/2;
|
||
area.r_xtop = area.r_xbot + MAXLAMBDAS;
|
||
area.r_ybot = nmspPoints[i].p_y - MAXLAMBDAS/2;
|
||
area.r_ytop = area.r_ybot + MAXLAMBDAS;
|
||
DBWHLRedraw(EditRootDef, &area, TRUE);
|
||
}
|
||
nmspArrayUsed = 0;
|
||
}
|