home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 1 / FFMCD01.bin / bbs / graphics / ppmqvga.lha / PPMQVGA / src / ppm / ppmtoilbm.c < prev   
C/C++ Source or Header  |  1993-09-01  |  31KB  |  996 lines

  1. /* ppmtoilbm.c - read a portable pixmap and produce an IFF ILBM file
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. ** Modified 20/Jun/93 by Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
  5. **  - 24bit support (new options -24if, -24force)
  6. **  - HAM8 support (well, anything from HAM3 to HAM(MAXPLANES))
  7. **  - now writes up to 8 (16) planes (new options -maxplanes, -fixplanes)
  8. **  - colormap file (new option -map)
  9. **  - write colormap only (new option -cmaponly)
  10. **  - only writes CAMG chunk if its a HAM-picture
  11. ** Modified 29/Aug/93 by Ingo Wilken
  12. **  - operates row-by-row whenever possible
  13. **  - faster colorscaling with lookup-table (~20% faster on HAM pictures)
  14. **  - options -ham8 and -ham6 now imply -hamforce
  15. **
  16. **
  17. **           std   HAM  24bit cmap  direct
  18. **  -------+-----+-----+-----+-----+-----
  19. **  BMHD     yes   yes   yes   yes   yes
  20. **  CMAP     yes   (1)   no    yes   no
  21. **  BODY     yes   yes   yes   no    yes
  22. **  other    -     CAMG  -     -     DCOL
  23. **  nPlanes  1-8   3-8   24    0     3-24   if configured without ILBM_BIGRAW
  24. **  nPlanes  1-16  3-16  24    0     3-48   if configured with ILBM_BIGRAW
  25. **
  26. **  (1): grayscale colormap
  27. **
  28. ** Permission to use, copy, modify, and distribute this software and its
  29. ** documentation for any purpose and without fee is hereby granted, provided
  30. ** that the above copyright notice appear in all copies and that both that
  31. ** copyright notice and this permission notice appear in supporting
  32. ** documentation.  This software is provided "as is" without express or
  33. ** implied warranty.
  34. */
  35.  
  36. #include "ppm.h"
  37. #include "ppmcmap.h"
  38. #include "ilbm.h"
  39.  
  40.  
  41. #define MODE_DIRECT     4   /* direct color ILBM */
  42. #define MODE_CMAP       3   /* write normal file, but colormap only */
  43. #define MODE_24         2   /* write a 24bit (deep) ILBM */
  44. #define MODE_HAM        1   /* write a HAM */
  45. #define MODE_NONE       0   /* write a normal picture */
  46.  
  47. #define ECS_MAXPLANES   5
  48. #define ECS_HAMPLANES   6
  49. #define AGA_MAXPLANES   8
  50. #define AGA_HAMPLANES   8
  51.  
  52. #ifdef AMIGA_AGA
  53. #define DEF_MAXPLANES   AGA_MAXPLANES
  54. #define DEF_HAMPLANES   AGA_HAMPLANES
  55. #else
  56. #define DEF_MAXPLANES   ECS_MAXPLANES
  57. #define DEF_HAMPLANES   ECS_HAMPLANES
  58. #endif
  59. #define DEF_DCOLPLANES  5
  60.  
  61.  
  62. static int colorstobpp ARGS((int colors));
  63. #define put_fourchars(str)  (void)(fputs(str, stdout))
  64. static void put_big_short ARGS((short s));
  65. static void put_big_long ARGS((long l));
  66. #define put_byte(b)     (void)(putc((unsigned char)(b), stdout))
  67. static void ppm_to_ham ARGS((FILE *fp, int cols, int rows, int maxval, int hambits));
  68. static void ppm_to_24  ARGS((FILE *fp, int cols, int rows, int maxval));
  69. static void ppm_to_direct  ARGS((FILE *fp, int cols, int rows, int maxval, DirectColor *direct));
  70. static void ppm_to_std ARGS((FILE *fp, int cols, int rows, int maxval, colorhist_vector chv, int colors, int nPlanes));
  71. static void ppm_to_cmap ARGS((int maxval, colorhist_vector chv, int colors));
  72. static void write_form_ilbm ARGS((int size));
  73. static void write_bmhd ARGS((int cols, int rows, int nPlanes));
  74. static void write_std_cmap ARGS((colorhist_vector chv, int colors, int maxval));
  75. static void encode_row ARGS((rawtype *row, int cols, int nPlanes));
  76. static int get_int_val ARGS((char *string, char *option, int bot, int top));
  77. static pixel * next_pixrow ARGS((FILE *fp, int row));
  78. static pixval * make_val_table ARGS((pixval oldmaxval, pixval newmaxval));
  79. static void * xmalloc ARGS((int bytes));
  80. static void init_read ARGS((FILE *fp, int *colsP, int *rowsP, pixval *maxvalP, int readall));
  81.  
  82.  
  83. static unsigned char *coded_rowbuf;
  84. static pixel **pixels;
  85. static pixel *pixrow;
  86.  
  87. #define NEWDEPTH(pix, table)   PPM_ASSIGN((pix), (table)[PPM_GETR(pix)], (table)[PPM_GETG(pix)], (table)[PPM_GETB(pix)])
  88.  
  89. #define MAXCOLORS       (1<<maxplanes)
  90.  
  91. int
  92. main(argc, argv)
  93.     int argc;
  94.     char *argv[];
  95. {
  96.     FILE *ifp;
  97.     int argn, rows, cols, colors, nPlanes;
  98.     int ifmode, forcemode, maxplanes, fixplanes, hambits, mode;
  99.     pixval maxval;
  100.     colorhist_vector chv;
  101.     DirectColor dcol;
  102.     char *mapfile;
  103.     char *usage =
  104. "[-ecs|-aga] [-ham6|-ham8] [-maxplanes|-mp n] [-fixplanes|-fp n] \
  105. [-normal|-hamif|-hamforce|-24if|-24force|-dcif|-dcforce|-cmaponly] \
  106. [-hambits|-hamplanes n] [-dcbits|-dcplanes r g b] \
  107. [-map ppmfile] [ppmfile]";
  108.  
  109.     ppm_init(&argc, argv);
  110.  
  111.     ifmode = MODE_NONE; forcemode = MODE_NONE;
  112.     maxplanes = DEF_MAXPLANES; fixplanes = 0;
  113.     hambits = DEF_HAMPLANES;
  114.     mapfile = NULL;
  115.     dcol.r = dcol.g = dcol.b = DEF_DCOLPLANES;
  116.  
  117.     argn = 1;
  118.     while( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' ) {
  119.         if( pm_keymatch(argv[argn], "-maxplanes", 4) || pm_keymatch(argv[argn], "-mp", 3) ) {
  120.             if( ++argn >= argc )
  121.                 pm_usage(usage);
  122.             maxplanes = get_int_val(argv[argn], argv[argn-1], 1, MAXPLANES);
  123.             fixplanes = 0;
  124.         }
  125.         else
  126.         if( pm_keymatch(argv[argn], "-fixplanes", 4) || pm_keymatch(argv[argn], "-fp", 3) ) {
  127.             if( ++argn >= argc )
  128.                 pm_usage(usage);
  129.             fixplanes = get_int_val(argv[argn], argv[argn-1], 1, MAXPLANES);
  130.             maxplanes = fixplanes;
  131.         }
  132.         else
  133.         if( pm_keymatch(argv[argn], "-map", 4) ) {
  134.             if( ++argn >= argc )
  135.                 pm_usage(usage);
  136.             mapfile = argv[argn];
  137.         }
  138.         else
  139.         if( pm_keymatch(argv[argn], "-cmaponly", 3) ) {
  140.             forcemode = MODE_CMAP;
  141.         }
  142.         else
  143.         if( pm_keymatch(argv[argn], "-hambits", 5) || pm_keymatch(argv[argn], "-hamplanes", 5) ) {
  144.             if( ++argn > argc )
  145.                 pm_usage(usage);
  146.             hambits = get_int_val(argv[argn], argv[argn-1], 3, MAXPLANES);
  147.         }
  148.         else
  149.         if( pm_keymatch(argv[argn], "-ham6", 5) ) {
  150.             hambits = ECS_HAMPLANES;
  151.             forcemode = MODE_HAM;
  152.         }
  153.         else
  154.         if( pm_keymatch(argv[argn], "-ham8", 5) ) {
  155.             hambits = AGA_HAMPLANES;
  156.             forcemode = MODE_HAM;
  157.         }
  158.         else
  159.         if( pm_keymatch(argv[argn], "-ecs", 2) ) {
  160.             maxplanes = ECS_MAXPLANES;
  161.             hambits = ECS_HAMPLANES;
  162.         }
  163.         else
  164.         if( pm_keymatch(argv[argn], "-aga", 2) ) {
  165.             maxplanes = AGA_MAXPLANES;
  166.             hambits = AGA_HAMPLANES;
  167.         }
  168.         else
  169.         if( pm_keymatch(argv[argn], "-hamif", 5) )
  170.             ifmode = MODE_HAM;
  171.         else
  172.         if( pm_keymatch(argv[argn], "-nohamif", 7) ) {
  173.             if( ifmode == MODE_HAM )
  174.                 ifmode = MODE_NONE;
  175.         }
  176.         else
  177.         if( pm_keymatch(argv[argn], "-hamforce", 5) )
  178.             forcemode = MODE_HAM;
  179.         else
  180.         if( pm_keymatch(argv[argn], "-nohamforce", 7) ) {
  181.             if( forcemode == MODE_HAM )
  182.                 forcemode = MODE_NONE;
  183.         }
  184.         else
  185.         if( pm_keymatch(argv[argn], "-24if", 4) )
  186.             ifmode = MODE_24;
  187.         else
  188.         if( pm_keymatch(argv[argn], "-no24if", 6) ) {
  189.             if( ifmode == MODE_24 )
  190.                 ifmode = MODE_NONE;
  191.         }
  192.         else
  193.         if( pm_keymatch(argv[argn], "-24force", 4) )
  194.             forcemode = MODE_24;
  195.         else
  196.         if( pm_keymatch(argv[argn], "-no24force", 6) ) {
  197.             if( forcemode == MODE_24 )
  198.                 forcemode = MODE_NONE;
  199.         }
  200.         else
  201.         if( pm_keymatch(argv[argn], "-dcif", 4) ) {
  202.             ifmode = MODE_DIRECT;
  203.         }
  204.         else
  205.         if( pm_keymatch(argv[argn], "-nodcif", 6) ) {
  206.             if( ifmode == MODE_DIRECT )
  207.                 ifmode = MODE_NONE;
  208.         }
  209.         else
  210.         if( pm_keymatch(argv[argn], "-dcforce", 4) ) {
  211.             forcemode = MODE_DIRECT;
  212.         }
  213.         else
  214.         if( pm_keymatch(argv[argn], "-nodcforce", 6) ) {
  215.             if( forcemode == MODE_DIRECT )
  216.                 forcemode = MODE_NONE;
  217.         }
  218.         else
  219.         if( pm_keymatch(argv[argn], "-dcbits", 4) || pm_keymatch(argv[argn], "-dcplanes", 4) ) {
  220.             char *option = argv[argn];
  221.  
  222.             if( ++argn >= argc )
  223.                 pm_usage(usage);
  224.             dcol.r = (unsigned char) get_int_val(argv[argn], option, 1, MAXPLANES);
  225.             if( ++argn >= argc )
  226.                 pm_usage(usage);
  227.