home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progbas / huffman.arj / DECOM.BAS < prev    next >
BASIC Source File  |  1991-12-25  |  3KB  |  135 lines

  1. '$DYNAMIC
  2. 'Huffman decompressor
  3. 'decompresses a screen 13 picture
  4. 'Rich Geldreich
  5. 'December 24, 1991
  6. 'You may use or modify this program in any way you wish.
  7.  
  8. DEFINT A-Z
  9. DECLARE FUNCTION Getbit ()
  10. DECLARE FUNCTION GetByte ()
  11.  
  12. 'striped down version of the tree
  13. 'this is loaded in from the compressed file
  14. TYPE NodeType
  15.     NextLeft AS INTEGER
  16.     NextRight AS INTEGER
  17.     Typ AS INTEGER
  18.     Contents AS INTEGER
  19. END TYPE
  20.  
  21. 'set up some usefull constants
  22. CONST Byte = -1, Number = 0
  23. CONST True = -1, False = NOT True
  24.  
  25. 'dim all vars; REDIM is used for all the data required
  26. REDIM Node(600) AS NodeType
  27. REDIM SHARED ByteBuffer(32760) AS STRING * 2
  28. DIM SHARED Position
  29. DIM SHARED Powers(8), Exps(9), BitsIn, BytesOut
  30.  
  31. 'set up the bit twiddling numbers for getbit and getbyte
  32. FOR A = 1 TO 8: Powers(A) = 2 ^ (8 - A): NEXT
  33. FOR A = 9 TO 0 STEP -1: Exps(A) = 2 ^ A: NEXT
  34.  
  35. 'load in all the data: note that the data is stored in pairs of two
  36. 'bytes in the array to allow 64k (QB only lets us have 32767
  37. 'elements in a string array)
  38. DEF SEG = VARSEG(ByteBuffer(0))
  39. BLOAD "screen.huf", VARPTR(ByteBuffer(0))
  40.  
  41. 'set some vars to trick the GetBit sub to get data from file
  42. 'on its very first call
  43. BitsIn = 8: BytesOut = 1
  44.  
  45. TempChar = 0
  46. Position = 0
  47.  
  48. 'Index is the number of nodes, RootIndex is the node at the top level where
  49. 'everything starts
  50. Index = GetByte
  51. RootIndex = GetByte
  52.  
  53. 'loads in the tree
  54. FOR A = 0 TO Index
  55.     Node(A).NextLeft = GetByte
  56.     Node(A).NextRight = GetByte
  57.    
  58.     'sees if the node contains any usefull data(a letter)
  59.     IF Getbit <> 0 THEN
  60.         Node(A).Typ = Byte
  61.         Node(A).Contents = 0
  62.         FOR B = 1 TO 8
  63.             IF Getbit <> 0 THEN
  64.                 Node(A).Contents = Node(A).Contents + Powers(B)
  65.             END IF
  66.         NEXT
  67.     ELSE
  68.     'nope, it just has a number
  69.     'since the number isn't needed, it's not sent so it doesn't     
  70.     'waste space
  71.         Node(A).Typ = Number
  72.     END IF
  73.  
  74. NEXT
  75. 'switch to screen 13 VGA
  76. SCREEN 13, , 0, 0
  77. 'show our progress
  78. LINE (0, 0)-(319, 199), 14, BF
  79. 'start decompressing
  80. FOR X = 0 TO 319
  81.     FOR Y = 0 TO 199
  82.         'switch pointer to top
  83.         Current = RootIndex
  84.         'go down the tree
  85.         DO
  86.             'see if we go left or right
  87.             IF Getbit <> 0 THEN
  88.                 Current = Node(Current).NextRight
  89.             ELSE
  90.                 Current = Node(Current).NextLeft
  91.             END IF
  92.         'stop when we reach a letter
  93.         LOOP UNTIL Node(Current).Typ = Byte
  94.         'set a pixel
  95.         PSET (X, Y), Node(Current).Contents
  96.     NEXT
  97. NEXT
  98. 'beep when where all done
  99. BEEP
  100. A$ = INPUT$(1)
  101. END
  102.  
  103.  
  104. REM $STATIC
  105. 'gets a single bit from buffer
  106. FUNCTION Getbit STATIC
  107.     BitsIn = BitsIn + 1
  108.     IF BitsIn = 9 THEN
  109.         BytesOut = BytesOut + 1
  110.         IF BytesOut = 2 THEN
  111.             TempByte$ = ByteBuffer(Position)
  112.             Position = Position + 1
  113.             BytesOut = 0
  114.             TempChar = ASC(TempByte$)
  115.             NextChar = ASC(RIGHT$(TempByte$, 1))
  116.         ELSE
  117.             TempChar = NextChar
  118.         END IF
  119.         BitsIn = 1
  120.     END IF
  121.     Getbit = TempChar AND Powers(BitsIn)
  122. END FUNCTION
  123.  
  124. 'gets ten bits from file
  125. FUNCTION GetByte
  126.     B = 0
  127.     FOR A = 9 TO 0 STEP -1
  128.         IF Getbit <> 0 THEN
  129.             B = B + Exps(A)
  130.         END IF
  131.     NEXT
  132.     GetByte = B
  133. END FUNCTION
  134.  
  135.