Actual source code: drawimpl.h

      1: /*
      2:        Abstract data structure and functions for graphics.
      3: */

      5: #pragma once

      7: #include <petsc/private/petscimpl.h>
      8: #include <petscdraw.h>

     10: PETSC_EXTERN PetscBool      PetscDrawRegisterAllCalled;
     11: PETSC_EXTERN PetscErrorCode PetscDrawRegisterAll(void);

     13: struct _PetscDrawOps {
     14:   PetscErrorCode (*setdoublebuffer)(PetscDraw);
     15:   PetscErrorCode (*flush)(PetscDraw);
     16:   PetscErrorCode (*line)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
     17:   PetscErrorCode (*linesetwidth)(PetscDraw, PetscReal);
     18:   PetscErrorCode (*linegetwidth)(PetscDraw, PetscReal *);
     19:   PetscErrorCode (*point)(PetscDraw, PetscReal, PetscReal, int);
     20:   PetscErrorCode (*pointsetsize)(PetscDraw, PetscReal);
     21:   PetscErrorCode (*string)(PetscDraw, PetscReal, PetscReal, int, const char[]);
     22:   PetscErrorCode (*stringvertical)(PetscDraw, PetscReal, PetscReal, int, const char[]);
     23:   PetscErrorCode (*stringsetsize)(PetscDraw, PetscReal, PetscReal);
     24:   PetscErrorCode (*stringgetsize)(PetscDraw, PetscReal *, PetscReal *);
     25:   PetscErrorCode (*setviewport)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal);
     26:   PetscErrorCode (*clear)(PetscDraw);
     27:   PetscErrorCode (*rectangle)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int, int, int, int);
     28:   PetscErrorCode (*triangle)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, int, int, int);
     29:   PetscErrorCode (*ellipse)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
     30:   PetscErrorCode (*getmousebutton)(PetscDraw, PetscDrawButton *, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
     31:   PetscErrorCode (*pause)(PetscDraw);
     32:   PetscErrorCode (*beginpage)(PetscDraw);
     33:   PetscErrorCode (*endpage)(PetscDraw);
     34:   PetscErrorCode (*getpopup)(PetscDraw, PetscDraw *);
     35:   PetscErrorCode (*settitle)(PetscDraw, const char[]);
     36:   PetscErrorCode (*checkresizedwindow)(PetscDraw);
     37:   PetscErrorCode (*resizewindow)(PetscDraw, int, int);
     38:   PetscErrorCode (*destroy)(PetscDraw);
     39:   PetscErrorCode (*view)(PetscDraw, PetscViewer);
     40:   PetscErrorCode (*getsingleton)(PetscDraw, PetscDraw *);
     41:   PetscErrorCode (*restoresingleton)(PetscDraw, PetscDraw *);
     42:   PetscErrorCode (*save)(PetscDraw);
     43:   PetscErrorCode (*getimage)(PetscDraw, unsigned char[][3], unsigned int *, unsigned int *, unsigned char *[]);
     44:   PetscErrorCode (*setcoordinates)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal);
     45:   PetscErrorCode (*arrow)(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
     46:   PetscErrorCode (*coordinatetopixel)(PetscDraw, PetscReal, PetscReal, int *, int *);
     47:   PetscErrorCode (*pixeltocoordinate)(PetscDraw, int, int, PetscReal *, PetscReal *);
     48:   PetscErrorCode (*pointpixel)(PetscDraw, int, int, int);
     49:   PetscErrorCode (*boxedstring)(PetscDraw, PetscReal, PetscReal, int, int, const char[], PetscReal *, PetscReal *);
     50:   PetscErrorCode (*setvisible)(PetscDraw, PetscBool);
     51: };

     53: struct _p_PetscDraw {
     54:   PETSCHEADER(struct _PetscDrawOps);
     55:   PetscReal           pause; /* sleep time after a synchronized flush */
     56:   PetscReal           port_xl, port_yl, port_xr, port_yr;
     57:   PetscReal           coor_xl, coor_yl, coor_xr, coor_yr;
     58:   PetscReal           currentpoint_x[20], currentpoint_y[20];
     59:   PetscReal           boundbox_xl, boundbox_yl, boundbox_xr, boundbox_yr; /* need to have this for each current point? */
     60:   PetscInt            currentpoint;
     61:   PetscDrawMarkerType markertype;
     62:   char               *title;
     63:   char               *display;
     64:   PetscDraw           popup;
     65:   int                 x, y, h, w;
     66:   char               *savefilename;
     67:   char               *saveimageext;
     68:   char               *savemovieext;
     69:   PetscInt            savefilecount;
     70:   PetscBool           savesinglefile;
     71:   PetscInt            savemoviefps;
     72:   char               *savefinalfilename;
     73:   PetscBool           saveonclear; /* save a new image for every PetscDrawClear() called */
     74:   PetscBool           saveonflush; /* save a new image for every PetscDrawFlush() called */
     75:   void               *data;
     76: };

     78: /* Contains the data structure for plotting several line
     79:  * graphs in a window with an axis. This is intended for line
     80:  * graphs that change dynamically by adding more points onto
     81:  * the end of the X axis.
     82:  */
     83: struct _p_PetscDrawLG {
     84:   PETSCHEADER(int);
     85:   PetscErrorCode (*destroy)(PetscDrawLG);
     86:   PetscErrorCode (*view)(PetscDrawLG, PetscViewer);
     87:   int           len, loc;
     88:   PetscDraw     win;
     89:   PetscDrawAxis axis;
     90:   PetscReal     xmin, xmax, ymin, ymax, *x, *y;
     91:   int           nopts, dim, *colors;
     92:   PetscBool     use_markers;
     93:   char        **legend;
     94: };
     95: #define PETSC_DRAW_LG_CHUNK_SIZE 100

     97: struct _p_PetscDrawAxis {
     98:   PETSCHEADER(int);
     99:   PetscReal xlow, ylow, xhigh, yhigh;                         /* User - coord limits */
    100:   PetscErrorCode (*ylabelstr)(PetscReal, PetscReal, char **); /* routines to generate labels */
    101:   PetscErrorCode (*xlabelstr)(PetscReal, PetscReal, char **);
    102:   PetscErrorCode (*xticks)(PetscReal, PetscReal, int, int *, PetscReal *, int);
    103:   PetscErrorCode (*yticks)(PetscReal, PetscReal, int, int *, PetscReal *, int);
    104:   /* location and size of ticks */
    105:   PetscDraw win;
    106:   int       ac, tc, cc; /* axis,tick, character color */
    107:   char     *xlabel, *ylabel, *toplabel;
    108:   PetscBool hold;
    109: };

    111: PETSC_INTERN PetscErrorCode PetscADefTicks(PetscReal, PetscReal, int, int *, PetscReal *, int);
    112: PETSC_INTERN PetscErrorCode PetscADefLabel(PetscReal, PetscReal, char **);
    113: PETSC_INTERN PetscErrorCode PetscAGetNice(PetscReal, PetscReal, int, PetscReal *);
    114: PETSC_INTERN PetscErrorCode PetscAGetBase(PetscReal, PetscReal, int, PetscReal *, int *);

    116: PETSC_INTERN PetscErrorCode PetscStripe0(char *);
    117: PETSC_INTERN PetscErrorCode PetscStripAllZeros(char *);
    118: PETSC_INTERN PetscErrorCode PetscStripTrailingZeros(char *);
    119: PETSC_INTERN PetscErrorCode PetscStripInitialZero(char *);
    120: PETSC_INTERN PetscErrorCode PetscStripZeros(char *);
    121: PETSC_INTERN PetscErrorCode PetscStripZerosPlus(char *);

    123: struct _p_PetscDrawBar {
    124:   PETSCHEADER(int);
    125:   PetscErrorCode (*destroy)(PetscDrawSP);
    126:   PetscErrorCode (*view)(PetscDrawSP, PetscViewer);
    127:   PetscDraw     win;
    128:   PetscDrawAxis axis;
    129:   PetscReal     ymin, ymax;
    130:   int           numBins;
    131:   PetscReal    *values;
    132:   int           color;
    133:   char        **labels;
    134:   PetscBool     sort;
    135:   PetscReal     sorttolerance;
    136: };

    138: struct _p_PetscDrawSP {
    139:   PETSCHEADER(int);
    140:   PetscErrorCode (*destroy)(PetscDrawSP);
    141:   PetscErrorCode (*view)(PetscDrawSP, PetscViewer);
    142:   int           len, loc;
    143:   PetscDraw     win;
    144:   PetscDrawAxis axis;
    145:   PetscReal     xmin, xmax, ymin, ymax, *x, *y;
    146:   PetscReal     zmax, zmin, *z;
    147:   int           nopts, dim;
    148:   PetscBool     colorized;
    149: };
    150: #define PETSC_DRAW_SP_CHUNK_SIZE 100