home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / formats / uray / code / rkm.c < prev    next >
Text File  |  1994-06-20  |  4KB  |  134 lines

  1. /************************************************************************
  2.  *                                    *
  3.  *            Copyright (c) 1988, David B. Wecker            *
  4.  *                All Rights Reserved                *
  5.  *                                    *
  6.  * This file is part of DBW_uRAY                    *
  7.  *                                    *
  8.  * DBW_uRAY is distributed in the hope that it will be useful, but    *
  9.  * WITHOUT ANY WARRANTY. No author or distributor accepts        *
  10.  * responsibility to anyone for the consequences of using it or for    *
  11.  * whether it serves any particular purpose or works at all, unless    *
  12.  * he says so in writing. Refer to the DBW_uRAY General Public        *
  13.  * License for full details.                        *
  14.  *                                    *
  15.  * Everyone is granted permission to copy, modify and redistribute    *
  16.  * DBW_uRAY, but only under the conditions described in the        *
  17.  * DBW_uRAY General Public License. A copy of this license is        *
  18.  * supposed to have been given to you along with DBW_uRAY so you    *
  19.  * can know your rights and responsibilities. It should be in a file    *
  20.  * named LICENSE. Among other things, the copyright notice and this    *
  21.  * notice must be preserved on all copies.                *
  22.  ************************************************************************
  23.  *                                    *
  24.  * Authors:                                *
  25.  *    DBW - David B. Wecker                        *
  26.  *                                    *
  27.  * Versions:                                *
  28.  *    V1.0 881023 DBW    - First released version            *
  29.  *    V1.1 881110 DBW - Fixed scan coherence code            *
  30.  *    V1.2 881125 DBW - Removed ALL scan coherence code (useless)    *
  31.  *              added "fat" extent boxes            *
  32.  *    V1.3 881203 DBW - Fixed single precision TOLerances        *
  33.  *                                    *
  34.  ************************************************************************/
  35.  
  36. /***********************************************************************/
  37. /************************ run length encoding from RKM *****************/
  38. /***********************************************************************/
  39.  
  40. #define DUMP        0
  41. #define RUN        1
  42. #define MinRun        3
  43. #define MaxRun        128
  44. #define    MaxDat        128
  45. #define GetByte()    (*source++)
  46. #define PutByte(c)    { *dest++ = (c); ++PutSize; }
  47. #define OutDump(nn)    dest = PutDump(dest,nn)
  48. #define OutRun(nn,cc)    dest = PutRun(dest,nn,cc)
  49.  
  50. short    PutSize;
  51. char    buf[256];
  52.  
  53. /* put out nn bytes into the dest buffer */
  54. unsigned char *PutDump(dest,nn)
  55. unsigned char    *dest;
  56. short        nn;
  57.     {
  58.     short i;
  59.  
  60.     PutByte(nn-1);
  61.     for (i = 0; i < nn; i++) PutByte(buf[i]);
  62.     return(dest);
  63.     }
  64.  
  65. /* put out the cc byte nn times into the dest buffer */
  66. unsigned char *PutRun(dest,nn,cc)
  67. unsigned char    *dest;
  68. short        nn,cc;
  69.     {
  70.     PutByte(-(nn-1));
  71.     PutByte(cc);
  72.     return(dest);
  73.     }
  74.  
  75. /* put out a row of the current image */
  76. short PackRow(source,dest,RowSize)
  77. unsigned char    *source,*dest;
  78. short        RowSize;
  79.     {
  80.     char        c,
  81.             lastc = '\000';
  82.     short        mode = DUMP,
  83.             nbuf = 0,        /* number of chars in buf */
  84.             rstart = 0;        /* buf index current run starts */
  85.  
  86.     PutSize = 0;
  87.     buf[0]  = lastc = c = GetByte();
  88.     nbuf    = 1;
  89.     RowSize--;
  90.  
  91.     for (; RowSize; --RowSize) {
  92.     buf[nbuf++] = c = GetByte();
  93.  
  94.     switch (mode) {
  95.         case DUMP:
  96.         if (nbuf > MaxDat) {
  97.         OutDump(nbuf-1);
  98.         buf[0]    = c;
  99.         nbuf    = 1;
  100.         rstart    = 0;
  101.         break;
  102.         }
  103.         if (c == lastc) {
  104.         if (nbuf-rstart >= MinRun) {
  105.             if (rstart > 0) OutDump(rstart);
  106.             mode = RUN;
  107.             }
  108.         else if (rstart == 0) mode = RUN;
  109.         }
  110.         else rstart = nbuf - 1;
  111.         break;
  112.  
  113.         case RUN:
  114.         if ((c != lastc) || (nbuf-rstart > MaxRun)) {
  115.         OutRun((nbuf-1)-rstart,lastc);
  116.         buf[0]    = c;
  117.         nbuf    = 1;
  118.         rstart    = 0;
  119.         mode    = DUMP;
  120.         }
  121.         break;
  122.         }
  123.     lastc = c;
  124.     }
  125.     switch (mode) {
  126.     case DUMP: OutDump(nbuf); break;
  127.     case RUN:  OutRun(nbuf-rstart,lastc); break;
  128.     }
  129.  
  130.     return(PutSize);
  131.     }
  132.  
  133.  
  134.