xref: /petsc/src/sys/classes/draw/interface/drect.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
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,&yend);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