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 65c6c1daeSBarry Smith #undef __FUNCT__ 78f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawString" 88f69470aSLisandro Dalcin /*@C 98f69470aSLisandro Dalcin PetscDrawString - PetscDraws text onto a drawable. 108f69470aSLisandro Dalcin 118f69470aSLisandro Dalcin Not Collective 128f69470aSLisandro Dalcin 138f69470aSLisandro Dalcin Input Parameters: 148f69470aSLisandro Dalcin + draw - the drawing context 15*9400ad77SLisandro Dalcin . xl,yl - the coordinates of lower left corner of text 168f69470aSLisandro Dalcin . cl - the color of the text 178f69470aSLisandro Dalcin - text - the text to draw 188f69470aSLisandro Dalcin 198f69470aSLisandro Dalcin Level: beginner 208f69470aSLisandro Dalcin 218f69470aSLisandro Dalcin Concepts: drawing^string 228f69470aSLisandro Dalcin Concepts: string^drawing 238f69470aSLisandro Dalcin 248f69470aSLisandro Dalcin .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed() 258f69470aSLisandro Dalcin 268f69470aSLisandro Dalcin @*/ 278f69470aSLisandro Dalcin PetscErrorCode PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 288f69470aSLisandro Dalcin { 298f69470aSLisandro Dalcin PetscErrorCode ierr; 308f69470aSLisandro Dalcin PetscBool isnull; 318f69470aSLisandro Dalcin 328f69470aSLisandro Dalcin PetscFunctionBegin; 338f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 348f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 358f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 368f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 37*9400ad77SLisandro Dalcin 388f69470aSLisandro 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); 398f69470aSLisandro Dalcin ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr); 408f69470aSLisandro Dalcin PetscFunctionReturn(0); 418f69470aSLisandro Dalcin } 428f69470aSLisandro Dalcin 438f69470aSLisandro Dalcin #undef __FUNCT__ 448f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical" 458f69470aSLisandro Dalcin /*@C 468f69470aSLisandro Dalcin PetscDrawStringVertical - PetscDraws text onto a drawable. 478f69470aSLisandro Dalcin 488f69470aSLisandro Dalcin Not Collective 498f69470aSLisandro Dalcin 508f69470aSLisandro Dalcin Input Parameters: 518f69470aSLisandro Dalcin + draw - the drawing context 528f69470aSLisandro Dalcin . xl,yl - the coordinates of upper left corner of text 538f69470aSLisandro Dalcin . cl - the color of the text 548f69470aSLisandro Dalcin - text - the text to draw 558f69470aSLisandro Dalcin 568f69470aSLisandro Dalcin Level: beginner 578f69470aSLisandro Dalcin 588f69470aSLisandro Dalcin Concepts: string^drawing vertical 598f69470aSLisandro Dalcin 608f69470aSLisandro Dalcin .seealso: PetscDrawString() 618f69470aSLisandro Dalcin 628f69470aSLisandro Dalcin @*/ 638f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 648f69470aSLisandro Dalcin { 65*9400ad77SLisandro Dalcin int i; 66*9400ad77SLisandro Dalcin char chr[2] = {0, 0}; 67*9400ad77SLisandro Dalcin PetscReal tw,th; 688f69470aSLisandro Dalcin PetscErrorCode ierr; 698f69470aSLisandro Dalcin PetscBool isnull; 708f69470aSLisandro Dalcin 718f69470aSLisandro Dalcin PetscFunctionBegin; 728f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 738f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 748f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 758f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 76*9400ad77SLisandro Dalcin 77*9400ad77SLisandro Dalcin if (draw->ops->stringvertical) { 788f69470aSLisandro Dalcin ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr); 798f69470aSLisandro Dalcin PetscFunctionReturn(0); 808f69470aSLisandro Dalcin } 81*9400ad77SLisandro Dalcin ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 82*9400ad77SLisandro Dalcin for (i = 0; (chr[0] = text[i]); i++) { 83*9400ad77SLisandro Dalcin ierr = PetscDrawString(draw,xl,yl-th*(i+1),cl,chr);CHKERRQ(ierr); 84*9400ad77SLisandro Dalcin } 85*9400ad77SLisandro Dalcin PetscFunctionReturn(0); 86*9400ad77SLisandro Dalcin } 878f69470aSLisandro Dalcin 888f69470aSLisandro Dalcin #undef __FUNCT__ 8951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringCentered" 9051fa3d41SBarry Smith /*@C 9151fa3d41SBarry Smith PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point 9251fa3d41SBarry Smith 9351fa3d41SBarry Smith Not Collective 9451fa3d41SBarry Smith 9551fa3d41SBarry Smith Input Parameters: 9651fa3d41SBarry Smith + draw - the drawing context 9751fa3d41SBarry Smith . xc - the coordinates of right-left center of text 9851fa3d41SBarry Smith . yl - the coordinates of lower edge of text 9951fa3d41SBarry Smith . cl - the color of the text 10051fa3d41SBarry Smith - text - the text to draw 10151fa3d41SBarry Smith 10251fa3d41SBarry Smith Level: beginner 10351fa3d41SBarry Smith 10451fa3d41SBarry Smith Concepts: drawing^string 10551fa3d41SBarry Smith Concepts: string^drawing 10651fa3d41SBarry Smith 10751fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed() 10851fa3d41SBarry Smith 10951fa3d41SBarry Smith @*/ 11051fa3d41SBarry Smith PetscErrorCode PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[]) 11151fa3d41SBarry Smith { 11251fa3d41SBarry Smith PetscErrorCode ierr; 11351fa3d41SBarry Smith PetscBool isnull; 11451fa3d41SBarry Smith size_t len; 11551fa3d41SBarry Smith PetscReal tw,th; 11651fa3d41SBarry Smith 11751fa3d41SBarry Smith PetscFunctionBegin; 11851fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 11951fa3d41SBarry Smith PetscValidCharPointer(text,5); 1208f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 12151fa3d41SBarry Smith if (isnull) PetscFunctionReturn(0); 12251fa3d41SBarry Smith 12351fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 12451fa3d41SBarry Smith ierr = PetscStrlen(text,&len);CHKERRQ(ierr); 125*9400ad77SLisandro Dalcin xc = xc - len*tw/2; 12651fa3d41SBarry Smith ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr); 12751fa3d41SBarry Smith PetscFunctionReturn(0); 12851fa3d41SBarry Smith } 12951fa3d41SBarry Smith 1305c6c1daeSBarry Smith #undef __FUNCT__ 13151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed" 1325c6c1daeSBarry Smith /*@C 13351fa3d41SBarry Smith PetscDrawStringBoxed - Draws a string with a box around it 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Not Collective 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Input Parameters: 1385c6c1daeSBarry Smith + draw - the drawing context 1395c6c1daeSBarry Smith . sxl - the coordinates of center of the box 1405c6c1daeSBarry Smith . syl - the coordinates of top line of box 1415c6c1daeSBarry Smith . sc - the color of the text 1425c6c1daeSBarry Smith . bc - the color of the bounding box 1435c6c1daeSBarry Smith - text - the text to draw 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Output Parameter: 1465c6c1daeSBarry Smith . w,h - width and height of resulting box (optional) 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith Level: beginner 1495c6c1daeSBarry Smith 1505c6c1daeSBarry Smith Concepts: drawing^string 1515c6c1daeSBarry Smith Concepts: string^drawing 1525c6c1daeSBarry Smith 15351fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered() 1545c6c1daeSBarry Smith 1555c6c1daeSBarry Smith @*/ 15651fa3d41SBarry Smith PetscErrorCode PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h) 1575c6c1daeSBarry Smith { 1585c6c1daeSBarry Smith PetscErrorCode ierr; 1595c6c1daeSBarry Smith PetscBool isnull; 1605c6c1daeSBarry Smith PetscReal top,left,right,bottom,tw,th; 1615c6c1daeSBarry Smith size_t len,mlen = 0; 1625c6c1daeSBarry Smith char **array; 1635c6c1daeSBarry Smith int cnt,i; 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith PetscFunctionBegin; 1665c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1675c6c1daeSBarry Smith PetscValidCharPointer(text,5); 1688f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1695c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 1705c6c1daeSBarry Smith 17142963b84SBarry Smith if (draw->ops->boxedstring) { 17242963b84SBarry Smith ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr); 17342963b84SBarry Smith PetscFunctionReturn(0); 17442963b84SBarry Smith } 17542963b84SBarry Smith 1765c6c1daeSBarry Smith ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr); 1775c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 1785c6c1daeSBarry Smith ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr); 1795c6c1daeSBarry Smith mlen = PetscMax(mlen,len); 1805c6c1daeSBarry Smith } 1815c6c1daeSBarry Smith 1825c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith top = syl; 1855c6c1daeSBarry Smith left = sxl - .5*(mlen + 2)*tw; 1865c6c1daeSBarry Smith right = sxl + .5*(mlen + 2)*tw; 1875c6c1daeSBarry Smith bottom = syl - (1.0 + cnt)*th; 1885c6c1daeSBarry Smith if (w) *w = right - left; 1895c6c1daeSBarry Smith if (h) *h = top - bottom; 1905c6c1daeSBarry Smith 1915c6c1daeSBarry Smith /* compute new bounding box */ 1925c6c1daeSBarry Smith draw->boundbox_xl = PetscMin(draw->boundbox_xl,left); 1935c6c1daeSBarry Smith draw->boundbox_xr = PetscMax(draw->boundbox_xr,right); 1945c6c1daeSBarry Smith draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom); 1955c6c1daeSBarry Smith draw->boundbox_yr = PetscMax(draw->boundbox_yr,top); 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith /* top, left, bottom, right lines */ 1985c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr); 1995c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr); 2005c6c1daeSBarry Smith ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr); 2015c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr); 2025c6c1daeSBarry Smith 2035c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 2045c6c1daeSBarry Smith ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr); 2055c6c1daeSBarry Smith } 2065c6c1daeSBarry Smith ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr); 2075c6c1daeSBarry Smith PetscFunctionReturn(0); 2085c6c1daeSBarry Smith } 2098f69470aSLisandro Dalcin 2108f69470aSLisandro Dalcin #undef __FUNCT__ 2118f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize" 2128f69470aSLisandro Dalcin /*@ 2138f69470aSLisandro Dalcin PetscDrawStringSetSize - Sets the size for character text. 2148f69470aSLisandro Dalcin 2158f69470aSLisandro Dalcin Not Collective 2168f69470aSLisandro Dalcin 2178f69470aSLisandro Dalcin Input Parameters: 2188f69470aSLisandro Dalcin + draw - the drawing context 2198f69470aSLisandro Dalcin . width - the width in user coordinates 2208f69470aSLisandro Dalcin - height - the character height in user coordinates 2218f69470aSLisandro Dalcin 2228f69470aSLisandro Dalcin Level: advanced 2238f69470aSLisandro Dalcin 2248f69470aSLisandro Dalcin Note: 2258f69470aSLisandro Dalcin Only a limited range of sizes are available. 2268f69470aSLisandro Dalcin 2278f69470aSLisandro Dalcin Concepts: string^drawing size 2288f69470aSLisandro Dalcin 2298f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringGetSize() 2308f69470aSLisandro Dalcin 2318f69470aSLisandro Dalcin @*/ 2328f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height) 2338f69470aSLisandro Dalcin { 2348f69470aSLisandro Dalcin PetscErrorCode ierr; 2358f69470aSLisandro Dalcin 2368f69470aSLisandro Dalcin PetscFunctionBegin; 2378f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2388f69470aSLisandro Dalcin if (draw->ops->stringsetsize) { 2398f69470aSLisandro Dalcin ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr); 2408f69470aSLisandro Dalcin } 2418f69470aSLisandro Dalcin PetscFunctionReturn(0); 2428f69470aSLisandro Dalcin } 2438f69470aSLisandro Dalcin 2448f69470aSLisandro Dalcin #undef __FUNCT__ 2458f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize" 2468f69470aSLisandro Dalcin /*@ 2478f69470aSLisandro Dalcin PetscDrawStringGetSize - Gets the size for character text. The width is 2488f69470aSLisandro Dalcin relative to the user coordinates of the window. 2498f69470aSLisandro Dalcin 2508f69470aSLisandro Dalcin Not Collective 2518f69470aSLisandro Dalcin 2528f69470aSLisandro Dalcin Input Parameters: 2538f69470aSLisandro Dalcin + draw - the drawing context 2548f69470aSLisandro Dalcin . width - the width in user coordinates 2558f69470aSLisandro Dalcin - height - the character height 2568f69470aSLisandro Dalcin 2578f69470aSLisandro Dalcin Level: advanced 2588f69470aSLisandro Dalcin 2598f69470aSLisandro Dalcin Concepts: string^drawing size 2608f69470aSLisandro Dalcin 2618f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringSetSize() 2628f69470aSLisandro Dalcin 2638f69470aSLisandro Dalcin @*/ 2648f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height) 2658f69470aSLisandro Dalcin { 2668f69470aSLisandro Dalcin PetscErrorCode ierr; 2678f69470aSLisandro Dalcin PetscBool isnull; 2688f69470aSLisandro Dalcin 2698f69470aSLisandro Dalcin PetscFunctionBegin; 2708f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2718f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 272ef0058dfSLisandro Dalcin if (isnull) {if (width) *width = 0.0; if (height) *height = 0.0; PetscFunctionReturn(0);} 2738f69470aSLisandro 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); 2748f69470aSLisandro Dalcin ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr); 2758f69470aSLisandro Dalcin PetscFunctionReturn(0); 2768f69470aSLisandro Dalcin } 2778f69470aSLisandro Dalcin 278