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