public void drawChar(char ch)
  {
    Font font = new Font("monospaced", 0, 16);
    GlyphVector gv = font.createGlyphVector(new FontRenderContext(null, false, true), ""+ch);
    Shape shape = gv.getOutline();
    PathIterator pi = shape.getPathIterator(null, 0.1D);
    double[] coords = new double[6];

    GLUtessellator gt = GLU.gluNewTess();
    gt.gluTessCallback(100100, this);
    gt.gluTessCallback(100101, this);
    gt.gluTessCallback(100102, this);
    gt.gluTessCallback(100105, this);

    gt.gluTessBeginPolygon(null);
    gt.gluTessProperty(100140, pi.getWindingRule() == 1 ? 100131 : 100134);
    while (!pi.isDone()) {
      int type = pi.currentSegment(coords);

      if (type == 0) {
        gt.gluTessBeginContour();
        gt.gluTessVertex(coords, 0, Integer.valueOf(2));
      } else if (type == 1) {
        gt.gluTessVertex(coords, 0, new VertexData(coords[0], coords[1]));
      } else if (type == 4) {
        gt.gluTessEndContour();
      }
      pi.next();
    }
    gt.gluTessEndPolygon();

    GL11.glTranslatef(gv.getGlyphMetrics(0).getAdvance(), 0.0F, 0.0F);
  }