DECLARE SUB FourBit () DECLARE SUB EightBit () '============================================================================= ' BMP VIEWER ' by ' Sam Westbrook ' Display RGB Encoded Bitmaps ' 16 Color: 640 X 480 ' 256 Color: 320 X 200 '----------------------------------------------------------------------------- ' Beta Version ' Released September 30, 1995 '============================================================================= DIM ZBaseSize AS STRING * 1 DIM YBaseSize AS STRING * 1 DIM ZExSize AS STRING * 1 DIM YExSize AS STRING * 1 DIM PicType AS STRING * 1 DIM PalArray&(16) DIM Title(1 TO 10000) DIM SHARED ZSize AS INTEGER DIM SHARED YSize AS INTEGER CLS SCREEN 12 PalArray&(0) = 65536 * 0 + 256 * 0 + 0 PalArray&(1) = 65536 * 0 + 256 * 0 + 16 PalArray&(2) = 65536 * 0 + 256 * 16 + 0 PalArray&(3) = 65536 * 0 + 256 * 16 + 16 PalArray&(4) = 65536 * 16 + 256 * 0 + 0 PalArray&(5) = 65536 * 16 + 256 * 0 + 16 PalArray&(6) = 65536 * 16 + 256 * 16 + 0 PalArray&(7) = 65536 * 24 + 256 * 24 + 24 PalArray&(8) = 65536 * 16 + 256 * 16 + 16 PalArray&(9) = 65536 * 0 + 256 * 0 + 32 PalArray&(10) = 65536 * 0 + 256 * 32 + 0 PalArray&(11) = 65536 * 0 + 256 * 32 + 32 PalArray&(12) = 65536 * 32 + 256 * 0 + 0 PalArray&(13) = 65536 * 32 + 256 * 0 + 32 PalArray&(14) = 65536 * 32 + 256 * 32 + 0 PalArray&(15) = 65536 * 32 + 256 * 32 + 32 PALETTE USING PalArray&(0) DEF SEG = VARSEG(Title(1)) '** Enter the correct path here: BLOAD "C:\AOL20\DOWNLOAD\TITLE.PIC", VARPTR(Title(1)) DEF SEG PUT (165, 125), Title DO: LOOP UNTIL INKEY$ <> "" PALETTE SCREEN 0 '** For Visual Basic users, you might want to put the ON ERROR RESUME NEXT '** statement here. LINE INPUT "Enter directory to search for BMP files: "; Dcry$ CLS IF RIGHT$(Dcry$, 1) = "\" THEN Dcry$ = Dcry$ ELSE Dcry$ = Dcry$ + "\" Dry$ = Dcry$ + "*.bmp" FILES Dry$ PRINT LINE INPUT "Enter a file to view: "; File$ Extntn$ = RIGHT$(File$, 4) Extntn$ = UCASE$(Extntn$) IF Extntn$ <> ".BMP" THEN File$ = File$ + ".BMP" File$ = UCASE$(File$) File$ = Dcry$ + File$ OPEN File$ FOR BINARY ACCESS READ AS #1 GET #1, 19, ZBaseSize GET #1, 20, ZExSize GET #1, 23, YBaseSize GET #1, 24, YExSize GET #1, 29, PicType ZSize = ASC(ZBaseSize) + (256 * ASC(ZExSize)) YSize = ASC(YBaseSize) + (256 * ASC(YExSize)) BitType = ASC(PicType) IF BitType = 4 THEN PicColors% = 16 IF BitType = 8 THEN PicColors% = 256 CLS PRINT "XDimension: "; ZSize PRINT "YDimension: "; YSize PRINT "Resolution: "; ZSize; "X"; YSize PRINT "Graphic Bits: "; BitType PRINT "Max. Colors: "; PicColors% PRINT PRINT "Press any key to view " + File$ DO: LOOP UNTIL INKEY$ <> "" IF BitType = 4 THEN CALL FourBit IF BitType = 8 THEN CALL EightBit: ELSE LOCATE 9, 1: PRINT "Invalid Bitmap" END SUB EightBit DIM HexCode AS STRING * 1 DIM PalArray&(256) DIM Red AS STRING * 1 DIM Green AS STRING * 1 DIM Blue AS STRING * 1 CLS SCREEN 13 FOR i% = 1 TO 256 GET #1, 55 + (i% * 4), Red GET #1, 55 + (i% * 4) + 1, Green GET #1, 55 + (i% * 4) + 2, Blue CCHex1% = INT(ASC(Red)) / 8 CCHex2% = INT(ASC(Green)) / 8 CCHex3% = INT(ASC(Blue)) / 8 PalArray&(i%) = 65536 * CCHex1% + 256 * CCHex2% + CCHex3% NEXT i% PALETTE USING PalArray&(0) '** I haven't yet developed a routine to detect where to start plotting '** pixels for 256 color bitmaps. If the picture isn't alligned right, '** adjust the X variable to straighten it. The value 1079 is the '** correct alignment for DMDEMO.BMP. X = 1079 Z = ZSize Y = YSize DO IF Z >= ZSize THEN Y = Y - 1 IF Z >= ZSize THEN Z = 0 X = X + 1 Z = Z + 1 GET #1, X, HexCode CC1% = ASC(HexCode) PSET (Z, Y), CC1% LOOP UNTIL Y = 0 AND Z = ZSize CLOSE #1 DO: LOOP UNTIL INKEY$ <> "" END END SUB SUB FourBit DIM HexCode AS STRING * 1 DIM Hex1 AS STRING * 1 DIM Hex2 AS STRING * 1 DIM PalArray&(16) DIM Red AS STRING * 1 DIM Green AS STRING * 1 DIM Blue AS STRING * 1 CLS SCREEN 12 FOR i% = 1 TO 16 GET #1, 55 + (i% * 4), Red GET #1, 55 + (i% * 4) + 1, Green GET #1, 55 + (i% * 4) + 2, Blue CCHex1% = INT(ASC(Red)) / 8 CCHex2% = INT(ASC(Green)) / 8 CCHex3% = INT(ASC(Blue)) / 8 PalArray&(i%) = 65536 * CCHex1% + 256 * CCHex2% + CCHex3% NEXT i% PALETTE USING PalArray&(0) X = 118 Z = ZSize Y = YSize DO IF Z >= ZSize THEN Y = Y - 1 IF Z >= ZSize THEN Z = 0 X = X + 1 Z = Z + 1 GET #1, X, HexCode Hex1 = LEFT$(HEX$(ASC(HexCode)), 1) Hex2 = RIGHT$(HEX$(ASC(HexCode)), 1) CC1% = VAL(Hex1) CC2% = VAL(Hex2) IF Hex1 = "A" THEN CC1% = 10 IF Hex1 = "B" THEN CC1% = 11 IF Hex1 = "C" THEN CC1% = 12 IF Hex1 = "D" THEN CC1% = 13 IF Hex1 = "E" THEN CC1% = 14 IF Hex1 = "F" THEN CC1% = 15 IF Hex2 = "A" THEN CC2% = 10 IF Hex2 = "B" THEN CC2% = 11 IF Hex2 = "C" THEN CC2% = 12 IF Hex2 = "D" THEN CC2% = 13 IF Hex2 = "E" THEN CC2% = 14 IF Hex2 = "F" THEN CC2% = 15 PSET (Z, Y), CC1%: Z = Z + 1 PSET (Z, Y), CC2% LOOP UNTIL Y = 0 AND Z = ZSize CLOSE #1 DO: LOOP UNTIL INKEY$ <> "" END END SUB