xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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 
19db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
20db781477SPatrick Sanan           `PetscDrawStringGetSize()`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
21db781477SPatrick Sanan           `PetscDrawMarker()`, `PetscDrawPoint()`
228f69470aSLisandro Dalcin 
238f69470aSLisandro Dalcin @*/
248f69470aSLisandro Dalcin PetscErrorCode  PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
258f69470aSLisandro Dalcin {
268f69470aSLisandro Dalcin   PetscFunctionBegin;
278f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
288f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
29*dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw,string ,xl,yl,cl,text);
308f69470aSLisandro Dalcin   PetscFunctionReturn(0);
318f69470aSLisandro Dalcin }
328f69470aSLisandro Dalcin 
338f69470aSLisandro Dalcin /*@C
348f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
358f69470aSLisandro Dalcin 
368f69470aSLisandro Dalcin    Not Collective
378f69470aSLisandro Dalcin 
388f69470aSLisandro Dalcin    Input Parameters:
398f69470aSLisandro Dalcin +  draw - the drawing context
408f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
418f69470aSLisandro Dalcin .  cl - the color of the text
428f69470aSLisandro Dalcin -  text - the text to draw
438f69470aSLisandro Dalcin 
448f69470aSLisandro Dalcin    Level: beginner
458f69470aSLisandro Dalcin 
46db781477SPatrick Sanan .seealso: `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
47db781477SPatrick Sanan           `PetscDrawStringGetSize()`
488f69470aSLisandro Dalcin 
498f69470aSLisandro Dalcin @*/
508f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
518f69470aSLisandro Dalcin {
529400ad77SLisandro Dalcin   int            i;
539400ad77SLisandro Dalcin   char           chr[2] = {0, 0};
549400ad77SLisandro Dalcin   PetscReal      tw,th;
558f69470aSLisandro Dalcin 
568f69470aSLisandro Dalcin   PetscFunctionBegin;
578f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
588f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
599400ad77SLisandro Dalcin 
60*dbbe0bcdSBarry Smith   if (draw->ops->stringvertical) PetscUseTypeMethod(draw,stringvertical ,xl,yl,cl,text);
61*dbbe0bcdSBarry Smith   else {
629566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
639400ad77SLisandro Dalcin     for (i = 0; (chr[0] = text[i]); i++) {
649566063dSJacob Faibussowitsch       PetscCall(PetscDrawString(draw,xl,yl-th*(i+1),cl,chr));
659400ad77SLisandro Dalcin     }
66*dbbe0bcdSBarry Smith   }
679400ad77SLisandro Dalcin   PetscFunctionReturn(0);
689400ad77SLisandro Dalcin }
698f69470aSLisandro Dalcin 
7051fa3d41SBarry Smith /*@C
7151fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
7251fa3d41SBarry Smith 
7351fa3d41SBarry Smith    Not Collective
7451fa3d41SBarry Smith 
7551fa3d41SBarry Smith    Input Parameters:
7651fa3d41SBarry Smith +  draw - the drawing context
7751fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
7851fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
7951fa3d41SBarry Smith .  cl - the color of the text
8051fa3d41SBarry Smith -  text - the text to draw
8151fa3d41SBarry Smith 
8251fa3d41SBarry Smith    Level: beginner
8351fa3d41SBarry Smith 
84db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
85db781477SPatrick Sanan           `PetscDrawStringGetSize()`
8651fa3d41SBarry Smith 
8751fa3d41SBarry Smith @*/
8851fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
8951fa3d41SBarry Smith {
9051fa3d41SBarry Smith   size_t         len;
9151fa3d41SBarry Smith   PetscReal      tw,th;
9251fa3d41SBarry Smith 
9351fa3d41SBarry Smith   PetscFunctionBegin;
9451fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
9551fa3d41SBarry Smith   PetscValidCharPointer(text,5);
9651fa3d41SBarry Smith 
979566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
989566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(text,&len));
999400ad77SLisandro Dalcin   xc   = xc - len*tw/2;
1009566063dSJacob Faibussowitsch   PetscCall(PetscDrawString(draw,xc,yl,cl,text));
10151fa3d41SBarry Smith   PetscFunctionReturn(0);
10251fa3d41SBarry Smith }
10351fa3d41SBarry Smith 
1045c6c1daeSBarry Smith /*@C
10551fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith    Not Collective
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith    Input Parameters:
1105c6c1daeSBarry Smith +  draw - the drawing context
1115c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1125c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1135c6c1daeSBarry Smith .  sc - the color of the text
1145c6c1daeSBarry Smith .  bc - the color of the bounding box
1155c6c1daeSBarry Smith -  text - the text to draw
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith    Output Parameter:
1185c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith    Level: beginner
1215c6c1daeSBarry Smith 
122db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
123db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith @*/
12651fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1275c6c1daeSBarry Smith {
1285c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1295c6c1daeSBarry Smith   size_t         len,mlen = 0;
1305c6c1daeSBarry Smith   char           **array;
1315c6c1daeSBarry Smith   int            cnt,i;
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   PetscFunctionBegin;
1345c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
135064a246eSJacob Faibussowitsch   PetscValidCharPointer(text,6);
1365c6c1daeSBarry Smith 
13742963b84SBarry Smith   if (draw->ops->boxedstring) {
138*dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw,boxedstring ,sxl,syl,sc,bc,text,w,h);
13942963b84SBarry Smith     PetscFunctionReturn(0);
14042963b84SBarry Smith   }
14142963b84SBarry Smith 
1429566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray(text,'\n',&cnt,&array));
1435c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
1449566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(array[i],&len));
1455c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1465c6c1daeSBarry Smith   }
1475c6c1daeSBarry Smith 
1489566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith   top    = syl;
1515c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1525c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1535c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1545c6c1daeSBarry Smith   if (w) *w = right - left;
1555c6c1daeSBarry Smith   if (h) *h = top - bottom;
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   /* compute new bounding box */
1585c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1595c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1605c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1615c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1649566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,top,right,top,bc));
1659566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,bottom,left,top,bc));
1669566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,right,bottom,right,top,bc));
1679566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,bottom,right,bottom,bc));
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
1709566063dSJacob Faibussowitsch     PetscCall(PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]));
1715c6c1daeSBarry Smith   }
1729566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(cnt,array));
1735c6c1daeSBarry Smith   PetscFunctionReturn(0);
1745c6c1daeSBarry Smith }
1758f69470aSLisandro Dalcin 
1768f69470aSLisandro Dalcin /*@
1778f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1788f69470aSLisandro Dalcin 
1798f69470aSLisandro Dalcin    Not Collective
1808f69470aSLisandro Dalcin 
1818f69470aSLisandro Dalcin    Input Parameters:
1828f69470aSLisandro Dalcin +  draw - the drawing context
1838f69470aSLisandro Dalcin .  width - the width in user coordinates
1848f69470aSLisandro Dalcin -  height - the character height in user coordinates
1858f69470aSLisandro Dalcin 
1868f69470aSLisandro Dalcin    Level: advanced
1878f69470aSLisandro Dalcin 
1888f69470aSLisandro Dalcin    Note:
1898f69470aSLisandro Dalcin    Only a limited range of sizes are available.
1908f69470aSLisandro Dalcin 
191db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
192db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1938f69470aSLisandro Dalcin 
1948f69470aSLisandro Dalcin @*/
1958f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
1968f69470aSLisandro Dalcin {
1978f69470aSLisandro Dalcin   PetscFunctionBegin;
1988f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
199*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,stringsetsize,width,height);
2008f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2018f69470aSLisandro Dalcin }
2028f69470aSLisandro Dalcin 
2038f69470aSLisandro Dalcin /*@
2048f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
2058f69470aSLisandro Dalcin    relative to the user coordinates of the window.
2068f69470aSLisandro Dalcin 
2078f69470aSLisandro Dalcin    Not Collective
2088f69470aSLisandro Dalcin 
2098f69470aSLisandro Dalcin    Input Parameters:
2108f69470aSLisandro Dalcin +  draw - the drawing context
2118f69470aSLisandro Dalcin .  width - the width in user coordinates
2128f69470aSLisandro Dalcin -  height - the character height
2138f69470aSLisandro Dalcin 
2148f69470aSLisandro Dalcin    Level: advanced
2158f69470aSLisandro Dalcin 
216db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
217db781477SPatrick Sanan           `PetscDrawStringSetSize()`
2188f69470aSLisandro Dalcin 
2198f69470aSLisandro Dalcin @*/
2208f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
2218f69470aSLisandro Dalcin {
2228f69470aSLisandro Dalcin   PetscFunctionBegin;
2238f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
224*dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw,stringgetsize ,width,height);
2258f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2268f69470aSLisandro Dalcin }
227