Actual source code: dtext.c
petsc-3.6.4 2016-04-12
2: /*
3: Provides the calling sequences for all the basic PetscDraw routines.
4: */
5: #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
9: /*@C
10: PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
12: Not Collective
14: Input Parameters:
15: + draw - the drawing context
16: . xc - the coordinates of right-left center of text
17: . yl - the coordinates of lower edge of text
18: . cl - the color of the text
19: - text - the text to draw
21: Level: beginner
23: Concepts: drawing^string
24: Concepts: string^drawing
26: .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed()
28: @*/
29: PetscErrorCode PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
30: {
32: PetscBool isnull;
33: size_t len;
34: PetscReal tw,th;
39: PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);
40: if (isnull) return(0);
42: PetscDrawStringGetSize(draw,&tw,&th);
43: PetscStrlen(text,&len);
44: xc = xc - .5*len*tw;
45: PetscDrawString(draw,xc,yl,cl,text);
46: return(0);
47: }
52: /*@C
53: PetscDrawString - PetscDraws text onto a drawable.
55: Not Collective
57: Input Parameters:
58: + draw - the drawing context
59: . xl - the coordinates of lower left corner of text
60: . yl - the coordinates of lower left corner of text
61: . cl - the color of the text
62: - text - the text to draw
64: Level: beginner
66: Concepts: drawing^string
67: Concepts: string^drawing
69: .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed()
71: @*/
72: PetscErrorCode PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
73: {
75: PetscBool isnull;
80: PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);
81: if (isnull) return(0);
82: (*draw->ops->string)(draw,xl,yl,cl,text);
83: return(0);
84: }
88: /*@C
89: PetscDrawStringBoxed - Draws a string with a box around it
91: Not Collective
93: Input Parameters:
94: + draw - the drawing context
95: . sxl - the coordinates of center of the box
96: . syl - the coordinates of top line of box
97: . sc - the color of the text
98: . bc - the color of the bounding box
99: - text - the text to draw
101: Output Parameter:
102: . w,h - width and height of resulting box (optional)
104: Level: beginner
106: Concepts: drawing^string
107: Concepts: string^drawing
109: .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered()
111: @*/
112: PetscErrorCode PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
113: {
115: PetscBool isnull;
116: PetscReal top,left,right,bottom,tw,th;
117: size_t len,mlen = 0;
118: char **array;
119: int cnt,i;
124: PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);
125: if (isnull) return(0);
127: if (draw->ops->boxedstring) {
128: (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);
129: return(0);
130: }
132: PetscStrToArray(text,'\n',&cnt,&array);
133: for (i=0; i<cnt; i++) {
134: PetscStrlen(array[i],&len);
135: mlen = PetscMax(mlen,len);
136: }
138: PetscDrawStringGetSize(draw,&tw,&th);
140: top = syl;
141: left = sxl - .5*(mlen + 2)*tw;
142: right = sxl + .5*(mlen + 2)*tw;
143: bottom = syl - (1.0 + cnt)*th;
144: if (w) *w = right - left;
145: if (h) *h = top - bottom;
147: /* compute new bounding box */
148: draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
149: draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
150: draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
151: draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
153: /* top, left, bottom, right lines */
154: PetscDrawLine(draw,left,top,right,top,bc);
155: PetscDrawLine(draw,left,bottom,left,top,bc);
156: PetscDrawLine(draw,right,bottom,right,top,bc);
157: PetscDrawLine(draw,left,bottom,right,bottom,bc);
159: for (i=0; i<cnt; i++) {
160: PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);
161: }
162: PetscStrToArrayDestroy(cnt,array);
163: return(0);
164: }