/* textplot.c */


/*
 * Vis5D system for visualizing five dimensional gridded data sets.
 * Copyright (C) 1990 - 2000 Bill Hibbard, Johan Kellum, Brian Paul,
 * Dave Santek, and Andre Battaiola.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * As a special exception to the terms of the GNU General Public
 * License, you are permitted to link Vis5D with (and distribute the
 * resulting source and executables) the LUI library (copyright by
 * Stellar Computer Inc. and licensed for distribution with Vis5D),
 * the McIDAS library, and/or the NetCDF library, where those
 * libraries are governed by the terms of their own licenses.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include "../config.h"

#include <string.h>
#include <math.h>
#include <stdio.h>
#include "memory.h"
#include "textplot.h"
#include "globals.h"
#include "api.h"

#define MAX_SYMBOLS 400 
#define MAX_SYMBOL_VERTS 35 
#define DISTANCE( x1, y1, x2, y2 )   sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )

static float textcoordx[MAX_SYMBOLS][MAX_SYMBOL_VERTS];
static float textcoordy[MAX_SYMBOLS][MAX_SYMBOL_VERTS];

static void init_text(void)
{
   int i, j;

   for( i = 0; i < MAX_SYMBOLS; i++){
      for (j = 0; j < MAX_SYMBOL_VERTS; j++){
         textcoordx[i][j] = 27.0;
         textcoordy[i][j] = 27.0;
      }
   }
   
   textcoordx[0][0]=-0.3;
   textcoordy[0][0]=1.0;
   textcoordx[0][1]=-0.8;
   textcoordy[0][1]=0.25;

   textcoordx[0][2]=-0.8;
   textcoordy[0][2]=0.25;
   textcoordx[0][3]=-0.8;
   textcoordy[0][3]=-0.25;

   textcoordx[0][4]=-0.8;
   textcoordy[0][4]=-0.25;
   textcoordx[0][5]=-0.3;
   textcoordy[0][5]=-1.0;

   textcoordx[0][6]=-0.3;
   textcoordy[0][6]=-1.0;
   textcoordx[0][7]=0.3;
   textcoordy[0][7]=-1.0;

   textcoordx[0][8]=0.3;
   textcoordy[0][8]=-1.0;
   textcoordx[0][9]=0.8;
   textcoordy[0][9]=-0.25;

   textcoordx[0][10]=0.8;
   textcoordy[0][10]=-0.25;
   textcoordx[0][11]=0.8;
   textcoordy[0][11]=0.25;

   textcoordx[0][12]=0.8;
   textcoordy[0][12]=0.25;
   textcoordx[0][13]=0.3;
   textcoordy[0][13]=1.0;

   textcoordx[0][14]=0.3;
   textcoordy[0][14]=1.0;
   textcoordx[0][15]=-0.3;
   textcoordy[0][15]=1.0;


   /* 1 */
   textcoordx[1][0]=-0.2;
   textcoordy[1][0]=0.6;
   textcoordx[1][1]=0.0;
   textcoordy[1][1]=1.0;

   textcoordx[1][2]=0.0;
   textcoordy[1][2]=1.0;
   textcoordx[1][3]=0.0;
   textcoordy[1][3]=-1.0;

   textcoordx[1][4]=-0.2;
   textcoordy[1][4]=-1.0;
   textcoordx[1][5]=0.2;
   textcoordy[1][5]=-1.0;

   /* 2 */
   textcoordx[2][0]=-0.8;
   textcoordy[2][0]=0.6;
   textcoordx[2][1]=-0.3;
   textcoordy[2][1]=1.0;

   textcoordx[2][2]=-0.3;
   textcoordy[2][2]=1.0;
   textcoordx[2][3]=0.3;
   textcoordy[2][3]=1.0;

   textcoordx[2][4]=0.3;
   textcoordy[2][4]=1.0;
   textcoordx[2][5]=0.8;
   textcoordy[2][5]=0.6;

   textcoordx[2][6]=0.8;
   textcoordy[2][6]=0.6;
   textcoordx[2][7]=-0.8;
   textcoordy[2][7]=-1.0;

   textcoordx[2][8]=-0.8;
   textcoordy[2][8]=-1.0;
   textcoordx[2][9]=0.8;
   textcoordy[2][9]=-1.0;


   /* 3 */
   textcoordx[3][0]=-0.8;
   textcoordy[3][0]=1.0;
   textcoordx[3][1]=0.8;
   textcoordy[3][1]=1.0;
   
   textcoordx[3][2]=0.8;
   textcoordy[3][2]=1.0;
   textcoordx[3][3]=-0.8;
   textcoordy[3][3]=0.0;

   textcoordx[3][4]=-0.8;
   textcoordy[3][4]=0.0;
   textcoordx[3][5]=0.0;
   textcoordy[3][5]=0.1;
   
   textcoordx[3][6]=0.0;
   textcoordy[3][6]=0.1;
   textcoordx[3][7]=0.4;
   textcoordy[3][7]=0.1;

   textcoordx[3][8]=0.4;
   textcoordy[3][8]=0.1;
   textcoordx[3][9]=0.8;
   textcoordy[3][9]=-0.2;
   
   textcoordx[3][10]=0.8;
   textcoordy[3][10]=-0.2;
   textcoordx[3][11]=0.8;
   textcoordy[3][11]=-0.4;

   textcoordx[3][12]=0.8;
   textcoordy[3][12]=-0.4;
   textcoordx[3][13]=0.3;
   textcoordy[3][13]=-1.0;
   
   textcoordx[3][14]=0.3;
   textcoordy[3][14]=-1.0;
   textcoordx[3][15]=-0.3;
   textcoordy[3][15]=-1.0;

   textcoordx[3][16]=-0.3;
   textcoordy[3][16]=-1.0;
   textcoordx[3][17]=-0.8;
   textcoordy[3][17]=-0.7;

   /* 4 */
   textcoordx[4][0]=-0.8;
   textcoordy[4][0]=1.0;
   textcoordx[4][1]=-0.8;
   textcoordy[4][1]=0.0;

   textcoordx[4][2]=-0.8;
   textcoordy[4][2]=0.0;
   textcoordx[4][3]=0.8;
   textcoordy[4][3]=0.0;

   textcoordx[4][4]=0.2;
   textcoordy[4][4]=0.8;
   textcoordx[4][5]=0.2;
   textcoordy[4][5]=-1.0;


   /* 5 */
   textcoordx[5][0]=0.8;
   textcoordy[5][0]=1.0;
   textcoordx[5][1]=-0.8;
   textcoordy[5][1]=1.0;

   textcoordx[5][2]=-0.8;
   textcoordy[5][2]=1.0;
   textcoordx[5][3]=-0.8;
   textcoordy[5][3]=0.0;

   textcoordx[5][4]=-0.8;
   textcoordy[5][4]=0.0;
   textcoordx[5][5]=0.2;
   textcoordy[5][5]=0.1;

   textcoordx[5][6]=0.2;
   textcoordy[5][6]=0.1;
   textcoordx[5][7]=0.8;
   textcoordy[5][7]=-0.1;

   textcoordx[5][8]=0.8;
   textcoordy[5][8]=-0.1;
   textcoordx[5][9]=0.7;
   textcoordy[5][9]=-0.7;

   textcoordx[5][10]=0.7;
   textcoordy[5][10]=-0.7;
   textcoordx[5][11]=0.0;
   textcoordy[5][11]=-1.0;

   textcoordx[5][12]=0.0;
   textcoordy[5][12]=-1.0;
   textcoordx[5][13]=-0.7;
   textcoordy[5][13]=-0.7;

   textcoordx[5][14]=-0.7;
   textcoordy[5][14]=-0.7;
   textcoordx[5][15]=-0.8;
   textcoordy[5][15]=-0.35;

   /* 6 */
   textcoordx[6][0]=0.7;
   textcoordy[6][0]=1.0;
   textcoordx[6][1]=-0.8;
   textcoordy[6][1]=-0.2;

   textcoordx[6][2]=-0.8;
   textcoordy[6][2]=-0.2;
   textcoordx[6][3]=-0.8;
   textcoordy[6][3]=-0.6;

   textcoordx[6][4]=-0.8;
   textcoordy[6][4]=-0.6;
   textcoordx[6][5]=-0.4;
   textcoordy[6][5]=-1.0;

   textcoordx[6][6]=-0.4;
   textcoordy[6][6]=-1.0;
   textcoordx[6][7]=0.4;
   textcoordy[6][7]=-1.0;

   textcoordx[6][8]=0.4;
   textcoordy[6][8]=-1.0;
   textcoordx[6][9]=0.8;
   textcoordy[6][9]=-0.6;

   textcoordx[6][10]=0.8;
   textcoordy[6][10]=-0.6;
   textcoordx[6][11]=0.8;
   textcoordy[6][11]=-0.2;

   textcoordx[6][12]=0.8;
   textcoordy[6][12]=-0.2;
   textcoordx[6][13]=0.4;
   textcoordy[6][13]=0.2;

   textcoordx[6][14]=0.4;
   textcoordy[6][14]=0.2;
   textcoordx[6][15]=-0.4;
   textcoordy[6][15]=0.2;

   textcoordx[6][16]=-0.4;
   textcoordy[6][16]=0.2;
   textcoordx[6][17]=-0.8;
   textcoordy[6][17]=-0.2;

   /* 7 */
   textcoordx[7][0]=-0.8;
   textcoordy[7][0]=1.0;
   textcoordx[7][1]=0.8;
   textcoordy[7][1]=1.0;

   textcoordx[7][2]=0.8;
   textcoordy[7][2]=1.0;
   textcoordx[7][3]=-0.7;
   textcoordy[7][3]=-1.0;

   /* 8 */
   textcoordx[8][0]=-0.3;
   textcoordy[8][0]=1.0;
   textcoordx[8][1]=-0.8;
   textcoordy[8][1]=0.75;

   textcoordx[8][2]=-0.8;
   textcoordy[8][2]=0.75;
   textcoordx[8][3]=-0.8;
   textcoordy[8][3]=0.25;

   textcoordx[8][4]=-0.8;
   textcoordy[8][4]=0.25;
   textcoordx[8][5]=-0.3;
   textcoordy[8][5]=0.0;

   textcoordx[8][6]=-0.3;
   textcoordy[8][6]=0.0;
   textcoordx[8][7]=0.3;
   textcoordy[8][7]=0.0;

   textcoordx[8][8]=0.3;
   textcoordy[8][8]=0.0;
   textcoordx[8][9]=0.8;
   textcoordy[8][9]=0.25;

   textcoordx[8][10]=0.8;
   textcoordy[8][10]=0.25;
   textcoordx[8][11]=0.8;
   textcoordy[8][11]=0.75;

   textcoordx[8][12]=0.8;
   textcoordy[8][12]=0.75;
   textcoordx[8][13]=0.3;
   textcoordy[8][13]=1.0;

   textcoordx[8][14]=0.3;
   textcoordy[8][14]=1.0;
   textcoordx[8][15]=-0.3;
   textcoordy[8][15]=1.0;

   textcoordx[8][16]=-0.3;
   textcoordy[8][16]=0.0;
   textcoordx[8][17]=-0.8;
   textcoordy[8][17]=-0.25;

   textcoordx[8][18]=-0.8;
   textcoordy[8][18]=-0.25;
   textcoordx[8][19]=-0.8;
   textcoordy[8][19]=-0.75;

   textcoordx[8][20]=-0.8;
   textcoordy[8][20]=-0.75;
   textcoordx[8][21]=-0.3;
   textcoordy[8][21]=-1.0;

   textcoordx[8][22]=-0.3;
   textcoordy[8][22]=-1.0;
   textcoordx[8][23]=0.3;
   textcoordy[8][23]=-1.0;

   textcoordx[8][24]=0.3;
   textcoordy[8][24]=-1.0;
   textcoordx[8][25]=0.8;
   textcoordy[8][25]=-0.75;

   textcoordx[8][26]=0.8;
   textcoordy[8][26]=-0.75;
   textcoordx[8][27]=0.8;
   textcoordy[8][27]=-0.25;

   textcoordx[8][28]=0.8;
   textcoordy[8][28]=-0.25;
   textcoordx[8][29]=0.3;
   textcoordy[8][29]=0.0;

   /* 9 */
   textcoordx[9][0]=-0.8;
   textcoordy[9][0]=-1.0;
   textcoordx[9][1]=0.8;
   textcoordy[9][1]=0.25;

   textcoordx[9][2]=0.8;
   textcoordy[9][2]=0.25;
   textcoordx[9][3]=0.8;
   textcoordy[9][3]=0.75;

   textcoordx[9][4]=0.8;
   textcoordy[9][4]=0.75;
   textcoordx[9][5]=0.3;
   textcoordy[9][5]=1.0;

   textcoordx[9][6]=0.3;
   textcoordy[9][6]=1.0;
   textcoordx[9][7]=-0.3;
   textcoordy[9][7]=1.0;

   textcoordx[9][8]=-0.3;
   textcoordy[9][8]=1.0;
   textcoordx[9][9]=-0.8;
   textcoordy[9][9]=0.75;

   textcoordx[9][10]=-0.8;
   textcoordy[9][10]=0.75;
   textcoordx[9][11]=-0.8;
   textcoordy[9][11]=0.25;

   textcoordx[9][12]=-0.8;
   textcoordy[9][12]=0.25;
   textcoordx[9][13]=-0.3;
   textcoordy[9][13]=0.0;

   textcoordx[9][14]=-0.3;
   textcoordy[9][14]=0.0;
   textcoordx[9][15]=0.3;
   textcoordy[9][15]=0.0;

   textcoordx[9][16]=0.3;
   textcoordy[9][16]=0.0;
   textcoordx[9][17]=0.8;
   textcoordy[9][17]=0.25;

   /* . */
   textcoordx['.'][0]=-0.3;
   textcoordy['.'][0]=-0.7;
   textcoordx['.'][1]=0.3;
   textcoordy['.'][1]=-0.7;

   textcoordx['.'][2]=0.3;
   textcoordy['.'][2]=-0.7;
   textcoordx['.'][3]=0.3;
   textcoordy['.'][3]=-1.0;

   textcoordx['.'][4]=0.3;
   textcoordy['.'][4]=-1.0;
   textcoordx['.'][5]=-0.3;
   textcoordy['.'][5]=-1.0;

   textcoordx['.'][6]=-0.3;
   textcoordy['.'][6]=-1.0;
   textcoordx['.'][7]=-0.3;
   textcoordy['.'][7]=-0.7;
    
   textcoordx['.'][8]=-0.3;
   textcoordy['.'][8]=-0.7;
   textcoordx['.'][9]=0.3;
   textcoordy['.'][9]=-1.0;
       
   textcoordx['.'][10]=0.3;
   textcoordy['.'][10]=-0.7;
   textcoordx['.'][11]=-0.3;
   textcoordy['.'][11]=-1.0;
    
   /* - */
   textcoordx['-'][0]=-0.7;
   textcoordy['-'][0]=0.0;
   textcoordx['-'][1]=0.7;
   textcoordy['-'][1]=0.0;


   /* A */
   textcoordx['A'][0]=-0.8;
   textcoordy['A'][0]=-1.0;
   textcoordx['A'][1]=0.0;
   textcoordy['A'][1]=1.0;

   textcoordx['A'][2]=0.0;
   textcoordy['A'][2]=1.0;
   textcoordx['A'][3]=0.8;
   textcoordy['A'][3]=-1.0;

   textcoordx['A'][4]=-0.4;
   textcoordy['A'][4]=0.0;
   textcoordx['A'][5]=0.4;
   textcoordy['A'][5]=0.0;


   /* B */
   textcoordx['B'][0]=-0.8;
   textcoordy['B'][0]=1.0;
   textcoordx['B'][1]=-0.3;
   textcoordy['B'][1]=1.0;

   textcoordx['B'][2]=-0.3;
   textcoordy['B'][2]=1.0;
   textcoordx['B'][3]=0.8;
   textcoordy['B'][3]=0.8;

   textcoordx['B'][4]=0.8;
   textcoordy['B'][4]=0.8;
   textcoordx['B'][5]=0.8;
   textcoordy['B'][5]=0.2;

   textcoordx['B'][6]=0.8;
   textcoordy['B'][6]=0.2;
   textcoordx['B'][7]=-0.8;
   textcoordy['B'][7]=0.0;

   textcoordx['B'][8]=-0.8;
   textcoordy['B'][8]=0.0;
   textcoordx['B'][9]=0.8;
   textcoordy['B'][9]=-0.2;

   textcoordx['B'][10]=0.8;
   textcoordy['B'][10]=-0.2;
   textcoordx['B'][11]=0.8;
   textcoordy['B'][11]=-0.8;

   textcoordx['B'][12]=0.8;
   textcoordy['B'][12]=-0.8;
   textcoordx['B'][13]=-0.3;
   textcoordy['B'][13]=-1.0;

   textcoordx['B'][14]=-0.3;
   textcoordy['B'][14]=-1.0;
   textcoordx['B'][15]=-0.8;
   textcoordy['B'][15]=-1.0;

   textcoordx['B'][16]=-0.8;
   textcoordy['B'][16]=-1.0;
   textcoordx['B'][17]=-0.8;
   textcoordy['B'][17]=1.0;


   /* C */
   textcoordx['C'][0]=0.8;
   textcoordy['C'][0]=0.5;
   textcoordx['C'][1]=0.8;
   textcoordy['C'][1]=0.6;

   textcoordx['C'][2]=0.8;
   textcoordy['C'][2]=0.6;
   textcoordx['C'][3]=0.5;
   textcoordy['C'][3]=1.0;

   textcoordx['C'][4]=0.5;
   textcoordy['C'][4]=1.0;
   textcoordx['C'][5]=-0.5;
   textcoordy['C'][5]=1.0;

   textcoordx['C'][6]=-0.5;
   textcoordy['C'][6]=1.0;
   textcoordx['C'][7]=-0.8;
   textcoordy['C'][7]=0.6;

   textcoordx['C'][8]=-0.8;
   textcoordy['C'][8]=0.6;
   textcoordx['C'][9]=-0.8;
   textcoordy['C'][9]=-0.6;

   textcoordx['C'][10]=-0.8;
   textcoordy['C'][10]=-0.6;
   textcoordx['C'][11]=-0.5;
   textcoordy['C'][11]=-1.0;

   textcoordx['C'][12]=-0.5;
   textcoordy['C'][12]=-1.0;
   textcoordx['C'][13]=0.5;
   textcoordy['C'][13]=-1.0;

   textcoordx['C'][14]=0.5;
   textcoordy['C'][14]=-1.0;
   textcoordx['C'][15]=0.8;
   textcoordy['C'][15]=-0.6;

   textcoordx['C'][16]=0.8;
   textcoordy['C'][16]=-0.6;
   textcoordx['C'][17]=0.8;
   textcoordy['C'][17]=-0.6;

   /* D */
   textcoordx['D'][0]=-0.8;
   textcoordy['D'][0]=1.0;
   textcoordx['D'][1]=0.0;
   textcoordy['D'][1]=1.0;

   textcoordx['D'][2]=0.0;
   textcoordy['D'][2]=1.0;
   textcoordx['D'][3]=0.8;
   textcoordy['D'][3]=0.7;

   textcoordx['D'][4]=0.8;
   textcoordy['D'][4]=0.7;
   textcoordx['D'][5]=0.8;
   textcoordy['D'][5]=-0.7;

   textcoordx['D'][6]=0.8;
   textcoordy['D'][6]=-0.7;
   textcoordx['D'][7]=0.0;
   textcoordy['D'][7]=-1.0;

   textcoordx['D'][8]=0.0;
   textcoordy['D'][8]=-1.0;
   textcoordx['D'][9]=-0.8;
   textcoordy['D'][9]=-1.0;

   textcoordx['D'][10]=-0.8;
   textcoordy['D'][10]=-1.0;
   textcoordx['D'][11]=-0.8;
   textcoordy['D'][11]=1.0;


   /* E */
   textcoordx['E'][0]=-0.8;
   textcoordy['E'][0]=1.0;
   textcoordx['E'][1]=0.8;
   textcoordy['E'][1]=1.0;

   textcoordx['E'][2]=-0.8;
   textcoordy['E'][2]=0.0;
   textcoordx['E'][3]=0.5;
   textcoordy['E'][3]=0.0;

   textcoordx['E'][4]=-0.8;
   textcoordy['E'][4]=-1.0;
   textcoordx['E'][5]=0.8;
   textcoordy['E'][5]=-1.0;

   textcoordx['E'][6]=-0.8;
   textcoordy['E'][6]=1.0;
   textcoordx['E'][7]=-0.8;
   textcoordy['E'][7]=-1.0;


   /* F */
   textcoordx['F'][0]=-0.8;
   textcoordy['F'][0]=1.0;
   textcoordx['F'][1]=0.8;
   textcoordy['F'][1]=1.0;

   textcoordx['F'][2]=-0.8;
   textcoordy['F'][2]=0.1;
   textcoordx['F'][3]=0.6;
   textcoordy['F'][3]=0.1;

   textcoordx['F'][4]=-0.8;
   textcoordy['F'][4]=1.0;
   textcoordx['F'][5]=-0.8;
   textcoordy['F'][5]=-1.0;

   /* G */
   textcoordx['G'][0]=0.8;
   textcoordy['G'][0]=0.3;
   textcoordx['G'][1]=0.8;
   textcoordy['G'][1]=0.6;

   textcoordx['G'][2]=0.8;
   textcoordy['G'][2]=0.6;
   textcoordx['G'][3]=0.4;
   textcoordy['G'][3]=1.0;

   textcoordx['G'][4]=0.4;
   textcoordy['G'][4]=1.0;
   textcoordx['G'][5]=-0.4;
   textcoordy['G'][5]=1.0;

   textcoordx['G'][6]=-0.4;
   textcoordy['G'][6]=1.0;
   textcoordx['G'][7]=-0.8;
   textcoordy['G'][7]=0.6;

   textcoordx['G'][8]=-0.8;
   textcoordy['G'][8]=0.6;
   textcoordx['G'][9]=-0.8;
   textcoordy['G'][9]=-0.6;

   textcoordx['G'][10]=-0.8;
   textcoordy['G'][10]=-0.6;
   textcoordx['G'][11]=-0.4;
   textcoordy['G'][11]=-1.0;

   textcoordx['G'][12]=-0.4;
   textcoordy['G'][12]=-1.0;
   textcoordx['G'][13]=0.4;
   textcoordy['G'][13]=-1.0;

   textcoordx['G'][14]=0.4;
   textcoordy['G'][14]=-1.0;
   textcoordx['G'][15]=0.8;
   textcoordy['G'][15]=-0.3;

   textcoordx['G'][16]=0.8;
   textcoordy['G'][16]=-0.3;
   textcoordx['G'][17]=0.2;
   textcoordy['G'][17]=-0.3;


   /* H */
   textcoordx['H'][0]=-0.8;
   textcoordy['H'][0]=1.0;
   textcoordx['H'][1]=-0.8;
   textcoordy['H'][1]=-1.0;

   textcoordx['H'][2]=0.8;
   textcoordy['H'][2]=1.0;
   textcoordx['H'][3]=0.8;
   textcoordy['H'][3]=-1.0;

   textcoordx['H'][4]=-0.8;
   textcoordy['H'][4]=0.0;
   textcoordx['H'][5]=0.8;
   textcoordy['H'][5]=0.0;

   /* I */
   textcoordx['I'][0]=-0.4;
   textcoordy['I'][0]=1.0;
   textcoordx['I'][1]=0.4;
   textcoordy['I'][1]=1.0;

   textcoordx['I'][2]=-0.4;
   textcoordy['I'][2]=-1.0;
   textcoordx['I'][3]=0.4;
   textcoordy['I'][3]=-1.0;

   textcoordx['I'][4]=0.0;
   textcoordy['I'][4]=1.0;
   textcoordx['I'][5]=0.0;
   textcoordy['I'][5]=-1.0;

   /* J */
   textcoordx['J'][0]=-0.2;
   textcoordy['J'][0]=1.0;
   textcoordx['J'][1]=0.8;
   textcoordy['J'][1]=1.0;

   textcoordx['J'][2]=0.3;
   textcoordy['J'][2]=1.0;
   textcoordx['J'][3]=0.3;
   textcoordy['J'][3]=-0.6;

   textcoordx['J'][4]=0.3;
   textcoordy['J'][4]=-0.6;
   textcoordx['J'][5]=-0.1;
   textcoordy['J'][5]=-1.0;

   textcoordx['J'][6]=-0.1;
   textcoordy['J'][6]=-1.0;
   textcoordx['J'][7]=-0.4;
   textcoordy['J'][7]=-1.0;

   textcoordx['J'][8]=-0.4;
   textcoordy['J'][8]=-1.0;
   textcoordx['J'][9]=-0.8;
   textcoordy['J'][9]=-0.6;

   textcoordx['J'][10]=-0.8;
   textcoordy['J'][10]=-0.6;
   textcoordx['J'][11]=-0.8;
   textcoordy['J'][11]=-0.4;

   /* K */
   textcoordx['K'][0]=-0.8;
   textcoordy['K'][0]=1.0;
   textcoordx['K'][1]=-0.8;
   textcoordy['K'][1]=-1.0;

   textcoordx['K'][2]=-0.8;
   textcoordy['K'][2]=-0.2;
   textcoordx['K'][3]=0.8;
   textcoordy['K'][3]=1.0;

   textcoordx['K'][4]=-0.4;
   textcoordy['K'][4]=0.1;
   textcoordx['K'][5]=0.8;
   textcoordy['K'][5]=-1.0;


   /* L */
   textcoordx['L'][0]=-0.8;
   textcoordy['L'][0]=1.0;
   textcoordx['L'][1]=-0.8;
   textcoordy['L'][1]=-1.0;

   textcoordx['L'][2]=-0.8;
   textcoordy['L'][2]=-1.0;
   textcoordx['L'][3]=0.8;
   textcoordy['L'][3]=-1.0;


   /* M */
   textcoordx['M'][0]=-0.8;
   textcoordy['M'][0]=-1.0;
   textcoordx['M'][1]=-0.8;
   textcoordy['M'][1]=1.0;

   textcoordx['M'][2]=-0.8;
   textcoordy['M'][2]=1.0;
   textcoordx['M'][3]=0.0;
   textcoordy['M'][3]=0.0;

   textcoordx['M'][4]=0.0;
   textcoordy['M'][4]=0.0;
   textcoordx['M'][5]=0.8;
   textcoordy['M'][5]=1.0;

   textcoordx['M'][6]=0.8;
   textcoordy['M'][6]=1.0;
   textcoordx['M'][7]=0.8;
   textcoordy['M'][7]=-1.0;


   /* N */
   textcoordx['N'][0]=-0.8;
   textcoordy['N'][0]=-1.0;
   textcoordx['N'][1]=-0.8;
   textcoordy['N'][1]=1.0;

   textcoordx['N'][2]=-0.8;
   textcoordy['N'][2]=1.0;
   textcoordx['N'][3]=0.8;
   textcoordy['N'][3]=-1.0;

   textcoordx['N'][4]=0.8;
   textcoordy['N'][4]=1.0;
   textcoordx['N'][5]=0.8;
   textcoordy['N'][5]=-1.0;


   /* O */
   textcoordx['O'][0]=-0.4;
   textcoordy['O'][0]=1.0;
   textcoordx['O'][1]=-0.8;
   textcoordy['O'][1]=0.4;

   textcoordx['O'][2]=-0.8;
   textcoordy['O'][2]=0.4;
   textcoordx['O'][3]=-0.8;
   textcoordy['O'][3]=-0.4;

   textcoordx['O'][4]=-0.8;
   textcoordy['O'][4]=-0.4;
   textcoordx['O'][5]=-0.4;
   textcoordy['O'][5]=-1.0;

   textcoordx['O'][6]=-0.4;
   textcoordy['O'][6]=-1.0;
   textcoordx['O'][7]=0.4;
   textcoordy['O'][7]=-1.0;

   textcoordx['O'][8]=0.4;
   textcoordy['O'][8]=-1.0;
   textcoordx['O'][9]=0.8;
   textcoordy['O'][9]=-0.4;

   textcoordx['O'][10]=0.8;
   textcoordy['O'][10]=-0.4;
   textcoordx['O'][11]=0.8;
   textcoordy['O'][11]=0.4;

   textcoordx['O'][12]=0.8;
   textcoordy['O'][12]=0.4;
   textcoordx['O'][13]=0.4;
   textcoordy['O'][13]=1.0;

   textcoordx['O'][14]=0.4;
   textcoordy['O'][14]=1.0;
   textcoordx['O'][15]=-0.4;
   textcoordy['O'][15]=1.0;


   /* P */
   textcoordx['P'][0]=-0.8;
   textcoordy['P'][0]=1.0;
   textcoordx['P'][1]=-0.8;
   textcoordy['P'][1]=-1.0;

   textcoordx['P'][2]=-0.8;
   textcoordy['P'][2]=0.0;
   textcoordx['P'][3]=0.5;
   textcoordy['P'][3]=0.0;

   textcoordx['P'][4]=0.5;
   textcoordy['P'][4]=0.0;
   textcoordx['P'][5]=0.8;
   textcoordy['P'][5]=0.3;

   textcoordx['P'][6]=0.8;
   textcoordy['P'][6]=0.3;
   textcoordx['P'][7]=0.8;
   textcoordy['P'][7]=0.7;

   textcoordx['P'][8]=0.8;
   textcoordy['P'][8]=0.7;
   textcoordx['P'][9]=0.5;
   textcoordy['P'][9]=1.0;

   textcoordx['P'][10]=0.5;
   textcoordy['P'][10]=1.0;
   textcoordx['P'][11]=-0.8;
   textcoordy['P'][11]=1.0;


   /* Q */
   textcoordx['Q'][0]=-0.4;
   textcoordy['Q'][0]=1.0;
   textcoordx['Q'][1]=-0.8;
   textcoordy['Q'][1]=0.4;
    
   textcoordx['Q'][2]=-0.8;
   textcoordy['Q'][2]=0.4;
   textcoordx['Q'][3]=-0.8;
   textcoordy['Q'][3]=-0.4;
    
   textcoordx['Q'][4]=-0.8;
   textcoordy['Q'][4]=-0.4;
   textcoordx['Q'][5]=-0.4;
   textcoordy['Q'][5]=-1.0;
    
   textcoordx['Q'][6]=-0.4;
   textcoordy['Q'][6]=-1.0;
   textcoordx['Q'][7]=0.4;
   textcoordy['Q'][7]=-1.0;
    
   textcoordx['Q'][8]=0.4;
   textcoordy['Q'][8]=-1.0;
   textcoordx['Q'][9]=0.8;
   textcoordy['Q'][9]=-0.4;
    
   textcoordx['Q'][10]=0.8;
   textcoordy['Q'][10]=-0.4;
   textcoordx['Q'][11]=0.8;
   textcoordy['Q'][11]=0.4;
    
   textcoordx['Q'][12]=0.8;
   textcoordy['Q'][12]=0.4;
   textcoordx['Q'][13]=0.4;
   textcoordy['Q'][13]=1.0;
    
   textcoordx['Q'][14]=0.4;
   textcoordy['Q'][14]=1.0;
   textcoordx['Q'][15]=-0.4;
   textcoordy['Q'][15]=1.0;

   textcoordx['Q'][16]=0.2;   
   textcoordy['Q'][16]=-0.5;   
   textcoordx['Q'][17]=0.8;   
   textcoordy['Q'][17]=-0.9;   


   /* R */
   textcoordx['R'][0]=-0.8;
   textcoordy['R'][0]=1.0;
   textcoordx['R'][1]=-0.8;
   textcoordy['R'][1]=-1.0;
    
   textcoordx['R'][2]=-0.8;
   textcoordy['R'][2]=0.0;
   textcoordx['R'][3]=0.5;
   textcoordy['R'][3]=0.0;
    
   textcoordx['R'][4]=0.5;
   textcoordy['R'][4]=0.0;
   textcoordx['R'][5]=0.8;
   textcoordy['R'][5]=0.3;
    
   textcoordx['R'][6]=0.8;
   textcoordy['R'][6]=0.3;
   textcoordx['R'][7]=0.8;
   textcoordy['R'][7]=0.7;
    
   textcoordx['R'][8]=0.8;
   textcoordy['R'][8]=0.7;
   textcoordx['R'][9]=0.5;
   textcoordy['R'][9]=1.0;
    
   textcoordx['R'][10]=0.5;
   textcoordy['R'][10]=1.0;
   textcoordx['R'][11]=-0.8;
   textcoordy['R'][11]=1.0;
    
   textcoordx['R'][12]=0.5;
   textcoordy['R'][12]=0.0;
   textcoordx['R'][13]=0.8;
   textcoordy['R'][13]=-1.0;


   /* S */
   textcoordx['S'][0]=0.8;
   textcoordy['S'][0]=0.6;
   textcoordx['S'][1]=0.4;
   textcoordy['S'][1]=1.0;

   textcoordx['S'][2]=0.4;
   textcoordy['S'][2]=1.0;
   textcoordx['S'][3]=-0.4;
   textcoordy['S'][3]=1.0;

   textcoordx['S'][20]=-0.4;
   textcoordy['S'][20]=1.0;
   textcoordx['S'][21]=-0.8;
   textcoordy['S'][21]=0.6;

   textcoordx['S'][4]=-0.8;
   textcoordy['S'][4]=0.6;
   textcoordx['S'][5]=-0.8;
   textcoordy['S'][5]=0.4;

   textcoordx['S'][6]=-0.8;
   textcoordy['S'][6]=0.4;
   textcoordx['S'][7]=-0.4;
   textcoordy['S'][7]=0.0;

   textcoordx['S'][8]=-0.4;
   textcoordy['S'][8]=0.0;
   textcoordx['S'][9]=0.4;
   textcoordy['S'][9]=0.0;

   textcoordx['S'][10]=0.4;
   textcoordy['S'][10]=0.0;
   textcoordx['S'][11]=0.8;
   textcoordy['S'][11]=-0.4;

   textcoordx['S'][12]=0.8;
   textcoordy['S'][12]=-0.4;
   textcoordx['S'][13]=0.8;
   textcoordy['S'][13]=-0.6;

   textcoordx['S'][14]=0.8;
   textcoordy['S'][14]=-0.6;
   textcoordx['S'][15]=0.4;
   textcoordy['S'][15]=-1.0;

   textcoordx['S'][16]=0.4;
   textcoordy['S'][16]=-1.0;
   textcoordx['S'][17]=-0.4;
   textcoordy['S'][17]=-1.0;

   textcoordx['S'][18]=-0.4;
   textcoordy['S'][18]=-1.0;
   textcoordx['S'][19]=-0.8;
   textcoordy['S'][19]=-0.6;


   /* T */
   textcoordx['T'][0]=-0.8;
   textcoordy['T'][0]=1.0;
   textcoordx['T'][1]=0.8;
   textcoordy['T'][1]=1.0;

   textcoordx['T'][2]=0.0;
   textcoordy['T'][2]=1.0;
   textcoordx['T'][3]=0.0;
   textcoordy['T'][3]=-1.0;


   /* U */
   textcoordx['U'][0]=-0.8;
   textcoordy['U'][0]=1.0;
   textcoordx['U'][1]=-0.8;
   textcoordy['U'][1]=-0.7;

   textcoordx['U'][2]=-0.8;
   textcoordy['U'][2]=-0.7;
   textcoordx['U'][3]=-0.5;
   textcoordy['U'][3]=-1.0;

   textcoordx['U'][4]=-0.5;
   textcoordy['U'][4]=-1.0;
   textcoordx['U'][5]=0.5;
   textcoordy['U'][5]=-1.0;

   textcoordx['U'][6]=0.5;
   textcoordy['U'][6]=-1.0;
   textcoordx['U'][7]=0.8;
   textcoordy['U'][7]=-0.7;

   textcoordx['U'][8]=0.8;
   textcoordy['U'][8]=-0.7;
   textcoordx['U'][9]=0.8;
   textcoordy['U'][9]=1.0;


   /* V */
   textcoordx['V'][0]=-0.8;
   textcoordy['V'][0]=1.0;
   textcoordx['V'][1]=0.0;
   textcoordy['V'][1]=-1.0;

   textcoordx['V'][2]=0.0;
   textcoordy['V'][2]=-1.0;
   textcoordx['V'][3]=0.8;
   textcoordy['V'][3]=1.0;


   /* W */
   textcoordx['W'][0]=-0.8;
   textcoordy['W'][0]=1.0;
   textcoordx['W'][1]=-0.8;
   textcoordy['W'][1]=-1.0;

   textcoordx['W'][2]=-0.8;
   textcoordy['W'][2]=-1.0;
   textcoordx['W'][3]=0.0;
   textcoordy['W'][3]=0.0;

   textcoordx['W'][4]=0.0;
   textcoordy['W'][4]=0.0;
   textcoordx['W'][5]=0.8;
   textcoordy['W'][5]=-1.0;

   textcoordx['W'][6]=0.8;
   textcoordy['W'][6]=-1.0;
   textcoordx['W'][7]=0.8;
   textcoordy['W'][7]=1.0;

    
   /* X */
   textcoordx['X'][0]=-0.8;
   textcoordy['X'][0]=1.0;
   textcoordx['X'][1]=0.8;
   textcoordy['X'][1]=-1.0;

   textcoordx['X'][2]=0.8;
   textcoordy['X'][2]=1.0;
   textcoordx['X'][3]=-0.8;
   textcoordy['X'][3]=-1.0;


   /* Y */
   textcoordx['Y'][0]=-0.8;
   textcoordy['Y'][0]=1.0;
   textcoordx['Y'][1]=0.0;
   textcoordy['Y'][1]=0.1;

   textcoordx['Y'][2]=0.0;
   textcoordy['Y'][2]=0.1;
   textcoordx['Y'][3]=0.8;
   textcoordy['Y'][3]=1.0;

   textcoordx['Y'][4]=0.0;
   textcoordy['Y'][4]=0.1;
   textcoordx['Y'][5]=0.0;
   textcoordy['Y'][5]=-1.0;


   /* Z phew!!!.... */
   textcoordx['Z'][0]=-0.8;
   textcoordy['Z'][0]=1.0;
   textcoordx['Z'][1]=0.8;
   textcoordy['Z'][1]=1.0;

   textcoordx['Z'][2]=-0.8;
   textcoordy['Z'][2]=-1.0;
   textcoordx['Z'][3]=0.8;
   textcoordy['Z'][3]=1.0;

   textcoordx['Z'][4]=-0.8;
   textcoordy['Z'][4]=-1.0;
   textcoordx['Z'][5]=0.8;
   textcoordy['Z'][5]=-1.0;


}




static int make_digit( char digit, float x, float y, float dx, 
                       float dy, float vx[], float vy[])
{
   int num = 0;
   static int do_once = 1;
   int n;

   if (do_once){
      init_text();
      do_once = 0;
   }
   if (digit >= '0'  &&  digit <= '9'){
      n = digit - '0';
   }
   else{
      n = (int)digit;
   }
   while(textcoordx[n][num] <= 1.0){
      vx[num] = x + (dx*textcoordx[n][num]);
      vy[num] = y + (dy*0.9*textcoordy[n][num]);
      num++;
      vx[num] = x + (dx*textcoordx[n][num]);
      vy[num] = y + (dy*0.9*textcoordy[n][num]);
      num++;
   }
   return num;
}

static void do_digits( double x, char str[],
                       int *decimal, int *sign)
{
   register int k, k1, k2, k3;
   int len;

   len = strlen(str);

   k = (int) x;
   if (x < 0){
      k = -k;
      x = -x;
      *sign = 1;
   }
   else{
      *sign = 0;
   }

   k1 = ( (int) (x * 10.0) ) % 10;
   k2 = ( (int) (x * 100.0) ) % 10;
   k3 = ( (int) (x * 1000.0) ) % 10;

   if (k>=100) {
      str[len-4] = 0;
      *decimal = 0;
   }
   else if (k>=10) {
      *decimal = 1;
      str[len-1] = 0;
      if (k2 == 0){
         str[len-2] = 0;
         if (k1 == 0){
            str[len-4] = 0;
            *decimal = 0;
         }
      }
   }
   else{
      *decimal = 1;
      if (k3==0){
         str[len-1] = 0;
         if (k2==0){
            str[len-2] = 0;
            if (k1==0){
               str[len-4] = 0;
               *decimal = 0;
            }
         }
      }
   }
}
      
 


int create_num_textplot( Irregular_Context itx, int time, float xs[],
                     float ys[], float zs[], double *numdata, int ploton[],
                     float vx[],
                     float vy[], float vz[], int *numv)
{
   int v, i, j, vcount;
   char label_str[40];
   int label_len;
   float x, y;
   int morev;
   float sizex, sizey, sizespace;
   int decimal, sign;
   int count = 0;

   sizex = 0.002 * itx->TextPlotFontX;
   sizey = 0.002 * 0.8 * itx->TextPlotFontY;
   sizespace = .0005 * itx->TextPlotFontSpace;
      
   vcount = 0;
   for (i = 0; i < itx->NumRecs[time]; i++){
      if (ploton[i]==1){
         if (!IS_MISSING(numdata[count])){
            sprintf( label_str, "%.3f", numdata[count]);
            do_digits( numdata[count], label_str, &decimal, &sign);
            label_len = strlen(label_str);

            x = xs[i] - ((sizex * label_len)+(sizespace * (label_len-1)))/2.0; 
            y = ys[i];


            if (sign){
               x += sizex/4.0; 
            }
            if (decimal){
               x += sizex/4.0;
            }

            for (j = 0; j < label_len; j++){
               if (label_str[j] == '.' ||
                   label_str[j] == '-'){
                  x -= sizex/4.0;
                  morev = make_digit( label_str[j], x, y,
                                   sizex/4.0, sizey,
                                   vx+vcount, vy+vcount);
                  x -= sizex/4.0;
               }
               else{
                  morev = make_digit( label_str[j], x, y,
                                   sizex/2.0, sizey,
                                   vx+vcount, vy+vcount);
               }
               x += sizex + sizespace;
               for (v = vcount; v < vcount+morev; v++){
                  vz[v] = zs[i];
               }
               vcount += morev;
               if (vcount >= MAX_TEXT_PLOT_VERTS){
                  printf("Error in create_num_textplot\n");
                  return -1;
               }
            }
         }
         count++;
      }
   }


   *numv = vcount;
   return 0;
}

int create_color_num_textplot( Irregular_Context itx, int time, float xs[],
                     float ys[], float zs[], double *numdata,
                     int ploton[], float vx[],
                     float vy[], float vz[], int *numv,
                     uint_1 *color_indexes)
{
   int v, i, j, vcount;
   char label_str[40];
   int label_len;
   float x, y;
   int morev;
   float sizex, sizey, sizespace;
   int decimal, sign;
   float valscale, min, max;
   int var, index;
   int pcount = 0; 

   sizex = 0.002 * itx->TextPlotFontX;
   sizey = 0.002 * 0.8 * itx->TextPlotFontY;
   sizespace = .0005 * itx->TextPlotFontSpace;
   var = itx->TextPlotVar;

   vcount = 0;
   min = itx->Variable[var]->MinVal;
   max = itx->Variable[var]->MaxVal;
   valscale = 254.0 / (max - min);

   for (i = 0; i < itx->NumRecs[time]; i++){
      if (ploton[i]){
         if (!IS_MISSING(numdata[pcount])){
            sprintf( label_str, "%.3f", numdata[pcount]);
            do_digits( numdata[pcount], label_str, &decimal, &sign);
            label_len = strlen(label_str);
    
            x = xs[i] - ((sizex * label_len)+(sizespace * (label_len-1)))/2.0;
            y = ys[i];
    
            if (sign){
               x += sizex/4.0;
            }
            if (decimal){
               x += sizex/4.0;
            }
    
            for (j = 0; j < label_len; j++){
               if (label_str[j] == '.' ||
                   label_str[j] == '-'){
                  x -= sizex/4.0;
                  morev = make_digit( label_str[j], x, y,
                                   sizex/4.0, sizey,
                                   vx+vcount, vy+vcount);
                  x -= sizex/4.0;
               }
               else{
                  morev = make_digit( label_str[j], x, y,
                                   sizex/2.0, sizey,
                                   vx+vcount, vy+vcount);
               }
               x += sizex + sizespace;
               index = (numdata[pcount] - min) * valscale;
               index = (index < 0) ? 0 : (index > 254) ? 254 : index;
               for (v = vcount; v < vcount+morev; v+=2){
                  vz[v] = zs[i];
                  vz[v+1] = zs[i];
                  color_indexes[v/2] = index;
               }
               vcount += morev;
               if (vcount >= MAX_TEXT_PLOT_VERTS){
                  printf("Error in create_num_textplot\n");
                  return -1;
               }
            }
         }
         pcount++;
      }
   }
   *numv = vcount;
   return 0;
}

int create_letter_textplot( Irregular_Context itx, int time, float xs[],
                     float ys[], float zs[], char *chardata, int ploton[], int var,
                     float vx[],
                     float vy[], float vz[], int *numv) 
{                    
   int v, i, j, vcount;
   int label_len;
   float x, y;
   int morev;
   float sizex, sizey, sizespace;
   char tempword[1000];
   int l, ccount;

   sizex = 0.002 * itx->TextPlotFontX;
   sizey = 0.002 * 0.8 * itx->TextPlotFontY;
   sizespace = 0.0005 * itx->TextPlotFontSpace;
 
   vcount = 0;
   ccount = 0;
   if (chardata[0] == 0){
      *numv = 0;
       return 0;
   }
   for (i = 0; i < itx->NumRecs[time]; i++){
      if (ploton[i]){
         for (l = 0; l < itx->Variable[var]->CharVarLength; l++){
            tempword[l] = chardata[ccount+l];
         }  
         tempword[l] = 0;
         label_len = strlen(tempword);
         x = xs[i] - ((sizex * label_len)+(sizespace * (label_len-1)))/2.0;
         y = ys[i];
 
         for (j = 0; j < label_len; j++){
            morev = make_digit( tempword[j], x, y,
                             sizex/2.0, sizey,
                             vx+vcount, vy+vcount);
            x += sizex+ sizespace;
            for (v = vcount; v < vcount+morev; v++){
               vz[v] = zs[i];
            }  
            vcount += morev;
            if (vcount >= MAX_TEXT_PLOT_VERTS){
               printf("Error in create_letter_textplot\n");
               return -1;
            }  
         }
         ccount += itx->Variable[var]->CharVarLength;
      }
   }  
 
   *numv = vcount;
   return 0;
}  

     
void space_plots( Irregular_Context itx, int time, 
                     int ploton[], float xs[],
                     float ys[], float zs[], int *numtouse)
{
   float xlist[MAXRECS];
   int xrecord[MAXRECS];
   int numx;
   int temp[MAXRECS];
   int numtemps;
   float thres;
   int i, j, k, ntu;
   float dist;

   for (i = 0; i < itx->NumRecs[time]; i++){
      ploton[i] = 1;
   }
   ntu = itx->NumRecs[time];

   if (itx->TextPlotSpacing == 0.0){
      *numtouse = 0;
      return;
   }
   /***************************/   
   /* set first record to one */
   /***************************/
   xlist[0] = xs[0];
   xrecord[0] = 0;
   numx = 1;
   

   thres = 0.1 * itx->TextPlotSpacing;
   for (i = 1; i < itx->NumRecs[time]; i++){
      numtemps = 0;
      /******************************************/
      /* go through records that are ok to plot */
      /******************************************/
      for ( j = 0; j < numx; j++){
         /* check if within threshold */
         if (xs[i]-xlist[j] < thres){
            temp[numtemps] = xrecord[j];
            numtemps++;
         }
      }
      for (j = 0; j < numtemps && ploton[i]; j++){
         dist = DISTANCE(xs[i], ys[i], xs[temp[j]], ys[temp[j]]);
         if (dist < thres){
            ploton[i] = 0;
            ntu--;

         }
      }
      if (ploton[i]){
         for (j = 0; j < numx; j++){
            if (xs[i] < xlist[j]){
               for (k = numx; k > j; k--){
                  xlist[k] = xlist[k-1];
                  xrecord[k] = xrecord[k-1];
               }
               break;
            }
         }
         xlist[j] = xs[i];
         xrecord[j] = i;
         numx++;
      }
   }
   *numtouse = ntu;
}
 






          





























   



syntax highlighted by Code2HTML, v. 0.9.1