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__ 7*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawString" 8*8f69470aSLisandro Dalcin /*@C 9*8f69470aSLisandro Dalcin PetscDrawString - PetscDraws text onto a drawable. 10*8f69470aSLisandro Dalcin 11*8f69470aSLisandro Dalcin Not Collective 12*8f69470aSLisandro Dalcin 13*8f69470aSLisandro Dalcin Input Parameters: 14*8f69470aSLisandro Dalcin + draw - the drawing context 15*8f69470aSLisandro Dalcin . xl - the coordinates of lower left corner of text 16*8f69470aSLisandro Dalcin . yl - the coordinates of lower left corner of text 17*8f69470aSLisandro Dalcin . cl - the color of the text 18*8f69470aSLisandro Dalcin - text - the text to draw 19*8f69470aSLisandro Dalcin 20*8f69470aSLisandro Dalcin Level: beginner 21*8f69470aSLisandro Dalcin 22*8f69470aSLisandro Dalcin Concepts: drawing^string 23*8f69470aSLisandro Dalcin Concepts: string^drawing 24*8f69470aSLisandro Dalcin 25*8f69470aSLisandro Dalcin .seealso: PetscDrawStringVertical(), PetscDrawStringCentered(), PetscDrawStringBoxed() 26*8f69470aSLisandro Dalcin 27*8f69470aSLisandro Dalcin @*/ 28*8f69470aSLisandro Dalcin PetscErrorCode PetscDrawString(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 29*8f69470aSLisandro Dalcin { 30*8f69470aSLisandro Dalcin PetscErrorCode ierr; 31*8f69470aSLisandro Dalcin PetscBool isnull; 32*8f69470aSLisandro Dalcin 33*8f69470aSLisandro Dalcin PetscFunctionBegin; 34*8f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 35*8f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 36*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 37*8f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 38*8f69470aSLisandro 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); 39*8f69470aSLisandro Dalcin ierr = (*draw->ops->string)(draw,xl,yl,cl,text);CHKERRQ(ierr); 40*8f69470aSLisandro Dalcin PetscFunctionReturn(0); 41*8f69470aSLisandro Dalcin } 42*8f69470aSLisandro Dalcin 43*8f69470aSLisandro Dalcin #undef __FUNCT__ 44*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical" 45*8f69470aSLisandro Dalcin /*@C 46*8f69470aSLisandro Dalcin PetscDrawStringVertical - PetscDraws text onto a drawable. 47*8f69470aSLisandro Dalcin 48*8f69470aSLisandro Dalcin Not Collective 49*8f69470aSLisandro Dalcin 50*8f69470aSLisandro Dalcin Input Parameters: 51*8f69470aSLisandro Dalcin + draw - the drawing context 52*8f69470aSLisandro Dalcin . xl,yl - the coordinates of upper left corner of text 53*8f69470aSLisandro Dalcin . cl - the color of the text 54*8f69470aSLisandro Dalcin - text - the text to draw 55*8f69470aSLisandro Dalcin 56*8f69470aSLisandro Dalcin Level: beginner 57*8f69470aSLisandro Dalcin 58*8f69470aSLisandro Dalcin Concepts: string^drawing vertical 59*8f69470aSLisandro Dalcin 60*8f69470aSLisandro Dalcin .seealso: PetscDrawString() 61*8f69470aSLisandro Dalcin 62*8f69470aSLisandro Dalcin @*/ 63*8f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringVertical(PetscDraw draw,PetscReal xl,PetscReal yl,int cl,const char text[]) 64*8f69470aSLisandro Dalcin { 65*8f69470aSLisandro Dalcin PetscErrorCode ierr; 66*8f69470aSLisandro Dalcin PetscBool isnull; 67*8f69470aSLisandro Dalcin 68*8f69470aSLisandro Dalcin PetscFunctionBegin; 69*8f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 70*8f69470aSLisandro Dalcin PetscValidCharPointer(text,5); 71*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 72*8f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 73*8f69470aSLisandro Dalcin if (!draw->ops->stringvertical) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"This draw type %s does not support drawing vertical strings",((PetscObject)draw)->type_name); 74*8f69470aSLisandro Dalcin ierr = (*draw->ops->stringvertical)(draw,xl,yl,cl,text);CHKERRQ(ierr); 75*8f69470aSLisandro Dalcin PetscFunctionReturn(0); 76*8f69470aSLisandro Dalcin } 77*8f69470aSLisandro Dalcin 78*8f69470aSLisandro Dalcin #undef __FUNCT__ 7951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringCentered" 8051fa3d41SBarry Smith /*@C 8151fa3d41SBarry Smith PetscDrawStringCentered - PetscDraws text onto a drawable centered at a point 8251fa3d41SBarry Smith 8351fa3d41SBarry Smith Not Collective 8451fa3d41SBarry Smith 8551fa3d41SBarry Smith Input Parameters: 8651fa3d41SBarry Smith + draw - the drawing context 8751fa3d41SBarry Smith . xc - the coordinates of right-left center of text 8851fa3d41SBarry Smith . yl - the coordinates of lower edge of text 8951fa3d41SBarry Smith . cl - the color of the text 9051fa3d41SBarry Smith - text - the text to draw 9151fa3d41SBarry Smith 9251fa3d41SBarry Smith Level: beginner 9351fa3d41SBarry Smith 9451fa3d41SBarry Smith Concepts: drawing^string 9551fa3d41SBarry Smith Concepts: string^drawing 9651fa3d41SBarry Smith 9751fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawString(), PetscDrawStringBoxed() 9851fa3d41SBarry Smith 9951fa3d41SBarry Smith @*/ 10051fa3d41SBarry Smith PetscErrorCode PetscDrawStringCentered(PetscDraw draw,PetscReal xc,PetscReal yl,int cl,const char text[]) 10151fa3d41SBarry Smith { 10251fa3d41SBarry Smith PetscErrorCode ierr; 10351fa3d41SBarry Smith PetscBool isnull; 10451fa3d41SBarry Smith size_t len; 10551fa3d41SBarry Smith PetscReal tw,th; 10651fa3d41SBarry Smith 10751fa3d41SBarry Smith PetscFunctionBegin; 10851fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 10951fa3d41SBarry Smith PetscValidCharPointer(text,5); 110*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 11151fa3d41SBarry Smith if (isnull) PetscFunctionReturn(0); 11251fa3d41SBarry Smith 11351fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 11451fa3d41SBarry Smith ierr = PetscStrlen(text,&len);CHKERRQ(ierr); 11551fa3d41SBarry Smith xc = xc - .5*len*tw; 11651fa3d41SBarry Smith ierr = PetscDrawString(draw,xc,yl,cl,text);CHKERRQ(ierr); 11751fa3d41SBarry Smith PetscFunctionReturn(0); 11851fa3d41SBarry Smith } 11951fa3d41SBarry Smith 1205c6c1daeSBarry Smith #undef __FUNCT__ 12151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawStringBoxed" 1225c6c1daeSBarry Smith /*@C 12351fa3d41SBarry Smith PetscDrawStringBoxed - Draws a string with a box around it 1245c6c1daeSBarry Smith 1255c6c1daeSBarry Smith Not Collective 1265c6c1daeSBarry Smith 1275c6c1daeSBarry Smith Input Parameters: 1285c6c1daeSBarry Smith + draw - the drawing context 1295c6c1daeSBarry Smith . sxl - the coordinates of center of the box 1305c6c1daeSBarry Smith . syl - the coordinates of top line of box 1315c6c1daeSBarry Smith . sc - the color of the text 1325c6c1daeSBarry Smith . bc - the color of the bounding box 1335c6c1daeSBarry Smith - text - the text to draw 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Output Parameter: 1365c6c1daeSBarry Smith . w,h - width and height of resulting box (optional) 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith Level: beginner 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith Concepts: drawing^string 1415c6c1daeSBarry Smith Concepts: string^drawing 1425c6c1daeSBarry Smith 14351fa3d41SBarry Smith .seealso: PetscDrawStringVertical(), PetscDrawStringBoxedSize(), PetscDrawString(), PetscDrawStringCentered() 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith @*/ 14651fa3d41SBarry Smith PetscErrorCode PetscDrawStringBoxed(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h) 1475c6c1daeSBarry Smith { 1485c6c1daeSBarry Smith PetscErrorCode ierr; 1495c6c1daeSBarry Smith PetscBool isnull; 1505c6c1daeSBarry Smith PetscReal top,left,right,bottom,tw,th; 1515c6c1daeSBarry Smith size_t len,mlen = 0; 1525c6c1daeSBarry Smith char **array; 1535c6c1daeSBarry Smith int cnt,i; 1545c6c1daeSBarry Smith 1555c6c1daeSBarry Smith PetscFunctionBegin; 1565c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1575c6c1daeSBarry Smith PetscValidCharPointer(text,5); 158*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1595c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 1605c6c1daeSBarry Smith 16142963b84SBarry Smith if (draw->ops->boxedstring) { 16242963b84SBarry Smith ierr = (*draw->ops->boxedstring)(draw,sxl,syl,sc,bc,text,w,h);CHKERRQ(ierr); 16342963b84SBarry Smith PetscFunctionReturn(0); 16442963b84SBarry Smith } 16542963b84SBarry Smith 1665c6c1daeSBarry Smith ierr = PetscStrToArray(text,'\n',&cnt,&array);CHKERRQ(ierr); 1675c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 1685c6c1daeSBarry Smith ierr = PetscStrlen(array[i],&len);CHKERRQ(ierr); 1695c6c1daeSBarry Smith mlen = PetscMax(mlen,len); 1705c6c1daeSBarry Smith } 1715c6c1daeSBarry Smith 1725c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith top = syl; 1755c6c1daeSBarry Smith left = sxl - .5*(mlen + 2)*tw; 1765c6c1daeSBarry Smith right = sxl + .5*(mlen + 2)*tw; 1775c6c1daeSBarry Smith bottom = syl - (1.0 + cnt)*th; 1785c6c1daeSBarry Smith if (w) *w = right - left; 1795c6c1daeSBarry Smith if (h) *h = top - bottom; 1805c6c1daeSBarry Smith 1815c6c1daeSBarry Smith /* compute new bounding box */ 1825c6c1daeSBarry Smith draw->boundbox_xl = PetscMin(draw->boundbox_xl,left); 1835c6c1daeSBarry Smith draw->boundbox_xr = PetscMax(draw->boundbox_xr,right); 1845c6c1daeSBarry Smith draw->boundbox_yl = PetscMin(draw->boundbox_yl,bottom); 1855c6c1daeSBarry Smith draw->boundbox_yr = PetscMax(draw->boundbox_yr,top); 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith /* top, left, bottom, right lines */ 1885c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,top,right,top,bc);CHKERRQ(ierr); 1895c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,left,top,bc);CHKERRQ(ierr); 1905c6c1daeSBarry Smith ierr = PetscDrawLine(draw,right,bottom,right,top,bc);CHKERRQ(ierr); 1915c6c1daeSBarry Smith ierr = PetscDrawLine(draw,left,bottom,right,bottom,bc);CHKERRQ(ierr); 1925c6c1daeSBarry Smith 1935c6c1daeSBarry Smith for (i=0; i<cnt; i++) { 1945c6c1daeSBarry Smith ierr = PetscDrawString(draw,left + tw,top - (1.5 + i)*th,sc,array[i]);CHKERRQ(ierr); 1955c6c1daeSBarry Smith } 1965c6c1daeSBarry Smith ierr = PetscStrToArrayDestroy(cnt,array);CHKERRQ(ierr); 1975c6c1daeSBarry Smith PetscFunctionReturn(0); 1985c6c1daeSBarry Smith } 199*8f69470aSLisandro Dalcin 200*8f69470aSLisandro Dalcin #undef __FUNCT__ 201*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize" 202*8f69470aSLisandro Dalcin /*@ 203*8f69470aSLisandro Dalcin PetscDrawStringSetSize - Sets the size for character text. 204*8f69470aSLisandro Dalcin 205*8f69470aSLisandro Dalcin Not Collective 206*8f69470aSLisandro Dalcin 207*8f69470aSLisandro Dalcin Input Parameters: 208*8f69470aSLisandro Dalcin + draw - the drawing context 209*8f69470aSLisandro Dalcin . width - the width in user coordinates 210*8f69470aSLisandro Dalcin - height - the character height in user coordinates 211*8f69470aSLisandro Dalcin 212*8f69470aSLisandro Dalcin Level: advanced 213*8f69470aSLisandro Dalcin 214*8f69470aSLisandro Dalcin Note: 215*8f69470aSLisandro Dalcin Only a limited range of sizes are available. 216*8f69470aSLisandro Dalcin 217*8f69470aSLisandro Dalcin Concepts: string^drawing size 218*8f69470aSLisandro Dalcin 219*8f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringGetSize() 220*8f69470aSLisandro Dalcin 221*8f69470aSLisandro Dalcin @*/ 222*8f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringSetSize(PetscDraw draw,PetscReal width,PetscReal height) 223*8f69470aSLisandro Dalcin { 224*8f69470aSLisandro Dalcin PetscErrorCode ierr; 225*8f69470aSLisandro Dalcin 226*8f69470aSLisandro Dalcin PetscFunctionBegin; 227*8f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 228*8f69470aSLisandro Dalcin if (draw->ops->stringsetsize) { 229*8f69470aSLisandro Dalcin ierr = (*draw->ops->stringsetsize)(draw,width,height);CHKERRQ(ierr); 230*8f69470aSLisandro Dalcin } 231*8f69470aSLisandro Dalcin PetscFunctionReturn(0); 232*8f69470aSLisandro Dalcin } 233*8f69470aSLisandro Dalcin 234*8f69470aSLisandro Dalcin #undef __FUNCT__ 235*8f69470aSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize" 236*8f69470aSLisandro Dalcin /*@ 237*8f69470aSLisandro Dalcin PetscDrawStringGetSize - Gets the size for character text. The width is 238*8f69470aSLisandro Dalcin relative to the user coordinates of the window. 239*8f69470aSLisandro Dalcin 240*8f69470aSLisandro Dalcin Not Collective 241*8f69470aSLisandro Dalcin 242*8f69470aSLisandro Dalcin Input Parameters: 243*8f69470aSLisandro Dalcin + draw - the drawing context 244*8f69470aSLisandro Dalcin . width - the width in user coordinates 245*8f69470aSLisandro Dalcin - height - the character height 246*8f69470aSLisandro Dalcin 247*8f69470aSLisandro Dalcin Level: advanced 248*8f69470aSLisandro Dalcin 249*8f69470aSLisandro Dalcin Concepts: string^drawing size 250*8f69470aSLisandro Dalcin 251*8f69470aSLisandro Dalcin .seealso: PetscDrawString(), PetscDrawStringVertical(), PetscDrawStringSetSize() 252*8f69470aSLisandro Dalcin 253*8f69470aSLisandro Dalcin @*/ 254*8f69470aSLisandro Dalcin PetscErrorCode PetscDrawStringGetSize(PetscDraw draw,PetscReal *width,PetscReal *height) 255*8f69470aSLisandro Dalcin { 256*8f69470aSLisandro Dalcin PetscErrorCode ierr; 257*8f69470aSLisandro Dalcin PetscBool isnull; 258*8f69470aSLisandro Dalcin 259*8f69470aSLisandro Dalcin PetscFunctionBegin; 260*8f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 261*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 262*8f69470aSLisandro Dalcin if (isnull) {*width = *height = 0.0; PetscFunctionReturn(0);} 263*8f69470aSLisandro 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); 264*8f69470aSLisandro Dalcin ierr = (*draw->ops->stringgetsize)(draw,width,height);CHKERRQ(ierr); 265*8f69470aSLisandro Dalcin PetscFunctionReturn(0); 266*8f69470aSLisandro Dalcin } 267*8f69470aSLisandro Dalcin 268