1 /*
2        Provides the calling sequences for all the basic PetscDraw routines.
3 */
4 #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
5 
6 /*@C
7    PetscDrawString - PetscDraws text onto a drawable.
8 
9    Not Collective
10 
11    Input Parameters:
12 +  draw - the drawing context
13 .  xl,yl - the coordinates of lower left corner of text
14 .  cl - the color of the text
15 -  text - the text to draw
16 
17    Level: beginner
18 
19 
20 .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
21           PetscDrawStringGetSize(), PetscDrawLine(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
22           PetscDrawMarker(), PetscDrawPoint()
23 
24 @*/
PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])25 PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
26 {
27   PetscErrorCode ierr;
28 
29   PetscFunctionBegin;
30   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
31   PetscValidCharPointer(text,5);
32   if (!draw->ops->string) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing strings",((PetscObject)draw)->type_name);
33   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
34   PetscFunctionReturn(0);
35 }
36 
37 /*@C
38    PetscDrawStringVertical - PetscDraws text onto a drawable.
39 
40    Not Collective
41 
42    Input Parameters:
43 +  draw - the drawing context
44 .  xl,yl - the coordinates of upper left corner of text
45 .  cl - the color of the text
46 -  text - the text to draw
47 
48    Level: beginner
49 
50 .seealso: PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
51           PetscDrawStringGetSize()
52 
53 @*/
PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])54 PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
55 {
56   int            i;
57   char           chr[2] = {0, 0};
58   PetscReal      tw,th;
59   PetscErrorCode ierr;
60 
61   PetscFunctionBegin;
62   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
63   PetscValidCharPointer(text,5);
64 
65   if (draw->ops->stringvertical) {
66     ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr);
67     PetscFunctionReturn(0);
68   }
69   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
70   for (i = 0; (chr[0] = text[i]); i++) {
71     ierr = PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);CHKERRQ(ierr);
72   }
73   PetscFunctionReturn(0);
74 }
75 
76 /*@C
77    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
78 
79    Not Collective
80 
81    Input Parameters:
82 +  draw - the drawing context
83 .  xc - the coordinates of right-left center of text
84 .  yl - the coordinates of lower edge of text
85 .  cl - the color of the text
86 -  text - the text to draw
87 
88    Level: beginner
89 
90 
91 .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
92           PetscDrawStringGetSize()
93 
94 @*/
PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])95 PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
96 {
97   PetscErrorCode ierr;
98   size_t         len;
99   PetscReal      tw,th;
100 
101   PetscFunctionBegin;
102   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
103   PetscValidCharPointer(text,5);
104 
105   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
106   ierr = PetscStrlen(text,&len);CHKERRQ(ierr);
107   xc   = xc - len*tw/2;
108   ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr);
109   PetscFunctionReturn(0);
110 }
111 
112 /*@C
113    PetscDrawStringBoxed - Draws a string with a box around it
114 
115    Not Collective
116 
117    Input Parameters:
118 +  draw - the drawing context
119 .  sxl - the coordinates of center of the box
120 .  syl - the coordinates of top line of box
121 .  sc - the color of the text
122 .  bc - the color of the bounding box
123 -  text - the text to draw
124 
125    Output Parameter:
126 .   w,h - width and height of resulting box (optional)
127 
128    Level: beginner
129 
130 
131 .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
132           PetscDrawStringGetSize()
133 
134 @*/
PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal * w,PetscReal * h)135 PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
136 {
137   PetscErrorCode ierr;
138   PetscReal      top,left,right,bottom,tw,th;
139   size_t         len,mlen = 0;
140   char           **array;
141   int            cnt,i;
142 
143   PetscFunctionBegin;
144   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
145   PetscValidCharPointer(text,5);
146 
147   if (draw->ops->boxedstring) {
148     ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr);
149     PetscFunctionReturn(0);
150   }
151 
152   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
153   for (i=0; i<cnt; i++) {
154     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
155     mlen = PetscMax(mlen,len);
156   }
157 
158   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
159 
160   top    = syl;
161   left   = sxl - .5*(mlen + 2)*tw;
162   right  = sxl + .5*(mlen + 2)*tw;
163   bottom = syl - (1.0 + cnt)*th;
164   if (w) *w = right - left;
165   if (h) *h = top - bottom;
166 
167   /* compute new bounding box */
168   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
169   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
170   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
171   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
172 
173   /* top, left, bottom, right lines */
174   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
175   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
176   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
177   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
178 
179   for  (i=0; i<cnt; i++) {
180     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
181   }
182   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
183   PetscFunctionReturn(0);
184 }
185 
186 /*@
187    PetscDrawStringSetSize - Sets the size for character text.
188 
189    Not Collective
190 
191    Input Parameters:
192 +  draw - the drawing context
193 .  width - the width in user coordinates
194 -  height - the character height in user coordinates
195 
196    Level: advanced
197 
198    Note:
199    Only a limited range of sizes are available.
200 
201 .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringBoxed(),
202           PetscDrawStringGetSize()
203 
204 @*/
PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)205 PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
206 {
207   PetscErrorCode ierr;
208 
209   PetscFunctionBegin;
210   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
211   if (draw->ops->stringsetsize) {
212     ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr);
213   }
214   PetscFunctionReturn(0);
215 }
216 
217 /*@
218    PetscDrawStringGetSize - Gets the size for character text.  The width is
219    relative to the user coordinates of the window.
220 
221    Not Collective
222 
223    Input Parameters:
224 +  draw - the drawing context
225 .  width - the width in user coordinates
226 -  height - the character height
227 
228    Level: advanced
229 
230 .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringBoxed(),
231           PetscDrawStringSetSize()
232 
233 @*/
PetscDrawStringGetSize(PetscDraw draw,PetscReal * width,PetscReal * height)234 PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
235 {
236   PetscErrorCode ierr;
237 
238   PetscFunctionBegin;
239   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
240   if (!draw->ops->stringgetsize) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support getting string size",((PetscObject)draw)->type_name);
241   ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr);
242   PetscFunctionReturn(0);
243 }
244 
245