home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / os2 / hpgl312.zip / TO_ILBM.C < prev    next >
C/C++ Source or Header  |  1993-04-18  |  9KB  |  317 lines

  1. /*
  2.    Copyright (c) 1992, 1993 Claus H. Langhans.  All rights reserved.
  3.    Distributed by Free Software Foundation, Inc.
  4.  
  5. This file is part of HP2xx.
  6.  
  7. HP2xx is distributed in the hope that it will be useful, but
  8. WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
  9. to anyone for the consequences of using it or for whether it serves any
  10. particular purpose or works at all, unless he says so in writing.  Refer
  11. to the GNU General Public License, Version 2 or later, for full details.
  12.  
  13. Everyone is granted permission to copy, modify and redistribute
  14. HP2xx, but only under the conditions described in the GNU General Public
  15. License.  A copy of this license is supposed to have been
  16. given to you along with HP2xx so you can know your rights and
  17. responsibilities.  It should be in a file named COPYING.  Among other
  18. things, the copyright notice and this notice must be preserved on all
  19. copies.
  20.  
  21. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  22. */
  23.  
  24. /**
  25.  ** to_ilbm.c: InterChangeFileFormat: InterLeaveBitMap (IFF-ILBM) converter
  26.  ** part of project "hp2xx"
  27.  **
  28.  ** 92/04/14  V 1.00  CHL  Originating: Copied from to_pbm.c
  29.  ** 92/04/15  V 1.01  CHL  I read the IFF-ILBM Manuals! Word alligned, not byte!
  30.  ** 92/04/16  V 1.02  CHL  Better error handling
  31.  **/
  32.  
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include "bresnham.h"
  37. #include "hp2xx.h"
  38.  
  39. typedef long    LONG;
  40. typedef unsigned long ULONG;
  41. typedef unsigned long LONGBITS;
  42. typedef short   WORD;
  43. typedef unsigned short UWORD;
  44. typedef unsigned short WORDBITS;
  45. typedef char    BYTE;
  46. typedef unsigned char UBYTE;
  47. typedef unsigned char BYTEBITS;
  48. typedef unsigned char *STRPTR;
  49. typedef STRPTR *APTR;
  50. typedef ULONG   CPTR;
  51. typedef short   SHORT;
  52. typedef unsigned short USHORT;
  53. typedef float   FLOAT;
  54. typedef double  DOUBLE;
  55. typedef short   COUNT;
  56. typedef unsigned short UCOUNT;
  57. typedef short   BOOL;
  58. typedef unsigned char TEXT;
  59. typedef long    BPTR;
  60.  
  61.  
  62. #include "iff.h"
  63. #include "ilbm.h"
  64.  
  65.  
  66. #define CMAP
  67. #define CAMG  /* AMIGA specific video mode */
  68.  
  69. #define GGE >>=
  70.  
  71. #define YES 1L;
  72. #define NO  0L;
  73.  
  74. int
  75. put_LONG( LONG l, FILE *fd) {
  76. int retval;
  77.     if((retval=putc ((l >> 24) & 0xFF,fd))==EOF)
  78.         return(retval);
  79.     else
  80.         if((retval=putc ((l >> 16) & 0xFF,fd))==EOF)
  81.             return(retval);
  82.         else
  83.             if((retval=putc ((l >> 8) & 0xFF,fd))==EOF)
  84.                   return(retval);
  85.             else
  86.                 return(putc(l,fd));
  87. }
  88.  
  89. int
  90. put_ULONG( ULONG ul, FILE *fd) {
  91. int retval;
  92.     if((retval=putc ((ul >> 24) & 0xFF,fd))==EOF)
  93.         return(retval);
  94.     else
  95.         if((retval=putc ((ul >> 16) & 0xFF,fd))==EOF)
  96.             return(retval);
  97.         else
  98.             if((retval=putc ((ul >> 8) & 0xFF,fd))==EOF)
  99.                   return(retval);
  100.             else
  101.                 return(putc(ul,fd));
  102. }
  103.  
  104. int
  105. put_WORD( WORD w, FILE *fd) {
  106. int retval;
  107.     if((retval=putc ((w >> 8) & 0xFF,fd))==EOF)
  108.           return(retval);
  109.     else
  110.         return(putc(w,fd));
  111. }
  112.  
  113. int
  114. put_UWORD( UWORD uw, FILE *fd) {
  115. int retval;
  116.     if((retval=putc ((uw >> 8) & 0xFF,fd))==EOF)
  117.           return(retval);
  118.     else
  119.         return(putc(uw,fd));
  120. }
  121.  
  122. int
  123. put_UBYTE( UBYTE u, FILE *fd) {
  124.     return(putc (u,fd));
  125. }
  126.  
  127. void
  128. PicBuf_to_ILBM(PicBuf * picbuf, PAR * p)
  129. {
  130.     FILE           *fd;
  131.     int             row_count = 0;
  132.     int             row_c, byte_c, bit, x, xoff, yoff;
  133.     RowBuf         *row;
  134.     int              i;
  135.     unsigned char  *memptr;
  136.     int             BitPlaneSize;
  137.     int             OddBmp;
  138.  
  139.     struct SimpleHdr {
  140.     ChunkHeader     FORM_Hdr;
  141.     LONG            ILBM_Type;
  142.     ChunkHeader     BMHD_CkHdr;
  143.     BitMapHeader    BMHD_Ck;
  144. #ifdef CAMG
  145.     ChunkHeader     CAMG_CkHdr;
  146.     CamgChunk       CAMG_Ck;
  147. #endif
  148. #ifdef CMAP
  149.     ChunkHeader     CMAP_CkHdr;
  150.         UBYTE           Map0red;
  151.         UBYTE           Map0green;
  152.         UBYTE           Map0blue;
  153.         UBYTE           Map1red;
  154.         UBYTE           Map1green;
  155.         UBYTE           Map1blue;
  156. #endif
  157.     ChunkHeader     BODY_CkHdr;
  158.     }               MyHdr;
  159.  
  160.     if (picbuf->depth > 1)
  161.     {
  162.     fprintf(stderr, "\nILBM mode does not support colors yet -- sorry\n");
  163.     goto ERROR_EXIT_2;
  164.     }
  165.  
  166.     if ((((picbuf->nb) % 2 ) == 1) ){
  167.         OddBmp=YES;
  168.         BitPlaneSize = (picbuf->nb) * (picbuf->nr) + (picbuf->nr);
  169.     }
  170.     else {
  171.         OddBmp=NO;
  172.         BitPlaneSize = (picbuf->nb) * (picbuf->nr);
  173.     }
  174.  
  175.     MyHdr.FORM_Hdr.ckID = FORM;
  176.     MyHdr.FORM_Hdr.ckSize =  sizeof(MyHdr)
  177.                            - sizeof(MyHdr.FORM_Hdr.ckID)
  178.                            - sizeof(MyHdr.FORM_Hdr.ckSize)
  179.                            + BitPlaneSize;
  180.  
  181.     MyHdr.ILBM_Type = ID_ILBM;
  182.  
  183.     MyHdr.BMHD_CkHdr.ckID = ID_BMHD;
  184.     MyHdr.BMHD_CkHdr.ckSize = sizeof(MyHdr.BMHD_Ck);
  185.  
  186.     MyHdr.BMHD_Ck.w = (picbuf->nb) * 8;    /* raster width & height in pixels */
  187.     MyHdr.BMHD_Ck.h = picbuf->nr;
  188.     MyHdr.BMHD_Ck.x = 0L;                  /* position for this image */
  189.     MyHdr.BMHD_Ck.y = 0L;
  190.     MyHdr.BMHD_Ck.nPlanes = 1L;            /* # source bitplanes */
  191.     MyHdr.BMHD_Ck.masking = mskNone;       /* masking technique */
  192.     MyHdr.BMHD_Ck.compression = cmpNone;   /* compression algoithm */
  193.     MyHdr.BMHD_Ck.pad1 = 0L;               /* UNUSED.  For consistency, put 0 here.*/
  194.     MyHdr.BMHD_Ck.transparentColor = 1L;   /* transparent "color number" */
  195.     MyHdr.BMHD_Ck.xAspect = 1L;            /* aspect ratio, a rational number x/y */
  196.     MyHdr.BMHD_Ck.yAspect = 1L;
  197.  
  198.     MyHdr.BMHD_Ck.pageWidth =MyHdr.BMHD_Ck.w; /* source "page" size in pixels */
  199.     MyHdr.BMHD_Ck.pageHeight =MyHdr.BMHD_Ck.h;
  200.  
  201. #ifdef CAMG
  202.     MyHdr.CAMG_CkHdr.ckID = ID_CAMG;
  203.     MyHdr.CAMG_CkHdr.ckSize = sizeof(MyHdr.CAMG_Ck);
  204.     MyHdr.CAMG_Ck.ViewModes = 0x8004; /* = HIRES LACE */
  205. #endif
  206.  
  207. #ifdef CMAP
  208.     MyHdr.CMAP_CkHdr.ckID = ID_CMAP;
  209.     MyHdr.CMAP_CkHdr.ckSize = sizeof(MyHdr.Map0red) * 6;
  210.     MyHdr.Map0red   = 0;
  211.     MyHdr.Map0green = 0;
  212.     MyHdr.Map0blue  = 0;
  213.     MyHdr.Map1red   = 255;
  214.     MyHdr.Map1green = 255;
  215.     MyHdr.Map1blue  = 255;
  216. #endif
  217.  
  218.     MyHdr.BODY_CkHdr.ckID = ID_BODY;
  219.     MyHdr.BODY_CkHdr.ckSize = BitPlaneSize;
  220.  
  221.  
  222.     if (!p->quiet)
  223.     fprintf(stderr, "\nWriting ILBM output: %s\n",p->outfile);
  224.     if (*p->outfile) {
  225. #ifdef VAX
  226.     if ((fd = fopen(p->outfile, WRITE_BIN, "rfm=var", "mrs=512")) == NULL) {
  227. #else
  228.     if ((fd = fopen(p->outfile, WRITE_BIN)) == NULL) {
  229. #endif
  230.         perror("hp2xx -- opening output file");
  231.         free_PicBuf(picbuf, p->swapfile);
  232.         exit(ERROR);
  233.     }
  234.     } else
  235.     fd = stdout;
  236.  
  237.     if (((MyHdr.FORM_Hdr.ckSize) % 2 ) == 1) {
  238.         MyHdr.FORM_Hdr.ckSize +=1;
  239.     }
  240.  
  241.  
  242.  
  243.     if(put_LONG(MyHdr.FORM_Hdr.ckID, fd)== EOF) goto ERROR_EXIT;
  244.     if(put_LONG(MyHdr.FORM_Hdr.ckSize, fd)== EOF) goto ERROR_EXIT;
  245.     if(put_LONG(MyHdr.ILBM_Type, fd)== EOF) goto ERROR_EXIT;
  246.  
  247.     if(put_LONG(MyHdr.BMHD_CkHdr.ckID, fd)== EOF) goto ERROR_EXIT;
  248.     if(put_LONG(MyHdr.BMHD_CkHdr.ckSize, fd)== EOF) goto ERROR_EXIT;
  249.  
  250.     if(put_UWORD(MyHdr.BMHD_Ck.w, fd)== EOF) goto ERROR_EXIT;
  251.     if(put_UWORD(MyHdr.BMHD_Ck.h, fd)== EOF) goto ERROR_EXIT;
  252.     if(put_WORD(MyHdr.BMHD_Ck.x, fd)== EOF) goto ERROR_EXIT;
  253.     if(put_WORD(MyHdr.BMHD_Ck.y, fd)== EOF) goto ERROR_EXIT;
  254.     if(put_UBYTE(MyHdr.BMHD_Ck.nPlanes, fd)== EOF) goto ERROR_EXIT;
  255.     if(put_UBYTE(MyHdr.BMHD_Ck.masking, fd)== EOF) goto ERROR_EXIT;
  256.     if(put_UBYTE(MyHdr.BMHD_Ck.compression, fd)== EOF) goto ERROR_EXIT;
  257.     if(put_UBYTE(MyHdr.BMHD_Ck.pad1, fd)== EOF) goto ERROR_EXIT;
  258.     if(put_UWORD(MyHdr.BMHD_Ck.transparentColor, fd)== EOF) goto ERROR_EXIT;
  259.     if(put_UBYTE(MyHdr.BMHD_Ck.xAspect, fd)== EOF) goto ERROR_EXIT;
  260.     if(put_UBYTE(MyHdr.BMHD_Ck.yAspect, fd)== EOF) goto ERROR_EXIT;
  261.     if(put_WORD(MyHdr.BMHD_Ck.pageWidth, fd)== EOF) goto ERROR_EXIT;
  262.     if(put_WORD(MyHdr.BMHD_Ck.pageHeight, fd)== EOF) goto ERROR_EXIT;
  263.  
  264. #ifdef CAMG
  265.     if(put_LONG(MyHdr.CAMG_CkHdr.ckID, fd)== EOF) goto ERROR_EXIT;
  266.     if(put_LONG(MyHdr.CAMG_CkHdr.ckSize, fd)== EOF) goto ERROR_EXIT;
  267.     if(put_ULONG(MyHdr.CAMG_Ck.ViewModes, fd)== EOF) goto ERROR_EXIT;
  268. #endif
  269.  
  270. #ifdef CMAP
  271.     if(put_LONG(MyHdr.CMAP_CkHdr.ckID, fd)== EOF) goto ERROR_EXIT;
  272.     if(put_LONG(MyHdr.CMAP_CkHdr.ckSize, fd)== EOF) goto ERROR_EXIT;
  273.     if(put_UBYTE(MyHdr.Map0red, fd)== EOF) goto ERROR_EXIT;
  274.     if(put_UBYTE(MyHdr.Map0green, fd)== EOF) goto ERROR_EXIT;
  275.     if(put_UBYTE(MyHdr.Map0blue, fd)== EOF) goto ERROR_EXIT;
  276.     if(put_UBYTE(MyHdr.Map1red, fd)== EOF) goto ERROR_EXIT;
  277.     if(put_UBYTE(MyHdr.Map1green, fd)== EOF) goto ERROR_EXIT;
  278.     if(put_UBYTE(MyHdr.Map1blue, fd)== EOF) goto ERROR_EXIT;
  279. #endif
  280.  
  281.     if(put_LONG(MyHdr.BODY_CkHdr.ckID, fd)== EOF) goto ERROR_EXIT;
  282.     if(put_LONG(MyHdr.BODY_CkHdr.ckSize, fd)== EOF) goto ERROR_EXIT;
  283.  
  284. /*
  285.     memptr = (unsigned char *) &MyHdr;
  286.     for (i=0; i < sizeof(MyHdr) ; i++)
  287.              putc(memptr[i],fd);
  288. */
  289.     for (row_c = 0; row_c < picbuf->nr; row_c++) {
  290.  
  291.     row = get_RowBuf(picbuf, picbuf->nr - row_c - 1);
  292.  
  293.     for (byte_c = x = 0; byte_c < picbuf->nb; byte_c++)
  294.              if( putc(row->buf[byte_c],fd) == EOF) goto ERROR_EXIT;
  295.         if (OddBmp) {
  296.             putc(0,fd);
  297.         }
  298.  
  299.     if ((!p->quiet) && (row_c % 10 == 0))
  300.         putc('.', stderr);
  301.     }
  302.     if (!p->quiet)
  303.     fputc('\n', stderr);
  304.  
  305.     if (fd != stdout)
  306.     fclose(fd);
  307.  
  308.   return;
  309.  
  310. ERROR_EXIT:
  311.   perror      ("write_ILBM");
  312. ERROR_EXIT_2:
  313.   free_PicBuf (picbuf, p->swapfile);
  314.   exit          (ERROR);
  315.  
  316. }
  317.