xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 @*/
249371c9d4SSatish Balay PetscErrorCode PetscDrawString(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) {
258f69470aSLisandro Dalcin   PetscFunctionBegin;
268f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
278f69470aSLisandro Dalcin   PetscValidCharPointer(text, 5);
28dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, string, xl, yl, cl, text);
298f69470aSLisandro Dalcin   PetscFunctionReturn(0);
308f69470aSLisandro Dalcin }
318f69470aSLisandro Dalcin 
328f69470aSLisandro Dalcin /*@C
338f69470aSLisandro Dalcin    PetscDrawStringVertical - PetscDraws text onto a drawable.
348f69470aSLisandro Dalcin 
358f69470aSLisandro Dalcin    Not Collective
368f69470aSLisandro Dalcin 
378f69470aSLisandro Dalcin    Input Parameters:
388f69470aSLisandro Dalcin +  draw - the drawing context
398f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
408f69470aSLisandro Dalcin .  cl - the color of the text
418f69470aSLisandro Dalcin -  text - the text to draw
428f69470aSLisandro Dalcin 
438f69470aSLisandro Dalcin    Level: beginner
448f69470aSLisandro Dalcin 
45db781477SPatrick Sanan .seealso: `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
46db781477SPatrick Sanan           `PetscDrawStringGetSize()`
478f69470aSLisandro Dalcin 
488f69470aSLisandro Dalcin @*/
499371c9d4SSatish Balay PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) {
509400ad77SLisandro Dalcin   int       i;
519400ad77SLisandro Dalcin   char      chr[2] = {0, 0};
529400ad77SLisandro Dalcin   PetscReal tw, th;
538f69470aSLisandro Dalcin 
548f69470aSLisandro Dalcin   PetscFunctionBegin;
558f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
568f69470aSLisandro Dalcin   PetscValidCharPointer(text, 5);
579400ad77SLisandro Dalcin 
58dbbe0bcdSBarry Smith   if (draw->ops->stringvertical) PetscUseTypeMethod(draw, stringvertical, xl, yl, cl, text);
59dbbe0bcdSBarry Smith   else {
609566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
61*48a46eb9SPierre Jolivet     for (i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * (i + 1), cl, chr));
62dbbe0bcdSBarry Smith   }
639400ad77SLisandro Dalcin   PetscFunctionReturn(0);
649400ad77SLisandro Dalcin }
658f69470aSLisandro Dalcin 
6651fa3d41SBarry Smith /*@C
6751fa3d41SBarry Smith    PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point
6851fa3d41SBarry Smith 
6951fa3d41SBarry Smith    Not Collective
7051fa3d41SBarry Smith 
7151fa3d41SBarry Smith    Input Parameters:
7251fa3d41SBarry Smith +  draw - the drawing context
7351fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
7451fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
7551fa3d41SBarry Smith .  cl - the color of the text
7651fa3d41SBarry Smith -  text - the text to draw
7751fa3d41SBarry Smith 
7851fa3d41SBarry Smith    Level: beginner
7951fa3d41SBarry Smith 
80db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
81db781477SPatrick Sanan           `PetscDrawStringGetSize()`
8251fa3d41SBarry Smith 
8351fa3d41SBarry Smith @*/
849371c9d4SSatish Balay PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[]) {
8551fa3d41SBarry Smith   size_t    len;
8651fa3d41SBarry Smith   PetscReal tw, th;
8751fa3d41SBarry Smith 
8851fa3d41SBarry Smith   PetscFunctionBegin;
8951fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
9051fa3d41SBarry Smith   PetscValidCharPointer(text, 5);
9151fa3d41SBarry Smith 
929566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
939566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(text, &len));
949400ad77SLisandro Dalcin   xc = xc - len * tw / 2;
959566063dSJacob Faibussowitsch   PetscCall(PetscDrawString(draw, xc, yl, cl, text));
9651fa3d41SBarry Smith   PetscFunctionReturn(0);
9751fa3d41SBarry Smith }
9851fa3d41SBarry Smith 
995c6c1daeSBarry Smith /*@C
10051fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith    Not Collective
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith    Input Parameters:
1055c6c1daeSBarry Smith +  draw - the drawing context
1065c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1075c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1085c6c1daeSBarry Smith .  sc - the color of the text
1095c6c1daeSBarry Smith .  bc - the color of the bounding box
1105c6c1daeSBarry Smith -  text - the text to draw
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith    Output Parameter:
1135c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith    Level: beginner
1165c6c1daeSBarry Smith 
117db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
118db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith @*/
1219371c9d4SSatish Balay PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h) {
1225c6c1daeSBarry Smith   PetscReal top, left, right, bottom, tw, th;
1235c6c1daeSBarry Smith   size_t    len, mlen = 0;
1245c6c1daeSBarry Smith   char    **array;
1255c6c1daeSBarry Smith   int       cnt, i;
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith   PetscFunctionBegin;
1285c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
129064a246eSJacob Faibussowitsch   PetscValidCharPointer(text, 6);
1305c6c1daeSBarry Smith 
13142963b84SBarry Smith   if (draw->ops->boxedstring) {
132dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h);
13342963b84SBarry Smith     PetscFunctionReturn(0);
13442963b84SBarry Smith   }
13542963b84SBarry Smith 
1369566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray(text, '\n', &cnt, &array));
1375c6c1daeSBarry Smith   for (i = 0; i < cnt; i++) {
1389566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(array[i], &len));
1395c6c1daeSBarry Smith     mlen = PetscMax(mlen, len);
1405c6c1daeSBarry Smith   }
1415c6c1daeSBarry Smith 
1429566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
1435c6c1daeSBarry Smith 
1445c6c1daeSBarry Smith   top    = syl;
1455c6c1daeSBarry Smith   left   = sxl - .5 * (mlen + 2) * tw;
1465c6c1daeSBarry Smith   right  = sxl + .5 * (mlen + 2) * tw;
1475c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt) * th;
1485c6c1daeSBarry Smith   if (w) *w = right - left;
1495c6c1daeSBarry Smith   if (h) *h = top - bottom;
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith   /* compute new bounding box */
1525c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl, left);
1535c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr, right);
1545c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom);
1555c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr, top);
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1589566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, top, right, top, bc));
1599566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc));
1609566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc));
1619566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc));
1625c6c1daeSBarry Smith 
163*48a46eb9SPierre Jolivet   for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i]));
1649566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(cnt, array));
1655c6c1daeSBarry Smith   PetscFunctionReturn(0);
1665c6c1daeSBarry Smith }
1678f69470aSLisandro Dalcin 
1688f69470aSLisandro Dalcin /*@
1698f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1708f69470aSLisandro Dalcin 
1718f69470aSLisandro Dalcin    Not Collective
1728f69470aSLisandro Dalcin 
1738f69470aSLisandro Dalcin    Input Parameters:
1748f69470aSLisandro Dalcin +  draw - the drawing context
1758f69470aSLisandro Dalcin .  width - the width in user coordinates
1768f69470aSLisandro Dalcin -  height - the character height in user coordinates
1778f69470aSLisandro Dalcin 
1788f69470aSLisandro Dalcin    Level: advanced
1798f69470aSLisandro Dalcin 
1808f69470aSLisandro Dalcin    Note:
1818f69470aSLisandro Dalcin    Only a limited range of sizes are available.
1828f69470aSLisandro Dalcin 
183db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
184db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1858f69470aSLisandro Dalcin 
1868f69470aSLisandro Dalcin @*/
1879371c9d4SSatish Balay PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height) {
1888f69470aSLisandro Dalcin   PetscFunctionBegin;
1898f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
190dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, stringsetsize, width, height);
1918f69470aSLisandro Dalcin   PetscFunctionReturn(0);
1928f69470aSLisandro Dalcin }
1938f69470aSLisandro Dalcin 
1948f69470aSLisandro Dalcin /*@
1958f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
1968f69470aSLisandro Dalcin    relative to the user coordinates of the window.
1978f69470aSLisandro Dalcin 
1988f69470aSLisandro Dalcin    Not Collective
1998f69470aSLisandro Dalcin 
2008f69470aSLisandro Dalcin    Input Parameters:
2018f69470aSLisandro Dalcin +  draw - the drawing context
2028f69470aSLisandro Dalcin .  width - the width in user coordinates
2038f69470aSLisandro Dalcin -  height - the character height
2048f69470aSLisandro Dalcin 
2058f69470aSLisandro Dalcin    Level: advanced
2068f69470aSLisandro Dalcin 
207db781477SPatrick Sanan .seealso: `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
208db781477SPatrick Sanan           `PetscDrawStringSetSize()`
2098f69470aSLisandro Dalcin 
2108f69470aSLisandro Dalcin @*/
2119371c9d4SSatish Balay PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height) {
2128f69470aSLisandro Dalcin   PetscFunctionBegin;
2138f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
214dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, stringgetsize, width, height);
2158f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2168f69470aSLisandro Dalcin }
217