xref: /petsc/src/sys/classes/draw/interface/dline.c (revision 8f69470a7058bcc0cf21d9492705f60bbdfc5aa4)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #undef __FUNCT__
85c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetBoundingBox"
95c6c1daeSBarry Smith /*@
1051fa3d41SBarry Smith    PetscDrawGetBoundingBox - Gets the bounding box of all PetscDrawStringBoxed() commands
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith    Not collective
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Input Parameter:
155c6c1daeSBarry Smith .  draw - the drawing context
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith    Output Parameters:
185c6c1daeSBarry Smith .   xl,yl,xr,yr - coordinates of lower left and upper right corners of bounding box
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith    Level: intermediate
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint()
235c6c1daeSBarry Smith @*/
245c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetBoundingBox(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
255c6c1daeSBarry Smith {
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
28*8f69470aSLisandro Dalcin   if (xl) PetscValidRealPointer(xl,2);
29*8f69470aSLisandro Dalcin   if (yl) PetscValidRealPointer(yl,3);
30*8f69470aSLisandro Dalcin   if (xr) PetscValidRealPointer(xr,4);
31*8f69470aSLisandro Dalcin   if (yr) PetscValidRealPointer(yr,5);
325c6c1daeSBarry Smith   if (xl) *xl = draw->boundbox_xl;
335c6c1daeSBarry Smith   if (yl) *yl = draw->boundbox_yl;
345c6c1daeSBarry Smith   if (xr) *xr = draw->boundbox_xr;
355c6c1daeSBarry Smith   if (yr) *yr = draw->boundbox_yr;
365c6c1daeSBarry Smith   PetscFunctionReturn(0);
375c6c1daeSBarry Smith }
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith #undef __FUNCT__
405c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetCurrentPoint"
415c6c1daeSBarry Smith /*@
425c6c1daeSBarry Smith    PetscDrawGetCurrentPoint - Gets the current draw point, some codes use this point to determine where to draw next
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Not collective
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Input Parameter:
475c6c1daeSBarry Smith .  draw - the drawing context
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith    Output Parameters:
505c6c1daeSBarry Smith .   x,y - the current point
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith    Level: intermediate
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint()
555c6c1daeSBarry Smith @*/
565c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetCurrentPoint(PetscDraw draw,PetscReal *x,PetscReal *y)
575c6c1daeSBarry Smith {
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
60*8f69470aSLisandro Dalcin   PetscValidRealPointer(x,2);
61*8f69470aSLisandro Dalcin   PetscValidRealPointer(y,3);
625c6c1daeSBarry Smith   *x = draw->currentpoint_x[draw->currentpoint];
635c6c1daeSBarry Smith   *y = draw->currentpoint_y[draw->currentpoint];
645c6c1daeSBarry Smith   PetscFunctionReturn(0);
655c6c1daeSBarry Smith }
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith #undef __FUNCT__
685c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetCurrentPoint"
695c6c1daeSBarry Smith /*@
705c6c1daeSBarry Smith    PetscDrawSetCurrentPoint - Sets the current draw point, some codes use this point to determine where to draw next
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith    Not collective
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Input Parameters:
755c6c1daeSBarry Smith +  draw - the drawing context
765c6c1daeSBarry Smith -  x,y - the location of the current point
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith    Level: intermediate
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint()
815c6c1daeSBarry Smith @*/
825c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y)
835c6c1daeSBarry Smith {
845c6c1daeSBarry Smith   PetscFunctionBegin;
855c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
865c6c1daeSBarry Smith   draw->currentpoint_x[draw->currentpoint] = x;
875c6c1daeSBarry Smith   draw->currentpoint_y[draw->currentpoint] = y;
885c6c1daeSBarry Smith   PetscFunctionReturn(0);
895c6c1daeSBarry Smith }
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith #undef __FUNCT__
925c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPushCurrentPoint"
935c6c1daeSBarry Smith /*@
945c6c1daeSBarry Smith    PetscDrawPushCurrentPoint - Pushes a new current draw point, retaining the old one, some codes use this point to determine where to draw next
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith    Not collective
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith    Input Parameters:
995c6c1daeSBarry Smith +  draw - the drawing context
1005c6c1daeSBarry Smith -  x,y - the location of the current point
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith    Level: intermediate
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint()
1055c6c1daeSBarry Smith @*/
1065c6c1daeSBarry Smith PetscErrorCode  PetscDrawPushCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y)
1075c6c1daeSBarry Smith {
1085c6c1daeSBarry Smith   PetscFunctionBegin;
1095c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
110ec007e15SMatthew G. Knepley   if (draw->currentpoint > 19) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have pushed too many current points");
1115c6c1daeSBarry Smith   draw->currentpoint_x[++draw->currentpoint] = x;
1125c6c1daeSBarry Smith   draw->currentpoint_y[draw->currentpoint]   = y;
1135c6c1daeSBarry Smith   PetscFunctionReturn(0);
1145c6c1daeSBarry Smith }
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith #undef __FUNCT__
1175c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPopCurrentPoint"
1185c6c1daeSBarry Smith /*@
1195c6c1daeSBarry Smith    PetscDrawPopCurrentPoint - Pops a current draw point (discarding it)
1205c6c1daeSBarry Smith 
1215c6c1daeSBarry Smith    Not collective
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith    Input Parameter:
1245c6c1daeSBarry Smith .  draw - the drawing context
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith    Level: intermediate
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith .seealso:  PetscDrawPushCurrentPoint(), PetscDrawSetCurrentPoint(), PetscDrawGetCurrentPoint()
1295c6c1daeSBarry Smith @*/
1305c6c1daeSBarry Smith PetscErrorCode  PetscDrawPopCurrentPoint(PetscDraw draw)
1315c6c1daeSBarry Smith {
1325c6c1daeSBarry Smith   PetscFunctionBegin;
1335c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1345c6c1daeSBarry Smith   if (draw->currentpoint-- == 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have popped too many current points");
1355c6c1daeSBarry Smith   PetscFunctionReturn(0);
1365c6c1daeSBarry Smith }
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith #undef __FUNCT__
1395c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLine"
1405c6c1daeSBarry Smith /*@
1415c6c1daeSBarry Smith    PetscDrawLine - PetscDraws a line onto a drawable.
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith    Not collective
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Input Parameters:
1465c6c1daeSBarry Smith +  draw - the drawing context
1475c6c1daeSBarry Smith .  xl,yl,xr,yr - the coordinates of the line endpoints
1485c6c1daeSBarry Smith -  cl - the colors of the endpoints
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith    Level: beginner
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith    Concepts: line^drawing
1535c6c1daeSBarry Smith    Concepts: drawing^line
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith @*/
1565c6c1daeSBarry Smith PetscErrorCode  PetscDrawLine(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl)
1575c6c1daeSBarry Smith {
1585c6c1daeSBarry Smith   PetscErrorCode ierr;
159*8f69470aSLisandro Dalcin   PetscBool      isnull;
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith   PetscFunctionBegin;
1625c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
163*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
164*8f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
165*8f69470aSLisandro Dalcin   if (!draw->ops->line) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing lines",((PetscObject)draw)->type_name);
1665c6c1daeSBarry Smith   ierr = (*draw->ops->line)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr);
1675c6c1daeSBarry Smith   PetscFunctionReturn(0);
1685c6c1daeSBarry Smith }
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith #undef __FUNCT__
1715c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawArrow"
1725c6c1daeSBarry Smith /*@
1735c6c1daeSBarry Smith    PetscDrawArrow - PetscDraws a line with arrow head at end if the line is long enough
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith    Not collective
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith    Input Parameters:
1785c6c1daeSBarry Smith +  draw - the drawing context
1795c6c1daeSBarry Smith .  xl,yl,xr,yr - the coordinates of the line endpoints
1805c6c1daeSBarry Smith -  cl - the colors of the endpoints
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith    Level: beginner
1835c6c1daeSBarry Smith 
1845c6c1daeSBarry Smith    Concepts: line^drawing
1855c6c1daeSBarry Smith    Concepts: drawing^line
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith @*/
1885c6c1daeSBarry Smith PetscErrorCode  PetscDrawArrow(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl)
1895c6c1daeSBarry Smith {
1905c6c1daeSBarry Smith   PetscErrorCode ierr;
191*8f69470aSLisandro Dalcin   PetscBool      isnull;
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith   PetscFunctionBegin;
1945c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
195*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
196*8f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
197*8f69470aSLisandro Dalcin   if (!draw->ops->arrow) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing arrows",((PetscObject)draw)->type_name);
1985c6c1daeSBarry Smith   ierr = (*draw->ops->arrow)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr);
1995c6c1daeSBarry Smith   PetscFunctionReturn(0);
2005c6c1daeSBarry Smith }
2015c6c1daeSBarry Smith 
202*8f69470aSLisandro Dalcin #undef __FUNCT__
203*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawLineSetWidth"
204*8f69470aSLisandro Dalcin /*@
205*8f69470aSLisandro Dalcin    PetscDrawLineSetWidth - Sets the line width for future draws.  The width is
206*8f69470aSLisandro Dalcin    relative to the user coordinates of the window; 0.0 denotes the natural
207*8f69470aSLisandro Dalcin    width; 1.0 denotes the entire viewport.
208*8f69470aSLisandro Dalcin 
209*8f69470aSLisandro Dalcin    Not collective
210*8f69470aSLisandro Dalcin 
211*8f69470aSLisandro Dalcin    Input Parameters:
212*8f69470aSLisandro Dalcin +  draw - the drawing context
213*8f69470aSLisandro Dalcin -  width - the width in user coordinates
214*8f69470aSLisandro Dalcin 
215*8f69470aSLisandro Dalcin    Level: advanced
216*8f69470aSLisandro Dalcin 
217*8f69470aSLisandro Dalcin    Concepts: line^width
218*8f69470aSLisandro Dalcin 
219*8f69470aSLisandro Dalcin .seealso:  PetscDrawLineGetWidth()
220*8f69470aSLisandro Dalcin @*/
221*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawLineSetWidth(PetscDraw draw,PetscReal width)
222*8f69470aSLisandro Dalcin {
223*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
224*8f69470aSLisandro Dalcin 
225*8f69470aSLisandro Dalcin   PetscFunctionBegin;
226*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
227*8f69470aSLisandro Dalcin   if (draw->ops->linesetwidth) {
228*8f69470aSLisandro Dalcin     ierr = (*draw->ops->linesetwidth)(draw,width);CHKERRQ(ierr);
229*8f69470aSLisandro Dalcin   }
230*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
231*8f69470aSLisandro Dalcin }
232*8f69470aSLisandro Dalcin 
233*8f69470aSLisandro Dalcin #undef __FUNCT__
234*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawLineGetWidth"
235*8f69470aSLisandro Dalcin /*@
236*8f69470aSLisandro Dalcin    PetscDrawLineGetWidth - Gets the line width for future draws.  The width is
237*8f69470aSLisandro Dalcin    relative to the user coordinates of the window; 0.0 denotes the natural
238*8f69470aSLisandro Dalcin    width; 1.0 denotes the interior viewport.
239*8f69470aSLisandro Dalcin 
240*8f69470aSLisandro Dalcin    Not collective
241*8f69470aSLisandro Dalcin 
242*8f69470aSLisandro Dalcin    Input Parameter:
243*8f69470aSLisandro Dalcin .  draw - the drawing context
244*8f69470aSLisandro Dalcin 
245*8f69470aSLisandro Dalcin    Output Parameter:
246*8f69470aSLisandro Dalcin .  width - the width in user coordinates
247*8f69470aSLisandro Dalcin 
248*8f69470aSLisandro Dalcin    Level: advanced
249*8f69470aSLisandro Dalcin 
250*8f69470aSLisandro Dalcin    Notes:
251*8f69470aSLisandro Dalcin    Not currently implemented.
252*8f69470aSLisandro Dalcin 
253*8f69470aSLisandro Dalcin    Concepts: line^width
254*8f69470aSLisandro Dalcin 
255*8f69470aSLisandro Dalcin .seealso:  PetscDrawLineSetWidth()
256*8f69470aSLisandro Dalcin @*/
257*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawLineGetWidth(PetscDraw draw,PetscReal *width)
258*8f69470aSLisandro Dalcin {
259*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
260*8f69470aSLisandro Dalcin   PetscBool      isnull;
261*8f69470aSLisandro Dalcin 
262*8f69470aSLisandro Dalcin   PetscFunctionBegin;
263*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
264*8f69470aSLisandro Dalcin   PetscValidScalarPointer(width,2);
265*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
266*8f69470aSLisandro Dalcin   if (isnull) {*width = 0.0; PetscFunctionReturn(0);}
267*8f69470aSLisandro Dalcin   if (!draw->ops->linegetwidth) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support getting line width",((PetscObject)draw)->type_name);
268*8f69470aSLisandro Dalcin   ierr = (*draw->ops->linegetwidth)(draw,width);CHKERRQ(ierr);
269*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
270*8f69470aSLisandro Dalcin }
271*8f69470aSLisandro Dalcin 
272