home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / netpbma.zip / pbm / pbmtoascii.c < prev    next >
C/C++ Source or Header  |  1993-10-04  |  5KB  |  161 lines

  1. /* pbmtoascii.c - read a portable bitmap and produce ASCII graphics
  2. **
  3. ** Copyright (C) 1988, 1992 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include "pbm.h"
  14.  
  15. #define SQQ '\''
  16. #define BSQ '\\'
  17.  
  18. /* Bit-map for 1x2 mode:
  19. **     1
  20. **     2
  21. */
  22. static char carr1x2[4] = {
  23. /*   0    1    2    3   */
  24.     ' ', '"', 'o', 'M' };
  25.  
  26. /* Bit-map for 2x4 mode (hex):
  27. **     1  2
  28. **     4  8
  29. **     10 20
  30. **     40 80
  31. ** The idea here is first to preserve geometry, then to show density.
  32. */
  33. #define D08 'M'
  34. #define D07 'H'
  35. #define D06 '&'
  36. #define D05 '$'
  37. #define D04 '?'
  38. static char carr2x4[256] = {
  39. /*0  1    2   3    4   5    6   7    8   9    A   B    C   D    E   F  */
  40. ' ',SQQ, '`','"', '-',SQQ, SQQ,SQQ, '-','`', '`','`', '-','^', '^','"',/*00-0F*/
  41. '.',':', ':',':', '|','|', '/',D04, '/','>', '/','>', '~','+', '/','*',/*10-1F*/
  42. '.',':', ':',':', BSQ,BSQ, '<','<', '|',BSQ, '|',D04, '~',BSQ, '+','*',/*20-2F*/
  43. '-',':', ':',':', '~',D04, '<','<', '~','>', D04,'>', '=','b', 'd','#',/*30-3F*/
  44. '.',':', ':',':', ':','!', '/',D04, ':',':', '/',D04, ':',D04, D04,'P',/*40-4F*/
  45. ',','i', '/',D04, '|','|', '|','T', '/',D04, '/','7', 'r','}', '/','P',/*50-5F*/
  46. ',',':', ';',D04, '>',D04, 'S','S', '/',')', '|','7', '>',D05, D05,D06,/*60-6F*/
  47. 'v',D04, D04,D05, '+','}', D05,'F', '/',D05, '/',D06, 'p','D', D06,D07,/*70-7F*/
  48. '.',':', ':',':', ':',BSQ, ':',D04, ':',BSQ, '!',D04, ':',D04, D04,D05,/*80-8F*/
  49. BSQ,BSQ, ':',D04, BSQ,'|', '(',D05, '<','%', D04,'Z', '<',D05, D05,D06,/*90-9F*/
  50. ',',BSQ, 'i',D04, BSQ,BSQ, D04,BSQ, '|','|', '|','T', D04,BSQ, '4','9',/*A0-AF*/
  51. 'v',D04, D04,D05, BSQ,BSQ, D05,D06, '+',D05, '{',D06, 'q',D06, D06,D07,/*B0-BF*/
  52. '_',':', ':',D04, ':',D04, D04,D05, ':',D04, D04,D05, ':',D05, D05,D06,/*C0-CF*/
  53. BSQ,D04, D04,D05, D04,'L', D05,'[', '<','Z', '/','Z', 'c','k', D06,'R',/*D0-DF*/
  54. ',',D04, D04,D05, '>',BSQ, 'S','S', D04,D05, 'J',']', '>',D06, '1','9',/*E0-EF*/
  55. 'o','b', 'd',D06, 'b','b', D06,'6', 'd',D06, 'd',D07, '#',D07, D07,D08 /*F0-FF*/
  56.     };
  57.  
  58. main( argc, argv )
  59. int argc;
  60. char* argv[];
  61.     {
  62.     FILE* ifp;
  63.     int argn, gridx, gridy, rows, cols, format;
  64.     int ccols, lastcol, row, subrow, subcol;
  65.     register int col, b;
  66.     bit* bitrow;
  67.     register bit* bP;
  68.     int* sig;
  69.     register int* sP;
  70.     char* line;
  71.     register char* lP;
  72.     char* carr;
  73.     char* usage = "[-1x2|-2x4] [pbmfile]";
  74.  
  75.   
  76.     pbm_init( &argc, argv );
  77.  
  78.     /* Set up default parameters. */
  79.     argn = 1;
  80.     gridx = 1;
  81.     gridy = 2;
  82.     carr = carr1x2;
  83.  
  84.     /* Check for flags. */
  85.     while ( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' )
  86.     {
  87.     if ( pm_keymatch( argv[argn], "-1x2", 2 ) )
  88.         {
  89.         gridx = 1;
  90.         gridy = 2;
  91.         carr = carr1x2;
  92.         }
  93.     else if ( pm_keymatch( argv[argn], "-2x4", 2 ) )
  94.         {
  95.         gridx = 2;
  96.         gridy = 4;
  97.         carr = carr2x4;
  98.         }
  99.     else
  100.         pm_usage( usage );
  101.     ++argn;
  102.     }
  103.  
  104.     if ( argn < argc )
  105.     {
  106.     ifp = pm_openr( argv[argn] );
  107.     ++argn;
  108.     }
  109.     else
  110.     ifp = stdin;
  111.     
  112.     if ( argn != argc )
  113.     pm_usage( usage );
  114.  
  115.     pbm_readpbminit( ifp, &cols, &rows, &format );
  116.     ccols = ( cols + gridx - 1 ) / gridx;
  117.     bitrow = pbm_allocrow( cols );
  118.     sig = (int*) pm_allocrow( ccols, sizeof(int) );
  119.     line = (char*) pm_allocrow( ccols + 1, sizeof(char) );
  120.  
  121.     for ( row = 0; row < rows; row += gridy )
  122.     {
  123.     /* Get a character-row's worth of sigs. */
  124.     for ( col = 0; col < ccols; ++col )
  125.         sig[col] = 0;
  126.     b = 1;
  127.     for ( subrow = 0; subrow < gridy; ++subrow )
  128.         {
  129.         if ( row + subrow < rows )
  130.         {
  131.         pbm_readpbmrow( ifp, bitrow, cols, format );
  132.         for ( subcol = 0; subcol < gridx; ++subcol )
  133.             {
  134.             for ( col = subcol, bP = &(bitrow[subcol]), sP = sig;
  135.               col < cols;
  136.               col += gridx, bP += gridx, ++sP )
  137.             if ( *bP == PBM_BLACK )
  138.                 *sP |= b;
  139.             b <<= 1;
  140.             }
  141.         }
  142.         }
  143.     /* Ok, now remove trailing blanks.  */
  144.     for ( lastcol = ccols - 1; lastcol >= 0; --lastcol )
  145.         if ( carr[sig[lastcol]] != ' ' )
  146.         break;
  147.     /* Copy chars to an array and print. */
  148.     for ( col = 0, sP = sig, lP = line; col <= lastcol; ++col, ++sP, ++lP )
  149.         *lP = carr[*sP];
  150.     *lP++ = '\0';
  151.     puts( line );
  152.     }
  153.  
  154.     pm_close( ifp );
  155.     pbm_freerow( bitrow );
  156.     pm_freerow( (char*) sig );
  157.     pm_freerow( (char*) line );
  158.  
  159.     exit( 0 );
  160.     }
  161.