Actual source code: dtext.c
1: /*
2: Provides the calling sequences for all the basic PetscDraw routines.
3: */
4: #include <petsc/private/drawimpl.h>
6: /*@C
7: PetscDrawString - PetscDraws text onto a drawable.
9: Not Collective
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
17: Level: beginner
19: .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
20: PetscDrawStringGetSize(), PetscDrawLine(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
21: PetscDrawMarker(), PetscDrawPoint()
23: @*/
24: PetscErrorCode PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
25: {
29: (*draw->ops->string)(draw,xl,yl,cl,text);
30: return 0;
31: }
33: /*@C
34: PetscDrawStringVertical - PetscDraws text onto a drawable.
36: Not Collective
38: Input Parameters:
39: + draw - the drawing context
40: . xl,yl - the coordinates of upper left corner of text
41: . cl - the color of the text
42: - text - the text to draw
44: Level: beginner
46: .seealso: PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
47: PetscDrawStringGetSize()
49: @*/
50: PetscErrorCode PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
51: {
52: int i;
53: char chr[2] = {0, 0};
54: PetscReal tw,th;
59: if (draw->ops->stringvertical) {
60: (*draw->ops->stringvertical)(draw,xl,yl,cl,text);
61: return 0;
62: }
63: PetscDrawStringGetSize(draw,&tw,&th);
64: for (i = 0; (chr[0] = text[i]); i++) {
65: PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);
66: }
67: return 0;
68: }
70: /*@C
71: PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
73: Not Collective
75: Input Parameters:
76: + draw - the drawing context
77: . xc - the coordinates of right-left center of text
78: . yl - the coordinates of lower edge of text
79: . cl - the color of the text
80: - text - the text to draw
82: Level: beginner
84: .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
85: PetscDrawStringGetSize()
87: @*/
88: PetscErrorCode PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
89: {
90: size_t len;
91: PetscReal tw,th;
96: PetscDrawStringGetSize(draw,&tw,&th);
97: PetscStrlen(text,&len);
98: xc = xc - len*tw/2;
99: PetscDrawString(draw,xc,yl,cl,text);
100: return 0;
101: }
103: /*@C
104: PetscDrawStringBoxed - Draws a string with a box around it
106: Not Collective
108: Input Parameters:
109: + draw - the drawing context
110: . sxl - the coordinates of center of the box
111: . syl - the coordinates of top line of box
112: . sc - the color of the text
113: . bc - the color of the bounding box
114: - text - the text to draw
116: Output Parameter:
117: . w,h - width and height of resulting box (optional)
119: Level: beginner
121: .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringSetSize(),
122: PetscDrawStringGetSize()
124: @*/
125: PetscErrorCode PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
126: {
127: PetscReal top,left,right,bottom,tw,th;
128: size_t len,mlen = 0;
129: char **array;
130: int cnt,i;
135: if (draw->ops->boxedstring) {
136: (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);
137: return 0;
138: }
140: PetscStrToArray(text,'\n',&cnt,&array);
141: for (i=0; i<cnt; i++) {
142: PetscStrlen(array[i],&len);
143: mlen = PetscMax(mlen,len);
144: }
146: PetscDrawStringGetSize(draw,&tw,&th);
148: top = syl;
149: left = sxl - .5*(mlen + 2)*tw;
150: right = sxl + .5*(mlen + 2)*tw;
151: bottom = syl - (1.0 + cnt)*th;
152: if (w) *w = right - left;
153: if (h) *h = top - bottom;
155: /* compute new bounding box */
156: draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
157: draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
158: draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
159: draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
161: /* top, left, bottom, right lines */
162: PetscDrawLine(draw,left,top,right,top,bc);
163: PetscDrawLine(draw,left,bottom,left,top,bc);
164: PetscDrawLine(draw,right,bottom,right,top,bc);
165: PetscDrawLine(draw,left,bottom,right,bottom,bc);
167: for (i=0; i<cnt; i++) {
168: PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);
169: }
170: PetscStrToArrayDestroy(cnt,array);
171: return 0;
172: }
174: /*@
175: PetscDrawStringSetSize - Sets the size for character text.
177: Not Collective
179: Input Parameters:
180: + draw - the drawing context
181: . width - the width in user coordinates
182: - height - the character height in user coordinates
184: Level: advanced
186: Note:
187: Only a limited range of sizes are available.
189: .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
190: PetscDrawStringGetSize()
192: @*/
193: PetscErrorCode PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
194: {
196: if (draw->ops->stringsetsize) {
197: (*draw->ops->stringsetsize)(draw,width,height);
198: }
199: return 0;
200: }
202: /*@
203: PetscDrawStringGetSize - Gets the size for character text. The width is
204: relative to the user coordinates of the window.
206: Not Collective
208: Input Parameters:
209: + draw - the drawing context
210: . width - the width in user coordinates
211: - height - the character height
213: Level: advanced
215: .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
216: PetscDrawStringSetSize()
218: @*/
219: PetscErrorCode PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
220: {
223: (*draw->ops->stringgetsize)(draw,width,height);
224: return 0;
225: }