xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 8f69470a7058bcc0cf21d9492705f60bbdfc5aa4)
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
35c6c1daeSBarry Smith */
4af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith #undef __FUNCT__
7*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawString"
8*8f69470aSLisandro Dalcin /*@C
9*8f69470aSLisandro Dalcin    PetscDrawString - PetscDraws text onto a drawable.
10*8f69470aSLisandro Dalcin 
11*8f69470aSLisandro Dalcin    Not Collective
12*8f69470aSLisandro Dalcin 
13*8f69470aSLisandro Dalcin    Input Parameters:
14*8f69470aSLisandro Dalcin +  draw - the drawing context
15*8f69470aSLisandro Dalcin .  xl - the coordinates of lower left corner of text
16*8f69470aSLisandro Dalcin .  yl - the coordinates of lower left corner of text
17*8f69470aSLisandro Dalcin .  cl - the color of the text
18*8f69470aSLisandro Dalcin -  text - the text to draw
19*8f69470aSLisandro Dalcin 
20*8f69470aSLisandro Dalcin    Level: beginner
21*8f69470aSLisandro Dalcin 
22*8f69470aSLisandro Dalcin    Concepts: drawing^string
23*8f69470aSLisandro Dalcin    Concepts: string^drawing
24*8f69470aSLisandro Dalcin 
25*8f69470aSLisandro Dalcin .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed()
26*8f69470aSLisandro Dalcin 
27*8f69470aSLisandro Dalcin @*/
28*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
29*8f69470aSLisandro Dalcin {
30*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
31*8f69470aSLisandro Dalcin   PetscBool      isnull;
32*8f69470aSLisandro Dalcin 
33*8f69470aSLisandro Dalcin   PetscFunctionBegin;
34*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
35*8f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
36*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
37*8f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
38*8f69470aSLisandro Dalcin   if (!draw->ops->string) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing strings",((PetscObject)draw)->type_name);
39*8f69470aSLisandro Dalcin   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
40*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
41*8f69470aSLisandro Dalcin }
42*8f69470aSLisandro Dalcin 
43*8f69470aSLisandro Dalcin #undef __FUNCT__
44*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical"
45*8f69470aSLisandro Dalcin /*@C
46*8f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
47*8f69470aSLisandro Dalcin 
48*8f69470aSLisandro Dalcin    Not Collective
49*8f69470aSLisandro Dalcin 
50*8f69470aSLisandro Dalcin    Input Parameters:
51*8f69470aSLisandro Dalcin +  draw - the drawing context
52*8f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
53*8f69470aSLisandro Dalcin .  cl - the color of the text
54*8f69470aSLisandro Dalcin -  text - the text to draw
55*8f69470aSLisandro Dalcin 
56*8f69470aSLisandro Dalcin    Level: beginner
57*8f69470aSLisandro Dalcin 
58*8f69470aSLisandro Dalcin    Concepts: string^drawing vertical
59*8f69470aSLisandro Dalcin 
60*8f69470aSLisandro Dalcin .seealso: PetscDrawString()
61*8f69470aSLisandro Dalcin 
62*8f69470aSLisandro Dalcin @*/
63*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
64*8f69470aSLisandro Dalcin {
65*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
66*8f69470aSLisandro Dalcin   PetscBool      isnull;
67*8f69470aSLisandro Dalcin 
68*8f69470aSLisandro Dalcin   PetscFunctionBegin;
69*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
70*8f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
71*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
72*8f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
73*8f69470aSLisandro Dalcin   if (!draw->ops->stringvertical) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing vertical strings",((PetscObject)draw)->type_name);
74*8f69470aSLisandro Dalcin   ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr);
75*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
76*8f69470aSLisandro Dalcin }
77*8f69470aSLisandro Dalcin 
78*8f69470aSLisandro Dalcin #undef __FUNCT__
7951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringCentered"
8051fa3d41SBarry Smith /*@C
8151fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
8251fa3d41SBarry Smith 
8351fa3d41SBarry Smith    Not Collective
8451fa3d41SBarry Smith 
8551fa3d41SBarry Smith    Input Parameters:
8651fa3d41SBarry Smith +  draw - the drawing context
8751fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
8851fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
8951fa3d41SBarry Smith .  cl - the color of the text
9051fa3d41SBarry Smith -  text - the text to draw
9151fa3d41SBarry Smith 
9251fa3d41SBarry Smith    Level: beginner
9351fa3d41SBarry Smith 
9451fa3d41SBarry Smith    Concepts: drawing^string
9551fa3d41SBarry Smith    Concepts: string^drawing
9651fa3d41SBarry Smith 
9751fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed()
9851fa3d41SBarry Smith 
9951fa3d41SBarry Smith @*/
10051fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
10151fa3d41SBarry Smith {
10251fa3d41SBarry Smith   PetscErrorCode ierr;
10351fa3d41SBarry Smith   PetscBool      isnull;
10451fa3d41SBarry Smith   size_t         len;
10551fa3d41SBarry Smith   PetscReal      tw,th;
10651fa3d41SBarry Smith 
10751fa3d41SBarry Smith   PetscFunctionBegin;
10851fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
10951fa3d41SBarry Smith   PetscValidCharPointer(text,5);
110*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
11151fa3d41SBarry Smith   if (isnull) PetscFunctionReturn(0);
11251fa3d41SBarry Smith 
11351fa3d41SBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
11451fa3d41SBarry Smith   ierr =  PetscStrlen(text,&len);CHKERRQ(ierr);
11551fa3d41SBarry Smith   xc   = xc - .5*len*tw;
11651fa3d41SBarry Smith   ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr);
11751fa3d41SBarry Smith   PetscFunctionReturn(0);
11851fa3d41SBarry Smith }
11951fa3d41SBarry Smith 
1205c6c1daeSBarry Smith #undef __FUNCT__
12151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed"
1225c6c1daeSBarry Smith /*@C
12351fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith    Not Collective
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith    Input Parameters:
1285c6c1daeSBarry Smith +  draw - the drawing context
1295c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1305c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1315c6c1daeSBarry Smith .  sc - the color of the text
1325c6c1daeSBarry Smith .  bc - the color of the bounding box
1335c6c1daeSBarry Smith -  text - the text to draw
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith    Output Parameter:
1365c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Level: beginner
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Concepts: drawing^string
1415c6c1daeSBarry Smith    Concepts: string^drawing
1425c6c1daeSBarry Smith 
14351fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered()
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith @*/
14651fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1475c6c1daeSBarry Smith {
1485c6c1daeSBarry Smith   PetscErrorCode ierr;
1495c6c1daeSBarry Smith   PetscBool      isnull;
1505c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1515c6c1daeSBarry Smith   size_t         len,mlen = 0;
1525c6c1daeSBarry Smith   char           **array;
1535c6c1daeSBarry Smith   int            cnt,i;
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   PetscFunctionBegin;
1565c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1575c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
158*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1595c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1605c6c1daeSBarry Smith 
16142963b84SBarry Smith   if (draw->ops->boxedstring) {
16242963b84SBarry Smith     ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr);
16342963b84SBarry Smith     PetscFunctionReturn(0);
16442963b84SBarry Smith   }
16542963b84SBarry Smith 
1665c6c1daeSBarry Smith   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
1675c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
1685c6c1daeSBarry Smith     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
1695c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1705c6c1daeSBarry Smith   }
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
1735c6c1daeSBarry Smith 
1745c6c1daeSBarry Smith   top    = syl;
1755c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1765c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1775c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1785c6c1daeSBarry Smith   if (w) *w = right - left;
1795c6c1daeSBarry Smith   if (h) *h = top - bottom;
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   /* compute new bounding box */
1825c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1835c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1845c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1855c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1885c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
1895c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
1905c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
1915c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
1945c6c1daeSBarry Smith     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
1955c6c1daeSBarry Smith   }
1965c6c1daeSBarry Smith   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
1975c6c1daeSBarry Smith   PetscFunctionReturn(0);
1985c6c1daeSBarry Smith }
199*8f69470aSLisandro Dalcin 
200*8f69470aSLisandro Dalcin #undef __FUNCT__
201*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize"
202*8f69470aSLisandro Dalcin /*@
203*8f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
204*8f69470aSLisandro Dalcin 
205*8f69470aSLisandro Dalcin    Not Collective
206*8f69470aSLisandro Dalcin 
207*8f69470aSLisandro Dalcin    Input Parameters:
208*8f69470aSLisandro Dalcin +  draw - the drawing context
209*8f69470aSLisandro Dalcin .  width - the width in user coordinates
210*8f69470aSLisandro Dalcin -  height - the character height in user coordinates
211*8f69470aSLisandro Dalcin 
212*8f69470aSLisandro Dalcin    Level: advanced
213*8f69470aSLisandro Dalcin 
214*8f69470aSLisandro Dalcin    Note:
215*8f69470aSLisandro Dalcin    Only a limited range of sizes are available.
216*8f69470aSLisandro Dalcin 
217*8f69470aSLisandro Dalcin    Concepts: string^drawing size
218*8f69470aSLisandro Dalcin 
219*8f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringGetSize()
220*8f69470aSLisandro Dalcin 
221*8f69470aSLisandro Dalcin @*/
222*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
223*8f69470aSLisandro Dalcin {
224*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
225*8f69470aSLisandro Dalcin 
226*8f69470aSLisandro Dalcin   PetscFunctionBegin;
227*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
228*8f69470aSLisandro Dalcin   if (draw->ops->stringsetsize) {
229*8f69470aSLisandro Dalcin     ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr);
230*8f69470aSLisandro Dalcin   }
231*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
232*8f69470aSLisandro Dalcin }
233*8f69470aSLisandro Dalcin 
234*8f69470aSLisandro Dalcin #undef __FUNCT__
235*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize"
236*8f69470aSLisandro Dalcin /*@
237*8f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
238*8f69470aSLisandro Dalcin    relative to the user coordinates of the window.
239*8f69470aSLisandro Dalcin 
240*8f69470aSLisandro Dalcin    Not Collective
241*8f69470aSLisandro Dalcin 
242*8f69470aSLisandro Dalcin    Input Parameters:
243*8f69470aSLisandro Dalcin +  draw - the drawing context
244*8f69470aSLisandro Dalcin .  width - the width in user coordinates
245*8f69470aSLisandro Dalcin -  height - the character height
246*8f69470aSLisandro Dalcin 
247*8f69470aSLisandro Dalcin    Level: advanced
248*8f69470aSLisandro Dalcin 
249*8f69470aSLisandro Dalcin    Concepts: string^drawing size
250*8f69470aSLisandro Dalcin 
251*8f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringSetSize()
252*8f69470aSLisandro Dalcin 
253*8f69470aSLisandro Dalcin @*/
254*8f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
255*8f69470aSLisandro Dalcin {
256*8f69470aSLisandro Dalcin   PetscErrorCode ierr;
257*8f69470aSLisandro Dalcin   PetscBool      isnull;
258*8f69470aSLisandro Dalcin 
259*8f69470aSLisandro Dalcin   PetscFunctionBegin;
260*8f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
261*8f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
262*8f69470aSLisandro Dalcin   if (isnull) {*width = *height = 0.0; PetscFunctionReturn(0);}
263*8f69470aSLisandro Dalcin   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);
264*8f69470aSLisandro Dalcin   ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr);
265*8f69470aSLisandro Dalcin   PetscFunctionReturn(0);
266*8f69470aSLisandro Dalcin }
267*8f69470aSLisandro Dalcin 
268