home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / Basic / READGIF.ZIP / GIFREAD.BAS < prev    next >
Encoding:
BASIC Source File  |  1991-04-01  |  9.2 KB  |  418 lines

  1. DECLARE SUB AddToPixel (index%)
  2. DECLARE SUB DoClear ()
  3. DECLARE SUB ReadCode ()
  4. DECLARE SUB ReadFile (handle%, bytes%)
  5. DECLARE SUB ReadRaster ()
  6. DECLARE SUB ReInitialize ()
  7. DECLARE SUB DetColor (pvalue%, mapvalue%)
  8. DECLARE SUB DetColor13 (pvalue%, mapvalue%)
  9. DECLARE FUNCTION GetByte% ()
  10. DECLARE FUNCTION GetWord% ()
  11.  
  12. REM GIF read/display in QB (a hack of GIFSLOW.PAS)
  13. REM 01-Apr-1991 v1.00
  14. REM Cornel Huth
  15. REM -------------------------------------------------------------------------
  16. REM This is fine to look at but not to actually use in a program. BUT -
  17. REM QBXGRAF v2.0 is a complete assembly language graphics library enhance-
  18. REM ment to QuickBASIC+PDS EGA/VGA graphics. Fast GIF read with configurable
  19. REM display is included as are patterned lines and fills, fast arcade-
  20. REM like bitblt animation, complete 2-D and 3-D transformation routines
  21. REM so fast that it'll make your head spin! 800x600x16, EMS/XMS support.
  22. REM Lots more. Coming soon to a shareware outlet near you. Look for it.
  23. REM -------------------------------------------------------------------------
  24.  
  25. DEFINT A-Z
  26. CONST FALSE = 0, TRUE = NOT FALSE
  27.  
  28. CONST RasterSize = 32000                'BASIC and its lack of unsigned
  29.                     'integers means we kludge (a lot).
  30. DIM SHARED ByteOffset AS LONG           'GIFREAD.BAS will not handle complex
  31. DIM SHARED BitOffset AS LONG            'GIFs (especially interlaced ones)
  32.                     'though with work you can use a size.
  33. DIM SHARED Wide AS INTEGER
  34. DIM SHARED Height AS INTEGER
  35. DIM SHARED LeftOfs AS INTEGER
  36. DIM SHARED TopOfs AS INTEGER
  37. DIM SHARED RWidth AS INTEGER
  38. DIM SHARED RHeight AS INTEGER
  39. DIM SHARED ClearCode AS INTEGER
  40. DIM SHARED EOFCode AS INTEGER
  41. DIM SHARED OutCount AS INTEGER
  42. DIM SHARED MaxCode AS INTEGER
  43. DIM SHARED Code AS INTEGER
  44. DIM SHARED CurCode AS INTEGER
  45. DIM SHARED OldCode AS INTEGER
  46. DIM SHARED InCode AS INTEGER
  47. DIM SHARED FirstFree AS INTEGER
  48. DIM SHARED FreeCode AS INTEGER
  49. DIM SHARED GIFptr AS INTEGER
  50. DIM SHARED RasterPtr AS INTEGER
  51. DIM SHARED XC AS INTEGER
  52. DIM SHARED YC AS INTEGER
  53. DIM SHARED ReadMask AS INTEGER
  54.  
  55. DIM SHARED Interlace AS INTEGER
  56. DIM SHARED ColorMap AS INTEGER
  57. DIM SHARED ColorMapSize AS INTEGER
  58. DIM SHARED char AS STRING * 1
  59.  
  60. DIM SHARED CodeSize AS INTEGER
  61. DIM SHARED InitCodeSize AS INTEGER
  62. DIM SHARED FinChar AS INTEGER
  63. DIM SHARED Pass AS INTEGER
  64. DIM SHARED BitMask AS INTEGER
  65. DIM SHARED R AS INTEGER, G AS INTEGER, B AS INTEGER
  66. DIM SHARED videomode AS INTEGER
  67.  
  68. REM $DYNAMIC
  69. DIM SHARED Prefix(0 TO 4095) AS INTEGER
  70. DIM SHARED Suffix(0 TO 4095) AS INTEGER
  71.  
  72. DIM SHARED OutCode(0 TO 1024) AS INTEGER
  73.  
  74. DIM SHARED palet(0 TO 255) AS LONG
  75.  
  76. DIM SHARED MaxCodes(0 TO 9) AS INTEGER
  77. DIM SHARED Masks(0 TO 9) AS INTEGER
  78.  
  79. DIM SHARED Raster(0 TO RasterSize) AS STRING * 1
  80. DIM SHARED GIFstuff(0 TO RasterSize) AS STRING * 1
  81.  
  82.  
  83. CLS
  84. ReInitialize
  85.  
  86. videomode = 13  'PORSCHE.GIF is 320x200x32 so use mode 13
  87. filename$ = "porsche.gif"
  88. PRINT "Reading file: "; filename$; "...";
  89.  
  90. OPEN filename$ FOR BINARY AS #1
  91. fsize& = LOF(1)
  92. IF fsize& > RasterSize THEN fsize& = RasterSize
  93. bytes = fsize&
  94.  
  95. ReadFile 1, bytes
  96. CLOSE #1
  97. PRINT "done."
  98. PRINT
  99.  
  100. FileString$ = ""
  101. FOR i = 1 TO 6
  102.    FileString$ = FileString$ + CHR$(GetByte)
  103. NEXT
  104. IF FileString$ <> "GIF87a" THEN PRINT "Not a GIF": STOP
  105.  
  106. RWidth = GetWord
  107. RHeight = GetWord
  108. B = GetByte
  109. IF B AND &H80 = &H80 THEN ColorMap = TRUE ELSE ColorMap = FALSE
  110. Resolution = (B AND &H70) \ 16 + 1
  111. BitsPerPixel = (B AND 7) + 1
  112. ColorMapSize = 1 * (2 ^ BitsPerPixel)
  113. BitMask = ColorMapSize - 1
  114. BackGround = GetByte
  115. B = GetByte
  116. PRINT "Color Rez:"; Resolution;
  117. PRINT " Number of Colors:"; ColorMapSize;
  118. PRINT " BG:"; BackGround; "  COLOR MAP follows:": PRINT
  119.  
  120. IF ColorMap THEN
  121.    FOR i = 0 TO ColorMapSize - 1
  122.       Red = GetByte
  123.       Green = GetByte
  124.       Blue = GetByte
  125.       IF videomode < 10 THEN
  126.      DetColor R, Red
  127.      DetColor G, Green
  128.      DetColor B, Blue
  129.      pal = (B AND 1) + (2 * (G AND 1)) + (4 * (R AND 1)) + (8 * (B \ 2)) + (16 * (G \ 2)) + (32 * (R \ 2))
  130.      palet(i) = pal
  131.      PRINT i; HEX$(Red); ","; HEX$(Green); ","; HEX$(Blue); "->"; HEX$(R); ","; HEX$(G); ","; HEX$(B); "="; pal,
  132.       ELSE
  133.      DetColor13 R, Red
  134.      DetColor13 G, Green
  135.      DetColor13 B, Blue
  136.      pal& = 65536 * B + 256 * G + R
  137.      palet(i) = pal&
  138.      PRINT i; HEX$(Red); ","; HEX$(Green); ","; HEX$(Blue); "->"; HEX$(R); ","; HEX$(G); ","; HEX$(B),
  139.       END IF
  140.    NEXT
  141.    palet(0) = BackGround
  142. END IF
  143. PRINT
  144.  
  145. B = GetByte
  146. LeftOfs = GetWord
  147. TopOfs = GetWord
  148. Wide = GetWord
  149. Height = GetWord
  150. A = GetByte
  151. IF A AND &H40 = &H40 THEN Interlace = TRUE ELSE Interlace = FALSE
  152. PRINT
  153. PRINT "Left/top offset:"; LeftOfs; ","; TopOfs
  154. PRINT "Width x height/interlace:"; Wide; "x"; Height; ","; Interlace
  155.  
  156. CodeSize = GetByte
  157. ClearCode = 2 ^ CodeSize
  158. EOFCode = ClearCode + 1
  159. FirstFree = ClearCode + 2
  160. FreeCode = FirstFree
  161. PRINT
  162. PRINT "Clear code/EOF code:"; ClearCode; ","; EOFCode
  163.  
  164. CodeSize = CodeSize + 1
  165. InitCodeSize = CodeSize
  166. MaxCode = MaxCodes(CodeSize - 2)
  167. ReadMask = Masks(CodeSize - 3)
  168. PRINT
  169. PRINT "Unblocking"
  170.  
  171. ReadRaster
  172.  
  173. OutCount = 0
  174.  
  175. PRINT "  Press a key and wait (a while)..."
  176. DO: LOOP WHILE INKEY$ = ""
  177.  
  178. 'GIFREAD works with any graphics mode provided enough room
  179. 'PALETTE USING only for EGA/VGA
  180.  
  181. SCREEN videomode
  182. IF ColorMap AND videomode > 8 THEN PALETTE USING palet(0)
  183.  
  184. LOCATE 1, 1: PRINT "Hold"
  185. PRINT "on..."
  186. LOCATE 25, 1: PRINT "This might take a while...";
  187. DO
  188.    ReadCode
  189.    IF Code <> EOFCode THEN
  190.       IF Code = ClearCode THEN
  191.      DoClear
  192.      ReadCode
  193.      CurCode = Code
  194.      OldCode = Code
  195.      FinChar = Code AND BitMask
  196.      AddToPixel FinChar
  197.       ELSE
  198.      CurCode = Code
  199.      InCode = Code
  200.      IF Code >= FreeCode THEN
  201.         CurCode = OldCode
  202.         OutCode(OutCount) = FinChar
  203.         OutCount = OutCount + 1
  204.      END IF
  205.      IF CurCode > BitMask THEN
  206.         DO
  207.            OutCode(OutCount) = Suffix(CurCode)
  208.            OutCount = OutCount + 1
  209.            CurCode = Prefix(CurCode)
  210.         LOOP UNTIL CurCode <= BitMask
  211.      END IF
  212.  
  213.      FinChar = CurCode AND BitMask
  214.      OutCode(OutCount) = FinChar
  215.      OutCount = OutCount + 1
  216.  
  217.      FOR i = OutCount - 1 TO 0 STEP -1
  218.         AddToPixel OutCode(i)
  219.      NEXT
  220.      OutCount = 0
  221.  
  222.      Prefix(FreeCode) = OldCode
  223.      Suffix(FreeCode) = FinChar
  224.      OldCode = InCode
  225.  
  226.      FreeCode = FreeCode + 1
  227.      IF FreeCode >= MaxCode THEN
  228.         IF CodeSize < 12 THEN
  229.            CodeSize = CodeSize + 1
  230.            MaxCode = MaxCode * 2
  231.            ReadMask = Masks(CodeSize - 3)
  232.         END IF
  233.      END IF
  234.       END IF
  235.  
  236.       in$ = INKEY$
  237.       IF in$ <> "" THEN Code = EOFCode
  238.    END IF
  239. LOOP UNTIL Code = EOFCode
  240. BEEP
  241. SLEEP
  242. SCREEN 0
  243. SYSTEM
  244.  
  245. REM $STATIC
  246. SUB AddToPixel (index)
  247.  
  248. IF videomode <> 13 THEN index = index AND 15
  249. PSET (XC, YC), index
  250.  
  251. XC = XC + 1
  252. IF XC = Wide THEN
  253.    XC = 0
  254.    IF NOT Interlace THEN
  255.       YC = YC + 1
  256.    ELSE
  257.       SELECT CASE Pass
  258.       CASE 0
  259.      YC = YC + 8
  260.      IF YC >= Height THEN
  261.         Pass = Pass + 1
  262.         YC = 4
  263.      END IF
  264.       CASE 1
  265.      YC = YC + 8
  266.      IF YC >= Height THEN
  267.         Pass = Pass + 1
  268.         YC = 2
  269.      END IF
  270.       CASE 2
  271.      YC = YC + 4
  272.      IF YC >= Height THEN
  273.         Pass = Pass + 1
  274.         YC = 1
  275.      END IF
  276.       CASE 3
  277.      YC = YC + 2
  278.       CASE ELSE
  279.       END SELECT
  280.    END IF
  281. END IF
  282.  
  283. END SUB
  284.  
  285. SUB DetColor (pvalue, mapvalue)
  286.  
  287. pvalue = mapvalue \ 64 '(2 bits per color component (R/G/B) on EGA/VGA)
  288. IF pvalue = 1 THEN      'switch for some reason...
  289.    pvalue = 2
  290. ELSEIF pvalue = 2 THEN
  291.    pvalue = 1
  292. END IF
  293.  
  294. END SUB
  295.  
  296. SUB DetColor13 (pvalue, mapvalue)
  297.  
  298. pvalue = mapvalue \ 4 '(6 bits per color component (R/G/B) on VGA13)
  299.  
  300. END SUB
  301.  
  302. SUB DoClear
  303.  
  304. CodeSize = InitCodeSize
  305. MaxCode = MaxCodes(CodeSize - 2)
  306. FreeCode = FirstFree
  307. ReadMask = Masks(CodeSize - 3)
  308.  
  309. END SUB
  310.  
  311. FUNCTION GetByte
  312.  
  313. IF GIFptr > RasterSize THEN
  314.    PRINT "Maxed-out raster buffer."
  315.    STOP
  316. END IF
  317. GetByte = ASC(GIFstuff(GIFptr))
  318. GIFptr = GIFptr + 1
  319.  
  320. END FUNCTION
  321.  
  322. FUNCTION GetWord
  323.  
  324. A = GetByte
  325. B = GetByte
  326. GetWord = 256 * B + A
  327.  
  328. END FUNCTION
  329.  
  330. SUB ReadCode
  331.  
  332. ByteOffset = BitOffset \ 8
  333.  
  334. A& = (256& * ASC(Raster(ByteOffset + 1))) + ASC(Raster(ByteOffset))
  335. IF CodeSize > 8 THEN
  336.    B = ASC(Raster(ByteOffset + 2))
  337.    Rawcode& = 65536 * B + A&
  338. ELSE
  339.    Rawcode& = A&
  340. END IF
  341.  
  342. Rawcode& = Rawcode& \ (2 ^ (BitOffset MOD 8))
  343. Code = Rawcode& AND ReadMask
  344.  
  345. BitOffset = BitOffset + CodeSize
  346.  
  347. END SUB
  348.  
  349. SUB ReadFile (handle, bytes)
  350.  
  351. FOR i = 0 TO (bytes - 1)
  352.    GET #handle, , char
  353.    GIFstuff(i) = char
  354. NEXT
  355.  
  356.  
  357. END SUB
  358.  
  359. SUB ReadRaster
  360.  
  361. RasterPtr = 0
  362. DO
  363.    BlockLength = GetByte
  364.    FOR i = 0 TO BlockLength - 1
  365.       IF GIFptr = RasterSize THEN
  366.      PRINT "File size exceeds program limits"
  367.      STOP
  368.       END IF
  369.       
  370.       Raster(RasterPtr) = CHR$(GetByte)
  371.       LOCATE , 1: PRINT RasterPtr;
  372.  
  373.       RasterPtr = RasterPtr + 1
  374.       IF RasterPtr > RasterSize + 1 THEN
  375.      PRINT "Raster fill maxed-out"
  376.      STOP
  377.       END IF
  378.  
  379.    NEXT
  380. LOOP UNTIL BlockLength = 0
  381.  
  382. ERASE GIFstuff
  383.  
  384. END SUB
  385.  
  386. SUB ReInitialize
  387.  
  388. XC = 0
  389. YC = 0
  390. Pass = 0
  391. BitOffset = 0
  392. GIFptr = 0
  393.  
  394. MaxCodes(0) = 4
  395. MaxCodes(1) = 8
  396. MaxCodes(2) = 16
  397. MaxCodes(3) = 32
  398. MaxCodes(4) = 64
  399. MaxCodes(5) = 128
  400. MaxCodes(6) = 256
  401. MaxCodes(7) = 512
  402. MaxCodes(8) = 1024
  403. MaxCodes(9) = 2048
  404.  
  405. Masks(0) = 7
  406. Masks(1) = 15
  407. Masks(2) = 31
  408. Masks(3) = 63
  409. Masks(4) = 127
  410. Masks(5) = 255
  411. Masks(6) = 511
  412. Masks(7) = 1023
  413. Masks(8) = 2047
  414. Masks(9) = 4095
  415.  
  416. END SUB
  417.  
  418.