1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith /* 3*5c6c1daeSBarry Smith Provides the calling sequences for all the basic PetscDraw routines. 4*5c6c1daeSBarry Smith */ 5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h> /*I "petscdraw.h" I*/ 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith #undef __FUNCT__ 8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetBoundingBox" 9*5c6c1daeSBarry Smith /*@ 10*5c6c1daeSBarry Smith PetscDrawGetBoundingBox - Gets the bounding box of all PetscDrawBoxedString() commands 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith Not collective 13*5c6c1daeSBarry Smith 14*5c6c1daeSBarry Smith Input Parameter: 15*5c6c1daeSBarry Smith . draw - the drawing context 16*5c6c1daeSBarry Smith 17*5c6c1daeSBarry Smith Output Parameters: 18*5c6c1daeSBarry Smith . xl,yl,xr,yr - coordinates of lower left and upper right corners of bounding box 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith Level: intermediate 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith .seealso: PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint() 23*5c6c1daeSBarry Smith @*/ 24*5c6c1daeSBarry Smith PetscErrorCode PetscDrawGetBoundingBox(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr) 25*5c6c1daeSBarry Smith { 26*5c6c1daeSBarry Smith PetscFunctionBegin; 27*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 28*5c6c1daeSBarry Smith if (xl) *xl = draw->boundbox_xl; 29*5c6c1daeSBarry Smith if (yl) *yl = draw->boundbox_yl; 30*5c6c1daeSBarry Smith if (xr) *xr = draw->boundbox_xr; 31*5c6c1daeSBarry Smith if (yr) *yr = draw->boundbox_yr; 32*5c6c1daeSBarry Smith PetscFunctionReturn(0); 33*5c6c1daeSBarry Smith } 34*5c6c1daeSBarry Smith 35*5c6c1daeSBarry Smith #undef __FUNCT__ 36*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetCurrentPoint" 37*5c6c1daeSBarry Smith /*@ 38*5c6c1daeSBarry Smith PetscDrawGetCurrentPoint - Gets the current draw point, some codes use this point to determine where to draw next 39*5c6c1daeSBarry Smith 40*5c6c1daeSBarry Smith Not collective 41*5c6c1daeSBarry Smith 42*5c6c1daeSBarry Smith Input Parameter: 43*5c6c1daeSBarry Smith . draw - the drawing context 44*5c6c1daeSBarry Smith 45*5c6c1daeSBarry Smith Output Parameters: 46*5c6c1daeSBarry Smith . x,y - the current point 47*5c6c1daeSBarry Smith 48*5c6c1daeSBarry Smith Level: intermediate 49*5c6c1daeSBarry Smith 50*5c6c1daeSBarry Smith .seealso: PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint() 51*5c6c1daeSBarry Smith @*/ 52*5c6c1daeSBarry Smith PetscErrorCode PetscDrawGetCurrentPoint(PetscDraw draw,PetscReal *x,PetscReal *y) 53*5c6c1daeSBarry Smith { 54*5c6c1daeSBarry Smith PetscFunctionBegin; 55*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 56*5c6c1daeSBarry Smith *x = draw->currentpoint_x[draw->currentpoint]; 57*5c6c1daeSBarry Smith *y = draw->currentpoint_y[draw->currentpoint]; 58*5c6c1daeSBarry Smith PetscFunctionReturn(0); 59*5c6c1daeSBarry Smith } 60*5c6c1daeSBarry Smith 61*5c6c1daeSBarry Smith #undef __FUNCT__ 62*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetCurrentPoint" 63*5c6c1daeSBarry Smith /*@ 64*5c6c1daeSBarry Smith PetscDrawSetCurrentPoint - Sets the current draw point, some codes use this point to determine where to draw next 65*5c6c1daeSBarry Smith 66*5c6c1daeSBarry Smith Not collective 67*5c6c1daeSBarry Smith 68*5c6c1daeSBarry Smith Input Parameters: 69*5c6c1daeSBarry Smith + draw - the drawing context 70*5c6c1daeSBarry Smith - x,y - the location of the current point 71*5c6c1daeSBarry Smith 72*5c6c1daeSBarry Smith Level: intermediate 73*5c6c1daeSBarry Smith 74*5c6c1daeSBarry Smith .seealso: PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint() 75*5c6c1daeSBarry Smith @*/ 76*5c6c1daeSBarry Smith PetscErrorCode PetscDrawSetCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y) 77*5c6c1daeSBarry Smith { 78*5c6c1daeSBarry Smith PetscFunctionBegin; 79*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 80*5c6c1daeSBarry Smith draw->currentpoint_x[draw->currentpoint] = x; 81*5c6c1daeSBarry Smith draw->currentpoint_y[draw->currentpoint] = y; 82*5c6c1daeSBarry Smith PetscFunctionReturn(0); 83*5c6c1daeSBarry Smith } 84*5c6c1daeSBarry Smith 85*5c6c1daeSBarry Smith #undef __FUNCT__ 86*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPushCurrentPoint" 87*5c6c1daeSBarry Smith /*@ 88*5c6c1daeSBarry Smith PetscDrawPushCurrentPoint - Pushes a new current draw point, retaining the old one, some codes use this point to determine where to draw next 89*5c6c1daeSBarry Smith 90*5c6c1daeSBarry Smith Not collective 91*5c6c1daeSBarry Smith 92*5c6c1daeSBarry Smith Input Parameters: 93*5c6c1daeSBarry Smith + draw - the drawing context 94*5c6c1daeSBarry Smith - x,y - the location of the current point 95*5c6c1daeSBarry Smith 96*5c6c1daeSBarry Smith Level: intermediate 97*5c6c1daeSBarry Smith 98*5c6c1daeSBarry Smith .seealso: PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint() 99*5c6c1daeSBarry Smith @*/ 100*5c6c1daeSBarry Smith PetscErrorCode PetscDrawPushCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y) 101*5c6c1daeSBarry Smith { 102*5c6c1daeSBarry Smith PetscFunctionBegin; 103*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 104*5c6c1daeSBarry Smith if (draw->currentpoint > 9) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have pushed too many current points"); 105*5c6c1daeSBarry Smith draw->currentpoint_x[++draw->currentpoint] = x; 106*5c6c1daeSBarry Smith draw->currentpoint_y[draw->currentpoint] = y; 107*5c6c1daeSBarry Smith PetscFunctionReturn(0); 108*5c6c1daeSBarry Smith } 109*5c6c1daeSBarry Smith 110*5c6c1daeSBarry Smith #undef __FUNCT__ 111*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPopCurrentPoint" 112*5c6c1daeSBarry Smith /*@ 113*5c6c1daeSBarry Smith PetscDrawPopCurrentPoint - Pops a current draw point (discarding it) 114*5c6c1daeSBarry Smith 115*5c6c1daeSBarry Smith Not collective 116*5c6c1daeSBarry Smith 117*5c6c1daeSBarry Smith Input Parameter: 118*5c6c1daeSBarry Smith . draw - the drawing context 119*5c6c1daeSBarry Smith 120*5c6c1daeSBarry Smith Level: intermediate 121*5c6c1daeSBarry Smith 122*5c6c1daeSBarry Smith .seealso: PetscDrawPushCurrentPoint(), PetscDrawSetCurrentPoint(), PetscDrawGetCurrentPoint() 123*5c6c1daeSBarry Smith @*/ 124*5c6c1daeSBarry Smith PetscErrorCode PetscDrawPopCurrentPoint(PetscDraw draw) 125*5c6c1daeSBarry Smith { 126*5c6c1daeSBarry Smith PetscFunctionBegin; 127*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 128*5c6c1daeSBarry Smith if (draw->currentpoint-- == 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have popped too many current points"); 129*5c6c1daeSBarry Smith PetscFunctionReturn(0); 130*5c6c1daeSBarry Smith } 131*5c6c1daeSBarry Smith 132*5c6c1daeSBarry Smith #undef __FUNCT__ 133*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLine" 134*5c6c1daeSBarry Smith /*@ 135*5c6c1daeSBarry Smith PetscDrawLine - PetscDraws a line onto a drawable. 136*5c6c1daeSBarry Smith 137*5c6c1daeSBarry Smith Not collective 138*5c6c1daeSBarry Smith 139*5c6c1daeSBarry Smith Input Parameters: 140*5c6c1daeSBarry Smith + draw - the drawing context 141*5c6c1daeSBarry Smith . xl,yl,xr,yr - the coordinates of the line endpoints 142*5c6c1daeSBarry Smith - cl - the colors of the endpoints 143*5c6c1daeSBarry Smith 144*5c6c1daeSBarry Smith Level: beginner 145*5c6c1daeSBarry Smith 146*5c6c1daeSBarry Smith Concepts: line^drawing 147*5c6c1daeSBarry Smith Concepts: drawing^line 148*5c6c1daeSBarry Smith 149*5c6c1daeSBarry Smith @*/ 150*5c6c1daeSBarry Smith PetscErrorCode PetscDrawLine(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl) 151*5c6c1daeSBarry Smith { 152*5c6c1daeSBarry Smith PetscErrorCode ierr; 153*5c6c1daeSBarry Smith PetscBool isdrawnull; 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith PetscFunctionBegin; 156*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 157*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isdrawnull);CHKERRQ(ierr); 158*5c6c1daeSBarry Smith if (isdrawnull) PetscFunctionReturn(0); 159*5c6c1daeSBarry Smith if (!draw->ops->line) SETERRQ(((PetscObject)draw)->comm,PETSC_ERR_SUP,"No support for drawing lines"); 160*5c6c1daeSBarry Smith ierr = (*draw->ops->line)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr); 161*5c6c1daeSBarry Smith PetscFunctionReturn(0); 162*5c6c1daeSBarry Smith } 163*5c6c1daeSBarry Smith 164*5c6c1daeSBarry Smith #undef __FUNCT__ 165*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawArrow" 166*5c6c1daeSBarry Smith /*@ 167*5c6c1daeSBarry Smith PetscDrawArrow - PetscDraws a line with arrow head at end if the line is long enough 168*5c6c1daeSBarry Smith 169*5c6c1daeSBarry Smith Not collective 170*5c6c1daeSBarry Smith 171*5c6c1daeSBarry Smith Input Parameters: 172*5c6c1daeSBarry Smith + draw - the drawing context 173*5c6c1daeSBarry Smith . xl,yl,xr,yr - the coordinates of the line endpoints 174*5c6c1daeSBarry Smith - cl - the colors of the endpoints 175*5c6c1daeSBarry Smith 176*5c6c1daeSBarry Smith Level: beginner 177*5c6c1daeSBarry Smith 178*5c6c1daeSBarry Smith Concepts: line^drawing 179*5c6c1daeSBarry Smith Concepts: drawing^line 180*5c6c1daeSBarry Smith 181*5c6c1daeSBarry Smith @*/ 182*5c6c1daeSBarry Smith PetscErrorCode PetscDrawArrow(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl) 183*5c6c1daeSBarry Smith { 184*5c6c1daeSBarry Smith PetscErrorCode ierr; 185*5c6c1daeSBarry Smith PetscBool isdrawnull; 186*5c6c1daeSBarry Smith 187*5c6c1daeSBarry Smith PetscFunctionBegin; 188*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 189*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isdrawnull);CHKERRQ(ierr); 190*5c6c1daeSBarry Smith if (isdrawnull) PetscFunctionReturn(0); 191*5c6c1daeSBarry Smith if (!draw->ops->arrow) SETERRQ(((PetscObject)draw)->comm,PETSC_ERR_SUP,"No support for drawing arrows"); 192*5c6c1daeSBarry Smith ierr = (*draw->ops->arrow)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr); 193*5c6c1daeSBarry Smith PetscFunctionReturn(0); 194*5c6c1daeSBarry Smith } 195*5c6c1daeSBarry Smith 196