/*****************************************************************************
  FILE           : d3_fonts.c
  SHORTNAME      : fonts.c
  SNNS VERSION   : 3.2

  PURPOSE        : font selection and character drawing
  NOTES          :

  AUTHOR         : Ralf Huebner
  DATE           : 1.12.1991

  CHANGED BY     : Sven Doering
  IDENTIFICATION : @(#)d3_fonts.c	1.12 3/2/94
  SCCS VERSION   : 1.12
  LAST CHANGE    : 3/2/94

             Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG

******************************************************************************/
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>

#include "glob_typ.h"
#include "d3_global.h"
#include "d3_fonts.ph"
#include "d3_point.h"
#include "d3_zgraph.h"
#include "d3_graph.h"

#include "d3_font5x7.h"
#include "d3_font5x8.h"
#include "d3_font8x14.h"


/*****************************************************************************
  FUNCTION : d3_select_font

  PURPOSE  : select a font
  RETURNS  : 
  NOTES    : set width and height of the font

******************************************************************************/


void d3_select_font (int selected_font)
{
    switch (selected_font) {
       case fnt5x7:  font = font5x7; 
                     width = font5x7_width;
                     height = font5x7_height;
                     break;
       case fnt5x8:  font = font5x8; 
                     width = font5x8_width;
                     height = font5x8_height;
                     break;
       default:      font = font8x14; 
                     width = font8x14_width;
                     height = font8x14_height;
                     break;
    }

}





/*****************************************************************************
  FUNCTION : d3_get_font_size

  PURPOSE  : gets the width and height of the current font
  RETURNS  : width and height
  NOTES    :

******************************************************************************/


void d3_get_font_size (int *x, int *y)
{
    *x = width;
    *y = height;
}



/*****************************************************************************
  FUNCTION : draw_char

  PURPOSE  : draws the charcter c at (xpos, ypos)
  RETURNS  : 
  NOTES    :

******************************************************************************/


static void draw_char (int xpos, int ypos, unsigned char ch)
{
     int xsize, ysize, index, dx, dy;
     unsigned char b;


     xsize = width - 1;
     ysize = height - 1;
     index = height * ch;

     for (dy=0; dy<=ysize; dy++) {
         b = font[index];
         for (dx=0; dx<=xsize; dx++) {
             if ((b >> (7-dx)) & 0x01)
                 d3_putPixel (xpos+dx, ypos+dy);
         }
         index++;
     }
}



/*****************************************************************************
  FUNCTION : draw_zbuffered_char

  PURPOSE  : draws the z-bufferd charcter c at (xpos, ypos, zpos)
  RETURNS  : 
  NOTES    :

******************************************************************************/



static void draw_zbuffered_char (int xpos, int ypos, float zpos, unsigned char ch)
{
     int xsize, ysize, index, dx, dy, xp, yp;
     float zp;
     unsigned char b;


     xsize = width - 1;
     ysize = height - 1;
     index = height * ch;

     for (dy=0; dy<=ysize; dy++) {
         b = font[index];
         for (dx=0; dx<=xsize; dx++) {
             if ((b >> (7-dx)) & 0x01) {
                 xp = xpos + dx;
                 yp = ypos + dy;
                 if ((xp >= d3_clipWindow.x0) && (yp >= d3_clipWindow.y0) 
                     && (yp < d3_clipWindow.y1) && (xp < d3_clipWindow.x1)) {
                     d3_readZbuffer (xp, yp, &zp);
                     if (zpos < zp) {
                         d3_putPixel(xp, yp);
                         d3_writeZbuffer (xp, yp, zpos);
		     }
                 }
	     }
         }
         index++;
     }
}



/*****************************************************************************
  FUNCTION : d3_draw_string

  PURPOSE  : draws a string
  RETURNS  : 
  NOTES    : check wether z buffering is active

******************************************************************************/



void d3_draw_string (int xpos, int ypos, float zpos, char *s)
{
    d3_setBlackColor ();
    if (d3_state.model_mode == solid)
        for (; *s!='\0'; s++) {
           draw_zbuffered_char (xpos, ypos, zpos, *s);
           xpos += width + 1;
	}
    else
        for (; *s!='\0'; s++) {
           draw_char (xpos, ypos, *s);
           xpos += width + 1;
	}
    
}



/* end of file */
/* lines: 212 */


