xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 064a246e8b5c1f87897a54b4a9ec05181ea08258)
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 
68f69470aSLisandro Dalcin /*@C
78f69470aSLisandro Dalcin    PetscDrawString - PetscDraws text onto a drawable.
88f69470aSLisandro Dalcin 
98f69470aSLisandro Dalcin    Not Collective
108f69470aSLisandro Dalcin 
118f69470aSLisandro Dalcin    Input Parameters:
128f69470aSLisandro Dalcin +  draw - the drawing context
139400ad77SLisandro Dalcin .  xl,yl - the coordinates of lower left corner of text
148f69470aSLisandro Dalcin .  cl - the color of the text
158f69470aSLisandro Dalcin -  text - the text to draw
168f69470aSLisandro Dalcin 
178f69470aSLisandro Dalcin    Level: beginner
188f69470aSLisandro Dalcin 
198f69470aSLisandro Dalcin 
2050d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
21ba1e01c4SBarry Smith           PetscDrawStringGetSize(), PetscDrawLine(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
22ba1e01c4SBarry Smith           PetscDrawMarker(), PetscDrawPoint()
238f69470aSLisandro Dalcin 
248f69470aSLisandro Dalcin @*/
258f69470aSLisandro Dalcin PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
268f69470aSLisandro Dalcin {
278f69470aSLisandro Dalcin   PetscErrorCode ierr;
288f69470aSLisandro Dalcin 
298f69470aSLisandro Dalcin   PetscFunctionBegin;
308f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
318f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
328f69470aSLisandro 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);
338f69470aSLisandro Dalcin   ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr);
348f69470aSLisandro Dalcin   PetscFunctionReturn(0);
358f69470aSLisandro Dalcin }
368f69470aSLisandro Dalcin 
378f69470aSLisandro Dalcin /*@C
388f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
398f69470aSLisandro Dalcin 
408f69470aSLisandro Dalcin    Not Collective
418f69470aSLisandro Dalcin 
428f69470aSLisandro Dalcin    Input Parameters:
438f69470aSLisandro Dalcin +  draw - the drawing context
448f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
458f69470aSLisandro Dalcin .  cl - the color of the text
468f69470aSLisandro Dalcin -  text - the text to draw
478f69470aSLisandro Dalcin 
488f69470aSLisandro Dalcin    Level: beginner
498f69470aSLisandro Dalcin 
5050d92d24SPierre Jolivet .seealso: PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
51ba1e01c4SBarry Smith           PetscDrawStringGetSize()
528f69470aSLisandro Dalcin 
538f69470aSLisandro Dalcin @*/
548f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
558f69470aSLisandro Dalcin {
569400ad77SLisandro Dalcin   int            i;
579400ad77SLisandro Dalcin   char           chr[2] = {0, 0};
589400ad77SLisandro Dalcin   PetscReal      tw,th;
598f69470aSLisandro Dalcin   PetscErrorCode ierr;
608f69470aSLisandro Dalcin 
618f69470aSLisandro Dalcin   PetscFunctionBegin;
628f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
638f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
649400ad77SLisandro Dalcin 
659400ad77SLisandro Dalcin   if (draw->ops->stringvertical) {
668f69470aSLisandro Dalcin     ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr);
678f69470aSLisandro Dalcin     PetscFunctionReturn(0);
688f69470aSLisandro Dalcin   }
699400ad77SLisandro Dalcin   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
709400ad77SLisandro Dalcin   for (i = 0; (chr[0] = text[i]); i++) {
719400ad77SLisandro Dalcin     ierr = PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);CHKERRQ(ierr);
729400ad77SLisandro Dalcin   }
739400ad77SLisandro Dalcin   PetscFunctionReturn(0);
749400ad77SLisandro Dalcin }
758f69470aSLisandro Dalcin 
7651fa3d41SBarry Smith /*@C
7751fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
7851fa3d41SBarry Smith 
7951fa3d41SBarry Smith    Not Collective
8051fa3d41SBarry Smith 
8151fa3d41SBarry Smith    Input Parameters:
8251fa3d41SBarry Smith +  draw - the drawing context
8351fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
8451fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
8551fa3d41SBarry Smith .  cl - the color of the text
8651fa3d41SBarry Smith -  text - the text to draw
8751fa3d41SBarry Smith 
8851fa3d41SBarry Smith    Level: beginner
8951fa3d41SBarry Smith 
9051fa3d41SBarry Smith 
9150d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
92ba1e01c4SBarry Smith           PetscDrawStringGetSize()
9351fa3d41SBarry Smith 
9451fa3d41SBarry Smith @*/
9551fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
9651fa3d41SBarry Smith {
9751fa3d41SBarry Smith   PetscErrorCode ierr;
9851fa3d41SBarry Smith   size_t         len;
9951fa3d41SBarry Smith   PetscReal      tw,th;
10051fa3d41SBarry Smith 
10151fa3d41SBarry Smith   PetscFunctionBegin;
10251fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
10351fa3d41SBarry Smith   PetscValidCharPointer(text,5);
10451fa3d41SBarry Smith 
10551fa3d41SBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
10651fa3d41SBarry Smith   ierr = PetscStrlen(text,&len);CHKERRQ(ierr);
1079400ad77SLisandro Dalcin   xc   = xc - len*tw/2;
10851fa3d41SBarry Smith   ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr);
10951fa3d41SBarry Smith   PetscFunctionReturn(0);
11051fa3d41SBarry Smith }
11151fa3d41SBarry Smith 
1125c6c1daeSBarry Smith /*@C
11351fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith    Not Collective
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith    Input Parameters:
1185c6c1daeSBarry Smith +  draw - the drawing context
1195c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1205c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1215c6c1daeSBarry Smith .  sc - the color of the text
1225c6c1daeSBarry Smith .  bc - the color of the bounding box
1235c6c1daeSBarry Smith -  text - the text to draw
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith    Output Parameter:
1265c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith    Level: beginner
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith 
13150d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringSetSize(),
132ba1e01c4SBarry Smith           PetscDrawStringGetSize()
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith @*/
13551fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1365c6c1daeSBarry Smith {
1375c6c1daeSBarry Smith   PetscErrorCode ierr;
1385c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1395c6c1daeSBarry Smith   size_t         len,mlen = 0;
1405c6c1daeSBarry Smith   char           **array;
1415c6c1daeSBarry Smith   int            cnt,i;
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith   PetscFunctionBegin;
1445c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
145*064a246eSJacob Faibussowitsch   PetscValidCharPointer(text,6);
1465c6c1daeSBarry Smith 
14742963b84SBarry Smith   if (draw->ops->boxedstring) {
14842963b84SBarry Smith     ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr);
14942963b84SBarry Smith     PetscFunctionReturn(0);
15042963b84SBarry Smith   }
15142963b84SBarry Smith 
1525c6c1daeSBarry Smith   ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr);
1535c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
1545c6c1daeSBarry Smith     ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr);
1555c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1565c6c1daeSBarry Smith   }
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith   top    = syl;
1615c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1625c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1635c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1645c6c1daeSBarry Smith   if (w) *w = right - left;
1655c6c1daeSBarry Smith   if (h) *h = top - bottom;
1665c6c1daeSBarry Smith 
1675c6c1daeSBarry Smith   /* compute new bounding box */
1685c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1695c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1705c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1715c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1745c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr);
1755c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr);
1765c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr);
1775c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr);
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
1805c6c1daeSBarry Smith     ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr);
1815c6c1daeSBarry Smith   }
1825c6c1daeSBarry Smith   ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr);
1835c6c1daeSBarry Smith   PetscFunctionReturn(0);
1845c6c1daeSBarry Smith }
1858f69470aSLisandro Dalcin 
1868f69470aSLisandro Dalcin /*@
1878f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1888f69470aSLisandro Dalcin 
1898f69470aSLisandro Dalcin    Not Collective
1908f69470aSLisandro Dalcin 
1918f69470aSLisandro Dalcin    Input Parameters:
1928f69470aSLisandro Dalcin +  draw - the drawing context
1938f69470aSLisandro Dalcin .  width - the width in user coordinates
1948f69470aSLisandro Dalcin -  height - the character height in user coordinates
1958f69470aSLisandro Dalcin 
1968f69470aSLisandro Dalcin    Level: advanced
1978f69470aSLisandro Dalcin 
1988f69470aSLisandro Dalcin    Note:
1998f69470aSLisandro Dalcin    Only a limited range of sizes are available.
2008f69470aSLisandro Dalcin 
20150d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
202ba1e01c4SBarry Smith           PetscDrawStringGetSize()
2038f69470aSLisandro Dalcin 
2048f69470aSLisandro Dalcin @*/
2058f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
2068f69470aSLisandro Dalcin {
2078f69470aSLisandro Dalcin   PetscErrorCode ierr;
2088f69470aSLisandro Dalcin 
2098f69470aSLisandro Dalcin   PetscFunctionBegin;
2108f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2118f69470aSLisandro Dalcin   if (draw->ops->stringsetsize) {
2128f69470aSLisandro Dalcin     ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr);
2138f69470aSLisandro Dalcin   }
2148f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2158f69470aSLisandro Dalcin }
2168f69470aSLisandro Dalcin 
2178f69470aSLisandro Dalcin /*@
2188f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
2198f69470aSLisandro Dalcin    relative to the user coordinates of the window.
2208f69470aSLisandro Dalcin 
2218f69470aSLisandro Dalcin    Not Collective
2228f69470aSLisandro Dalcin 
2238f69470aSLisandro Dalcin    Input Parameters:
2248f69470aSLisandro Dalcin +  draw - the drawing context
2258f69470aSLisandro Dalcin .  width - the width in user coordinates
2268f69470aSLisandro Dalcin -  height - the character height
2278f69470aSLisandro Dalcin 
2288f69470aSLisandro Dalcin    Level: advanced
2298f69470aSLisandro Dalcin 
23050d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
231ba1e01c4SBarry Smith           PetscDrawStringSetSize()
2328f69470aSLisandro Dalcin 
2338f69470aSLisandro Dalcin @*/
2348f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
2358f69470aSLisandro Dalcin {
2368f69470aSLisandro Dalcin   PetscErrorCode ierr;
2378f69470aSLisandro Dalcin 
2388f69470aSLisandro Dalcin   PetscFunctionBegin;
2398f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2408f69470aSLisandro 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);
2418f69470aSLisandro Dalcin   ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr);
2428f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2438f69470aSLisandro Dalcin }
2448f69470aSLisandro Dalcin 
245