1
0
Files
irix-657m-src/irix/cmd/netman/netgraph/graphGadget.c++
2022-09-29 17:59:04 +03:00

383 lines
8.9 KiB
C++

/*
* Copyright 1991, 1992 Silicon Graphics, Inc. All rights reserved.
*
* NetGraph Graph Gadget (GL stuff for each graph)
*
* $Revision: 1.7 $
* $Date: 1992/10/19 18:29:57 $
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
#include <tuStyle.h>
#include <tuWindow.h>
#include <string.h>
#include "boxes.h"
#include "constants.h"
#include "graphGadget.h"
#include "netGraph.h"
#include "stripGadget.h"
#include <gl/gl.h>
#include <gl/glws.h>
#include <stdio.h>
#define NUM_DIVS 10
#define ORTHO_HEIGHT 99.0
#define ORTHO_WIDTH 99.0
GraphGadget::GraphGadget(NetGraph *ng, StripGadget* s, tuGadget *parent,
const char *instanceName)
: tuGLGadget(parent, instanceName) {
// Save pointer to netgraph
netgraph = ng;
strip = s;
dataBounds = new fBox();
graphBounds = new iBox();
bgColor = netgraph->getStripBackgroundIndexColor();
scaleColor = netgraph->getStripScaleIndexColor();
} // graphGadget
void
GraphGadget::bindResources(tuResourceDB *rdb, tuResourcePath *rp) {
tuGLGadget::bindResources(rdb, rp);
setDoubleBuf(True);
setRGBmode(False);
setZBuffer(False);
}
void
GraphGadget::getLayoutHints(tuLayoutHints* h) {
tuGLGadget::getLayoutHints(h);
h->prefWidth = 300;
h->prefHeight = 20;
}
// node: selectButton is left, adjustButton is middle
void
GraphGadget::processEvent(XEvent *ev) {
// printf("GraphGadget::processEvent(type = %d\n", ev->type);
if (ev->type == ButtonPress &&
ev->xbutton.button == tuStyle::getSelectButton())
strip->handleSelection();
tuGLGadget::processEvent(ev);
}
// find appropriate new vertical scale,
// but don't rescale the graph or change dataBounds
int
GraphGadget::findVertScale(float minScale) {
if (numberOfPoints <= 0) {
return 1;
} else if (scaleType == SCALE_CONSTANT) {
// someday we should allow locking on anynumber, but
// now only on 100
return 100;
// } else if (scaleType == SCALE_MAXVALUE) {
// return (int) dataBounds->getHeight();
} else {
dataStruct* pnt = strip->getCurrentData();
float* dataPtr = (float*) pnt;
float ymax = minScale;
int i;
if (netgraph->getHistory()) {
int increment = 2 * netgraph->getHighestNumber() + 2;
for (i = numberOfPoints; i != 0; i--) {
// Scale in y
if (*dataPtr > ymax)
ymax = *dataPtr;
dataPtr += increment;
if (dataPtr > netgraph->getHistoryEnd())
break;
}
} else {
for (i = numberOfPoints; i != 0; i--) {
// Scale in y
if (pnt->y > ymax)
ymax = pnt->y;
pnt = pnt->next;
}
} // not history
// Find nice bounds
int ymaxInt = (int) (ymax + 0.5); // (round up)
for (i = 1; i < (int)ymaxInt; i *= 10)
;
if (i / 5 >= ymaxInt)
i /= 5;
else if (i / 2 >= ymaxInt)
i /= 2;
return i;
}
} // GraphGadget::findVertScale
void
GraphGadget::rescale(tuBool okToShrink) {
int xmax;
// printf("GraphGadget::rescale, strip %d, %d points\n",
// strip->getNumber(), numberOfPoints);
// printf(" dataBounds.height= %.2f, findVertScale()=%.2f\n",
// dataBounds->getHeight(), findVertScale(dataBounds->getHeight()));
// scale in x
xmax = numberOfPoints - 1;
dataBounds->setWidth(xmax - dataBounds->getX());
dataBounds->setY(0.0); // we used to allow non-zero min, but why bother?
if (scaleType == SCALE_VARIABLE && okToShrink)
dataBounds->setHeight(findVertScale(0.0));
else if (scaleType == SCALE_MAXVALUE)
dataBounds->setHeight(
TU_MAX((float)findVertScale(dataBounds->getHeight()),
dataBounds->getHeight()));
else
dataBounds->setHeight(findVertScale(dataBounds->getHeight()));
// Fill in the label
char buf[8];
sprintf(buf, "%d", (int)(dataBounds->getHeight()));
strip->setScale(buf);
// Recalculate the scale
if (dataBounds->getWidth() != 0 && dataBounds->getHeight() != 0) {
graphScaleX = ORTHO_WIDTH / dataBounds->getWidth();
graphScaleY = ORTHO_HEIGHT / dataBounds->getHeight();
}
// printf(" new scale: %d\n", (int)(dataBounds->getHeight()));
} // GraphGadget::rescale
void
GraphGadget::render() {
if (!isRenderable() || strip->getCurrentData() == NULL)
return;
// printf("GraphGadget::render, strip %d starts at %x; %d points\n",
// strip->getNumber(),strip->getCurrentData(), numberOfPoints);
winset();
pushmatrix();
pushviewport();
ortho2(0.0, ORTHO_WIDTH, 0.0, ORTHO_HEIGHT);
color(bgColor);
clear();
// draw horizontal lines
color(scaleColor);
float x = 0.0;
float x2 = ORTHO_WIDTH;
float y = 0.0;
int numDivs;
int height = getHeight();
if (height < 25)
numDivs = 0;
else if (height < 60)
numDivs = 2;
else
numDivs = 5;
for (int i = 1; i < numDivs; i++) {
y+= ORTHO_HEIGHT/numDivs;
move2(x,y);
draw2(x2, y);
}
// Draw data
if (numberOfPoints > 0) {
color(colorIndex);
if (graphStyle == STYLE_LINE) {
if (netgraph->getHistory()) {
int increment = 2 * netgraph->getHighestNumber() + 2;
// Move to the first (oldest) point
float* dataPtr = (float*) strip->getCurrentData();
// printf("strip %d; first point %x = %f\n",
// strip->getNumber(), dataPtr, *dataPtr);
x = 0.0;
y = *dataPtr * graphScaleY;
move2(x,y);
dataPtr += increment;
// Draw to the rest
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX ;
y = *dataPtr * graphScaleY;
draw2(x,y);
dataPtr += increment;
if (dataPtr > netgraph->getHistoryEnd())
break;
}
} else {
// Move to the first (oldest) point
dataStruct* pnt = strip->getCurrentData();
x = 0.0;
y = pnt->y * graphScaleY;
move2(x,y);
pnt = pnt->next;
// Draw to the rest
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX;
y = pnt->y * graphScaleY;
draw2(x,y);
pnt = pnt->next;
}
} // not history
} // STYLE_LINE
if (graphStyle == STYLE_BAR) {
if (netgraph->getHistory()) {
int increment = 2 * netgraph->getHighestNumber() + 2;
// Move to the first (oldest) point
float* dataPtr = (float*) strip->getCurrentData();
// printf("strip %d; first point %x = %f\n",
// strip->getNumber(), dataPtr, *dataPtr);
float lastx = 0.0;
dataPtr += increment;
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX;
y = *dataPtr * graphScaleY;
sboxf(lastx, 0.0, x, y);
dataPtr += increment;
lastx = x;
if (dataPtr > netgraph->getHistoryEnd())
break;
}
} else {
// Move to the first (oldest) point
dataStruct* pnt = strip->getCurrentData();
float lastx = 0.0;
pnt = pnt->next;
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX;
y = pnt->y * graphScaleY;
sboxf(lastx, 0.0, x, y);
pnt = pnt->next;
lastx = x;
}
} // not history
} // STYLE_BAR
if (netgraph->getAvgPeriod() != 0) {
// now draw moving average line..
color(avgColorIndex);
if (netgraph->getHistory()) {
int increment = 2 * netgraph->getHighestNumber() + 2;
// Move to the first (oldest) point
float* dataPtr = (float*) strip->getCurrentData() + 1;
// printf(" first avg %x = %f\n", dataPtr, *dataPtr);
x = 0.0;
y = *dataPtr * graphScaleY;
move2(x,y);
dataPtr += increment;
// Draw to the rest
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX ;
y = *dataPtr * graphScaleY;
draw2(x,y);
dataPtr += increment;
if (dataPtr > netgraph->getHistoryEnd())
break;
}
} else { // not history
// Move to the first (oldest) point
dataStruct* pnt = strip->getCurrentData();
x = 0.0;
y = pnt->avg * graphScaleY;
move2(x,y);
pnt = pnt->next;
// Draw to the rest
for (i = 1; i < numberOfPoints; i++) {
x = i * graphScaleX;
y = pnt->avg * graphScaleY;
draw2(x,y);
pnt = pnt->next;
}
} // not history
} // if need to do average
} // if numberOfPoints > 0
popviewport();
popmatrix();
swapbuffers();
// printf("about to call gflush\n");
// gflush();
// printf(" done.\n");
} // render
void
GraphGadget::setScaleType(tuBool type) {
scaleType = type;
if (type == SCALE_CONSTANT) {
dataBounds->setHeight(100);
strip->setScale("100.0");
}
rescale();
}
void
GraphGadget::setDataHeight(float newHeight) {
dataBounds->setHeight(newHeight);
// *dataBounds = *bounds;
}