home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / TO_PORT / compfacelib.lzh / compface.h < prev    next >
C/C++ Source or Header  |  1992-04-30  |  5KB  |  174 lines

  1. /*
  2.  *  Compface - 48x48x1 image compression and decompression
  3.  *
  4.  *  Copyright (c) James Ashton - Sydney University - June 1990.
  5.  *
  6.  *  Written 11th November 1989.
  7.  *
  8.  *  Permission is given to distribute these sources, as long as the
  9.  *  copyright messages are not removed, and no monies are exchanged. 
  10.  *
  11.  *  No responsibility is taken for any errors on inaccuracies inherent
  12.  *  either to the comments or the code of this program, but if reported
  13.  *  to me, then an attempt will be made to fix them.
  14.  */
  15.  
  16. #ifdef SYSV32 || hpux
  17. #include <string.h>
  18. #else
  19. #include <strings.h>
  20. #endif /* SYSV32 || hpux */
  21. #include <fcntl.h>
  22. #include <setjmp.h>
  23.  
  24. #ifdef MAIN
  25. #define EXTERN
  26. #define INIT(x) = x
  27. #else
  28. #define EXTERN extern
  29. #define INIT(x)
  30. #endif
  31.  
  32. /* need to know how many bits per hexadecimal digit for io */
  33. #define BITSPERDIG 4
  34. EXTERN char HexDigits[] INIT("0123456789ABCDEF");
  35.  
  36. /* define the face size - 48x48x1 */
  37. #define WIDTH 48
  38. #define HEIGHT WIDTH
  39.  
  40. /* total number of pixels and digits */
  41. #define PIXELS (WIDTH * HEIGHT)
  42. #define DIGITS (PIXELS / BITSPERDIG)
  43.  
  44. /* internal face representation - 1 char per pixel is faster */
  45. EXTERN char F[PIXELS];
  46.  
  47. /* output formatting word lengths and line lengths */
  48. #define DIGSPERWORD 4
  49. #define WORDSPERLINE (WIDTH / DIGSPERWORD / BITSPERDIG)
  50.  
  51. /* compressed output uses the full range of printable characters.
  52.  * in ascii these are in a contiguous block so we just need to know
  53.  * the first and last.  The total number of printables is needed too */
  54. #define FIRSTPRINT '!'
  55. #define LASTPRINT '~'
  56. #define NUMPRINTS (LASTPRINT - FIRSTPRINT + 1)
  57.  
  58. /* output line length for compressed data */
  59. #define MAXLINELEN 78
  60.  
  61. /* Portable, very large unsigned integer arithmetic is needed.
  62.  * Implementation uses arrays of WORDs.  COMPs must have at least
  63.  * twice as many bits as WORDs to handle intermediate results */
  64. #define WORD unsigned char
  65. #define COMP unsigned long
  66. #define BITSPERWORD 8
  67. #define WORDCARRY (1 << BITSPERWORD)
  68. #define WORDMASK (WORDCARRY - 1)
  69. #define MAXWORDS ((PIXELS * 2 + BITSPERWORD - 1) / BITSPERWORD)
  70.  
  71. typedef struct bigint
  72. {
  73.     int b_words;
  74.     WORD b_word[MAXWORDS];
  75. } BigInt;
  76.  
  77. EXTERN BigInt B;
  78.  
  79. /* This is the guess the next pixel table.  Normally there are 12 neighbour
  80.  * pixels used to give 1<<12 cases but in the upper left corner lesser
  81.  * numbers of neighbours are available, leading to 6231 different guesses */
  82. typedef struct guesses
  83. {
  84.     char g_00[1<<12];
  85.     char g_01[1<<7];
  86.     char g_02[1<<2];
  87.     char g_10[1<<9];
  88.     char g_20[1<<6];
  89.     char g_30[1<<8];
  90.     char g_40[1<<10];
  91.     char g_11[1<<5];
  92.     char g_21[1<<3];
  93.     char g_31[1<<5];
  94.     char g_41[1<<6];
  95.     char g_12[1<<1];
  96.     char g_22[1<<0];
  97.     char g_32[1<<2];
  98.     char g_42[1<<2];
  99. } Guesses;
  100.  
  101. /* data.h was established by sampling over 1000 faces and icons */
  102. EXTERN Guesses G
  103. #ifdef MAIN
  104. =
  105. #include "data.h"
  106. #endif
  107. ;
  108.  
  109. /* Data of varying probabilities are encoded by a value in the range 0 - 255.
  110.  * The probability of the data determines the range of possible encodings.
  111.  * Offset gives the first possible encoding of the range */
  112. typedef struct prob
  113. {
  114.     WORD p_range;
  115.     WORD p_offset;
  116. } Prob;
  117.  
  118. /* A stack of probability values */
  119. EXTERN Prob *ProbBuf[PIXELS * 2];
  120. EXTERN int NumProbs INIT(0);
  121.  
  122. /* Each face is encoded using 9 octrees of 16x16 each.  Each level of the
  123.  * trees has varying probabilities of being white, grey or black.
  124.  * The table below is based on sampling many faces */
  125.  
  126. #define BLACK 0
  127. #define GREY 1
  128. #define WHITE 2
  129.  
  130. EXTERN Prob levels[4][3]
  131. #ifdef MAIN
  132. =
  133. {
  134.     {{1, 255},    {251, 0},    {4, 251}},    /* Top of tree almost always grey */
  135.     {{1, 255},    {200, 0},    {55, 200}},
  136.     {{33, 223},    {159, 0},    {64, 159}},
  137.     {{131, 0},    {0, 0},     {125, 131}}    /* Grey disallowed at bottom */
  138. }
  139. #endif
  140. ;
  141.  
  142. /* At the bottom of the octree 2x2 elements are considered black if any
  143.  * pixel is black.  The probabilities below give the distribution of the
  144.  * 16 possible 2x2 patterns.  All white is not really a possibility and
  145.  * has a probability range of zero.  Again, experimentally derived data */
  146. EXTERN Prob freqs[16]
  147. #ifdef MAIN
  148. =
  149. {
  150.     {0, 0},     {38, 0},    {38, 38},    {13, 152},
  151.     {38, 76},    {13, 165},    {13, 178},    {6, 230},
  152.     {38, 114},    {13, 191},    {13, 204},    {6, 236},
  153.     {13, 217},    {6, 242},    {5, 248},    {3, 253}
  154. }
  155. #endif
  156. ;
  157.  
  158. #define ERR_OK        0    /* successful completion */
  159. #define ERR_EXCESS    1    /* completed OK but some input was ignored */
  160. #define ERR_INSUFF    -1    /* insufficient input.  Bad face format? */
  161. #define ERR_INTERNAL    -2    /* Arithmetic overflow or buffer overflow */
  162.  
  163. EXTERN int status;
  164.  
  165. EXTERN jmp_buf comp_env;
  166.  
  167. void ReadFace(), WriteFace();
  168. void CompAll(), Compress(), PushGreys();
  169. void UnCompAll(), UnCompress(), PopGreys();
  170. void BigAdd(), BigSub(), BigMul(), BigDiv(), BigClear();
  171. void BigPrint(), BigPush(), RevPush();
  172. void BigWrite(), BigRead();
  173. void GenFace(), UnGenFace();
  174.