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 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); 32*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&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,¥d);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); 79*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 805c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 81*8f69470aSLisandro Dalcin if (!draw->ops->coordinatetopixel) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support locating pixels",((PetscObject)draw)->type_name); 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); 110*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1115c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 112*8f69470aSLisandro Dalcin if (!draw->ops->pixeltocoordinate) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support locating coordinates",((PetscObject)draw)->type_name); 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); 143*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1445c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 145*8f69470aSLisandro Dalcin if (!draw->ops->rectangle) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing rectangles",((PetscObject)draw)->type_name); 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 1715c6c1daeSBarry Smith PetscFunctionBegin; 1725c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 173*8f69470aSLisandro Dalcin if (draw->ops->save) { 1745c6c1daeSBarry Smith ierr = (*draw->ops->save)(draw);CHKERRQ(ierr); 175*8f69470aSLisandro Dalcin } 1765c6c1daeSBarry Smith PetscFunctionReturn(0); 1775c6c1daeSBarry Smith } 178