Actual source code: petscdraw.h

  1: /*
  2:   Interface to the PETSc graphics
  3: */
  4: #pragma once
  5: #include <petscdrawtypes.h>
  6: #include <petscviewertypes.h>
  7: #include <petscmath.h>

  9: /* MANSEC = Sys */
 10: /* SUBMANSEC = Draw */

 12: PETSC_EXTERN PetscClassId PETSC_DRAW_CLASSID;

 14: PETSC_EXTERN PetscFunctionList PetscDrawList;
 15: PETSC_EXTERN PetscErrorCode    PetscDrawInitializePackage(void);
 16: PETSC_EXTERN PetscErrorCode    PetscDrawFinalizePackage(void);
 17: PETSC_EXTERN PetscErrorCode    PetscDrawRegister(const char[], PetscErrorCode (*)(PetscDraw));

 19: PETSC_EXTERN PetscErrorCode PetscDrawGetType(PetscDraw, PetscDrawType *);
 20: PETSC_EXTERN PetscErrorCode PetscDrawSetType(PetscDraw, PetscDrawType);
 21: PETSC_EXTERN PetscErrorCode PetscDrawCreate(MPI_Comm, const char[], const char[], int, int, int, int, PetscDraw *);
 22: PETSC_EXTERN PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw, const char[]);
 23: PETSC_EXTERN PetscErrorCode PetscDrawSetFromOptions(PetscDraw);
 24: PETSC_EXTERN PetscErrorCode PetscDrawSetSave(PetscDraw, const char[]);
 25: PETSC_EXTERN PetscErrorCode PetscDrawSetSaveMovie(PetscDraw, const char[]);
 26: PETSC_EXTERN PetscErrorCode PetscDrawSetSaveFinalImage(PetscDraw, const char[]);
 27: PETSC_EXTERN PetscErrorCode PetscDrawView(PetscDraw, PetscViewer);
 28: PETSC_EXTERN PetscErrorCode PetscDrawViewFromOptions(PetscDraw, PetscObject, const char[]);

 30: /*MC
 31:   PetscDrawRealToColor - Maps a real value within an interval to a color.
 32:   The color is an integer value in the range [`PETSC_DRAW_BASIC_COLORS` to 255]
 33:   that can be passed to various drawing routines.

 35:   Synopsis:
 36: #include <petscdraw.h>
 37:   int PetscDrawRealToColor(PetscReal value, PetscReal min, PetscReal max)

 39:   Not Collective

 41:   Input Parameters:
 42: + value - value to map within the interval [`min`, `max`]
 43: . min   - lower end of interval
 44: - max   - upper end of interval

 46:   Returns:
 47:   The result as integer

 49:   Level: intermediate

 51:   Note:
 52:   Values outside the interval [`min`, `max`] are clipped.

 54: .seealso: `PetscDraw`, `PetscDrawPointPixel()`, `PetscDrawPoint()`, `PetscDrawLine()`, `PetscDrawTriangle()`, `PetscDrawRectangle()`
 55: M*/
 56: static inline int PetscDrawRealToColor(PetscReal value, PetscReal min, PetscReal max)
 57: {
 58:   value = PetscClipInterval(value, min, max);
 59:   return PETSC_DRAW_BASIC_COLORS + (int)((255 - PETSC_DRAW_BASIC_COLORS) * (value - min) / (max - min));
 60: }

 62: PETSC_EXTERN PetscErrorCode PetscDrawOpenX(MPI_Comm, const char[], const char[], int, int, int, int, PetscDraw *);

 64: PETSC_EXTERN PetscErrorCode PetscDrawOpenImage(MPI_Comm, const char[], int, int, PetscDraw *);
 65: PETSC_EXTERN PetscErrorCode PetscDrawOpenNull(MPI_Comm, PetscDraw *);
 66: PETSC_EXTERN PetscErrorCode PetscDrawDestroy(PetscDraw *);
 67: PETSC_EXTERN PetscErrorCode PetscDrawIsNull(PetscDraw, PetscBool *);

 69: PETSC_EXTERN PetscErrorCode PetscDrawGetPopup(PetscDraw, PetscDraw *);
 70: PETSC_EXTERN PetscErrorCode PetscDrawScalePopup(PetscDraw, PetscReal, PetscReal);

 72: PETSC_EXTERN PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw);
 73: PETSC_EXTERN PetscErrorCode PetscDrawResizeWindow(PetscDraw, int, int);
 74: PETSC_EXTERN PetscErrorCode PetscDrawGetWindowSize(PetscDraw, int *, int *);
 75: PETSC_EXTERN PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw, int, int, PetscReal *, PetscReal *);
 76: PETSC_EXTERN PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw, PetscReal, PetscReal, int *, int *);

 78: PETSC_EXTERN PetscErrorCode PetscDrawIndicatorFunction(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int, PetscErrorCode (*)(void *, PetscReal, PetscReal, PetscBool *), void *);

 80: PETSC_EXTERN PetscErrorCode PetscDrawLine(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
 81: PETSC_EXTERN PetscErrorCode PetscDrawArrow(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
 82: PETSC_EXTERN PetscErrorCode PetscDrawLineSetWidth(PetscDraw, PetscReal);
 83: PETSC_EXTERN PetscErrorCode PetscDrawLineGetWidth(PetscDraw, PetscReal *);

 85: PETSC_EXTERN PetscErrorCode PetscDrawMarker(PetscDraw, PetscReal, PetscReal, int);
 86: PETSC_EXTERN PetscErrorCode PetscDrawSetMarkerType(PetscDraw, PetscDrawMarkerType);
 87: PETSC_EXTERN PetscErrorCode PetscDrawGetMarkerType(PetscDraw, PetscDrawMarkerType *);

 89: PETSC_EXTERN PetscErrorCode PetscDrawPoint(PetscDraw, PetscReal, PetscReal, int);
 90: PETSC_EXTERN PetscErrorCode PetscDrawPointPixel(PetscDraw, int, int, int);
 91: PETSC_EXTERN PetscErrorCode PetscDrawPointSetSize(PetscDraw, PetscReal);

 93: PETSC_EXTERN PetscErrorCode PetscDrawRectangle(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int, int, int, int);
 94: PETSC_EXTERN PetscErrorCode PetscDrawTriangle(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, int, int, int);
 95: PETSC_EXTERN PetscErrorCode PetscDrawEllipse(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal, int);
 96: PETSC_EXTERN PetscErrorCode PetscDrawTensorContourPatch(PetscDraw, int, int, PetscReal *, PetscReal *, PetscReal, PetscReal, PetscReal *);
 97: PETSC_EXTERN PetscErrorCode PetscDrawTensorContour(PetscDraw, int, int, const PetscReal[], const PetscReal[], PetscReal *);

 99: PETSC_EXTERN PetscErrorCode PetscDrawString(PetscDraw, PetscReal, PetscReal, int, const char[]);
100: PETSC_EXTERN PetscErrorCode PetscDrawStringCentered(PetscDraw, PetscReal, PetscReal, int, const char[]);
101: PETSC_EXTERN PetscErrorCode PetscDrawStringBoxed(PetscDraw, PetscReal, PetscReal, int, int, const char[], PetscReal *, PetscReal *);
102: PETSC_EXTERN PetscErrorCode PetscDrawStringVertical(PetscDraw, PetscReal, PetscReal, int, const char[]);
103: PETSC_EXTERN PetscErrorCode PetscDrawStringSetSize(PetscDraw, PetscReal, PetscReal);
104: PETSC_EXTERN PetscErrorCode PetscDrawStringGetSize(PetscDraw, PetscReal *, PetscReal *);

106: PETSC_EXTERN PetscErrorCode PetscDrawSetViewPort(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal);
107: PETSC_EXTERN PetscErrorCode PetscDrawGetViewPort(PetscDraw, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
108: PETSC_EXTERN PetscErrorCode PetscDrawSplitViewPort(PetscDraw);

110: PETSC_EXTERN PetscErrorCode PetscDrawSetCoordinates(PetscDraw, PetscReal, PetscReal, PetscReal, PetscReal);
111: PETSC_EXTERN PetscErrorCode PetscDrawGetCoordinates(PetscDraw, PetscReal *, PetscReal *, PetscReal *, PetscReal *);

113: PETSC_EXTERN PetscErrorCode PetscDrawSetTitle(PetscDraw, const char[]);
114: PETSC_EXTERN PetscErrorCode PetscDrawAppendTitle(PetscDraw, const char[]);
115: PETSC_EXTERN PetscErrorCode PetscDrawGetTitle(PetscDraw, const char *[]);

117: PETSC_EXTERN PetscErrorCode PetscDrawSetPause(PetscDraw, PetscReal);
118: PETSC_EXTERN PetscErrorCode PetscDrawGetPause(PetscDraw, PetscReal *);
119: PETSC_EXTERN PetscErrorCode PetscDrawPause(PetscDraw);
120: PETSC_EXTERN PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw);
121: PETSC_EXTERN PetscErrorCode PetscDrawClear(PetscDraw);
122: PETSC_EXTERN PetscErrorCode PetscDrawFlush(PetscDraw);
123: PETSC_EXTERN PetscErrorCode PetscDrawSave(PetscDraw);
124: PETSC_EXTERN PetscErrorCode PetscDrawSaveMovie(PetscDraw);
125: PETSC_EXTERN PetscErrorCode PetscDrawBOP(PetscDraw);
126: PETSC_EXTERN PetscErrorCode PetscDrawEOP(PetscDraw);

128: PETSC_EXTERN PetscErrorCode PetscDrawSetDisplay(PetscDraw, const char[]);
129: PETSC_EXTERN PetscErrorCode PetscDrawGetSingleton(PetscDraw, PetscDraw *);
130: PETSC_EXTERN PetscErrorCode PetscDrawRestoreSingleton(PetscDraw, PetscDraw *);

132: PETSC_EXTERN PetscErrorCode PetscDrawGetCurrentPoint(PetscDraw, PetscReal *, PetscReal *);
133: PETSC_EXTERN PetscErrorCode PetscDrawSetCurrentPoint(PetscDraw, PetscReal, PetscReal);
134: PETSC_EXTERN PetscErrorCode PetscDrawPushCurrentPoint(PetscDraw, PetscReal, PetscReal);
135: PETSC_EXTERN PetscErrorCode PetscDrawPopCurrentPoint(PetscDraw);
136: PETSC_EXTERN PetscErrorCode PetscDrawGetBoundingBox(PetscDraw, PetscReal *, PetscReal *, PetscReal *, PetscReal *);

138: PETSC_EXTERN PetscErrorCode PetscDrawSetVisible(PetscDraw, PetscBool);

140: PETSC_EXTERN PetscErrorCode PetscDrawGetMouseButton(PetscDraw, PetscDrawButton *, PetscReal *, PetscReal *, PetscReal *, PetscReal *);

142: PETSC_EXTERN PetscErrorCode PetscDrawZoom(PetscDraw, PetscErrorCode (*)(PetscDraw, void *), void *);

144: PETSC_EXTERN PetscErrorCode PetscDrawViewPortsCreate(PetscDraw, PetscInt, PetscDrawViewPorts **);
145: PETSC_EXTERN PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw, PetscInt, PetscInt, PetscDrawViewPorts **);
146: PETSC_EXTERN PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *);
147: PETSC_EXTERN PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *, PetscInt);

149: PETSC_EXTERN PetscClassId PETSC_DRAWAXIS_CLASSID;

151: PETSC_EXTERN PetscErrorCode PetscDrawAxisCreate(PetscDraw, PetscDrawAxis *);
152: PETSC_EXTERN PetscErrorCode PetscDrawAxisDestroy(PetscDrawAxis *);
153: PETSC_EXTERN PetscErrorCode PetscDrawAxisDraw(PetscDrawAxis);
154: PETSC_EXTERN PetscErrorCode PetscDrawAxisSetLimits(PetscDrawAxis, PetscReal, PetscReal, PetscReal, PetscReal);
155: PETSC_EXTERN PetscErrorCode PetscDrawAxisGetLimits(PetscDrawAxis, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
156: PETSC_EXTERN PetscErrorCode PetscDrawAxisSetHoldLimits(PetscDrawAxis, PetscBool);
157: PETSC_EXTERN PetscErrorCode PetscDrawAxisSetColors(PetscDrawAxis, int, int, int);
158: PETSC_EXTERN PetscErrorCode PetscDrawAxisSetLabels(PetscDrawAxis, const char[], const char[], const char[]);

160: PETSC_EXTERN PetscClassId PETSC_DRAWLG_CLASSID;

162: PETSC_EXTERN PetscErrorCode PetscDrawLGCreate(PetscDraw, PetscInt, PetscDrawLG *);
163: PETSC_EXTERN PetscErrorCode PetscDrawLGDestroy(PetscDrawLG *);
164: PETSC_EXTERN PetscErrorCode PetscDrawLGAddPoint(PetscDrawLG, const PetscReal *, const PetscReal *);
165: PETSC_EXTERN PetscErrorCode PetscDrawLGAddCommonPoint(PetscDrawLG, const PetscReal, const PetscReal *);
166: PETSC_EXTERN PetscErrorCode PetscDrawLGAddPoints(PetscDrawLG, PetscInt, PetscReal **, PetscReal **);
167: PETSC_EXTERN PetscErrorCode PetscDrawLGDraw(PetscDrawLG);
168: PETSC_EXTERN PetscErrorCode PetscDrawLGSave(PetscDrawLG);
169: PETSC_EXTERN PetscErrorCode PetscDrawLGView(PetscDrawLG, PetscViewer);
170: PETSC_EXTERN PetscErrorCode PetscDrawLGReset(PetscDrawLG);
171: PETSC_EXTERN PetscErrorCode PetscDrawLGSetDimension(PetscDrawLG, PetscInt);
172: PETSC_EXTERN PetscErrorCode PetscDrawLGGetDimension(PetscDrawLG, PetscInt *);
173: PETSC_EXTERN PetscErrorCode PetscDrawLGSetLegend(PetscDrawLG, const char *const *);
174: PETSC_EXTERN PetscErrorCode PetscDrawLGGetAxis(PetscDrawLG, PetscDrawAxis *);
175: PETSC_EXTERN PetscErrorCode PetscDrawLGGetDraw(PetscDrawLG, PetscDraw *);
176: PETSC_EXTERN PetscErrorCode PetscDrawLGSetUseMarkers(PetscDrawLG, PetscBool);
177: PETSC_EXTERN PetscErrorCode PetscDrawLGSetLimits(PetscDrawLG, PetscReal, PetscReal, PetscReal, PetscReal);
178: PETSC_EXTERN PetscErrorCode PetscDrawLGSetColors(PetscDrawLG, const int[]);
179: PETSC_EXTERN PetscErrorCode PetscDrawLGSetOptionsPrefix(PetscDrawLG, const char[]);
180: PETSC_EXTERN PetscErrorCode PetscDrawLGSetFromOptions(PetscDrawLG);
181: PETSC_EXTERN PetscErrorCode PetscDrawLGGetData(PetscDrawLG, PetscInt *, PetscInt *, const PetscReal *[], const PetscReal *[]);

183: PETSC_EXTERN PetscClassId PETSC_DRAWSP_CLASSID;

185: PETSC_EXTERN PetscErrorCode PetscDrawSPCreate(PetscDraw, int, PetscDrawSP *);
186: PETSC_EXTERN PetscErrorCode PetscDrawSPDestroy(PetscDrawSP *);
187: PETSC_EXTERN PetscErrorCode PetscDrawSPAddPoint(PetscDrawSP, PetscReal *, PetscReal *);
188: PETSC_EXTERN PetscErrorCode PetscDrawSPAddPoints(PetscDrawSP, int, PetscReal **, PetscReal **);
189: PETSC_EXTERN PetscErrorCode PetscDrawSPDraw(PetscDrawSP, PetscBool);
190: PETSC_EXTERN PetscErrorCode PetscDrawSPSave(PetscDrawSP);
191: PETSC_EXTERN PetscErrorCode PetscDrawSPReset(PetscDrawSP);
192: PETSC_EXTERN PetscErrorCode PetscDrawSPGetDimension(PetscDrawSP, int *);
193: PETSC_EXTERN PetscErrorCode PetscDrawSPSetDimension(PetscDrawSP, int);
194: PETSC_EXTERN PetscErrorCode PetscDrawSPGetAxis(PetscDrawSP, PetscDrawAxis *);
195: PETSC_EXTERN PetscErrorCode PetscDrawSPGetDraw(PetscDrawSP, PetscDraw *);
196: PETSC_EXTERN PetscErrorCode PetscDrawSPSetLimits(PetscDrawSP, PetscReal, PetscReal, PetscReal, PetscReal);
197: PETSC_EXTERN PetscErrorCode PetscDrawLGSPDraw(PetscDrawLG, PetscDrawSP);
198: PETSC_EXTERN PetscErrorCode PetscDrawSPAddPointColorized(PetscDrawSP, PetscReal *, PetscReal *, PetscReal *);

200: PETSC_EXTERN PetscClassId PETSC_DRAWHG_CLASSID;

202: PETSC_EXTERN PetscErrorCode PetscDrawHGCreate(PetscDraw, int, PetscDrawHG *);
203: PETSC_EXTERN PetscErrorCode PetscDrawHGDestroy(PetscDrawHG *);
204: PETSC_EXTERN PetscErrorCode PetscDrawHGAddValue(PetscDrawHG, PetscReal);
205: PETSC_EXTERN PetscErrorCode PetscDrawHGAddWeightedValue(PetscDrawHG, PetscReal, PetscReal);
206: PETSC_EXTERN PetscErrorCode PetscDrawHGDraw(PetscDrawHG);
207: PETSC_EXTERN PetscErrorCode PetscDrawHGSave(PetscDrawHG);
208: PETSC_EXTERN PetscErrorCode PetscDrawHGView(PetscDrawHG, PetscViewer);
209: PETSC_EXTERN PetscErrorCode PetscDrawHGReset(PetscDrawHG);
210: PETSC_EXTERN PetscErrorCode PetscDrawHGGetAxis(PetscDrawHG, PetscDrawAxis *);
211: PETSC_EXTERN PetscErrorCode PetscDrawHGGetDraw(PetscDrawHG, PetscDraw *);
212: PETSC_EXTERN PetscErrorCode PetscDrawHGSetLimits(PetscDrawHG, PetscReal, PetscReal, int, int);
213: PETSC_EXTERN PetscErrorCode PetscDrawHGSetNumberBins(PetscDrawHG, int);
214: PETSC_EXTERN PetscErrorCode PetscDrawHGSetColor(PetscDrawHG, int);
215: PETSC_EXTERN PetscErrorCode PetscDrawHGCalcStats(PetscDrawHG, PetscBool);
216: PETSC_EXTERN PetscErrorCode PetscDrawHGIntegerBins(PetscDrawHG, PetscBool);

218: PETSC_EXTERN PetscClassId PETSC_DRAWBAR_CLASSID;

220: PETSC_EXTERN PetscErrorCode PetscDrawBarCreate(PetscDraw, PetscDrawBar *);
221: PETSC_EXTERN PetscErrorCode PetscDrawBarSetData(PetscDrawBar, PetscInt, const PetscReal[], const char *const *);
222: PETSC_EXTERN PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *);
223: PETSC_EXTERN PetscErrorCode PetscDrawBarDraw(PetscDrawBar);
224: PETSC_EXTERN PetscErrorCode PetscDrawBarSave(PetscDrawBar);
225: PETSC_EXTERN PetscErrorCode PetscDrawBarSetColor(PetscDrawBar, int);
226: PETSC_EXTERN PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar, PetscReal, PetscReal);
227: PETSC_EXTERN PetscErrorCode PetscDrawBarSort(PetscDrawBar, PetscBool, PetscReal);
228: PETSC_EXTERN PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar);
229: PETSC_EXTERN PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar, PetscDrawAxis *);
230: PETSC_EXTERN PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar, PetscDraw *);

232: PETSC_EXTERN PetscErrorCode PetscDrawUtilitySetCmap(const char[], int, unsigned char[], unsigned char[], unsigned char[]);
233: PETSC_EXTERN PetscErrorCode PetscDrawUtilitySetGamma(PetscReal);

235: /*
236:     Handling of X11 I/O window resizing, window closing and errors in parallel
237: */
238: #if PetscDefined(HAVE_X) && PetscDefined(HAVE_SETJMP_H)
239:   #include <setjmp.h>

241: PETSC_EXTERN jmp_buf PetscXIOErrorHandlerJumpBuf;
242: PETSC_EXTERN void    PetscXIOErrorHandlerJump(void *);
243: /*S
244:   PetscXIOErrorHandlerFn - Function type for the X11 I/O error handler installed by `PetscSetXIOErrorHandler()`, called when the X server connection is lost

246:   Calling Sequence:
247: . display - the X `Display *` whose connection has failed (passed as `void *` to avoid pulling in X headers)

249:   Level: developer

251:   Note:
252:   By default PETSc installs a handler that gracefully aborts the program rather than letting Xlib call `exit()`.

254: .seealso: `PetscDraw`, `PetscSetXIOErrorHandler()`
255: S*/
256: PETSC_EXTERN_TYPEDEF typedef void                    PetscXIOErrorHandlerFn(void *display);
257: PETSC_EXTERN_TYPEDEF typedef PetscXIOErrorHandlerFn *PetscXIOErrorHandler PETSC_DEPRECATED_TYPEDEF(3, 26, 0, "PetscXIOErrorHandlerFn*", );
258: PETSC_EXTERN PetscXIOErrorHandlerFn                 *PetscSetXIOErrorHandler(PetscXIOErrorHandlerFn *);

260:   /*MC
261:    PetscDrawCollectiveBegin - Begins a set of draw operations

263:    Collective

265:    Synopsis:
266: #include <petscdraw.h>
267:     PetscErrorCode PetscDrawCollectiveBegin(PetscDraw draw)

269:    Collective

271:    Input Parameter:
272: .   draw - the draw object

274:    Level: advanced

276:    Notes:
277:    This is a macro that handles its own error checking, it does not return an error code.

279:    The set of operations needs to be ended by a call to `PetscDrawCollectiveEnd()`.

281:    X windows draw operations that are enclosed by these routines handle correctly resizing or closing of
282:    the window without crashing the program.

284:    Developer Note:
285:    This only applies to X windows and so should have a more specific name such as `PetscDrawXCollectiveBegin()`

287: .seealso: `PetscDraw`, `PetscDrawCollectiveEnd()`
288: M*/
289:   #define PetscDrawCollectiveBegin(draw) \
290:     do { \
291:       jmp_buf _Petsc_jmpbuf; \
292:       PetscXIOErrorHandlerFn *volatile _Petsc_xioerrhdl = PETSC_NULLPTR; \
293:       PetscBool _Petsc_isdrawx, _Petsc_xioerr = PETSC_FALSE; \
294:       PetscCall(PetscObjectTypeCompare((PetscObject)(draw), PETSC_DRAW_X, &_Petsc_isdrawx)); \
295:       if (_Petsc_isdrawx) { \
296:         PetscCall(PetscMemcpy(&_Petsc_jmpbuf, &PetscXIOErrorHandlerJumpBuf, sizeof(_Petsc_jmpbuf))); \
297:         _Petsc_xioerrhdl = PetscSetXIOErrorHandler(PetscXIOErrorHandlerJump); \
298:         if (setjmp(PetscXIOErrorHandlerJumpBuf)) { \
299:           _Petsc_xioerr = PETSC_TRUE; \
300:           do { \
301:             PetscDrawCollectiveEnd(draw); \
302:           } \
303:         } \
304:         do { \
305:       } while (0)

307:   /*MC
308:    PetscDrawCollectiveEnd - Ends a set of draw operations begun with `PetscDrawCollectiveBegin()`

310:    Collective

312:    Synopsis:
313: #include <petscdraw.h>
314:     PetscErrorCode PetscDrawCollectiveEnd(PetscDraw draw)

316:    Collective

318:    Input Parameter:
319: .   draw - the draw object

321:    Level: advanced

323:    Notes:
324:    This is a macro that handles its own error checking, it does not return an error code.

326:    X windows draw operations that are enclosed by these routines handle correctly resizing or closing of
327:    the window without crashing the program.

329:    Developer Note:
330:    This only applies to X windows and so should have a more specific name such as `PetscDrawXCollectiveEnd()`

332: .seealso: `PetscDraw`, `PetscDrawCollectiveBegin()`
333: M*/
334:   #define PetscDrawCollectiveEnd(draw) \
335:     if (_Petsc_isdrawx) { \
336:       (void)PetscSetXIOErrorHandler(_Petsc_xioerrhdl); \
337:       PetscCall(PetscMemcpy(&PetscXIOErrorHandlerJumpBuf, &_Petsc_jmpbuf, sizeof(PetscXIOErrorHandlerJumpBuf))); \
338:       PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &_Petsc_xioerr, 1, MPI_C_BOOL, MPI_LOR, PetscObjectComm((PetscObject)(draw)))); \
339:       if (_Petsc_xioerr) { \
340:         PetscCall(PetscDrawSetType((draw), PETSC_DRAW_NULL)); \
341:         PetscFunctionReturn(PETSC_SUCCESS); \
342:       } \
343:     } \
344:     } \
345:     while (0)

347: #else
348:   #define PetscDrawCollectiveBegin(draw)
349:   #define PetscDrawCollectiveEnd(draw)
350: #endif /* PetscDefined(HAVE_X) && PetscDefined(HAVE_SETJMP_H) */

352: PETSC_EXTERN PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer, PetscDrawType *);
353: PETSC_EXTERN PetscErrorCode PetscViewerDrawSetTitle(PetscViewer, const char[]);
354: PETSC_EXTERN PetscErrorCode PetscViewerDrawGetTitle(PetscViewer, const char *[]);
355: PETSC_EXTERN PetscErrorCode PetscViewerDrawGetDraw(PetscViewer, PetscInt, PetscDraw *);
356: PETSC_EXTERN PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer, PetscInt);
357: PETSC_EXTERN PetscErrorCode PetscViewerDrawBaseSet(PetscViewer, PetscInt);
358: PETSC_EXTERN PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer, PetscInt, PetscDrawLG *);
359: PETSC_EXTERN PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer, PetscInt, PetscDrawAxis *);