home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / util / bitmap.c < prev    next >
C/C++ Source or Header  |  1994-04-15  |  16KB  |  764 lines

  1. /*
  2. **    This file generated by localize 2.9 (AmigaDOS 2.1) from util/bitmap.c
  3. */
  4. /** bitmap.c **/
  5.  
  6. #include "defines.h"
  7. #include <stdio.h>
  8.  
  9. #include "globals.h"
  10.  
  11. #define NEW_SAVE_IFF_METHOD 1
  12.  
  13. #ifdef ANSI
  14. #  include <stdlib.h>
  15. #  include <string.h>
  16. #  include <stddef.h>
  17. #endif
  18.  
  19. #include "bitmap.h"
  20.  
  21. #include "globals.i"
  22.  
  23. #ifdef ATARI
  24. #  include "dvihand.i"
  25. #  include "atscreen.i"
  26. #endif
  27.  
  28. #ifdef DISPLAY
  29. #  ifdef AMIGA
  30. #    include "amscreen.i"
  31. #  endif
  32. #  include "sbitmap.i"
  33. #else
  34. #  include "prhelp.h"
  35. #  ifdef AMIGA
  36. #    include <clib/exec_protos.h>
  37. #    include <pragmas/exec_pragmas.h>
  38. #    include <graphics/gfx.h>
  39. #    include <graphics/view.h>
  40. #    if !defined(NEW_SAVE_IFF_METHOD)
  41. #     include "iff.h"
  42. #    endif
  43. #    include "amprint.i"
  44. #  endif
  45. #  include "newhard.i"
  46. #  include "bitmap.i"
  47. #  include "prhelp.i"
  48. #endif
  49.  
  50. #define MAX(a,b)    (((a) > (b)) ? (a) : (b))
  51. #define MIN(a,b)    (((a) < (b)) ? (a) : (b))
  52.  
  53.  
  54.  
  55. /*
  56.  * Fuer die locale-Library:
  57.  *
  58.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  59.  * Achtung:
  60.  * Es muss/sollte 'multiple-include' erlaubt sein!
  61.  */
  62. #include "local.i"
  63.  
  64. #undef  CATCOMP_ARRAY
  65. #undef  CATCOMP_BLOCK
  66. #undef  CATCOMP_STRINGS
  67. #define CATCOMP_NUMBERS
  68. #include "localstr.h"
  69.  
  70.  
  71.  
  72.  
  73. struct bitmap map;
  74. int PassNo;
  75. long upper_limit;
  76. long lower_limit;
  77. int word_width;
  78. int Pass;        // gibt es in dviprint.c noch *lokal*. Global wird es in special.c gebraucht.
  79. long map_length;
  80.  
  81. #ifdef AMIGA
  82. #  ifdef DISPLAY
  83. #    define NO_GETMEM
  84. #  endif
  85. #endif
  86.  
  87. /** #if !defined(AMIGA) | !defined(DISPLAY) **/
  88.  
  89. #ifndef NO_GETMEM
  90.  
  91. static void GetMemory        Args((int max_length,
  92.                                  int max_width,
  93.                                  long **mem_begin,
  94.                                  int *mem_length,
  95.                               int *divisor));
  96.  
  97.  
  98. #ifndef DISPLAY
  99.   extern short print_width;    /* => DOTS * PASSPERLINE        */
  100.   extern short full_page_in_ram;    /* must the whole page-bitmap into ram?    */
  101.   extern long landscape;        /* print in landscape modus?        */
  102.   extern long iffprint;        /* print to iff-file            */
  103.  
  104.   extern long CurrentPage;    /* the current page number        */
  105.  
  106.   /* wird fuer das IFF-Speichern benoetigt: */
  107.   static UWORD           bw_ctable[2] = { 0x0FFF, 0x0000 };
  108. # if defined(NEW_SAVE_IFF_METHOD)
  109. #  include "iff/ilbmapp.h"
  110.    static struct ILBMInfo ilbm;
  111. # endif
  112. #endif
  113.  
  114.  
  115. static void GetMemory (int max_length, int max_width, long **mem_begin, 
  116.             int *mem_length, int *divisor)
  117. {
  118. #ifndef DISPLAY
  119.   int h;
  120.   unsigned long mem;
  121. #endif
  122.  
  123.   *divisor = 1;
  124.  
  125.   *mem_length = max_length;
  126.   *mem_begin = NULL;
  127.  
  128. #ifndef DISPLAY
  129.   if (
  130. #    ifdef ATARI
  131.       ((Printer->pp_flags & PF_PRINTER) != SLM804) &&
  132. #    endif
  133.       !full_page_in_ram) {
  134.  
  135.     mem = (unsigned long)(*mem_length) * (unsigned long)max_width;    /* memory in bytes */
  136.  
  137.     if (maxbitmapsize != 0L && mem > maxbitmapsize)
  138.      {
  139.       *divisor = (int)((int)(mem / (unsigned long)maxbitmapsize)+1);
  140.      }
  141.  
  142.     while ( *mem_begin == NULL && *mem_length != print_width )
  143.      {
  144.       h =  (max_length / (*divisor)++);
  145.       *mem_length =  h - (h % print_width) + print_width;
  146.       *mem_length = MAX(print_width, *mem_length) ;
  147.  
  148. #endif /* !DISPLAY */
  149.  
  150.       /* hier kein xmalloc, da NULL als Ret. moeglich sein muss! */
  151.       *mem_begin = (long *)malloc((size_t)((size_t)(*mem_length) * (size_t)max_width));
  152.  
  153. #ifndef DISPLAY
  154.      }
  155.  
  156.     (*divisor)--;
  157.   }
  158.   else {
  159.     /* hier kein xmalloc, da NULL als Ret. moeglich sein muss! */
  160.     *mem_begin = (long *)malloc((size_t)((size_t)(*mem_length) * (size_t)max_width));
  161.   }
  162. #endif
  163.  
  164.   if (*mem_begin == NULL)
  165.    {
  166. #ifndef DISPLAY
  167.     if (full_page_in_ram)
  168.      {
  169.       Warning(MSG_DVIP_WHOLE_BITMAP_IN_RAM);
  170.      }
  171. #endif
  172.     Fatal(9, MSG_CANT_ALLOC_BITMAP);    /* special Returncode!!!! */
  173.    }
  174.  
  175. #ifdef DEBUG
  176.   if (DeBug) {
  177.     WarningStr("Allocated %ld bytes for bitmap", (unsigned long)(*mem_length) * (unsigned long)max_width);
  178.   }
  179. #endif
  180. }
  181.  
  182. #endif  /* (NO_GETMEM) !defined(AMIGA) | !defined(DISPLAY) */
  183.  
  184.  
  185. void ClearBitmap(void)
  186. {
  187. #ifdef AMIGA
  188. # ifdef DISPLAY
  189.    clear_bild();
  190. # else
  191.    memset((char *)map.pixptr,(int)0,(unsigned)(map.height*(map.width>>3)));
  192. # endif
  193. #else
  194.   clrbm ((void *)map.pixptr, (int)map.width, (int)map.height);
  195. #endif
  196. }
  197.  
  198.  
  199.  
  200.  
  201. int InitBitmap(int pix_length, int pix_width)
  202. {
  203.   int map_width;
  204.   long *bitmap_ptr;
  205.   int bitmap_length;
  206. #ifdef ATARI
  207. # ifdef DISPLAY
  208.    int flag = 0;
  209. # endif
  210. #endif
  211. #ifdef AMIGA
  212. # ifdef DISPLAY
  213.    AddXpixel = 0;    /* das wird sonst erst nach dem ersten Gebrauch von SAVETY_BITS_X gesetzt! */
  214. # endif
  215. #endif
  216.  
  217.   /* SAVETY_BITS: Sicherheitsrand gegen "Overfull hbox" */
  218.  
  219.   // Das ist etwas hacky, da SAVETY_BITS_X als (hconvresolution+AddXpixel) definiert ist!
  220.   // Daher muss AddXpixel vorher unbedingt auf 0 gesetzt werden.
  221.   // Danach entspricht SAVETY_BITS_X dem Sicherheitsabstand plus dem Rundungsfaktor!!
  222.  
  223.   word_width = (pix_width+SAVETY_BITS_X+31) / 32;        /* (hes) */
  224.   pix_length += SAVETY_BITS_Y; 
  225.   
  226. #ifdef DISPLAY
  227.   AddXpixel = word_width*32 - pix_width - SAVETY_BITS_X;
  228.   /* wieviele Pixel kommen auf Alignment-Gruende hinzu... */
  229. #endif
  230.  
  231.   map_width =  word_width * bytesperlong;
  232. #ifdef ATARI
  233. # ifdef DISPLAY
  234.    if (map.pixptr != NULL) 
  235.     {                    /* we are changing the dvi file */
  236.      xfree(map.pixptr);
  237.      flag = 1;
  238.     }
  239. # endif
  240.    GetMemory (pix_length, map_width, &bitmap_ptr, &bitmap_length, &PassNo);
  241. #endif        /* ATARI */
  242. #ifdef AMIGA
  243. # ifdef DISPLAY
  244.    bitmap_ptr = Init_all (pix_length, map_width);
  245.    bitmap_length = pix_length;
  246.    PassNo = 1;
  247. # else
  248.    if (map.pixptr != NULL) 
  249.     {                    /* we are changing the dvi file */
  250.      xfree(map.pixptr);
  251.      map.pixptr = NULL;
  252.     }
  253.    GetMemory (pix_length, map_width, &bitmap_ptr, &bitmap_length, &PassNo);
  254. # endif
  255. #endif
  256.  
  257.   map.pixptr = bitmap_ptr;
  258.   map.width = map_width * 8;
  259.   map.height = bitmap_length;
  260.  
  261. #ifdef ATARI
  262. # ifdef DISPLAY
  263.    if (flag != 1)
  264.     {
  265.      Init_all(&map);
  266.     }
  267.    else
  268.     {
  269.      Init_some(&map);
  270.     }
  271. # else
  272.    Init_all(&map);
  273. # endif
  274. #endif
  275.  
  276.   upper_limit = 0L;
  277.   lower_limit = (long) bitmap_length;
  278.   ClearBitmap();
  279.   Pass=1;
  280.   map_length = (long)pix_length;
  281.  
  282. #ifdef DEBUG
  283.  
  284.   if (DeBug)
  285.    {
  286.     Warning("Passes: %d, Mem-Length: %d, Mem-Width: %d (in Bytes)",
  287.             PassNo, bitmap_length, map_width);
  288.    }
  289.  
  290. #endif
  291.  
  292. #ifndef DISPLAY
  293.   if (Stats) {
  294.     Logging(MSG_DVIP_PARTS,PassNo);
  295.   }
  296. #endif
  297.  
  298.   return(PassNo);
  299. }
  300.  
  301. #ifdef ATARI
  302.  
  303. static int imgversion;
  304. static int headlength;
  305. static int nrplanes;
  306. static int patlen;
  307. static int pixelwidth;
  308. static int pixelheight;
  309. static int scpixwidth;
  310. static int sclinenr;
  311. static int scbytewidth;
  312.  
  313. static char *muster = NULL;
  314.  
  315. void ReadHeader(FILE *fp)
  316. {
  317.  int i;
  318.  
  319.  imgversion  = (int)NoSignExtend(fp, 2);
  320.  headlength  = (int)NoSignExtend(fp, 2);
  321.  nrplanes    = (int)NoSignExtend(fp, 2);
  322.  patlen      = (int)NoSignExtend(fp, 2);
  323.  pixelwidth  = (int)NoSignExtend(fp, 2);
  324.  pixelheight = (int)NoSignExtend(fp, 2);
  325.  scpixwidth  = (int)NoSignExtend(fp, 2);
  326.  sclinenr    = (int)NoSignExtend(fp, 2);
  327.  
  328.  if (headlength >8)
  329.   {
  330.    Warning("Headlength (%d) too long",headlength);
  331.    for (i=8; i<= headlength; i++)
  332.     {
  333.      fgetc(fp);
  334.     }
  335.   }
  336.  scbytewidth = (scpixwidth+7)/8;
  337.  if (muster != NULL)
  338.   { 
  339.    xfree(muster);
  340.   }
  341.  muster = (char *)xmalloc((size_t) (patlen+2));
  342.  if (muster == NULL)
  343.   {
  344.    Fatal(10, "Not enough memory for pattern");
  345.   }
  346. }
  347.  
  348. #ifdef DEBUG
  349. void PrintHeader(void)
  350. {
  351.  Warning("imgversion: %d",imgversion);
  352.  Warning("headlength: %d",headlength);
  353.  Warning("nrplanes: %d",nrplanes);
  354.  Warning("patlen: %d",patlen);
  355.  Warning("pixelwidth: %d",pixelwidth);
  356.  Warning("pixelheight: %d",pixelheight);
  357.  Warning("scpixwidth: %d",scpixwidth);
  358.  Warning("sclinenr: %d",sclinenr);
  359.  Warning("scbytewidth: %d",scbytewidth);
  360. }
  361. #endif
  362.  
  363. static int xmin, ymin;
  364. static int xmax, ymax;
  365. static char *imgptr;
  366. static int bmwidth;
  367.  
  368. void PutByte(int px, int py, char cont)
  369. {
  370.  if ((px < xmax) && (py <= ymax))
  371.   {
  372.    *(imgptr+((long)bmwidth*((long)py)+(long)px)) = cont;
  373.   }
  374. }
  375.  
  376. char GetByte(int gx, int gy)
  377. {
  378.  if ((gx < xmax) && (gy <= ymax))
  379.   { 
  380.    return(*(imgptr+((long)bmwidth*((long)gy)+(long)gx)));
  381.   }
  382.  else
  383.   {
  384.    return(0);
  385.   }
  386. }
  387.  
  388. void readimg(FILE *imgfile)
  389. {
  390.  int value;
  391.  int bytes;
  392.  int nrlines;
  393.  int rx, ry;
  394.  int i, k;
  395.  
  396.  rx = xmin;
  397.  ry = ymin;
  398.  bytes = 0;
  399.  nrlines=0;
  400.  
  401.  while ((ry <= sclinenr+ymin) && (ry<=ymax))
  402.   {
  403.    if (bytes >= scbytewidth)
  404.     {
  405.      ry++;
  406.      rx = xmin;
  407.      bytes = 0;
  408.      if (nrlines>0)
  409.       {
  410.        for (i=1; i<= scbytewidth; i++)
  411.         {
  412.          PutByte(rx,ry, GetByte( rx, ry-1));
  413.          rx++;
  414.          bytes++;
  415.         }
  416.        nrlines--;
  417.        continue;
  418.       }
  419.     }
  420.          
  421.    value = (int)NoSignExtend(imgfile, 1);
  422.    switch (value)
  423.     {
  424.      case 0x00:
  425.       value = (int)NoSignExtend(imgfile, 1);
  426.       switch (value)
  427.        {
  428.         case 0x00:
  429.          if ((int)NoSignExtend(imgfile, 1) == 0xff)
  430.           {
  431.            nrlines = NoSignExtend(imgfile, 1)-1;
  432.           }
  433.          rx = xmin;
  434.          bytes = 0;
  435.          break;
  436.         default:
  437.          bytes += value*patlen;
  438.          for (i=1; i<=patlen; i++)
  439.           {
  440.            *(muster+i) = (char)NoSignExtend(imgfile,1);
  441.           }
  442.          for (k=1; k<= value; k++)
  443.           {
  444.            for (i=1; i<= patlen; i++)
  445.             {
  446.              PutByte(rx,ry, *(muster+i));
  447.              rx++;
  448.             }
  449.           }
  450.          break;
  451.        }
  452.       break;
  453.      case 0x80:
  454.       value = (int)NoSignExtend(imgfile, 1);
  455.       bytes += value;
  456.       for (i=1; i<= value; i++)
  457.        {
  458.         PutByte(rx,ry,(char)NoSignExtend(imgfile,1));
  459.         rx++;
  460.        }
  461.       break;
  462.      default:
  463.       if (value & 128)
  464.        {
  465.         value -= 128;
  466.         for (i=1; i<=value; i++)
  467.          {
  468.           PutByte(rx,ry, 255);
  469.           rx++;
  470.          }
  471.         bytes += value;
  472.        }
  473.       else
  474.        {
  475.         for (i=1; i<=value; i++)
  476.          {
  477.           PutByte(rx,ry,0);
  478.           rx++;
  479.          }
  480.          bytes += value;
  481.        }
  482.       break;
  483.     }      
  484.   }
  485.    
  486. void PaintImage(char *pfilename, long xakt, long yakt, int maxwidth, int maxheight)
  487. {
  488.  FILE *imgfile;
  489.  int i;
  490.  char *pfn;
  491.  
  492.  pfn = pfilename;
  493.  if (pfn != NULL)
  494.   {
  495.    while (*pfn)
  496.     {
  497.      switch (*pfn)
  498.       {
  499.        case '/':
  500.         *pfn = '\\';
  501.         break;
  502.        case ';':
  503.         *pfn = ':';
  504.         break;
  505.       }
  506.      pfn++;
  507.     }
  508.   }
  509.  Warning( "IMG filename: %s",pfilename);
  510.  imgfile = fopen(pfilename,"rb");
  511.  if (imgfile == NULL)
  512.   {
  513.    Warning( "Can't open IMG file");
  514.    return;
  515.   }
  516.  ReadHeader(imgfile);
  517.  imgptr = (char *)map.pixptr;
  518.  bmwidth = ((int)map.width)/8;
  519.  xmin = (MIN((int)xakt, (int)map.width))/8;
  520.  if (maxwidth !=0)
  521.   {
  522.    xmax = MIN((xmin + maxwidth), ((int)map.width/8));
  523.   }
  524.  else
  525.   {
  526.    xmax = ((int)map.width)/8;
  527.   }
  528.  ymin = MIN((int)yakt, (int)map.height);
  529.  if (maxheight !=0)
  530.   {
  531.    ymax = MIN((ymin + maxheight), (int)map.height);
  532.   }
  533.  else
  534.   {
  535.    ymax = (int)map.height;
  536.   }
  537.  
  538. #ifdef DEBUG
  539.  if (DeBug)
  540.   {
  541.    PrintHeader();
  542.  
  543.    Warning( "xmax: %d ymax: %d",xmax, ymax);
  544.    Warning( "xmin: %d ymin: %d",xmin, ymin);
  545.    Warning( "bmwidth: %d map.width: %ld",bmwidth,map.width);
  546.    Warning( "map.pixptr: %ld map.height: %ld",map.pixptr, map.height);
  547.    Warning( "imgptr: %ld",imgptr);
  548.   }
  549. #endif
  550.  
  551.  readimg(imgfile);
  552.  if (muster != NULL)
  553.   { 
  554.    xfree(muster);
  555.   }
  556.  fclose(imgfile);
  557. }
  558. #endif
  559.  
  560. #ifdef SLOW
  561. void CopyBitArray (long x, long y, int w, int h, unsigned short *p)
  562.                        /* x,y upper left corner (pixels)           */
  563.                        /* w,h height / width of character (pixels) */
  564.                        /* p   pointer to bitmap */
  565. #ifndef ATARI
  566.   int words, sf, of, cmin, cmax, lmin, lmax;
  567.   register int c;
  568.   register int l;
  569.   register long mask;
  570.   register unsigned long item;
  571.   long *addr, *itaddr;
  572. #endif
  573.  
  574. #ifdef DEBUG
  575. /*
  576.   if (DeBug) 
  577.    {
  578.     Message ("CopyBitArray(%ld,%ld,%d,%d,%lX)",x,y,w,h,p);
  579.     Message ("upper limit = %ld, lower limit = %ld",
  580.              upper_limit, lower_limit);
  581.    }
  582. */
  583. #endif
  584.  
  585.   x += hoffset;
  586.   y += voffset;
  587.  
  588. /*
  589.   if (x+(long)w < 0L || x > map.width) 
  590. */
  591.  
  592. #if 0
  593.   if (x < 0L || x+(long)w > map.width) 
  594.    {
  595.     return;
  596.    }
  597. #endif
  598.   if (y >= lower_limit || y+(long)h < upper_limit) 
  599.    {
  600.     return;
  601.    }
  602.  
  603. #ifdef ATARI
  604.  
  605.   AtCopyBitArray(x,y-upper_limit,w,h,p);
  606.  
  607. #else
  608.  
  609.   words = (w + bitsperlong - 1) / bitsperlong;
  610.   sf = x % bitsperlong;
  611.   of = x / bitsperlong;
  612.   lmin = 0; lmax = h;
  613.   cmin = 0; cmax = words;
  614.  
  615.   if (y - upper_limit < 0) 
  616.    {
  617.     lmin = upper_limit - y;
  618.    }
  619.  
  620.   if (y+h >= lower_limit)
  621.    {
  622.     lmax = lower_limit - y;
  623.    }
  624.  
  625.   for (l=lmin; l<lmax; l++)
  626.    {
  627.     addr = map.pixptr + (y - upper_limit + l) * word_width + of;
  628.     itaddr = p + l * words;
  629.     mask = 0;
  630.     for (c=cmin; c<cmax; c++)
  631.      {
  632.       if (p == NULL)
  633.        {
  634.         item = -1;
  635.         if (c == words-1 && w % bitsperlong)
  636.          {
  637.           item <<= (bitsperlong - w % bitsperlong);
  638.          }
  639.        }
  640.       else
  641.        {
  642.         item = *(itaddr + c);
  643.        }
  644.       mask |= item >> sf;
  645.       *(addr + c) |= mask;
  646.       mask = item << (bitsperlong - sf);
  647.      }
  648.     *(addr + c) |= mask;
  649.    }
  650. #endif
  651. }
  652. #endif
  653.  
  654. #ifndef DISPLAY
  655. int PrintPage(void)
  656. {
  657.  if (iffprint) {
  658.    char *ptr;
  659.    int clip = FALSE;
  660.    struct BitMap bmap;
  661.    char iffname[PATHLEN];
  662.  
  663.    if (output_file_name) { /* use the output_file_name as destination */
  664. #if defined(NEW_SAVE_IFF_METHOD)
  665.      clip = *output_file_name == 'C' && output_file_name[1] == 'L' 
  666.         && output_file_name[2] == 'I' && output_file_name[3] == 'P';
  667. #endif
  668.      if (clip) {
  669.        strcpy(iffname, output_file_name);
  670.      }
  671.      else {
  672.        strcpy(iffname, output_file_name);
  673.        ptr = &iffname[strlen(iffname)];        /* append extension */
  674.      }
  675.    }
  676.    else {
  677.      strcpy(iffname, filename);
  678.      ptr = strrchr(iffname, '.');    /* we know there's the .dvi */
  679.    }
  680.  
  681.    if (!clip) sprintf(ptr,".p%d", CurrentPage);
  682.  
  683.    bmap.BytesPerRow = map.width / 8;
  684.    bmap.Rows        = map.height;
  685.    bmap.Flags       = 0;
  686.    bmap.Depth       = 1;
  687.    bmap.Planes[0]   = (PLANEPTR)map.pixptr;
  688.  
  689.    if (clip) {
  690.      Message(MSG_DVIP_SAVE_CLIP, CurrentPage, filename, iffname);
  691.    }
  692.    else {
  693.      Message(MSG_DVIP_SAVE_IFF, CurrentPage, filename, iffname);
  694.    }
  695.  
  696. #if !defined(NEW_SAVE_IFF_METHOD)
  697.    //if (IFFBase == NULL) FatalStr(20, "internal error: IFFBase == NULL!?!");
  698.  
  699.    if (!SaveBitMap(iffname,&bmap,&(bw_ctable[0]),1L)) {
  700.      WarningStr( "Can't write page to iff-file \"%s\"!", iffname);
  701.    }
  702. #else
  703.  
  704.    /*
  705.     * Nun neue IFF-Save Methode die ohne die iff.library auskommt.
  706.     */
  707.    memset(&ilbm, 0, sizeof(ilbm));
  708.    ilbm.ParseInfo.iff = AllocIFF();
  709.    if (!ilbm.ParseInfo.iff) {
  710.      Fatal(10, MSG_NO_MEM);
  711.    }
  712.    if (saveilbm(&ilbm, &bmap, DEFAULT_MONITOR_ID|HIRESLACE_KEY, 
  713.         map.width, map.height, map.width, map.height,
  714.         bw_ctable, 2, 4, 0, 0, NULL, NULL, iffname)) {
  715.      Warning( MSG_DVIP_CANT_SAVE_IFF, iffname);
  716.    }
  717.    FreeIFF(ilbm.ParseInfo.iff);
  718. #endif
  719.    ClearBitmap();
  720.    return 1;
  721.  }
  722.  else {
  723.    if (Pass==PassNo) {
  724.  
  725.      // Drucke Pass Nr. 'Pass'
  726.  
  727.      Hardcopy(&map, (long)(map_length-upper_limit), (Pass == 1), TRUE);        /* last pass */
  728.  
  729.      if (Printer->pp_special & SPECIAL_PREFS) {
  730.        WaitForPrinterOK();    /* warte bis der Streifen fertig gedruckt ist     */
  731.                     /* definiert in amprint.c, wartet auch auf CTRL-C */
  732.      }
  733.  
  734.      ClearBitmap();
  735.  
  736.      Pass=1;
  737.      upper_limit=0L;
  738.      lower_limit=map.height;
  739.      return(1);
  740.    }
  741.    else {
  742.  
  743.      // Drucke Pass Nr. 'Pass'
  744.  
  745.      Hardcopy(&map, map.height, (Pass == 1), FALSE);        /* FALSE : not last pass */
  746.  
  747.      if (Printer->pp_special & SPECIAL_PREFS) {
  748.        WaitForPrinterOK();    /* warte bis der Streifen fertig gedruckt ist     */
  749.                     /* definiert in amprint.c, wartet auch auf CTRL-C */
  750.      }
  751.  
  752.      ClearBitmap();
  753.      Pass++;
  754.      upper_limit += (map.height);
  755.      lower_limit += (map.height);
  756.      return(0);
  757.     }
  758.   }
  759. }
  760. #endif
  761.  
  762.