#include <stdio.h>
#include <exec/types.h>
#include <exec/ports.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <graphics/rastport.h>
#include <devices/inputevent.h>

#define FILENAMELEN 35

#define LADENTXT "Load charset (ESC to abort)"
#define LADENLEN strlen(LADENTXT)
#define EXTENSIONTXT ".cs"
#define EXTENSIONLEN strlen(EXTENSIONTXT)
#define PATTXT "*.cs"
#define DEFAULTNAME "Font"
#define MAXFILES 200
#define L_WINDOW_BREITE 300

#define BYTES_PER_COL 3
#define MAX_M 42
#define DSTR "%02d"
#define XSTR "%02x"

#define GRID_XM 280
#define GRID_YO 51
#define NUMCHARS 256
#define XMAX 37
#define TLEN 64
#define TTABX 64
#define TTABY 20

#define GBASE 52
#define GRID_SIZE_X 10
#define GRID_SIZE_Y  6
#define GADGET_DRAFT 3
#define GADGET_LQ 4
#define GADGET_SUPER 5
#define GADGET_SUB 6
#define GADGET_ELITE 7
#define GADGET_PICA 8
#define GADGET_CONDENSED 9
#define GADGET_SEMICONDENSED 10
#define GADGET_PROPORTIONAL 11
#define GADGET_FIX 12
#define BORDERS (GADGET_FIX+1)

#define GADGET_LOAD 13
#define GADGET_SAVE 14
#define GADGET_DWNLD 15
#define GADGET_TEST 16
#define GADGET_CLEAR 17
#define GADGET_ALIGN 18
#define GADGET_GLOBAL 19
#define GADGET_MARK 20

#define GADGET_L_LEFTBORDER 21
#define GADGET_R_LEFTBORDER 22
#define GADGET_L_RIGHTBORDER 23
#define GADGET_R_RIGHTBORDER 24
#define GADGET_GREATER 25
#define GADGET_SMALLER 26
#define GADGET_FORWARD 27
#define GADGET_BACK 28
#define GADGET_SHIFTLEFT 29
#define GADGET_SHIFTRIGHT 30
#define GADGET_SAVENAME 31

#define SIZEX 46
#define SIZEY 12

#define P_SUPER "\033S0"
#define P_SUB "\033S1"
#define P_LQ "\033x1"
#define P_DRAFT "\033x0"
#define P_PROP "\033p1"
#define P_FIX "\033p0"
#define P_PICA "\033P"
#define P_ELITE "\033M"
#define P_SEMICOND "\033g"
#define P_COND "\017"

struct Message *GetMsg();
struct IOStdReq *CreateStdIO();
struct MsgPort *CreatePort();
char *malloc(),*scdir();
void *OpenLibrary(),ReplyMsg();
void CloseLibrary(),CloseWindow();

struct Device *ConsoleDevice;
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
struct Window *myWindowPtr,*OpenWindow();
struct RastPort *myRastPort;

struct printer_para {
 int m1max,mmax;
	int y;
} *myppara=0;

struct my_para {
	int m0,m1,m2;
};

struct printer_para para[]= {
 {9,12,24},
	{29,36,24},
	{23,30,24},
	{15,24,24},
	{37,42,24},
	{7,12,16},
	{23,36,16},
	{23,42,16}
};

enum {e_draft,e_lq} draft=e_lq;
enum {e_normal,e_sub,e_super} subsuper=e_normal;
enum	{e_noelpi,e_elite,e_pica} elpi=e_pica;
enum	{e_prop,e_fix} fix=e_fix;
enum	{e_nocond,e_cond,e_semicond} cond=e_nocond;

int cnum='A';

struct my_para temppara,mypara[NUMCHARS];
unsigned char tempbuf[BYTES_PER_COL][XMAX];
unsigned char charbuf[NUMCHARS][BYTES_PER_COL][XMAX];
char marked[NUMCHARS];

int gridxi,gridyi,gridxa,gridya;
FILE *par;
struct IntuiMessage *myMsg;
unsigned long class;
unsigned short code,qual;
short mx,my,id;
char buffer[10];
void *intui_adr;

long opened;

SHORT BorderVectors[] = {0,0,0,SIZEY+1,SIZEX+1,SIZEY+1,SIZEX+1,0,0,0};
struct Border Border = { -1,-1, 2,0,JAM1, 5, BorderVectors, NULL };
struct Border border_array[BORDERS];

USHORT ImageData_SR[]={
 0xf00c,0x0000, 0x3c0f,0x0000, 0x0f03,0xc000, 0x03c0,0xf000,
	0x00f0,0x3c00, 0x003c,0x0f00, 0x003c,0x0f00, 0x00f0,0x3c00,
	0x03c0,0xf000, 0x0f03,0xc000, 0x3c0f,0x0000, 0xf00c,0x0000,
};

USHORT ImageData_SL[]={
 0x0030,0x0f00, 0x00f0,0x3c00, 0x03c0,0xf000, 0x0f03,0xc000,
	0x3c0f,0x0000, 0xf03c,0x0000, 0xf03c,0x0000, 0x3c0f,0x0000,
	0x0f03,0xc000, 0x03c0,0xf000, 0x00f0,0x3c00, 0x0030,0x0f00
};

USHORT ImageData_Pf2[]={
 0x0200,0x0040, 0x0600,0x0060, 0x0e00,0x0070, 0x1ffe,0x7ff8,
 0x3ffc,0x3ffc, 0x7ff8,0x1ffe, 0x7ff8,0x1ffe, 0x3ffc,0x3ffc,
 0x1ffe,0x7ff8, 0x0e00,0x0070, 0x0600,0x0060, 0x0200,0x0040
};

USHORT ImageData_Pf1[]={
 0x0080,0x0100, 0x00c0,0x0300, 0x00e0,0x0700, 0xfff0,0x0fff,
 0x7ff8,0x1ffe, 0x3ffc,0x3ffc, 0x3ffc,0x3ffc, 0x7ff8,0x1ffe,
 0xfff0,0x0fff, 0x00e0,0x0700, 0x00c0,0x0300, 0x0080,0x0100
};

USHORT ImageData_L[]={
 0x0010,0x0000, 0x0070,0x0000, 0x01f0,0x0000, 0x07ff,0xffff,
 0x1fff,0xfffc, 0x7fff,0xfff0, 0x7fff,0xfff0, 0x1fff,0xfffc,
 0x07ff,0xffff, 0x01f0,0x0000, 0x0070,0x0000, 0x0010,0x0000
};

USHORT ImageData_R[]={
 0x0000,0x0800, 0x0000,0x0e00, 0x0000,0x0f80, 0xffff,0xffe0,
 0x3fff,0xfff8, 0x0fff,0xfffe, 0x0fff,0xfffe, 0x3fff,0xfff8,
 0xffff,0xffe0, 0x0000,0x0f80, 0x0000,0x0e00, 0x0000,0x0800
};

struct Image Image_SR={0,0,32,12,1,ImageData_SR,1,0,0};
struct Image Image_SL={0,0,32,12,1,ImageData_SL,1,0,0};
struct Image Image_S={0,0,32,12,1,ImageData_Pf1,1,0,0};
struct Image Image_G={0,0,32,12,1,ImageData_Pf2,1,0,0};
struct Image Image_L={0,0,32,12,1,ImageData_L,1,0,0};
struct Image Image_R={0,0,32,12,1,ImageData_R,1,0,0};

struct IntuiText IText_Proportional={1,0,JAM1,8,2,0,(UBYTE*)"Prop",0};
struct IntuiText IText_SemiCondensed={1,0,JAM1,4,2,0,(UBYTE*)"SmCnd",0};
struct IntuiText IText_Condensed={1,0,JAM1,8,2,0,(UBYTE*)"Cond",0};
struct IntuiText IText_Elite={1,0,JAM1,4,2,0,(UBYTE*)"Elite",0};
struct IntuiText IText_Pica={1,0,JAM1,8,2,0,(UBYTE*)"Pica",0};
struct IntuiText IText_Sub={1,0,JAM1,12,2,0,(UBYTE*)"Sub",0};
struct IntuiText IText_Super={1,0,JAM1,3,2,0,(UBYTE*)"Super",0};
struct IntuiText IText_LQ={1,0,JAM1,16,2,0,(UBYTE*)"LQ",0};
struct IntuiText IText_Draft={1,0,JAM1,4,2,0,(UBYTE*)"Draft",0};
struct IntuiText IText_Fix={1,0,JAM1,12,2,0,(UBYTE*)"Fix",0};
struct IntuiText IText_Load={1,0,JAM1,8,2,0,(UBYTE*)"Load",0};
struct IntuiText IText_Save={1,0,JAM1,8,2,0,(UBYTE*)"Save",0};
struct IntuiText IText_DownLoad={1,0,JAM1,4,2,0,(UBYTE*)"DwnLd",0};
struct IntuiText IText_Test={1,0,JAM1,8,2,0,(UBYTE*)"Test",0};
struct IntuiText IText_Clear={1,0,JAM1,4,2,0,(UBYTE*)"Clear",0};
struct IntuiText IText_Align={1,0,JAM1,4,2,0,(UBYTE*)"Align",0};
struct IntuiText IText_Global={1,0,JAM1,4,2,0,(UBYTE*)"Globl",0};
struct IntuiText IText_Mark={1,0,JAM1,8,2,0,(UBYTE*)"Mark",0};
struct IntuiText IText_FileName={2,1,JAM2,5,5,0,(UBYTE*)"Filename:",0};

char filename[FILENAMELEN];

struct Requester textrequest;

struct StringInfo SInfo_Save={filename,NULL,0,30,0,0,0,0,0,0,NULL,0};

struct Gadget Gadget_SaveName= {
 NULL,
 5,20,
 96,12,
 GADGHCOMP,
 RELVERIFY|ENDGADGET,
 REQGADGET|STRGADGET,
 NULL,
 NULL,
 NULL,
 0,
 (APTR)&SInfo_Save,
 GADGET_SAVENAME,
 NULL
};

struct Gadget Gadget_ShiftRight= {
 NULL,
 582,GBASE+120,
 24,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_SR,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_SHIFTRIGHT,
 NULL
};

struct Gadget Gadget_ShiftLeft= {
 &Gadget_ShiftRight,
 500,GBASE+120,
 24,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_SL,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_SHIFTLEFT,
 NULL
};

struct Gadget Gadget_Forward= {
 &Gadget_ShiftLeft,
 574,GBASE+100,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_R,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_FORWARD,
 NULL
};

struct Gadget Gadget_Back= {
 &Gadget_Forward,
 500,GBASE+100,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_L,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_BACK,
 NULL
};

struct Gadget Gadget_Smaller= {
 &Gadget_Back,
 264,GBASE+172,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_S,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_SMALLER,
 NULL
};

struct Gadget Gadget_Greater= {
 &Gadget_Smaller,
 264,GBASE+148,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_G,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_GREATER,
 NULL
};

struct Gadget Gadget_R_Rightborder = {
 &Gadget_Greater,
 394,GBASE+160,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_R,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_R_RIGHTBORDER,
 NULL
};

struct Gadget Gadget_L_Rightborder = {
 &Gadget_R_Rightborder,
 336,GBASE+160,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_L,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_L_RIGHTBORDER,
 NULL
};

struct Gadget Gadget_R_Leftborder = {
 &Gadget_L_Rightborder,
 192,GBASE+160,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_R,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_R_LEFTBORDER,
 NULL
};

struct Gadget Gadget_L_Leftborder = {
 &Gadget_R_Leftborder,
 134,GBASE+160,
 32,12,
 GADGIMAGE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Image_L,
 NULL,
 NULL,
 0,
 NULL,
 GADGET_L_LEFTBORDER,
 NULL
};

struct Gadget Gadget_Mark= {
 &Gadget_L_Leftborder,
 10,GBASE+140,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Mark,
 0,
 NULL,
 GADGET_MARK,
 NULL
};

struct Gadget Gadget_Global= {
 &Gadget_Mark,
 10,GBASE+120,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Global,
 0,
 NULL,
 GADGET_GLOBAL,
 NULL
};

struct Gadget Gadget_Align= {
 &Gadget_Global,
 10,GBASE+100,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Align,
 0,
 NULL,
 GADGET_ALIGN,
 NULL
};

struct Gadget Gadget_Clear= {
 &Gadget_Align,
 10,GBASE+80,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Clear,
 0,
 NULL,
 GADGET_CLEAR,
 NULL
};

struct Gadget Gadget_Test = {
 &Gadget_Clear,
 10,GBASE+60,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Test,
 0,
 NULL,
 GADGET_TEST,
 NULL
};

struct Gadget Gadget_DownLoad = {
 &Gadget_Test,
 10,GBASE+40,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_DownLoad,
 0,
 NULL,
 GADGET_DWNLD,
 NULL
};

struct Gadget Gadget_Save = {
 &Gadget_DownLoad,
 10,GBASE+20,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Save,
 0,
 NULL,
 GADGET_SAVE,
 NULL
};

struct Gadget Gadget_Load = {
 &Gadget_Save,
 10,GBASE+0,
 SIZEX,SIZEY,
 GADGHCOMP,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&Border,
 NULL,
 &IText_Load,
 0,
 NULL,
 GADGET_LOAD,
 NULL
};

struct Gadget Gadget_Fix= {
 &Gadget_Load,
 560,GBASE+80,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_FIX]),
 NULL,
 &IText_Fix,
 0,
 NULL,
 GADGET_FIX,
 NULL
};

struct Gadget Gadget_Proportional= {
 &Gadget_Fix,
 500,GBASE+80,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_PROPORTIONAL]),
 NULL,
 &IText_Proportional,
 0,
 NULL,
 GADGET_PROPORTIONAL,
 NULL
};

struct Gadget Gadget_SemiCondensed= {
 &Gadget_Proportional,
 560,GBASE+60,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_SEMICONDENSED]),
 NULL,
 &IText_SemiCondensed,
 0,
 NULL,
 GADGET_SEMICONDENSED,
 NULL
};

struct Gadget Gadget_Condensed = {
 &Gadget_SemiCondensed,
 500,GBASE+60,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_CONDENSED]),
 NULL,
 &IText_Condensed,
 0,
 NULL,
 GADGET_CONDENSED,
 NULL
};

struct Gadget Gadget_Elite = {
 &Gadget_Condensed,
 560,GBASE+40,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_ELITE]),
 NULL,
 &IText_Elite,
 0,
 NULL,
 GADGET_ELITE,
 NULL
};

struct Gadget Gadget_Pica = {
 &Gadget_Elite,
 500,GBASE+40,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_PICA]),
 NULL,
 &IText_Pica,
 0,
 NULL,
 GADGET_PICA,
 NULL
};

struct Gadget Gadget_Sub = {
 &Gadget_Pica,
 500,GBASE+0,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_SUB]),
 NULL,
 &IText_Sub,
 0,
 NULL,
 GADGET_SUB,
 NULL
};

struct Gadget Gadget_Super = {
 &Gadget_Sub,
 560,GBASE+0,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_SUPER]),
 NULL,
 &IText_Super,
 0,
 NULL,
 GADGET_SUPER,
 NULL
};

struct Gadget Gadget_LQ = {
 &Gadget_Super,
 500,GBASE+20,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_LQ]),
 NULL,
 &IText_LQ,
 0,
 NULL,
 GADGET_LQ,
 NULL
};

struct Gadget Gadget_Draft = {
 &Gadget_LQ,
 560,GBASE+20,
 SIZEX,SIZEY,
 GADGHNONE,
 RELVERIFY,
 BOOLGADGET,
 (APTR)&(border_array[GADGET_DRAFT]),
 NULL,
 &IText_Draft,
 0,
 NULL,
 GADGET_DRAFT,
 NULL
};

struct NewWindow myNewWindow= {
 0,11,
 640,245,
 0,1,
 MOUSEMOVE|GADGETUP|CLOSEWINDOW|RAWKEY|MOUSEBUTTONS,
 WINDOWDEPTH|WINDOWCLOSE|ACTIVATE|REPORTMOUSE|RMBTRAP,
 &Gadget_Draft,
 NULL,
 (UBYTE*)"DPA Star LC24 CharacterDesigner",
	NULL,
 NULL,
 0,0,
 0,0,
 WBENCHSCREEN
};

