Actual source code: dtext.c

  1: #include <petsc/private/drawimpl.h>

  3: /*@
  4:   PetscDrawString - draws text onto a drawable.

  6:   Not Collective

  8:   Input Parameters:
  9: + draw - the drawing context
 10: . xl   - coordinate of lower left corner of text
 11: . yl   - coordinate of lower left corner of text
 12: . cl   - the color of the text
 13: - text - the text to draw

 15:   Level: beginner

 17: .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
 18:           `PetscDrawStringGetSize()`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
 19:           `PetscDrawMarker()`, `PetscDrawPoint()`
 20: @*/
 21: PetscErrorCode PetscDrawString(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[])
 22: {
 23:   PetscFunctionBegin;
 25:   PetscAssertPointer(text, 5);
 26:   PetscUseTypeMethod(draw, string, xl, yl, cl, text);
 27:   PetscFunctionReturn(PETSC_SUCCESS);
 28: }

 30: /*@
 31:   PetscDrawStringVertical - draws text onto a drawable.

 33:   Not Collective

 35:   Input Parameters:
 36: + draw - the drawing context
 37: . xl   - coordinate of upper left corner of text
 38: . yl   - coordinate of upper left corner of text
 39: . cl   - the color of the text
 40: - text - the text to draw

 42:   Level: beginner

 44: .seealso: `PetscDraw`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
 45:           `PetscDrawStringGetSize()`
 46: @*/
 47: PetscErrorCode PetscDrawStringVertical(PetscDraw draw, PetscReal xl, PetscReal yl, int cl, const char text[])
 48: {
 49:   char      chr[2] = {0, 0};
 50:   PetscReal tw, th;

 52:   PetscFunctionBegin;
 54:   PetscAssertPointer(text, 5);

 56:   if (draw->ops->stringvertical) PetscUseTypeMethod(draw, stringvertical, xl, yl, cl, text);
 57:   else {
 58:     PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
 59:     for (int i = 0; (chr[0] = text[i]); i++) PetscCall(PetscDrawString(draw, xl, yl - th * ((PetscReal)i + 1), cl, chr));
 60:   }
 61:   PetscFunctionReturn(PETSC_SUCCESS);
 62: }

 64: /*@
 65:   PetscDrawStringCentered - draws text onto a drawable centered at a point

 67:   Not Collective

 69:   Input Parameters:
 70: + draw - the drawing context
 71: . xc   - the coordinates of right-left center of text
 72: . yl   - the coordinates of lower edge of text
 73: . cl   - the color of the text
 74: - text - the text to draw

 76:   Level: beginner

 78: .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringBoxed()`, `PetscDrawStringSetSize()`,
 79:           `PetscDrawStringGetSize()`
 80: @*/
 81: PetscErrorCode PetscDrawStringCentered(PetscDraw draw, PetscReal xc, PetscReal yl, int cl, const char text[])
 82: {
 83:   size_t    len;
 84:   PetscReal tw, th;

 86:   PetscFunctionBegin;
 88:   PetscAssertPointer(text, 5);

 90:   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));
 91:   PetscCall(PetscStrlen(text, &len));
 92:   xc = xc - ((PetscReal)len) * tw / 2;
 93:   PetscCall(PetscDrawString(draw, xc, yl, cl, text));
 94:   PetscFunctionReturn(PETSC_SUCCESS);
 95: }

 97: /*@
 98:   PetscDrawStringBoxed - Draws a string with a box around it

100:   Not Collective

102:   Input Parameters:
103: + draw - the drawing context
104: . sxl  - the coordinates of center of the box
105: . syl  - the coordinates of top line of box
106: . sc   - the color of the text
107: . bc   - the color of the bounding box
108: - text - the text to draw

110:   Output Parameters:
111: + w - the width of the resulting box (optional)
112: - h - the height of resulting box (optional)

114:   Level: beginner

116: .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringSetSize()`,
117:           `PetscDrawStringGetSize()`
118: @*/
119: PetscErrorCode PetscDrawStringBoxed(PetscDraw draw, PetscReal sxl, PetscReal syl, int sc, int bc, const char text[], PetscReal *w, PetscReal *h)
120: {
121:   PetscReal top, left, right, bottom, tw, th;
122:   size_t    len, mlen = 0;
123:   char    **array;
124:   int       cnt, i;

126:   PetscFunctionBegin;
128:   PetscAssertPointer(text, 6);

130:   if (draw->ops->boxedstring) {
131:     PetscUseTypeMethod(draw, boxedstring, sxl, syl, sc, bc, text, w, h);
132:     PetscFunctionReturn(PETSC_SUCCESS);
133:   }

135:   PetscCall(PetscStrToArray(text, '\n', &cnt, &array));
136:   for (i = 0; i < cnt; i++) {
137:     PetscCall(PetscStrlen(array[i], &len));
138:     mlen = PetscMax(mlen, len);
139:   }

141:   PetscCall(PetscDrawStringGetSize(draw, &tw, &th));

143:   top    = syl;
144:   left   = sxl - .5 * ((PetscReal)mlen + 2) * tw;
145:   right  = sxl + .5 * ((PetscReal)mlen + 2) * tw;
146:   bottom = syl - (1.0 + (PetscReal)cnt) * th;
147:   if (w) *w = right - left;
148:   if (h) *h = top - bottom;

150:   /* compute new bounding box */
151:   draw->boundbox_xl = PetscMin(draw->boundbox_xl, left);
152:   draw->boundbox_xr = PetscMax(draw->boundbox_xr, right);
153:   draw->boundbox_yl = PetscMin(draw->boundbox_yl, bottom);
154:   draw->boundbox_yr = PetscMax(draw->boundbox_yr, top);

156:   /* top, left, bottom, right lines */
157:   PetscCall(PetscDrawLine(draw, left, top, right, top, bc));
158:   PetscCall(PetscDrawLine(draw, left, bottom, left, top, bc));
159:   PetscCall(PetscDrawLine(draw, right, bottom, right, top, bc));
160:   PetscCall(PetscDrawLine(draw, left, bottom, right, bottom, bc));

162:   for (i = 0; i < cnt; i++) PetscCall(PetscDrawString(draw, left + tw, top - (1.5 + i) * th, sc, array[i]));
163:   PetscCall(PetscStrToArrayDestroy(cnt, array));
164:   PetscFunctionReturn(PETSC_SUCCESS);
165: }

167: /*@
168:   PetscDrawStringSetSize - Sets the size for character text.

170:   Not Collective

172:   Input Parameters:
173: + draw   - the drawing context
174: . width  - the width in user coordinates
175: - height - the character height in user coordinates

177:   Level: advanced

179:   Note:
180:   Only a limited range of sizes are available.

182: .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
183:           `PetscDrawStringGetSize()`
184: @*/
185: PetscErrorCode PetscDrawStringSetSize(PetscDraw draw, PetscReal width, PetscReal height)
186: {
187:   PetscFunctionBegin;
189:   PetscTryTypeMethod(draw, stringsetsize, width, height);
190:   PetscFunctionReturn(PETSC_SUCCESS);
191: }

193: /*@
194:   PetscDrawStringGetSize - Gets the size for character text.  The width is
195:   relative to the user coordinates of the window.

197:   Not Collective

199:   Input Parameters:
200: + draw   - the drawing context
201: . width  - the width in user coordinates
202: - height - the character height

204:   Level: advanced

206: .seealso: `PetscDraw`, `PetscDrawStringVertical()`, `PetscDrawString()`, `PetscDrawStringCentered()`, `PetscDrawStringBoxed()`,
207:           `PetscDrawStringSetSize()`
208: @*/
209: PetscErrorCode PetscDrawStringGetSize(PetscDraw draw, PetscReal *width, PetscReal *height)
210: {
211:   PetscFunctionBegin;
213:   PetscUseTypeMethod(draw, stringgetsize, width, height);
214:   PetscFunctionReturn(PETSC_SUCCESS);
215: }