#define __Userapp

#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "hot.h"
#include <dos.h>

#include "adamvisn.h"
#include "matrix.h"
#include "parea.h"

#define cmDraw       2000
#define cmErase      2001
#define cmClear      2002
#define cmSelectChar 2003
#define cmFontUpdate 2004
#define cmToDefault  2005
#define cmSaveBin    2006
#define cmLoadBin    2007
#define cmOptions    2008
#define cmSaveForm   2009

class FontApp : public App {
 public:
  FontApp(void);
  paint_area *fontgrid;
  grid_area  *fontselect;
  inputline  *fontname;
  int currentchar;
  unsigned char thefont[96][8];
//  char fontname[16];

  char evhandle(Event& ev);
  void orig(int which);
  char execdialog(dialog *d,char *strbuf);
  void saveform(char *filename);
  void savebin(char *filename);
  void loadbin(char *filename);
  void showall(void);
  void draw(void);
 };

dialog *getstring(char *title){
 area t;
 dialog *d;
 iso *i;
 unsigned int c;

 t.assign(118,10,201,40);
 d=new dialog(t,title);
 t.assign(120,17,199,22);
 d->add(new inputline(t,12));
 t.assign(125,30,154,38);
 d->add(new button(t,"OK",5,cmQuit));
 t.assign(165,30,194,38);
 d->add(new button(t,"CANCEL",5,cmCancel));

 return d;
 }

char FontApp::execdialog(dialog *d,char *strbuf){
 unsigned int c;
 c=runiso(d);
 d->getdata(strbuf);
 delete(d);
 return c;

 }

void FontApp::saveform(char *filename){
 int outhandle,loop,y;
 unsigned char heights[94],maxheight=0,spacewidth=3;

 if(filename[0]==0){return;}
 outhandle=creat(filename,S_IREAD|S_IWRITE);
 for(loop=0;loop<94;loop++){
  heights[loop]=0;

  for(y=0;y<8;y++){
   if(thefont[loop][y]){heights[loop]=y+1; if(y+1>maxheight){maxheight=y+1;}}
   }

  }
  write(outhandle,&maxheight,1);
  write(outhandle,&spacewidth,1);
  write(outhandle,heights,94);

  for(loop=0;loop<94;loop++){
   write(outhandle,thefont[loop],maxheight);
   }
  close(outhandle);
 }

void FontApp::savebin(char *filename){
 int outhandle,loop;

 if(filename[0]==0){return;}
 outhandle=creat(filename,S_IREAD|S_IWRITE);
 for(loop=0;loop<94;loop++){write(outhandle,thefont[loop],8);}
 close(outhandle);
 }

void FontApp::loadbin(char *filename){
 int inhandle,loop;

 if(filename[0]==0){return;}
 inhandle=open(filename,O_BINARY|O_RDWR);
 for(loop=0;loop<94;loop++){read(inhandle,thefont[loop],8);}
 close(inhandle);
 }

FontApp::FontApp(void){
 area t;
 int index,x,y;
 bytegrid tempgrid;
 char test[20];
 tempgrid(8,8);

// strcpy(fontname,"Default font");

 currentchar=0;
 for(index=0;index<94;index++){
  orig(index);
  }

 t.assign(0,16,8,8);
 fontgrid=new paint_area(t,8,cmFontUpdate);
 add(fontgrid);
 unpack_matrix(tempgrid,thefont[currentchar]);
 fontgrid->set(tempgrid);
// message(fontgrid,evCommand,cmNewGridColor,5);
// message(fontgrid,evCommand,cmNewGridType,(long)gridOff);

 t.assign(77,16,24,4);
 fontselect=new grid_area(t,9,cmSelectChar);
 add(fontselect);

 t.assign(278,100,319,108);
 add(new button(t,"LOAD BIN",5,cmLoadBin));
 t.moverel(0,9);
 add(new button(t,"SAVE BIN",5,cmSaveBin));
 t.moverel(0,9);
 add(new button(t,"SAVE FORM",5,cmSaveForm));
 t.moverel(0,9);
 add(new button(t,"OPTIONS...",5,cmOptions));
 t.moverel(0,9);
 add(new button(t,"QUIT",5,cmQuit));

 t.moveto(77,54);
 add(new button(t,"CLEAR",5,cmClear));
 t.moverel(42,0);
 add(new button(t,"DEFAULT",5,cmToDefault));
 t.assign(0,10,1,1);
 add(new statictext(t,"FONT GRID:"));
 t.assign(78,10,1,1);
 add(new statictext(t,"SELCETION GRID:"));

 t.assign(42,0,140,5);
 fontname=new inputline(t,20,"Default");
 add(fontname);
 fontname->getdata(test);

 t.assign(0,0,1,1);
 add(new statictext(t,"FONT NAME:"));

 draw();

 run();
 }

void FontApp::draw(void){
 int x,y;

 App::draw();
 for(y=0;y<5;y++){
  cxline(77,16+y*9,293,8);
  }
 for(x=0;x<25;x++){
  cyline(77+x*9,16,52,8);
  }
 frame(77,16,86,25,12);
 showall();
 }

void FontApp::orig(int which){
 unsigned int  offset;
 unsigned char far *rompattern,y,bit;

 which+=33;
 rompattern=(unsigned char far *) 0xf0000000;
 offset=0xfa6e+(which*8);  /* 0xf000 fa6e  is where the ROM patterns start.*/
 for(y=0;y<8;y++) {thefont[which-33][y]=*(rompattern+offset+y);} /*End y  */
 }

char FontApp::evhandle(Event& ev){
 char done=1;
 int val;
 int dx,dy;
 bytegrid tempgrid;
 char fname[64];

 tempgrid(8,8);

 if(App::evhandle(ev)){return 1;}
 if(ev.kind==evCommand)
 switch(ev.command){
  case cmClear: fontgrid->clear(0);fontgrid->draw();
                putevent(cmFontUpdate);
                break;

  case cmSelectChar: val=(ev.info.m.x)+(ev.info.m.y*24);
      pack_matrix(fontgrid->get(),thefont[currentchar]);
      mouse.SetVisible(0);
      dx=77+(currentchar%24)*9;
      dy=16+(currentchar/24)*9;
      frame(dx,dy,dx+9,dy+9,8);
      currentchar=val;
      dx=77+(currentchar%24)*9;
      dy=16+(currentchar/24)*9;
      frame(dx,dy,dx+9,dy+9,12);
      mouse.SetVisible(1);
      unpack_matrix(tempgrid,thefont[currentchar]);
      fontgrid->set(tempgrid);
    break;

  case cmFontUpdate:
      draw_matrix(fontgrid->get(),78+(currentchar%24)*9,17+(currentchar/24)*9);
      dx=77+(currentchar%24)*9;
      dy=16+(currentchar/24)*9;
      frame(dx,dy,dx+9,dy+9,12);
      break;

  case cmToDefault:orig(currentchar);
		   unpack_matrix(tempgrid,thefont[currentchar]);
                   fontgrid->set(tempgrid);
                   putevent(cmFontUpdate);
                   break;

  case cmSaveForm:mouse.hide();
		  pack_matrix(fontgrid->get(),thefont[currentchar]);
		  frame(0,100,110,107,15);
		  Fonts.outs(2,102,"FILENAME:",15);
		  saveform(Fonts.inputs(36,102,27,15));
		  bar(0,100,110,107,0);
		  mouse.show();
		  break;

  case cmSaveBin:execdialog(getstring("Save Binary"),fname);
                 if(fname[0]!=0){
             	  pack_matrix(fontgrid->get(),thefont[currentchar]);
                  savebin(fname);
                  }
                 showall();
                 break;

  case cmLoadBin:execdialog(getstring("Load Binary"),fname);
                 if(fname[0]!=0){
                  loadbin(fname);
      	          unpack_matrix(tempgrid,thefont[currentchar]);
                  fontgrid->set(tempgrid);
                  }
                 showall();
                 break;

  }
  return done;
 }

void FontApp::showall(void){
 int index;
 bytegrid tempgrid;

 mouse.hide();
 tempgrid(8,8);
 for(index=0;index<94;index++){
  unpack_matrix(tempgrid,thefont[index]);
  draw_matrix(tempgrid,78+(index%24)*9,17+(index/24)*9);
  }
 mouse.show();
 }

FontApp _FontApp;

main(){}