120f4b53cSBarry 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 112fe279fdSBarry Smith . xl - coordinate of lower left corner of text 122fe279fdSBarry Smith . yl - coordinate of lower left corner of text 138f69470aSLisandro Dalcin . cl - the color of the text 148f69470aSLisandro Dalcin - text - the text to draw 158f69470aSLisandro Dalcin 168f69470aSLisandro Dalcin Level: beginner 178f69470aSLisandro Dalcin 18811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`, 19db781477SPatrick Sanan `PetscDrawStringGetSize()`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`, 20db781477SPatrick Sanan `PetscDrawMarker()`, `PetscDrawPoint()` 218f69470aSLisandro Dalcin @*/ 22d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawString(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) 23d71ae5a4SJacob Faibussowitsch { 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); 283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 298f69470aSLisandro Dalcin } 308f69470aSLisandro Dalcin 318f69470aSLisandro Dalcin /*@C 32811af0c4SBarry 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 382fe279fdSBarry Smith . xl - coordinate of upper left corner of text 392fe279fdSBarry Smith . yl - coordinate 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 45811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`, 46db781477SPatrick Sanan `PetscDrawStringGetSize()` 478f69470aSLisandro Dalcin @*/ 48d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[]) 49d71ae5a4SJacob Faibussowitsch { 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)); 6148a46eb9SPierre Jolivet for (i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * (i + 1), cl, chr)); 62dbbe0bcdSBarry Smith } 633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 649400ad77SLisandro Dalcin } 658f69470aSLisandro Dalcin 6651fa3d41SBarry Smith /*@C 67811af0c4SBarry Smith PetscDrawStringCentered - draws 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 80811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`, 81db781477SPatrick Sanan `PetscDrawStringGetSize()` 8251fa3d41SBarry Smith @*/ 83d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[]) 84d71ae5a4SJacob Faibussowitsch { 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)); 963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 112*10450e9eSJacob Faibussowitsch Output Parameters: 113*10450e9eSJacob Faibussowitsch + w - the width of the resulting box (optional) 114*10450e9eSJacob Faibussowitsch - h - the height of resulting box (optional) 1155c6c1daeSBarry Smith 1165c6c1daeSBarry Smith Level: beginner 1175c6c1daeSBarry Smith 118811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`, 119db781477SPatrick Sanan `PetscDrawStringGetSize()` 1205c6c1daeSBarry Smith @*/ 121d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h) 122d71ae5a4SJacob Faibussowitsch { 1235c6c1daeSBarry Smith PetscReal top, left, right, bottom, tw, th; 1245c6c1daeSBarry Smith size_t len, mlen = 0; 1255c6c1daeSBarry Smith char **array; 1265c6c1daeSBarry Smith int cnt, i; 1275c6c1daeSBarry Smith 1285c6c1daeSBarry Smith PetscFunctionBegin; 1295c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 130064a246eSJacob Faibussowitsch PetscValidCharPointer(text, 6); 1315c6c1daeSBarry Smith 13242963b84SBarry Smith if (draw->ops->boxedstring) { 133dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h); 1343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13542963b84SBarry Smith } 13642963b84SBarry Smith 1379566063dSJacob Faibussowitsch PetscCall(PetscStrToArray(text, '\n', &cnt, &array)); 1385c6c1daeSBarry Smith for (i = 0; i < cnt; i++) { 1399566063dSJacob Faibussowitsch PetscCall(PetscStrlen(array[i], &len)); 1405c6c1daeSBarry Smith mlen = PetscMax(mlen, len); 1415c6c1daeSBarry Smith } 1425c6c1daeSBarry Smith 1439566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, &tw, &th)); 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith top = syl; 1465c6c1daeSBarry Smith left = sxl - .5 * (mlen + 2) * tw; 1475c6c1daeSBarry Smith right = sxl + .5 * (mlen + 2) * tw; 1485c6c1daeSBarry Smith bottom = syl - (1.0 + cnt) * th; 1495c6c1daeSBarry Smith if (w) *w = right - left; 1505c6c1daeSBarry Smith if (h) *h = top - bottom; 1515c6c1daeSBarry Smith 1525c6c1daeSBarry Smith /* compute new bounding box */ 1535c6c1daeSBarry Smith draw->boundbox_xl = PetscMin(draw->boundbox_xl, left); 1545c6c1daeSBarry Smith draw->boundbox_xr = PetscMax(draw->boundbox_xr, right); 1555c6c1daeSBarry Smith draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom); 1565c6c1daeSBarry Smith draw->boundbox_yr = PetscMax(draw->boundbox_yr, top); 1575c6c1daeSBarry Smith 1585c6c1daeSBarry Smith /* top, left, bottom, right lines */ 1599566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, top, right, top, bc)); 1609566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc)); 1619566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc)); 1629566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc)); 1635c6c1daeSBarry Smith 16448a46eb9SPierre Jolivet for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i])); 1659566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(cnt, array)); 1663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1675c6c1daeSBarry Smith } 1688f69470aSLisandro Dalcin 1698f69470aSLisandro Dalcin /*@ 1708f69470aSLisandro Dalcin PetscDrawStringSetSize - Sets the size for character text. 1718f69470aSLisandro Dalcin 1728f69470aSLisandro Dalcin Not Collective 1738f69470aSLisandro Dalcin 1748f69470aSLisandro Dalcin Input Parameters: 1758f69470aSLisandro Dalcin + draw - the drawing context 1768f69470aSLisandro Dalcin . width - the width in user coordinates 1778f69470aSLisandro Dalcin - height - the character height in user coordinates 1788f69470aSLisandro Dalcin 1798f69470aSLisandro Dalcin Level: advanced 1808f69470aSLisandro Dalcin 1818f69470aSLisandro Dalcin Note: 1828f69470aSLisandro Dalcin Only a limited range of sizes are available. 1838f69470aSLisandro Dalcin 184811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, 185db781477SPatrick Sanan `PetscDrawStringGetSize()` 1868f69470aSLisandro Dalcin @*/ 187d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height) 188d71ae5a4SJacob Faibussowitsch { 1898f69470aSLisandro Dalcin PetscFunctionBegin; 1908f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 191dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, stringsetsize, width, height); 1923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1938f69470aSLisandro Dalcin } 1948f69470aSLisandro Dalcin 1958f69470aSLisandro Dalcin /*@ 1968f69470aSLisandro Dalcin PetscDrawStringGetSize - Gets the size for character text. The width is 1978f69470aSLisandro Dalcin relative to the user coordinates of the window. 1988f69470aSLisandro Dalcin 1998f69470aSLisandro Dalcin Not Collective 2008f69470aSLisandro Dalcin 2018f69470aSLisandro Dalcin Input Parameters: 2028f69470aSLisandro Dalcin + draw - the drawing context 2038f69470aSLisandro Dalcin . width - the width in user coordinates 2048f69470aSLisandro Dalcin - height - the character height 2058f69470aSLisandro Dalcin 2068f69470aSLisandro Dalcin Level: advanced 2078f69470aSLisandro Dalcin 208811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, 209db781477SPatrick Sanan `PetscDrawStringSetSize()` 2108f69470aSLisandro Dalcin @*/ 211d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height) 212d71ae5a4SJacob Faibussowitsch { 2138f69470aSLisandro Dalcin PetscFunctionBegin; 2148f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 215dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, stringgetsize, width, height); 2163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2178f69470aSLisandro Dalcin } 218