1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
25c6c1daeSBarry Smith
3cc4c1da9SBarry Smith /*@
4811af0c4SBarry Smith PetscDrawString - draws text onto a drawable.
58f69470aSLisandro Dalcin
68f69470aSLisandro Dalcin Not Collective
78f69470aSLisandro Dalcin
88f69470aSLisandro Dalcin Input Parameters:
98f69470aSLisandro Dalcin + draw - the drawing context
102fe279fdSBarry Smith . xl - coordinate of lower left corner of text
112fe279fdSBarry Smith . yl - coordinate 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 @*/
PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])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);
254f572ea9SToby Isaac PetscAssertPointer(text, 5);
26dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, string, xl, yl, cl, text);
273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
288f69470aSLisandro Dalcin }
298f69470aSLisandro Dalcin
30cc4c1da9SBarry Smith /*@
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
372fe279fdSBarry Smith . xl - coordinate of upper left corner of text
382fe279fdSBarry Smith . yl - coordinate 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
44811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
45db781477SPatrick Sanan `PetscDrawStringGetSize()`
468f69470aSLisandro Dalcin @*/
PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[])47d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[])
48d71ae5a4SJacob Faibussowitsch {
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);
544f572ea9SToby Isaac PetscAssertPointer(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));
59*6497c311SBarry Smith for (int i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * ((PetscReal)i + 1), cl, chr));
60dbbe0bcdSBarry Smith }
613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
629400ad77SLisandro Dalcin }
638f69470aSLisandro Dalcin
64cc4c1da9SBarry Smith /*@
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 @*/
PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[])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);
884f572ea9SToby Isaac PetscAssertPointer(text, 5);
8951fa3d41SBarry Smith
909566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
919566063dSJacob Faibussowitsch PetscCall(PetscStrlen(text, &len));
92*6497c311SBarry Smith xc = xc - ((PetscReal)len) * tw / 2;
939566063dSJacob Faibussowitsch PetscCall(PetscDrawString(draw, xc, yl, cl, text));
943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9551fa3d41SBarry Smith }
9651fa3d41SBarry Smith
97cc4c1da9SBarry Smith /*@
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
11010450e9eSJacob Faibussowitsch Output Parameters:
11110450e9eSJacob Faibussowitsch + w - the width of the resulting box (optional)
11210450e9eSJacob Faibussowitsch - h - the height of resulting box (optional)
1135c6c1daeSBarry Smith
1145c6c1daeSBarry Smith Level: beginner
1155c6c1daeSBarry Smith
116811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
117db781477SPatrick Sanan `PetscDrawStringGetSize()`
1185c6c1daeSBarry Smith @*/
PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal * w,PetscReal * h)119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h)
120d71ae5a4SJacob Faibussowitsch {
1215c6c1daeSBarry Smith PetscReal top, left, right, bottom, tw, th;
1225c6c1daeSBarry Smith size_t len, mlen = 0;
1235c6c1daeSBarry Smith char **array;
1245c6c1daeSBarry Smith int cnt, i;
1255c6c1daeSBarry Smith
1265c6c1daeSBarry Smith PetscFunctionBegin;
1275c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1284f572ea9SToby Isaac PetscAssertPointer(text, 6);
1295c6c1daeSBarry Smith
13042963b84SBarry Smith if (draw->ops->boxedstring) {
131dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h);
1323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
13342963b84SBarry Smith }
13442963b84SBarry Smith
1359566063dSJacob Faibussowitsch PetscCall(PetscStrToArray(text, '\n', &cnt, &array));
1365c6c1daeSBarry Smith for (i = 0; i < cnt; i++) {
1379566063dSJacob Faibussowitsch PetscCall(PetscStrlen(array[i], &len));
1385c6c1daeSBarry Smith mlen = PetscMax(mlen, len);
1395c6c1daeSBarry Smith }
1405c6c1daeSBarry Smith
1419566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
1425c6c1daeSBarry Smith
1435c6c1daeSBarry Smith top = syl;
144*6497c311SBarry Smith left = sxl - .5 * ((PetscReal)mlen + 2) * tw;
145*6497c311SBarry Smith right = sxl + .5 * ((PetscReal)mlen + 2) * tw;
146*6497c311SBarry Smith bottom = syl - (1.0 + (PetscReal)cnt) * th;
1475c6c1daeSBarry Smith if (w) *w = right - left;
1485c6c1daeSBarry Smith if (h) *h = top - bottom;
1495c6c1daeSBarry Smith
1505c6c1daeSBarry Smith /* compute new bounding box */
1515c6c1daeSBarry Smith draw->boundbox_xl = PetscMin(draw->boundbox_xl, left);
1525c6c1daeSBarry Smith draw->boundbox_xr = PetscMax(draw->boundbox_xr, right);
1535c6c1daeSBarry Smith draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom);
1545c6c1daeSBarry Smith draw->boundbox_yr = PetscMax(draw->boundbox_yr, top);
1555c6c1daeSBarry Smith
1565c6c1daeSBarry Smith /* top, left, bottom, right lines */
1579566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, top, right, top, bc));
1589566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc));
1599566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc));
1609566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc));
1615c6c1daeSBarry Smith
16248a46eb9SPierre Jolivet for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i]));
1639566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(cnt, array));
1643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1655c6c1daeSBarry Smith }
1668f69470aSLisandro Dalcin
1678f69470aSLisandro Dalcin /*@
1688f69470aSLisandro Dalcin PetscDrawStringSetSize - Sets the size for character text.
1698f69470aSLisandro Dalcin
1708f69470aSLisandro Dalcin Not Collective
1718f69470aSLisandro Dalcin
1728f69470aSLisandro Dalcin Input Parameters:
1738f69470aSLisandro Dalcin + draw - the drawing context
1748f69470aSLisandro Dalcin . width - the width in user coordinates
1758f69470aSLisandro Dalcin - height - the character height in user coordinates
1768f69470aSLisandro Dalcin
1778f69470aSLisandro Dalcin Level: advanced
1788f69470aSLisandro Dalcin
1798f69470aSLisandro Dalcin Note:
1808f69470aSLisandro Dalcin Only a limited range of sizes are available.
1818f69470aSLisandro Dalcin
182811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
183db781477SPatrick Sanan `PetscDrawStringGetSize()`
1848f69470aSLisandro Dalcin @*/
PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height)185d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height)
186d71ae5a4SJacob Faibussowitsch {
1878f69470aSLisandro Dalcin PetscFunctionBegin;
1888f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
189dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, stringsetsize, width, height);
1903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1918f69470aSLisandro Dalcin }
1928f69470aSLisandro Dalcin
1938f69470aSLisandro Dalcin /*@
1948f69470aSLisandro Dalcin PetscDrawStringGetSize - Gets the size for character text. The width is
1958f69470aSLisandro Dalcin relative to the user coordinates of the window.
1968f69470aSLisandro Dalcin
1978f69470aSLisandro Dalcin Not Collective
1988f69470aSLisandro Dalcin
1998f69470aSLisandro Dalcin Input Parameters:
2008f69470aSLisandro Dalcin + draw - the drawing context
2018f69470aSLisandro Dalcin . width - the width in user coordinates
2028f69470aSLisandro Dalcin - height - the character height
2038f69470aSLisandro Dalcin
2048f69470aSLisandro Dalcin Level: advanced
2058f69470aSLisandro Dalcin
206811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
207db781477SPatrick Sanan `PetscDrawStringSetSize()`
2088f69470aSLisandro Dalcin @*/
PetscDrawStringGetSize(PetscDraw draw,PetscReal * width,PetscReal * height)209d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height)
210d71ae5a4SJacob Faibussowitsch {
2118f69470aSLisandro Dalcin PetscFunctionBegin;
2128f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
213dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, stringgetsize, width, height);
2143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2158f69470aSLisandro Dalcin }
216