1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 25c6c1daeSBarry Smith 3*cc4c1da9SBarry 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 @*/ 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 30*cc4c1da9SBarry 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 @*/ 47d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) 48d71ae5a4SJacob Faibussowitsch { 499400ad77SLisandro Dalcin int i; 509400ad77SLisandro Dalcin char chr[2] = {0, 0}; 519400ad77SLisandro Dalcin PetscReal tw, th; 528f69470aSLisandro Dalcin 538f69470aSLisandro Dalcin PetscFunctionBegin; 548f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 554f572ea9SToby Isaac PetscAssertPointer(text, 5); 569400ad77SLisandro Dalcin 57dbbe0bcdSBarry Smith if (draw->ops->stringvertical) PetscUseTypeMethod(draw, stringvertical, xl, yl, cl, text); 58dbbe0bcdSBarry Smith else { 599566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, &tw, &th)); 6048a46eb9SPierre Jolivet for (i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * (i + 1), cl, chr)); 61dbbe0bcdSBarry Smith } 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 639400ad77SLisandro Dalcin } 648f69470aSLisandro Dalcin 65*cc4c1da9SBarry Smith /*@ 66811af0c4SBarry Smith PetscDrawStringCentered - draws text onto a drawable centered at a point 6751fa3d41SBarry Smith 6851fa3d41SBarry Smith Not Collective 6951fa3d41SBarry Smith 7051fa3d41SBarry Smith Input Parameters: 7151fa3d41SBarry Smith + draw - the drawing context 7251fa3d41SBarry Smith . xc - the coordinates of right-left center of text 7351fa3d41SBarry Smith . yl - the coordinates of lower edge of text 7451fa3d41SBarry Smith . cl - the color of the text 7551fa3d41SBarry Smith - text - the text to draw 7651fa3d41SBarry Smith 7751fa3d41SBarry Smith Level: beginner 7851fa3d41SBarry Smith 79811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`, 80db781477SPatrick Sanan `PetscDrawStringGetSize()` 8151fa3d41SBarry Smith @*/ 82d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[]) 83d71ae5a4SJacob Faibussowitsch { 8451fa3d41SBarry Smith size_t len; 8551fa3d41SBarry Smith PetscReal tw, th; 8651fa3d41SBarry Smith 8751fa3d41SBarry Smith PetscFunctionBegin; 8851fa3d41SBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 894f572ea9SToby Isaac PetscAssertPointer(text, 5); 9051fa3d41SBarry Smith 919566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, &tw, &th)); 929566063dSJacob Faibussowitsch PetscCall(PetscStrlen(text, &len)); 939400ad77SLisandro Dalcin xc = xc - len * tw / 2; 949566063dSJacob Faibussowitsch PetscCall(PetscDrawString(draw, xc, yl, cl, text)); 953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9651fa3d41SBarry Smith } 9751fa3d41SBarry Smith 98*cc4c1da9SBarry Smith /*@ 9951fa3d41SBarry Smith PetscDrawStringBoxed - Draws a string with a box around it 1005c6c1daeSBarry Smith 1015c6c1daeSBarry Smith Not Collective 1025c6c1daeSBarry Smith 1035c6c1daeSBarry Smith Input Parameters: 1045c6c1daeSBarry Smith + draw - the drawing context 1055c6c1daeSBarry Smith . sxl - the coordinates of center of the box 1065c6c1daeSBarry Smith . syl - the coordinates of top line of box 1075c6c1daeSBarry Smith . sc - the color of the text 1085c6c1daeSBarry Smith . bc - the color of the bounding box 1095c6c1daeSBarry Smith - text - the text to draw 1105c6c1daeSBarry Smith 11110450e9eSJacob Faibussowitsch Output Parameters: 11210450e9eSJacob Faibussowitsch + w - the width of the resulting box (optional) 11310450e9eSJacob Faibussowitsch - h - the height of resulting box (optional) 1145c6c1daeSBarry Smith 1155c6c1daeSBarry Smith Level: beginner 1165c6c1daeSBarry Smith 117811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`, 118db781477SPatrick Sanan `PetscDrawStringGetSize()` 1195c6c1daeSBarry Smith @*/ 120d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h) 121d71ae5a4SJacob Faibussowitsch { 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); 1294f572ea9SToby Isaac PetscAssertPointer(text, 6); 1305c6c1daeSBarry Smith 13142963b84SBarry Smith if (draw->ops->boxedstring) { 132dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h); 1333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 16348a46eb9SPierre 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)); 1653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 183811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, 184db781477SPatrick Sanan `PetscDrawStringGetSize()` 1858f69470aSLisandro Dalcin @*/ 186d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height) 187d71ae5a4SJacob Faibussowitsch { 1888f69470aSLisandro Dalcin PetscFunctionBegin; 1898f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 190dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, stringsetsize, width, height); 1913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 207811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, 208db781477SPatrick Sanan `PetscDrawStringSetSize()` 2098f69470aSLisandro Dalcin @*/ 210d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height) 211d71ae5a4SJacob Faibussowitsch { 2128f69470aSLisandro Dalcin PetscFunctionBegin; 2138f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 214dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, stringgetsize, width, height); 2153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2168f69470aSLisandro Dalcin } 217