xref: /petsc/src/sys/classes/draw/interface/dline.c (revision 27f49a208b01d2e827ab9db411a2d16003fe9262)
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: `PetscDraw`, `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(PETSC_SUCCESS);
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: `PetscDraw`, `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(PETSC_SUCCESS);
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: `PetscDraw`, `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(PETSC_SUCCESS);
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: `PetscDraw`, `PetscDrawPushCurrentPoint()`, `PetscDrawPopCurrentPoint()`, `PetscDrawGetCurrentPoint()`
97 @*/
98 PetscErrorCode PetscDrawPushCurrentPoint(PetscDraw draw, PetscReal x, PetscReal y)
99 {
100   PetscFunctionBegin;
101   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
102   PetscCheck(draw->currentpoint <= 19, 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(PETSC_SUCCESS);
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: `PetscDraw`, `PetscDrawPushCurrentPoint()`, `PetscDrawSetCurrentPoint()`, `PetscDrawGetCurrentPoint()`
119 @*/
120 PetscErrorCode PetscDrawPopCurrentPoint(PetscDraw draw)
121 {
122   PetscFunctionBegin;
123   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
124   PetscCheck(draw->currentpoint-- > 0, PETSC_COMM_SELF, PETSC_ERR_SUP, "You have popped too many current points");
125   PetscFunctionReturn(PETSC_SUCCESS);
126 }
127 
128 /*@
129    PetscDrawLine - draws 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 .seealso: `PetscDraw`, `PetscDrawArrow()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
141           `PetscDrawMarker()`, `PetscDrawPoint()`
142 @*/
143 PetscErrorCode PetscDrawLine(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int cl)
144 {
145   PetscFunctionBegin;
146   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
147   PetscUseTypeMethod(draw, line, xl, yl, xr, yr, cl);
148   PetscFunctionReturn(PETSC_SUCCESS);
149 }
150 
151 /*@
152    PetscDrawArrow - draws a line with arrow head at end if the line is long enough
153 
154    Not Collective
155 
156    Input Parameters:
157 +  draw - the drawing context
158 .  xl,yl,xr,yr - the coordinates of the line endpoints
159 -  cl - the colors of the endpoints
160 
161    Level: beginner
162 
163 .seealso: `PetscDraw`, `PetscDrawLine()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
164           `PetscDrawMarker()`, `PetscDrawPoint()`
165 @*/
166 PetscErrorCode PetscDrawArrow(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int cl)
167 {
168   PetscFunctionBegin;
169   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
170   PetscUseTypeMethod(draw, arrow, xl, yl, xr, yr, cl);
171   PetscFunctionReturn(PETSC_SUCCESS);
172 }
173 
174 /*@
175    PetscDrawLineSetWidth - Sets the line width for future draws.  The width is
176    relative to the user coordinates of the window; 0.0 denotes the natural
177    width; 1.0 denotes the entire viewport.
178 
179    Not Collective
180 
181    Input Parameters:
182 +  draw - the drawing context
183 -  width - the width in user coordinates
184 
185    Level: advanced
186 
187 .seealso: `PetscDraw`, `PetscDrawLineGetWidth()`, `PetscDrawLine()`, `PetscDrawArrow()`
188 @*/
189 PetscErrorCode PetscDrawLineSetWidth(PetscDraw draw, PetscReal width)
190 {
191   PetscFunctionBegin;
192   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
193   PetscTryTypeMethod(draw, linesetwidth, width);
194   PetscFunctionReturn(PETSC_SUCCESS);
195 }
196 
197 /*@
198    PetscDrawLineGetWidth - Gets the line width for future draws.  The width is
199    relative to the user coordinates of the window; 0.0 denotes the natural
200    width; 1.0 denotes the interior viewport.
201 
202    Not Collective
203 
204    Input Parameter:
205 .  draw - the drawing context
206 
207    Output Parameter:
208 .  width - the width in user coordinates
209 
210    Level: advanced
211 
212    Note:
213    Not currently implemented.
214 
215 .seealso: `PetscDraw`, `PetscDrawLineSetWidth()`, `PetscDrawLine()`, `PetscDrawArrow()`
216 @*/
217 PetscErrorCode PetscDrawLineGetWidth(PetscDraw draw, PetscReal *width)
218 {
219   PetscFunctionBegin;
220   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
221   PetscValidRealPointer(width, 2);
222   PetscUseTypeMethod(draw, linegetwidth, width);
223   PetscFunctionReturn(PETSC_SUCCESS);
224 }
225