home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fonts 1 / freshfonts1.bin / programs / amiga / pastex / src / specialhost / special.c < prev    next >
C/C++ Source or Header  |  1991-06-07  |  4KB  |  197 lines

  1. /* special.c */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <exec/types.h>
  7. #include <exec/exec.h>
  8. #include <exec/ports.h>
  9. #include <intuition/intuition.h>
  10.  
  11. #include "globals.h"
  12. #include "special.h"
  13. #include "bitmap.h"
  14.  
  15. #include "globals.i"
  16. #include "amscreen.i"
  17.  
  18. #ifdef LATTICE
  19. #  include <proto/exec.h>
  20. #endif
  21.  
  22.  
  23. extern long  hh;                        /* current h on device */
  24. extern long  vv;                        /* current v on device */
  25. extern struct bitmap map;
  26. extern long upper_limit;
  27. extern long lower_limit;
  28.  
  29.  
  30. static struct MsgPort *special_port, *reply_port;
  31. static struct special_msg message;
  32. static struct driver_map dmap;
  33.  
  34.  
  35.  
  36. static int  open_port(void);
  37. static void setup_dmap(struct driver_map *dmap);
  38.  
  39.  
  40.  
  41. struct special_map *send_special(char *sp_string)
  42. {
  43.   struct special_msg *reply_msg;
  44.  
  45.   if (open_port()) {    /* Fehler? */
  46.     return NULL;
  47.   }
  48.  
  49.   setup_dmap(&dmap);
  50.  
  51.   message.msg.mn_Node.ln_Type    = NT_MESSAGE;
  52.   message.msg.mn_ReplyPort    = reply_port;
  53.   message.msg.mn_Length        = sizeof(message);
  54.   message.action        = AC_SEND_SPECIAL;
  55.   message.ret            = 0;
  56.   message.special_string    = sp_string;
  57.   message.hresolution        = hconvresolution;
  58.   message.vresolution        = vconvresolution;
  59.   message.bmap            = NULL;
  60.   message.tpic            = NULL;
  61.   message.dmap            = &dmap;
  62.   
  63.   Message("wait for picture...");
  64.  
  65.   PutMsg(special_port,&(message.msg));
  66.   WaitPort(reply_port);
  67.   reply_msg = (struct special_msg *)GetMsg(reply_port);
  68.   if (reply_msg->action != AC_REPLY_SPECIAL) {
  69.     Warning("I have expected AC_REPLY_SPECIAL, I found %d!",reply_msg->action);
  70.     return NULL;
  71.   }
  72.   if (reply_msg->ret != 0) {
  73.     Warning("Return from \"special\" program: %d!",reply_msg->ret);
  74.   }
  75.  
  76.   return reply_msg->bmap;
  77. }
  78.  
  79.  
  80. void send_tpic(struct tpic_msg *tp)
  81. {
  82.   struct special_msg *reply_msg;
  83.  
  84.   if (open_port()) {    /* Fehler? */
  85.     return;
  86.   }
  87.  
  88.   setup_dmap(&dmap);
  89.  
  90.   message.msg.mn_Node.ln_Type    = NT_MESSAGE;
  91.   message.msg.mn_ReplyPort    = reply_port;
  92.   message.msg.mn_Length        = sizeof(message);
  93.   message.action        = AC_SEND_TPIC;
  94.   message.ret            = 0;
  95.   message.special_string    = NULL;
  96.   message.hresolution        = hconvresolution;
  97.   message.vresolution        = vconvresolution;
  98.   message.bmap            = NULL;
  99.   message.tpic            = tp;
  100.   message.dmap            = &dmap;
  101.   
  102.   PutMsg(special_port,&(message.msg));
  103.   WaitPort(reply_port);
  104.   reply_msg = (struct special_msg *)GetMsg(reply_port);
  105.   if (reply_msg->action != AC_REPLY_TPIC) {
  106.     Warning("I expected AC_REPLY_TPIC, I found %d!",reply_msg->action);
  107.     return;
  108.   }
  109.   if (reply_msg->ret != 0) {
  110.     Warning("Return from \"special\" program: %d!",reply_msg->ret);
  111.   }
  112.  
  113.   DeletePort(reply_port);
  114.  
  115.   special_port = NULL;
  116.   reply_port   = NULL;
  117. }
  118.  
  119.  
  120. void special_ok(void)
  121. {
  122.   struct special_msg *reply_msg;
  123.  
  124.   if (special_port == NULL || reply_port == NULL) {
  125.     special_port = NULL;
  126.     reply_port = NULL;
  127.     return;
  128.   }
  129.  
  130.   setup_dmap(&dmap);
  131.  
  132.   message.msg.mn_Node.ln_Type    = NT_MESSAGE;
  133.   message.msg.mn_ReplyPort    = reply_port;
  134.   message.action        = AC_OK_BITMAP;
  135.   message.ret            = 0;
  136.   message.tpic            = NULL;
  137.   message.dmap            = &dmap;
  138.   message.special_string    = NULL;
  139.   message.hresolution        = hconvresolution;
  140.   message.vresolution        = vconvresolution;
  141.  
  142.   PutMsg(special_port,&(message.msg));
  143.   
  144.   WaitPort(reply_port);
  145.   reply_msg = (struct special_msg *)GetMsg(reply_port);
  146.   if (reply_msg->action != AC_REPLY_BITMAP) {
  147.     Warning("I expected AC_REPLY_BITMAP, I found %d!",reply_msg->action);
  148.   }
  149.   else {
  150.     if (reply_msg->ret != 0) {
  151.       Warning("Return from \"special\" program: %d!",reply_msg->ret);
  152.     }
  153.   }
  154.  
  155.   DeletePort(reply_port);
  156.  
  157.   special_port = NULL;
  158.   reply_port   = NULL;
  159.   
  160.   Message("picture received");
  161. }
  162.  
  163.  
  164.  
  165. static int open_port(void)
  166. {
  167.   special_port = NULL;
  168.   reply_port   = NULL;
  169.  
  170.   special_port = FindPort(SPECIAL_PORT);
  171.   if (special_port == NULL) {
  172.     /* no special port */
  173.     Warning("Found no \"special\" program!");
  174.     return TRUE;
  175.   }
  176.  
  177.   reply_port = CreatePort(SPECIAL_REPLY,0L);
  178.   if (reply_port == NULL) {
  179.     /* no reply port */
  180.     Warning("Can't create \"special\" reply-port!");
  181.     return TRUE;
  182.   }
  183.   return FALSE;        /* kein Fehler */
  184. }
  185.  
  186.  
  187. static void setup_dmap(struct driver_map *dmap)
  188. {
  189.   dmap->x         = hh + (long)hoffset;
  190.   dmap->y         = vv + (long)voffset;
  191.   dmap->width         = map.width;
  192.   dmap->height         = map.height;
  193.   dmap->lower_limit     = lower_limit;
  194.   dmap->upper_limit     = upper_limit;
  195.   dmap->pixptr         = map.pixptr;
  196. }
  197.