⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.**********/#include "spice.h"#include "ftegraph.h"#include "ftedev.h"#include "fteinput.h"#include "cpdefs.h"     /* for VT_STRING */#include "ftedefs.h"        /* for mylog() *//* forward declarations */static int nodev(), nop(), gen_DatatoScreen(), gen_Input();#ifdef HAS_X10extern int  X_Init(), X_NewViewport(), X_Close(), X_Clear(),        X_DrawLine(), X_Arc(), X_Text(), X_DefineColor(),        X_DefineLinestyle(), X_SetLinestyle(), X_SetColor(),        X_Update(),        X_Track(), X_MakeMenu(), X_MakeDialog(), X_Input();#endif#ifdef HAS_X11extern int  X11_Init(), X11_NewViewport(), X11_Close(), X11_Clear(),        X11_DrawLine(), X11_Arc(), X11_Text(), X11_DefineColor(),        X11_DefineLinestyle(), X11_SetLinestyle(), X11_SetColor(),        X11_Update(),        X11_Input();#endif#ifdef HAS_MFBextern int  Mfb_Init(), Mfb_NewViewport(), Mfb_Close(), Mfb_Clear(),        Mfb_DrawLine(), Mfb_Arc(), Mfb_Text(), Mfb_DefineColor(),        Mfb_DefineLinestyle(), Mfb_SetLinestyle(), Mfb_SetColor(),        Mfb_Update(),        Mfb_MakeMenu(), Mfb_MakeDialog();#endif#ifdef HAS_QUICKDRAWextern int  QDraw_Init(), QDraw_NewViewport(), QDraw_Clear(),        QDraw_DrawLine(), QDraw_Arc(), QDraw_Text(),        QDraw_SetLinestyle(), QDraw_SetColor(),        QDraw_Input(), QDraw_DatatoScreen();extern int apple_Init(), apple_NewViewport(), apple_Close(),        apple_Text(), apple_SetLinestyle();#endifextern int  Plt5_Init(), Plt5_NewViewport(), Plt5_Close(), Plt5_Clear(),        Plt5_DrawLine(), Plt5_Arc(), Plt5_Text(),        Plt5_DefineLinestyle(), Plt5_SetLinestyle(), Plt5_SetColor(),        Plt5_Update();extern int  PS_Init(), PS_NewViewport(), PS_Close(), PS_Clear(),        PS_DrawLine(), PS_Arc(), PS_Text(),        PS_DefineLinestyle(), PS_SetLinestyle(), PS_SetColor(),        PS_Update();DISPDEVICE device[] = {    {"error", 0, 0, 0, 0, 0, 0, nop, nop,    nop, nop,    nop, nop, nop, nop, nop,    nop, nop, nop,    nop, nop, nop, gen_Input,    nop,},#ifdef HAS_X11    {"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,    nodev, nodev, nodev, X11_Input,    gen_DatatoScreen,},#endif#ifdef HAS_X10    {"X", 0, 0, 1024, 864, 0, 0, X_Init, X_NewViewport,    X_Close, X_Clear,    X_DrawLine, X_Arc, X_Text, X_DefineColor, X_DefineLinestyle,    X_SetLinestyle, X_SetColor, X_Update,    X_Track, X_MakeMenu, X_MakeDialog, X_Input,    gen_DatatoScreen,},#endif#ifdef HAS_MFB    {"MFB", 0, 0, 1000, 1000, 0, 0, Mfb_Init, Mfb_NewViewport,    Mfb_Close, Mfb_Clear,    Mfb_DrawLine, Mfb_Arc, Mfb_Text, Mfb_DefineColor, Mfb_DefineLinestyle,    Mfb_SetLinestyle, Mfb_SetColor, Mfb_Update,    nodev, Mfb_MakeMenu, Mfb_MakeDialog, gen_Input,    gen_DatatoScreen,},#endif#ifdef HAS_QUICKDRAW    {"QuickDraw", 0, 0, 1000, 1000, 0, 0, QDraw_Init, QDraw_NewViewport,    nodev, QDraw_Clear,    QDraw_DrawLine, QDraw_Arc, QDraw_Text, nodev, nodev,    QDraw_SetLinestyle, nop, nop,    nodev, nodev, nodev, QDraw_Input,    QDraw_DatatoScreen,},        {"appleprinter", 0, 0, 1000, 1000, 0, 0, apple_Init, apple_NewViewport,    apple_Close, nop,    QDraw_DrawLine, QDraw_Arc, QDraw_Text, nodev, nodev,    apple_SetLinestyle, nop, nop,    nodev, nodev, nodev, 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, nodev, nodev,    Plt5_SetLinestyle, Plt5_SetColor, Plt5_Update,    nodev, nodev, nodev, nodev,    gen_DatatoScreen,},    {"postscript", 0, 0, 1000, 1000, 0, 0, PS_Init, PS_NewViewport,    PS_Close, PS_Clear,    PS_DrawLine, PS_Arc, PS_Text, nodev, nodev,    PS_SetLinestyle, PS_SetColor, PS_Update,    nodev, nodev, nodev, nodev,    gen_DatatoScreen,},    {"printf", 0, 0, 24, 80, 0, 0, nodev, nodev,    nodev, nodev,    nodev, nodev, nodev, nodev, nodev,    nodev, nodev, nodev,    nodev, nodev, nodev, gen_Input,    nodev,},};DISPDEVICE *dispdev = device + NUMELEMS(device) - 1;#define XtNumber(arr)       (sizeof(arr) / sizeof(arr[0]))DISPDEVICE *FindDev(name)char *name;{    int i;    for (i=0; 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]);}voidDevInit(){    char buf[128];/* note: do better determination *//*    dumb tradition that got passed on from gi_interface    to do compile time determination*/    dispdev = NULL;#ifdef HAS_X_    /* determine display type */    if (getenv("DISPLAY") || cp_getvar("display", VT_STRING, buf)) {#ifdef HAS_X10      dispdev = FindDev("X");#endif#ifdef HAS_X11      dispdev = FindDev("X11");#endif    }#endif#ifdef HAS_MFB    if (!dispdev) {      dispdev = FindDev("MFB");    }#endif#ifdef HAS_QUICKDRAW    if (!dispdev) {      dispdev = FindDev("QuickDraw");    }#endif    if (!dispdev) {	externalerror(	 "no graphics interface; please check compiling instructions");	dispdev = FindDev("error");    } else if ((*(dispdev->Init))()) {      fprintf(cp_err,        "Warning: can't initialize display device for graphics.\n");      dispdev = FindDev("error");    }}/* NewViewport is responsible for filling in graph->viewport */intNewViewport(pgraph)GRAPH *pgraph;{    return (*(dispdev->NewViewport))(pgraph);}DevClose(){    (*(dispdev->Close))();}DevClear(){    (*(dispdev->Clear))();}DrawLine(x1, y1, x2, y2)int x1, y1, x2, y2;{    (*(dispdev->DrawLine))(x1, y1, x2, y2);}Arc(x0, y0, radius, theta1, theta2)int x0, y0, radius;double theta1, theta2;{    (*(dispdev->Arc))(x0, y0, radius, theta1, theta2);}Text(text, x, y)char *text;int x, y;{    (*(dispdev->Text))(text, x, y);}DefineColor(colorid, red, green, blue)int colorid;double red, green, blue;{    (*(dispdev->DefineColor))(colorid, red, green, blue);}DefineLinestyle(linestyleid, mask)int linestyleid;int mask;{    (*(dispdev->DefineLinestyle))(linestyleid, mask);}SetLinestyle(linestyleid)int linestyleid;{    (*(dispdev->SetLinestyle))(linestyleid);}SetColor(colorid)int colorid;{    (*(dispdev->SetColor))(colorid);}Update(){    if (dispdev)	    (*(dispdev->Update))();}/* note: screen coordinates are relative to window    so need to add viewport offsets */staticgen_DatatoScreen(graph, x, y, screenx, screeny)    GRAPH *graph;    double x, y;    int *screenx, *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? */    /* 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 DrawLine 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 = (mylog10(y) - low) / (high - low) * graph->viewport.height	  + 0.5 + graph->viewportyoff;    } else {      *screeny = ((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 = (mylog10(x) - low) / (high - low) * graph->viewport.width            + 0.5 + graph ->viewportxoff;    } else {      *screenx = (x - graph->datawindow.xmin) / graph->aspectratiox            + 0.5 + graph ->viewportxoff;    }}DatatoScreen(graph, x, y, screenx, screeny)GRAPH *graph;double x, y;int *screenx, *screeny;{    (*(dispdev->DatatoScreen))(graph, x, y, screenx, screeny);}#ifdef notdef/*NDCtoScreen(x0, y0, px, py)    double x0, y0;    int *px, *py;{    (*(dispdev->NDCtoScreen))(x0, y0, px, py);}*/#endifInput(request, response)    REQUEST *request;    RESPONSE *response;{    (*(dispdev->Input))(request, response);}staticgen_Input(request, response)    REQUEST *request;    RESPONSE *response;{    switch (request->option) {      case char_option:        response->reply.ch = inchar(request->fp);        response->option = request->option;        break;      default:        /* just ignore, since we don't want a million error messages */	if (response)	    response->option = error_option;        break;    }    return 0;}/* no operation, do nothing */static int nop(){    return(1);  /* so NewViewport will fail */}static nodev(){    sprintf(ErrorMessage,        "This operation is not defined for display type %s.",        dispdev->name);    internalerror(ErrorMessage);    return(1);}SaveText(graph, text, x, y)GRAPH *graph;char *text;int x, y;{    struct _keyed *keyed;    keyed = (struct _keyed *) calloc(1, sizeof(struct _keyed));    if (!graph->keyed) {      graph->keyed = keyed;    } else {      keyed->next = graph->keyed;      graph->keyed = keyed;    }    keyed->text = tmalloc(strlen(text) + 1);    strcpy(keyed->text, text);    keyed->x = x;    keyed->y = y;    keyed->colorindex = graph->currentcolor;}/* if given name of a hardcopy device, finds it and switches devices   if given NULL, switches back */DevSwitch(devname)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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -