xref: /petsc/src/sys/classes/draw/interface/drect.c (revision af0996ce37bc06907c37d8d91773840993d61e62)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5*af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith #undef __FUNCT__
95c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawIndicatorFunction"
105c6c1daeSBarry Smith /*@C
115c6c1daeSBarry Smith    PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a PetscDraw
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith    Not collective
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith    Input Parameter:
165c6c1daeSBarry Smith +  draw - a PetscDraw
175c6c1daeSBarry Smith .  xmin,xmax,ymin,ymax - region to draw indicator function
185c6c1daeSBarry Smith -  f - the indicator function
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith    Level: developer
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith @*/
235c6c1daeSBarry Smith PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax,int c,PetscErrorCode (*f)(void*,PetscReal,PetscReal,PetscBool*),void *ctx)
245c6c1daeSBarry Smith {
255c6c1daeSBarry Smith   PetscInt       xstart,ystart,xend,yend,i,j,tmp;
265c6c1daeSBarry Smith   PetscErrorCode ierr;
275c6c1daeSBarry Smith   PetscReal      x,y;
285c6c1daeSBarry Smith   PetscBool      isnull,flg;
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith   PetscFunctionBegin;
315c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
325c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
335c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith   ierr = PetscDrawCoordinateToPixel(draw,xmin,ymin,&xstart,&ystart);CHKERRQ(ierr);
365c6c1daeSBarry Smith   ierr = PetscDrawCoordinateToPixel(draw,xmax,ymax,&xend,&yend);CHKERRQ(ierr);
375c6c1daeSBarry Smith   if (yend < ystart) {
385c6c1daeSBarry Smith     tmp    = ystart;
395c6c1daeSBarry Smith     ystart = yend;
405c6c1daeSBarry Smith     yend   = tmp;
415c6c1daeSBarry Smith   }
425c6c1daeSBarry Smith   for (i=xstart; i<xend+1; i++) {
435c6c1daeSBarry Smith     for (j=ystart; j<yend+1; j++) {
445c6c1daeSBarry Smith       ierr = PetscDrawPixelToCoordinate(draw,i,j,&x,&y);CHKERRQ(ierr);
455c6c1daeSBarry Smith       ierr = f(ctx,x,y,&flg);CHKERRQ(ierr);
465c6c1daeSBarry Smith       if (flg) {
475c6c1daeSBarry Smith         ierr = PetscDrawPointPixel(draw,i,j,c);CHKERRQ(ierr);
485c6c1daeSBarry Smith       }
495c6c1daeSBarry Smith     }
505c6c1daeSBarry Smith   }
515c6c1daeSBarry Smith   PetscFunctionReturn(0);
525c6c1daeSBarry Smith }
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith #undef __FUNCT__
565c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCoordinateToPixel"
575c6c1daeSBarry Smith /*@C
585c6c1daeSBarry Smith    PetscDrawCoordinateToPixel - given a coordinate in a PetscDraw returns the pixel location
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith    Not collective
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith    Input Parameters:
635c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
645c6c1daeSBarry Smith -  x,y - the coordinate location
655c6c1daeSBarry Smith 
665c6c1daeSBarry Smith    Output Parameters:
675c6c1daeSBarry Smith -  i,j - the pixel location
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith    Level: developer
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith @*/
725c6c1daeSBarry Smith PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw,PetscReal x,PetscReal y,PetscInt *i,PetscInt *j)
735c6c1daeSBarry Smith {
745c6c1daeSBarry Smith   PetscErrorCode ierr;
755c6c1daeSBarry Smith   PetscBool      isnull;
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith   PetscFunctionBegin;
785c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
795c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
805c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
81ce94432eSBarry Smith   if (!draw->ops->coordinatetopixel) SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for locating pixel");
825c6c1daeSBarry Smith   ierr = (*draw->ops->coordinatetopixel)(draw,x,y,i,j);CHKERRQ(ierr);
835c6c1daeSBarry Smith   PetscFunctionReturn(0);
845c6c1daeSBarry Smith }
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith #undef __FUNCT__
875c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPixelToCoordinate"
885c6c1daeSBarry Smith /*@C
895c6c1daeSBarry Smith    PetscDrawPixelToCoordinate - given a pixel in a PetscDraw returns the coordinate
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith    Not collective
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith    Input Parameters:
945c6c1daeSBarry Smith +  draw - the draw where the coordinates are defined
955c6c1daeSBarry Smith -  i,j - the pixel location
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith    Output Parameters:
985c6c1daeSBarry Smith .  x,y - the coordinate location
995c6c1daeSBarry Smith 
1005c6c1daeSBarry Smith    Level: developer
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith @*/
1035c6c1daeSBarry Smith PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw,PetscInt i,PetscInt j,PetscReal *x,PetscReal *y)
1045c6c1daeSBarry Smith {
1055c6c1daeSBarry Smith   PetscErrorCode ierr;
1065c6c1daeSBarry Smith   PetscBool      isnull;
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   PetscFunctionBegin;
1095c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1105c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
1115c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
112ce94432eSBarry Smith   if (!draw->ops->pixeltocoordinate) SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for locating coordiante from ");
1135c6c1daeSBarry Smith   ierr = (*draw->ops->pixeltocoordinate)(draw,i,j,x,y);CHKERRQ(ierr);
1145c6c1daeSBarry Smith   PetscFunctionReturn(0);
1155c6c1daeSBarry Smith }
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith #undef __FUNCT__
1185c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRectangle"
1195c6c1daeSBarry Smith /*@
1205c6c1daeSBarry Smith    PetscDrawRectangle - PetscDraws a rectangle  onto a drawable.
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith    Not Collective
1235c6c1daeSBarry Smith 
1245c6c1daeSBarry Smith    Input Parameters:
1255c6c1daeSBarry Smith +  draw - the drawing context
1265c6c1daeSBarry Smith .  xl,yl,xr,yr - the coordinates of the lower left, upper right corners
1275c6c1daeSBarry Smith -  c1,c2,c3,c4 - the colors of the four corners in counter clockwise order
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith    Level: beginner
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith    Concepts: drawing^rectangle
1325c6c1daeSBarry Smith    Concepts: graphics^rectangle
1335c6c1daeSBarry Smith    Concepts: rectangle
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith @*/
1365c6c1daeSBarry Smith PetscErrorCode  PetscDrawRectangle(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4)
1375c6c1daeSBarry Smith {
1385c6c1daeSBarry Smith   PetscErrorCode ierr;
1395c6c1daeSBarry Smith   PetscBool      isnull;
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith   PetscFunctionBegin;
1425c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1435c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
1445c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
145ce94432eSBarry Smith   if (!draw->ops->rectangle) SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for drawing rectangle");
1465c6c1daeSBarry Smith   ierr = (*draw->ops->rectangle)(draw,xl,yl,xr,yr,c1,c2,c3,c4);CHKERRQ(ierr);
1475c6c1daeSBarry Smith   PetscFunctionReturn(0);
1485c6c1daeSBarry Smith }
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith #undef __FUNCT__
1515c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSave"
1525c6c1daeSBarry Smith /*@
1535c6c1daeSBarry Smith    PetscDrawSave - Saves a drawn image
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith    Not Collective
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith    Input Parameters:
1585c6c1daeSBarry Smith .  draw - the drawing context
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith    Level: advanced
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith    Notes: this is not normally called by the user, it is called by PetscDrawClear_X() to save a sequence of images.
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith .seealso: PetscDrawSetSave()
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith @*/
1675c6c1daeSBarry Smith PetscErrorCode  PetscDrawSave(PetscDraw draw)
1685c6c1daeSBarry Smith {
1695c6c1daeSBarry Smith   PetscErrorCode ierr;
1705c6c1daeSBarry Smith   PetscBool      isnull;
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith   PetscFunctionBegin;
1735c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1745c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
1755c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1765c6c1daeSBarry Smith   if (!draw->ops->save) PetscFunctionReturn(0);
1775c6c1daeSBarry Smith   ierr = (*draw->ops->save)(draw);CHKERRQ(ierr);
1785c6c1daeSBarry Smith   PetscFunctionReturn(0);
1795c6c1daeSBarry Smith }
180