Area: Quik_Bas Msg: #760 Date: 06-18-92 16:46 (Public) From: Steve Gartrell To: All Subject: Compressor, Improved...
'Here I go again...This is a faster version of my compression 'routine I posted yesterday. This one will handle worst-case 'screen 13 pictures, although the compression will turn into 'expansion. But fast. Likewise, the 16 color sub now uses 'BSAVE/BLOAD, so is faster. Both subs now use LINE in place 'of PSET/PRESET; definitely faster. This is probably all for 'this week (or two); I'm hard up against the part of my work 'schedule that demands my allocating "family time". One more 'note: The 16 color sub "FourBit" makes a call to a graphics 'routine I posted in assembly with the object listing last 'month. If you don't have it, gee...You're screwed. Well, 'not exactly. Just change the call to ReadPix and so on back 'to the way the first posting had it. (You really are screwed, 'however...POINT is damned slow.) If demand exists, I suppose 'I could repost READPIX.ASM/OBJ....|-} DEFINT A-Z DECLARE SUB ReadPix (SEG ColorBytes AS INTEGER, SEG StartX%,_ SEG StartY%, SEG EndX%, SEG EndY%) DECLARE SUB FourBits () DECLARE SUB EightBits () CONST BufSize% = 32000 CONST MaxedOut% = 32001 CONST C$ = "Created 06/17/92 by Steve Gartrell. No rights reserved." SCREEN 13, , 0, 0 REDIM SHARED FileBuffer%(1 TO 32000), ColorBytes(0 TO 639) DO FourBits DO: t$ = UCASE$(INKEY$): LOOP UNTIL LEN(t$) IF t$ = "Q" THEN EXIT DO EightBits DO: t$ = UCASE$(INKEY$): LOOP UNTIL LEN(t$) IF t$ = "Q" THEN EXIT DO LOOP SCREEN 0 WIDTH 80 COLOR 7, 0 END SUB EightBits REDIM FileBuffer%(1 TO BufSize%) REDIM FileNameArray(0 TO 4) AS STRING * 12 FOR cnt% = 0 TO 4 FileNameArray(cnt%) = "256PRES" + LTRIM$(STR$(cnt%)) + ".GRF" NEXT cnt% SCREEN 13 'make some graphics-borrowed from Rich Geldreich!!! FOR A = 1 TO 400 RANDOMIZE TIMER IF RND > .05 THEN LINE -(RND * 320, RND * 200), RND * 255 ELSE LINE -(RND * 320, RND * 200), RND * 255, BF END IF NEXT COLOR 15 LOCATE 25, 1: PRINT "320 x 200"; FileNum% = FREEFILE OPEN "256PRESS.GRF" FOR BINARY AS FileNum% IF LOF(FileNum%) <> 0 THEN CLOSE FileNum% KILL "256PRESS.GRF" ELSE CLOSE FileNum% END IF cell% = 1 ByteCnt& = 1 FilePtr% = 0 FOR x% = 0 TO 319 CurColorPix% = POINT(x%, 0) ColorWord& = CurColorPix% * &H100& FOR y% = 0 TO 199 ThisPixColor% = POINT(x%, y%) IF ThisPixColor% = CurColorPix% THEN ColorWord& = ColorWord& + 1 ELSE IF ColorWord& > 32767 THEN ColorWord& = ((-ColorWord& - 1) XOR &HFFFFFFFF) - 65536 END IF FileBuffer%(cell%) = CINT(ColorWord&) cell% = cell% + 1 IF cell% = MaxedOut% THEN DEF SEG = VARSEG(FileBuffer%(1)) BSAVE FileNameArray(FilePtr%), VARPTR(FileBuffer%(1)), 64000 DEF SEG FilePtr% = FilePtr% + 1 cell% = 1 END IF CurColorPix% = ThisPixColor% ColorWord& = CurColorPix% * &H100& + 1& END IF NEXT LINE (x%, 0)-(x%, 199), 0 IF ColorWord& > 32767 THEN ColorWord& = ((-ColorWord& - 1) XOR &HFFFFFFFF) - 65536 END IF FileBuffer%(cell%) = CINT(ColorWord&) cell% = cell% + 1 IF cell% = MaxedOut% THEN DEF SEG = VARSEG(FileBuffer%(1)) BSAVE FileNameArray(FilePtr%), VARPTR(FileBuffer%(1)), 64000 DEF SEG FilePtr% = FilePtr% + 1 cell% = 1 END IF NEXT LOCATE 9, 1 Total& = cell% * 2& + (FilePtr% * 64000) + (7 * (FilePtr% + 1)) PRINT "Screen reduced to "; LTRIM$(STR$(Total&)); " bytes."; IF cell% > 1 THEN LOCATE 10, 1: PRINT "Saving to file."; cell& = cell% * 2& DEF SEG = VARSEG(FileBuffer%(1)) BSAVE FileNameArray(FilePtr%), VARPTR(FileBuffer%(1)), cell& DEF SEG END IF BEEP: BEEP: BEEP LOCATE 10, 1: PRINT "Press any key to decompress."; DO: LOOP UNTIL INKEY$ <> "" CLS FilePtr% = 0 FileNum% = FREEFILE OPEN FileNameArray(FilePtr%) FOR BINARY AS FileNum% cell% = (LOF(FileNum%) - 7) \ 2 CLOSE FileNum% REDIM FileBuffer%(1 TO cell%) DEF SEG = VARSEG(FileBuffer%(1)) BLOAD FileNameArray(0), VARPTR(FileBuffer%(1)) DEF SEG BitCnt% = 0 x% = 0 cell% = 1 DO ColorWord% = FileBuffer%(cell%) cell% = cell% + 1 IF cell% = MaxedOut% THEN FilePtr% = FilePtr% + 1 FileNum% = FREEFILE OPEN FileNameArray(FilePtr%) FOR BINARY AS FileNum% cell% = (LOF(FileNum%) - 7) \ 2 CLOSE FileNum% REDIM FileBuffer%(1 TO cell%) DEF SEG = VARSEG(FileBuffer%(1)) BLOAD FileNameArray(FilePtr%), VARPTR(FileBuffer%(1)) DEF SEG cell% = 1 END IF IF ColorWord% < 0 THEN ColorWord& = ABS(((CLNG(ColorWord%) + 65536) XOR &HFFFF) + 1) ELSE ColorWord& = CLNG(ColorWord%) END IF PixCnt% = ColorWord& MOD &H100 PixColor% = ColorWord& \ &H100 EndPix% = (BitCnt% + PixCnt%) - 1 LINE (x%, BitCnt%)-(x%, EndPix%), PixColor% BitCnt% = BitCnt% + PixCnt% IF BitCnt% = 200 THEN BitCnt% = 0 x% = x% + 1 IF x% = 320 THEN EXIT DO END IF END IF LOOP BEEP: BEEP: BEEP END SUB SUB FourBits REDIM FileBuffer%(1 TO BufSize%) REDIM FileNameArray(0 TO 4) AS STRING * 12 FOR cnt% = 0 TO 4 FileNameArray(cnt%) = "16PRESS" + LTRIM$(STR$(cnt%)) + ".GRF" NEXT cnt% SCREEN 12 -end- ~~
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET