WindowsIconReader.st
changeset 1167 78084516ae7c
parent 1073 1e1450185eb8
child 1168 590e5660f69e
equal deleted inserted replaced
1166:4892defb2ab6 1167:78084516ae7c
   358         ^ self fromOS2Stream:aStream
   358         ^ self fromOS2Stream:aStream
   359     ].
   359     ].
   360     (header startsWith:#(16r53 16r5A)) ifTrue:[     "SZ"
   360     (header startsWith:#(16r53 16r5A)) ifTrue:[     "SZ"
   361         'WinIconReader [warning]: OS/2 SZ format not supported:' infoPrintNL.
   361         'WinIconReader [warning]: OS/2 SZ format not supported:' infoPrintNL.
   362         ^ nil.
   362         ^ nil.
   363         aStream position:1.
   363 "/        aStream position:1.
   364         'WinIconReader [info]: OS/2 SZ format' infoPrintNL.
   364 "/        'WinIconReader [info]: OS/2 SZ format' infoPrintNL.
   365         ^ self fromOS2Stream:aStream
   365 "/        ^ self fromOS2Stream:aStream
   366     ].
   366     ].
   367     (header startsWith:#(0 0 1 0)) ifTrue:[
   367     (header startsWith:#(0 0 1 0)) ifTrue:[
   368         aStream position:1.
   368         aStream position:1.
   369 "/        'WinIconReader [info]: Win3.x ICO format' infoPrintNL.
   369 "/        'WinIconReader [info]: Win3.x ICO format' infoPrintNL.
   370         ^ self fromWindowsICOStream:aStream
   370         ^ self fromWindowsICOStream:aStream
   805      i := Image fromFile:'bitmaps/gifImages/garfield.gif'.
   805      i := Image fromFile:'bitmaps/gifImages/garfield.gif'.
   806      WindowsIconReader save:i onFile:'test.bmp'.
   806      WindowsIconReader save:i onFile:'test.bmp'.
   807     "
   807     "
   808 
   808 
   809     "Modified: 21.10.1997 / 05:02:02 / cg"
   809     "Modified: 21.10.1997 / 05:02:02 / cg"
       
   810 !
       
   811 
       
   812 saveICO:image onFile:fileName 
       
   813     "save image as ICO file on aFileName.
       
   814      Only depth 4 images of size 32x32 can be represented in this format."
       
   815 
       
   816     |depth bhSize biSize biClrUsed biSizeImage bfOffBits rowBytes imgBytesPerRow data srcIndex row|
       
   817 
       
   818     depth := image depth.
       
   819     width := image width.
       
   820     height := image height.
       
   821 
       
   822     depth ~~ 4 ifTrue:[
       
   823         ^ Image cannotRepresentImageSignal 
       
   824             raiseWith:image
       
   825             errorString:('ICO format only supports depths 4').
       
   826     ].
       
   827     (width ~~ 32 or:[height ~~ 32]) ifTrue:[
       
   828         ^ Image cannotRepresentImageSignal 
       
   829             raiseWith:image
       
   830             errorString:('ICO format (currently) only supports 32x32 bitmaps').
       
   831     ].
       
   832 
       
   833     "/ align rows on a longword boundary
       
   834     rowBytes := (depth * width + 31 // 32) * 4.
       
   835     biSizeImage := height * rowBytes.
       
   836 
       
   837     outStream := fileName asFilename writeStream.
       
   838     outStream binary.
       
   839     byteOrder := #lsb.
       
   840 
       
   841     "Write the file header"
       
   842     outStream nextPutAll:#[0 0 1 0].    "/ ICO magic
       
   843     self writeShort:1.             "/ # of images in file
       
   844     outStream nextPut:image width.      "/
       
   845     outStream nextPut:image height.     "/
       
   846     outStream nextPut:(1 bitShift:image depth). "/ # of colors
       
   847     outStream nextPutAll:#[0 0 0 0 0 ]. "/ reserved
       
   848     self writeLong:16rE802.              "/ size pixels
       
   849     self writeLong:16r26.                "/ offset in file
       
   850 
       
   851     "/ 40 bytes - unknown format
       
   852     outStream nextPutAll:(ByteArray new:40).
       
   853 
       
   854     "/ 16-entry RGB map
       
   855 
       
   856     1 to:16 do:[:i |  "Color map"
       
   857         |clr r g b|
       
   858 
       
   859         clr := image colorFromValue:i-1.
       
   860         clr isNil ifTrue:[
       
   861             r := g := b := 0.
       
   862         ] ifFalse:[
       
   863             r := clr redByte.
       
   864             g := clr greenByte.
       
   865             b := clr blueByte.
       
   866         ].
       
   867 
       
   868         "/ put B,G,R
       
   869         outStream nextPut:b.
       
   870         outStream nextPut:g.
       
   871         outStream nextPut:r.
       
   872         outStream nextPut:0.
       
   873     ].
       
   874 
       
   875     imgBytesPerRow := image bytesPerRow.
       
   876     data := image data.
       
   877 
       
   878 
       
   879     "/ sorry, must extract rows individually
       
   880     "/ (even if alignment is correct),
       
   881     "/ since ICO saves rows bottom-to-top
       
   882 
       
   883     row := ByteArray new:rowBytes.
       
   884 
       
   885     srcIndex := 1 + (height * imgBytesPerRow).
       
   886     1 to:height do:[:i |
       
   887         srcIndex := srcIndex - imgBytesPerRow.
       
   888         row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex.
       
   889         outStream nextPutAll:row.
       
   890     ].
       
   891 
       
   892     "/ the mask ...
       
   893     image mask isNil ifTrue:[
       
   894         outStream next:128 put:16rFF
       
   895     ] ifFalse:[
       
   896         imgBytesPerRow := image mask bytesPerRow.
       
   897         data := image mask data.
       
   898         row := ByteArray new:4.
       
   899 
       
   900         srcIndex := 1 + (height * imgBytesPerRow).
       
   901         1 to:height do:[:i |
       
   902             srcIndex := srcIndex - imgBytesPerRow.
       
   903             row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex.
       
   904             outStream nextPutAll:row.
       
   905         ].
       
   906     ].
       
   907 
       
   908     outStream close.
       
   909 
       
   910     "
       
   911      |i|
       
   912 
       
   913      i := Image fromFile:'bitmaps/xpmBitmaps/SmalltalkX_clr.xpm'.
       
   914      i := Depth4Image fromImage:i.
       
   915      i := i magnifiedTo:32@32.
       
   916      WindowsIconReader new saveICO:i onFile:'test.ico'.
       
   917     "
       
   918 
       
   919     "Modified: 21.10.1997 / 05:02:02 / cg"
   810 ! !
   920 ! !
   811 
   921 
   812 !WindowsIconReader class methodsFor:'documentation'!
   922 !WindowsIconReader class methodsFor:'documentation'!
   813 
   923 
   814 version
   924 version
   815     ^ '$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.42 1998-09-18 14:00:55 cg Exp $'
   925     ^ '$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.43 1999-05-09 14:38:04 cg Exp $'
   816 ! !
   926 ! !
   817 WindowsIconReader initialize!
   927 WindowsIconReader initialize!