xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 51fa3d41ed3feb8cf78b09fc9e5a282491d54f25)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
55c6c1daeSBarry Smith #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #undef __FUNCT__
8*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringCentered"
9*51fa3d41SBarry Smith /*@C
10*51fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
11*51fa3d41SBarry Smith 
12*51fa3d41SBarry Smith    Not Collective
13*51fa3d41SBarry Smith 
14*51fa3d41SBarry Smith    Input Parameters:
15*51fa3d41SBarry Smith +  draw - the drawing context
16*51fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
17*51fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
18*51fa3d41SBarry Smith .  cl - the color of the text
19*51fa3d41SBarry Smith -  text - the text to draw
20*51fa3d41SBarry Smith 
21*51fa3d41SBarry Smith    Level: beginner
22*51fa3d41SBarry Smith 
23*51fa3d41SBarry Smith    Concepts: drawing^string
24*51fa3d41SBarry Smith    Concepts: string^drawing
25*51fa3d41SBarry Smith 
26*51fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed()
27*51fa3d41SBarry Smith 
28*51fa3d41SBarry Smith @*/
29*51fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
30*51fa3d41SBarry Smith {
31*51fa3d41SBarry Smith   PetscErrorCode ierr;
32*51fa3d41SBarry Smith   PetscBool      isnull;
33*51fa3d41SBarry Smith   size_t         len;
34*51fa3d41SBarry Smith   PetscReal      tw,th;
35*51fa3d41SBarry Smith 
36*51fa3d41SBarry Smith   PetscFunctionBegin;
37*51fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
38*51fa3d41SBarry Smith   PetscValidCharPointer(text,5);
39*51fa3d41SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
40*51fa3d41SBarry Smith   if (isnull) PetscFunctionReturn(0);
41*51fa3d41SBarry Smith 
42*51fa3d41SBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
43*51fa3d41SBarry Smith   ierr =  PetscStrlen(text,&len);CHKERRQ(ierr);
44*51fa3d41SBarry Smith   xc   = xc - .5*len*tw;
45*51fa3d41SBarry Smith   ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr);
46*51fa3d41SBarry Smith   PetscFunctionReturn(0);
47*51fa3d41SBarry Smith }
48*51fa3d41SBarry Smith 
49*51fa3d41SBarry Smith 
50*51fa3d41SBarry Smith #undef __FUNCT__
515c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawString"
525c6c1daeSBarry Smith /*@C
535c6c1daeSBarry Smith    PetscDrawString - PetscDraws text onto a drawable.
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith    Not Collective
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith    Input Parameters:
585c6c1daeSBarry Smith +  draw - the drawing context
595c6c1daeSBarry Smith .  xl - the coordinates of lower left corner of text
605c6c1daeSBarry Smith .  yl - the coordinates of lower left corner of text
615c6c1daeSBarry Smith .  cl - the color of the text
625c6c1daeSBarry Smith -  text - the text to draw
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith    Level: beginner
655c6c1daeSBarry Smith 
665c6c1daeSBarry Smith    Concepts: drawing^string
675c6c1daeSBarry Smith    Concepts: string^drawing
685c6c1daeSBarry Smith 
69*51fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed()
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith @*/
725c6c1daeSBarry Smith PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
735c6c1daeSBarry Smith {
745c6c1daeSBarry Smith   PetscErrorCode ierr;
755c6c1daeSBarry Smith   PetscBool      isnull;
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith   PetscFunctionBegin;
785c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
795c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
805c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
815c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
825c6c1daeSBarry Smith   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
835c6c1daeSBarry Smith   PetscFunctionReturn(0);
845c6c1daeSBarry Smith }
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith #undef __FUNCT__
87*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed"
885c6c1daeSBarry Smith /*@C
89*51fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith    Not Collective
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith    Input Parameters:
945c6c1daeSBarry Smith +  draw - the drawing context
955c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
965c6c1daeSBarry Smith .  syl - the coordinates of top line of box
975c6c1daeSBarry Smith .  sc - the color of the text
985c6c1daeSBarry Smith .  bc - the color of the bounding box
995c6c1daeSBarry Smith -  text - the text to draw
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith    Output Parameter:
1025c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith    Level: beginner
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith    Concepts: drawing^string
1075c6c1daeSBarry Smith    Concepts: string^drawing
1085c6c1daeSBarry Smith 
109*51fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered()
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith @*/
112*51fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1135c6c1daeSBarry Smith {
1145c6c1daeSBarry Smith   PetscErrorCode ierr;
1155c6c1daeSBarry Smith   PetscBool      isnull;
1165c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1175c6c1daeSBarry Smith   size_t         len,mlen = 0;
1185c6c1daeSBarry Smith   char           **array;
1195c6c1daeSBarry Smith   int            cnt,i;
1205c6c1daeSBarry Smith 
1215c6c1daeSBarry Smith   PetscFunctionBegin;
1225c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1235c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
1245c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
1255c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1265c6c1daeSBarry Smith 
12742963b84SBarry Smith   if (draw->ops->boxedstring) {
12842963b84SBarry Smith     ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr);
12942963b84SBarry Smith     PetscFunctionReturn(0);
13042963b84SBarry Smith   }
13142963b84SBarry Smith 
1325c6c1daeSBarry Smith   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
1335c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
1345c6c1daeSBarry Smith     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
1355c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1365c6c1daeSBarry Smith   }
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith   top    = syl;
1415c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1425c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1435c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1445c6c1daeSBarry Smith   if (w) *w = right - left;
1455c6c1daeSBarry Smith   if (h) *h = top - bottom;
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith   /* compute new bounding box */
1485c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1495c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1505c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1515c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1545c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
1555c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
1565c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
1575c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
1605c6c1daeSBarry Smith     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
1615c6c1daeSBarry Smith   }
1625c6c1daeSBarry Smith   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
1635c6c1daeSBarry Smith   PetscFunctionReturn(0);
1645c6c1daeSBarry Smith }
165