////////////////////////////////////////////////////////
//
// GEM - Graphics Environment for Multimedia
//
// mark@danks.org
//
// Implementation file
//
//    Copyright (c) 1997-1998 Mark Danks.
//    For information on usage and redistribution, and for a DISCLAIMER OF ALL
//    WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
//
/////////////////////////////////////////////////////////

#include <stdio.h>
#include <string.h>
#include "ascii_text.h"

CPPEXTERN_NEW_WITH_ONE_ARG(ascii_text,t_floatarg, A_DEFFLOAT)

/////////////////////////////////////////////////////////
//
// ascii_text
//
/////////////////////////////////////////////////////////
// Constructor
//
/////////////////////////////////////////////////////////
ascii_text :: ascii_text(t_floatarg lines) 
{ 
  int i;
  m_lines = 25;
  m_cols = 80;
  if (lines != 0) m_lines = (t_int) lines;

  m_text = (char*)getbytes(m_lines*m_cols);
  bzero(m_text,m_lines*m_cols);
  strcpy(m_text," ascii_text");
}

/////////////////////////////////////////////////////////
// Destructor
//
/////////////////////////////////////////////////////////
ascii_text :: ~ascii_text()
{ }
 
/////////////////////////////////////////////////////////
// processImage
//
/////////////////////////////////////////////////////////
void ascii_text :: processImage(imageStruct &image)
{

}

/////////////////////////////////////////////////////////
// render
//
/////////////////////////////////////////////////////////
void ascii_text :: render(GemState *state)
{

  m_pixBlock.image.data =  (unsigned char*)m_text;
  m_pixBlock.image.xsize = m_cols;
  m_pixBlock.image.ysize = m_lines;

  /*
  m_pixBlock.newimage = state->image->newimage;
  */
  state->image = &m_pixBlock;

}


/////////////////////////////////////////////////////////
// static member function
//
/////////////////////////////////////////////////////////
void ascii_text :: obj_setupCallback(t_class * classPtr)
{ 
    class_addmethod(classPtr, (t_method)&ascii_text::textMessCallback,
    	    gensym("text"), A_GIMME, A_NULL);
    
}


void ascii_text :: text(t_int argc,t_atom*  argv)
{
  int i,j;
  t_symbol* sa;
  t_float fa;
  int len;
  char temp[255];


  bcopy(m_text,m_text+m_cols,m_cols*(m_lines-1));

  for (i=0;i<m_cols;i++)
    m_text[i] = 0;
  
  while (argc--) {
    switch (argv->a_type) {
    case A_FLOAT:
      fa = atom_getfloat(argv++);
      sprintf(temp,"%f",fa);
      len+=strlen(temp);
      if (len > m_cols) return;
      strcat(m_text,temp);
      post("float %f",fa);
      break;
    case A_SYMBOL:
      sa = atom_getsymbol(argv++);
      len+=strlen(sa->s_name);
      if (len > m_cols) return;
      strcat(m_text,sa->s_name);
      post("symbol %s",sa->s_name);
      break;		   
    }
    strcat(temp," ");
  }

}
