home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 110 / EnigmaAmiga110CD.iso / indispensabili / utility / apdf / xpdf-0.80 / xpdf / apdfppcserv.cc < prev    next >
C/C++ Source or Header  |  1999-06-24  |  7KB  |  261 lines

  1. //========================================================================
  2. //
  3. // Apdfppc.cc
  4. //
  5. // Copyright 1999 Emmanuel Lesueur
  6. //
  7. //========================================================================
  8.  
  9. //#define DEBUGMSG
  10.  
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <exec/nodes.h>
  15. #include <exec/memory.h>
  16. #include <powerup/ppcproto/exec.h>
  17. #include <powerup/ppclib/message.h>
  18. #include <powerup/ppclib/tasks.h>
  19. #include <powerup/gcclib/powerup_protos.h>
  20. #include "AComm.h"
  21. #include "AGfxcomm.h"
  22.  
  23. int init(int,const char*);
  24. void quit();
  25. int get_info(int* num_pages);
  26. int get_page_size(int page,int* width,int* height);
  27. int create_doc(BPTR,const char* filename,size_t,size_t);
  28. int create_output_dev(int depth,struct ColorMap* colormap);
  29. void delete_output_dev(void);
  30. int simple_find(const char* str,int top,int* xmin,int* ymin,int* xmax,int* ymax);
  31. int init_find(const char*);
  32. int find(int start,int stop,int* xmin,int* ymin,int* xmax,int* ymax,int* page);
  33. void end_find();
  34. int chklink(int x,int y,void** action,char* str,size_t len);
  35. int dolink(int* x,int* y,int* state,int* page,char* buf,size_t len);
  36. int init_write(const char* filename,int first_page,int last_page,int zoom,int rotate,int type);
  37. void writefile(int first_page,int last_page);
  38. void end_write();
  39. char* gettext(int,int,int,int);
  40. int show_page(int,int);
  41. void add_fontmap(const char*,const char*,int,int,int);
  42. /*void rem_fontmap(const char*);*/
  43. void clear_fontmap();
  44. /*void set_fontmap();*/
  45. int init_scan();
  46. int scan_fonts(int,int);
  47. int scan_default_fonts();
  48. void end_scan_fonts();
  49. int get_font(int,char*,int,char*,int,int*,int*,int*);
  50.  
  51. bool quitting=false;
  52.  
  53. void* port68k;
  54. void* portppc;
  55. void* reply_port;
  56. void* syncmsg;
  57. void* ports_list;
  58.  
  59. void cleanup() {
  60.     if(syncmsg)
  61.     PPCDeleteMessage(syncmsg);
  62.  
  63.     if(ports_list)
  64.     PPCDeletePortList(ports_list);
  65.  
  66.     if(reply_port)
  67.     PPCDeletePort(reply_port);
  68. }
  69.  
  70. int main() {
  71.  
  72.     StartupData* sd=(StartupData*)PPCGetTaskAttr(PPCTASKTAG_STARTUP_MSGDATA);
  73.     port68k=sd->port;
  74.     portppc=(void*)PPCGetTaskAttr(PPCTASKTAG_MSGPORT);
  75.  
  76.     atexit(&cleanup);
  77.  
  78.     if(sd->id!=VMAGIC) {
  79.     printf("The PPC module does not match the 68k executable.\n");
  80.     exit(EXIT_FAILURE);
  81.     }
  82.     if(!init(sd->colors,sd->gzipcmd))
  83.     exit(EXIT_FAILURE);
  84.  
  85.     reply_port=PPCCreatePort(NULL);
  86.  
  87.     void* ports[3];
  88.     ports[0]=portppc;
  89.     ports[1]=reply_port;
  90.     ports[2]=NULL;
  91.     ports_list=PPCCreatePortList(ports,0);
  92.  
  93.     if(reply_port && ports_list)
  94.     syncmsg=PPCCreateMessage(reply_port,0);
  95.  
  96.     if(reply_port && syncmsg && ports_list) {
  97.  
  98.     PPCSendMessage(port68k,syncmsg,(APTR)VMAGIC,0,MSGID_SYNC);
  99.     PPCWaitPort(reply_port);
  100.     PPCGetMessage(reply_port);
  101.  
  102.     bool running=true;
  103.     while(running) {
  104.  
  105.         PPCWaitPortList(ports_list);
  106.  
  107.         while(void* msg=PPCGetMessage(reply_port))
  108.         PPCDeleteMessage(msg);
  109.  
  110.         while(void* msg=PPCGetMessage(portppc)) {
  111.         ULONG id=PPCGetMessageAttr(msg,PPCMSGTAG_MSGID);
  112.         switch(id) {
  113.           case MSGID_QUIT:
  114.             //quit();
  115.             running=false;
  116.             break;
  117.           case MSGID_CREATEDOC: {
  118.             msg_createdoc* m=(msg_createdoc*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  119.             m->base.success=create_doc(m->dir,m->filename,m->cachesz,m->blocsz);
  120.             break;
  121.           }
  122. #if 0
  123.           case MSGID_DELETEDOC:
  124.             delete_doc();
  125.             break;
  126. #endif
  127.           case MSGID_INFO: {
  128.             msg_info* m=(msg_info*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  129.             m->base.success=get_info(&m->num_pages);
  130.             break;
  131.           }
  132.           case MSGID_PAGESIZE: {
  133.             msg_pagesize* m=(msg_pagesize*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  134.             m->base.success=get_page_size(m->page,&m->width,&m->height);
  135.             break;
  136.           }
  137.           case MSGID_CREATEOUTPUTDEV: {
  138.             msg_create_output_dev* m=(msg_create_output_dev*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  139.             m->base.success=create_output_dev(m->depth,m->colormap);
  140.             break;
  141.           }
  142.           case MSGID_DELETEOUTPUTDEV:
  143.             delete_output_dev();
  144.             break;
  145.  
  146.           case MSGID_PAGE: {
  147.             msg_page* m=(msg_page*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  148.             m->base.success=show_page(m->page_num,m->zoom);
  149.             break;
  150.           }
  151.           case MSGID_CHKLINK: {
  152.             msg_chklink* m=(msg_chklink*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  153.             m->base.success=chklink(m->x,m->y,&m->action,m->str,sizeof(m->str));
  154.             break;
  155.           }
  156.           case MSGID_DOLINK: {
  157.             msg_dolink* m=(msg_dolink*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  158.             m->base.success=dolink(&m->x,&m->y,&m->state,&m->page,m->str,sizeof(m->str));
  159.             break;
  160.           }
  161.           case MSGID_SIMPLEFIND: {
  162.             msg_find* m=(msg_find*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  163.             m->base.success=simple_find(m->str,m->top,&m->xmin,&m->ymin,&m->xmax,&m->ymax);
  164.             break;
  165.           }
  166.           case MSGID_INITFIND: {
  167.             msg_find* m=(msg_find*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  168.             m->base.success=init_find(m->str);
  169.             break;
  170.           }
  171.           case MSGID_FIND: {
  172.             msg_find* m=(msg_find*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  173.             m->base.success=find(m->top,m->bottom,&m->xmin,&m->ymin,&m->xmax,&m->ymax,&m->page);
  174.             break;
  175.           }
  176.           case MSGID_ENDFIND:
  177.             end_find();
  178.             break;
  179.           case MSGID_INITWRITE: {
  180.             msg_write* m=(msg_write*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  181.             m->base.success=init_write(m->filename,m->first_page,m->last_page,m->zoom,m->rotate,m->type);
  182.             break;
  183.           }
  184.           case MSGID_WRITE: {
  185.             msg_write* m=(msg_write*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  186.             writefile(m->first_page,m->last_page);
  187.             break;
  188.           }
  189.           case MSGID_ENDWRITE:
  190.             end_write();
  191.             break;
  192.           case MSGID_GETTEXT: {
  193.             msg_gettext* m=(msg_gettext*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  194.             char* p=gettext(m->xmin,m->ymin,m->xmax,m->ymax);
  195.             if(m->base.success=p!=NULL) {
  196.             m->size=strlen(p);
  197.             PPCReplyMessage(msg);
  198.             PPCWaitPort(portppc);
  199.             msg=PPCGetMessage(portppc);
  200.             size_t sz=PPCGetMessageAttr(msg,PPCMSGTAG_DATALENGTH);
  201.             char* q=(char*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  202.             strncpy(q,p,sz-1);
  203.             q[sz-1]='\0';
  204.             free(p);
  205.             }
  206.             break;
  207.           }
  208.           case MSGID_ADDFONTMAP: {
  209.             msg_fontmap* m=(msg_fontmap*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  210.             add_fontmap(m->pdffont,m->afont,m->m,m->style,m->encoding);
  211.             break;
  212.           }
  213.           /*case MSGID_REMFONTMAP: {
  214.             msg_fontmap* m=(msg_fontmap*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  215.             rem_fontmap(m->pdffont);
  216.             break;
  217.           }*/
  218.           case MSGID_CLEARFONTMAP:
  219.             clear_fontmap();
  220.             break;
  221.  
  222.           /*case MSGID_SETFONTMAP:
  223.             set_fontmap();
  224.             break;*/
  225.  
  226.           case MSGID_INITSCAN: {
  227.             msg_scan_fonts* m=(msg_scan_fonts*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  228.             m->base.success=init_scan();
  229.             break;
  230.           }
  231.           case MSGID_SCANFONTS: {
  232.             msg_scan_fonts* m=(msg_scan_fonts*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  233.             m->base.success=scan_fonts(m->first_page,m->last_page);
  234.             break;
  235.           }
  236.  
  237.           case MSGID_DEFAULTFONTS: {
  238.             msg_scan_fonts* m=(msg_scan_fonts*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  239.             m->base.success=scan_default_fonts();
  240.             break;
  241.           }
  242.  
  243.           case MSGID_ENDSCANFONTS:
  244.             end_scan_fonts();
  245.             break;
  246.  
  247.           case MSGID_GETFONT: {
  248.             msg_fontmap* m=(msg_fontmap*)PPCGetMessageAttr(msg,PPCMSGTAG_DATA);
  249.             m->base.success=get_font(m->m,m->pdffont,sizeof(m->pdffont),m->afont,sizeof(m->afont),&m->m,&m->style,&m->encoding);
  250.             break;
  251.           }
  252.  
  253.         }
  254.         PPCReplyMessage(msg);
  255.         }
  256.     }
  257.     }
  258.  
  259. }
  260.  
  261.