xref: /petsc/src/sys/classes/draw/interface/dline.c (revision 5b6bfdb9644f185dbf5e5a09b808ec241507e1e7)
1 
2 /*
3        Provides the calling sequences for all the basic PetscDraw routines.
4 */
5 #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6 
7 /*@
8    PetscDrawGetBoundingBox - Gets the bounding box of all PetscDrawStringBoxed() commands
9 
10    Not collective
11 
12    Input Parameter:
13 .  draw - the drawing context
14 
15    Output Parameters:
16 .   xl,yl,xr,yr - coordinates of lower left and upper right corners of bounding box
17 
18    Level: intermediate
19 
20 .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint()
21 @*/
22 PetscErrorCode  PetscDrawGetBoundingBox(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
23 {
24   PetscFunctionBegin;
25   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
26   if (xl) PetscValidRealPointer(xl,2);
27   if (yl) PetscValidRealPointer(yl,3);
28   if (xr) PetscValidRealPointer(xr,4);
29   if (yr) PetscValidRealPointer(yr,5);
30   if (xl) *xl = draw->boundbox_xl;
31   if (yl) *yl = draw->boundbox_yl;
32   if (xr) *xr = draw->boundbox_xr;
33   if (yr) *yr = draw->boundbox_yr;
34   PetscFunctionReturn(0);
35 }
36 
37 /*@
38    PetscDrawGetCurrentPoint - Gets the current draw point, some codes use this point to determine where to draw next
39 
40    Not collective
41 
42    Input Parameter:
43 .  draw - the drawing context
44 
45    Output Parameters:
46 .   x,y - the current point
47 
48    Level: intermediate
49 
50 .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawSetCurrentPoint()
51 @*/
52 PetscErrorCode  PetscDrawGetCurrentPoint(PetscDraw draw,PetscReal *x,PetscReal *y)
53 {
54   PetscFunctionBegin;
55   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
56   PetscValidRealPointer(x,2);
57   PetscValidRealPointer(y,3);
58   *x = draw->currentpoint_x[draw->currentpoint];
59   *y = draw->currentpoint_y[draw->currentpoint];
60   PetscFunctionReturn(0);
61 }
62 
63 /*@
64    PetscDrawSetCurrentPoint - Sets the current draw point, some codes use this point to determine where to draw next
65 
66    Not collective
67 
68    Input Parameters:
69 +  draw - the drawing context
70 -  x,y - the location of the current point
71 
72    Level: intermediate
73 
74 .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint()
75 @*/
76 PetscErrorCode  PetscDrawSetCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y)
77 {
78   PetscFunctionBegin;
79   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
80   draw->currentpoint_x[draw->currentpoint] = x;
81   draw->currentpoint_y[draw->currentpoint] = y;
82   PetscFunctionReturn(0);
83 }
84 
85 /*@
86    PetscDrawPushCurrentPoint - Pushes a new current draw point, retaining the old one, some codes use this point to determine where to draw next
87 
88    Not collective
89 
90    Input Parameters:
91 +  draw - the drawing context
92 -  x,y - the location of the current point
93 
94    Level: intermediate
95 
96 .seealso:  PetscDrawPushCurrentPoint(), PetscDrawPopCurrentPoint(), PetscDrawGetCurrentPoint()
97 @*/
98 PetscErrorCode  PetscDrawPushCurrentPoint(PetscDraw draw,PetscReal x,PetscReal y)
99 {
100   PetscFunctionBegin;
101   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
102   if (draw->currentpoint > 19) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have pushed too many current points");
103   draw->currentpoint_x[++draw->currentpoint] = x;
104   draw->currentpoint_y[draw->currentpoint]   = y;
105   PetscFunctionReturn(0);
106 }
107 
108 /*@
109    PetscDrawPopCurrentPoint - Pops a current draw point (discarding it)
110 
111    Not collective
112 
113    Input Parameter:
114 .  draw - the drawing context
115 
116    Level: intermediate
117 
118 .seealso:  PetscDrawPushCurrentPoint(), PetscDrawSetCurrentPoint(), PetscDrawGetCurrentPoint()
119 @*/
120 PetscErrorCode  PetscDrawPopCurrentPoint(PetscDraw draw)
121 {
122   PetscFunctionBegin;
123   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
124   if (draw->currentpoint-- == 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"You have popped too many current points");
125   PetscFunctionReturn(0);
126 }
127 
128 /*@
129    PetscDrawLine - PetscDraws a line onto a drawable.
130 
131    Not collective
132 
133    Input Parameters:
134 +  draw - the drawing context
135 .  xl,yl,xr,yr - the coordinates of the line endpoints
136 -  cl - the colors of the endpoints
137 
138    Level: beginner
139 
140    Concepts: line^drawing
141    Concepts: drawing^line
142 
143 .seealso: PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
144           PetscDrawMarker(), PetscDrawPoint()
145 
146 @*/
147 PetscErrorCode  PetscDrawLine(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl)
148 {
149   PetscErrorCode ierr;
150 
151   PetscFunctionBegin;
152   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
153   if (!draw->ops->line) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing lines",((PetscObject)draw)->type_name);
154   ierr = (*draw->ops->line)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr);
155   PetscFunctionReturn(0);
156 }
157 
158 /*@
159    PetscDrawArrow - PetscDraws a line with arrow head at end if the line is long enough
160 
161    Not collective
162 
163    Input Parameters:
164 +  draw - the drawing context
165 .  xl,yl,xr,yr - the coordinates of the line endpoints
166 -  cl - the colors of the endpoints
167 
168    Level: beginner
169 
170    Concepts: line^drawing
171    Concepts: drawing^line
172 
173 .seealso: PetscDrawLine(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
174           PetscDrawMarker(), PetscDrawPoint()
175 
176 @*/
177 PetscErrorCode  PetscDrawArrow(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl)
178 {
179   PetscErrorCode ierr;
180 
181   PetscFunctionBegin;
182   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
183   if (!draw->ops->arrow) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing arrows",((PetscObject)draw)->type_name);
184   ierr = (*draw->ops->arrow)(draw,xl,yl,xr,yr,cl);CHKERRQ(ierr);
185   PetscFunctionReturn(0);
186 }
187 
188 /*@
189    PetscDrawLineSetWidth - Sets the line width for future draws.  The width is
190    relative to the user coordinates of the window; 0.0 denotes the natural
191    width; 1.0 denotes the entire viewport.
192 
193    Not collective
194 
195    Input Parameters:
196 +  draw - the drawing context
197 -  width - the width in user coordinates
198 
199    Level: advanced
200 
201    Concepts: line^width
202 
203 .seealso:  PetscDrawLineGetWidth(), PetscDrawLine(), PetscDrawArrow()
204 @*/
205 PetscErrorCode  PetscDrawLineSetWidth(PetscDraw draw,PetscReal width)
206 {
207   PetscErrorCode ierr;
208 
209   PetscFunctionBegin;
210   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
211   if (draw->ops->linesetwidth) {
212     ierr = (*draw->ops->linesetwidth)(draw,width);CHKERRQ(ierr);
213   }
214   PetscFunctionReturn(0);
215 }
216 
217 /*@
218    PetscDrawLineGetWidth - Gets the line width for future draws.  The width is
219    relative to the user coordinates of the window; 0.0 denotes the natural
220    width; 1.0 denotes the interior viewport.
221 
222    Not collective
223 
224    Input Parameter:
225 .  draw - the drawing context
226 
227    Output Parameter:
228 .  width - the width in user coordinates
229 
230    Level: advanced
231 
232    Notes:
233    Not currently implemented.
234 
235    Concepts: line^width
236 
237 .seealso:  PetscDrawLineSetWidth(), PetscDrawLine(), PetscDrawArrow()
238 @*/
239 PetscErrorCode  PetscDrawLineGetWidth(PetscDraw draw,PetscReal *width)
240 {
241   PetscErrorCode ierr;
242 
243   PetscFunctionBegin;
244   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
245   PetscValidScalarPointer(width,2);
246   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);
247   ierr = (*draw->ops->linegetwidth)(draw,width);CHKERRQ(ierr);
248   PetscFunctionReturn(0);
249 }
250 
251