xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith /*
3*5c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
4*5c6c1daeSBarry Smith */
5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith #undef __FUNCT__
8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawString"
9*5c6c1daeSBarry Smith /*@C
10*5c6c1daeSBarry Smith    PetscDrawString - PetscDraws text onto a drawable.
11*5c6c1daeSBarry Smith 
12*5c6c1daeSBarry Smith    Not Collective
13*5c6c1daeSBarry Smith 
14*5c6c1daeSBarry Smith    Input Parameters:
15*5c6c1daeSBarry Smith +  draw - the drawing context
16*5c6c1daeSBarry Smith .  xl - the coordinates of lower left corner of text
17*5c6c1daeSBarry Smith .  yl - the coordinates of lower left corner of text
18*5c6c1daeSBarry Smith .  cl - the color of the text
19*5c6c1daeSBarry Smith -  text - the text to draw
20*5c6c1daeSBarry Smith 
21*5c6c1daeSBarry Smith    Level: beginner
22*5c6c1daeSBarry Smith 
23*5c6c1daeSBarry Smith    Concepts: drawing^string
24*5c6c1daeSBarry Smith    Concepts: string^drawing
25*5c6c1daeSBarry Smith 
26*5c6c1daeSBarry Smith .seealso: PetscDrawStringVertical()
27*5c6c1daeSBarry Smith 
28*5c6c1daeSBarry Smith @*/
29*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
30*5c6c1daeSBarry Smith {
31*5c6c1daeSBarry Smith   PetscErrorCode ierr;
32*5c6c1daeSBarry Smith   PetscBool      isnull;
33*5c6c1daeSBarry Smith 
34*5c6c1daeSBarry Smith   PetscFunctionBegin;
35*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
36*5c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
37*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
38*5c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
39*5c6c1daeSBarry Smith   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
40*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
41*5c6c1daeSBarry Smith }
42*5c6c1daeSBarry Smith 
43*5c6c1daeSBarry Smith #undef __FUNCT__
44*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawBoxedString"
45*5c6c1daeSBarry Smith /*@C
46*5c6c1daeSBarry Smith    PetscDrawBoxedString - Draws a string with a box around it
47*5c6c1daeSBarry Smith 
48*5c6c1daeSBarry Smith    Not Collective
49*5c6c1daeSBarry Smith 
50*5c6c1daeSBarry Smith    Input Parameters:
51*5c6c1daeSBarry Smith +  draw - the drawing context
52*5c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
53*5c6c1daeSBarry Smith .  syl - the coordinates of top line of box
54*5c6c1daeSBarry Smith .  sc - the color of the text
55*5c6c1daeSBarry Smith .  bc - the color of the bounding box
56*5c6c1daeSBarry Smith -  text - the text to draw
57*5c6c1daeSBarry Smith 
58*5c6c1daeSBarry Smith    Output Parameter:
59*5c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
60*5c6c1daeSBarry Smith 
61*5c6c1daeSBarry Smith    Level: beginner
62*5c6c1daeSBarry Smith 
63*5c6c1daeSBarry Smith    Concepts: drawing^string
64*5c6c1daeSBarry Smith    Concepts: string^drawing
65*5c6c1daeSBarry Smith 
66*5c6c1daeSBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawBoxedStringSize()
67*5c6c1daeSBarry Smith 
68*5c6c1daeSBarry Smith @*/
69*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawBoxedString(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
70*5c6c1daeSBarry Smith {
71*5c6c1daeSBarry Smith   PetscErrorCode ierr ;
72*5c6c1daeSBarry Smith   PetscBool      isnull;
73*5c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
74*5c6c1daeSBarry Smith   size_t         len,mlen = 0;
75*5c6c1daeSBarry Smith   char           **array;
76*5c6c1daeSBarry Smith   int            cnt,i;
77*5c6c1daeSBarry Smith 
78*5c6c1daeSBarry Smith   PetscFunctionBegin;
79*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
80*5c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
81*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
82*5c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
83*5c6c1daeSBarry Smith 
84*5c6c1daeSBarry Smith   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
85*5c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
86*5c6c1daeSBarry Smith     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
87*5c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
88*5c6c1daeSBarry Smith   }
89*5c6c1daeSBarry Smith 
90*5c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
91*5c6c1daeSBarry Smith 
92*5c6c1daeSBarry Smith   top    = syl;
93*5c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
94*5c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
95*5c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
96*5c6c1daeSBarry Smith   if (w) *w = right - left;
97*5c6c1daeSBarry Smith   if (h) *h = top - bottom;
98*5c6c1daeSBarry Smith 
99*5c6c1daeSBarry Smith   /* compute new bounding box */
100*5c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
101*5c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
102*5c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
103*5c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
104*5c6c1daeSBarry Smith 
105*5c6c1daeSBarry Smith   /* top, left, bottom, right lines */
106*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
107*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
108*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
109*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
110*5c6c1daeSBarry Smith 
111*5c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
112*5c6c1daeSBarry Smith     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
113*5c6c1daeSBarry Smith   }
114*5c6c1daeSBarry Smith   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
115*5c6c1daeSBarry Smith 
116*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
117*5c6c1daeSBarry Smith }
118