home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / basic / bmag / icoicns.bas < prev    next >
Encoding:
BASIC Source File  |  1994-04-26  |  5.6 KB  |  171 lines

  1. '─ Area: F-QUICKBASIC ─────────────────────────────────────────────────────────
  2. '  Msg#: 438                                          Date: 14 Apr 94  00:22:00
  3. '  From: Howard Hull Jr                               Read: Yes    Replied: No 
  4. '    To: Mae Taylor                                   Mark:                     
  5. '  Subj: *.Icos To *.Icns      1/2
  6. '──────────────────────────────────────────────────────────────────────────────
  7. '   Mae, here is a sub that will open a .ICO file display it on screen.
  8. 'Once on screen it can be BSAVEd to disk, then all you would have to
  9. 'do is BLOAD the new file and display it where ever you wish.
  10. 'You could also include a DIR$ routine that would read entire directories
  11. 'of icons displaying each, change the file name from ICONFILE.ICO to
  12. 'ICONFILE.ICN, and then BSAVE it.
  13.  
  14.  
  15.  '******* CODE START
  16.  DECLARE SUB Convert (IconFileName$) DEFINT A-Z
  17. 'Don't leave home without it '----- TYPE DECLARATIONS TYPE IconDirEntry
  18.    idWide AS STRING * 1          'In pixels (16, 32, 64)
  19.    idHigh AS STRING * 1          'In pixels (16, 32, 64)
  20.    idColorCount AS STRING * 1    'Number of colors (2, 8, 16)
  21.    idReserved AS STRING * 1
  22.    idPlanes AS INTEGER           'Number of color planes
  23.    idBitCount AS INTEGER         'Number of bits in icon
  24.    idBytesInRes AS LONG          'Size of Icon in bytes
  25.    idImageOffset AS LONG         'Offset to image data
  26. END TYPE
  27.  
  28. TYPE IconDir
  29.    idReserved AS INTEGER         'Always Zero
  30.    idType AS INTEGER             'Usually set to 1
  31.    idCount AS INTEGER            'Number of entries in directory
  32.    idEntries  AS IconDirEntry
  33. END TYPE
  34.  
  35. TYPE BitMapInfoHeader
  36.    biSize AS LONG                'Number bytes in header
  37.    biWide AS LONG                'In pixels
  38.    biHigh AS LONG                'In pixels
  39.    biPlanes AS INTEGER           'Set to 1
  40.    biBitCount AS INTEGER         'Bits per pixel (1,4,8,24)
  41.    biCompress AS LONG            'RGB or RLE4, RLE8
  42.    biImageSize AS LONG           'In Bytes. Can be 0 if RGB
  43.    biXpels AS LONG               'Target device
  44.    biYpels AS LONG               'Target device
  45.    biColrUsed AS LONG            'Used in Color table. 0=Max
  46.    biColrImportant AS LONG       '0=All
  47. END TYPE
  48.  
  49. TYPE RGBQuad
  50.    rgbBlue AS STRING * 1         'Range 0 to 255
  51.    rgbGreen AS STRING * 1
  52.    rgbRed AS STRING * 1
  53.    rgbReserved AS STRING * 1
  54. END TYPE
  55.  
  56. TYPE ImageXOR
  57.    icXOR AS STRING * 1
  58. END TYPE
  59.  
  60. TYPE ImageAND
  61.    icAND AS STRING * 1
  62. END TYPE
  63.  
  64. '----- HOUSEKEEPING
  65. DIM SHARED icID AS IconDir
  66. DIM SHARED bmID AS BitMapInfoHeader
  67.  
  68. SCREEN 12
  69. CALL Convert(IconFile$, NewFile$, 100, 100)
  70. SCREEN 0
  71. END
  72.  
  73.  
  74. SUB Convert (IconFileName$, TLine, LEdge)
  75. '----- ICON FILE HANDLING              'Put your input routine here
  76. IconFile = FREEFILE
  77. OPEN IconFileName$ FOR BINARY AS IconFile
  78.  
  79. NewFile$ = GetNewFile$(IconFileName$)
  80. '----- GET ICON INFORMATION
  81. GET #IconFile, , icID
  82. LOCATE 1, 1: PRINT "ICON: " + IconFileName$; "  =>   "; NewFile$
  83. LOCATE 2, 1: PRINT "Sizes - File:" + STR$(LOF(IconFile));
  84.              PRINT " Resource:"; icID.idEntries.idBytesInRes
  85. LOCATE 3, 1: PRINT " Icon - W:"; ASC(icID.idEntries.idWide);
  86.              PRINT "x H:"; ASC(icID.idEntries.idHigh);
  87.              PRINT "Colors:"; ASC(icID.idEntries.idColorCount)
  88.  
  89. '----- THIS ROUTINE WILL READ 766 BYTE ICON FILE ONLY. 
  90. '----- ALTHOUGH IT CAN BE MODIFIED FOR WINDOWS .DLL FILES
  91. '----- AND .EXE FILES THAT ALSO CONTAIN ICONS. I DON'T 
  92. '----- YET HAVE THE INFORMATION TO DO THIS.
  93. IF LOF(IconFile) <> 766 THEN CLOSE IconFile: EXIT SUB
  94.  
  95. '----- GET BITMAP INFORMATION
  96. GET #IconFile, , bmID
  97. LOCATE 4, 1: PRINT "Bits/Pixel:"; bmID.biBitCount
  98.  
  99. '----- LOAD COLOR TABLE
  100. REDIM ColrTbl(1 TO ASC(icID.idEntries.idColorCount)) AS RGBQuad
  101. FOR i = LBOUND(ColrTbl) TO UBOUND(ColrTbl)
  102.    GET #IconFile, , ColrTbl(i)
  103. NEXT i
  104.  
  105. '----- LOAD IMAGE XOR TABLE
  106. TblSize = (ASC(icID.idEntries.idWide) * ASC(icID.idEntries.idHigh)) \ 2
  107. REDIM XORTbl(1 TO TblSize) AS ImageXOR
  108.    FOR i = 1 TO UBOUND(XORTbl)
  109.       GET #IconFile, , XORTbl(i)
  110.    NEXT i
  111.  
  112. '----- LOAD IMAGE AND TABLE
  113. TblSize = (ASC(icID.idEntries.idWide) * ASC(icID.idEntries.idHigh)) \ 8
  114. REDIM ANDTbl(1 TO TblSize) AS ImageAND
  115.    FOR i = 1 TO UBOUND(ANDTbl)
  116.       GET #IconFile, , ANDTbl(i)
  117.    NEXT i
  118. CLOSE IconFile
  119.  
  120. '-----
  121. icWide = ASC(icID.idEntries.idWide)
  122. icHigh = ASC(icID.idEntries.idHigh)
  123. REDIM ImageArray(1 TO icHigh, 1 TO icWide) AS INTEGER
  124. TblPtr = UBOUND(ANDTbl)
  125. FOR Row = 1 TO icHigh STEP 1
  126.    FOR Col = icWide TO 1 STEP -8
  127.       FOR i = 0 TO 7
  128.          BitMap = ASC(ANDTbl(TblPtr).icAND)
  129.          IF BitMap AND 2 ^ i THEN
  130.             'Colr = 15
  131.             Colr = 7
  132.          ELSE
  133.             Colr = 0
  134.          END IF
  135.          ImageArray(Col - i, Row) = Colr
  136.       NEXT i
  137.       TblPtr = TblPtr - 1
  138.    NEXT Col
  139. NEXT Row
  140.  
  141. TblPtr = UBOUND(XORTbl)
  142. FOR Row = 1 TO icHigh STEP 1
  143.    FOR Col = icWide TO 1 STEP -2
  144.          ColrMap = ASC(XORTbl(TblPtr).icXOR)
  145.          Colr = (&HF0 XOR ColrMap) MOD 16
  146.          ImageArray(Col, Row) = ImageArray(Col, Row) XOR Colr
  147.          Colr = (&HF XOR ColrMap) \ 16
  148.          ImageArray(Col - 1, Row) = ImageArray(Col - 1, Row) XOR Colr
  149.          TblPtr = TblPtr - 1
  150.       NEXT Col
  151. NEXT Row
  152.  
  153. '----- DISPLAY ICON
  154. BLine = TLine + ASC(icID.idEntries.idWide) - 1
  155. REdge = LEdge + ASC(icID.idEntries.idWide) - 1
  156. LINE (116, 68)-(156, 108), 7, BF
  157. FOR Row = 1 TO icHigh
  158.    FOR Col = 1 TO icWide
  159.       PSET ((LEdge - 1) + Row, (TLine - 1) + Col), ImageArray(Row, Col)
  160.    NEXT Col
  161. NEXT Row
  162.  
  163. ' * BSAVE Icon
  164. DIM TempArray(804)
  165. GET (LEdge - 4, TLine - 4)-(REdge + 4, BLine + 4), TempArray(0)
  166. DEF SEG = VARSEG(TempArray(0))
  167. BSAVE NewFile$, VARPTR(TempArray(0)), 804
  168. DEF SEG
  169.  
  170. END SUB
  171.