File: xfonts.c

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (82 lines) | stat: -rw-r--r-- 1,963 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <X11/X.h>
#include <X11/Xlib.h>
/* Get the metrics for a character. */
typedef struct gs_point_s {
    double x, y;
} gs_point;
typedef struct gs_int_point_s {
    int x, y;
} gs_int_point;
typedef struct gs_int_rect_s {
    gs_int_point p, q;
} gs_int_rect;

int x_char_metrics(XFontStruct* x11font, char chr, gs_point* pwidth, gs_int_rect* pbbox)
{
  if (x11font->per_char == NULL) {
    pwidth->x = x11font->max_bounds.width;
    pwidth->y = 0;
    pbbox->p.x = x11font->max_bounds.lbearing;
    pbbox->q.x = x11font->max_bounds.rbearing;
    pbbox->p.y = -x11font->max_bounds.ascent;
    pbbox->q.y = x11font->max_bounds.descent;
  } else {
	int i = (int)chr - x11font->min_char_or_byte2;

	pwidth->x = x11font->per_char[i].width;
	pwidth->y = 0;

	pbbox->p.x = x11font->per_char[i].lbearing;
	pbbox->q.x = x11font->per_char[i].rbearing;
	pbbox->p.y = -x11font->per_char[i].ascent;
	pbbox->q.y = x11font->per_char[i].descent;
    }
    return 0;
}

/* Render a character. */
int
x_render_char(Display* dpy, XFontStruct* x11font, char chr, int xo, int yo)
{
  gs_int_rect bbox;
  int x, y, w, h;


  /* Display on an intermediate bitmap, then copy the bits. */
  int i;
  XImage *xim;
  Pixmap xpm;
  GC fgc;
  gs_point wxy;
  int code;

  code = x_char_metrics(x11font, chr, &wxy, &bbox);

  w = bbox.q.x - bbox.p.x;
  h = bbox.q.y - bbox.p.y;


  xpm = XCreatePixmap(dpy, InputOnly, w, h, 1);
  fgc = XCreateGC(dpy, xpm, None, NULL);
  XSetForeground(dpy, fgc, 0);
  XFillRectangle(dpy, xpm, fgc, 0, 0, w, h);
  XSetForeground(dpy, fgc, 1);
  XSetFont(dpy, fgc, x11font->fid);
  XDrawString(dpy, xpm, fgc, -bbox.p.x, -bbox.p.y, &chr, 1);
  xim = XGetImage(dpy, xpm, 0, 0, w, h, 1, ZPixmap);
  i = 0;
  for (y = 0; y < h; y++) {
    char b;

    for (x = 0; x < w; x++) {
	b = XGetPixel(xim, x, y);
      /*      if ((x & 7) == 7)
	      bits[i++] = b;*/
    }
  }
  XFreePixmap(dpy, xpm);
  XFreeGC(dpy, fgc);
  XDestroyImage(xim);
  return;
    
}