123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #include "sys-defines.h"
- #include "extern.h"
- #include "x_afftext.h"
- double
- _pl_x_paint_text_string (R___(Plotter *_plotter) const unsigned char *s, int h_just, int v_just)
- {
- const char *saved_font_name;
- char *temp_font_name;
- bool ok;
- double x, y;
- double width = 0.0;
- double rot[4];
- double a[4];
- int i, ix, iy;
-
-
- if (v_just != PL_JUST_BASE)
- return 0.0;
-
- if (h_just != PL_JUST_LEFT)
- return 0.0;
- if (*s == (unsigned char)'\0')
- return 0.0;
-
- if (_plotter->drawstate->true_font_name == NULL)
- return 0.0;
- saved_font_name = _plotter->drawstate->font_name;
- temp_font_name =
- (char *)_pl_xmalloc (strlen (_plotter->drawstate->true_font_name) + 1);
- strcpy (temp_font_name, _plotter->drawstate->true_font_name);
- _plotter->drawstate->font_name = temp_font_name;
- _plotter->drawstate->x_label = s;
- ok = _pl_x_retrieve_font (S___(_plotter));
- _plotter->drawstate->x_label = NULL;
- _plotter->drawstate->font_name = saved_font_name;
- free (temp_font_name);
- if (!ok)
- return 0.0;
-
- XSetFont (_plotter->x_dpy, _plotter->drawstate->x_gc_fg,
- _plotter->drawstate->x_font_struct->fid);
-
- _pl_x_set_pen_color (S___(_plotter));
-
-
- x = XD(_plotter->drawstate->pos.x, _plotter->drawstate->pos.y);
- y = YD(_plotter->drawstate->pos.x, _plotter->drawstate->pos.y);
-
-
- ix = IROUND(x);
- iy = IROUND(y);
- if (X_OOB_INT(ix) || X_OOB_INT(iy))
- {
- _plotter->warning (R___(_plotter)
- "not drawing a text string that is positioned too far for X11");
- return 0.0;
- }
-
-
-
-
-
- rot[0] = cos (M_PI * _plotter->drawstate->text_rotation / 180.0);
- rot[1] = sin (M_PI * _plotter->drawstate->text_rotation / 180.0);
- rot[2] = - sin (M_PI * _plotter->drawstate->text_rotation / 180.0);
- rot[3] = cos (M_PI * _plotter->drawstate->text_rotation / 180.0);
-
-
- a[0] = (rot[0] * _plotter->drawstate->transform.m[0]
- + rot[1] * _plotter->drawstate->transform.m[2]);
- a[1] = - (rot[0] * _plotter->drawstate->transform.m[1]
- + rot[1] * _plotter->drawstate->transform.m[3]);
- a[2] = (rot[2] * _plotter->drawstate->transform.m[0]
- + rot[3] * _plotter->drawstate->transform.m[2]);
- a[3] = - (rot[2] * _plotter->drawstate->transform.m[1]
- + rot[3] * _plotter->drawstate->transform.m[3]);
-
-
- for (i = 0; i < 4; i++)
- a[i] = a[i]
- * (_plotter->drawstate->true_font_size / _plotter->drawstate->x_font_pixel_size);
-
- if (_plotter->x_double_buffering != X_DBL_BUF_NONE)
-
- XAffDrawAffString (_plotter->x_dpy, _plotter->x_drawable3,
- _plotter->drawstate->x_gc_fg,
- _plotter->drawstate->x_font_struct,
- ix, iy, a, (char *)s);
- else
- {
-
- if (_plotter->x_drawable1)
- XAffDrawAffString (_plotter->x_dpy, _plotter->x_drawable1,
- _plotter->drawstate->x_gc_fg,
- _plotter->drawstate->x_font_struct,
- ix, iy, a, (char *)s);
- if (_plotter->x_drawable2)
- XAffDrawAffString (_plotter->x_dpy, _plotter->x_drawable2,
- _plotter->drawstate->x_gc_fg,
- _plotter->drawstate->x_font_struct,
- ix, iy, a, (char *)s);
- }
-
-
- width = (((XTextWidth (_plotter->drawstate->x_font_struct,
- (char *)s,
- (int)(strlen((char *)s)))
- *_plotter->drawstate->true_font_size))
- / _plotter->drawstate->x_font_pixel_size);
-
-
- _maybe_handle_x_events (S___(_plotter));
- return width;
- }
- double
- _pl_x_get_text_width (R___(Plotter *_plotter) const unsigned char *s)
- {
- const char *saved_font_name;
- char *temp_font_name;
- bool ok;
- double width;
-
- if (_plotter->drawstate->true_font_name == NULL)
- return 0.0;
- saved_font_name = _plotter->drawstate->font_name;
- temp_font_name =
- (char *)_pl_xmalloc (strlen (_plotter->drawstate->true_font_name) + 1);
- strcpy (temp_font_name, _plotter->drawstate->true_font_name);
- _plotter->drawstate->font_name = temp_font_name;
- _plotter->drawstate->x_label = s;
- ok = _pl_x_retrieve_font (S___(_plotter));
- _plotter->drawstate->x_label = NULL;
- _plotter->drawstate->font_name = saved_font_name;
- free (temp_font_name);
- if (!ok)
- return 0.0;
-
- width = ((XTextWidth (_plotter->drawstate->x_font_struct,
- (char *)s,
- (int)(strlen((char *)s)))
- *_plotter->drawstate->true_font_size)
- / _plotter->drawstate->x_font_pixel_size);
-
-
- _maybe_handle_x_events (S___(_plotter));
- return width;
- }
|