15c6c1daeSBarry Smith 2af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 3665c2dedSJed Brown #include <petscviewer.h> 45c6c1daeSBarry Smith 55c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID; 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith static PetscBool PetscDrawPackageInitialized = PETSC_FALSE; 85c6c1daeSBarry Smith /*@C 9811af0c4SBarry Smith PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the `PetscDraw` package. It is 10811af0c4SBarry Smith called from `PetscFinalize()`. 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith Level: developer 135c6c1daeSBarry Smith 14811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscFinalize()` 155c6c1daeSBarry Smith @*/ 16d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawFinalizePackage(void) 17d71ae5a4SJacob Faibussowitsch { 185c6c1daeSBarry Smith PetscFunctionBegin; 199566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscDrawList)); 205c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_FALSE; 210f51fdf8SToby Isaac PetscDrawRegisterAllCalled = PETSC_FALSE; 223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 235c6c1daeSBarry Smith } 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith /*@C 26811af0c4SBarry Smith PetscInitializeDrawPackage - This function initializes everything in the `PetscDraw` package. It is called 27811af0c4SBarry Smith from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to `PetscInitialize()` 288a690491SBarry Smith when using shared or static libraries. 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith Level: developer 315c6c1daeSBarry Smith 32811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscInitialize()` 335c6c1daeSBarry Smith @*/ 34d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawInitializePackage(void) 35d71ae5a4SJacob Faibussowitsch { 365c6c1daeSBarry Smith char logList[256]; 378e81d068SLisandro Dalcin PetscBool opt, pkg; 385c6c1daeSBarry Smith 395c6c1daeSBarry Smith PetscFunctionBegin; 403ba16761SJacob Faibussowitsch if (PetscDrawPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 415c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_TRUE; 425c6c1daeSBarry Smith /* Register Classes */ 439566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw", &PETSC_DRAW_CLASSID)); 449566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw Axis", &PETSC_DRAWAXIS_CLASSID)); 459566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Line Graph", &PETSC_DRAWLG_CLASSID)); 469566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Histogram", &PETSC_DRAWHG_CLASSID)); 479566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Bar Graph", &PETSC_DRAWBAR_CLASSID)); 489566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Scatter Plot", &PETSC_DRAWSP_CLASSID)); 495c6c1daeSBarry Smith /* Register Constructors */ 509566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 51e94e781bSJacob Faibussowitsch /* Process Info */ 52e94e781bSJacob Faibussowitsch { 53e94e781bSJacob Faibussowitsch PetscClassId classids[6]; 54e94e781bSJacob Faibussowitsch 55e94e781bSJacob Faibussowitsch classids[0] = PETSC_DRAW_CLASSID; 56e94e781bSJacob Faibussowitsch classids[1] = PETSC_DRAWAXIS_CLASSID; 57e94e781bSJacob Faibussowitsch classids[2] = PETSC_DRAWLG_CLASSID; 58e94e781bSJacob Faibussowitsch classids[3] = PETSC_DRAWHG_CLASSID; 59e94e781bSJacob Faibussowitsch classids[4] = PETSC_DRAWBAR_CLASSID; 60e94e781bSJacob Faibussowitsch classids[5] = PETSC_DRAWSP_CLASSID; 619566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("draw", 6, classids)); 625c6c1daeSBarry Smith } 635c6c1daeSBarry Smith /* Process summary exclusions */ 649566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 655c6c1daeSBarry Smith if (opt) { 669566063dSJacob Faibussowitsch PetscCall(PetscStrInList("draw", logList, ',', &pkg)); 678e81d068SLisandro Dalcin if (pkg) { 689566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID)); 699566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID)); 709566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID)); 719566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID)); 729566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID)); 739566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID)); 745c6c1daeSBarry Smith } 755c6c1daeSBarry Smith } 768e81d068SLisandro Dalcin /* Register package finalizer */ 779566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage)); 783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 795c6c1daeSBarry Smith } 805c6c1daeSBarry Smith 815c6c1daeSBarry Smith /*@ 825c6c1daeSBarry Smith PetscDrawResizeWindow - Allows one to resize a window from a program. 835c6c1daeSBarry Smith 84c3339decSBarry Smith Collective 855c6c1daeSBarry Smith 86d8d19677SJose E. Roman Input Parameters: 875c6c1daeSBarry Smith + draw - the window 88*2fe279fdSBarry Smith . w - the new width of the window 89*2fe279fdSBarry Smith - h - the new height of the window 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith Level: intermediate 925c6c1daeSBarry Smith 93811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCheckResizedWindow()` 945c6c1daeSBarry Smith @*/ 95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawResizeWindow(PetscDraw draw, int w, int h) 96d71ae5a4SJacob Faibussowitsch { 975c6c1daeSBarry Smith PetscFunctionBegin; 9873ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 9973ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw, w, 2); 10073ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw, h, 3); 101dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, resizewindow, w, h); 1023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1035c6c1daeSBarry Smith } 1045c6c1daeSBarry Smith 10573ecf448SLisandro Dalcin /*@ 10673ecf448SLisandro Dalcin PetscDrawGetWindowSize - Gets the size of the window. 10773ecf448SLisandro Dalcin 10820f4b53cSBarry Smith Not Collective 10973ecf448SLisandro Dalcin 11073ecf448SLisandro Dalcin Input Parameter: 11173ecf448SLisandro Dalcin . draw - the window 11273ecf448SLisandro Dalcin 11373ecf448SLisandro Dalcin Output Parameters: 11420f4b53cSBarry Smith + w - the window width 11520f4b53cSBarry Smith - h - the window height 11673ecf448SLisandro Dalcin 11773ecf448SLisandro Dalcin Level: intermediate 11873ecf448SLisandro Dalcin 119811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()` 12073ecf448SLisandro Dalcin @*/ 121d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw, int *w, int *h) 122d71ae5a4SJacob Faibussowitsch { 12373ecf448SLisandro Dalcin PetscFunctionBegin; 12473ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 12573ecf448SLisandro Dalcin if (w) PetscValidPointer(w, 2); 12673ecf448SLisandro Dalcin if (h) PetscValidPointer(h, 3); 12773ecf448SLisandro Dalcin if (w) *w = draw->w; 12873ecf448SLisandro Dalcin if (h) *h = draw->h; 1293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13073ecf448SLisandro Dalcin } 13173ecf448SLisandro Dalcin 1325c6c1daeSBarry Smith /*@ 1335c6c1daeSBarry Smith PetscDrawCheckResizedWindow - Checks if the user has resized the window. 1345c6c1daeSBarry Smith 135c3339decSBarry Smith Collective 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Input Parameter: 1385c6c1daeSBarry Smith . draw - the window 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith Level: advanced 1415c6c1daeSBarry Smith 142811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()` 1435c6c1daeSBarry Smith @*/ 144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) 145d71ae5a4SJacob Faibussowitsch { 1465c6c1daeSBarry Smith PetscFunctionBegin; 14773ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 148dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, checkresizedwindow); 1493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1505c6c1daeSBarry Smith } 1515c6c1daeSBarry Smith 1525c6c1daeSBarry Smith /*@C 153811af0c4SBarry Smith PetscDrawGetTitle - Gets pointer to title of a `PetscDraw` context. 1545c6c1daeSBarry Smith 15520f4b53cSBarry Smith Not Collective 1565c6c1daeSBarry Smith 1575c6c1daeSBarry Smith Input Parameter: 1585c6c1daeSBarry Smith . draw - the graphics context 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith Output Parameter: 1615c6c1daeSBarry Smith . title - the title 1625c6c1daeSBarry Smith 1635c6c1daeSBarry Smith Level: intermediate 1645c6c1daeSBarry Smith 165811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()` 1665c6c1daeSBarry Smith @*/ 167d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetTitle(PetscDraw draw, const char *title[]) 168d71ae5a4SJacob Faibussowitsch { 1695c6c1daeSBarry Smith PetscFunctionBegin; 1705c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1715c6c1daeSBarry Smith PetscValidPointer(title, 2); 1725c6c1daeSBarry Smith *title = draw->title; 1733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1745c6c1daeSBarry Smith } 1755c6c1daeSBarry Smith 1765c6c1daeSBarry Smith /*@C 177811af0c4SBarry Smith PetscDrawSetTitle - Sets the title of a `PetscDraw` context. 1785c6c1daeSBarry Smith 179c3339decSBarry Smith Collective 1805c6c1daeSBarry Smith 1815c6c1daeSBarry Smith Input Parameters: 1825c6c1daeSBarry Smith + draw - the graphics context 1835c6c1daeSBarry Smith - title - the title 1845c6c1daeSBarry Smith 1855c6c1daeSBarry Smith Level: intermediate 1865c6c1daeSBarry Smith 187811af0c4SBarry Smith Notes: 188811af0c4SBarry Smith The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save 189231a95f8SBarry Smith in the image. 190231a95f8SBarry Smith 1915c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 1925c6c1daeSBarry Smith title string after calling this routine. 1935c6c1daeSBarry Smith 194811af0c4SBarry Smith You can use `PetscDrawAxisSetLabels()` to indicate a title within the window 195231a95f8SBarry Smith 196811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetTitle()`, `PetscDrawAppendTitle()` 1975c6c1daeSBarry Smith @*/ 198d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetTitle(PetscDraw draw, const char title[]) 199d71ae5a4SJacob Faibussowitsch { 2005c6c1daeSBarry Smith PetscFunctionBegin; 2015c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2025c6c1daeSBarry Smith PetscValidCharPointer(title, 2); 2039566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 2049566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 205dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, settitle, draw->title); 2063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2075c6c1daeSBarry Smith } 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith /*@C 210811af0c4SBarry Smith PetscDrawAppendTitle - Appends to the title of a `PetscDraw` context. 2115c6c1daeSBarry Smith 212c3339decSBarry Smith Collective 2135c6c1daeSBarry Smith 2145c6c1daeSBarry Smith Input Parameters: 2155c6c1daeSBarry Smith + draw - the graphics context 2165c6c1daeSBarry Smith - title - the title 2175c6c1daeSBarry Smith 21820f4b53cSBarry Smith Level: advanced 21920f4b53cSBarry Smith 2205c6c1daeSBarry Smith Note: 2215c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 2225c6c1daeSBarry Smith title string after calling this routine. 2235c6c1daeSBarry Smith 224811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`, `PetscDrawGetTitle()` 2255c6c1daeSBarry Smith @*/ 226d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawAppendTitle(PetscDraw draw, const char title[]) 227d71ae5a4SJacob Faibussowitsch { 2285c6c1daeSBarry Smith PetscFunctionBegin; 2295c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2305b399a63SLisandro Dalcin if (title) PetscValidCharPointer(title, 2); 2313ba16761SJacob Faibussowitsch if (!title || !title[0]) PetscFunctionReturn(PETSC_SUCCESS); 2325c6c1daeSBarry Smith 2335c6c1daeSBarry Smith if (draw->title) { 234c6a7a370SJeremy L Thompson size_t len1, len2, new_len; 235c6a7a370SJeremy L Thompson PetscCall(PetscStrlen(draw->title, &len1)); 236c6a7a370SJeremy L Thompson PetscCall(PetscStrlen(title, &len2)); 237c6a7a370SJeremy L Thompson new_len = len1 + len2 + 1; 238c6a7a370SJeremy L Thompson PetscCall(PetscRealloc(new_len * sizeof(*(draw->title)), &draw->title)); 239c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(draw->title + len1, title, len2 + 1)); 2405c6c1daeSBarry Smith } else { 2419566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 2425c6c1daeSBarry Smith } 243dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, settitle, draw->title); 2443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2455c6c1daeSBarry Smith } 2465c6c1daeSBarry Smith 247d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) 248d71ae5a4SJacob Faibussowitsch { 249e118a51fSLisandro Dalcin PetscFunctionBegin; 2503ba16761SJacob Faibussowitsch if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(PETSC_SUCCESS); 2519566063dSJacob Faibussowitsch PetscCall(PetscDrawSaveMovie(draw)); 252e118a51fSLisandro Dalcin if (draw->savefinalfilename) { 253df8d4941SLisandro Dalcin draw->savesinglefile = PETSC_TRUE; 2549566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(draw, draw->savefinalfilename)); 2559566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 256e118a51fSLisandro Dalcin } 2579566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)draw)); 2583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 259e118a51fSLisandro Dalcin } 260e118a51fSLisandro Dalcin 2615c6c1daeSBarry Smith /*@ 2625c6c1daeSBarry Smith PetscDrawDestroy - Deletes a draw context. 2635c6c1daeSBarry Smith 264c3339decSBarry Smith Collective 2655c6c1daeSBarry Smith 26620f4b53cSBarry Smith Input Parameter: 2675c6c1daeSBarry Smith . draw - the drawing context 2685c6c1daeSBarry Smith 2695c6c1daeSBarry Smith Level: beginner 2705c6c1daeSBarry Smith 271811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()` 2725c6c1daeSBarry Smith @*/ 273d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawDestroy(PetscDraw *draw) 274d71ae5a4SJacob Faibussowitsch { 2755c6c1daeSBarry Smith PetscFunctionBegin; 2763ba16761SJacob Faibussowitsch if (!*draw) PetscFunctionReturn(PETSC_SUCCESS); 2775c6c1daeSBarry Smith PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 1); 2783ba16761SJacob Faibussowitsch if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(PETSC_SUCCESS); 2795c6c1daeSBarry Smith 2805c6c1daeSBarry Smith if ((*draw)->pause == -2) { 2815c6c1daeSBarry Smith (*draw)->pause = -1; 2829566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(*draw)); 2835c6c1daeSBarry Smith } 2845c6c1daeSBarry Smith 2855c6c1daeSBarry Smith /* if memory was published then destroy it */ 2869566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw)); 2875c6c1daeSBarry Smith 2889566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy_Private(*draw)); 289e118a51fSLisandro Dalcin 29048a46eb9SPierre Jolivet if ((*draw)->ops->destroy) PetscCall((*(*draw)->ops->destroy)(*draw)); 2919566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*draw)->popup)); 2929566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->title)); 2939566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->display)); 2949566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefilename)); 2959566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->saveimageext)); 2969566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savemovieext)); 2979566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefinalfilename)); 2989566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(draw)); 2993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3005c6c1daeSBarry Smith } 3015c6c1daeSBarry Smith 3025c6c1daeSBarry Smith /*@ 303811af0c4SBarry Smith PetscDrawGetPopup - Creates a popup window associated with a `PetscDraw` window. 3045c6c1daeSBarry Smith 305c3339decSBarry Smith Collective 3065c6c1daeSBarry Smith 3075c6c1daeSBarry Smith Input Parameter: 3085c6c1daeSBarry Smith . draw - the original window 3095c6c1daeSBarry Smith 3105c6c1daeSBarry Smith Output Parameter: 3115c6c1daeSBarry Smith . popup - the new popup window 3125c6c1daeSBarry Smith 3135c6c1daeSBarry Smith Level: advanced 3145c6c1daeSBarry Smith 315811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawScalePopup()`, `PetscDrawCreate()` 3165c6c1daeSBarry Smith @*/ 317d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetPopup(PetscDraw draw, PetscDraw *popup) 318d71ae5a4SJacob Faibussowitsch { 3195c6c1daeSBarry Smith PetscFunctionBegin; 3205c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3215c6c1daeSBarry Smith PetscValidPointer(popup, 2); 3225c6c1daeSBarry Smith 323a297a907SKarl Rupp if (draw->popup) *popup = draw->popup; 324a297a907SKarl Rupp else if (draw->ops->getpopup) { 325dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, getpopup, popup); 3260b874712SBarry Smith if (*popup) { 3279566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_")); 328e118a51fSLisandro Dalcin (*popup)->pause = 0.0; 3299566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(*popup)); 33061f59835SBarry Smith } 3310298fd71SBarry Smith } else *popup = NULL; 3323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3335c6c1daeSBarry Smith } 3345c6c1daeSBarry Smith 33594ef8ddeSSatish Balay /*@C 336811af0c4SBarry Smith PetscDrawSetDisplay - Sets the display where a `PetscDraw` object will be displayed 3375c6c1daeSBarry Smith 338d8d19677SJose E. Roman Input Parameters: 3395c6c1daeSBarry Smith + draw - the drawing context 3405c6c1daeSBarry Smith - display - the X windows display 3415c6c1daeSBarry Smith 3425c6c1daeSBarry Smith Level: advanced 3435c6c1daeSBarry Smith 344811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()` 3455c6c1daeSBarry Smith @*/ 346d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDisplay(PetscDraw draw, const char display[]) 347d71ae5a4SJacob Faibussowitsch { 3485c6c1daeSBarry Smith PetscFunctionBegin; 3499566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->display)); 3509566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &draw->display)); 3513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3525c6c1daeSBarry Smith } 3535c6c1daeSBarry Smith 35445f3bb6eSLisandro Dalcin /*@ 35545f3bb6eSLisandro Dalcin PetscDrawSetDoubleBuffer - Sets a window to be double buffered. 35645f3bb6eSLisandro Dalcin 357c3339decSBarry Smith Logically Collective 3585c6c1daeSBarry Smith 3595c6c1daeSBarry Smith Input Parameter: 36045f3bb6eSLisandro Dalcin . draw - the drawing context 36145f3bb6eSLisandro Dalcin 36245f3bb6eSLisandro Dalcin Level: intermediate 36345f3bb6eSLisandro Dalcin 364811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()` 36545f3bb6eSLisandro Dalcin @*/ 366d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw) 367d71ae5a4SJacob Faibussowitsch { 3685c6c1daeSBarry Smith PetscFunctionBegin; 36945f3bb6eSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 370dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setdoublebuffer); 3713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3725c6c1daeSBarry Smith } 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith /*@C 375811af0c4SBarry Smith PetscDrawGetSingleton - Gain access to a `PetscDraw` object as if it were owned 3765c6c1daeSBarry Smith by the one process. 3775c6c1daeSBarry Smith 378c3339decSBarry Smith Collective 3795c6c1daeSBarry Smith 3805c6c1daeSBarry Smith Input Parameter: 3815c6c1daeSBarry Smith . draw - the original window 3825c6c1daeSBarry Smith 3835c6c1daeSBarry Smith Output Parameter: 3845c6c1daeSBarry Smith . sdraw - the singleton window 3855c6c1daeSBarry Smith 3865c6c1daeSBarry Smith Level: advanced 3875c6c1daeSBarry Smith 388811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 3895c6c1daeSBarry Smith @*/ 390d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetSingleton(PetscDraw draw, PetscDraw *sdraw) 391d71ae5a4SJacob Faibussowitsch { 3925c6c1daeSBarry Smith PetscMPIInt size; 3935c6c1daeSBarry Smith 3945c6c1daeSBarry Smith PetscFunctionBegin; 3955c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3965c6c1daeSBarry Smith PetscValidPointer(sdraw, 2); 3975c6c1daeSBarry Smith 3989566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 399387ef4f7SLisandro Dalcin if (size == 1) { 4009566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 401387ef4f7SLisandro Dalcin *sdraw = draw; 402387ef4f7SLisandro Dalcin } else { 4035c6c1daeSBarry Smith if (draw->ops->getsingleton) { 404dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, getsingleton, sdraw); 40598921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot get singleton for this type %s of draw object", ((PetscObject)draw)->type_name); 4065c6c1daeSBarry Smith } 4073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4085c6c1daeSBarry Smith } 4095c6c1daeSBarry Smith 4105c6c1daeSBarry Smith /*@C 411811af0c4SBarry Smith PetscDrawRestoreSingleton - Remove access to a `PetscDraw` object obtained with `PetscDrawGetSingleton()` 4125c6c1daeSBarry Smith by the one process. 4135c6c1daeSBarry Smith 414c3339decSBarry Smith Collective 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith Input Parameters: 4175c6c1daeSBarry Smith + draw - the original window 4185c6c1daeSBarry Smith - sdraw - the singleton window 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith Level: advanced 4215c6c1daeSBarry Smith 422811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 4235c6c1daeSBarry Smith @*/ 424d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw, PetscDraw *sdraw) 425d71ae5a4SJacob Faibussowitsch { 4265c6c1daeSBarry Smith PetscMPIInt size; 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith PetscFunctionBegin; 4295c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 4305c6c1daeSBarry Smith PetscValidPointer(sdraw, 2); 4315c6c1daeSBarry Smith PetscValidHeaderSpecific(*sdraw, PETSC_DRAW_CLASSID, 2); 4325c6c1daeSBarry Smith 4339566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 434387ef4f7SLisandro Dalcin if (size == 1) { 435387ef4f7SLisandro Dalcin if (draw == *sdraw) { 4369566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)draw)); 437387ef4f7SLisandro Dalcin *sdraw = NULL; 438387ef4f7SLisandro Dalcin } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot restore singleton, it is not the parent draw"); 439dbbe0bcdSBarry Smith } else PetscUseTypeMethod(draw, restoresingleton, sdraw); 4403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4415c6c1daeSBarry Smith } 442bb09dc67SDuncan Campbell 443bb09dc67SDuncan Campbell /*@C 444bb09dc67SDuncan Campbell PetscDrawSetVisible - Sets if the drawing surface (the 'window') is visible on its display. 445bb09dc67SDuncan Campbell 446bb09dc67SDuncan Campbell Input Parameters: 447bb09dc67SDuncan Campbell + draw - the drawing window 448bb09dc67SDuncan Campbell - visible - if the surface should be visible 449bb09dc67SDuncan Campbell 45053c0d4aeSBarry Smith Level: intermediate 45153c0d4aeSBarry Smith 452bb09dc67SDuncan Campbell .seealso: `PetscDraw` 453bb09dc67SDuncan Campbell @*/ 454bb09dc67SDuncan Campbell PetscErrorCode PetscDrawSetVisible(PetscDraw draw, PetscBool visible) 455bb09dc67SDuncan Campbell { 456bb09dc67SDuncan Campbell PetscFunctionBegin; 457bb09dc67SDuncan Campbell PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 458bb09dc67SDuncan Campbell PetscTryTypeMethod(draw, setvisible, visible); 459bb09dc67SDuncan Campbell PetscFunctionReturn(PETSC_SUCCESS); 460bb09dc67SDuncan Campbell } 461