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

  1. /* specialhost.c */
  2.  
  3.   /**************************************************************/
  4.   /*                                */
  5.   /* Bitte alle Aenderungen im Programm deutlich        */
  6.   /* markieren und mir zusenden. Ich werde dann         */
  7.   /* versuchen immer eine einheitliche Version          */
  8.   /* zusammenzubasteln.                     */
  9.   /*    30.07.90        (c) Georg Hessmann        */
  10.   /*                                */
  11.   /* Bug's und Anregungen bitte an:                */
  12.   /*             hessmann@unipas.fmi.uni-passau.de      */
  13.   /* oder an:                            */
  14.   /*                Georg Hessmann          */
  15.   /*                Oberer Markt 7          */
  16.   /*                8712 Volkach            */
  17.   /*                Germany             */
  18.   /*                                */
  19.   /*                                */
  20.   /* Program zur Auswertung der special Strings von TeX     */
  21.   /* wird von "ShowDVI" und "DVIprint" verwendet.        */
  22.   /* Das Programm muss im Hintergrund laufen noch bevor     */
  23.   /* die anderen Programme gestartet werden.            */
  24.   /* Die ist nur ein Beispiel, das die Arbeitsweise        */
  25.   /* dokumentieren soll.                    */
  26.   /*                                */
  27.   /* Das bisherige Format des special Kommandos:        */
  28.   /*    \special{ifffile=name                    */
  29.   /*         hoffset=fxx                    */
  30.   /*         voffset=fxx                    */
  31.   /*         hsize=fxx                    */
  32.   /*         vsize=fxx }                    */
  33.   /* wobei f eine real-Zahl ist und xx eine Einheit wie     */
  34.   /* in den anderen Programmen definiert.            */
  35.   /*                                */
  36.   /* Das Programm benoetigt die "iff.library"!          */
  37.   /*                                */
  38.   /* Version:                            */
  39.   /*                                */
  40.   /* -- 0.70    30.07.90    (hes) Georg Hessmann        */
  41.   /* -- 0.71    16.11.90    Verbesserungen von 'flextr.c'    */
  42.   /*                (MiL) Michael Illgner         */
  43.   /* -- 0.80    23.01.91    Verarbeitung von Farben!    */
  44.   /*                (MiL) Michael Illgner        */
  45.   /* -- 0.81    04.04.91    Neue Skalierungsroutinen,       */
  46.   /*                `flextr.c' jetzt überflüssig    */
  47.   /*                Olaf `Olsen' Barthel        */
  48.   /* -- 0.86    17.04.91        `flextr.c' wieder drin :)    */
  49.   /*                (hes)                */
  50.   /* -- 0.90    30.05.91        Einbau von Pull-Down Menues    */
  51.   /*                Einbau eines Config-Files    */
  52.   /*                Auswahl Blitter on/off        */
  53.   /*                Groessenbegrenzung bei Blitter    */
  54.   /*                Invert-Routine            */
  55.   /*                (hes)                */
  56.   /* -- 0.91    05.07.91    Zwei 'enforcer' hits behoben.    */
  57.   /*                GADGIMAGE-Gadgets eingefuehrt.    */
  58.   /*                PubScreen Support eingefuehrt.    */
  59.   /*                (hes)                */
  60.   /* -- 0.92    10.07.91    Kleine Probleme im Zusammenspiel*/
  61.   /*                Gadgets-Menues behoben.        */
  62.   /*                (hes)                */
  63.   /* -- 0.93    11.07.91    Probleme im TPIC Teil behoben.    */
  64.   /*                Dazu werden nun float Zahlen als*/
  65.   /*                Strings uebergeben, damit es    */
  66.   /*                keine Probleme FFP - IEEE gibt.    */
  67.   /*                Enforcer Hit in pline beseitigt.*/
  68.   /*                CTRL-E veranlasst SpecialHost    */    
  69.   /*                dazu, vom PubScr zu verschwinden*/
  70.   /*                (hes)                */
  71.   /* -- 0.94    30.07.91    Kleiner Bug in work_w_message    */
  72.   /*                behoben.            */
  73.   /*                (hes)                */
  74.   /*                                */
  75.   /**************************************************************/
  76.  
  77. static char ver[] = "$VER: SpecialHost "VERSION"  Copyright © 1990/91 Georg Heßmann. All Right Reserved. (last compiled: "__DATE__", "__TIME__")";
  78.  
  79.  
  80. #define DOSNAMESIZE    150
  81.  
  82. #ifndef ZERO
  83. #  define ZERO      0L
  84. #endif
  85.  
  86. #ifdef LATTICE
  87. long    _stack      = 5120;
  88. char *  _procname    = "SpecialHost";
  89. long    _priority    = 0;
  90. long    _BackGroundIO    = 1;
  91. extern  BPTR    _Backstdout;
  92. #endif
  93.  
  94. /* global variable */
  95. static struct special_map spmap;
  96. static char        bitfilename[DOSNAMESIZE];
  97.  
  98.  
  99. struct MsgPort      *special_port    = NULL;
  100. IFFFILE         ifffile     = NULL;
  101. struct BitMap        *bmap        = NULL;
  102. short            use_blitter    = TRUE;
  103. short            invert_bmap    = FALSE;
  104. short            is_os2        = FALSE;
  105. short            ECS_chips    = FALSE;
  106.  
  107. UBYTE            IFFColors[64];
  108. UBYTE            HAMColors[16][16][16];
  109. WORD            ColorTab[64];
  110.  
  111. extern struct Library        *IFFBase;        /* defined in specialwin.c */
  112. extern struct GfxBase        *GfxBase;
  113. extern struct IntuitionBase    *IntuitionBase;
  114.  
  115.  
  116.  
  117. static char    *TPICstr[] = {
  118.     "no command",
  119.     "PN", "PA", "FP", "IP", "DA", "DT", "SP", "SP", 
  120.     "AR", "IA", "SH", "SH", "SW", "BK", "TX", "overflow"
  121.   };
  122.  
  123.  
  124.  
  125. /* local funktions */
  126. static        void    free_bmap        (struct BitMap **bmap);
  127. static          int    MyCompareDates        (struct DateStamp *date1,
  128.                          struct DateStamp *date2);
  129. static        int    test_date        (char *iffile, char *bitfile, long *ssum);
  130. static        void    write_bmap        (char *name,
  131.                          struct BitMap *bmap,
  132.                          long ssum,
  133.                          long width, long height);
  134. static        int    get_iff_size        (char *name,
  135.                          long *width,
  136.                          long *height);
  137. static struct BitMap   *load_iff_picture    (struct parse_result *res,
  138.                          long *width,
  139.                          long *height,
  140.                          short to_chip);
  141. static struct BitMap   *work_with_message    (struct special_msg *message,
  142.                          int draw_modus, int base_dpi);
  143. static        int    scale_bmap        (struct special_map *map,
  144.                          struct BitMap **old_bmap,
  145.                          struct parse_result *res,
  146.                          int base_dpi,
  147.                          short to_chip);
  148.  
  149.  
  150.  
  151.  
  152. void close_port_bitm(void)
  153. {
  154.   if (special_port != NULL) {
  155.     DeletePort(special_port);
  156.   }
  157.   free_bmap(&bmap);
  158. }
  159.  
  160. static void free_bmap(struct BitMap **bmap)
  161. {
  162.  int i;
  163.  struct BitMap *map = (*bmap);
  164.  
  165.  if (map != NULL)
  166.  {
  167.   for (i=0; i<map->Depth; i++)
  168.   {
  169.    if (map->Planes[i] != NULL)
  170.    {
  171.     FreeMem(map->Planes[i],map->BytesPerRow*map->Rows);
  172.     map->Planes[i] = NULL;
  173.    }
  174.   }
  175.   free(map);
  176.   *bmap = NULL;
  177.  }
  178. }
  179.  
  180.  
  181. static int MyCompareDates(struct DateStamp *date1, struct DateStamp *date2)
  182. {
  183.   int ret = 1;
  184.  
  185.   if (memcmp(date1,date2,sizeof(struct DateStamp)) == 0) {
  186.     ret = 0;
  187.   }
  188.   else {
  189.     if (date1->ds_Days > date2->ds_Days) {
  190.       ret = -1;
  191.     }
  192.     else {
  193.       if (date1->ds_Days == date2->ds_Days) {
  194.         if (date1->ds_Minute > date2->ds_Minute) {
  195.       ret = -1;
  196.         }
  197.         else {
  198.       if (date1->ds_Minute == date2->ds_Minute && date1->ds_Tick > date2->ds_Tick) {
  199.         ret = -1;
  200.       }
  201.     }
  202.       }
  203.     }
  204.   }
  205.   return ret;
  206. }
  207.  
  208.  
  209.  
  210. static int test_date(char *iffile, char *bitfile, long *ssum)
  211. {
  212.   struct FileLock *lock_iff, *lock_bit;
  213.   struct FileInfoBlock *fib_iff, *fib_bit;
  214.   int ret = FALSE;
  215.   FILE *file;
  216.   long buffer;
  217.  
  218.   fib_iff  = (struct FileInfoBlock *)malloc((unsigned)sizeof(struct FileInfoBlock));
  219.   fib_bit  = (struct FileInfoBlock *)malloc((unsigned)sizeof(struct FileInfoBlock));
  220.   lock_iff = (struct FileLock *)Lock(iffile, ACCESS_READ);
  221.   lock_bit = (struct FileLock *)Lock(bitfile, ACCESS_READ);
  222.  
  223.   if (fib_iff != NULL && fib_iff != NULL && lock_iff != NULL && lock_bit != NULL) {
  224.     if (Examine((BPTR)lock_iff,fib_iff)!=0 && Examine((BPTR)lock_iff,fib_iff)!=0) {
  225.       ret = (MyCompareDates(&(fib_bit->fib_Date), &(fib_iff->fib_Date)) > 0);
  226.     }
  227.   }
  228.  
  229.   if (lock_iff) UnLock((BPTR)lock_iff);
  230.   if (lock_bit) UnLock((BPTR)lock_bit);
  231.   if (fib_iff) free(fib_iff);
  232.   if (fib_bit) free(fib_bit);
  233.  
  234.   if (ret) {
  235.     if ((file = fopen(bitfile,"r")) != NULL) {
  236.       if (fread((char *)&buffer,4,1,file) == 1) {
  237.     if (buffer != MAGIC_WORD) {
  238.       ret = FALSE;
  239.       pline("  wrong magic word in file %s!",bitfile);
  240.     }
  241.     else {
  242.       if (fread((char *)&buffer,4,1,file) != 1) {
  243.         ret = FALSE;
  244.       }
  245.       else {
  246.         *ssum = buffer;
  247.       }
  248.     }
  249.       }
  250.       fclose(file);
  251.     }
  252.   }
  253.  
  254.   return ret;
  255. }
  256.  
  257.  
  258. static void write_bmap(char *name, struct BitMap *bmap, long ssum, long width, long height)
  259. {
  260.   FILE *bmap_file;
  261.   long buffer;
  262.   int i;
  263.  
  264.   /* File Format: 4Bytes - magic word "SPEC"            */
  265.   /*          4Bytes - sum of \special-string        */
  266.   /*          4Bytes - length of rows in bits        */
  267.   /*          4Bytes - number of rows            */
  268.   /*          rows                      */
  269.   /*            length of one row is word (16Bit) aligned!! */
  270.  
  271.   if ((bmap_file = fopen(name,"w")) == NULL) {
  272.     pline("Can't write to bitmap-file (%s)!",name);
  273.     return;
  274.   }
  275.   buffer = (long)MAGIC_WORD;
  276.   fwrite((char *)&buffer,4,1,bmap_file);
  277.   buffer = ssum;
  278.   fwrite((char *)&buffer,4,1,bmap_file);
  279.   buffer = width;
  280.   fwrite((char *)&buffer,4,1,bmap_file);
  281.   buffer = height;
  282.   fwrite((char *)&buffer,4,1,bmap_file);
  283.   for (i=0; i<bmap->Rows; i++) {
  284.     fwrite(bmap->Planes[0]+(i*bmap->BytesPerRow),1,bmap->BytesPerRow,bmap_file);
  285.   }
  286.   fclose(bmap_file);
  287. }
  288.  
  289. static int get_iff_size(char *name, long *width, long *height)
  290. {
  291.   struct BitMapHeader *bmhd;
  292.  
  293.   if (IFFBase == NULL) {
  294.     if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION))) {
  295.     pline("Copy the iff.library (Ver: %ld) to your LIBS: directory!",IFFVERSION);
  296.     return FALSE;
  297.     }
  298.   }
  299.  
  300.   if(!(ifffile=OpenIFF(name))) {
  301.     pline("Error opening iff-file \"%s\"!",name);
  302.     return FALSE;
  303.   }
  304.  
  305.   if(!(bm