xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 9566063d113dddea24716c546802770db7481bc0)
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 
1950d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
20ba1e01c4SBarry Smith           PetscDrawStringGetSize(), PetscDrawLine(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(),
21ba1e01c4SBarry Smith           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);
2928b400f6SJacob Faibussowitsch   PetscCheck(draw->ops->string,PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing strings",((PetscObject)draw)->type_name);
30*9566063dSJacob Faibussowitsch   PetscCall((*draw->ops->string)(draw,xl,yl,cl,text));
318f69470aSLisandro Dalcin   PetscFunctionReturn(0);
328f69470aSLisandro Dalcin }
338f69470aSLisandro Dalcin 
348f69470aSLisandro Dalcin /*@C
358f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
368f69470aSLisandro Dalcin 
378f69470aSLisandro Dalcin    Not Collective
388f69470aSLisandro Dalcin 
398f69470aSLisandro Dalcin    Input Parameters:
408f69470aSLisandro Dalcin +  draw - the drawing context
418f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
428f69470aSLisandro Dalcin .  cl - the color of the text
438f69470aSLisandro Dalcin -  text - the text to draw
448f69470aSLisandro Dalcin 
458f69470aSLisandro Dalcin    Level: beginner
468f69470aSLisandro Dalcin 
4750d92d24SPierre Jolivet .seealso: PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
48ba1e01c4SBarry Smith           PetscDrawStringGetSize()
498f69470aSLisandro Dalcin 
508f69470aSLisandro Dalcin @*/
518f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])
528f69470aSLisandro Dalcin {
539400ad77SLisandro Dalcin   int            i;
549400ad77SLisandro Dalcin   char           chr[2] = {0, 0};
559400ad77SLisandro Dalcin   PetscReal      tw,th;
568f69470aSLisandro Dalcin 
578f69470aSLisandro Dalcin   PetscFunctionBegin;
588f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
598f69470aSLisandro Dalcin   PetscValidCharPointer(text,5);
609400ad77SLisandro Dalcin 
619400ad77SLisandro Dalcin   if (draw->ops->stringvertical) {
62*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->stringvertical)(draw,xl,yl,cl,text));
638f69470aSLisandro Dalcin     PetscFunctionReturn(0);
648f69470aSLisandro Dalcin   }
65*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
669400ad77SLisandro Dalcin   for (i = 0; (chr[0] = text[i]); i++) {
67*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawString(draw,xl,yl-th*(i+1),cl,chr));
689400ad77SLisandro Dalcin   }
699400ad77SLisandro Dalcin   PetscFunctionReturn(0);
709400ad77SLisandro Dalcin }
718f69470aSLisandro Dalcin 
7251fa3d41SBarry Smith /*@C
7351fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
7451fa3d41SBarry Smith 
7551fa3d41SBarry Smith    Not Collective
7651fa3d41SBarry Smith 
7751fa3d41SBarry Smith    Input Parameters:
7851fa3d41SBarry Smith +  draw - the drawing context
7951fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
8051fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
8151fa3d41SBarry Smith .  cl - the color of the text
8251fa3d41SBarry Smith -  text - the text to draw
8351fa3d41SBarry Smith 
8451fa3d41SBarry Smith    Level: beginner
8551fa3d41SBarry Smith 
8650d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed(), PetscDrawStringSetSize(),
87ba1e01c4SBarry Smith           PetscDrawStringGetSize()
8851fa3d41SBarry Smith 
8951fa3d41SBarry Smith @*/
9051fa3d41SBarry Smith PetscErrorCode  PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])
9151fa3d41SBarry Smith {
9251fa3d41SBarry Smith   size_t         len;
9351fa3d41SBarry Smith   PetscReal      tw,th;
9451fa3d41SBarry Smith 
9551fa3d41SBarry Smith   PetscFunctionBegin;
9651fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
9751fa3d41SBarry Smith   PetscValidCharPointer(text,5);
9851fa3d41SBarry Smith 
99*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
100*9566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(text,&len));
1019400ad77SLisandro Dalcin   xc   = xc - len*tw/2;
102*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawString(draw,xc,yl,cl,text));
10351fa3d41SBarry Smith   PetscFunctionReturn(0);
10451fa3d41SBarry Smith }
10551fa3d41SBarry Smith 
1065c6c1daeSBarry Smith /*@C
10751fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith    Not Collective
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith    Input Parameters:
1125c6c1daeSBarry Smith +  draw - the drawing context
1135c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1145c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1155c6c1daeSBarry Smith .  sc - the color of the text
1165c6c1daeSBarry Smith .  bc - the color of the bounding box
1175c6c1daeSBarry Smith -  text - the text to draw
1185c6c1daeSBarry Smith 
1195c6c1daeSBarry Smith    Output Parameter:
1205c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith    Level: beginner
1235c6c1daeSBarry Smith 
12450d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringSetSize(),
125ba1e01c4SBarry Smith           PetscDrawStringGetSize()
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith @*/
12851fa3d41SBarry Smith PetscErrorCode  PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
1295c6c1daeSBarry Smith {
1305c6c1daeSBarry Smith   PetscReal      top,left,right,bottom,tw,th;
1315c6c1daeSBarry Smith   size_t         len,mlen = 0;
1325c6c1daeSBarry Smith   char           **array;
1335c6c1daeSBarry Smith   int            cnt,i;
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith   PetscFunctionBegin;
1365c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
137064a246eSJacob Faibussowitsch   PetscValidCharPointer(text,6);
1385c6c1daeSBarry Smith 
13942963b84SBarry Smith   if (draw->ops->boxedstring) {
140*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h));
14142963b84SBarry Smith     PetscFunctionReturn(0);
14242963b84SBarry Smith   }
14342963b84SBarry Smith 
144*9566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray(text,'\n',&cnt,&array));
1455c6c1daeSBarry Smith   for (i=0; i<cnt; i++) {
146*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(array[i],&len));
1475c6c1daeSBarry Smith     mlen = PetscMax(mlen,len);
1485c6c1daeSBarry Smith   }
1495c6c1daeSBarry Smith 
150*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith   top    = syl;
1535c6c1daeSBarry Smith   left   = sxl - .5*(mlen + 2)*tw;
1545c6c1daeSBarry Smith   right  = sxl + .5*(mlen + 2)*tw;
1555c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt)*th;
1565c6c1daeSBarry Smith   if (w) *w = right - left;
1575c6c1daeSBarry Smith   if (h) *h = top - bottom;
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith   /* compute new bounding box */
1605c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl,left);
1615c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr,right);
1625c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom);
1635c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr,top);
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith   /* top, left, bottom, right lines */
166*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,top,right,top,bc));
167*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,bottom,left,top,bc));
168*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,right,bottom,right,top,bc));
169*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,left,bottom,right,bottom,bc));
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   for  (i=0; i<cnt; i++) {
172*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]));
1735c6c1daeSBarry Smith   }
174*9566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(cnt,array));
1755c6c1daeSBarry Smith   PetscFunctionReturn(0);
1765c6c1daeSBarry Smith }
1778f69470aSLisandro Dalcin 
1788f69470aSLisandro Dalcin /*@
1798f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1808f69470aSLisandro Dalcin 
1818f69470aSLisandro Dalcin    Not Collective
1828f69470aSLisandro Dalcin 
1838f69470aSLisandro Dalcin    Input Parameters:
1848f69470aSLisandro Dalcin +  draw - the drawing context
1858f69470aSLisandro Dalcin .  width - the width in user coordinates
1868f69470aSLisandro Dalcin -  height - the character height in user coordinates
1878f69470aSLisandro Dalcin 
1888f69470aSLisandro Dalcin    Level: advanced
1898f69470aSLisandro Dalcin 
1908f69470aSLisandro Dalcin    Note:
1918f69470aSLisandro Dalcin    Only a limited range of sizes are available.
1928f69470aSLisandro Dalcin 
19350d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
194ba1e01c4SBarry Smith           PetscDrawStringGetSize()
1958f69470aSLisandro Dalcin 
1968f69470aSLisandro Dalcin @*/
1978f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)
1988f69470aSLisandro Dalcin {
1998f69470aSLisandro Dalcin   PetscFunctionBegin;
2008f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2018f69470aSLisandro Dalcin   if (draw->ops->stringsetsize) {
202*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->stringsetsize)(draw,width,height));
2038f69470aSLisandro Dalcin   }
2048f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2058f69470aSLisandro Dalcin }
2068f69470aSLisandro Dalcin 
2078f69470aSLisandro Dalcin /*@
2088f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
2098f69470aSLisandro Dalcin    relative to the user coordinates of the window.
2108f69470aSLisandro Dalcin 
2118f69470aSLisandro Dalcin    Not Collective
2128f69470aSLisandro Dalcin 
2138f69470aSLisandro Dalcin    Input Parameters:
2148f69470aSLisandro Dalcin +  draw - the drawing context
2158f69470aSLisandro Dalcin .  width - the width in user coordinates
2168f69470aSLisandro Dalcin -  height - the character height
2178f69470aSLisandro Dalcin 
2188f69470aSLisandro Dalcin    Level: advanced
2198f69470aSLisandro Dalcin 
22050d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(),
221ba1e01c4SBarry Smith           PetscDrawStringSetSize()
2228f69470aSLisandro Dalcin 
2238f69470aSLisandro Dalcin @*/
2248f69470aSLisandro Dalcin PetscErrorCode  PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height)
2258f69470aSLisandro Dalcin {
2268f69470aSLisandro Dalcin   PetscFunctionBegin;
2278f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
22828b400f6SJacob Faibussowitsch   PetscCheck(draw->ops->stringgetsize,PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support getting string size",((PetscObject)draw)->type_name);
229*9566063dSJacob Faibussowitsch   PetscCall((*draw->ops->stringgetsize)(draw,width,height));
2308f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2318f69470aSLisandro Dalcin }
232