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 8*5c6c1daeSBarry Smith #undef __FUNCT__ 9*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawIndicatorFunction" 10*5c6c1daeSBarry Smith /*@C 11*5c6c1daeSBarry Smith PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a PetscDraw 12*5c6c1daeSBarry Smith 13*5c6c1daeSBarry Smith Not collective 14*5c6c1daeSBarry Smith 15*5c6c1daeSBarry Smith Input Parameter: 16*5c6c1daeSBarry Smith + draw - a PetscDraw 17*5c6c1daeSBarry Smith . xmin,xmax,ymin,ymax - region to draw indicator function 18*5c6c1daeSBarry Smith - f - the indicator function 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith Level: developer 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith @*/ 23*5c6c1daeSBarry Smith PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax,int c,PetscErrorCode (*f)(void *,PetscReal,PetscReal,PetscBool*),void *ctx) 24*5c6c1daeSBarry Smith { 25*5c6c1daeSBarry Smith PetscInt xstart,ystart,xend,yend,i,j,tmp; 26*5c6c1daeSBarry Smith PetscErrorCode ierr; 27*5c6c1daeSBarry Smith PetscReal x,y; 28*5c6c1daeSBarry Smith PetscBool isnull,flg; 29*5c6c1daeSBarry Smith 30*5c6c1daeSBarry Smith PetscFunctionBegin; 31*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 32*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 33*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 34*5c6c1daeSBarry Smith 35*5c6c1daeSBarry Smith ierr = PetscDrawCoordinateToPixel(draw,xmin,ymin,&xstart,&ystart);CHKERRQ(ierr); 36*5c6c1daeSBarry Smith ierr = PetscDrawCoordinateToPixel(draw,xmax,ymax,&xend,¥d);CHKERRQ(ierr); 37*5c6c1daeSBarry Smith if (yend < ystart) { 38*5c6c1daeSBarry Smith tmp = ystart; 39*5c6c1daeSBarry Smith ystart = yend; 40*5c6c1daeSBarry Smith yend = tmp; 41*5c6c1daeSBarry Smith } 42*5c6c1daeSBarry Smith for (i=xstart; i<xend+1; i++) { 43*5c6c1daeSBarry Smith for (j=ystart; j<yend+1; j++) { 44*5c6c1daeSBarry Smith ierr = PetscDrawPixelToCoordinate(draw,i,j,&x,&y);CHKERRQ(ierr); 45*5c6c1daeSBarry Smith ierr = f(ctx,x,y,&flg);CHKERRQ(ierr); 46*5c6c1daeSBarry Smith if (flg) { 47*5c6c1daeSBarry Smith ierr = PetscDrawPointPixel(draw,i,j,c);CHKERRQ(ierr); 48*5c6c1daeSBarry Smith } 49*5c6c1daeSBarry Smith } 50*5c6c1daeSBarry Smith } 51*5c6c1daeSBarry Smith PetscFunctionReturn(0); 52*5c6c1daeSBarry Smith } 53*5c6c1daeSBarry Smith 54*5c6c1daeSBarry Smith 55*5c6c1daeSBarry Smith #undef __FUNCT__ 56*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCoordinateToPixel" 57*5c6c1daeSBarry Smith /*@C 58*5c6c1daeSBarry Smith PetscDrawCoordinateToPixel - given a coordinate in a PetscDraw returns the pixel location 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith Not collective 61*5c6c1daeSBarry Smith 62*5c6c1daeSBarry Smith Input Parameters: 63*5c6c1daeSBarry Smith + draw - the draw where the coordinates are defined 64*5c6c1daeSBarry Smith - x,y - the coordinate location 65*5c6c1daeSBarry Smith 66*5c6c1daeSBarry Smith Output Parameters: 67*5c6c1daeSBarry Smith - i,j - the pixel location 68*5c6c1daeSBarry Smith 69*5c6c1daeSBarry Smith Level: developer 70*5c6c1daeSBarry Smith 71*5c6c1daeSBarry Smith @*/ 72*5c6c1daeSBarry Smith PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw,PetscReal x,PetscReal y,PetscInt *i,PetscInt *j) 73*5c6c1daeSBarry Smith { 74*5c6c1daeSBarry Smith PetscErrorCode ierr; 75*5c6c1daeSBarry Smith PetscBool isnull; 76*5c6c1daeSBarry Smith 77*5c6c1daeSBarry Smith PetscFunctionBegin; 78*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 79*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 80*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 81*5c6c1daeSBarry Smith if (!draw->ops->coordinatetopixel) SETERRQ(((PetscObject)draw)->comm,PETSC_ERR_SUP,"No support for locating pixel"); 82*5c6c1daeSBarry Smith ierr = (*draw->ops->coordinatetopixel)(draw,x,y,i,j);CHKERRQ(ierr); 83*5c6c1daeSBarry Smith PetscFunctionReturn(0); 84*5c6c1daeSBarry Smith } 85*5c6c1daeSBarry Smith 86*5c6c1daeSBarry Smith #undef __FUNCT__ 87*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawPixelToCoordinate" 88*5c6c1daeSBarry Smith /*@C 89*5c6c1daeSBarry Smith PetscDrawPixelToCoordinate - given a pixel in a PetscDraw returns the coordinate 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith Not collective 92*5c6c1daeSBarry Smith 93*5c6c1daeSBarry Smith Input Parameters: 94*5c6c1daeSBarry Smith + draw - the draw where the coordinates are defined 95*5c6c1daeSBarry Smith - i,j - the pixel location 96*5c6c1daeSBarry Smith 97*5c6c1daeSBarry Smith Output Parameters: 98*5c6c1daeSBarry Smith . x,y - the coordinate location 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith Level: developer 101*5c6c1daeSBarry Smith 102*5c6c1daeSBarry Smith @*/ 103*5c6c1daeSBarry Smith PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw,PetscInt i,PetscInt j,PetscReal *x,PetscReal *y) 104*5c6c1daeSBarry Smith { 105*5c6c1daeSBarry Smith PetscErrorCode ierr; 106*5c6c1daeSBarry Smith PetscBool isnull; 107*5c6c1daeSBarry Smith 108*5c6c1daeSBarry Smith PetscFunctionBegin; 109*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 110*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 111*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 112*5c6c1daeSBarry Smith if (!draw->ops->pixeltocoordinate) SETERRQ(((PetscObject)draw)->comm,PETSC_ERR_SUP,"No support for locating coordiante from "); 113*5c6c1daeSBarry Smith ierr = (*draw->ops->pixeltocoordinate)(draw,i,j,x,y);CHKERRQ(ierr); 114*5c6c1daeSBarry Smith PetscFunctionReturn(0); 115*5c6c1daeSBarry Smith } 116*5c6c1daeSBarry Smith 117*5c6c1daeSBarry Smith #undef __FUNCT__ 118*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRectangle" 119*5c6c1daeSBarry Smith /*@ 120*5c6c1daeSBarry Smith PetscDrawRectangle - PetscDraws a rectangle onto a drawable. 121*5c6c1daeSBarry Smith 122*5c6c1daeSBarry Smith Not Collective 123*5c6c1daeSBarry Smith 124*5c6c1daeSBarry Smith Input Parameters: 125*5c6c1daeSBarry Smith + draw - the drawing context 126*5c6c1daeSBarry Smith . xl,yl,xr,yr - the coordinates of the lower left, upper right corners 127*5c6c1daeSBarry Smith - c1,c2,c3,c4 - the colors of the four corners in counter clockwise order 128*5c6c1daeSBarry Smith 129*5c6c1daeSBarry Smith Level: beginner 130*5c6c1daeSBarry Smith 131*5c6c1daeSBarry Smith Concepts: drawing^rectangle 132*5c6c1daeSBarry Smith Concepts: graphics^rectangle 133*5c6c1daeSBarry Smith Concepts: rectangle 134*5c6c1daeSBarry Smith 135*5c6c1daeSBarry Smith @*/ 136*5c6c1daeSBarry Smith PetscErrorCode PetscDrawRectangle(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4) 137*5c6c1daeSBarry Smith { 138*5c6c1daeSBarry Smith PetscErrorCode ierr; 139*5c6c1daeSBarry Smith PetscBool isnull; 140*5c6c1daeSBarry Smith 141*5c6c1daeSBarry Smith PetscFunctionBegin; 142*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 143*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 144*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 145*5c6c1daeSBarry Smith if (!draw->ops->rectangle) SETERRQ(((PetscObject)draw)->comm,PETSC_ERR_SUP,"No support for drawing rectangle"); 146*5c6c1daeSBarry Smith ierr = (*draw->ops->rectangle)(draw,xl,yl,xr,yr,c1,c2,c3,c4);CHKERRQ(ierr); 147*5c6c1daeSBarry Smith PetscFunctionReturn(0); 148*5c6c1daeSBarry Smith } 149*5c6c1daeSBarry Smith 150*5c6c1daeSBarry Smith #undef __FUNCT__ 151*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSave" 152*5c6c1daeSBarry Smith /*@ 153*5c6c1daeSBarry Smith PetscDrawSave - Saves a drawn image 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith Not Collective 156*5c6c1daeSBarry Smith 157*5c6c1daeSBarry Smith Input Parameters: 158*5c6c1daeSBarry Smith . draw - the drawing context 159*5c6c1daeSBarry Smith 160*5c6c1daeSBarry Smith Level: advanced 161*5c6c1daeSBarry Smith 162*5c6c1daeSBarry Smith Notes: this is not normally called by the user, it is called by PetscDrawClear_X() to save a sequence of images. 163*5c6c1daeSBarry Smith 164*5c6c1daeSBarry Smith .seealso: PetscDrawSetSave() 165*5c6c1daeSBarry Smith 166*5c6c1daeSBarry Smith @*/ 167*5c6c1daeSBarry Smith PetscErrorCode PetscDrawSave(PetscDraw draw) 168*5c6c1daeSBarry Smith { 169*5c6c1daeSBarry Smith PetscErrorCode ierr; 170*5c6c1daeSBarry Smith PetscBool isnull; 171*5c6c1daeSBarry Smith 172*5c6c1daeSBarry Smith PetscFunctionBegin; 173*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 174*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 175*5c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 176*5c6c1daeSBarry Smith if (!draw->ops->save) PetscFunctionReturn(0); 177*5c6c1daeSBarry Smith ierr = (*draw->ops->save)(draw);CHKERRQ(ierr); 178*5c6c1daeSBarry Smith PetscFunctionReturn(0); 179*5c6c1daeSBarry Smith } 180