home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / shareware / share_40 / read / !Read / c / Read < prev    next >
Text File  |  1990-09-06  |  11KB  |  400 lines

  1. /* Read IconBar handler
  2.    Tue,28 Aug 1990
  3.    Copyright C.T.Stretch 1990
  4. */
  5.  
  6. #include "readhdr.h"
  7. #include "wkey.h"
  8.  
  9. #define UD read_ud()
  10.  
  11. int sw,sh,scw=22*32,sch=3200,lineoff;
  12. int gx0,gy0,gx1,gy1,gxn=40,gyn=98;
  13. int ch,cw,pw,qw,dw;
  14. int spacebar,pixfact,wtfact,refact,befact,queryat;
  15. int weight[CHARS],redge[CHARS],bedge[CHARS];
  16. int cweight[CHARS],credge[CHARS],cbedge[CHARS],counts[CHARS];
  17. int box[XMAX+1];
  18. int disp,top,base;
  19. int row,col;
  20. BOOL learning=FALSE,skip;
  21. int state=NOFONT,sprmem=0;
  22. char *textarea,*countarea;
  23. unsigned int *store,*fontarea;
  24. sprite_area *area;
  25. sprite_id scanspr={{0},sprite_id_addr};
  26. menu barmenu,immenu,smenu,pmenu;
  27. wimp_w image;
  28. wimp_icon scanicon;
  29. wimp_caretstr nocaret={0,-1,0,0,1<<25,0};
  30. dbox db;
  31. char icbuf[12]="font";
  32. int ino;
  33. char sfname[FNLEN+1],tfname[FNLEN+1],cfname[FNLEN+1],pfname[FNLEN+1];
  34. char sfact[6]="0";
  35. int xef,yef;
  36. int rdfnt=0x666;
  37. int dpci=4;
  38.  
  39. static void barclick(wimp_i i)
  40. {
  41.   i=i;
  42. }
  43.  
  44. void read_fred()
  45. { wimp_redrawstr r;
  46.   r.w=image;
  47.   wimpt_noerr(wimp_get_wind_state(image,(wimp_wstate*)&r));
  48.   r.box.x1+=r.scx-r.box.x0;
  49.   r.box.y0+=r.scy-r.box.y1;
  50.   r.box.x0=r.scx;
  51.   r.box.y1=r.scy;
  52.   wimpt_noerr(wimp_force_redraw(&r));
  53. }
  54.  
  55. static void openup(int x,int y)
  56. { wimp_wstate state;
  57.   wimpt_noerr(wimp_get_wind_state(image,&state));
  58.   state.o.y+=y<<yef;state.o.x+=x<<xef;
  59.   wimpt_noerr(wimp_open_wind(&state.o));
  60. }
  61.  
  62. static void saveit(char c)
  63. { switch(c)
  64.   { case 1:saveas(SPRITE,sfname,0,spr_save,0,0,0);break;
  65.     case 2:saveas(TEXT ,tfname,0,text_save,0,0,0);break;
  66.     case 3:saveas(rdfnt,pfname,0,fnt_save,0,0,0);break;
  67.     case 4:saveas(rdfnt,cfname,0,fnt_save,0,0,(void*)1);break;
  68.   }
  69. }
  70.  
  71.  
  72. void read_set(int s)
  73. { int n,moff=2;
  74.   static char *sn[]={"","font","box","halt"};
  75.   for(n=3;n<8;n++) menu_setflags(immenu,n,0,0);
  76.   if(s!=state)
  77.   { if(s>state)
  78.     { if(state==NOFONT&&s>NOFONT) fnt_new();
  79.       if(state==NOBOX&&s>NOBOX) text_new();
  80.       if(s==HALT) state=HALT;
  81.       if(state>NOBOX&&s>HALT) { event_setmask(MASK1);state=s;}
  82.     }
  83.     else
  84.     { if(state>HALT&&s<LEARN) event_setmask(MASK0);
  85.       if(state>NOBOX&&s<=NOBOX) text_lose();
  86.       if(state>NOFONT&&s<=NOFONT) fnt_lose();
  87.       state=s;
  88.     }
  89.     read_fred();
  90.   }
  91.   if(state>HALT) moff=1;
  92.   if(state!=HALT) menu_setflags(immenu,state+moff,1,0);
  93.   if(state<=HALT)
  94.   { strcpy(icbuf,sn[state]);
  95.     wimpt_noerr(wimp_set_icon_state((wimp_w)-1,ino,0,0));
  96.   }
  97. }
  98.  
  99. static void immenuproc(void *wh,char *h)
  100. { wh=wh;
  101.   switch(h[0])
  102.   { case 1:proc_size();break;
  103.     case 2:if(h[2]) saveit(h[1]);break;
  104.     case 3:read_set(NOFONT);break;
  105.     case 4:read_set(NOBOX);break;
  106.     case 5:read_set((state==LEARN)?HALT:LEARN);break;
  107.     case 6:read_set((state==READ)?HALT:READ);break;
  108.     case 7:read_set((state==NONSTOP)?HALT:NONSTOP);break;
  109.     case 8:proc_proc(h);read_fred();break;
  110.     case 9:proc_adjust();break;
  111.   }
  112. }
  113.  
  114. static void barmenuproc(void *wh,char *h)
  115. { dbox d;
  116.   wh=wh;
  117.   switch (h[0])
  118.   { case 1:d=dbox_new("Info");
  119.            if(d)
  120.            { dbox_setfield(d,4,"0.0, "__DATE__);
  121.              dbox_show(d);dbox_fillin(d);
  122.              dbox_dispose(&d);
  123.            }
  124.            break;
  125.     case 2:spr_scan();
  126.            break;
  127.     case 3:scan_size();break;
  128.     case 4:exit(0);
  129.   }
  130. }
  131.  
  132. static void resize(int x,int y)
  133. { int n,dx,dy;
  134.   wimp_setcolour(11+3*16);
  135.   dx=(gx1-gx0)<<xef;
  136.   dy=(gy1-gy0)<<yef;
  137.   for(n=0;n<=gyn;n++)
  138.   { bbc_move(x,y+(n*dy)/gyn);
  139.     bbc_drawby(dx,0);
  140.   }
  141.   for(n=0;n<=gxn;n++)
  142.   { bbc_move(x+(n*dx)/gxn,y);
  143.     bbc_drawby(0,dy);
  144.   }
  145. }
  146.  
  147. static void rebox(int x,int y)
  148. { int n,dx,dy;
  149.   wimp_setcolour(10+3*16);
  150.   dx=box[gxn]<<xef;
  151.   dy=(ch*gyn)<<yef;
  152.   for(n=0;n<=gyn;n++)
  153.   { bbc_move(x,y-(ch*n<<yef));
  154.     bbc_drawby(dx,0);
  155.   }
  156.   for(n=0;n<=gxn;n++)
  157.   { bbc_move(x+(box[n]<<xef),y);
  158.     bbc_drawby(0,-dy);
  159.   }
  160. }
  161.  
  162. static void rechar(int x,int y)
  163. { wimp_setcolour(15+3*16);
  164.   bbc_move(x,y+(base<<yef));bbc_drawby(sw<<xef,0);
  165.   bbc_move(x,y+(top<<yef));bbc_drawby(sw<<xef,0);
  166.   bbc_move(x+((disp+box[col])<<xef),y+(base<<yef));
  167.   bbc_drawby(0,(top-base)<<yef);
  168.   bbc_move(x+((disp+box[col+1])<<xef),y+(base<<yef));
  169.   bbc_drawby(0,(top-base)<<yef);
  170. }
  171.  
  172. static void redraw(wimp_redrawstr *r)
  173. { BOOL more;
  174.   int cy,bx,by,x,y;
  175.   r->w=image;
  176.   wimpt_noerr(wimp_redraw_wind(r,&more));
  177.   bx=r->box.x0-r->scx;x=bx+(gx0<<xef);
  178.   by=r->box.y1-r->scy;y=by+(gy0<<yef);cy=by+(gy1<<yef);
  179.   while(more)
  180.   { wimpt_complain(wimp_ploticon(&scanicon));
  181.     switch(state)
  182.     { case NOFONT:resize(x,y);break;
  183.       case NOBOX :rebox(x,cy);break;
  184.       default    :rechar(bx,by);
  185.     }
  186.     wimp_get_rectangle(r,&more);
  187.   }
  188. }
  189.  
  190. void read_ud()
  191. { BOOL more;
  192.   int cy,bx,by,x,y;
  193.   wimp_redrawstr r[1];
  194.   r->box.x0=0;r->box.x1=sw<<xef;
  195.   r->box.y0=0;r->box.y1=sh<<yef;
  196.   r->w=image;
  197.   wimpt_noerr(wimp_update_wind(r,&more));
  198.   bx=r->box.x0-r->scx;x=bx+(gx0<<xef);
  199.   by=r->box.y1-r->scy;y=by+(gy0<<yef);cy=by+(gy1<<yef);
  200.   while(more)
  201.   { switch(state)
  202.     { case NOFONT:resize(x,y);break;
  203.       case NOBOX :rebox(x,cy);break;
  204.       default    :rechar(bx,by);
  205.     }
  206.     wimp_get_rectangle(r,&more);
  207.   }
  208. }
  209.  
  210. static void mouse(wimp_mousestr *m)
  211. { int mx,my;
  212.   wimp_wstate st;
  213.   wimpt_noerr(wimp_get_wind_state(image,&st));
  214.   wimpt_noerr(wimp_set_caret_pos(&nocaret));
  215.   if(state>NOBOX) return;
  216.   UD;
  217.   mx=(m->x-st.o.box.x0+st.o.x)>>xef;
  218.   my=(m->y-st.o.box.y1+st.o.y)>>yef;
  219.   switch(m->bbits)
  220.   { case wimp_BLEFT:if((mx<gx1&&my>gy0)||state==NOBOX) { gx0=mx;gy1=my;}
  221.                     break;
  222.     case wimp_BRIGHT:if(state==NOBOX)break;
  223.                      if(mx>gx0&&my<gy1) { gx1=mx;gy0=my;}
  224.                      break;
  225.   }
  226.   UD;
  227. }
  228.  
  229. static void keysize(int c)
  230. { switch(c)
  231.   { case wkey_LEFT:if(gx0>0){UD;gx0--;UD;}break;
  232.     case wkey_RIGHT:if(gx0<gx1+1){UD;gx0++;UD;}break;
  233.     case wkey_UP:if(gy1<sh-1){UD;gy1++;UD;}break;
  234.     case wkey_DOWN:if(gy1>gy0+1){UD;gy1--;UD;}break;
  235.     case wkey_SLEFT:if(gx1>gx0+1){UD;gx1--;UD;}break;
  236.     case wkey_SRIGHT:if(gx1<sw-1){UD;gx1++;UD;}break;
  237.     case wkey_SUP:if(gy0<gy1-1){UD;gy0++;UD;}break;
  238.     case wkey_SDOWN:if(gy0>0){UD;gy0--;UD;}break;
  239.     default:wimpt_noerr(wimp_processkey(c));return;
  240.   }
  241. }
  242.  
  243. static void keybox(int c)
  244. { switch(c)
  245.   { case wkey_LEFT:if(gx0>0){UD;gx0--;UD;}break;
  246.     case wkey_RIGHT:if(gx0<sw-1){UD;gx0++;UD;}break;
  247.     case wkey_UP:if(gy1<sh-1){UD;gy1++;UD;}break;
  248.     case wkey_DOWN:if(gy1>0){UD;gy1--;UD;}break;
  249.     default:wimpt_noerr(wimp_processkey(c));return;
  250.   }
  251. }
  252.  
  253. static void key(int c)
  254. { switch(c)
  255.   { case wkey_CLEFT:openup(-sw,0);break;
  256.     case wkey_CRIGHT:openup(sw,0);break;
  257.     case wkey_CUP:openup(0,sh);break;
  258.     case wkey_CDOWN:openup(0,-sh);break;
  259.     default:switch(state)
  260.             { case NOFONT:keysize(c);break;
  261.               case NOBOX:keybox(c);break;
  262.               default:wimpt_noerr(wimp_processkey(c));return;
  263.             }
  264.   }
  265. }
  266.  
  267. static menu makebarmenu(void *n)
  268. { n=n;
  269.   menu_setflags(barmenu,2,0,!scan_check());
  270.   return barmenu;
  271. }
  272.  
  273. static BOOL barhand(wimp_eventstr *e,void *v)
  274. { char *fn;
  275.   int ftype;
  276.   v=v;
  277.   switch(e->e)
  278.   { case wimp_ESEND:case wimp_ESENDWANTACK:
  279.     switch(e->data.msg.hdr.action)
  280.     { case wimp_MDATALOAD:ftype=xferrecv_checkinsert(&fn);
  281.                           switch(ftype)
  282.                           { case SPRITE:spr_load(fn);break;
  283.                             case TEXT:if(sprmem) text_load(fn);break;
  284.                             default:if(ftype==rdfnt) fnt_load(fn);break;
  285.                           }
  286.                           break;
  287.       case wimp_MMODECHANGE:spr_mode();break;
  288.     }
  289.     break;
  290.   }
  291.   return FALSE;
  292. }
  293.  
  294. static void handler(wimp_eventstr *e,void *w)
  295. { w=w;
  296.   switch(e->e)
  297.   { case wimp_ENULL:locate_read();break;
  298.     case wimp_EREDRAW:redraw((wimp_redrawstr*)&(e->data.o));break;
  299.     case wimp_EOPEN:wimpt_noerr(wimp_open_wind(&(e->data.o)));break;
  300.     case wimp_EKEY:key(e->data.key.chcode);break;
  301.     case wimp_EBUT:mouse(&(e->data.but.m));break;
  302.     case wimp_ECLOSE:spr_lose();break;
  303.     case wimp_ESEND:case wimp_ESENDWANTACK:barhand(e,w);break;
  304.   }
  305. }
  306.  
  307. static void mybaricon(void)
  308. { int bno;
  309.   wimp_icreate cr[1];
  310.   bno=baricon("!Read",1,barclick);
  311.   wimpt_noerr(wimp_delete_icon((wimp_w)-1,bno));
  312.   cr->w=(wimp_w)-1;
  313.   cr->i.box.x0=0;cr->i.box.x1=68;
  314.   cr->i.box.y0=-16;cr->i.box.y1=84;
  315.   cr->i.flags=wimp_ISPRITE|wimp_INDIRECT|(wimp_IBTYPE*wimp_BCLICKDEBOUNCE);
  316.   cr->i.flags|=wimp_ITEXT|(wimp_IFORECOL*7)|wimp_IFILLED|wimp_IHCENTRE;
  317.   cr->i.flags|=wimp_IBACKCOL;
  318.   cr->i.data.indirecttext.buffer=icbuf;
  319.   cr->i.data.indirecttext.validstring="S!read";
  320.   cr->i.data.indirecttext.bufflen=12;
  321.   wimpt_noerr(wimp_create_icon(cr,&ino));
  322.   wimpt_noerr(wimp_set_icon_state((wimp_w)-1,ino,0,0));
  323.   if(bno!=ino) werr(0,"Icon shift! old %d new %d",bno,ino);
  324. }
  325.  
  326. static char *init(void)
  327. { wimp_wind *b;
  328.   wimpt_init("Read");
  329.   res_init("Read");
  330.   template_init();
  331.   dbox_init();
  332.   flex_init();
  333.   flex_alloc((flex_ptr)&area,0);
  334.   flex_alloc((flex_ptr)&fontarea,0);
  335.   flex_alloc((flex_ptr)&countarea,0);
  336.   flex_alloc((flex_ptr)&textarea,0);
  337.   if(!textarea) return "No memory";
  338.   db=dbox_new("char");
  339.   if(!db) return "char box";
  340.   barmenu=menu_new("Read",">Info,Scan,>Size,Quit");
  341.   if(!barmenu) return "barmenu";
  342.   mybaricon();
  343.   if(!event_attachmenumaker(win_ICONBAR,makebarmenu,barmenuproc,0))
  344.      return "barmenu proc";
  345.   win_register_event_handler(win_ICONBARLOAD,(win_event_handler)barhand,0);
  346.   b=template_syshandle("image");
  347.   if(!b) return "templates";
  348.   b->title.indirecttext.buffer=sfname;
  349.   b->title.indirecttext.bufflen=FNLEN+1;
  350.   if(wimp_create_wind(b,&image)) return "window";
  351.   win_register_event_handler(image,handler,0);
  352.   win_add_unknown_event_processor(barhand,0);
  353.   wimp_corrupt_fp_state_on_poll();
  354.   spr_mode();
  355.   win_claim_idle_events(image);
  356.   immenu=menu_new(
  357.    "Read",">Grid,Save,!New Font,New Box,Learn,Read,NonStop,Process,>Adjust");
  358.    smenu=menu_new("Save","~>Sprite,~>Text,~>Pixels,~>Counts");
  359.    menu_submenu(immenu,2,smenu);
  360.    pmenu=menu_new("Process","Invert|Rotate|Shear,sf,!Whole,Part");
  361.    menu_make_writeable(pmenu,4,sfact,6,"a0-9\\-");
  362.    menu_submenu(immenu,8,pmenu);
  363.   if(!immenu) return "menu";
  364.   if(!event_attachmenu(image,immenu,immenuproc,0)) return "menu proc";
  365.   nocaret.w=image;
  366.   scanicon.box.x0=0;scanicon.box.y0=0;
  367.   scanicon.flags=wimp_ISPRITE|wimp_INDIRECT;
  368.   scanicon.data.indirectsprite.nameisname=FALSE;
  369.   return 0;
  370. }
  371.  
  372. static BOOL param(char *p)
  373. { int *pad;
  374.   if(p[0]!='-') return FALSE;
  375.   switch(p[1])
  376.   { case 'f':pad=&rdfnt;break;
  377.     case 'w':pad=&scw;break;
  378.     case 'h':pad=&sch;break;
  379.     case 'x':pad=&gxn;break;
  380.     case 'y':pad=&gyn;break;
  381.     case 'p':pad=&dpci;break;
  382.     default:return FALSE;
  383.   }
  384.   *pad=atoi(p+2);
  385.   return TRUE;
  386. }
  387.  
  388. int main(int n,char **p)
  389. { char *s;
  390.   int i;
  391.   for(i=1;i<n;i++) if(!param(p[i])){ printf("Bad parameters");return 0;}
  392.   s=init();
  393.   if(s)
  394.   { werr(0,"Failed to initialise %s",s);
  395.     return 0;
  396.   }
  397.   for(;;) event_process();
  398.   return 0;
  399. }
  400.