xref: /petsc/src/sys/classes/draw/interface/dtext.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
1*20f4b53cSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
35c6c1daeSBarry Smith 
48f69470aSLisandro Dalcin /*@C
5811af0c4SBarry Smith    PetscDrawString - draws text onto a drawable.
68f69470aSLisandro Dalcin 
78f69470aSLisandro Dalcin    Not Collective
88f69470aSLisandro Dalcin 
98f69470aSLisandro Dalcin    Input Parameters:
108f69470aSLisandro Dalcin +  draw - the drawing context
119400ad77SLisandro Dalcin .  xl,yl - the coordinates of lower left corner of text
128f69470aSLisandro Dalcin .  cl - the color of the text
138f69470aSLisandro Dalcin -  text - the text to draw
148f69470aSLisandro Dalcin 
158f69470aSLisandro Dalcin    Level: beginner
168f69470aSLisandro Dalcin 
17811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
18db781477SPatrick Sanan           `PetscDrawStringGetSize()`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
19db781477SPatrick Sanan           `PetscDrawMarker()`, `PetscDrawPoint()`
208f69470aSLisandro Dalcin @*/
21d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawString(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[])
22d71ae5a4SJacob Faibussowitsch {
238f69470aSLisandro Dalcin   PetscFunctionBegin;
248f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
258f69470aSLisandro Dalcin   PetscValidCharPointer(text, 5);
26dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, string, xl, yl, cl, text);
273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
288f69470aSLisandro Dalcin }
298f69470aSLisandro Dalcin 
308f69470aSLisandro Dalcin /*@C
31811af0c4SBarry Smith    PetscDrawStringVertical - draws text onto a drawable.
328f69470aSLisandro Dalcin 
338f69470aSLisandro Dalcin    Not Collective
348f69470aSLisandro Dalcin 
358f69470aSLisandro Dalcin    Input Parameters:
368f69470aSLisandro Dalcin +  draw - the drawing context
378f69470aSLisandro Dalcin .  xl,yl - the coordinates of upper left corner of text
388f69470aSLisandro Dalcin .  cl - the color of the text
398f69470aSLisandro Dalcin -  text - the text to draw
408f69470aSLisandro Dalcin 
418f69470aSLisandro Dalcin    Level: beginner
428f69470aSLisandro Dalcin 
43811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
44db781477SPatrick Sanan           `PetscDrawStringGetSize()`
458f69470aSLisandro Dalcin @*/
46d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[])
47d71ae5a4SJacob Faibussowitsch {
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   }
613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
629400ad77SLisandro Dalcin }
638f69470aSLisandro Dalcin 
6451fa3d41SBarry Smith /*@C
65811af0c4SBarry 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 
78811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
79db781477SPatrick Sanan           `PetscDrawStringGetSize()`
8051fa3d41SBarry Smith @*/
81d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[])
82d71ae5a4SJacob Faibussowitsch {
8351fa3d41SBarry Smith   size_t    len;
8451fa3d41SBarry Smith   PetscReal tw, th;
8551fa3d41SBarry Smith 
8651fa3d41SBarry Smith   PetscFunctionBegin;
8751fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
8851fa3d41SBarry Smith   PetscValidCharPointer(text, 5);
8951fa3d41SBarry Smith 
909566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
919566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(text, &len));
929400ad77SLisandro Dalcin   xc = xc - len * tw / 2;
939566063dSJacob Faibussowitsch   PetscCall(PetscDrawString(draw, xc, yl, cl, text));
943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9551fa3d41SBarry Smith }
9651fa3d41SBarry Smith 
975c6c1daeSBarry Smith /*@C
9851fa3d41SBarry Smith    PetscDrawStringBoxed - Draws a string with a box around it
995c6c1daeSBarry Smith 
1005c6c1daeSBarry Smith    Not Collective
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith    Input Parameters:
1035c6c1daeSBarry Smith +  draw - the drawing context
1045c6c1daeSBarry Smith .  sxl - the coordinates of center of the box
1055c6c1daeSBarry Smith .  syl - the coordinates of top line of box
1065c6c1daeSBarry Smith .  sc - the color of the text
1075c6c1daeSBarry Smith .  bc - the color of the bounding box
1085c6c1daeSBarry Smith -  text - the text to draw
1095c6c1daeSBarry Smith 
1105c6c1daeSBarry Smith    Output Parameter:
1115c6c1daeSBarry Smith .   w,h - width and height of resulting box (optional)
1125c6c1daeSBarry Smith 
1135c6c1daeSBarry Smith    Level: beginner
1145c6c1daeSBarry Smith 
115811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
116db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1175c6c1daeSBarry Smith @*/
118d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h)
119d71ae5a4SJacob Faibussowitsch {
1205c6c1daeSBarry Smith   PetscReal top, left, right, bottom, tw, th;
1215c6c1daeSBarry Smith   size_t    len, mlen = 0;
1225c6c1daeSBarry Smith   char    **array;
1235c6c1daeSBarry Smith   int       cnt, i;
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith   PetscFunctionBegin;
1265c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
127064a246eSJacob Faibussowitsch   PetscValidCharPointer(text, 6);
1285c6c1daeSBarry Smith 
12942963b84SBarry Smith   if (draw->ops->boxedstring) {
130dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h);
1313ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
13242963b84SBarry Smith   }
13342963b84SBarry Smith 
1349566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray(text, '\n', &cnt, &array));
1355c6c1daeSBarry Smith   for (i = 0; i < cnt; i++) {
1369566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(array[i], &len));
1375c6c1daeSBarry Smith     mlen = PetscMax(mlen, len);
1385c6c1daeSBarry Smith   }
1395c6c1daeSBarry Smith 
1409566063dSJacob Faibussowitsch   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   top    = syl;
1435c6c1daeSBarry Smith   left   = sxl - .5 * (mlen + 2) * tw;
1445c6c1daeSBarry Smith   right  = sxl + .5 * (mlen + 2) * tw;
1455c6c1daeSBarry Smith   bottom = syl - (1.0 + cnt) * th;
1465c6c1daeSBarry Smith   if (w) *w = right - left;
1475c6c1daeSBarry Smith   if (h) *h = top - bottom;
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith   /* compute new bounding box */
1505c6c1daeSBarry Smith   draw->boundbox_xl = PetscMin(draw->boundbox_xl, left);
1515c6c1daeSBarry Smith   draw->boundbox_xr = PetscMax(draw->boundbox_xr, right);
1525c6c1daeSBarry Smith   draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom);
1535c6c1daeSBarry Smith   draw->boundbox_yr = PetscMax(draw->boundbox_yr, top);
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   /* top, left, bottom, right lines */
1569566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, top, right, top, bc));
1579566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc));
1589566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc));
1599566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc));
1605c6c1daeSBarry Smith 
16148a46eb9SPierre Jolivet   for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i]));
1629566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(cnt, array));
1633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1645c6c1daeSBarry Smith }
1658f69470aSLisandro Dalcin 
1668f69470aSLisandro Dalcin /*@
1678f69470aSLisandro Dalcin    PetscDrawStringSetSize - Sets the size for character text.
1688f69470aSLisandro Dalcin 
1698f69470aSLisandro Dalcin    Not Collective
1708f69470aSLisandro Dalcin 
1718f69470aSLisandro Dalcin    Input Parameters:
1728f69470aSLisandro Dalcin +  draw - the drawing context
1738f69470aSLisandro Dalcin .  width - the width in user coordinates
1748f69470aSLisandro Dalcin -  height - the character height in user coordinates
1758f69470aSLisandro Dalcin 
1768f69470aSLisandro Dalcin    Level: advanced
1778f69470aSLisandro Dalcin 
1788f69470aSLisandro Dalcin    Note:
1798f69470aSLisandro Dalcin    Only a limited range of sizes are available.
1808f69470aSLisandro Dalcin 
181811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
182db781477SPatrick Sanan           `PetscDrawStringGetSize()`
1838f69470aSLisandro Dalcin @*/
184d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height)
185d71ae5a4SJacob Faibussowitsch {
1868f69470aSLisandro Dalcin   PetscFunctionBegin;
1878f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
188dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, stringsetsize, width, height);
1893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1908f69470aSLisandro Dalcin }
1918f69470aSLisandro Dalcin 
1928f69470aSLisandro Dalcin /*@
1938f69470aSLisandro Dalcin    PetscDrawStringGetSize - Gets the size for character text.  The width is
1948f69470aSLisandro Dalcin    relative to the user coordinates of the window.
1958f69470aSLisandro Dalcin 
1968f69470aSLisandro Dalcin    Not Collective
1978f69470aSLisandro Dalcin 
1988f69470aSLisandro Dalcin    Input Parameters:
1998f69470aSLisandro Dalcin +  draw - the drawing context
2008f69470aSLisandro Dalcin .  width - the width in user coordinates
2018f69470aSLisandro Dalcin -  height - the character height
2028f69470aSLisandro Dalcin 
2038f69470aSLisandro Dalcin    Level: advanced
2048f69470aSLisandro Dalcin 
205811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
206db781477SPatrick Sanan           `PetscDrawStringSetSize()`
2078f69470aSLisandro Dalcin @*/
208d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height)
209d71ae5a4SJacob Faibussowitsch {
2108f69470aSLisandro Dalcin   PetscFunctionBegin;
2118f69470aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
212dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, stringgetsize, width, height);
2133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2148f69470aSLisandro Dalcin }
215