xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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
7*811af0c4SBarry Smith    PetscDrawString - draws 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 
19*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
20db781477SPatrick Sanan           `PetscDrawStringGetSize()`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
21db781477SPatrick Sanan           `PetscDrawMarker()`, `PetscDrawPoint()`
228f69470aSLisandro Dalcin @*/
239371c9d4SSatish Balay PetscErrorCode PetscDrawString(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) {
248f69470aSLisandro Dalcin   PetscFunctionBegin;
258f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
268f69470aSLisandro Dalcin   PetscValidCharPointer(text, 5);
27dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, string, xl, yl, cl, text);
288f69470aSLisandro Dalcin   PetscFunctionReturn(0);
298f69470aSLisandro Dalcin }
308f69470aSLisandro Dalcin 
318f69470aSLisandro Dalcin /*@C
32*811af0c4SBarry Smith    PetscDrawStringVertical - draws text onto a drawable.
338f69470aSLisandro Dalcin 
348f69470aSLisandro Dalcin    Not Collective
358f69470aSLisandro Dalcin 
368f69470aSLisandro Dalcin    Input Parameters:
378f69470aSLisandro Dalcin +  draw - the drawing context
388f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
398f69470aSLisandro Dalcin .  cl - the color of the text
408f69470aSLisandro Dalcin -  text - the text to draw
418f69470aSLisandro Dalcin 
428f69470aSLisandro Dalcin    Level: beginner
438f69470aSLisandro Dalcin 
44*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
45db781477SPatrick Sanan           `PetscDrawStringGetSize()`
468f69470aSLisandro Dalcin @*/
479371c9d4SSatish Balay PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) {
489400ad77SLisandro Dalcin   int       i;
499400ad77SLisandro Dalcin   char      chr[2] = {0, 0};
509400ad77SLisandro Dalcin   PetscReal tw, th;
518f69470aSLisandro Dalcin 
528f69470aSLisandro Dalcin   PetscFunctionBegin;
538f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
548f69470aSLisandro Dalcin   PetscValidCharPointer(text, 5);
559400ad77SLisandro Dalcin 
56dbbe0bcdSBarry Smith   if (draw->ops->stringvertical) PetscUseTypeMethod(draw, stringvertical, xl, yl, cl, text);
57dbbe0bcdSBarry Smith   else {
589566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
5948a46eb9SPierre Jolivet     for (i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * (i + 1), cl, chr));
60dbbe0bcdSBarry Smith   }
619400ad77SLisandro Dalcin   PetscFunctionReturn(0);
629400ad77SLisandro Dalcin }
638f69470aSLisandro Dalcin 
6451fa3d41SBarry Smith /*@C
65*811af0c4SBarry Smith    PetscDrawStringCentered - draws text onto a drawable centered at a point
6651fa3d41SBarry Smith 
6751fa3d41SBarry Smith    Not Collective
6851fa3d41SBarry Smith 
6951fa3d41SBarry Smith    Input Parameters:
7051fa3d41SBarry Smith +  draw - the drawing context
7151fa3d41SBarry Smith .  xc - the coordinates of right-left center of text
7251fa3d41SBarry Smith .  yl - the coordinates of lower edge of text
7351fa3d41SBarry Smith .  cl - the color of the text
7451fa3d41SBarry Smith -  text - the text to draw
7551fa3d41SBarry Smith 
7651fa3d41SBarry Smith    Level: beginner
7751fa3d41SBarry Smith 
78*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
79db781477SPatrick Sanan           `PetscDrawStringGetSize()`
8051fa3d41SBarry Smith @*/
819371c9d4SSatish Balay PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[]) {
8251fa3d41SBarry Smith   size_t    len;
8351fa3d41SBarry Smith   PetscReal tw, th;
8451fa3d41SBarry Smith 
8551fa3d41SBarry Smith   PetscFunctionBegin;
8651fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
8751fa3d41SBarry Smith   PetscValidCharPointer(text, 5);
8851fa3d41SBarry Smith 
899566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
909566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(text, &len));
919400ad77SLisandro Dalcin   xc = xc - len * tw / 2;
929566063dSJacob Faibussowitsch   PetscCall(PetscDrawString(draw, xc, yl, cl, text));
9351fa3d41SBarry Smith   PetscFunctionReturn(0);
9451fa3d41SBarry Smith }
9551fa3d41SBarry Smith 
965c6c1daeSBarry Smith /*@C
9751fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith    Not Collective
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith    Input Parameters:
1025c6c1daeSBarry Smith +  draw - the drawing context
1035c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1045c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1055c6c1daeSBarry Smith .  sc - the color of the text
1065c6c1daeSBarry Smith .  bc - the color of the bounding box
1075c6c1daeSBarry Smith -  text - the text to draw
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith    Output Parameter:
1105c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith    Level: beginner
1135c6c1daeSBarry Smith 
114*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
115db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1165c6c1daeSBarry Smith @*/
1179371c9d4SSatish Balay PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h) {
1185c6c1daeSBarry Smith   PetscReal top, left, right, bottom, tw, th;
1195c6c1daeSBarry Smith   size_t    len, mlen = 0;
1205c6c1daeSBarry Smith   char    **array;
1215c6c1daeSBarry Smith   int       cnt, i;
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   PetscFunctionBegin;
1245c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
125064a246eSJacob Faibussowitsch   PetscValidCharPointer(text, 6);
1265c6c1daeSBarry Smith 
12742963b84SBarry Smith   if (draw->ops->boxedstring) {
128dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h);
12942963b84SBarry Smith     PetscFunctionReturn(0);
13042963b84SBarry Smith   }
13142963b84SBarry Smith 
1329566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray(text, '\n', &cnt, &array));
1335c6c1daeSBarry Smith   for (i = 0; i < cnt; i++) {
1349566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(array[i], &len));
1355c6c1daeSBarry Smith     mlen = PetscMax(mlen, len);
1365c6c1daeSBarry Smith   }
1375c6c1daeSBarry Smith 
1389566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith   top    = syl;
1415c6c1daeSBarry Smith   left   = sxl - .5 * (mlen + 2) * tw;
1425c6c1daeSBarry Smith   right  = sxl + .5 * (mlen + 2) * tw;
1435c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt) * th;
1445c6c1daeSBarry Smith   if (w) *w = right - left;
1455c6c1daeSBarry Smith   if (h) *h = top - bottom;
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith   /* compute new bounding box */
1485c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl, left);
1495c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr, right);
1505c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom);
1515c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr, top);
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1549566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, top, right, top, bc));
1559566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc));
1569566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc));
1579566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc));
1585c6c1daeSBarry Smith 
15948a46eb9SPierre Jolivet   for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i]));
1609566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(cnt, array));
1615c6c1daeSBarry Smith   PetscFunctionReturn(0);
1625c6c1daeSBarry Smith }
1638f69470aSLisandro Dalcin 
1648f69470aSLisandro Dalcin /*@
1658f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1668f69470aSLisandro Dalcin 
1678f69470aSLisandro Dalcin    Not Collective
1688f69470aSLisandro Dalcin 
1698f69470aSLisandro Dalcin    Input Parameters:
1708f69470aSLisandro Dalcin +  draw - the drawing context
1718f69470aSLisandro Dalcin .  width - the width in user coordinates
1728f69470aSLisandro Dalcin -  height - the character height in user coordinates
1738f69470aSLisandro Dalcin 
1748f69470aSLisandro Dalcin    Level: advanced
1758f69470aSLisandro Dalcin 
1768f69470aSLisandro Dalcin    Note:
1778f69470aSLisandro Dalcin    Only a limited range of sizes are available.
1788f69470aSLisandro Dalcin 
179*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
180db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1818f69470aSLisandro Dalcin @*/
1829371c9d4SSatish Balay PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height) {
1838f69470aSLisandro Dalcin   PetscFunctionBegin;
1848f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
185dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, stringsetsize, width, height);
1868f69470aSLisandro Dalcin   PetscFunctionReturn(0);
1878f69470aSLisandro Dalcin }
1888f69470aSLisandro Dalcin 
1898f69470aSLisandro Dalcin /*@
1908f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
1918f69470aSLisandro Dalcin    relative to the user coordinates of the window.
1928f69470aSLisandro Dalcin 
1938f69470aSLisandro Dalcin    Not Collective
1948f69470aSLisandro Dalcin 
1958f69470aSLisandro Dalcin    Input Parameters:
1968f69470aSLisandro Dalcin +  draw - the drawing context
1978f69470aSLisandro Dalcin .  width - the width in user coordinates
1988f69470aSLisandro Dalcin -  height - the character height
1998f69470aSLisandro Dalcin 
2008f69470aSLisandro Dalcin    Level: advanced
2018f69470aSLisandro Dalcin 
202*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
203db781477SPatrick Sanan           `PetscDrawStringSetSize()`
2048f69470aSLisandro Dalcin @*/
2059371c9d4SSatish Balay PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height) {
2068f69470aSLisandro Dalcin   PetscFunctionBegin;
2078f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
208dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, stringgetsize, width, height);
2098f69470aSLisandro Dalcin   PetscFunctionReturn(0);
2108f69470aSLisandro Dalcin }
211