xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 9400ad774567b32a4be882e4fc8f23f56dc1326f)
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__
78f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawString"
88f69470aSLisandro Dalcin /*@C
98f69470aSLisandro Dalcin    PetscDrawString - PetscDraws text onto a drawable.
108f69470aSLisandro Dalcin 
118f69470aSLisandro Dalcin    Not Collective
128f69470aSLisandro Dalcin 
138f69470aSLisandro Dalcin    Input Parameters:
148f69470aSLisandro Dalcin +  draw - the drawing context
15*9400ad77SLisandro Dalcin .  xl,yl - the coordinates of lower left corner of text
168f69470aSLisandro Dalcin .  cl - the color of the text
178f69470aSLisandro Dalcin -  text - the text to draw
188f69470aSLisandro Dalcin 
198f69470aSLisandro Dalcin    Level: beginner
208f69470aSLisandro Dalcin 
218f69470aSLisandro Dalcin    Concepts: drawing^string
228f69470aSLisandro Dalcin    Concepts: string^drawing
238f69470aSLisandro Dalcin 
248f69470aSLisandro Dalcin .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed()
258f69470aSLisandro Dalcin 
268f69470aSLisandro Dalcin @*/
278f69470aSLisandro Dalcin PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
288f69470aSLisandro Dalcin {
298f69470aSLisandro Dalcin   PetscErrorCode ierr;
308f69470aSLisandro Dalcin   PetscBool      isnull;
318f69470aSLisandro Dalcin 
328f69470aSLisandro Dalcin   PetscFunctionBegin;
338f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
348f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
358f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
368f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
37*9400ad77SLisandro Dalcin 
388f69470aSLisandro 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);
398f69470aSLisandro Dalcin   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
408f69470aSLisandro Dalcin   PetscFunctionReturn(0);
418f69470aSLisandro Dalcin }
428f69470aSLisandro Dalcin 
438f69470aSLisandro Dalcin #undef __FUNCT__
448f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical"
458f69470aSLisandro Dalcin /*@C
468f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
478f69470aSLisandro Dalcin 
488f69470aSLisandro Dalcin    Not Collective
498f69470aSLisandro Dalcin 
508f69470aSLisandro Dalcin    Input Parameters:
518f69470aSLisandro Dalcin +  draw - the drawing context
528f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
538f69470aSLisandro Dalcin .  cl - the color of the text
548f69470aSLisandro Dalcin -  text - the text to draw
558f69470aSLisandro Dalcin 
568f69470aSLisandro Dalcin    Level: beginner
578f69470aSLisandro Dalcin 
588f69470aSLisandro Dalcin    Concepts: string^drawing vertical
598f69470aSLisandro Dalcin 
608f69470aSLisandro Dalcin .seealso: PetscDrawString()
618f69470aSLisandro Dalcin 
628f69470aSLisandro Dalcin @*/
638f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
648f69470aSLisandro Dalcin {
65*9400ad77SLisandro Dalcin   int            i;
66*9400ad77SLisandro Dalcin   char           chr[2] = {0, 0};
67*9400ad77SLisandro Dalcin   PetscReal      tw,th;
688f69470aSLisandro Dalcin   PetscErrorCode ierr;
698f69470aSLisandro Dalcin   PetscBool      isnull;
708f69470aSLisandro Dalcin 
718f69470aSLisandro Dalcin   PetscFunctionBegin;
728f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
738f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
748f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
758f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
76*9400ad77SLisandro Dalcin 
77*9400ad77SLisandro Dalcin   if (draw->ops->stringvertical) {
788f69470aSLisandro Dalcin     ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr);
798f69470aSLisandro Dalcin     PetscFunctionReturn(0);
808f69470aSLisandro Dalcin   }
81*9400ad77SLisandro Dalcin   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
82*9400ad77SLisandro Dalcin   for (i = 0; (chr[0] = text[i]); i++) {
83*9400ad77SLisandro Dalcin     ierr = PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);CHKERRQ(ierr);
84*9400ad77SLisandro Dalcin   }
85*9400ad77SLisandro Dalcin   PetscFunctionReturn(0);
86*9400ad77SLisandro Dalcin }
878f69470aSLisandro Dalcin 
888f69470aSLisandro Dalcin #undef __FUNCT__
8951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringCentered"
9051fa3d41SBarry Smith /*@C
9151fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
9251fa3d41SBarry Smith 
9351fa3d41SBarry Smith    Not Collective
9451fa3d41SBarry Smith 
9551fa3d41SBarry Smith    Input Parameters:
9651fa3d41SBarry Smith +  draw - the drawing context
9751fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
9851fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
9951fa3d41SBarry Smith .  cl - the color of the text
10051fa3d41SBarry Smith -  text - the text to draw
10151fa3d41SBarry Smith 
10251fa3d41SBarry Smith    Level: beginner
10351fa3d41SBarry Smith 
10451fa3d41SBarry Smith    Concepts: drawing^string
10551fa3d41SBarry Smith    Concepts: string^drawing
10651fa3d41SBarry Smith 
10751fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed()
10851fa3d41SBarry Smith 
10951fa3d41SBarry Smith @*/
11051fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
11151fa3d41SBarry Smith {
11251fa3d41SBarry Smith   PetscErrorCode ierr;
11351fa3d41SBarry Smith   PetscBool      isnull;
11451fa3d41SBarry Smith   size_t         len;
11551fa3d41SBarry Smith   PetscReal      tw,th;
11651fa3d41SBarry Smith 
11751fa3d41SBarry Smith   PetscFunctionBegin;
11851fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
11951fa3d41SBarry Smith   PetscValidCharPointer(text,5);
1208f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
12151fa3d41SBarry Smith   if (isnull) PetscFunctionReturn(0);
12251fa3d41SBarry Smith 
12351fa3d41SBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
12451fa3d41SBarry Smith   ierr = PetscStrlen(text,&len);CHKERRQ(ierr);
125*9400ad77SLisandro Dalcin   xc   = xc - len*tw/2;
12651fa3d41SBarry Smith   ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr);
12751fa3d41SBarry Smith   PetscFunctionReturn(0);
12851fa3d41SBarry Smith }
12951fa3d41SBarry Smith 
1305c6c1daeSBarry Smith #undef __FUNCT__
13151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed"
1325c6c1daeSBarry Smith /*@C
13351fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith    Not Collective
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Input Parameters:
1385c6c1daeSBarry Smith +  draw - the drawing context
1395c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1405c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1415c6c1daeSBarry Smith .  sc - the color of the text
1425c6c1daeSBarry Smith .  bc - the color of the bounding box
1435c6c1daeSBarry Smith -  text - the text to draw
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Output Parameter:
1465c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith    Level: beginner
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith    Concepts: drawing^string
1515c6c1daeSBarry Smith    Concepts: string^drawing
1525c6c1daeSBarry Smith 
15351fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered()
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith @*/
15651fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1575c6c1daeSBarry Smith {
1585c6c1daeSBarry Smith   PetscErrorCode ierr;
1595c6c1daeSBarry Smith   PetscBool      isnull;
1605c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1615c6c1daeSBarry Smith   size_t         len,mlen = 0;
1625c6c1daeSBarry Smith   char           **array;
1635c6c1daeSBarry Smith   int            cnt,i;
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith   PetscFunctionBegin;
1665c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1675c6c1daeSBarry Smith   PetscValidCharPointer(text,5);
1688f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1695c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1705c6c1daeSBarry Smith 
17142963b84SBarry Smith   if (draw->ops->boxedstring) {
17242963b84SBarry Smith     ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr);
17342963b84SBarry Smith     PetscFunctionReturn(0);
17442963b84SBarry Smith   }
17542963b84SBarry Smith 
1765c6c1daeSBarry Smith   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
1775c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
1785c6c1daeSBarry Smith     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
1795c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1805c6c1daeSBarry Smith   }
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
1835c6c1daeSBarry Smith 
1845c6c1daeSBarry Smith   top    = syl;
1855c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1865c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1875c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1885c6c1daeSBarry Smith   if (w) *w = right - left;
1895c6c1daeSBarry Smith   if (h) *h = top - bottom;
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith   /* compute new bounding box */
1925c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1935c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1945c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1955c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1985c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
1995c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
2005c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
2015c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
2045c6c1daeSBarry Smith     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
2055c6c1daeSBarry Smith   }
2065c6c1daeSBarry Smith   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
2075c6c1daeSBarry Smith   PetscFunctionReturn(0);
2085c6c1daeSBarry Smith }
2098f69470aSLisandro Dalcin 
2108f69470aSLisandro Dalcin #undef __FUNCT__
2118f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize"
2128f69470aSLisandro Dalcin /*@
2138f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
2148f69470aSLisandro Dalcin 
2158f69470aSLisandro Dalcin    Not Collective
2168f69470aSLisandro Dalcin 
2178f69470aSLisandro Dalcin    Input Parameters:
2188f69470aSLisandro Dalcin +  draw - the drawing context
2198f69470aSLisandro Dalcin .  width - the width in user coordinates
2208f69470aSLisandro Dalcin -  height - the character height in user coordinates
2218f69470aSLisandro Dalcin 
2228f69470aSLisandro Dalcin    Level: advanced
2238f69470aSLisandro Dalcin 
2248f69470aSLisandro Dalcin    Note:
2258f69470aSLisandro Dalcin    Only a limited range of sizes are available.
2268f69470aSLisandro Dalcin 
2278f69470aSLisandro Dalcin    Concepts: string^drawing size
2288f69470aSLisandro Dalcin 
2298f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringGetSize()
2308f69470aSLisandro Dalcin 
2318f69470aSLisandro Dalcin @*/
2328f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
2338f69470aSLisandro Dalcin {
2348f69470aSLisandro Dalcin   PetscErrorCode ierr;
2358f69470aSLisandro Dalcin 
2368f69470aSLisandro Dalcin   PetscFunctionBegin;
2378f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2388f69470aSLisandro Dalcin   if (draw->ops->stringsetsize) {
2398f69470aSLisandro Dalcin     ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr);
2408f69470aSLisandro Dalcin   }
2418f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2428f69470aSLisandro Dalcin }
2438f69470aSLisandro Dalcin 
2448f69470aSLisandro Dalcin #undef __FUNCT__
2458f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize"
2468f69470aSLisandro Dalcin /*@
2478f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
2488f69470aSLisandro Dalcin    relative to the user coordinates of the window.
2498f69470aSLisandro Dalcin 
2508f69470aSLisandro Dalcin    Not Collective
2518f69470aSLisandro Dalcin 
2528f69470aSLisandro Dalcin    Input Parameters:
2538f69470aSLisandro Dalcin +  draw - the drawing context
2548f69470aSLisandro Dalcin .  width - the width in user coordinates
2558f69470aSLisandro Dalcin -  height - the character height
2568f69470aSLisandro Dalcin 
2578f69470aSLisandro Dalcin    Level: advanced
2588f69470aSLisandro Dalcin 
2598f69470aSLisandro Dalcin    Concepts: string^drawing size
2608f69470aSLisandro Dalcin 
2618f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringSetSize()
2628f69470aSLisandro Dalcin 
2638f69470aSLisandro Dalcin @*/
2648f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
2658f69470aSLisandro Dalcin {
2668f69470aSLisandro Dalcin   PetscErrorCode ierr;
2678f69470aSLisandro Dalcin   PetscBool      isnull;
2688f69470aSLisandro Dalcin 
2698f69470aSLisandro Dalcin   PetscFunctionBegin;
2708f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2718f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
272ef0058dfSLisandro Dalcin   if (isnull) {if (width) *width = 0.0; if (height) *height = 0.0; PetscFunctionReturn(0);}
2738f69470aSLisandro 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);
2748f69470aSLisandro Dalcin   ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr);
2758f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2768f69470aSLisandro Dalcin }
2778f69470aSLisandro Dalcin 
278