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 78f69470aSLisandro Dalcin PetscDrawString - PetscDraws 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 198f69470aSLisandro Dalcin 20*50d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(), 21ba1e01c4SBarry Smith PetscDrawStringGetSize(), PetscDrawLine(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), 22ba1e01c4SBarry Smith PetscDrawMarker(), PetscDrawPoint() 238f69470aSLisandro Dalcin 248f69470aSLisandro Dalcin @*/ 258f69470aSLisandro Dalcin PetscErrorCode PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 268f69470aSLisandro Dalcin { 278f69470aSLisandro Dalcin PetscErrorCode ierr; 288f69470aSLisandro Dalcin 298f69470aSLisandro Dalcin PetscFunctionBegin; 308f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 318f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 328f69470aSLisandro Dalcin if (!draw->ops->string) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing strings",((PetscObject)draw)->type_name); 338f69470aSLisandro Dalcin ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr); 348f69470aSLisandro Dalcin PetscFunctionReturn(0); 358f69470aSLisandro Dalcin } 368f69470aSLisandro Dalcin 378f69470aSLisandro Dalcin /*@C 388f69470aSLisandro Dalcin PetscDrawStringVertical - PetscDraws text onto a drawable. 398f69470aSLisandro Dalcin 408f69470aSLisandro Dalcin Not Collective 418f69470aSLisandro Dalcin 428f69470aSLisandro Dalcin Input Parameters: 438f69470aSLisandro Dalcin + draw - the drawing context 448f69470aSLisandro Dalcin . xl,yl - the coordinates of upper left corner of text 458f69470aSLisandro Dalcin . cl - the color of the text 468f69470aSLisandro Dalcin - text - the text to draw 478f69470aSLisandro Dalcin 488f69470aSLisandro Dalcin Level: beginner 498f69470aSLisandro Dalcin 50*50d92d24SPierre Jolivet .seealso: PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), PetscDrawStringSetSize(), 51ba1e01c4SBarry Smith PetscDrawStringGetSize() 528f69470aSLisandro Dalcin 538f69470aSLisandro Dalcin @*/ 548f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 558f69470aSLisandro Dalcin { 569400ad77SLisandro Dalcin int i; 579400ad77SLisandro Dalcin char chr[2] = {0, 0}; 589400ad77SLisandro Dalcin PetscReal tw,th; 598f69470aSLisandro Dalcin PetscErrorCode ierr; 608f69470aSLisandro Dalcin 618f69470aSLisandro Dalcin PetscFunctionBegin; 628f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 638f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 649400ad77SLisandro Dalcin 659400ad77SLisandro Dalcin if (draw->ops->stringvertical) { 668f69470aSLisandro Dalcin ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr); 678f69470aSLisandro Dalcin PetscFunctionReturn(0); 688f69470aSLisandro Dalcin } 699400ad77SLisandro Dalcin ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 709400ad77SLisandro Dalcin for (i = 0; (chr[0] = text[i]); i++) { 719400ad77SLisandro Dalcin ierr = PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);CHKERRQ(ierr); 729400ad77SLisandro Dalcin } 739400ad77SLisandro Dalcin PetscFunctionReturn(0); 749400ad77SLisandro Dalcin } 758f69470aSLisandro Dalcin 7651fa3d41SBarry Smith /*@C 7751fa3d41SBarry Smith PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point 7851fa3d41SBarry Smith 7951fa3d41SBarry Smith Not Collective 8051fa3d41SBarry Smith 8151fa3d41SBarry Smith Input Parameters: 8251fa3d41SBarry Smith + draw - the drawing context 8351fa3d41SBarry Smith . xc - the coordinates of right-left center of text 8451fa3d41SBarry Smith . yl - the coordinates of lower edge of text 8551fa3d41SBarry Smith . cl - the color of the text 8651fa3d41SBarry Smith - text - the text to draw 8751fa3d41SBarry Smith 8851fa3d41SBarry Smith Level: beginner 8951fa3d41SBarry Smith 9051fa3d41SBarry Smith 91*50d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed(), PetscDrawStringSetSize(), 92ba1e01c4SBarry Smith PetscDrawStringGetSize() 9351fa3d41SBarry Smith 9451fa3d41SBarry Smith @*/ 9551fa3d41SBarry Smith PetscErrorCode PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[]) 9651fa3d41SBarry Smith { 9751fa3d41SBarry Smith PetscErrorCode ierr; 9851fa3d41SBarry Smith size_t len; 9951fa3d41SBarry Smith PetscReal tw,th; 10051fa3d41SBarry Smith 10151fa3d41SBarry Smith PetscFunctionBegin; 10251fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 10351fa3d41SBarry Smith PetscValidCharPointer(text,5); 10451fa3d41SBarry Smith 10551fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 10651fa3d41SBarry Smith ierr = PetscStrlen(text,&len);CHKERRQ(ierr); 1079400ad77SLisandro Dalcin xc = xc - len*tw/2; 10851fa3d41SBarry Smith ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr); 10951fa3d41SBarry Smith PetscFunctionReturn(0); 11051fa3d41SBarry Smith } 11151fa3d41SBarry Smith 1125c6c1daeSBarry Smith /*@C 11351fa3d41SBarry Smith PetscDrawStringBoxed - Draws a string with a box around it 1145c6c1daeSBarry Smith 1155c6c1daeSBarry Smith Not Collective 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith Input Parameters: 1185c6c1daeSBarry Smith + draw - the drawing context 1195c6c1daeSBarry Smith . sxl - the coordinates of center of the box 1205c6c1daeSBarry Smith . syl - the coordinates of top line of box 1215c6c1daeSBarry Smith . sc - the color of the text 1225c6c1daeSBarry Smith . bc - the color of the bounding box 1235c6c1daeSBarry Smith - text - the text to draw 1245c6c1daeSBarry Smith 1255c6c1daeSBarry Smith Output Parameter: 1265c6c1daeSBarry Smith . w,h - width and height of resulting box (optional) 1275c6c1daeSBarry Smith 1285c6c1daeSBarry Smith Level: beginner 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith 131*50d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringSetSize(), 132ba1e01c4SBarry Smith PetscDrawStringGetSize() 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith @*/ 13551fa3d41SBarry Smith PetscErrorCode PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h) 1365c6c1daeSBarry Smith { 1375c6c1daeSBarry Smith PetscErrorCode ierr; 1385c6c1daeSBarry Smith PetscReal top,left,right,bottom,tw,th; 1395c6c1daeSBarry Smith size_t len,mlen = 0; 1405c6c1daeSBarry Smith char **array; 1415c6c1daeSBarry Smith int cnt,i; 1425c6c1daeSBarry Smith 1435c6c1daeSBarry Smith PetscFunctionBegin; 1445c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1455c6c1daeSBarry Smith PetscValidCharPointer(text,5); 1465c6c1daeSBarry Smith 14742963b84SBarry Smith if (draw->ops->boxedstring) { 14842963b84SBarry Smith ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr); 14942963b84SBarry Smith PetscFunctionReturn(0); 15042963b84SBarry Smith } 15142963b84SBarry Smith 1525c6c1daeSBarry Smith ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr); 1535c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 1545c6c1daeSBarry Smith ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr); 1555c6c1daeSBarry Smith mlen = PetscMax(mlen,len); 1565c6c1daeSBarry Smith } 1575c6c1daeSBarry Smith 1585c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith top = syl; 1615c6c1daeSBarry Smith left = sxl - .5*(mlen + 2)*tw; 1625c6c1daeSBarry Smith right = sxl + .5*(mlen + 2)*tw; 1635c6c1daeSBarry Smith bottom = syl - (1.0 + cnt)*th; 1645c6c1daeSBarry Smith if (w) *w = right - left; 1655c6c1daeSBarry Smith if (h) *h = top - bottom; 1665c6c1daeSBarry Smith 1675c6c1daeSBarry Smith /* compute new bounding box */ 1685c6c1daeSBarry Smith draw->boundbox_xl = PetscMin(draw->boundbox_xl,left); 1695c6c1daeSBarry Smith draw->boundbox_xr = PetscMax(draw->boundbox_xr,right); 1705c6c1daeSBarry Smith draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom); 1715c6c1daeSBarry Smith draw->boundbox_yr = PetscMax(draw->boundbox_yr,top); 1725c6c1daeSBarry Smith 1735c6c1daeSBarry Smith /* top, left, bottom, right lines */ 1745c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr); 1755c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr); 1765c6c1daeSBarry Smith ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr); 1775c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr); 1785c6c1daeSBarry Smith 1795c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 1805c6c1daeSBarry Smith ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr); 1815c6c1daeSBarry Smith } 1825c6c1daeSBarry Smith ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr); 1835c6c1daeSBarry Smith PetscFunctionReturn(0); 1845c6c1daeSBarry Smith } 1858f69470aSLisandro Dalcin 1868f69470aSLisandro Dalcin /*@ 1878f69470aSLisandro Dalcin PetscDrawStringSetSize - Sets the size for character text. 1888f69470aSLisandro Dalcin 1898f69470aSLisandro Dalcin Not Collective 1908f69470aSLisandro Dalcin 1918f69470aSLisandro Dalcin Input Parameters: 1928f69470aSLisandro Dalcin + draw - the drawing context 1938f69470aSLisandro Dalcin . width - the width in user coordinates 1948f69470aSLisandro Dalcin - height - the character height in user coordinates 1958f69470aSLisandro Dalcin 1968f69470aSLisandro Dalcin Level: advanced 1978f69470aSLisandro Dalcin 1988f69470aSLisandro Dalcin Note: 1998f69470aSLisandro Dalcin Only a limited range of sizes are available. 2008f69470aSLisandro Dalcin 201*50d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), 202ba1e01c4SBarry Smith PetscDrawStringGetSize() 2038f69470aSLisandro Dalcin 2048f69470aSLisandro Dalcin @*/ 2058f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height) 2068f69470aSLisandro Dalcin { 2078f69470aSLisandro Dalcin PetscErrorCode ierr; 2088f69470aSLisandro Dalcin 2098f69470aSLisandro Dalcin PetscFunctionBegin; 2108f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2118f69470aSLisandro Dalcin if (draw->ops->stringsetsize) { 2128f69470aSLisandro Dalcin ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr); 2138f69470aSLisandro Dalcin } 2148f69470aSLisandro Dalcin PetscFunctionReturn(0); 2158f69470aSLisandro Dalcin } 2168f69470aSLisandro Dalcin 2178f69470aSLisandro Dalcin /*@ 2188f69470aSLisandro Dalcin PetscDrawStringGetSize - Gets the size for character text. The width is 2198f69470aSLisandro Dalcin relative to the user coordinates of the window. 2208f69470aSLisandro Dalcin 2218f69470aSLisandro Dalcin Not Collective 2228f69470aSLisandro Dalcin 2238f69470aSLisandro Dalcin Input Parameters: 2248f69470aSLisandro Dalcin + draw - the drawing context 2258f69470aSLisandro Dalcin . width - the width in user coordinates 2268f69470aSLisandro Dalcin - height - the character height 2278f69470aSLisandro Dalcin 2288f69470aSLisandro Dalcin Level: advanced 2298f69470aSLisandro Dalcin 230*50d92d24SPierre Jolivet .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringCentered(), PetscDrawStringBoxed(), 231ba1e01c4SBarry Smith PetscDrawStringSetSize() 2328f69470aSLisandro Dalcin 2338f69470aSLisandro Dalcin @*/ 2348f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height) 2358f69470aSLisandro Dalcin { 2368f69470aSLisandro Dalcin PetscErrorCode ierr; 2378f69470aSLisandro Dalcin 2388f69470aSLisandro Dalcin PetscFunctionBegin; 2398f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2408f69470aSLisandro Dalcin if (!draw->ops->stringgetsize) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support getting string size",((PetscObject)draw)->type_name); 2418f69470aSLisandro Dalcin ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr); 2428f69470aSLisandro Dalcin PetscFunctionReturn(0); 2438f69470aSLisandro Dalcin } 2448f69470aSLisandro Dalcin 245