display.c, cleanup
This commit is contained in:
parent
f1d0d40753
commit
7126dd6f1d
|
|
@ -7,8 +7,8 @@ Copyright 1990 Regents of the University of California. All rights reserved.
|
|||
#include "ngspice/graph.h"
|
||||
#include "ngspice/ftedev.h"
|
||||
#include "ngspice/fteinput.h"
|
||||
#include "ngspice/cpdefs.h" /* for CP_STRING */
|
||||
#include "ngspice/ftedefs.h" /* for mylog() */
|
||||
#include "ngspice/cpdefs.h"
|
||||
#include "ngspice/ftedefs.h"
|
||||
|
||||
#ifdef TCL_MODULE
|
||||
#include "ngspice/tclspice.h"
|
||||
|
|
@ -17,17 +17,18 @@ Copyright 1990 Regents of the University of California. All rights reserved.
|
|||
#include "display.h"
|
||||
#include "variable.h"
|
||||
|
||||
/* static declarations */
|
||||
|
||||
static void gen_DatatoScreen(GRAPH *graph, double x, double y, int *screenx, int *screeny);
|
||||
static int gen_Input(REQUEST *request, RESPONSE *response);
|
||||
static int nop(void);
|
||||
static int nodev(void);
|
||||
|
||||
|
||||
#ifndef X_DISPLAY_MISSING
|
||||
#include "plotting/x11.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAS_WINDOWS /* Graphic-IO under MS Windows */
|
||||
#ifdef HAS_WINDOWS /* Graphic-IO under MS Windows */
|
||||
#include "wdisp/windisp.h"
|
||||
//#include "wdisp/winprint.h"
|
||||
#endif
|
||||
|
|
@ -39,330 +40,345 @@ static int nodev(void);
|
|||
|
||||
DISPDEVICE device[] = {
|
||||
|
||||
{"error", 0, 0, 0, 0, 0, 0, (disp_fn_Init_t *) nop, (disp_fn_NewViewport_t *) nop,
|
||||
(disp_fn_Close_t *) nop, (disp_fn_Clear_t *) nop,
|
||||
(disp_fn_DrawLine_t *) nop, (disp_fn_Arc_t *) nop, (disp_fn_Text_t *) nop, (disp_fn_DefineColor_t *) nop, (disp_fn_DefineLinestyle_t *) nop,
|
||||
(disp_fn_SetLinestyle_t *) nop, (disp_fn_SetColor_t *) nop, (disp_fn_Update_t *) nop,
|
||||
(disp_fn_Track_t *) nop, (disp_fn_MakeMenu_t *) nop, (disp_fn_MakeDialog_t *) nop, gen_Input,
|
||||
(disp_fn_DatatoScreen_t *) nop,},
|
||||
{ "error", 0, 0, 0, 0, 0, 0,
|
||||
(disp_fn_Init_t *) nop, (disp_fn_NewViewport_t *) nop,
|
||||
(disp_fn_Close_t *) nop, (disp_fn_Clear_t *) nop,
|
||||
(disp_fn_DrawLine_t *) nop, (disp_fn_Arc_t *) nop, (disp_fn_Text_t *) nop,
|
||||
(disp_fn_DefineColor_t *) nop, (disp_fn_DefineLinestyle_t *) nop,
|
||||
(disp_fn_SetLinestyle_t *) nop, (disp_fn_SetColor_t *) nop, (disp_fn_Update_t *) nop,
|
||||
(disp_fn_Track_t *) nop, (disp_fn_MakeMenu_t *) nop, (disp_fn_MakeDialog_t *) nop, gen_Input,
|
||||
(disp_fn_DatatoScreen_t *) nop,},
|
||||
|
||||
#ifndef X_DISPLAY_MISSING
|
||||
{"X11", 0, 0, 1024, 864, 0, 0, X11_Init, X11_NewViewport,
|
||||
X11_Close, X11_Clear,
|
||||
X11_DrawLine, X11_Arc, X11_Text, X11_DefineColor, X11_DefineLinestyle,
|
||||
X11_SetLinestyle, X11_SetColor, X11_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, X11_Input,
|
||||
gen_DatatoScreen,},
|
||||
{ "X11", 0, 0, 1024, 864, 0, 0,
|
||||
X11_Init, X11_NewViewport,
|
||||
X11_Close, X11_Clear,
|
||||
X11_DrawLine, X11_Arc, X11_Text,
|
||||
X11_DefineColor, X11_DefineLinestyle,
|
||||
X11_SetLinestyle, X11_SetColor, X11_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, X11_Input,
|
||||
gen_DatatoScreen,},
|
||||
#endif
|
||||
|
||||
#ifdef HAS_WINDOWS /* Graphic-IO under MS Windows */
|
||||
{"Windows", 0, 0, 1000, 1000, 0, 0, WIN_Init, WIN_NewViewport,
|
||||
WIN_Close, WIN_Clear,
|
||||
WIN_DrawLine, WIN_Arc, WIN_Text, WIN_DefineColor, WIN_DefineLinestyle,
|
||||
WIN_SetLinestyle, WIN_SetColor, WIN_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, gen_Input,
|
||||
gen_DatatoScreen,}, /* WIN_DiagramReady */
|
||||
#ifdef HAS_WINDOWS /* Graphic-IO under MS Windows */
|
||||
{ "Windows", 0, 0, 1000, 1000, 0, 0,
|
||||
WIN_Init, WIN_NewViewport,
|
||||
WIN_Close, WIN_Clear,
|
||||
WIN_DrawLine, WIN_Arc, WIN_Text,
|
||||
WIN_DefineColor, WIN_DefineLinestyle,
|
||||
WIN_SetLinestyle, WIN_SetColor, WIN_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, gen_Input,
|
||||
gen_DatatoScreen, }, /* WIN_DiagramReady */
|
||||
|
||||
/* Warning: name "WinPrint" do not change! */
|
||||
{"WinPrint", 0, 0, 1000, 1000, 0, 0, WPRINT_Init, WPRINT_NewViewport,
|
||||
WPRINT_Close, WPRINT_Clear,
|
||||
WPRINT_DrawLine, WPRINT_Arc, WPRINT_Text, WPRINT_DefineColor, WPRINT_DefineLinestyle,
|
||||
WPRINT_SetLinestyle, WPRINT_SetColor, WPRINT_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen,}, /* WPRINT_DiagramReady */
|
||||
{ "WinPrint", 0, 0, 1000, 1000, 0, 0,
|
||||
WPRINT_Init, WPRINT_NewViewport,
|
||||
WPRINT_Close, WPRINT_Clear,
|
||||
WPRINT_DrawLine, WPRINT_Arc, WPRINT_Text,
|
||||
WPRINT_DefineColor, WPRINT_DefineLinestyle,
|
||||
WPRINT_SetLinestyle, WPRINT_SetColor, WPRINT_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen, }, /* WPRINT_DiagramReady */
|
||||
#endif
|
||||
|
||||
#ifdef TCL_MODULE
|
||||
{"Tk", 0, 0, 1024, 864, 0, 0, sp_Tk_Init, sp_Tk_NewViewport,
|
||||
sp_Tk_Close, sp_Tk_Clear,
|
||||
sp_Tk_DrawLine, sp_Tk_Arc, sp_Tk_Text, sp_Tk_DefineColor, sp_Tk_DefineLinestyle,
|
||||
sp_Tk_SetLinestyle, sp_Tk_SetColor, sp_Tk_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen,},
|
||||
{ "Tk", 0, 0, 1024, 864, 0, 0,
|
||||
sp_Tk_Init, sp_Tk_NewViewport,
|
||||
sp_Tk_Close, sp_Tk_Clear,
|
||||
sp_Tk_DrawLine, sp_Tk_Arc, sp_Tk_Text,
|
||||
sp_Tk_DefineColor, sp_Tk_DefineLinestyle,
|
||||
sp_Tk_SetLinestyle, sp_Tk_SetColor, sp_Tk_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen, },
|
||||
#endif
|
||||
|
||||
{"plot5", 0, 0, 1000, 1000, 0, 0, Plt5_Init, Plt5_NewViewport,
|
||||
Plt5_Close, Plt5_Clear,
|
||||
Plt5_DrawLine, Plt5_Arc, Plt5_Text, (disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
Plt5_SetLinestyle, Plt5_SetColor, Plt5_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen,},
|
||||
{ "plot5", 0, 0, 1000, 1000, 0, 0,
|
||||
Plt5_Init, Plt5_NewViewport,
|
||||
Plt5_Close, Plt5_Clear,
|
||||
Plt5_DrawLine, Plt5_Arc, Plt5_Text,
|
||||
(disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
Plt5_SetLinestyle, Plt5_SetColor, Plt5_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen, },
|
||||
|
||||
{"postscript", 0, 0, 1000, 1000, 0, 0, PS_Init, PS_NewViewport,
|
||||
PS_Close, PS_Clear,
|
||||
PS_DrawLine, PS_Arc, PS_Text, (disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
PS_SetLinestyle, PS_SetColor, PS_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen,},
|
||||
{ "postscript", 0, 0, 1000, 1000, 0, 0,
|
||||
PS_Init, PS_NewViewport,
|
||||
PS_Close, PS_Clear,
|
||||
PS_DrawLine, PS_Arc, PS_Text,
|
||||
(disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
PS_SetLinestyle, PS_SetColor, PS_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen, },
|
||||
|
||||
{"hpgl", 0, 0, 1000, 1000, 0, 0, GL_Init, GL_NewViewport,
|
||||
GL_Close, GL_Clear,
|
||||
GL_DrawLine, GL_Arc, GL_Text, (disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
GL_SetLinestyle, GL_SetColor, GL_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen,},
|
||||
{ "hpgl", 0, 0, 1000, 1000, 0, 0,
|
||||
GL_Init, GL_NewViewport,
|
||||
GL_Close, GL_Clear,
|
||||
GL_DrawLine, GL_Arc, GL_Text,
|
||||
(disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
GL_SetLinestyle, GL_SetColor, GL_Update,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, (disp_fn_Input_t *) nodev,
|
||||
gen_DatatoScreen, },
|
||||
|
||||
{"printf", 0, 0, 24, 80, 0, 0, (disp_fn_Init_t *) nodev, (disp_fn_NewViewport_t *) nodev,
|
||||
(disp_fn_Close_t *) nodev, (disp_fn_Clear_t *) nodev,
|
||||
(disp_fn_DrawLine_t *) nodev, (disp_fn_Arc_t *) nodev, (disp_fn_Text_t *) nodev, (disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
(disp_fn_SetLinestyle_t *) nodev, (disp_fn_SetColor_t *) nodev, (disp_fn_Update_t *) nodev,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, gen_Input,
|
||||
(disp_fn_DatatoScreen_t *) nodev,},
|
||||
{ "printf", 0, 0, 24, 80, 0, 0,
|
||||
(disp_fn_Init_t *) nodev, (disp_fn_NewViewport_t *) nodev,
|
||||
(disp_fn_Close_t *) nodev, (disp_fn_Clear_t *) nodev,
|
||||
(disp_fn_DrawLine_t *) nodev, (disp_fn_Arc_t *) nodev, (disp_fn_Text_t *) nodev,
|
||||
(disp_fn_DefineColor_t *) nodev, (disp_fn_DefineLinestyle_t *) nodev,
|
||||
(disp_fn_SetLinestyle_t *) nodev, (disp_fn_SetColor_t *) nodev, (disp_fn_Update_t *) nodev,
|
||||
(disp_fn_Track_t *) nodev, (disp_fn_MakeMenu_t *) nodev, (disp_fn_MakeDialog_t *) nodev, gen_Input,
|
||||
(disp_fn_DatatoScreen_t *) nodev, },
|
||||
|
||||
};
|
||||
|
||||
|
||||
DISPDEVICE *dispdev = device + NUMELEMS(device) - 1;
|
||||
|
||||
#ifndef XtNumber
|
||||
#define XtNumber(arr) (sizeof(arr) / sizeof(arr[0]))
|
||||
#endif
|
||||
|
||||
DISPDEVICE *FindDev(char *name)
|
||||
DISPDEVICE *
|
||||
FindDev(char *name)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i=0; i < NUMELEMS(device); i++)
|
||||
if (strcmp(name, device[i].name) == 0)
|
||||
return(device + i);
|
||||
|
||||
for (i=0; (size_t) i < XtNumber(device); i++) {
|
||||
if (!strcmp(name, device[i].name)) {
|
||||
return(&device[i]);
|
||||
}
|
||||
}
|
||||
sprintf(ErrorMessage, "Can't find device %s.", name);
|
||||
internalerror(ErrorMessage);
|
||||
return(&device[0]);
|
||||
|
||||
return(device + 0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DevInit(void)
|
||||
{
|
||||
|
||||
#ifndef X_DISPLAY_MISSING
|
||||
char buf[128]; /* va: used with NOT X_DISPLAY_MISSING only */
|
||||
#endif /* X_DISPLAY_MISSING */
|
||||
char buf[128];
|
||||
#endif
|
||||
|
||||
/* note: do better determination */
|
||||
/* note: do better determination */
|
||||
|
||||
/*
|
||||
dumb tradition that got passed on from gi_interface
|
||||
to do compile time determination
|
||||
*/
|
||||
/*
|
||||
dumb tradition that got passed on from gi_interface
|
||||
to do compile time determination
|
||||
*/
|
||||
|
||||
dispdev = NULL;
|
||||
|
||||
#ifndef X_DISPLAY_MISSING
|
||||
/* determine display type */
|
||||
if (getenv("DISPLAY") || cp_getvar("display", CP_STRING, buf)) {
|
||||
dispdev = FindDev("X11");
|
||||
}
|
||||
if (getenv("DISPLAY") || cp_getvar("display", CP_STRING, buf))
|
||||
dispdev = FindDev("X11");
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAS_WINDOWS
|
||||
if (!dispdev) {
|
||||
dispdev = FindDev("Windows");
|
||||
}
|
||||
if (!dispdev)
|
||||
dispdev = FindDev("Windows");
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef TCL_MODULE
|
||||
dispdev = FindDev("Tk");
|
||||
#endif
|
||||
|
||||
|
||||
if (!dispdev) {
|
||||
/* console application under MS Windows */
|
||||
|
||||
#if !defined(HAS_WINDOWS) && !defined(TCL_MODULE) && (defined(_MSC_VER) || defined(__MINGW32__))
|
||||
fprintf(cp_err, "Warning: no graphics interface!\n You may use command 'gnuplot'\n if GnuPlot is installed.\n");
|
||||
/* console application under MS Windows */
|
||||
fprintf
|
||||
( cp_err,
|
||||
"Warning: no graphics interface!\n"
|
||||
" You may use command 'gnuplot'\n"
|
||||
" if GnuPlot is installed.\n" );
|
||||
#elif !defined(X_DISPLAY_MISSING)
|
||||
externalerror(
|
||||
"no graphics interface;\n please check if X-server is running,\n or ngspice is compiled properly (see INSTALL)");
|
||||
externalerror
|
||||
( "no graphics interface;\n"
|
||||
" please check if X-server is running,\n"
|
||||
" or ngspice is compiled properly (see INSTALL)" );
|
||||
#endif
|
||||
|
||||
dispdev = FindDev("error");
|
||||
|
||||
} else if (dispdev->Init()) {
|
||||
fprintf(cp_err,
|
||||
"Warning: can't initialize display device for graphics.\n");
|
||||
fprintf(cp_err, "Warning: can't initialize display device for graphics.\n");
|
||||
dispdev = FindDev("error");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* NewViewport is responsible for filling in graph->viewport */
|
||||
int
|
||||
NewViewport(GRAPH *pgraph)
|
||||
{
|
||||
|
||||
return dispdev->NewViewport (pgraph);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevClose(void)
|
||||
{
|
||||
|
||||
dispdev->Close();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevClear(void)
|
||||
{
|
||||
|
||||
dispdev->Clear();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevDrawLine(int x1, int y1, int x2, int y2)
|
||||
{
|
||||
dispdev->DrawLine (x1, y1, x2, y2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevDrawArc(int x0, int y0, int radius, double theta, double delta_theta)
|
||||
{
|
||||
|
||||
dispdev->DrawArc (x0, y0, radius, theta, delta_theta);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevDrawText(char *text, int x, int y)
|
||||
{
|
||||
|
||||
dispdev->DrawText (text, x, y);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DefineColor(int colorid, double red, double green, double blue)
|
||||
{
|
||||
|
||||
dispdev->DefineColor (colorid, red, green, blue);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DefineLinestyle(int linestyleid, int mask)
|
||||
{
|
||||
|
||||
dispdev->DefineLinestyle (linestyleid, mask);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SetLinestyle(int linestyleid)
|
||||
{
|
||||
|
||||
dispdev->SetLinestyle (linestyleid);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SetColor(int colorid)
|
||||
{
|
||||
|
||||
dispdev->SetColor (colorid);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DevUpdate(void)
|
||||
{
|
||||
|
||||
if (dispdev)
|
||||
dispdev->Update();
|
||||
|
||||
dispdev->Update();
|
||||
}
|
||||
|
||||
|
||||
/* note: screen coordinates are relative to window
|
||||
so need to add viewport offsets */
|
||||
so need to add viewport offsets */
|
||||
static void
|
||||
gen_DatatoScreen(GRAPH *graph, double x, double y, int *screenx, int *screeny)
|
||||
{
|
||||
|
||||
double low, high;
|
||||
|
||||
/* note: may want to cache datawindowsize/viewportsize */ /* done */
|
||||
|
||||
/* note: think this out---Is 1 part of the viewport? Do we handle
|
||||
this correctly? */
|
||||
this correctly? */
|
||||
|
||||
/* have to handle several types of grids */
|
||||
|
||||
/* note: we can't compensate for X's demented y-coordinate system here
|
||||
since the grid routines use DevDrawLine w/o calling this routine */
|
||||
since the grid routines use DevDrawLine w/o calling this routine */
|
||||
|
||||
if ((graph->grid.gridtype == GRID_LOGLOG) ||
|
||||
(graph->grid.gridtype == GRID_YLOG)) {
|
||||
low = mylog10(graph->datawindow.ymin);
|
||||
high = mylog10(graph->datawindow.ymax);
|
||||
*screeny = (int)((mylog10(y) - low) / (high - low) * graph->viewport.height
|
||||
+ 0.5 + graph->viewportyoff);
|
||||
(graph->grid.gridtype == GRID_YLOG))
|
||||
{
|
||||
low = mylog10(graph->datawindow.ymin);
|
||||
high = mylog10(graph->datawindow.ymax);
|
||||
*screeny = (int)((mylog10(y) - low) / (high - low) * graph->viewport.height
|
||||
+ 0.5 + graph->viewportyoff);
|
||||
} else {
|
||||
*screeny = (int)(((y - graph->datawindow.ymin) / graph->aspectratioy)
|
||||
+ 0.5 + graph->viewportyoff);
|
||||
*screeny = (int)(((y - graph->datawindow.ymin) / graph->aspectratioy)
|
||||
+ 0.5 + graph->viewportyoff);
|
||||
}
|
||||
|
||||
if ((graph->grid.gridtype == GRID_LOGLOG) ||
|
||||
(graph->grid.gridtype == GRID_XLOG)) {
|
||||
low = mylog10(graph->datawindow.xmin);
|
||||
high = mylog10(graph->datawindow.xmax);
|
||||
*screenx = (int)((mylog10(x) - low) / (high - low) * graph->viewport.width
|
||||
+ 0.5 + graph ->viewportxoff);
|
||||
(graph->grid.gridtype == GRID_XLOG))
|
||||
{
|
||||
low = mylog10(graph->datawindow.xmin);
|
||||
high = mylog10(graph->datawindow.xmax);
|
||||
*screenx = (int)((mylog10(x) - low) / (high - low) * graph->viewport.width
|
||||
+ 0.5 + graph ->viewportxoff);
|
||||
} else {
|
||||
*screenx = (int)((x - graph->datawindow.xmin) / graph->aspectratiox
|
||||
+ 0.5 + graph ->viewportxoff);
|
||||
*screenx = (int)((x - graph->datawindow.xmin) / graph->aspectratiox
|
||||
+ 0.5 + graph ->viewportxoff);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DatatoScreen(GRAPH *graph, double x, double y, int *screenx, int *screeny)
|
||||
{
|
||||
|
||||
dispdev->DatatoScreen (graph, x, y, screenx, screeny);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Input(REQUEST *request, RESPONSE *response)
|
||||
{
|
||||
|
||||
dispdev->Input (request, response);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
gen_Input(REQUEST *request, RESPONSE *response)
|
||||
{
|
||||
|
||||
switch (request->option) {
|
||||
case char_option:
|
||||
if (response)
|
||||
response->option = request->option;
|
||||
case char_option:
|
||||
if (response)
|
||||
response->option = request->option;
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
/* just ignore, since we don't want a million error messages */
|
||||
if (response)
|
||||
response->option = error_option;
|
||||
if (response)
|
||||
response->option = error_option;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* no operation, do nothing */
|
||||
static int nop(void)
|
||||
{
|
||||
return(1); /* so NewViewport will fail */
|
||||
}
|
||||
|
||||
|
||||
static int nodev(void)
|
||||
{
|
||||
|
||||
sprintf(ErrorMessage,
|
||||
"This operation is not defined for display type %s.",
|
||||
dispdev->name);
|
||||
"This operation is not defined for display type %s.",
|
||||
dispdev->name);
|
||||
internalerror(ErrorMessage);
|
||||
return(1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SaveText(GRAPH *graph, char *text, int x, int y)
|
||||
{
|
||||
|
||||
struct _keyed *keyed;
|
||||
|
||||
keyed = TMALLOC(struct _keyed, 1);
|
||||
struct _keyed *keyed = TMALLOC(struct _keyed, 1);
|
||||
|
||||
if (!graph->keyed) {
|
||||
graph->keyed = keyed;
|
||||
graph->keyed = keyed;
|
||||
} else {
|
||||
keyed->next = graph->keyed;
|
||||
graph->keyed = keyed;
|
||||
keyed->next = graph->keyed;
|
||||
graph->keyed = keyed;
|
||||
}
|
||||
|
||||
keyed->text = TMALLOC(char, strlen(text) + 1);
|
||||
|
|
@ -372,35 +388,42 @@ void SaveText(GRAPH *graph, char *text, int x, int y)
|
|||
keyed->y = y;
|
||||
|
||||
keyed->colorindex = graph->currentcolor;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* if given name of a hardcopy device, finds it and switches devices
|
||||
if given NULL, switches back */
|
||||
int DevSwitch(char *devname)
|
||||
{
|
||||
|
||||
static DISPDEVICE *lastdev = NULL;
|
||||
|
||||
if (devname != NULL) {
|
||||
if (lastdev != NULL) {
|
||||
internalerror("DevSwitch w/o changing back");
|
||||
return (1);
|
||||
}
|
||||
lastdev = dispdev;
|
||||
dispdev = FindDev(devname);
|
||||
if (!strcmp(dispdev->name, "error")) {
|
||||
internalerror("no hardcopy device");
|
||||
dispdev = lastdev; /* undo */
|
||||
lastdev = NULL;
|
||||
return (1);
|
||||
}
|
||||
dispdev->Init();
|
||||
} else {
|
||||
dispdev->Close();
|
||||
dispdev = lastdev;
|
||||
lastdev = NULL;
|
||||
}
|
||||
return(0);
|
||||
if (devname) {
|
||||
|
||||
if (lastdev) {
|
||||
internalerror("DevSwitch w/o changing back");
|
||||
return (1);
|
||||
}
|
||||
|
||||
lastdev = dispdev;
|
||||
dispdev = FindDev(devname);
|
||||
|
||||
if (!strcmp(dispdev->name, "error")) {
|
||||
internalerror("no hardcopy device");
|
||||
/* undo */
|
||||
dispdev = lastdev;
|
||||
lastdev = NULL;
|
||||
return (1);
|
||||
}
|
||||
|
||||
dispdev->Init();
|
||||
|
||||
} else {
|
||||
|
||||
dispdev->Close();
|
||||
dispdev = lastdev;
|
||||
lastdev = NULL;
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue